From 5af14995762f691240f4c7bcc3ea8482bb80a135 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 7 Feb 2023 21:17:40 +0100 Subject: [PATCH 001/259] MM Emulator Debug Script --- scripts/start/projects/MMEmu_debug.R | 46 ++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 scripts/start/projects/MMEmu_debug.R diff --git a/scripts/start/projects/MMEmu_debug.R b/scripts/start/projects/MMEmu_debug.R new file mode 100644 index 0000000000..c3f1b1e966 --- /dev/null +++ b/scripts/start/projects/MMEmu_debug.R @@ -0,0 +1,46 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Debug Setup +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) +cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + +cfg$output <- c("output_check", "rds_report") +cfg$force_replace <- TRUE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "Emulator_debug" +cfg$title <- "1_default_preset" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +start_run(cfg, codeCheck = FALSE) \ No newline at end of file From 4befb7e18644a36923208f231eabe405ac6e7f9f Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 7 Feb 2023 21:35:02 +0100 Subject: [PATCH 002/259] Set up base for MM Emulator BE module --- .../60_bioenergy/MMEmu_feb23/declarations.gms | 47 ++++++++++ .../60_bioenergy/MMEmu_feb23/equations.gms | 75 ++++++++++++++++ modules/60_bioenergy/MMEmu_feb23/input.gms | 83 ++++++++++++++++++ .../60_bioenergy/MMEmu_feb23/postsolve.gms | 48 +++++++++++ modules/60_bioenergy/MMEmu_feb23/preloop.gms | 30 +++++++ modules/60_bioenergy/MMEmu_feb23/presolve.gms | 27 ++++++ .../60_bioenergy/MMEmu_feb23/realization.gms | 17 ++++ modules/60_bioenergy/MMEmu_feb23/scaling.gms | 8 ++ modules/60_bioenergy/MMEmu_feb23/sets.gms | 85 +++++++++++++++++++ modules/60_bioenergy/module.gms | 1 + scripts/start_functions.R | 1 + 11 files changed, 422 insertions(+) create mode 100644 modules/60_bioenergy/MMEmu_feb23/declarations.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/equations.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/input.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/postsolve.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/preloop.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/presolve.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/realization.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/scaling.gms create mode 100644 modules/60_bioenergy/MMEmu_feb23/sets.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/declarations.gms b/modules/60_bioenergy/MMEmu_feb23/declarations.gms new file mode 100644 index 0000000000..061a1b79f4 --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/declarations.gms @@ -0,0 +1,47 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + + +parameters + i60_bioenergy_dem(t,i) Regional bioenergy demand per year (mio. GJ per yr) + i60_res_2ndgenBE_dem(t,i) Regional residue demand for 2nd generation bioenergy per year (mio. GJ per yr) + i60_1stgen_bioenergy_dem(t,i,kall) Regional 1st generation bioenergy demand (mio. GJ per yr) + p60_region_BE_shr(t_all,i) Bioenergy demand share of the region (1) + p60_country_dummy(iso) Dummy parameter indicating whether country is selected for selected bioenergy demand scenario (1) +; + +positive variables + vm_dem_bioen(i,kall) Regional bioenergy demand (mio. tDM per yr) + v60_2ndgen_bioenergy_dem_dedicated(i,kall) Bioenergy demand which can come from different regions (mio. GJ per yr) + v60_2ndgen_bioenergy_dem_residues(i,kall) Bioenergy demand which can come from different product types (mio. GJ per yr) +; + +variables + vm_bioenergy_utility(i) Utility as negative costs for producing bioenergy (USD05MER per yr) +; + +equations + q60_bioenergy(i,kall) Global total bioenergy demand (mio. GJ per yr) + q60_bioenergy_glo Global 2nd generation dedicated bioenergy demand (mio. GJ per yr) + q60_bioenergy_reg(i) Regional 2nd generation dedicated bioenergy demand (mio. GJ per yr) + q60_res_2ndgenBE(i) Regional residue demand for 2nd generation bioenergy (mio. GJ per yr) + q60_bioenergy_incentive(i) Incentive to produce bioenergy (mio. USD05MER per yr) +; + +*#################### R SECTION START (OUTPUT DECLARATIONS) #################### +parameters + ov_dem_bioen(t,i,kall,type) Regional bioenergy demand (mio. tDM per yr) + ov60_2ndgen_bioenergy_dem_dedicated(t,i,kall,type) Bioenergy demand which can come from different regions (mio. GJ per yr) + ov60_2ndgen_bioenergy_dem_residues(t,i,kall,type) Bioenergy demand which can come from different product types (mio. GJ per yr) + ov_bioenergy_utility(t,i,type) Utility as negative costs for producing bioenergy (USD05MER per yr) + oq60_bioenergy(t,i,kall,type) Global total bioenergy demand (mio. GJ per yr) + oq60_bioenergy_glo(t,type) Global 2nd generation dedicated bioenergy demand (mio. GJ per yr) + oq60_bioenergy_reg(t,i,type) Regional 2nd generation dedicated bioenergy demand (mio. GJ per yr) + oq60_res_2ndgenBE(t,i,type) Regional residue demand for 2nd generation bioenergy (mio. GJ per yr) + oq60_bioenergy_incentive(t,i,type) Incentive to produce bioenergy (mio. USD05MER per yr) +; +*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms new file mode 100644 index 0000000000..6d2b697dd0 --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -0,0 +1,75 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @equations + + +*' @code +*' Total demand for bioenergy comes from different origins +*' 1st generation bioenergy demand is a fixed trajectory of minimum production +*' requirements. Second generation bioenergy splits into a Demand +*' for dedicated bioenergy crops, which are fully substitutable based on their +*' energy content, and residues which are also fully substitutable based on +*' their energy content. + +q60_bioenergy(i2,kall) .. + vm_dem_bioen(i2,kall) * fm_attributes("ge",kall) =g= + sum(ct, i60_1stgen_bioenergy_dem(ct,i2,kall)) + + v60_2ndgen_bioenergy_dem_dedicated(i2,kall) + + v60_2ndgen_bioenergy_dem_residues(i2,kall) + ; + +*' The used first generation bioenergy trajectory contains demand until 2050 +*' based on currently established and planned bioenergy policies +*' (@lotze-campen_impacts_2014). For the time +*' after 2050 it is assumed that bioenergy production will be fully transformed +*' to 2nd generation bioenergy crops and residues because of their higher +*' estimated efficiency respectively their low costs. +*' +*' For second generation bioenergy from dedicated bioenergy crops +*' (`kbe60` = bioenergy grasses and bioenergy +*' trees), input is given either on regional or global level (defined via switch +*' $c60\_biodem\_level$). As the bioenergy demand for all crop types was fixed in the +*' first step it now has to be released again for second generation bioenergy +*' crops (`kbe60`). +*' +*' The bioenergy demand calculation for second generation bioenergy is based on +*' the following two equations from which always only one is active: +*' If $c60\_biodem\_level$ is 1 (regional) the right hand side of the first equation +*' is set to 0, if it is 0 (global) the right hand side of the second equation +*' is set to 0. + +q60_bioenergy_glo.. sum((kbe60,i2), v60_2ndgen_bioenergy_dem_dedicated(i2,kbe60)) + =g= sum((ct,i2),i60_bioenergy_dem(ct,i2))*(1-c60_biodem_level); + +q60_bioenergy_reg(i2).. sum(kbe60, v60_2ndgen_bioenergy_dem_dedicated(i2,kbe60)) + =g= sum(ct,i60_bioenergy_dem(ct,i2))*c60_biodem_level; + +*' Except the implementation of the switches and the fact that in the first +*' equation the bioenergy demand is summed up to a global demand both equations +*' act the same way: In both cases the equation just makes sure that the sum +*' over all second generation energy crop of the bioenergy demand is greater or +*' equal to the demand actually given by the input file $i60\_bioenergy\_dem$. + +*' There is additionally some demand of residues for second generation bioenergy +*' $i60\_res\_2ndgenBE\_dem$, which is exogenously provided by the estimation that +*' roughly 33% of available residues for recycling on cropland can be used for 2nd +*' generation bioenergy depending on the SSP scenario, since residue stock and use +*' is mainly driven by population and GDP. + +q60_res_2ndgenBE(i2) .. + sum(kres, v60_2ndgen_bioenergy_dem_residues(i2,kres)) + =g= + sum(ct,i60_res_2ndgenBE_dem(ct,i2)); + +*' Finally, an incentive is provided for the production of 1st generation +*' bioenergy from oils and ethanol even beyond the exogeneous minimum demand. +*' The incentive is kept low, but should provide a more realistic +*' overproduction from couple products. + +q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) + =e= sum(k1st60, vm_dem_bioen(i2,k1st60) * (-c60_bioenergy_subsidy)); diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/MMEmu_feb23/input.gms new file mode 100644 index 0000000000..a27aa6b4ca --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/input.gms @@ -0,0 +1,83 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +sets + scen_countries60(iso) countries to be affected by 2nd generation bionergy demand scenario / ABW,AFG,AGO,AIA,ALA,ALB,AND,ARE,ARG,ARM, + ASM,ATA,ATF,ATG,AUS,AUT,AZE,BDI,BEL,BEN, + BES,BFA,BGD,BGR,BHR,BHS,BIH,BLM,BLR,BLZ, + BMU,BOL,BRA,BRB,BRN,BTN,BVT,BWA,CAF,CAN, + CCK,CHN,CHE,CHL,CIV,CMR,COD,COG,COK,COL, + COM,CPV,CRI,CUB,CUW,CXR,CYM,CYP,CZE,DEU, + DJI,DMA,DNK,DOM,DZA,ECU,EGY,ERI,ESH,ESP, + EST,ETH,FIN,FJI,FLK,FRA,FRO,FSM,GAB,GBR, + GEO,GGY,GHA,GIB,GIN,GLP,GMB,GNB,GNQ,GRC, + GRD,GRL,GTM,GUF,GUM,GUY,HKG,HMD,HND,HRV, + HTI,HUN,IDN,IMN,IND,IOT,IRL,IRN,IRQ,ISL, + ISR,ITA,JAM,JEY,JOR,JPN,KAZ,KEN,KGZ,KHM, + KIR,KNA,KOR,KWT,LAO,LBN,LBR,LBY,LCA,LIE, + LKA,LSO,LTU,LUX,LVA,MAC,MAF,MAR,MCO,MDA, + MDG,MDV,MEX,MHL,MKD,MLI,MLT,MMR,MNE,MNG, + MNP,MOZ,MRT,MSR,MTQ,MUS,MWI,MYS,MYT,NAM, + NCL,NER,NFK,NGA,NIC,NIU,NLD,NOR,NPL,NRU, + NZL,OMN,PAK,PAN,PCN,PER,PHL,PLW,PNG,POL, + PRI,PRK,PRT,PRY,PSE,PYF,QAT,REU,ROU,RUS, + RWA,SAU,SDN,SEN,SGP,SGS,SHN,SJM,SLB,SLE, + SLV,SMR,SOM,SPM,SRB,SSD,STP,SUR,SVK,SVN, + SWE,SWZ,SXM,SYC,SYR,TCA,TCD,TGO,THA,TJK, + TKL,TKM,TLS,TON,TTO,TUN,TUR,TUV,TWN,TZA, + UGA,UKR,UMI,URY,USA,UZB,VAT,VCT,VEN,VGB, + VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE / +; + +scalars + c60_biodem_level bioenergy demand level indicator 1 for regional and 0 for global demand (1) / 1 / + c60_bioenergy_subsidy first generation bioenergy subsidy (USD05MER per ton) / 300 / + s60_2ndgen_bioenergy_dem_min Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) / 1 / +; + +$setglobal c60_2ndgen_biodem R21M42-SSP2-NPi +$setglobal c60_2ndgen_biodem_noselect R21M42-SSP2-NPi + + +$if "%c60_2ndgen_biodem%" == "coupling" table f60_bioenergy_dem_coupling(t_all,i) Bioenergy demand (regional) (mio. GJ per yr) +$if "%c60_2ndgen_biodem%" == "coupling" $ondelim +$if "%c60_2ndgen_biodem%" == "coupling" $include "./modules/60_bioenergy/input/reg.2ndgen_bioenergy_demand.csv" +$if "%c60_2ndgen_biodem%" == "coupling" $offdelim +$if "%c60_2ndgen_biodem%" == "coupling" ; + +$if "%c60_2ndgen_biodem%" == "emulator" parameter f60_bioenergy_dem_emulator(t_all) Bioenergy demand (global) (mio. GJ per yr) +$if "%c60_2ndgen_biodem%" == "emulator" / +$if "%c60_2ndgen_biodem%" == "emulator" $ondelim +$if "%c60_2ndgen_biodem%" == "emulator" $include "./modules/60_bioenergy/input/glo.2ndgen_bioenergy_demand.csv" +$if "%c60_2ndgen_biodem%" == "emulator" $offdelim +$if "%c60_2ndgen_biodem%" == "emulator" / +$if "%c60_2ndgen_biodem%" == "emulator" ; + +table f60_bioenergy_dem(t_all,i,scen2nd60) annual bioenergy demand (regional) (mio. GJ per yr) +$ondelim +$include "./modules/60_bioenergy/input/f60_bioenergy_dem.cs3" +$offdelim +; + +$setglobal c60_res_2ndgenBE_dem ssp2 +* options: ssp1,ssp2,ssp3,ssp4,ssp5,off + +table f60_res_2ndgenBE_dem(t_all,i,scen2ndres60) annual residue demand for 2nd generation bioenergy(regional) (mio. GJ per yr) +$ondelim +$include "./modules/60_bioenergy/input/f60_2ndgenBE_residue_dem.cs3" +$offdelim +; + + +$setglobal c60_1stgen_biodem const2020 +* options: "const2020", "const2030", "phaseout2020" + +table f60_1stgen_bioenergy_dem(t_all,i,scen1st60,kall) annual 1st generation bioenergy demand (mio. GJ per yr) +$ondelim +$include "./modules/60_bioenergy/input/f60_1stgen_bioenergy_dem.cs3" +$offdelim +; diff --git a/modules/60_bioenergy/MMEmu_feb23/postsolve.gms b/modules/60_bioenergy/MMEmu_feb23/postsolve.gms new file mode 100644 index 0000000000..168269211e --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/postsolve.gms @@ -0,0 +1,48 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + + + +*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### + ov_dem_bioen(t,i,kall,"marginal") = vm_dem_bioen.m(i,kall); + ov60_2ndgen_bioenergy_dem_dedicated(t,i,kall,"marginal") = v60_2ndgen_bioenergy_dem_dedicated.m(i,kall); + ov60_2ndgen_bioenergy_dem_residues(t,i,kall,"marginal") = v60_2ndgen_bioenergy_dem_residues.m(i,kall); + ov_bioenergy_utility(t,i,"marginal") = vm_bioenergy_utility.m(i); + oq60_bioenergy(t,i,kall,"marginal") = q60_bioenergy.m(i,kall); + oq60_bioenergy_glo(t,"marginal") = q60_bioenergy_glo.m; + oq60_bioenergy_reg(t,i,"marginal") = q60_bioenergy_reg.m(i); + oq60_res_2ndgenBE(t,i,"marginal") = q60_res_2ndgenBE.m(i); + oq60_bioenergy_incentive(t,i,"marginal") = q60_bioenergy_incentive.m(i); + ov_dem_bioen(t,i,kall,"level") = vm_dem_bioen.l(i,kall); + ov60_2ndgen_bioenergy_dem_dedicated(t,i,kall,"level") = v60_2ndgen_bioenergy_dem_dedicated.l(i,kall); + ov60_2ndgen_bioenergy_dem_residues(t,i,kall,"level") = v60_2ndgen_bioenergy_dem_residues.l(i,kall); + ov_bioenergy_utility(t,i,"level") = vm_bioenergy_utility.l(i); + oq60_bioenergy(t,i,kall,"level") = q60_bioenergy.l(i,kall); + oq60_bioenergy_glo(t,"level") = q60_bioenergy_glo.l; + oq60_bioenergy_reg(t,i,"level") = q60_bioenergy_reg.l(i); + oq60_res_2ndgenBE(t,i,"level") = q60_res_2ndgenBE.l(i); + oq60_bioenergy_incentive(t,i,"level") = q60_bioenergy_incentive.l(i); + ov_dem_bioen(t,i,kall,"upper") = vm_dem_bioen.up(i,kall); + ov60_2ndgen_bioenergy_dem_dedicated(t,i,kall,"upper") = v60_2ndgen_bioenergy_dem_dedicated.up(i,kall); + ov60_2ndgen_bioenergy_dem_residues(t,i,kall,"upper") = v60_2ndgen_bioenergy_dem_residues.up(i,kall); + ov_bioenergy_utility(t,i,"upper") = vm_bioenergy_utility.up(i); + oq60_bioenergy(t,i,kall,"upper") = q60_bioenergy.up(i,kall); + oq60_bioenergy_glo(t,"upper") = q60_bioenergy_glo.up; + oq60_bioenergy_reg(t,i,"upper") = q60_bioenergy_reg.up(i); + oq60_res_2ndgenBE(t,i,"upper") = q60_res_2ndgenBE.up(i); + oq60_bioenergy_incentive(t,i,"upper") = q60_bioenergy_incentive.up(i); + ov_dem_bioen(t,i,kall,"lower") = vm_dem_bioen.lo(i,kall); + ov60_2ndgen_bioenergy_dem_dedicated(t,i,kall,"lower") = v60_2ndgen_bioenergy_dem_dedicated.lo(i,kall); + ov60_2ndgen_bioenergy_dem_residues(t,i,kall,"lower") = v60_2ndgen_bioenergy_dem_residues.lo(i,kall); + ov_bioenergy_utility(t,i,"lower") = vm_bioenergy_utility.lo(i); + oq60_bioenergy(t,i,kall,"lower") = q60_bioenergy.lo(i,kall); + oq60_bioenergy_glo(t,"lower") = q60_bioenergy_glo.lo; + oq60_bioenergy_reg(t,i,"lower") = q60_bioenergy_reg.lo(i); + oq60_res_2ndgenBE(t,i,"lower") = q60_res_2ndgenBE.lo(i); + oq60_bioenergy_incentive(t,i,"lower") = q60_bioenergy_incentive.lo(i); +*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### + diff --git a/modules/60_bioenergy/MMEmu_feb23/preloop.gms b/modules/60_bioenergy/MMEmu_feb23/preloop.gms new file mode 100644 index 0000000000..edd93ec225 --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/preloop.gms @@ -0,0 +1,30 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +****** Region price share for 2nd generation bioenergy demand scenario: +* Country switch to determine countries for which scenario shall be applied. +* In the default case, the selected scneario (c60_2ndgen_biodem) affects +* all countries. +p60_country_dummy(iso) = 0; +p60_country_dummy(scen_countries60) = 1; +* Because MAgPIE is not run at country-level, but at region level, a region +* share is calculated that translates the countries' influence to regional level. +* Countries are weighted by their population size. +p60_region_BE_shr(t_all,i) = sum(i_to_iso(i,iso), p60_country_dummy(iso) * im_pop_iso(t_all,iso)) / sum(i_to_iso(i,iso), im_pop_iso(t_all,iso)); + +$ifthen "%c60_2ndgen_biodem%" == "coupling" + i60_bioenergy_dem(t,i) = f60_bioenergy_dem_coupling(t,i); +$elseif "%c60_2ndgen_biodem%" == "emulator" + i60_bioenergy_dem(t,i) = f60_bioenergy_dem_emulator(t)/card(i); +$else + i60_bioenergy_dem(t,i) = f60_bioenergy_dem(t,i,"%c60_2ndgen_biodem%") * p60_region_BE_shr(t,i) + + f60_bioenergy_dem(t,i,"%c60_2ndgen_biodem_noselect%") * (1-p60_region_BE_shr(t,i)); +** Harmonize till 2020 if not coupled or emulator +loop(t$(m_year(t) <= sm_fix_SSP2), + i60_bioenergy_dem(t,i) = f60_bioenergy_dem(t,i,"R21M42-SSP2-NPi"); +); +$endif diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms new file mode 100644 index 0000000000..abf8f02708 --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -0,0 +1,27 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +vm_dem_bioen.fx(i,kap) = 0; +v60_2ndgen_bioenergy_dem_dedicated.fx(i,kall) = 0; +v60_2ndgen_bioenergy_dem_dedicated.up(i,kbe60) = Inf; +v60_2ndgen_bioenergy_dem_residues.fx(i,kall) = 0; +v60_2ndgen_bioenergy_dem_residues.up(i,kres) = Inf; + +if(m_year(t) <= sm_fix_SSP2, + i60_1stgen_bioenergy_dem(t,i,kall) = + f60_1stgen_bioenergy_dem(t,i,"const2020",kall); + i60_res_2ndgenBE_dem(t,i) = + f60_res_2ndgenBE_dem(t,i,"ssp2"); +else + i60_1stgen_bioenergy_dem(t,i,kall) = + f60_1stgen_bioenergy_dem(t,i,"%c60_1stgen_biodem%",kall); + i60_res_2ndgenBE_dem(t,i) = + f60_res_2ndgenBE_dem(t,i,"%c60_res_2ndgenBE_dem%"); +); + +* Add minimal bioenergy demand in case of zero demand or very small demand to avoid zero prices +i60_bioenergy_dem(t,i)$(i60_bioenergy_dem(t,i) < s60_2ndgen_bioenergy_dem_min) = s60_2ndgen_bioenergy_dem_min; diff --git a/modules/60_bioenergy/MMEmu_feb23/realization.gms b/modules/60_bioenergy/MMEmu_feb23/realization.gms new file mode 100644 index 0000000000..33e86c4afa --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/realization.gms @@ -0,0 +1,17 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "sets" $include "./modules/60_bioenergy/MMEmu_feb23/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/60_bioenergy/MMEmu_feb23/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/60_bioenergy/MMEmu_feb23/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/60_bioenergy/MMEmu_feb23/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/60_bioenergy/MMEmu_feb23/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/60_bioenergy/MMEmu_feb23/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/60_bioenergy/MMEmu_feb23/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/60_bioenergy/MMEmu_feb23/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### diff --git a/modules/60_bioenergy/MMEmu_feb23/scaling.gms b/modules/60_bioenergy/MMEmu_feb23/scaling.gms new file mode 100644 index 0000000000..f6d1c67185 --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/scaling.gms @@ -0,0 +1,8 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +vm_bioenergy_utility.scale(i) = 10e4; diff --git a/modules/60_bioenergy/MMEmu_feb23/sets.gms b/modules/60_bioenergy/MMEmu_feb23/sets.gms new file mode 100644 index 0000000000..e314b1648a --- /dev/null +++ b/modules/60_bioenergy/MMEmu_feb23/sets.gms @@ -0,0 +1,85 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*############################################################################### +*######################## R SECTION START (SETS) ############################### +* THIS CODE IS CREATED AUTOMATICALLY, DO NOT MODIFY THESE LINES DIRECTLY +* ANY DIRECT MODIFICATION WILL BE LOST AFTER NEXT AUTOMATIC UPDATE! + +sets + + scen2nd60 second generation bioenergy scenarios + / PIK_GDP, + PIK_H2C, + PIK_HBL, + PIK_HOS, + PIK_LIN, + PIK_NPI, + PIK_OPT, + R21M42-SDP-NPi, + R21M42-SDP-PkBudg1000, + R21M42-SDP-PkBudg1100, + R21M42-SDP-PkBudg900, + R21M42-SSP1-NPi, + R21M42-SSP1-PkBudg1100, + R21M42-SSP1-PkBudg1300, + R21M42-SSP1-PkBudg900, + R21M42-SSP2-NPi, + R21M42-SSP2-PkBudg1100, + R21M42-SSP2-PkBudg1300, + R21M42-SSP2-PkBudg900, + R21M42-SSP5-NPi, + R21M42-SSP5-PkBudg1100, + R21M42-SSP5-PkBudg1300, + R21M42-SSP5-PkBudg900, + R2M41-SSP2-Budg1300, + R2M41-SSP2-Budg600, + R2M41-SSP2-Budg950, + R2M41-SSP2-NDC, + R2M41-SSP2-NPi, + SSPDB-SSP1-19-IMAGE, + SSPDB-SSP1-19-REMIND-MAGPIE, + SSPDB-SSP1-26-IMAGE, + SSPDB-SSP1-26-REMIND-MAGPIE, + SSPDB-SSP1-34-IMAGE, + SSPDB-SSP1-34-REMIND-MAGPIE, + SSPDB-SSP1-45-IMAGE, + SSPDB-SSP1-45-REMIND-MAGPIE, + SSPDB-SSP1-Ref-IMAGE, + SSPDB-SSP1-Ref-REMIND-MAGPIE, + SSPDB-SSP2-19-REMIND-MAGPIE, + SSPDB-SSP2-26-REMIND-MAGPIE, + SSPDB-SSP2-34-REMIND-MAGPIE, + SSPDB-SSP2-45-REMIND-MAGPIE, + SSPDB-SSP2-60-REMIND-MAGPIE, + SSPDB-SSP2-Ref-REMIND-MAGPIE, + SSPDB-SSP5-19-REMIND-MAGPIE, + SSPDB-SSP5-26-REMIND-MAGPIE, + SSPDB-SSP5-34-REMIND-MAGPIE, + SSPDB-SSP5-45-REMIND-MAGPIE, + SSPDB-SSP5-60-REMIND-MAGPIE, + SSPDB-SSP5-Ref-REMIND-MAGPIE / + +; +*######################### R SECTION END (SETS) ################################ +*############################################################################### + +sets + + kbe60(kall) bio energy activities + / betr, begr / + + k1st60(kall) 1st generation bioenergy carriers + / oils, ethanol / + + scen1st60 first generation bioenergy scenarios + / const2020, const2030, phaseout2020 / + + scen2ndres60 residues for second generation bioenergy scenarios + / ssp1, ssp2, ssp3, ssp4, ssp5, sdp, off / + +; diff --git a/modules/60_bioenergy/module.gms b/modules/60_bioenergy/module.gms index fc56e8aca3..37c53225f9 100644 --- a/modules/60_bioenergy/module.gms +++ b/modules/60_bioenergy/module.gms @@ -20,4 +20,5 @@ *###################### R SECTION START (MODULETYPES) ########################## $Ifi "%bioenergy%" == "1stgen_priced_dec18" $include "./modules/60_bioenergy/1stgen_priced_dec18/realization.gms" +$Ifi "%bioenergy%" == "MMEmu_feb23" $include "./modules/60_bioenergy/MMEmu_feb23/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ diff --git a/scripts/start_functions.R b/scripts/start_functions.R index 6f6864b58e..41c0ae6adb 100644 --- a/scripts/start_functions.R +++ b/scripts/start_functions.R @@ -93,6 +93,7 @@ items = scen2nd60)) gms::writeSets(sets , "modules/60_bioenergy/1stgen_priced_dec18/sets.gms") + gms::writeSets(sets , "modules/60_bioenergy/MMEmu_feb23/sets.gms") } # Function to extract information from info.txt From c557b02bcba03309e637d420e7342e38c3639aa8 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 8 Feb 2023 15:54:12 +0100 Subject: [PATCH 003/259] Add 1st gen subsidy split before/after fix_SSP2 --- modules/60_bioenergy/MMEmu_feb23/equations.gms | 3 ++- modules/60_bioenergy/MMEmu_feb23/input.gms | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms index 6d2b697dd0..9dbe3d8595 100644 --- a/modules/60_bioenergy/MMEmu_feb23/equations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -72,4 +72,5 @@ q60_res_2ndgenBE(i2) .. *' overproduction from couple products. q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) - =e= sum(k1st60, vm_dem_bioen(i2,k1st60) * (-c60_bioenergy_subsidy)); + =e= sum(k1st60, vm_dem_bioen(i2,k1st60) + * ((-c60_bioenergy_subsidy_fix_SSP2)) $ (m_year(t) <= sm_fix_SSP2) + (-c60_bioenergy_subsidy) $ (m_year(t) > sm_fix_SSP2)); diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/MMEmu_feb23/input.gms index a27aa6b4ca..9f37da6051 100644 --- a/modules/60_bioenergy/MMEmu_feb23/input.gms +++ b/modules/60_bioenergy/MMEmu_feb23/input.gms @@ -35,6 +35,7 @@ sets scalars c60_biodem_level bioenergy demand level indicator 1 for regional and 0 for global demand (1) / 1 / + c60_bioenergy_subsidy_fix_SSP2 first generation bioenergy subsidy during fix_SSP period (USD05MER per ton) / 300 / c60_bioenergy_subsidy first generation bioenergy subsidy (USD05MER per ton) / 300 / s60_2ndgen_bioenergy_dem_min Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) / 1 / ; From 17af6537b2020718d521661fa891d26c93105192 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 8 Feb 2023 20:13:26 +0100 Subject: [PATCH 004/259] Move 1st gen subsidy implementation to presolve and simplify equation --- modules/60_bioenergy/MMEmu_feb23/declarations.gms | 1 + modules/60_bioenergy/MMEmu_feb23/equations.gms | 3 +-- modules/60_bioenergy/MMEmu_feb23/presolve.gms | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/declarations.gms b/modules/60_bioenergy/MMEmu_feb23/declarations.gms index 061a1b79f4..70831fa829 100644 --- a/modules/60_bioenergy/MMEmu_feb23/declarations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/declarations.gms @@ -10,6 +10,7 @@ parameters i60_bioenergy_dem(t,i) Regional bioenergy demand per year (mio. GJ per yr) i60_res_2ndgenBE_dem(t,i) Regional residue demand for 2nd generation bioenergy per year (mio. GJ per yr) i60_1stgen_bioenergy_dem(t,i,kall) Regional 1st generation bioenergy demand (mio. GJ per yr) + i60_1stgen_bioenergy_subsidy(t) Global 1st generation bioenergy subsidy (USD05MER per tDM) p60_region_BE_shr(t_all,i) Bioenergy demand share of the region (1) p60_country_dummy(iso) Dummy parameter indicating whether country is selected for selected bioenergy demand scenario (1) ; diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms index 9dbe3d8595..d4247bcf94 100644 --- a/modules/60_bioenergy/MMEmu_feb23/equations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -72,5 +72,4 @@ q60_res_2ndgenBE(i2) .. *' overproduction from couple products. q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) - =e= sum(k1st60, vm_dem_bioen(i2,k1st60) - * ((-c60_bioenergy_subsidy_fix_SSP2)) $ (m_year(t) <= sm_fix_SSP2) + (-c60_bioenergy_subsidy) $ (m_year(t) > sm_fix_SSP2)); + =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy(ct))); diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index abf8f02708..c769fd6df2 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -16,11 +16,15 @@ if(m_year(t) <= sm_fix_SSP2, f60_1stgen_bioenergy_dem(t,i,"const2020",kall); i60_res_2ndgenBE_dem(t,i) = f60_res_2ndgenBE_dem(t,i,"ssp2"); +i60_1stgen_bioenergy_subsidy(t) = + c60_bioenergy_subsidy_fix_SSP2; else i60_1stgen_bioenergy_dem(t,i,kall) = f60_1stgen_bioenergy_dem(t,i,"%c60_1stgen_biodem%",kall); i60_res_2ndgenBE_dem(t,i) = f60_res_2ndgenBE_dem(t,i,"%c60_res_2ndgenBE_dem%"); +i60_1stgen_bioenergy_subsidy(t) = + c60_bioenergy_subsidy; ); * Add minimal bioenergy demand in case of zero demand or very small demand to avoid zero prices From 0d6bd1a91a706fe29d3e1ac34f8dd155d181329d Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 8 Feb 2023 21:23:05 +0100 Subject: [PATCH 005/259] Expand 1st gen BE subsidy to include both tDm and GJ-based term --- .../60_bioenergy/MMEmu_feb23/declarations.gms | 3 ++- .../60_bioenergy/MMEmu_feb23/equations.gms | 3 ++- modules/60_bioenergy/MMEmu_feb23/input.gms | 1 + modules/60_bioenergy/MMEmu_feb23/presolve.gms | 27 ++++++++++--------- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/declarations.gms b/modules/60_bioenergy/MMEmu_feb23/declarations.gms index 70831fa829..b44bf2b33b 100644 --- a/modules/60_bioenergy/MMEmu_feb23/declarations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/declarations.gms @@ -10,7 +10,8 @@ parameters i60_bioenergy_dem(t,i) Regional bioenergy demand per year (mio. GJ per yr) i60_res_2ndgenBE_dem(t,i) Regional residue demand for 2nd generation bioenergy per year (mio. GJ per yr) i60_1stgen_bioenergy_dem(t,i,kall) Regional 1st generation bioenergy demand (mio. GJ per yr) - i60_1stgen_bioenergy_subsidy(t) Global 1st generation bioenergy subsidy (USD05MER per tDM) + i60_1stgen_bioenergy_subsidy_tdm(t) Global 1st generation bioenergy subsidy per tDM (USD05MER per tDM) + i60_1stgen_bioenergy_subsidy_gj(t) Global 1st generation bioenergy subsidy per GJ (USD05MER per GJ) p60_region_BE_shr(t_all,i) Bioenergy demand share of the region (1) p60_country_dummy(iso) Dummy parameter indicating whether country is selected for selected bioenergy demand scenario (1) ; diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms index d4247bcf94..92ddb45d62 100644 --- a/modules/60_bioenergy/MMEmu_feb23/equations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -72,4 +72,5 @@ q60_res_2ndgenBE(i2) .. *' overproduction from couple products. q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) - =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy(ct))); + =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) + + sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * fm_attributes("ge",k1st60) * (-i60_1stgen_bioenergy_subsidy_gj(ct))); diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/MMEmu_feb23/input.gms index 9f37da6051..bff63dde83 100644 --- a/modules/60_bioenergy/MMEmu_feb23/input.gms +++ b/modules/60_bioenergy/MMEmu_feb23/input.gms @@ -37,6 +37,7 @@ scalars c60_biodem_level bioenergy demand level indicator 1 for regional and 0 for global demand (1) / 1 / c60_bioenergy_subsidy_fix_SSP2 first generation bioenergy subsidy during fix_SSP period (USD05MER per ton) / 300 / c60_bioenergy_subsidy first generation bioenergy subsidy (USD05MER per ton) / 300 / + s60_bioenergy_gj_price_1st first generation GJ price (USD05MER per GJ) / 0 / s60_2ndgen_bioenergy_dem_min Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) / 1 / ; diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index c769fd6df2..93218a70ce 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -12,19 +12,22 @@ v60_2ndgen_bioenergy_dem_residues.fx(i,kall) = 0; v60_2ndgen_bioenergy_dem_residues.up(i,kres) = Inf; if(m_year(t) <= sm_fix_SSP2, - i60_1stgen_bioenergy_dem(t,i,kall) = - f60_1stgen_bioenergy_dem(t,i,"const2020",kall); - i60_res_2ndgenBE_dem(t,i) = - f60_res_2ndgenBE_dem(t,i,"ssp2"); -i60_1stgen_bioenergy_subsidy(t) = - c60_bioenergy_subsidy_fix_SSP2; + i60_1stgen_bioenergy_dem(t,i,kall) = + f60_1stgen_bioenergy_dem(t,i,"const2020",kall); + i60_res_2ndgenBE_dem(t,i) = + f60_res_2ndgenBE_dem(t,i,"ssp2"); + i60_1stgen_bioenergy_subsidy_tdm(t) = + c60_bioenergy_subsidy_fix_SSP2; + i60_1stgen_bioenergy_subsidy_gj(t) = 0; else - i60_1stgen_bioenergy_dem(t,i,kall) = - f60_1stgen_bioenergy_dem(t,i,"%c60_1stgen_biodem%",kall); - i60_res_2ndgenBE_dem(t,i) = - f60_res_2ndgenBE_dem(t,i,"%c60_res_2ndgenBE_dem%"); -i60_1stgen_bioenergy_subsidy(t) = - c60_bioenergy_subsidy; + i60_1stgen_bioenergy_dem(t,i,kall) = + f60_1stgen_bioenergy_dem(t,i,"%c60_1stgen_biodem%",kall); + i60_res_2ndgenBE_dem(t,i) = + f60_res_2ndgenBE_dem(t,i,"%c60_res_2ndgenBE_dem%"); + i60_1stgen_bioenergy_subsidy_tdm(t) = + c60_bioenergy_subsidy; + i60_1stgen_bioenergy_subsidy_gj(t) = + s60_bioenergy_gj_price_1st; ); * Add minimal bioenergy demand in case of zero demand or very small demand to avoid zero prices From 44f3d1b3fcaa403bd257b3b686a9409b8ac48587 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 9 Feb 2023 16:05:44 +0100 Subject: [PATCH 006/259] Add 2nd gen constant price after fix_SSP2 --- .../60_bioenergy/MMEmu_feb23/declarations.gms | 3 +- .../60_bioenergy/MMEmu_feb23/equations.gms | 3 +- modules/60_bioenergy/MMEmu_feb23/input.gms | 3 +- modules/60_bioenergy/MMEmu_feb23/presolve.gms | 5 ++- scripts/start/projects/MMEmu_default.R | 43 +++++++++++++++++++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 scripts/start/projects/MMEmu_default.R diff --git a/modules/60_bioenergy/MMEmu_feb23/declarations.gms b/modules/60_bioenergy/MMEmu_feb23/declarations.gms index b44bf2b33b..d0bfaffac5 100644 --- a/modules/60_bioenergy/MMEmu_feb23/declarations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/declarations.gms @@ -11,7 +11,8 @@ parameters i60_res_2ndgenBE_dem(t,i) Regional residue demand for 2nd generation bioenergy per year (mio. GJ per yr) i60_1stgen_bioenergy_dem(t,i,kall) Regional 1st generation bioenergy demand (mio. GJ per yr) i60_1stgen_bioenergy_subsidy_tdm(t) Global 1st generation bioenergy subsidy per tDM (USD05MER per tDM) - i60_1stgen_bioenergy_subsidy_gj(t) Global 1st generation bioenergy subsidy per GJ (USD05MER per GJ) + i60_1stgen_bioenergy_subsidy_gj(t) Global 1st generation bioenergy subsidy per GJ (USD05MER per GJ) + i60_2ndgen_bioenergy_subsidy(t) Global 2nd generation bioenergy subsidy (USD05MER per GHJ) p60_region_BE_shr(t_all,i) Bioenergy demand share of the region (1) p60_country_dummy(iso) Dummy parameter indicating whether country is selected for selected bioenergy demand scenario (1) ; diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms index 92ddb45d62..cfd500d482 100644 --- a/modules/60_bioenergy/MMEmu_feb23/equations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -73,4 +73,5 @@ q60_res_2ndgenBE(i2) .. q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) - + sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * fm_attributes("ge",k1st60) * (-i60_1stgen_bioenergy_subsidy_gj(ct))); + + sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * fm_attributes("ge",k1st60) * (-i60_1stgen_bioenergy_subsidy_gj(ct))) + + sum((ct,kbe60), vm_dem_bioen(i2,kbe60) * fm_attributes("ge",kbe60) * (-i60_2ndgen_bioenergy_subsidy(ct))); \ No newline at end of file diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/MMEmu_feb23/input.gms index bff63dde83..8c0a04135c 100644 --- a/modules/60_bioenergy/MMEmu_feb23/input.gms +++ b/modules/60_bioenergy/MMEmu_feb23/input.gms @@ -37,7 +37,8 @@ scalars c60_biodem_level bioenergy demand level indicator 1 for regional and 0 for global demand (1) / 1 / c60_bioenergy_subsidy_fix_SSP2 first generation bioenergy subsidy during fix_SSP period (USD05MER per ton) / 300 / c60_bioenergy_subsidy first generation bioenergy subsidy (USD05MER per ton) / 300 / - s60_bioenergy_gj_price_1st first generation GJ price (USD05MER per GJ) / 0 / + s60_bioenergy_gj_price_1st first generation bioenergy per-GJ price (USD05MER per GJ) / 0 / + s60_bioenergy_price_2nd second generation bioenergy price (USD05MER per GJ) / 0 / s60_2ndgen_bioenergy_dem_min Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) / 1 / ; diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index 93218a70ce..1b3b563d80 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -18,7 +18,8 @@ if(m_year(t) <= sm_fix_SSP2, f60_res_2ndgenBE_dem(t,i,"ssp2"); i60_1stgen_bioenergy_subsidy_tdm(t) = c60_bioenergy_subsidy_fix_SSP2; - i60_1stgen_bioenergy_subsidy_gj(t) = 0; + i60_1stgen_bioenergy_subsidy_gj(t) = 0; + i60_2ndgen_bioenergy_subsidy(t) = 0; else i60_1stgen_bioenergy_dem(t,i,kall) = f60_1stgen_bioenergy_dem(t,i,"%c60_1stgen_biodem%",kall); @@ -28,6 +29,8 @@ else c60_bioenergy_subsidy; i60_1stgen_bioenergy_subsidy_gj(t) = s60_bioenergy_gj_price_1st; + i60_2ndgen_bioenergy_subsidy(t) = + s60_bioenergy_price_2nd; ); * Add minimal bioenergy demand in case of zero demand or very small demand to avoid zero prices diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R new file mode 100644 index 0000000000..0aa0ecc726 --- /dev/null +++ b/scripts/start/projects/MMEmu_default.R @@ -0,0 +1,43 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Debug Setup +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$output <- c("output_check", "rds_report") +cfg$force_replace <- TRUE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "Emulator_debug" +cfg$title <- "4_yields_A_NOCC_hist" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +cfg$gms$c14_yields_scenario <- "nocc_hist" + +start_run(cfg, codeCheck = FALSE) \ No newline at end of file From c785c8ea7ddc0e70a382a29244e46592ac7cc379 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 10 Feb 2023 12:29:06 +0100 Subject: [PATCH 007/259] Implement upper bound for cropland growth --- modules/30_crop/endo_apr21/declarations.gms | 4 ++++ modules/30_crop/endo_apr21/equations.gms | 4 ++++ modules/30_crop/endo_apr21/input.gms | 4 +++- modules/30_crop/endo_apr21/postsolve.gms | 8 +++++++ modules/30_crop/endo_apr21/presolve.gms | 6 ++++++ scripts/start/projects/MMEmu_debug.R | 20 +++++++++++++++++- scripts/start/projects/MMEmu_default.R | 23 ++++++++++++++++++--- 7 files changed, 64 insertions(+), 5 deletions(-) diff --git a/modules/30_crop/endo_apr21/declarations.gms b/modules/30_crop/endo_apr21/declarations.gms index 628262432a..a9436f2957 100644 --- a/modules/30_crop/endo_apr21/declarations.gms +++ b/modules/30_crop/endo_apr21/declarations.gms @@ -19,6 +19,7 @@ positive variables * Fallow land is cropland which is temporarily fallow. Croparea+fallow=cropland vm_fallow(j) Fallow land (mio. ha) vm_area(j,kcr,w) Agricultural production area (mio. ha) + v30_crop_area(i) Total regional crop production area (mio. ha) vm_rotation_penalty(i) Penalty for violating rotational constraints (USD05MER) ; @@ -32,12 +33,14 @@ equations q30_bv_ann(j,potnatveg) Biodiversity value of annual cropland (mio. ha) q30_bv_per(j,potnatveg) Biodiversity value of perennial cropland (mio. ha) q30_land_snv(j) Land constraint for the SNV policy in cropland areas (mio. ha) + q30_crop_reg(i) Total regional crop production area (mio. ha) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters ov_fallow(t,j,type) Fallow land (mio. ha) ov_area(t,j,kcr,w,type) Agricultural production area (mio. ha) + ov30_crop_area(t,i,type) Total regional crop production area (mio. ha) ov_rotation_penalty(t,i,type) Penalty for violating rotational constraints (USD05MER) oq30_cropland(t,j,type) Total cropland calculation (mio. ha) oq30_avl_cropland(t,j,type) Available cropland constraint (mio. ha) @@ -48,6 +51,7 @@ parameters oq30_bv_ann(t,j,potnatveg,type) Biodiversity value of annual cropland (mio. ha) oq30_bv_per(t,j,potnatveg,type) Biodiversity value of perennial cropland (mio. ha) oq30_land_snv(t,j,type) Land constraint for the SNV policy in cropland areas (mio. ha) + oq30_crop_reg(t,i,type) Total regional crop production area (mio. ha) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/30_crop/endo_apr21/equations.gms b/modules/30_crop/endo_apr21/equations.gms index da0f4ce868..2d67f45e7f 100644 --- a/modules/30_crop/endo_apr21/equations.gms +++ b/modules/30_crop/endo_apr21/equations.gms @@ -71,3 +71,7 @@ =e= (vm_land(j2,"crop") - sum((crop_ann30,w), vm_area(j2,crop_ann30,w))) * fm_bii_coeff("crop_per",potnatveg) * fm_luh2_side_layers(j2,potnatveg); + + q30_crop_reg(i2) .. v30_crop_area(i2) + =e= + sum(cell(i2,j2), vm_land(j2,"crop")); \ No newline at end of file diff --git a/modules/30_crop/endo_apr21/input.gms b/modules/30_crop/endo_apr21/input.gms index db30cd69a8..39c78d3625 100644 --- a/modules/30_crop/endo_apr21/input.gms +++ b/modules/30_crop/endo_apr21/input.gms @@ -99,7 +99,9 @@ $if "%c30_rotation_constraints%" == "off" f30_rotation_min_shr(crp30) = 0; ********* AVAILABLE CROPLAND ******************************************* - +scalar +s30_annual_max_growth Max annual cropland growth as share of previous cropland (%) / Inf / +; table f30_avl_cropland(j,marginal_land30) Available land area for cropland (mio. ha) $ondelim diff --git a/modules/30_crop/endo_apr21/postsolve.gms b/modules/30_crop/endo_apr21/postsolve.gms index 33550027e2..069e808611 100644 --- a/modules/30_crop/endo_apr21/postsolve.gms +++ b/modules/30_crop/endo_apr21/postsolve.gms @@ -9,6 +9,7 @@ *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov_fallow(t,j,"marginal") = vm_fallow.m(j); ov_area(t,j,kcr,w,"marginal") = vm_area.m(j,kcr,w); + ov30_crop_area(t,i,"marginal") = v30_crop_area.m(i); ov_rotation_penalty(t,i,"marginal") = vm_rotation_penalty.m(i); oq30_cropland(t,j,"marginal") = q30_cropland.m(j); oq30_avl_cropland(t,j,"marginal") = q30_avl_cropland.m(j); @@ -19,8 +20,10 @@ oq30_bv_ann(t,j,potnatveg,"marginal") = q30_bv_ann.m(j,potnatveg); oq30_bv_per(t,j,potnatveg,"marginal") = q30_bv_per.m(j,potnatveg); oq30_land_snv(t,j,"marginal") = q30_land_snv.m(j); + oq30_crop_reg(t,i,"marginal") = q30_crop_reg.m(i); ov_fallow(t,j,"level") = vm_fallow.l(j); ov_area(t,j,kcr,w,"level") = vm_area.l(j,kcr,w); + ov30_crop_area(t,i,"level") = v30_crop_area.l(i); ov_rotation_penalty(t,i,"level") = vm_rotation_penalty.l(i); oq30_cropland(t,j,"level") = q30_cropland.l(j); oq30_avl_cropland(t,j,"level") = q30_avl_cropland.l(j); @@ -31,8 +34,10 @@ oq30_bv_ann(t,j,potnatveg,"level") = q30_bv_ann.l(j,potnatveg); oq30_bv_per(t,j,potnatveg,"level") = q30_bv_per.l(j,potnatveg); oq30_land_snv(t,j,"level") = q30_land_snv.l(j); + oq30_crop_reg(t,i,"level") = q30_crop_reg.l(i); ov_fallow(t,j,"upper") = vm_fallow.up(j); ov_area(t,j,kcr,w,"upper") = vm_area.up(j,kcr,w); + ov30_crop_area(t,i,"upper") = v30_crop_area.up(i); ov_rotation_penalty(t,i,"upper") = vm_rotation_penalty.up(i); oq30_cropland(t,j,"upper") = q30_cropland.up(j); oq30_avl_cropland(t,j,"upper") = q30_avl_cropland.up(j); @@ -43,8 +48,10 @@ oq30_bv_ann(t,j,potnatveg,"upper") = q30_bv_ann.up(j,potnatveg); oq30_bv_per(t,j,potnatveg,"upper") = q30_bv_per.up(j,potnatveg); oq30_land_snv(t,j,"upper") = q30_land_snv.up(j); + oq30_crop_reg(t,i,"upper") = q30_crop_reg.up(i); ov_fallow(t,j,"lower") = vm_fallow.lo(j); ov_area(t,j,kcr,w,"lower") = vm_area.lo(j,kcr,w); + ov30_crop_area(t,i,"lower") = v30_crop_area.lo(i); ov_rotation_penalty(t,i,"lower") = vm_rotation_penalty.lo(i); oq30_cropland(t,j,"lower") = q30_cropland.lo(j); oq30_avl_cropland(t,j,"lower") = q30_avl_cropland.lo(j); @@ -55,4 +62,5 @@ oq30_bv_ann(t,j,potnatveg,"lower") = q30_bv_ann.lo(j,potnatveg); oq30_bv_per(t,j,potnatveg,"lower") = q30_bv_per.lo(j,potnatveg); oq30_land_snv(t,j,"lower") = q30_land_snv.lo(j); + oq30_crop_reg(t,i,"lower") = q30_crop_reg.lo(i); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/30_crop/endo_apr21/presolve.gms b/modules/30_crop/endo_apr21/presolve.gms index efcc51f181..b903db2eaa 100644 --- a/modules/30_crop/endo_apr21/presolve.gms +++ b/modules/30_crop/endo_apr21/presolve.gms @@ -36,3 +36,9 @@ p30_snv_shr(t,j) = p30_snv_scenario_fader(t) * *' Area potentially available for cropping p30_avl_cropland(t,j) = f30_avl_cropland(j,"%c30_marginal_land%") * (1 - p30_snv_shr(t,j)); *' @stop + +if(m_year(t) <= sm_fix_SSP2, + v30_crop_area.up(i) = Inf; +else + v30_crop_area.up(i) = v30_crop_area.l(i) * (1 + s30_annual_max_growth) ** m_yeardiff(t); +); \ No newline at end of file diff --git a/scripts/start/projects/MMEmu_debug.R b/scripts/start/projects/MMEmu_debug.R index c3f1b1e966..33eb2f6d3e 100644 --- a/scripts/start/projects/MMEmu_debug.R +++ b/scripts/start/projects/MMEmu_debug.R @@ -38,9 +38,27 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### identifierFlag <- "Emulator_debug" -cfg$title <- "1_default_preset" +cfg$title <- "6_Cropland_A_BE10_Inf" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" + +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 + +cfg$gms$s60_bioenergy_gj_price_1st <- 10 +cfg$gms$s60_bioenergy_price_2nd <- 10 + +### Yield +#cfg$gms$c14_yields_scenario <- "nocc_hist" + +### Biodiv +#cfg$gms$c44_bii_decrease <- 0 + +### Cropland +cfg$gms$s30_annual_max_growth <- Inf + start_run(cfg, codeCheck = FALSE) \ No newline at end of file diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index 0aa0ecc726..9a23f64fa2 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -6,7 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Debug Setup +# description: MESSAGE-MAgPIE Emulator Default varient for Tau readout # position: 1 # ---------------------------------------------------------- @@ -24,6 +24,11 @@ source("scripts/start_functions.R") #nolinter # Source the default config and then over-write it before starting the run. source("config/default.cfg") #nolinter +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) +cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE @@ -33,11 +38,23 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### identifierFlag <- "Emulator_debug" -cfg$title <- "4_yields_A_NOCC_hist" +cfg$title <- "6_Cropland_A_Default_Inf" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") -cfg$gms$c14_yields_scenario <- "nocc_hist" +### BE +# non-default BE demands + +### Yield +#cfg$gms$c14_yields_scenario <- "nocc_hist" + +### Biodiv +#cfg$gms$c44_bii_decrease <- 0 + +### Cropland +cfg$gms$s30_annual_max_growth <- Inf + +########################################################## start_run(cfg, codeCheck = FALSE) \ No newline at end of file From 617e88b27e724a0883cfe9ca3c746b0b67eae9fc Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 13 Feb 2023 08:48:01 +0100 Subject: [PATCH 008/259] Make minimum 2nd gen BE demand more flexible pre/post SSP2-fix --- modules/60_bioenergy/MMEmu_feb23/input.gms | 3 ++- modules/60_bioenergy/MMEmu_feb23/presolve.gms | 6 +++++- modules/60_bioenergy/MMEmu_feb23/sets.gms | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/MMEmu_feb23/input.gms index 8c0a04135c..0209409623 100644 --- a/modules/60_bioenergy/MMEmu_feb23/input.gms +++ b/modules/60_bioenergy/MMEmu_feb23/input.gms @@ -39,7 +39,8 @@ scalars c60_bioenergy_subsidy first generation bioenergy subsidy (USD05MER per ton) / 300 / s60_bioenergy_gj_price_1st first generation bioenergy per-GJ price (USD05MER per GJ) / 0 / s60_bioenergy_price_2nd second generation bioenergy price (USD05MER per GJ) / 0 / - s60_2ndgen_bioenergy_dem_min Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) / 1 / + s60_2ndgen_bioenergy_dem_min Minimum dedicated 2nd generation bioenergy demand assumed in each region during SSP2-fix (mio. GJ per yr) / 1 / + s60_2ndgen_bioenergy_dem_min_post_fix Minimum dedicated 2nd generation bioenergy demand assumed in each region after SSP2-fix (mio. GJ per yr) / 1 / ; $setglobal c60_2ndgen_biodem R21M42-SSP2-NPi diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index 1b3b563d80..96a21a5c30 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -34,4 +34,8 @@ else ); * Add minimal bioenergy demand in case of zero demand or very small demand to avoid zero prices -i60_bioenergy_dem(t,i)$(i60_bioenergy_dem(t,i) < s60_2ndgen_bioenergy_dem_min) = s60_2ndgen_bioenergy_dem_min; +if(m_year(t) <= sm_fix_SSP2, + i60_bioenergy_dem(t,i)$(i60_bioenergy_dem(t,i) < s60_2ndgen_bioenergy_dem_min) = s60_2ndgen_bioenergy_dem_min; +else + i60_bioenergy_dem(t,i)$(i60_bioenergy_dem(t,i) < s60_2ndgen_bioenergy_dem_min_post_fix) = s60_2ndgen_bioenergy_dem_min_post_fix; +); diff --git a/modules/60_bioenergy/MMEmu_feb23/sets.gms b/modules/60_bioenergy/MMEmu_feb23/sets.gms index e314b1648a..82080a2dba 100644 --- a/modules/60_bioenergy/MMEmu_feb23/sets.gms +++ b/modules/60_bioenergy/MMEmu_feb23/sets.gms @@ -62,7 +62,8 @@ sets SSPDB-SSP5-34-REMIND-MAGPIE, SSPDB-SSP5-45-REMIND-MAGPIE, SSPDB-SSP5-60-REMIND-MAGPIE, - SSPDB-SSP5-Ref-REMIND-MAGPIE / + SSPDB-SSP5-Ref-REMIND-MAGPIE, + R21M42-SSP2-Npi-PhaseOut20 / ; *######################### R SECTION END (SETS) ################################ From b1d2ce83d9469a93d742a7688eb80a494b7836ea Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 13 Feb 2023 13:51:10 +0100 Subject: [PATCH 009/259] Create base for MM Emulator GHG price realization --- .../MMEmu_feb23/declarations.gms | 58 +++++++ .../56_ghg_policy/MMEmu_feb23/equations.gms | 79 +++++++++ modules/56_ghg_policy/MMEmu_feb23/input.gms | 83 +++++++++ .../56_ghg_policy/MMEmu_feb23/postsolve.gms | 65 +++++++ modules/56_ghg_policy/MMEmu_feb23/preloop.gms | 100 +++++++++++ .../56_ghg_policy/MMEmu_feb23/realization.gms | 34 ++++ modules/56_ghg_policy/MMEmu_feb23/scaling.gms | 10 ++ modules/56_ghg_policy/MMEmu_feb23/sets.gms | 159 ++++++++++++++++++ modules/56_ghg_policy/module.gms | 1 + scripts/start_functions.R | 1 + 10 files changed, 590 insertions(+) create mode 100644 modules/56_ghg_policy/MMEmu_feb23/declarations.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/equations.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/input.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/postsolve.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/preloop.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/realization.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/scaling.gms create mode 100644 modules/56_ghg_policy/MMEmu_feb23/sets.gms diff --git a/modules/56_ghg_policy/MMEmu_feb23/declarations.gms b/modules/56_ghg_policy/MMEmu_feb23/declarations.gms new file mode 100644 index 0000000000..4da3658957 --- /dev/null +++ b/modules/56_ghg_policy/MMEmu_feb23/declarations.gms @@ -0,0 +1,58 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +parameters + im_pollutant_prices(t_all,i,pollutants,emis_source) Certificate prices for N2O-N CH4 CO2-C used in the model (USD05MER per Mg) + p56_pollutant_prices_input(t_all,i,pollutants,emis_source) Certificate prices for N2O-N CH4 CO2-C from input files (USD05MER per Mg) + p56_c_price_aff(t_all,i,ac) C price used for afforestation decision-making (USD05MER per tC) + pc56_c_price_induced_aff Helper for fixing C price driven afforestation to zero for historic time steps (binary) + p56_region_price_shr(t_all,i) GHG price share of the region (1) + p56_country_dummy(iso) Dummy parameter indicating whether country is affected by selected GHG policy (1) +; + +equations + q56_emission_costs(i) Calculation of total emission costs (mio. USD05MER per yr) + q56_emission_cost_annual(i,emis_annual) Calculation of regional costs for annual emissions (mio. USD05MER per yr) + q56_emission_cost_oneoff(i,emis_oneoff) Calculation of regional costs for emissions occuring only once in time (mio. USD05MER per yr) + q56_reward_cdr_aff_reg(i) Regional revenues for carbon captured by afforestation (mio. USD05MER per yr) + q56_reward_cdr_aff(j) Cellular revenues for carbon captured by afforestation (mio. USD05MER per yr) + q56_emis_pricing(i,pollutants,emis_source) Calculation of annual CO2 emissions for pricing (Tg per yr) + q56_emis_pricing_co2(i,emis_oneoff) Calculation of annual CO2 emissions for pricing (Tg per yr) +; + +positive variables + vm_carbon_stock(j,land,c_pools,stockType) Carbon stock in vegetation soil and litter for different land types (mio. tC) +; + + +variables + vm_emission_costs(i) Costs for emission rights for pollutants and greenhouse gases (mio. USD05MER per yr) + vm_emissions_reg(i,emis_source,pollutants) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) + v56_emis_pricing(i,emis_source,pollutants) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) + v56_emission_cost(i,emis_source) GHG emissions cost (mio. USD05MER per yr) + vm_reward_cdr_aff(i) Regional average annual expected revenue from afforestation (mio. USD05MER per yr) + v56_reward_cdr_aff(j) Cellular average annual expected revenue from afforestation (mio. USD05MER per yr) +; + +*#################### R SECTION START (OUTPUT DECLARATIONS) #################### +parameters + ov_carbon_stock(t,j,land,c_pools,stockType,type) Carbon stock in vegetation soil and litter for different land types (mio. tC) + ov_emission_costs(t,i,type) Costs for emission rights for pollutants and greenhouse gases (mio. USD05MER per yr) + ov_emissions_reg(t,i,emis_source,pollutants,type) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) + ov56_emis_pricing(t,i,emis_source,pollutants,type) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) + ov56_emission_cost(t,i,emis_source,type) GHG emissions cost (mio. USD05MER per yr) + ov_reward_cdr_aff(t,i,type) Regional average annual expected revenue from afforestation (mio. USD05MER per yr) + ov56_reward_cdr_aff(t,j,type) Cellular average annual expected revenue from afforestation (mio. USD05MER per yr) + oq56_emission_costs(t,i,type) Calculation of total emission costs (mio. USD05MER per yr) + oq56_emission_cost_annual(t,i,emis_annual,type) Calculation of regional costs for annual emissions (mio. USD05MER per yr) + oq56_emission_cost_oneoff(t,i,emis_oneoff,type) Calculation of regional costs for emissions occuring only once in time (mio. USD05MER per yr) + oq56_reward_cdr_aff_reg(t,i,type) Regional revenues for carbon captured by afforestation (mio. USD05MER per yr) + oq56_reward_cdr_aff(t,j,type) Cellular revenues for carbon captured by afforestation (mio. USD05MER per yr) + oq56_emis_pricing(t,i,pollutants,emis_source,type) Calculation of annual CO2 emissions for pricing (Tg per yr) + oq56_emis_pricing_co2(t,i,emis_oneoff,type) Calculation of annual CO2 emissions for pricing (Tg per yr) +; +*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/56_ghg_policy/MMEmu_feb23/equations.gms b/modules/56_ghg_policy/MMEmu_feb23/equations.gms new file mode 100644 index 0000000000..ca728bbe0b --- /dev/null +++ b/modules/56_ghg_policy/MMEmu_feb23/equations.gms @@ -0,0 +1,79 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + + +*' @equations + + +*' GHG emissions for pricing can differ for CO2 emissions from land-use change depending on `c56_carbon_stock_pricing`. +*' CO2 emission subject to emission pricing are calculated based on changes in carbon stocks between timesteps in the interface `vm_carbon_stock`, depending on `c56_carbon_stock_pricing`. + + q56_emis_pricing(i2,pollutants,emis_annual) .. + v56_emis_pricing(i2,emis_annual,pollutants) =e= + vm_emissions_reg(i2,emis_annual,pollutants); + + q56_emis_pricing_co2(i2,emis_oneoff) .. + v56_emis_pricing(i2,emis_oneoff,"co2_c") =e= + sum((cell(i2,j2),emis_land(emis_oneoff,land,c_pools)), + (vm_carbon_stock.l(j2,land,c_pools,"actual") - vm_carbon_stock(j2,land,c_pools,"%c56_carbon_stock_pricing%"))/m_timestep_length); + +*** Emission costs + +*' **Emission costs** are calculated by multiplying regional emissions with the emission price `im_pollutant_prices`, +*' taking into account the price policy that was defined above in `c56_emis_policy`. + + q56_emission_cost_annual(i2,emis_annual) .. + v56_emission_cost(i2,emis_annual) =e= + sum(pollutants, + v56_emis_pricing(i2,emis_annual,pollutants) * + sum(ct, im_pollutant_prices(ct,i2,pollutants,emis_annual))); + +*' As MAgPIE is a recursive dynamic model, within the optimization of the current time step it does not account for benefits or costs in future time steps. +*' This can be problematic for the treatment of emissions that occur only once under continuous management (such as deforestation, +*' where the forest has been cut down the cropland can be continuously cultivated without further deforestation emissions) versus +*' emissions that occur continously (such as fertilization emissions, that will re-occur every year for continuously management). +*' We therefore distinguish one-off and yearly emissions, and discount one-off emissions assuming an infinite time-horizon to +*' level them with yearly emissions. Since one-off emissions in `vm_emissions_reg` and `v56_emis_cell_pricing` are expressed as annual emissions +*' they are converted back into emissions of the entire timestep by multiplication with `m_timestep_length`, and are then +*' transformed into annual costs by multiplication with the emission price (`im_pollutant_prices`) +*' and an annuity (annuity due with infinite time horizon) factor that depends on `pm_interest`. + + q56_emission_cost_oneoff(i2,emis_oneoff) .. + v56_emission_cost(i2,emis_oneoff) =e= + sum(pollutants, + v56_emis_pricing(i2,emis_oneoff,pollutants) + * m_timestep_length + * sum(ct, + im_pollutant_prices(ct,i2,pollutants,emis_oneoff) + * pm_interest(ct,i2)/(1+pm_interest(ct,i2)))); + +*' **Total regional emission costs** consist of costs from yearly and one-off emissions. + + q56_emission_costs(i2) .. + vm_emission_costs(i2) =e= + sum(emis_source, v56_emission_cost(i2,emis_source)); + +*' The value of CDR from C-price induced afforestation enters the objective function as negative costs. +*' The reward, which serves as incentive for afforestation, is calculated in 3 steps: +*' First, the sum of the expected CDR for each 5-year age-class and the carbon equivalent of local biophysical effects (`vm_cdr_aff`) +*' are multiplied by the corresponding future C price (`p56_c_price_aff`). +*' Second, these future cash flows are discounted to present value, depending on `pm_interest`. +*' Third, an annuity factor (annuity due with infinite time horizon) is used to obtain average annual rewards + + q56_reward_cdr_aff_reg(i2) .. + vm_reward_cdr_aff(i2) =e= + sum(cell(i2,j2), + v56_reward_cdr_aff(j2) + ); + + q56_reward_cdr_aff(j2) .. + v56_reward_cdr_aff(j2) =e= + s56_c_price_induced_aff* + sum(ac, + (sum(aff_effect,(1-s56_buffer_aff)*vm_cdr_aff(j2,ac,aff_effect)) * sum((cell(i2,j2),ct), p56_c_price_aff(ct,i2,ac))) + / ((1+sum((cell(i2,j2),ct),pm_interest(ct,i2)))**(ac.off*5))) + *sum((cell(i2,j2),ct),pm_interest(ct,i2)/(1+pm_interest(ct,i2))); diff --git a/modules/56_ghg_policy/MMEmu_feb23/input.gms b/modules/56_ghg_policy/MMEmu_feb23/input.gms new file mode 100644 index 0000000000..0124386e78 --- /dev/null +++ b/modules/56_ghg_policy/MMEmu_feb23/input.gms @@ -0,0 +1,83 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +* Set-switch for countries affected by regional ghg policy +* Default: all iso countries selected +sets + policy_countries56(iso) countries to be affected by ghg policy / ABW,AFG,AGO,AIA,ALA,ALB,AND,ARE,ARG,ARM, + ASM,ATA,ATF,ATG,AUS,AUT,AZE,BDI,BEL,BEN, + BES,BFA,BGD,BGR,BHR,BHS,BIH,BLM,BLR,BLZ, + BMU,BOL,BRA,BRB,BRN,BTN,BVT,BWA,CAF,CAN, + CCK,CHN,CHE,CHL,CIV,CMR,COD,COG,COK,COL, + COM,CPV,CRI,CUB,CUW,CXR,CYM,CYP,CZE,DEU, + DJI,DMA,DNK,DOM,DZA,ECU,EGY,ERI,ESH,ESP, + EST,ETH,FIN,FJI,FLK,FRA,FRO,FSM,GAB,GBR, + GEO,GGY,GHA,GIB,GIN,GLP,GMB,GNB,GNQ,GRC, + GRD,GRL,GTM,GUF,GUM,GUY,HKG,HMD,HND,HRV, + HTI,HUN,IDN,IMN,IND,IOT,IRL,IRN,IRQ,ISL, + ISR,ITA,JAM,JEY,JOR,JPN,KAZ,KEN,KGZ,KHM, + KIR,KNA,KOR,KWT,LAO,LBN,LBR,LBY,LCA,LIE, + LKA,LSO,LTU,LUX,LVA,MAC,MAF,MAR,MCO,MDA, + MDG,MDV,MEX,MHL,MKD,MLI,MLT,MMR,MNE,MNG, + MNP,MOZ,MRT,MSR,MTQ,MUS,MWI,MYS,MYT,NAM, + NCL,NER,NFK,NGA,NIC,NIU,NLD,NOR,NPL,NRU, + NZL,OMN,PAK,PAN,PCN,PER,PHL,PLW,PNG,POL, + PRI,PRK,PRT,PRY,PSE,PYF,QAT,REU,ROU,RUS, + RWA,SAU,SDN,SEN,SGP,SGS,SHN,SJM,SLB,SLE, + SLV,SMR,SOM,SPM,SRB,SSD,STP,SUR,SVK,SVN, + SWE,SWZ,SXM,SYC,SYR,TCA,TCD,TGO,THA,TJK, + TKL,TKM,TLS,TON,TTO,TUN,TUR,TUV,TWN,TZA, + UGA,UKR,UMI,URY,USA,UZB,VAT,VCT,VEN,VGB, + VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE / +; + +scalars + s56_limit_ch4_n2o_price upper limit for CH4 and N2O GHG prices (USD05MER per tC) / 4000 / + s56_cprice_red_factor reduction factor for CO2 price (-) / 1 / + s56_ghgprice_start start year for ghg price phase-in (year) / 2025 / + s56_ghgprice_phase_in Switch for phasing-in GHG price over a 20 year period (1=on 0=off) / 0 / + s56_ghgprice_devstate_scaling Switch for scaling GHG price with development state (1=on 0=off) / 0 / + s56_c_price_induced_aff Switch for C price driven afforestation (1=on 0=off) / 1 / + s56_c_price_exp_aff c price expectation for afforestation (years) / 50 / + s56_buffer_aff share of carbon credits for afforestation projects pooled in a buffer (1) / 0.2 / + s56_counter counter for C price interpolation (1) / 0 / + s56_timesteps number of time steps for C price interpolation (1) / 0 / + s56_offset helper for C price interpolation (1) / 0 / +; + +$setglobal c56_pollutant_prices R21M42-SSP2-NPi +$setglobal c56_pollutant_prices_noselect R21M42-SSP2-NPi +$setglobal c56_emis_policy redd+natveg_nosoil + +$setglobal c56_carbon_stock_pricing actualNoAcEst +* options: actual, actualNoAcEst + +table f56_pollutant_prices(t_all,i,pollutants,ghgscen56) GHG certificate prices for N2O-N CH4 CO2-C (USD05MER per t) +$ondelim +$include "./modules/56_ghg_policy/input/f56_pollutant_prices.cs3" +$offdelim +; + +$if "%c56_pollutant_prices%" == "coupling" table f56_pollutant_prices_coupling(t_all,i,pollutants) Regional ghg certificate prices for N2O-N CH4 CO2-C (USD05MER per t) +$if "%c56_pollutant_prices%" == "coupling" $ondelim +$if "%c56_pollutant_prices%" == "coupling" $include "./modules/56_ghg_policy/input/f56_pollutant_prices_coupling.cs3" +$if "%c56_pollutant_prices%" == "coupling" $offdelim +$if "%c56_pollutant_prices%" == "coupling" ; + +$if "%c56_pollutant_prices%" == "emulator" table f56_pollutant_prices_emulator(t_all,i,pollutants) Global ghg certificate prices for N2O-N CH4 CO2-C (USD05MER per t) +$if "%c56_pollutant_prices%" == "emulator" $ondelim +$if "%c56_pollutant_prices%" == "emulator" $include "./modules/56_ghg_policy/input/f56_pollutant_prices_emulator.cs3" +$if "%c56_pollutant_prices%" == "emulator" $offdelim +$if "%c56_pollutant_prices%" == "emulator" ; + +* f56_emis_policy contains scenarios determining for each gas and source whether it is priced or not + +table f56_emis_policy(scen56,pollutants_all,emis_source) GHG emission policy scenarios (1) +$ondelim +$include "./modules/56_ghg_policy/input/f56_emis_policy.csv" +$offdelim +; diff --git a/modules/56_ghg_policy/MMEmu_feb23/postsolve.gms b/modules/56_ghg_policy/MMEmu_feb23/postsolve.gms new file mode 100644 index 0000000000..767a3d4d9f --- /dev/null +++ b/modules/56_ghg_policy/MMEmu_feb23/postsolve.gms @@ -0,0 +1,65 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### + ov_carbon_stock(t,j,land,c_pools,stockType,"marginal") = vm_carbon_stock.m(j,land,c_pools,stockType); + ov_emission_costs(t,i,"marginal") = vm_emission_costs.m(i); + ov_emissions_reg(t,i,emis_source,pollutants,"marginal") = vm_emissions_reg.m(i,emis_source,pollutants); + ov56_emis_pricing(t,i,emis_source,pollutants,"marginal") = v56_emis_pricing.m(i,emis_source,pollutants); + ov56_emission_cost(t,i,emis_source,"marginal") = v56_emission_cost.m(i,emis_source); + ov_reward_cdr_aff(t,i,"marginal") = vm_reward_cdr_aff.m(i); + ov56_reward_cdr_aff(t,j,"marginal") = v56_reward_cdr_aff.m(j); + oq56_emission_costs(t,i,"marginal") = q56_emission_costs.m(i); + oq56_emission_cost_annual(t,i,emis_annual,"marginal") = q56_emission_cost_annual.m(i,emis_annual); + oq56_emission_cost_oneoff(t,i,emis_oneoff,"marginal") = q56_emission_cost_oneoff.m(i,emis_oneoff); + oq56_reward_cdr_aff_reg(t,i,"marginal") = q56_reward_cdr_aff_reg.m(i); + oq56_reward_cdr_aff(t,j,"marginal") = q56_reward_cdr_aff.m(j); + oq56_emis_pricing(t,i,pollutants,emis_source,"marginal") = q56_emis_pricing.m(i,pollutants,emis_source); + oq56_emis_pricing_co2(t,i,emis_oneoff,"marginal") = q56_emis_pricing_co2.m(i,emis_oneoff); + ov_carbon_stock(t,j,land,c_pools,stockType,"level") = vm_carbon_stock.l(j,land,c_pools,stockType); + ov_emission_costs(t,i,"level") = vm_emission_costs.l(i); + ov_emissions_reg(t,i,emis_source,pollutants,"level") = vm_emissions_reg.l(i,emis_source,pollutants); + ov56_emis_pricing(t,i,emis_source,pollutants,"level") = v56_emis_pricing.l(i,emis_source,pollutants); + ov56_emission_cost(t,i,emis_source,"level") = v56_emission_cost.l(i,emis_source); + ov_reward_cdr_aff(t,i,"level") = vm_reward_cdr_aff.l(i); + ov56_reward_cdr_aff(t,j,"level") = v56_reward_cdr_aff.l(j); + oq56_emission_costs(t,i,"level") = q56_emission_costs.l(i); + oq56_emission_cost_annual(t,i,emis_annual,"level") = q56_emission_cost_annual.l(i,emis_annual); + oq56_emission_cost_oneoff(t,i,emis_oneoff,"level") = q56_emission_cost_oneoff.l(i,emis_oneoff); + oq56_reward_cdr_aff_reg(t,i,"level") = q56_reward_cdr_aff_reg.l(i); + oq56_reward_cdr_aff(t,j,"level") = q56_reward_cdr_aff.l(j); + oq56_emis_pricing(t,i,pollutants,emis_source,"level") = q56_emis_pricing.l(i,pollutants,emis_source); + oq56_emis_pricing_co2(t,i,emis_oneoff,"level") = q56_emis_pricing_co2.l(i,emis_oneoff); + ov_carbon_stock(t,j,land,c_pools,stockType,"upper") = vm_carbon_stock.up(j,land,c_pools,stockType); + ov_emission_costs(t,i,"upper") = vm_emission_costs.up(i); + ov_emissions_reg(t,i,emis_source,pollutants,"upper") = vm_emissions_reg.up(i,emis_source,pollutants); + ov56_emis_pricing(t,i,emis_source,pollutants,"upper") = v56_emis_pricing.up(i,emis_source,pollutants); + ov56_emission_cost(t,i,emis_source,"upper") = v56_emission_cost.up(i,emis_source); + ov_reward_cdr_aff(t,i,"upper") = vm_reward_cdr_aff.up(i); + ov56_reward_cdr_aff(t,j,"upper") = v56_reward_cdr_aff.up(j); + oq56_emission_costs(t,i,"upper") = q56_emission_costs.up(i); + oq56_emission_cost_annual(t,i,emis_annual,"upper") = q56_emission_cost_annual.up(i,emis_annual); + oq56_emission_cost_oneoff(t,i,emis_oneoff,"upper") = q56_emission_cost_oneoff.up(i,emis_oneoff); + oq56_reward_cdr_aff_reg(t,i,"upper") = q56_reward_cdr_aff_reg.up(i); + oq56_reward_cdr_aff(t,j,"upper") = q56_reward_cdr_aff.up(j); + oq56_emis_pricing(t,i,pollutants,emis_source,"upper") = q56_emis_pricing.up(i,pollutants,emis_source); + oq56_emis_pricing_co2(t,i,emis_oneoff,"upper") = q56_emis_pricing_co2.up(i,emis_oneoff); + ov_carbon_stock(t,j,land,c_pools,stockType,"lower") = vm_carbon_stock.lo(j,land,c_pools,stockType); + ov_emission_costs(t,i,"lower") = vm_emission_costs.lo(i); + ov_emissions_reg(t,i,emis_source,pollutants,"lower") = vm_emissions_reg.lo(i,emis_source,pollutants); + ov56_emis_pricing(t,i,emis_source,pollutants,"lower") = v56_emis_pricing.lo(i,emis_source,pollutants); + ov56_emission_cost(t,i,emis_source,"lower") = v56_emission_cost.lo(i,emis_source); + ov_reward_cdr_aff(t,i,"lower") = vm_reward_cdr_aff.lo(i); + ov56_reward_cdr_aff(t,j,"lower") = v56_reward_cdr_aff.lo(j); + oq56_emission_costs(t,i,"lower") = q56_emission_costs.lo(i); + oq56_emission_cost_annual(t,i,emis_annual,"lower") = q56_emission_cost_annual.lo(i,emis_annual); + oq56_emission_cost_oneoff(t,i,emis_oneoff,"lower") = q56_emission_cost_oneoff.lo(i,emis_oneoff); + oq56_reward_cdr_aff_reg(t,i,"lower") = q56_reward_cdr_aff_reg.lo(i); + oq56_reward_cdr_aff(t,j,"lower") = q56_reward_cdr_aff.lo(j); + oq56_emis_pricing(t,i,pollutants,emis_source,"lower") = q56_emis_pricing.lo(i,pollutants,emis_source); + oq56_emis_pricing_co2(t,i,emis_oneoff,"lower") = q56_emis_pricing_co2.lo(i,emis_oneoff); +*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms new file mode 100644 index 0000000000..56642e2901 --- /dev/null +++ b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms @@ -0,0 +1,100 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +* starting value of above ground carbon stocks 1995 is only an estimate. +* ATTENTION: emissions in 1995 are not meaningful +vm_carbon_stock.l(j,land,ag_pools,stockType) = fm_carbon_density("y1995",j,land,ag_pools)*pcm_land(j,land); + +v56_emis_pricing.fx(i,emis_oneoff,pollutants)$(not sameas(pollutants,"co2_c")) = 0; + +****** Region price share for ghg policy of selective countries: +* Country switch to determine countries for which ghg policy shall be applied. +* In the default case, the ghg policy affects all countries when activated. +p56_country_dummy(iso) = 0; +p56_country_dummy(policy_countries56) = 1; +* Because MAgPIE is not run at country-level, but at region level, a region +* share is calculated that translates the countries' influence to regional level. +* Countries are weighted by their population size. +p56_region_price_shr(t_all,i) = sum(i_to_iso(i,iso), p56_country_dummy(iso) * im_pop_iso(t_all,iso)) / sum(i_to_iso(i,iso), im_pop_iso(t_all,iso)); + +****select ghg prices +$ifthen "%c56_pollutant_prices%" == "coupling" + im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices_coupling(t_all,i,pollutants); +$elseif "%c56_pollutant_prices%" == "emulator" + im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices_emulator(t_all,i,pollutants); +$else + im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices(t_all,i,pollutants,"%c56_pollutant_prices%") * p56_region_price_shr(t_all,i) + + f56_pollutant_prices(t_all,i,pollutants,"%c56_pollutant_prices_noselect%") * (1-p56_region_price_shr(t_all,i)); +** Harmonize till 2020 if not coupled or emulator +loop(t_all$(m_year(t_all) <= sm_fix_SSP2), +im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices(t_all,i,pollutants,"R21M42-SSP2-NPi") * p56_region_price_shr(t_all,i) + + f56_pollutant_prices(t_all,i,pollutants,"R21M42-SSP2-NPi") * (1-p56_region_price_shr(t_all,i)); +); +$endif + + +***save im_pollutant_prices to parameter +p56_pollutant_prices_input(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all,i,pollutants,emis_source); + +***limit CH4 and N2O GHG prices based on s56_limit_ch4_n2o_price +*12/44 conversion from USD per tC to USD per tCO2 +*28 and 265 Global Warming Potentials from AR5 WG1 CH08 Table 8.7, conversion from USD per tCO2 to USD per tCH4 and USD per tN2O +*44/28 conversion from USD per tN2O to USD per tN +im_pollutant_prices(t_all,i,"ch4",emis_source)$(im_pollutant_prices(t_all,i,"ch4",emis_source) > s56_limit_ch4_n2o_price*12/44*28) = s56_limit_ch4_n2o_price*12/44*28; +im_pollutant_prices(t_all,i,"n2o_n_direct",emis_source)$(im_pollutant_prices(t_all,i,"n2o_n_direct",emis_source) > s56_limit_ch4_n2o_price*12/44*265*44/28) = s56_limit_ch4_n2o_price*12/44*265*44/28; +im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source)$(im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source) > s56_limit_ch4_n2o_price*12/44*265*44/28) = s56_limit_ch4_n2o_price*12/44*265*44/28; + +***apply reduction factor on CO2 price to account for potential negative side effects +***lowers the economic incentive for CO2 emission reduction (avoided deforestation) and afforestation +im_pollutant_prices(t_all,i,"co2_c",emis_source) = im_pollutant_prices(t_all,i,"co2_c",emis_source)*s56_cprice_red_factor; + +***phase-in of GHG price over 20 year period; start depends on s56_ghgprice_start +if (s56_ghgprice_phase_in = 1, +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) < s56_ghgprice_start) = 0; +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start) = 0.1*im_pollutant_prices(t_all,i,pollutants,emis_source); +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start+5) = 0.2*im_pollutant_prices(t_all,i,pollutants,emis_source); +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start+10) = 0.4*im_pollutant_prices(t_all,i,pollutants,emis_source); +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start+15) = 0.8*im_pollutant_prices(t_all,i,pollutants,emis_source); +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) >= s56_ghgprice_start+20) = im_pollutant_prices(t_all,i,pollutants,emis_source); +); +***multiply GHG prices with development state to account for institutional requirements needed for implementing a GHG pricing scheme +im_pollutant_prices(t_all,i,pollutants,emis_source)$(s56_ghgprice_devstate_scaling = 1) = im_pollutant_prices(t_all,i,pollutants,emis_source)*im_development_state(t_all,i); + +***GHG emission policy +im_pollutant_prices(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all,i,pollutants,emis_source) * f56_emis_policy("%c56_emis_policy%",pollutants,emis_source); + +***construct age-class dependent C price for afforestation incentive +***this is needed because time steps (t) and age-classes (ac) can differ. ac and t_all are always in 5-year time steps. +*For missing years in t_all use C price of previous time step. This step makes sure that C prices for every 5-year time step are available. +loop(t_all$(m_year(t_all)>=s56_ghgprice_start), + im_pollutant_prices(t_all,i,"co2_c",emis_source)$(im_pollutant_prices(t_all,i,"co2_c",emis_source) = 0) = im_pollutant_prices(t_all-1,i,"co2_c",emis_source); +); +*Linear interpolation of C price for missing time steps +loop(t, + s56_timesteps = m_yeardiff(t)/5; + if (s56_timesteps > 1, + s56_counter = 0; + repeat( + s56_counter = s56_counter + 1; + s56_offset = s56_timesteps-s56_counter; + im_pollutant_prices(t_all-s56_offset,i,"co2_c",emis_source)$(m_year(t_all) = m_year(t)) = + im_pollutant_prices(t-1,i,"co2_c",emis_source) + + (im_pollutant_prices(t,i,"co2_c",emis_source) - im_pollutant_prices(t-1,i,"co2_c",emis_source))*s56_counter/(s56_timesteps); + until s56_counter = s56_timesteps-1); + ); +); + +*initialize age-class dependent C price with same C price for all age-classes +p56_c_price_aff(t_all,i,ac) = im_pollutant_prices(t_all,i,"co2_c","forestry_vegc"); +*Shift C prices in age-classes for reflecting foresight. +*e.g. ac5 in 2020 should have the C price of ac0 in 2025, and ac20 in 2020 equals to ac0 in 2040 +p56_c_price_aff(t_all,i,ac)$(ord(t_all)+ac.off= s56_c_price_exp_aff/5) = sum(ac_exp, p56_c_price_aff(t_all,i,ac_exp)); +*zero C price before starting year +p56_c_price_aff(t_all,i,ac)$(m_year(t_all) Date: Tue, 14 Feb 2023 14:37:21 +0100 Subject: [PATCH 010/259] Implement GHG prices from parameter input instead of file read-in --- .../MMEmu_feb23/declarations.gms | 1 + modules/56_ghg_policy/MMEmu_feb23/input.gms | 5 +- .../56_ghg_policy/MMEmu_feb23/not_used.txt | 3 ++ modules/56_ghg_policy/MMEmu_feb23/preloop.gms | 52 ++++++++----------- 4 files changed, 29 insertions(+), 32 deletions(-) create mode 100644 modules/56_ghg_policy/MMEmu_feb23/not_used.txt diff --git a/modules/56_ghg_policy/MMEmu_feb23/declarations.gms b/modules/56_ghg_policy/MMEmu_feb23/declarations.gms index 4da3658957..8844cb04f8 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/declarations.gms +++ b/modules/56_ghg_policy/MMEmu_feb23/declarations.gms @@ -7,6 +7,7 @@ parameters im_pollutant_prices(t_all,i,pollutants,emis_source) Certificate prices for N2O-N CH4 CO2-C used in the model (USD05MER per Mg) + p56_co2_price(t_all) Certificate prices for CO2 derived from input parameters (USD05MER per Mg) p56_pollutant_prices_input(t_all,i,pollutants,emis_source) Certificate prices for N2O-N CH4 CO2-C from input files (USD05MER per Mg) p56_c_price_aff(t_all,i,ac) C price used for afforestation decision-making (USD05MER per tC) pc56_c_price_induced_aff Helper for fixing C price driven afforestation to zero for historic time steps (binary) diff --git a/modules/56_ghg_policy/MMEmu_feb23/input.gms b/modules/56_ghg_policy/MMEmu_feb23/input.gms index 0124386e78..92f56726ea 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/input.gms +++ b/modules/56_ghg_policy/MMEmu_feb23/input.gms @@ -39,7 +39,10 @@ scalars s56_limit_ch4_n2o_price upper limit for CH4 and N2O GHG prices (USD05MER per tC) / 4000 / s56_cprice_red_factor reduction factor for CO2 price (-) / 1 / s56_ghgprice_start start year for ghg price phase-in (year) / 2025 / - s56_ghgprice_phase_in Switch for phasing-in GHG price over a 20 year period (1=on 0=off) / 0 / + s56_ghgprice_end end year for ghg price phase-in (year) / 2100 / + c56_ghgprice_linexp Switch between linear (0) and exponential (1) GHG price trajectory / 1 / + s56_ghgprice_startprice CO2 price at start of phase-in (USD05MER per tCO2) / 0 / + s56_ghgprice_endprice CO2 price at end of phase-in (USD05MER per tCO2) / 0 / s56_ghgprice_devstate_scaling Switch for scaling GHG price with development state (1=on 0=off) / 0 / s56_c_price_induced_aff Switch for C price driven afforestation (1=on 0=off) / 1 / s56_c_price_exp_aff c price expectation for afforestation (years) / 50 / diff --git a/modules/56_ghg_policy/MMEmu_feb23/not_used.txt b/modules/56_ghg_policy/MMEmu_feb23/not_used.txt new file mode 100644 index 0000000000..2e244c5a51 --- /dev/null +++ b/modules/56_ghg_policy/MMEmu_feb23/not_used.txt @@ -0,0 +1,3 @@ +name,type,reason +im_pop_iso,input,added by codeCheck +sm_fix_SSP2,input,added by codeCheck diff --git a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms index 56642e2901..37489b1a2b 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms +++ b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms @@ -11,31 +11,30 @@ vm_carbon_stock.l(j,land,ag_pools,stockType) = fm_carbon_density("y1995",j,land, v56_emis_pricing.fx(i,emis_oneoff,pollutants)$(not sameas(pollutants,"co2_c")) = 0; -****** Region price share for ghg policy of selective countries: -* Country switch to determine countries for which ghg policy shall be applied. -* In the default case, the ghg policy affects all countries when activated. -p56_country_dummy(iso) = 0; -p56_country_dummy(policy_countries56) = 1; -* Because MAgPIE is not run at country-level, but at region level, a region -* share is calculated that translates the countries' influence to regional level. -* Countries are weighted by their population size. -p56_region_price_shr(t_all,i) = sum(i_to_iso(i,iso), p56_country_dummy(iso) * im_pop_iso(t_all,iso)) / sum(i_to_iso(i,iso), im_pop_iso(t_all,iso)); +**** Exponentially or linearly implement globally uniform pollution prices +* 44/12 conversion from USD per tCO2 to USD per tC +* 28 and 265 Global Warming Potentials from AR5 WG1 CH08 Table 8.7, conversion from USD per tCO2 to USD per tCH4 and USD per tN2O +* 44/28 conversion from USD per tN2O to USD per tN -****select ghg prices -$ifthen "%c56_pollutant_prices%" == "coupling" - im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices_coupling(t_all,i,pollutants); -$elseif "%c56_pollutant_prices%" == "emulator" - im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices_emulator(t_all,i,pollutants); -$else - im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices(t_all,i,pollutants,"%c56_pollutant_prices%") * p56_region_price_shr(t_all,i) - + f56_pollutant_prices(t_all,i,pollutants,"%c56_pollutant_prices_noselect%") * (1-p56_region_price_shr(t_all,i)); -** Harmonize till 2020 if not coupled or emulator -loop(t_all$(m_year(t_all) <= sm_fix_SSP2), -im_pollutant_prices(t_all,i,pollutants,emis_source) = f56_pollutant_prices(t_all,i,pollutants,"R21M42-SSP2-NPi") * p56_region_price_shr(t_all,i) - + f56_pollutant_prices(t_all,i,pollutants,"R21M42-SSP2-NPi") * (1-p56_region_price_shr(t_all,i)); +loop(t_all, + if(m_year(t_all) <= s56_ghgprice_start, + p56_co2_price(t_all) = 0; +elseif m_year(t_all) >= s56_ghgprice_end, + p56_co2_price(t_all) = s56_ghgprice_endprice; +else + if(c56_ghgprice_linexp = 0, + p56_co2_price(t_all) = s56_ghgprice_startprice + ((s56_ghgprice_endprice - s56_ghgprice_startprice) / (s56_ghgprice_end - s56_ghgprice_start)) * (m_year(t_all) - s56_ghgprice_start); + elseif c56_ghgprice_linexp = 1, + p56_co2_price(t_all) = 0 + (s56_ghgprice_startprice * ((s56_ghgprice_endprice / s56_ghgprice_startprice) ** (1 / (s56_ghgprice_end - s56_ghgprice_start))) ** (m_year(t_all) - s56_ghgprice_start)) $ (s56_ghgprice_startprice <> 0); + ); + ); ); -$endif +im_pollutant_prices(t_all,i,pollutants,emis_source) = 0; +im_pollutant_prices(t_all,i,"co2_c",emis_source) = (44 / 12) * p56_co2_price(t_all); +im_pollutant_prices(t_all,i,"ch4",emis_source) = 28 * p56_co2_price(t_all); +im_pollutant_prices(t_all,i,"n2o_n_direct",emis_source) = 265 * (44 / 28) * p56_co2_price(t_all); +im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source) = 265 * (44 / 28) * p56_co2_price(t_all); ***save im_pollutant_prices to parameter p56_pollutant_prices_input(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all,i,pollutants,emis_source); @@ -52,15 +51,6 @@ im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source)$(im_pollutant_prices(t ***lowers the economic incentive for CO2 emission reduction (avoided deforestation) and afforestation im_pollutant_prices(t_all,i,"co2_c",emis_source) = im_pollutant_prices(t_all,i,"co2_c",emis_source)*s56_cprice_red_factor; -***phase-in of GHG price over 20 year period; start depends on s56_ghgprice_start -if (s56_ghgprice_phase_in = 1, -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) < s56_ghgprice_start) = 0; -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start) = 0.1*im_pollutant_prices(t_all,i,pollutants,emis_source); -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start+5) = 0.2*im_pollutant_prices(t_all,i,pollutants,emis_source); -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start+10) = 0.4*im_pollutant_prices(t_all,i,pollutants,emis_source); -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) = s56_ghgprice_start+15) = 0.8*im_pollutant_prices(t_all,i,pollutants,emis_source); -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) >= s56_ghgprice_start+20) = im_pollutant_prices(t_all,i,pollutants,emis_source); -); ***multiply GHG prices with development state to account for institutional requirements needed for implementing a GHG pricing scheme im_pollutant_prices(t_all,i,pollutants,emis_source)$(s56_ghgprice_devstate_scaling = 1) = im_pollutant_prices(t_all,i,pollutants,emis_source)*im_development_state(t_all,i); From b65f6e165b32b9eeef3208d58b6df0d2c7bbd1b7 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 14 Feb 2023 20:40:38 +0100 Subject: [PATCH 011/259] Add script for MMEmulator Tau creation --- scripts/start/projects/MMEmu_tau.R | 83 ++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 scripts/start/projects/MMEmu_tau.R diff --git a/scripts/start/projects/MMEmu_tau.R b/scripts/start/projects/MMEmu_tau.R new file mode 100644 index 0000000000..7d094598a7 --- /dev/null +++ b/scripts/start/projects/MMEmu_tau.R @@ -0,0 +1,83 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Debug Setup +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$qos <- "standby" + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) +cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + +cfg$output <- c("output_check", "rds_report") +cfg$force_replace <- TRUE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "Emulator_23-02-14_set-71" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" +# non-default BE demands +cfg$gms$c60_1stgen_biodem <- "phaseout2020" +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-PhaseOut20" +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 + +# Subsidies / Prices +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 + +cfg$gms$s60_bioenergy_gj_price_1st <- 0 +cfg$gms$s60_bioenergy_price_2nd <- 0 + + +### GHG +cfg$gms$ghg_policy <- "MMEmu_feb23" +cfg$gms$s56_ghgprice_startprice <- 0 +cfg$gms$s56_ghgprice_endprice <- 0 + + +### Tau / Yield +cfg$gms$c14_yields_scenario <- "nocc_hist" + +### Biodiv +cfg$gms$c44_bii_decrease <- 0 + + +### Cropland +cfg$gms$s30_annual_max_growth <- 0.02 + + + +############################################## +cfg$title <- "B00G0000_tau" + +start_run(cfg, codeCheck = FALSE) \ No newline at end of file From 5030d0a73589122f833a14beee6cf9fb3e82eddc Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 14 Feb 2023 21:14:33 +0100 Subject: [PATCH 012/259] Create Emulator start script for price-driven runs --- scripts/start/projects/MMEmu_price.R | 92 ++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 scripts/start/projects/MMEmu_price.R diff --git a/scripts/start/projects/MMEmu_price.R b/scripts/start/projects/MMEmu_price.R new file mode 100644 index 0000000000..644290e512 --- /dev/null +++ b/scripts/start/projects/MMEmu_price.R @@ -0,0 +1,92 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Debug Setup +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$qos <- "standby" + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) +cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + +cfg$output <- c("output_check", "rds_report") +cfg$force_replace <- TRUE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "Emulator_23-02-14_set-71" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" +# non-default BE demands +cfg$gms$c60_1stgen_biodem <- "phaseout2020" +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-PhaseOut20" +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 + +# Subsidies / Prices +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 + +beV <- c(0, 6, 8, 10, 12, 15, 25) + +### GHG +cfg$gms$ghg_policy <- "MMEmu_feb23" +cfg$gms$s56_ghgprice_startprice <- 0 +cfg$gms$s56_ghgprice_endprice <- 0 + + +### Tau / Yield +cfg$gms$c14_yields_scenario <- "nocc_hist" +cfg$gms$tc <- "exo" + +### Biodiv +cfg$gms$c44_bii_decrease <- 0 + + +### Cropland +cfg$gms$s30_annual_max_growth <- 0.02 + + +us00_05 <- 1.1197 #src: https://data.worldbank.org/indicator/NY.GDP.DEFL.ZS?end=2005&locations=US&start=2000 + + +for (be in beV){ + cfg$gms$s60_bioenergy_gj_price_1st <- be * us00_05 + cfg$gms$s60_bioenergy_price_2nd <- be * us00_05 + + ############################################## + runflag <- "price" + cfg$title <- paste0(str_pad(be, 2, pad = "0"), "G0000", runflag) + + start_run(cfg, codeCheck = FALSE) + + +} #GHG From 4a5170789d18477b118cd4a8105d976985cfb0a2 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 14 Feb 2023 22:12:48 +0100 Subject: [PATCH 013/259] Create Emulator start script for demand-driven runs --- scripts/start/projects/MMEmu_demand.R | 97 +++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 scripts/start/projects/MMEmu_demand.R diff --git a/scripts/start/projects/MMEmu_demand.R b/scripts/start/projects/MMEmu_demand.R new file mode 100644 index 0000000000..b4a2700e62 --- /dev/null +++ b/scripts/start/projects/MMEmu_demand.R @@ -0,0 +1,97 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Demand-Driven +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$qos <- "standby" + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) +cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + +cfg$output <- c("output_check", "rds_report") +cfg$force_replace <- TRUE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "Emulator_23-02-14_set-71" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" +# non-default BE demands +cfg$gms$c60_1stgen_biodem <- "phaseout2020" +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 + +# Subsidies / Prices +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 + +cfg$gms$s60_bioenergy_gj_price_1st <- 0 +cfg$gms$s60_bioenergy_price_2nd <- 0 + +beV <- c(0, 6, 8, 10, 12, 15, 25) + +### GHG +cfg$gms$ghg_policy <- "MMEmu_feb23" + +gV <- c(0, 100, 200, 400, 1000, 2000, 3000, 4000) + +### Tau / Yield +cfg$gms$c14_yields_scenario <- "nocc_hist" +cfg$gms$tc <- "exo" + +### Biodiv +cfg$gms$c44_bii_decrease <- 0 + + +### Cropland +cfg$gms$s30_annual_max_growth <- 0.02 + + +us00_05 <- 1.1197 #src: https://data.worldbank.org/indicator/NY.GDP.DEFL.ZS?end=2005&locations=US&start=2000 + + +for (be in beV){ + + cfg$gms$c60_2ndgen_biodem <- paste0("Emu", str_pad(be, 2, pad = "0")) + + for (g in gV){ + + cfg$gms$s56_ghgprice_startprice <- g / 40 + cfg$gms$s56_ghgprice_endprice <- g + + ############################################## + runflag <- "demand" + cfg$title <- paste0("E", str_pad(be, 2, pad = "0"), "G", str_pad(g, 4, pad = "0"), runflag) + + start_run(cfg, codeCheck = FALSE) + } #GHG +} #BE From ff5dea4b7a86f5c9b1e5d6883d62abc90e201a13 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 15 Feb 2023 13:19:42 +0100 Subject: [PATCH 014/259] Correct GHG price implementation time --- modules/56_ghg_policy/MMEmu_feb23/preloop.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms index 37489b1a2b..e7e3cd4a45 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms +++ b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms @@ -17,7 +17,7 @@ v56_emis_pricing.fx(i,emis_oneoff,pollutants)$(not sameas(pollutants,"co2_c")) = * 44/28 conversion from USD per tN2O to USD per tN loop(t_all, - if(m_year(t_all) <= s56_ghgprice_start, + if(m_year(t_all) < s56_ghgprice_start, p56_co2_price(t_all) = 0; elseif m_year(t_all) >= s56_ghgprice_end, p56_co2_price(t_all) = s56_ghgprice_endprice; From ea8fde8f700252ef38e4b96c06f4a63317ec7aa1 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 20 Feb 2023 11:00:02 +0100 Subject: [PATCH 015/259] Minor corrections --- modules/30_crop/endo_apr21/equations.gms | 3 ++- modules/30_crop/endo_apr21/presolve.gms | 2 +- modules/60_bioenergy/MMEmu_feb23/equations.gms | 3 ++- scripts/start/projects/MMEmu_demand.R | 4 ++-- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/modules/30_crop/endo_apr21/equations.gms b/modules/30_crop/endo_apr21/equations.gms index 2d67f45e7f..d554f1da29 100644 --- a/modules/30_crop/endo_apr21/equations.gms +++ b/modules/30_crop/endo_apr21/equations.gms @@ -74,4 +74,5 @@ q30_crop_reg(i2) .. v30_crop_area(i2) =e= - sum(cell(i2,j2), vm_land(j2,"crop")); \ No newline at end of file + sum(cell(i2,j2), vm_land(j2,"crop")); + \ No newline at end of file diff --git a/modules/30_crop/endo_apr21/presolve.gms b/modules/30_crop/endo_apr21/presolve.gms index b903db2eaa..31512706ca 100644 --- a/modules/30_crop/endo_apr21/presolve.gms +++ b/modules/30_crop/endo_apr21/presolve.gms @@ -41,4 +41,4 @@ if(m_year(t) <= sm_fix_SSP2, v30_crop_area.up(i) = Inf; else v30_crop_area.up(i) = v30_crop_area.l(i) * (1 + s30_annual_max_growth) ** m_yeardiff(t); -); \ No newline at end of file +); diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms index cfd500d482..8726ee691c 100644 --- a/modules/60_bioenergy/MMEmu_feb23/equations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -74,4 +74,5 @@ q60_res_2ndgenBE(i2) .. q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) + sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * fm_attributes("ge",k1st60) * (-i60_1stgen_bioenergy_subsidy_gj(ct))) - + sum((ct,kbe60), vm_dem_bioen(i2,kbe60) * fm_attributes("ge",kbe60) * (-i60_2ndgen_bioenergy_subsidy(ct))); \ No newline at end of file + + sum((ct,kbe60), vm_dem_bioen(i2,kbe60) * fm_attributes("ge",kbe60) * (-i60_2ndgen_bioenergy_subsidy(ct))); + \ No newline at end of file diff --git a/scripts/start/projects/MMEmu_demand.R b/scripts/start/projects/MMEmu_demand.R index b4a2700e62..1ed1499495 100644 --- a/scripts/start/projects/MMEmu_demand.R +++ b/scripts/start/projects/MMEmu_demand.R @@ -85,8 +85,8 @@ for (be in beV){ for (g in gV){ - cfg$gms$s56_ghgprice_startprice <- g / 40 - cfg$gms$s56_ghgprice_endprice <- g + cfg$gms$s56_ghgprice_startprice <- g / 40 * us00_05 + cfg$gms$s56_ghgprice_endprice <- g * us00_05 ############################################## runflag <- "demand" From 3ed30635e4f339b535db930cb532a8e30d0da993 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 21 Feb 2023 14:52:25 +0100 Subject: [PATCH 016/259] Update MMEmu default script --- config/default.cfg | 3 +++ scripts/start/projects/MMEmu_default.R | 24 ++++++++---------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 8b6cfb5694..4dbe6f7c03 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -666,6 +666,9 @@ cfg$gms$policy_countries30 <- all_iso_countries # * "secdforest, past, other" etc. cfg$gms$land_snv <- "secdforest, forestry, past, other" #def = "secdforest, forestry, past, other" +# * (s30_annual_max_growth): Additional cropland per year per region, relative to the current cropland level (e.g., 0.02 -> 10.4% allowed growth between 2020 and 2025, relative to 2020 cropland area) +cfg$gms$s30_annual_max_growth <- Inf # def = Inf + # ***--------------------- 31_past --------------------------------------- # * (static): static pasture # * (endo_jun13): dynamic pasture diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index 9a23f64fa2..dce0718105 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -27,7 +27,12 @@ source("config/default.cfg") #nolinter cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, "./patch_input" = NULL), getOption("magpie_repos")) -cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + +#R11: a10a580c , R37: acb82c28 +cfg$input <- c(regional = "rev4.81_a10a580c_magpie.tgz", + cellular = "rev4.81_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.81_a10a580c_validation.tgz", + additional = "additional_data_rev4.38.tgz") cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE @@ -37,24 +42,11 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### -identifierFlag <- "Emulator_debug" -cfg$title <- "6_Cropland_A_Default_Inf" +identifierFlag <- "MMEmu_default" +cfg$title <- "Default_R11" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") -### BE -# non-default BE demands - -### Yield -#cfg$gms$c14_yields_scenario <- "nocc_hist" - -### Biodiv -#cfg$gms$c44_bii_decrease <- 0 - -### Cropland -cfg$gms$s30_annual_max_growth <- Inf - - ########################################################## start_run(cfg, codeCheck = FALSE) \ No newline at end of file From 5ceb1580193a2e80ab27bcc39840ec59272cd5ac Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 21 Feb 2023 14:59:29 +0100 Subject: [PATCH 017/259] Add missing final line --- modules/30_crop/endo_apr21/equations.gms | 1 - modules/60_bioenergy/MMEmu_feb23/equations.gms | 1 - scripts/start/projects/MMEmu_debug.R | 2 +- scripts/start/projects/MMEmu_default.R | 2 +- scripts/start/projects/MMEmu_tau.R | 2 +- 5 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/30_crop/endo_apr21/equations.gms b/modules/30_crop/endo_apr21/equations.gms index d554f1da29..30586c6aef 100644 --- a/modules/30_crop/endo_apr21/equations.gms +++ b/modules/30_crop/endo_apr21/equations.gms @@ -75,4 +75,3 @@ q30_crop_reg(i2) .. v30_crop_area(i2) =e= sum(cell(i2,j2), vm_land(j2,"crop")); - \ No newline at end of file diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/MMEmu_feb23/equations.gms index 8726ee691c..ec38cc2e0f 100644 --- a/modules/60_bioenergy/MMEmu_feb23/equations.gms +++ b/modules/60_bioenergy/MMEmu_feb23/equations.gms @@ -75,4 +75,3 @@ q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) + sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * fm_attributes("ge",k1st60) * (-i60_1stgen_bioenergy_subsidy_gj(ct))) + sum((ct,kbe60), vm_dem_bioen(i2,kbe60) * fm_attributes("ge",kbe60) * (-i60_2ndgen_bioenergy_subsidy(ct))); - \ No newline at end of file diff --git a/scripts/start/projects/MMEmu_debug.R b/scripts/start/projects/MMEmu_debug.R index 33eb2f6d3e..f509e5be9c 100644 --- a/scripts/start/projects/MMEmu_debug.R +++ b/scripts/start/projects/MMEmu_debug.R @@ -61,4 +61,4 @@ cfg$gms$s60_bioenergy_price_2nd <- 10 ### Cropland cfg$gms$s30_annual_max_growth <- Inf -start_run(cfg, codeCheck = FALSE) \ No newline at end of file +start_run(cfg, codeCheck = FALSE) diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index dce0718105..89f3a305cb 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -49,4 +49,4 @@ cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") ########################################################## -start_run(cfg, codeCheck = FALSE) \ No newline at end of file +start_run(cfg, codeCheck = FALSE) diff --git a/scripts/start/projects/MMEmu_tau.R b/scripts/start/projects/MMEmu_tau.R index 7d094598a7..a6032a922a 100644 --- a/scripts/start/projects/MMEmu_tau.R +++ b/scripts/start/projects/MMEmu_tau.R @@ -80,4 +80,4 @@ cfg$gms$s30_annual_max_growth <- 0.02 ############################################## cfg$title <- "B00G0000_tau" -start_run(cfg, codeCheck = FALSE) \ No newline at end of file +start_run(cfg, codeCheck = FALSE) From 9d624d675a4557d6e5e71da103ee5608f0c96844 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 2 Mar 2023 11:45:18 +0100 Subject: [PATCH 018/259] Minor correction --- modules/30_crop/endo_apr21/input.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/30_crop/endo_apr21/input.gms b/modules/30_crop/endo_apr21/input.gms index 39c78d3625..12ea3ec613 100644 --- a/modules/30_crop/endo_apr21/input.gms +++ b/modules/30_crop/endo_apr21/input.gms @@ -100,7 +100,7 @@ $if "%c30_rotation_constraints%" == "off" f30_rotation_min_shr(crp30) = 0; ********* AVAILABLE CROPLAND ******************************************* scalar -s30_annual_max_growth Max annual cropland growth as share of previous cropland (%) / Inf / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / ; table f30_avl_cropland(j,marginal_land30) Available land area for cropland (mio. ha) From 8eddcdc7e7ad9cc348aff14087ff183db3a5d6f4 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 25 Apr 2023 17:10:12 +0200 Subject: [PATCH 019/259] Update Emulator to new input data --- modules/30_crop/endo_apr21/input.gms | 5 ++--- scripts/start/projects/MMEmu_default.R | 12 +++++++----- scripts/start/projects/MMEmu_price.R | 13 +++++++++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/modules/30_crop/endo_apr21/input.gms b/modules/30_crop/endo_apr21/input.gms index 12ea3ec613..49b5d7ff4b 100644 --- a/modules/30_crop/endo_apr21/input.gms +++ b/modules/30_crop/endo_apr21/input.gms @@ -27,6 +27,7 @@ s30_snv_scenario_start SNV scenario start year / 2020 / s30_snv_scenario_target SNV scenario target year / 2030 / s30_rotation_scenario_start Rotation scenario start year / 2020 / s30_rotation_scenario_target Rotation scenario target year / 2050 / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / ; * Set-switch for countries affected by regional SNV policy @@ -99,9 +100,7 @@ $if "%c30_rotation_constraints%" == "off" f30_rotation_min_shr(crp30) = 0; ********* AVAILABLE CROPLAND ******************************************* -scalar -s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / -; + table f30_avl_cropland(j,marginal_land30) Available land area for cropland (mio. ha) $ondelim diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index 89f3a305cb..a824055a62 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -29,10 +29,12 @@ cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" getOption("magpie_repos")) #R11: a10a580c , R37: acb82c28 -cfg$input <- c(regional = "rev4.81_a10a580c_magpie.tgz", - cellular = "rev4.81_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.81_a10a580c_validation.tgz", - additional = "additional_data_rev4.38.tgz") +cfg$input <- c(regional = "rev4.84_a10a580c_magpie.tgz", + cellular = "rev4.84_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.84_a10a580c_validation.tgz", + additional = "additional_data_rev4.39.tgz", + patch = "MMEmuR11.tgz") + cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE @@ -43,7 +45,7 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### identifierFlag <- "MMEmu_default" -cfg$title <- "Default_R11" +cfg$title <- "Default_R11_patched" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") diff --git a/scripts/start/projects/MMEmu_price.R b/scripts/start/projects/MMEmu_price.R index 644290e512..157fa296ed 100644 --- a/scripts/start/projects/MMEmu_price.R +++ b/scripts/start/projects/MMEmu_price.R @@ -29,7 +29,11 @@ cfg$qos <- "standby" cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, "./patch_input" = NULL), getOption("magpie_repos")) -cfg$input <- append(cfg$input, c(patch = "patch.tgz")) +cfg$input <- c(regional = "rev4.84_a10a580c_magpie.tgz", + cellular = "rev4.84_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.84_a10a580c_validation.tgz", + additional = "additional_data_rev4.39.tgz", + patch = "MMEmuR11.tgz") cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE @@ -39,7 +43,7 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### -identifierFlag <- "Emulator_23-02-14_set-71" +identifierFlag <- "Emulator_23-04-25_set-76" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") @@ -48,14 +52,15 @@ cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") cfg$gms$bioenergy <- "MMEmu_feb23" # non-default BE demands cfg$gms$c60_1stgen_biodem <- "phaseout2020" -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-PhaseOut20" +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-PhaseOut50" cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 # Subsidies / Prices cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 cfg$gms$c60_bioenergy_subsidy <- 0 -beV <- c(0, 6, 8, 10, 12, 15, 25) +#beV <- c(0, 6, 8, 10, 12, 15, 25) +beV <- c(25) ### GHG cfg$gms$ghg_policy <- "MMEmu_feb23" From d1e7adba72c5ffde3d82d8bbe1aa6208d28275e9 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 26 Apr 2023 15:48:03 +0200 Subject: [PATCH 020/259] Add switch for BE price implementation --- modules/60_bioenergy/MMEmu_feb23/input.gms | 3 ++- modules/60_bioenergy/MMEmu_feb23/presolve.gms | 13 ++++++++++++- scripts/start/projects/MMEmu_demand.R | 15 ++++++++++----- scripts/start/projects/MMEmu_price.R | 3 ++- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/MMEmu_feb23/input.gms index 0209409623..5f8da47522 100644 --- a/modules/60_bioenergy/MMEmu_feb23/input.gms +++ b/modules/60_bioenergy/MMEmu_feb23/input.gms @@ -43,7 +43,8 @@ scalars s60_2ndgen_bioenergy_dem_min_post_fix Minimum dedicated 2nd generation bioenergy demand assumed in each region after SSP2-fix (mio. GJ per yr) / 1 / ; -$setglobal c60_2ndgen_biodem R21M42-SSP2-NPi +$setglobal c60_price_implementation exp +$setglobal c60_2ndgen_biodem R21M42-SSP2-Npi-PhaseOut50 $setglobal c60_2ndgen_biodem_noselect R21M42-SSP2-NPi diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index 96a21a5c30..7cfc2ba59a 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -30,9 +30,20 @@ else i60_1stgen_bioenergy_subsidy_gj(t) = s60_bioenergy_gj_price_1st; i60_2ndgen_bioenergy_subsidy(t) = - s60_bioenergy_price_2nd; + s60_bioenergy_price_2nd; ); + +$ifthen "%c60_price_implementation%" == "exp" + if(m_year(t) > sm_fix_SSP2, + i60_1stgen_bioenergy_subsidy_gj(t) = + (s60_bioenergy_gj_price_1st / 8) * (8 ** (1 / (2100 - sm_fix_SSP2))) ** (m_year(t) - sm_fix_SSP2); + i60_2ndgen_bioenergy_subsidy(t) = + (s60_bioenergy_price_2nd / 8) * (8 ** (1 / (2100 - sm_fix_SSP2))) ** (m_year(t) - sm_fix_SSP2); + ); +$endif + + * Add minimal bioenergy demand in case of zero demand or very small demand to avoid zero prices if(m_year(t) <= sm_fix_SSP2, i60_bioenergy_dem(t,i)$(i60_bioenergy_dem(t,i) < s60_2ndgen_bioenergy_dem_min) = s60_2ndgen_bioenergy_dem_min; diff --git a/scripts/start/projects/MMEmu_demand.R b/scripts/start/projects/MMEmu_demand.R index 1ed1499495..b2149b48ac 100644 --- a/scripts/start/projects/MMEmu_demand.R +++ b/scripts/start/projects/MMEmu_demand.R @@ -29,7 +29,11 @@ cfg$qos <- "standby" cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, "./patch_input" = NULL), getOption("magpie_repos")) -cfg$input <- append(cfg$input, c(patch = "patch.tgz")) +cfg$input <- c(regional = "rev4.84_a10a580c_magpie.tgz", + cellular = "rev4.84_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.84_a10a580c_validation.tgz", + additional = "additional_data_rev4.39.tgz", + patch = "MMEmuR11.tgz") cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE @@ -39,7 +43,7 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### -identifierFlag <- "Emulator_23-02-14_set-71" +identifierFlag <- "Emulator_23-04-25_set-76" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") @@ -57,12 +61,13 @@ cfg$gms$c60_bioenergy_subsidy <- 0 cfg$gms$s60_bioenergy_gj_price_1st <- 0 cfg$gms$s60_bioenergy_price_2nd <- 0 -beV <- c(0, 6, 8, 10, 12, 15, 25) +#beV <- c(0, 6, 8, 10, 12, 15, 25) +beV <- c(25) ### GHG cfg$gms$ghg_policy <- "MMEmu_feb23" -gV <- c(0, 100, 200, 400, 1000, 2000, 3000, 4000) +gV <- c(0, 100, 1000, 2000, 3000, 4000) ### Tau / Yield cfg$gms$c14_yields_scenario <- "nocc_hist" @@ -81,7 +86,7 @@ us00_05 <- 1.1197 #src: https://data.worldbank.org/indicator/NY.GDP.DEFL.ZS?end= for (be in beV){ - cfg$gms$c60_2ndgen_biodem <- paste0("Emu", str_pad(be, 2, pad = "0")) + cfg$gms$c60_2ndgen_biodem <- paste0("Emu", str_pad(be, 2, pad = "0"), "const") for (g in gV){ diff --git a/scripts/start/projects/MMEmu_price.R b/scripts/start/projects/MMEmu_price.R index 157fa296ed..9b6336b373 100644 --- a/scripts/start/projects/MMEmu_price.R +++ b/scripts/start/projects/MMEmu_price.R @@ -58,6 +58,7 @@ cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 # Subsidies / Prices cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 cfg$gms$c60_bioenergy_subsidy <- 0 +cfg$gms$c60_price_implementation <- "exp" #beV <- c(0, 6, 8, 10, 12, 15, 25) beV <- c(25) @@ -88,7 +89,7 @@ for (be in beV){ cfg$gms$s60_bioenergy_price_2nd <- be * us00_05 ############################################## - runflag <- "price" + runflag <- "price-exp" cfg$title <- paste0(str_pad(be, 2, pad = "0"), "G0000", runflag) start_run(cfg, codeCheck = FALSE) From 98327e091984a18e8d50d333be4c63c3cdfbc277 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Sun, 21 May 2023 20:13:59 +0200 Subject: [PATCH 021/259] Update 56_GHG_Policy in line with changes in other realization --- modules/56_ghg_policy/MMEmu_feb23/input.gms | 3 +++ modules/56_ghg_policy/MMEmu_feb23/preloop.gms | 17 ++++++++++++----- modules/56_ghg_policy/MMEmu_feb23/sets.gms | 6 ++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/modules/56_ghg_policy/MMEmu_feb23/input.gms b/modules/56_ghg_policy/MMEmu_feb23/input.gms index 92f56726ea..b15e17f6c3 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/input.gms +++ b/modules/56_ghg_policy/MMEmu_feb23/input.gms @@ -38,6 +38,7 @@ sets scalars s56_limit_ch4_n2o_price upper limit for CH4 and N2O GHG prices (USD05MER per tC) / 4000 / s56_cprice_red_factor reduction factor for CO2 price (-) / 1 / + s56_minimum_cprice Minium C price for future time steps (USD per tC) / 0 / s56_ghgprice_start start year for ghg price phase-in (year) / 2025 / s56_ghgprice_end end year for ghg price phase-in (year) / 2100 / c56_ghgprice_linexp Switch between linear (0) and exponential (1) GHG price trajectory / 1 / @@ -55,6 +56,8 @@ scalars $setglobal c56_pollutant_prices R21M42-SSP2-NPi $setglobal c56_pollutant_prices_noselect R21M42-SSP2-NPi $setglobal c56_emis_policy redd+natveg_nosoil +$setglobal c56_cprice_aff forestry_vegc +$setglobal c56_mute_ghgprices_until y2030 $setglobal c56_carbon_stock_pricing actualNoAcEst * options: actual, actualNoAcEst diff --git a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms index e7e3cd4a45..7a9ea1567d 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms +++ b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms @@ -19,9 +19,9 @@ v56_emis_pricing.fx(i,emis_oneoff,pollutants)$(not sameas(pollutants,"co2_c")) = loop(t_all, if(m_year(t_all) < s56_ghgprice_start, p56_co2_price(t_all) = 0; -elseif m_year(t_all) >= s56_ghgprice_end, + elseif m_year(t_all) >= s56_ghgprice_end, p56_co2_price(t_all) = s56_ghgprice_endprice; -else + else if(c56_ghgprice_linexp = 0, p56_co2_price(t_all) = s56_ghgprice_startprice + ((s56_ghgprice_endprice - s56_ghgprice_startprice) / (s56_ghgprice_end - s56_ghgprice_start)) * (m_year(t_all) - s56_ghgprice_start); elseif c56_ghgprice_linexp = 1, @@ -39,6 +39,13 @@ im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source) = 265 * (44 / 28) * p5 ***save im_pollutant_prices to parameter p56_pollutant_prices_input(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all,i,pollutants,emis_source); +** set GHG prices to zero for historic period +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) <= sm_fix_SSP2) = 0; +** set GHG prices to zero for all future time steps until the year defined by `c56_mute_ghgprices_until` +im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) > sm_fix_SSP2 AND m_year(t_all) <= m_year("%c56_mute_ghgprices_until%")) = 0; +** Exception for C price, which can be set to a minium price for all future time steps until the year defined by `c56_mute_ghgprices_until` +im_pollutant_prices(t_all,i,"co2_c",emis_source)$(m_year(t_all) > sm_fix_SSP2 AND m_year(t_all) <= m_year("%c56_mute_ghgprices_until%")) = s56_minimum_cprice; + ***limit CH4 and N2O GHG prices based on s56_limit_ch4_n2o_price *12/44 conversion from USD per tC to USD per tCO2 *28 and 265 Global Warming Potentials from AR5 WG1 CH08 Table 8.7, conversion from USD per tCO2 to USD per tCH4 and USD per tN2O @@ -60,7 +67,7 @@ im_pollutant_prices(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all, ***construct age-class dependent C price for afforestation incentive ***this is needed because time steps (t) and age-classes (ac) can differ. ac and t_all are always in 5-year time steps. *For missing years in t_all use C price of previous time step. This step makes sure that C prices for every 5-year time step are available. -loop(t_all$(m_year(t_all)>=s56_ghgprice_start), +loop(t_all$(m_year(t_all) > m_year("%c56_mute_ghgprices_until%")), im_pollutant_prices(t_all,i,"co2_c",emis_source)$(im_pollutant_prices(t_all,i,"co2_c",emis_source) = 0) = im_pollutant_prices(t_all-1,i,"co2_c",emis_source); ); *Linear interpolation of C price for missing time steps @@ -79,7 +86,7 @@ loop(t, ); *initialize age-class dependent C price with same C price for all age-classes -p56_c_price_aff(t_all,i,ac) = im_pollutant_prices(t_all,i,"co2_c","forestry_vegc"); +p56_c_price_aff(t_all,i,ac) = im_pollutant_prices(t_all,i,"co2_c","%c56_cprice_aff%"); *Shift C prices in age-classes for reflecting foresight. *e.g. ac5 in 2020 should have the C price of ac0 in 2025, and ac20 in 2020 equals to ac0 in 2040 p56_c_price_aff(t_all,i,ac)$(ord(t_all)+ac.off= s56_c_price_exp_aff/5) = sum(ac_exp, p56_c_price_aff(t_all,i,ac_exp)); *zero C price before starting year -p56_c_price_aff(t_all,i,ac)$(m_year(t_all) Date: Sun, 21 May 2023 20:19:32 +0200 Subject: [PATCH 022/259] Update not_used --- modules/56_ghg_policy/MMEmu_feb23/not_used.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/56_ghg_policy/MMEmu_feb23/not_used.txt b/modules/56_ghg_policy/MMEmu_feb23/not_used.txt index 2e244c5a51..a1f9037175 100644 --- a/modules/56_ghg_policy/MMEmu_feb23/not_used.txt +++ b/modules/56_ghg_policy/MMEmu_feb23/not_used.txt @@ -1,3 +1,3 @@ name,type,reason im_pop_iso,input,added by codeCheck -sm_fix_SSP2,input,added by codeCheck + From 42b5f1cd5bfdc50bf052e40c90921d008c2cb94e Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 22 May 2023 11:45:03 +0200 Subject: [PATCH 023/259] Update BE price presolve --- modules/60_bioenergy/MMEmu_feb23/presolve.gms | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index 7cfc2ba59a..147dd83e55 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -27,10 +27,6 @@ else f60_res_2ndgenBE_dem(t,i,"%c60_res_2ndgenBE_dem%"); i60_1stgen_bioenergy_subsidy_tdm(t) = c60_bioenergy_subsidy; - i60_1stgen_bioenergy_subsidy_gj(t) = - s60_bioenergy_gj_price_1st; - i60_2ndgen_bioenergy_subsidy(t) = - s60_bioenergy_price_2nd; ); @@ -41,6 +37,13 @@ $ifthen "%c60_price_implementation%" == "exp" i60_2ndgen_bioenergy_subsidy(t) = (s60_bioenergy_price_2nd / 8) * (8 ** (1 / (2100 - sm_fix_SSP2))) ** (m_year(t) - sm_fix_SSP2); ); +$else + if(m_year(t) > sm_fix_SSP2, + i60_1stgen_bioenergy_subsidy_gj(t) = + s60_bioenergy_gj_price_1st; + i60_2ndgen_bioenergy_subsidy(t) = + s60_bioenergy_price_2nd; + ); $endif From f7048299f625ba7b5a8035a6bef1c1f52a695638 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 23 May 2023 09:02:36 +0200 Subject: [PATCH 024/259] Add linear BE price implementation --- modules/60_bioenergy/MMEmu_feb23/presolve.gms | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/MMEmu_feb23/presolve.gms index 147dd83e55..9026a2bef1 100644 --- a/modules/60_bioenergy/MMEmu_feb23/presolve.gms +++ b/modules/60_bioenergy/MMEmu_feb23/presolve.gms @@ -37,13 +37,20 @@ $ifthen "%c60_price_implementation%" == "exp" i60_2ndgen_bioenergy_subsidy(t) = (s60_bioenergy_price_2nd / 8) * (8 ** (1 / (2100 - sm_fix_SSP2))) ** (m_year(t) - sm_fix_SSP2); ); -$else +$elseif "%c60_price_implementation%" == "const" if(m_year(t) > sm_fix_SSP2, i60_1stgen_bioenergy_subsidy_gj(t) = s60_bioenergy_gj_price_1st; i60_2ndgen_bioenergy_subsidy(t) = s60_bioenergy_price_2nd; ); +$else + if(m_year(t) > sm_fix_SSP2, + i60_1stgen_bioenergy_subsidy_gj(t) = + s60_bioenergy_gj_price_1st / (2100 - sm_fix_SSP2) * (m_year(t) - sm_fix_SSP2); + i60_2ndgen_bioenergy_subsidy(t) = + s60_bioenergy_price_2nd / (2100 - sm_fix_SSP2) * (m_year(t) - sm_fix_SSP2); + ); $endif From e327c9fb908ecb87153c658f53520398e27461ac Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 31 Jul 2023 14:43:29 +0200 Subject: [PATCH 025/259] Create base for new forestry realization --- .../32_forestry/MMEmu_jul23/declarations.gms | 149 +++++++++ modules/32_forestry/MMEmu_jul23/equations.gms | 219 +++++++++++++ modules/32_forestry/MMEmu_jul23/input.gms | 134 ++++++++ modules/32_forestry/MMEmu_jul23/postsolve.gms | 157 +++++++++ modules/32_forestry/MMEmu_jul23/preloop.gms | 306 ++++++++++++++++++ modules/32_forestry/MMEmu_jul23/presolve.gms | 181 +++++++++++ .../32_forestry/MMEmu_jul23/realization.gms | 45 +++ modules/32_forestry/MMEmu_jul23/scaling.gms | 12 + modules/32_forestry/MMEmu_jul23/sets.gms | 50 +++ 9 files changed, 1253 insertions(+) create mode 100644 modules/32_forestry/MMEmu_jul23/declarations.gms create mode 100644 modules/32_forestry/MMEmu_jul23/equations.gms create mode 100644 modules/32_forestry/MMEmu_jul23/input.gms create mode 100644 modules/32_forestry/MMEmu_jul23/postsolve.gms create mode 100644 modules/32_forestry/MMEmu_jul23/preloop.gms create mode 100644 modules/32_forestry/MMEmu_jul23/presolve.gms create mode 100644 modules/32_forestry/MMEmu_jul23/realization.gms create mode 100644 modules/32_forestry/MMEmu_jul23/scaling.gms create mode 100644 modules/32_forestry/MMEmu_jul23/sets.gms diff --git a/modules/32_forestry/MMEmu_jul23/declarations.gms b/modules/32_forestry/MMEmu_jul23/declarations.gms new file mode 100644 index 0000000000..112cf412b6 --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/declarations.gms @@ -0,0 +1,149 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de +scalars + s32_shift Number of 5-year age-classes corresponding to current time step length (1) + s32_establishment_dynamic If plantations should be dynamic (including establishment and harvest decsions) + s32_establishment_static Static plantations with no establishmnet no harvest no regrowth +; + +parameters + i32_max_aff_area_glo(t) Maximum global endogenous afforestation area (mio. ha) + i32_max_aff_area_reg(t,i) Maximum regional endogenous afforestation area (mio. ha) + p32_aff_pol(t,j) NDC forest stock (mio. ha) + p32_aff_pol_timestep(t,j) NDC afforestation per time step (mio. ha) + p32_aff_pot(t,j) Potential afforestation area (mio. ha) + p32_aff_togo(t,i) Remaining exogenous afforestation wrt to the maximum exogenous target over time (mio. ha) + p32_carbon_density_ac(t,j,type32,ac,ag_pools) Carbon density for ac and ag_pools (tC per ha) + p32_carbon_density_ac_forestry(t_all,j,ac) Above ground carbon density for age classes and carbon pools (tC per ha) + p32_carbon_density_ac_marg(t_all,j,ac) Marginal above ground carbon density for age classes and carbon pools (tC per ha) + pc32_area_rotation(j) Forestry area at rotation length end used as weight for regional aggregation (mio. ha) + p32_land(t,j,type32,ac) Forestry land for each cell wood type and age class before and after optimization (mio. ha) + pc32_land(j,type32,ac) Forestry land per forestry land type initialization of the optimization (mio. ha) + pc32_yield_forestry_future(j) Cellular timber yield expected in the future (m3 per ha per year) + pc32_yield_forestry_future_reg(i) Regional timber yield expected in the future (m3 per ha per year) + p32_plant_ini_ac(j) Initialization of plantation area (mio. ha) + p32_IGR(t_all,j,ac) Instantaneous growth rate or periodic annual increment of forest growth (1) + p32_rot_flg(t_all,j,ac) Identifier flag when calculating rotation length (1) + p32_rotation_regional(t_all,i) Regional average rotation length of plantations translated to age class equivalent for future (1) + p32_rot_length_ac_eqivalent(t_all,j) Cellular rotation length of plantations translated to age class equivalent for future (1) + p32_rotation_cellular_estb(t_all,j) Establishment rotation length translated to age classes on cellular level (1) + p32_rotation_cellular_harvesting(t_all,j) Harvesting rotation length of plantations translated to age class equivalent for future (1) + p32_cdr_ac(t,j,ac) Non-cumulative CDR from afforestation plantations for each age-class depending on planning horizon (tC per ha) + p32_rotation_offset Offset calc in age class equivalents (1) + p32_land_start_ac(j,type32,ac) Saving first value of starting land (mio. ha) + p32_land_before(t,j,type32,ac) Saving time value of starting land (mio. ha) + p32_time(ac) Time as a function of age-classes (yr) + p32_discount_factor(t_all,j,ac) Discount factor for each age class (1) + p32_net_present_value(t_all,j,ac) Net present value for a representative 1ha land of plantations (mio. USD) + p32_stand_value(t_all,j,ac) Stand value based on given prices (mio. USD) + p32_investment_returns_lost(t_all,j,ac) Present value of investment returns lost by not harvesting now and beginning a new series of rotations on the land (mio. USD) + p32_land_rent_weighted(t_all,j,ac) Land rent weighted by the value of the trees at harvest age-class (mio. USD) + p32_rot_flg_faustmann(t_all,j,ac) Identifier flag when calculating faustmann rotation length (1) + p32_rot_length_faustmann(t_all,j) Cellular Faustmann rotation length of plantations translated to age class equivalent (1) + p32_ncells(i) Number of cells in each region (1) + pm_representative_rotation(t_all,i) Representative regional rotation (1) + p32_aff_bgp(j,ac) Biophysical impact of afforestation (tCeq per ha) + p32_tcre_glo(j) Global mean Transient Climate Response to cumulative Emissions (degree C per tC per ha) + p32_observed_gs_reg(i) Observed growing stock (tDM per ha) + p32_gs_scaling_reg(i) Calibration factor for scaling up the relative growing stock (1) + p32_rotation_dist(j,ac) Poulter distribution within celular rotation lengths (1) + p32_updated_gs_reg(t,i) Updated growing stock information after calibration (m3 per ha) + p32_plantation_contribution(t_ext,i) Share of roundwood production coming from timber plantations (percent) + p32_ac_dist_flag(j,ac) Distribution flag with inverse weights according to age-classes (1) + p32_ac_dist(j,ac) Actual share of age-class distribution (1) + p32_avg_increment(t_all,j,ac) Mean annual increment (tC per ha per year) + p32_bii_coeff(type32,bii_class_secd,potnatveg) bii coeff (1) + p32_c_density_ac_fast_forestry(t_all,j,ac) Carbon densities in plantations based on Braakhekke et al (tC per ha) + p32_disturbance_loss_ftype32(t,j,type32,ac) Loss due to disturbances in all plantation type forests (mio. ha) +; + +positive variables + vm_cost_fore(i) Forestry costs (Mio USD) + v32_cost_hvarea(i) Cost of harvesting timber from forests (mio. USD per yr) + v32_land(j,type32,ac) Forestry land pools (mio. ha) + v32_land_missing(j) Forestry land which can be used at extrmemly high costs in case not enough area is available for new establishment (mio. ha) + vm_landdiff_forestry Aggregated difference in forestry land compared to previous timestep (mio. ha) + v32_cost_recur(i) Recurring forest management costs (USD per ha) + v32_land_expansion(j,type32,ac) Forestry land expansion (mio. ha) + v32_land_reduction(j,type32,ac) Forestry land reduction (mio. ha) + v32_cost_establishment(i) Cost of establishment calculated at the current time step (mio. USD) + v32_hvarea_forestry(j,ac) Harvested area from timber plantations (mio. ha) + vm_prod_forestry(j,kforestry) Production of woody biomass from commercial plantations (mio. tDM per yr) + ; + +variables + vm_cdr_aff(j,ac,aff_effect) Expected bgc (CDR) and local bph effects of afforestation depending on planning horizon (mio. tC) + ; + +equations + q32_cost_total(i) Total forestry costs constraint (mio. USD) + q32_land(j) Land constraint (mio. ha) + q32_cdr_aff(j,ac) Calculation of CDR from afforestation (mio. tC) + q32_carbon(j,ag_pools,stockType) Forestry carbon stock calculation (mio. tC) + q32_land_diff Aggregated difference in forestry land compared to previous timestep (mio. ha) + q32_max_aff Maximum total global afforestation (mio. ha) + q32_max_aff_reg(i) Maximum total regional afforestation (mio. ha) + q32_aff_pol(j) Afforestation policy constraint (mio. ha) + q32_aff_est(j) Afforestation constraint for establishment age classes (mio. ha) + q32_hvarea_forestry(j,ac) Plantations area harvest (mio. ha) + q32_cost_recur(i) Recurruing costs (mio. USD) + q32_establishment_dynamic(i) Establishment in current time step for future demand (mio. ha) + q32_establishment_dynamic_yield(i) Regional timber yield (tDM per ha) + q32_establishment_fixed(j) Establishment in current time step for future demand (mio. ha) + q32_land_expansion(j,type32,ac) Land expansion (mio. ha) + q32_land_reduction(j,type32,ac) Land contraction (mio. ha) + q32_cost_establishment(i) Present value of cost of establishment (mio. USD) + q32_bgp_aff(j,ac) Biophysical afforestation calculation (mio. tCeq) + q32_forestry_est(j,type32,ac) Distribution of forestry establishment over ac_est (mio. ha) + q32_cost_hvarea(i) Cost of harvesting timber from forests (mio. USD per yr) + q32_prod_forestry(j) Production of woody biomass from commercial plantations (mio. tDM per yr) + q32_bv_aff(j,potnatveg) Biodiversity value for aff forestry land (Mha) + q32_bv_ndc(j,potnatveg) Biodiversity value for ndc forestry land (Mha) + q32_bv_plant(j,potnatveg) Biodiversity value for plantations (Mha) +; + + +*#################### R SECTION START (OUTPUT DECLARATIONS) #################### +parameters + ov_cost_fore(t,i,type) Forestry costs (Mio USD) + ov32_cost_hvarea(t,i,type) Cost of harvesting timber from forests (mio. USD per yr) + ov32_land(t,j,type32,ac,type) Forestry land pools (mio. ha) + ov32_land_missing(t,j,type) Forestry land which can be used at extrmemly high costs in case not enough area is available for new establishment (mio. ha) + ov_landdiff_forestry(t,type) Aggregated difference in forestry land compared to previous timestep (mio. ha) + ov32_cost_recur(t,i,type) Recurring forest management costs (USD per ha) + ov32_land_expansion(t,j,type32,ac,type) Forestry land expansion (mio. ha) + ov32_land_reduction(t,j,type32,ac,type) Forestry land reduction (mio. ha) + ov32_cost_establishment(t,i,type) Cost of establishment calculated at the current time step (mio. USD) + ov32_hvarea_forestry(t,j,ac,type) Harvested area from timber plantations (mio. ha) + ov_prod_forestry(t,j,kforestry,type) Production of woody biomass from commercial plantations (mio. tDM per yr) + ov_cdr_aff(t,j,ac,aff_effect,type) Expected bgc (CDR) and local bph effects of afforestation depending on planning horizon (mio. tC) + oq32_cost_total(t,i,type) Total forestry costs constraint (mio. USD) + oq32_land(t,j,type) Land constraint (mio. ha) + oq32_cdr_aff(t,j,ac,type) Calculation of CDR from afforestation (mio. tC) + oq32_carbon(t,j,ag_pools,stockType,type) Forestry carbon stock calculation (mio. tC) + oq32_land_diff(t,type) Aggregated difference in forestry land compared to previous timestep (mio. ha) + oq32_max_aff(t,type) Maximum total global afforestation (mio. ha) + oq32_max_aff_reg(t,i,type) Maximum total regional afforestation (mio. ha) + oq32_aff_pol(t,j,type) Afforestation policy constraint (mio. ha) + oq32_aff_est(t,j,type) Afforestation constraint for establishment age classes (mio. ha) + oq32_hvarea_forestry(t,j,ac,type) Plantations area harvest (mio. ha) + oq32_cost_recur(t,i,type) Recurruing costs (mio. USD) + oq32_establishment_dynamic(t,i,type) Establishment in current time step for future demand (mio. ha) + oq32_establishment_dynamic_yield(t,i,type) Regional timber yield (tDM per ha) + oq32_establishment_fixed(t,j,type) Establishment in current time step for future demand (mio. ha) + oq32_land_expansion(t,j,type32,ac,type) Land expansion (mio. ha) + oq32_land_reduction(t,j,type32,ac,type) Land contraction (mio. ha) + oq32_cost_establishment(t,i,type) Present value of cost of establishment (mio. USD) + oq32_bgp_aff(t,j,ac,type) Biophysical afforestation calculation (mio. tCeq) + oq32_forestry_est(t,j,type32,ac,type) Distribution of forestry establishment over ac_est (mio. ha) + oq32_cost_hvarea(t,i,type) Cost of harvesting timber from forests (mio. USD per yr) + oq32_prod_forestry(t,j,type) Production of woody biomass from commercial plantations (mio. tDM per yr) + oq32_bv_aff(t,j,potnatveg,type) Biodiversity value for aff forestry land (Mha) + oq32_bv_ndc(t,j,potnatveg,type) Biodiversity value for ndc forestry land (Mha) + oq32_bv_plant(t,j,potnatveg,type) Biodiversity value for plantations (Mha) +; +*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/32_forestry/MMEmu_jul23/equations.gms b/modules/32_forestry/MMEmu_jul23/equations.gms new file mode 100644 index 0000000000..d17234cce2 --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/equations.gms @@ -0,0 +1,219 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @equations + +*------------------ +****** Costs ****** +*------------------ + +*' The direct costs of Timber production and afforestation `vm_cost_fore` include +*' maintenance and monitoring costs for newly established plantations as well as +*' standing plantations '[@sathaye_ghg_2005]. In addition, this type of forest management +*' (including afforestation) may cause costs in other parts of the model such as costs +*' for technological change [13_tc] or land expansion [39_landconversion]. Also included +*' are additional costs for producing timber from extremely highly managed plantations +*' which are analogous to intensification using technological change from [13_tc] but +*' in a parametrized form. + +q32_cost_total(i2) .. vm_cost_fore(i2) =e= + v32_cost_recur(i2) + + v32_cost_establishment(i2) + + v32_cost_hvarea(i2) + + sum(cell(i2,j2), v32_land_missing(j2)) * s32_free_land_cost + ; + +*----------------------------------------------- +****** Carbon price induced afforestation ****** +*----------------------------------------------- +*' The interface `vm_cdr_aff` provides the projected biogeochemical (bgc) carbon sequestration +*' and the local biophysical (bph) warming/cooling effects of an afforestation +*' activity for a planning horizon of 50 years `s32_planing_horizon` to the [56_ghg_policy] module. + +q32_cdr_aff(j2,ac) .. +vm_cdr_aff(j2,ac,"bgc") =e= +sum(ac_est, v32_land(j2,"aff",ac_est)) * sum(ct, p32_cdr_ac(ct,j2,ac)) +; + +q32_bgp_aff(j2,ac) .. +vm_cdr_aff(j2,ac,"bph") =e= +sum(ac_est, v32_land(j2,"aff",ac_est)) * p32_aff_bgp(j2,ac); + +*' ac_est can only increase if total afforested land increases +q32_aff_est(j2) .. +sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum((ct,ac), p32_land(ct,j2,"aff",ac)); + +*----------------------------------------------- +****************** Land ************************ +*----------------------------------------------- + +*' The interface `vm_land` provides aggregated forestry land pools (`type32`) to other modules. + + q32_land(j2) .. + vm_land(j2,"forestry") =e= sum((type32,ac), v32_land(j2,type32,ac)); + +*' The constraint `q32_aff_pol` accounts for the exogenous afforestation prescribed by NPI/NDC policies. + + q32_aff_pol(j2) .. + sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, p32_aff_pol_timestep(ct,j2)); + +*' The constraint `q32_max_aff` accounts for the allowed maximum global endogenous +*' afforestation defined in `i32_max_aff_area_glo`. +*' The constraint `q32_max_aff_reg` accounts for the allowed maximum regional endogenous +*' afforestation defined in `i32_max_aff_area_reg`. +*' Only one of the two constraints is active, depending on `s32_max_aff_area_glo`. + + q32_max_aff$(s32_max_aff_area_glo=1) .. + sum((j2,ac), v32_land(j2,"aff",ac)) + =l= sum(ct, i32_max_aff_area_glo(ct)); + + q32_max_aff_reg(i2)$(s32_max_aff_area_glo=0) .. + sum((cell(i2,j2),ac), v32_land(j2,"aff",ac)) + =l= sum(ct, i32_max_aff_area_reg(ct,i2)); + +*----------------------------------------------- +************** Carbon stock ******************** +*----------------------------------------------- +*' Forestry above ground carbon stocks are calculated as the product of forestry land (`v32_land`) and the area +*' weighted mean of carbon density for carbon pools (`p32_carbon_density_ac`). + + q32_carbon(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"forestry",ag_pools,stockType) =e= + m_carbon_stock_ac(v32_land,p32_carbon_density_ac,"type32,ac","type32,ac_sub"); + +*' Forestry land expansion and reduction is calculated as follows: + + q32_land_diff .. vm_landdiff_forestry =e= sum((j2,type32,ac), + v32_land_expansion(j2,type32,ac) + + v32_land_reduction(j2,type32,ac)); + + q32_land_expansion(j2,type32,ac_est) .. + v32_land_expansion(j2,type32,ac_est) =e= v32_land(j2,type32,ac_est) - pc32_land(j2,type32,ac_est); + + q32_land_reduction(j2,type32,ac_sub) .. + v32_land_reduction(j2,type32,ac_sub) =e= pc32_land(j2,type32,ac_sub) - v32_land(j2,type32,ac_sub); + +*------------------------------------------ +*********** Biodiversity value ************ +*------------------------------------------ + +q32_bv_aff(j2,potnatveg) .. vm_bv(j2,"aff_co2p",potnatveg) + =e= + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"aff",ac)) * + p32_bii_coeff("aff",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); + +q32_bv_ndc(j2,potnatveg) .. vm_bv(j2,"aff_ndc",potnatveg) + =e= + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"ndc",ac)) * + p32_bii_coeff("ndc",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); + +q32_bv_plant(j2,potnatveg) .. vm_bv(j2,"plant",potnatveg) + =e= + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"plant",ac)) * + p32_bii_coeff("plant",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); + + +************************************************************ +**** Timber production related equations in plantations **** +************************************************************ + +**** Cost calculations +*--------------------- + +*' Cost of new plantations establishment `v32_cost_establishment` is the investment +*' made in setting up new plantations but also accounts for the expected value of +*' future harvesting costs. This makes sure that the model sticks to reasonable plantation +*' patterns over time. Present value of harvesting costs is (1+`pm_interest`)^`p32_rotation_regional` +*' and annuity factor of `pm_interest`/(1+`pm_interest`) averages the cost of this +*' investment over time. + +q32_cost_establishment(i2).. + v32_cost_establishment(i2) + =e= + (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * s32_reESTBcost) + ) + * sum(ct,pm_interest(ct,i2)/(1+pm_interest(ct,i2))); + + +*' Recurring costs are paid for plantations where the trees have to be regularly monitored +*' and maintained. These costs are only calculated becuase we see active human intervention +*' in commercial plantations. These costs are paid for trees used for timber production or +*' trees established for afforestation purposes. + +q32_cost_recur(i2) .. v32_cost_recur(i2) =e= + sum((cell(i2,j2),type32,ac_sub), v32_land(j2,type32,ac_sub)) * s32_recurring_cost; + + +**** New establishment decision +*------------------------------ +*' New plantations are already established in the optimization step based on a certain +*' percentage (`p32_plantation_contribution`) of current demand (`pm_demand_forestry_future`). +*' Its called `pm_demand_forestry_future` because the model also has a foresight switch which +*' give the model an ability to account for future changes in demand. By default `pm_demand_forestry_future` +*' is set to existing roundwood demand. As plantation establishment decisions should +*' also know some indication of expected future yields, we calculate how much yield +*' newly established plantation can realize based on rotation lengths. This is defined as +*' the expected future yield (`pc32_yield_forestry_future`) at harvest (year in time +*' step are accounted for). + +*' Area constraint for plantation establishment based on expected average regional timber yield at rotation age +*' (`pc32_yield_forestry_future_reg`) to ovoid overspecialization of plantation establishment towards highly productive cells. + +q32_establishment_dynamic(i2)$s32_establishment_dynamic .. + sum(cell(i2,j2), ((sum(ac_est, v32_land(j2,"plant",ac_est)) + v32_land_missing(j2)) / m_timestep_length_forestry) * pc32_yield_forestry_future_reg(i2)) + =e= + sum((ct,kforestry), pm_demand_forestry_future(i2,kforestry) * min(s32_max_self_suff, sum(supreg(h2,i2),pm_selfsuff_ext(ct,h2,kforestry))) * p32_plantation_contribution(ct,i2) * f32_estb_calib(i2)) + ; + +*' Constraint to maintain the average regional timber yield at rotation age, accounting for the cellular timber yield (`pc32_yield_forestry_future`). + +q32_establishment_dynamic_yield(i2)$s32_establishment_dynamic .. + sum(cell(i2,j2), (sum(ac_est, v32_land(j2,"plant",ac_est))+v32_land_missing(j2)) * pc32_yield_forestry_future(j2)) + =e= + pc32_yield_forestry_future_reg(i2) * (sum(cell(i2,j2), sum(ac_est, v32_land(j2,"plant",ac_est))+v32_land_missing(j2))); + +*' If plantations have to be static (defined by `s32_establishment_static`) then +*' the model simply establishes the amount of plantations which are harvested. +*' this keeps the plantation area static but accounts for age-class changes and +*' regrowth during every time step. + +q32_establishment_fixed(j2)$s32_establishment_static .. + sum(ac, v32_land(j2,"plant",ac)) =e= sum(ac, pc32_land(j2,"plant",ac)); + + +*' This constraint distributes additions to forestry land over ac_est, +*' which depends on the time step length (e.g. ac0 and ac5 for a 10 year time step). + +q32_forestry_est(j2,type32,ac_est) .. +v32_land(j2,type32,ac_est) =e= sum(ac_est2, v32_land(j2,type32,ac_est2))/card(ac_est2); + +*' Change in forestry area is the difference between plantation area from previous time +*' step ('pc32_land') and optimized plantation area from current time step ('v32_land') + +q32_hvarea_forestry(j2,ac_sub) .. + v32_hvarea_forestry(j2,ac_sub) + =l= + v32_land_reduction(j2,"plant",ac_sub); + +** Timber plantation +*' Woody biomass production from timber plantations is calculated by multiplying the +*' area under production with corresponding yields of plantation forests, divided by the timestep length. + +q32_prod_forestry(j2).. + sum(kforestry, vm_prod_forestry(j2,kforestry)) + =e= + sum(ac_sub, v32_hvarea_forestry(j2,ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"forestry"))) / m_timestep_length_forestry; + +*' Harvesting cost in plantations is defined as the cost incurred while removing +*' biomass from such forests. + +q32_cost_hvarea(i2).. + v32_cost_hvarea(i2) + =e= + sum((ct,cell(i2,j2),ac_sub), v32_hvarea_forestry(j2,ac_sub)) * s32_harvesting_cost + ; + +*** EOF equations.gms *** diff --git a/modules/32_forestry/MMEmu_jul23/input.gms b/modules/32_forestry/MMEmu_jul23/input.gms new file mode 100644 index 0000000000..7e8362645b --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/input.gms @@ -0,0 +1,134 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de +$setglobal c32_timber_plantations plantations +* option: natveg, plantations +$setglobal c32_aff_mask noboreal +* options: unrestricted, noboreal, onlytropical +$setglobal c32_aff_policy npi +* options: none, npi, ndc +$setglobal c32_aff_bgp nobgp +* options: ann,nobgp +$setglobal c32_tcre_ctrl ann_TCREmean +* options: ann_TCREmean, ann_TCREhigh, ann_TCRElow +$setglobal c32_interest_rate regional +* options regional, global +$setglobal c32_dev_scen abare +* options abare, brown +$setglobal c32_incr_rate h5s2l1 +* options constant,h5s5l5,h5s2l2,h5s2l1,h5s1l1,h5s1l05,h2s1l05 +$setglobal c32_rot_calc_type current_annual_increment +* option max_increment, max_npv +$setglobal c32_rot_calc_type current_annual_increment +* options mean_annual_increment, current_annual_increment, instantaneous_growth_rate +$setglobal c32_shock_scenario none +* options none 002lin2030 004lin2030 008lin2030 016lin2030 + + +scalars + s32_hvarea Flag for harvested area and establishemt (0=zero 1=exognous 2=endogneous) / 0 / + s32_reESTBcost Re establishment cost (USD per ha) / 2000 / + s32_recurring_cost Recurring costs (USD per ha) / 500 / + s32_harvesting_cost Harvesting cost (USD per ha) / 1000 / + s32_planing_horizon Afforestation planing horizon (years) / 50 / + s32_rotation_extension Rotation extension factor 1=original rotations 2=100 percent increase in rotations etc (1) / 1 / + s32_faustmann_rotation Switch to activate faustmann rotations (1=on 0=off) / 0 / + s32_initial_distribution Switch to Activate ageclass distribution in plantations 0=off 1=equal distribution 2=FAO distribution 3=Poulter distribution 4=Manual distribution (1) / 0 / + s32_price Price for timber (USD) / 45 / + s32_free_land_cost Very high cost for using non existing land for plantation establishment (USD per ha) /1000000/ + s32_max_aff_area Maximum total global afforestation (mio. ha) / Inf / + s32_aff_plantation Switch for using growth curves for afforestation 0=natveg 1=plantations (1) / 0 / + s32_tcre_local Switch for local (1) or global (0) TRCE factors (1) / 1 / + s32_forestry_int_rate Global interest rate for plantations (percent) / 0.05 / + s32_max_self_suff Upper ceiling for the self sufficiency used in calculation for establishment decision (1) / 0.8 / + s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / + s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / + s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 0 / +; + +parameter f32_aff_mask(j) afforestation mask (binary) +/ +$ondelim +$Ifi "%c32_aff_mask%" == "unrestricted" $include "./modules/32_forestry/input/aff_unrestricted.cs2" +$Ifi "%c32_aff_mask%" == "noboreal" $include "./modules/32_forestry/input/aff_noboreal.cs2" +$Ifi "%c32_aff_mask%" == "onlytropical" $include "./modules/32_forestry/input/aff_onlytropical.cs2" +$offdelim +/; + +$onEmpty +parameter f32_max_aff_area(i) Maximum regional afforestation area (mio. ha) +/ +$ondelim +$if exist "./modules/32_forestry/input/f32_max_aff_area.cs4" $include "./modules/32_forestry/input/f32_max_aff_area.cs4" +$offdelim +/; +$offEmpty + +table f32_aff_pol(t_all,j,pol32) npi+ndc afforestation policy (Mha new forest wrt to 2010) +$ondelim +$include "./modules/32_forestry/input/npi_ndc_aff_pol.cs3" +$offdelim +; + +parameter f32_plant_prod_share(t_all) Share of overall production coming from plantations (1) +/ +$ondelim +$include "./modules/32_forestry/input/f32_plant_prod_share.csv" +$offdelim +/ +; + +table f32_aff_bgp(j,bgp32) Biogeophysical temperature change of afforestation (degree C) +$ondelim +$include "./modules/32_forestry/input/f32_bph_effect_noTCRE.cs3" +$ondelim +; + +table f32_tcre(j,tcre32) Transient surface temperature response to CO2 emission (degree C per tC per ha) +$ondelim +$include "./modules/32_forestry/input/f32_localTCRE.cs3" +$ondelim +; + +parameter f32_ac_dist(ac) Age class distribution share (1) +/ +$ondelim +$include "./modules/32_forestry/input/f32_ac_dist.csv" +$offdelim +/; + +parameter f32_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) +/ +$ondelim +$include "./modules/32_forestry/input/f32_gs_relativetarget.cs4" +$offdelim +/; + +table f32_plantation_contribution(t_ext,i,inter32,scen32) Share of roundwood production coming from timber plantations (percent) +$ondelim +$include "./modules/32_forestry/input/f32_plantation_contribution.cs3" +$ondelim +; + +parameter f32_plantedforest(i) Share of plantation forest in planted forest (1) +/ +$ondelim +$include "./modules/32_forestry/input/f32_plantedforest.cs4" +$offdelim +/; + +parameter f32_estb_calib(i) Calibration factor for plantation forest establishment (1) +/ +$ondelim +$include "./modules/32_forestry/input/f32_estb_calib.cs4" +$offdelim +/; + +table f32_forest_shock(t_all, shock_scen32) Forest carbon shock scenarios (area share affected per year) +$ondelim +$include "./modules/32_forestry/input/f32_forest_shock.csv" +$offdelim +; diff --git a/modules/32_forestry/MMEmu_jul23/postsolve.gms b/modules/32_forestry/MMEmu_jul23/postsolve.gms new file mode 100644 index 0000000000..c8d03d0a2e --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/postsolve.gms @@ -0,0 +1,157 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de +*' @code +*' Exchange land information after optimization +p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); +*' @stop + +*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### + ov_cost_fore(t,i,"marginal") = vm_cost_fore.m(i); + ov32_cost_hvarea(t,i,"marginal") = v32_cost_hvarea.m(i); + ov32_land(t,j,type32,ac,"marginal") = v32_land.m(j,type32,ac); + ov32_land_missing(t,j,"marginal") = v32_land_missing.m(j); + ov_landdiff_forestry(t,"marginal") = vm_landdiff_forestry.m; + ov32_cost_recur(t,i,"marginal") = v32_cost_recur.m(i); + ov32_land_expansion(t,j,type32,ac,"marginal") = v32_land_expansion.m(j,type32,ac); + ov32_land_reduction(t,j,type32,ac,"marginal") = v32_land_reduction.m(j,type32,ac); + ov32_cost_establishment(t,i,"marginal") = v32_cost_establishment.m(i); + ov32_hvarea_forestry(t,j,ac,"marginal") = v32_hvarea_forestry.m(j,ac); + ov_prod_forestry(t,j,kforestry,"marginal") = vm_prod_forestry.m(j,kforestry); + ov_cdr_aff(t,j,ac,aff_effect,"marginal") = vm_cdr_aff.m(j,ac,aff_effect); + oq32_cost_total(t,i,"marginal") = q32_cost_total.m(i); + oq32_land(t,j,"marginal") = q32_land.m(j); + oq32_cdr_aff(t,j,ac,"marginal") = q32_cdr_aff.m(j,ac); + oq32_carbon(t,j,ag_pools,stockType,"marginal") = q32_carbon.m(j,ag_pools,stockType); + oq32_land_diff(t,"marginal") = q32_land_diff.m; + oq32_max_aff(t,"marginal") = q32_max_aff.m; + oq32_max_aff_reg(t,i,"marginal") = q32_max_aff_reg.m(i); + oq32_aff_pol(t,j,"marginal") = q32_aff_pol.m(j); + oq32_aff_est(t,j,"marginal") = q32_aff_est.m(j); + oq32_hvarea_forestry(t,j,ac,"marginal") = q32_hvarea_forestry.m(j,ac); + oq32_cost_recur(t,i,"marginal") = q32_cost_recur.m(i); + oq32_establishment_dynamic(t,i,"marginal") = q32_establishment_dynamic.m(i); + oq32_establishment_dynamic_yield(t,i,"marginal") = q32_establishment_dynamic_yield.m(i); + oq32_establishment_fixed(t,j,"marginal") = q32_establishment_fixed.m(j); + oq32_land_expansion(t,j,type32,ac,"marginal") = q32_land_expansion.m(j,type32,ac); + oq32_land_reduction(t,j,type32,ac,"marginal") = q32_land_reduction.m(j,type32,ac); + oq32_cost_establishment(t,i,"marginal") = q32_cost_establishment.m(i); + oq32_bgp_aff(t,j,ac,"marginal") = q32_bgp_aff.m(j,ac); + oq32_forestry_est(t,j,type32,ac,"marginal") = q32_forestry_est.m(j,type32,ac); + oq32_cost_hvarea(t,i,"marginal") = q32_cost_hvarea.m(i); + oq32_prod_forestry(t,j,"marginal") = q32_prod_forestry.m(j); + oq32_bv_aff(t,j,potnatveg,"marginal") = q32_bv_aff.m(j,potnatveg); + oq32_bv_ndc(t,j,potnatveg,"marginal") = q32_bv_ndc.m(j,potnatveg); + oq32_bv_plant(t,j,potnatveg,"marginal") = q32_bv_plant.m(j,potnatveg); + ov_cost_fore(t,i,"level") = vm_cost_fore.l(i); + ov32_cost_hvarea(t,i,"level") = v32_cost_hvarea.l(i); + ov32_land(t,j,type32,ac,"level") = v32_land.l(j,type32,ac); + ov32_land_missing(t,j,"level") = v32_land_missing.l(j); + ov_landdiff_forestry(t,"level") = vm_landdiff_forestry.l; + ov32_cost_recur(t,i,"level") = v32_cost_recur.l(i); + ov32_land_expansion(t,j,type32,ac,"level") = v32_land_expansion.l(j,type32,ac); + ov32_land_reduction(t,j,type32,ac,"level") = v32_land_reduction.l(j,type32,ac); + ov32_cost_establishment(t,i,"level") = v32_cost_establishment.l(i); + ov32_hvarea_forestry(t,j,ac,"level") = v32_hvarea_forestry.l(j,ac); + ov_prod_forestry(t,j,kforestry,"level") = vm_prod_forestry.l(j,kforestry); + ov_cdr_aff(t,j,ac,aff_effect,"level") = vm_cdr_aff.l(j,ac,aff_effect); + oq32_cost_total(t,i,"level") = q32_cost_total.l(i); + oq32_land(t,j,"level") = q32_land.l(j); + oq32_cdr_aff(t,j,ac,"level") = q32_cdr_aff.l(j,ac); + oq32_carbon(t,j,ag_pools,stockType,"level") = q32_carbon.l(j,ag_pools,stockType); + oq32_land_diff(t,"level") = q32_land_diff.l; + oq32_max_aff(t,"level") = q32_max_aff.l; + oq32_max_aff_reg(t,i,"level") = q32_max_aff_reg.l(i); + oq32_aff_pol(t,j,"level") = q32_aff_pol.l(j); + oq32_aff_est(t,j,"level") = q32_aff_est.l(j); + oq32_hvarea_forestry(t,j,ac,"level") = q32_hvarea_forestry.l(j,ac); + oq32_cost_recur(t,i,"level") = q32_cost_recur.l(i); + oq32_establishment_dynamic(t,i,"level") = q32_establishment_dynamic.l(i); + oq32_establishment_dynamic_yield(t,i,"level") = q32_establishment_dynamic_yield.l(i); + oq32_establishment_fixed(t,j,"level") = q32_establishment_fixed.l(j); + oq32_land_expansion(t,j,type32,ac,"level") = q32_land_expansion.l(j,type32,ac); + oq32_land_reduction(t,j,type32,ac,"level") = q32_land_reduction.l(j,type32,ac); + oq32_cost_establishment(t,i,"level") = q32_cost_establishment.l(i); + oq32_bgp_aff(t,j,ac,"level") = q32_bgp_aff.l(j,ac); + oq32_forestry_est(t,j,type32,ac,"level") = q32_forestry_est.l(j,type32,ac); + oq32_cost_hvarea(t,i,"level") = q32_cost_hvarea.l(i); + oq32_prod_forestry(t,j,"level") = q32_prod_forestry.l(j); + oq32_bv_aff(t,j,potnatveg,"level") = q32_bv_aff.l(j,potnatveg); + oq32_bv_ndc(t,j,potnatveg,"level") = q32_bv_ndc.l(j,potnatveg); + oq32_bv_plant(t,j,potnatveg,"level") = q32_bv_plant.l(j,potnatveg); + ov_cost_fore(t,i,"upper") = vm_cost_fore.up(i); + ov32_cost_hvarea(t,i,"upper") = v32_cost_hvarea.up(i); + ov32_land(t,j,type32,ac,"upper") = v32_land.up(j,type32,ac); + ov32_land_missing(t,j,"upper") = v32_land_missing.up(j); + ov_landdiff_forestry(t,"upper") = vm_landdiff_forestry.up; + ov32_cost_recur(t,i,"upper") = v32_cost_recur.up(i); + ov32_land_expansion(t,j,type32,ac,"upper") = v32_land_expansion.up(j,type32,ac); + ov32_land_reduction(t,j,type32,ac,"upper") = v32_land_reduction.up(j,type32,ac); + ov32_cost_establishment(t,i,"upper") = v32_cost_establishment.up(i); + ov32_hvarea_forestry(t,j,ac,"upper") = v32_hvarea_forestry.up(j,ac); + ov_prod_forestry(t,j,kforestry,"upper") = vm_prod_forestry.up(j,kforestry); + ov_cdr_aff(t,j,ac,aff_effect,"upper") = vm_cdr_aff.up(j,ac,aff_effect); + oq32_cost_total(t,i,"upper") = q32_cost_total.up(i); + oq32_land(t,j,"upper") = q32_land.up(j); + oq32_cdr_aff(t,j,ac,"upper") = q32_cdr_aff.up(j,ac); + oq32_carbon(t,j,ag_pools,stockType,"upper") = q32_carbon.up(j,ag_pools,stockType); + oq32_land_diff(t,"upper") = q32_land_diff.up; + oq32_max_aff(t,"upper") = q32_max_aff.up; + oq32_max_aff_reg(t,i,"upper") = q32_max_aff_reg.up(i); + oq32_aff_pol(t,j,"upper") = q32_aff_pol.up(j); + oq32_aff_est(t,j,"upper") = q32_aff_est.up(j); + oq32_hvarea_forestry(t,j,ac,"upper") = q32_hvarea_forestry.up(j,ac); + oq32_cost_recur(t,i,"upper") = q32_cost_recur.up(i); + oq32_establishment_dynamic(t,i,"upper") = q32_establishment_dynamic.up(i); + oq32_establishment_dynamic_yield(t,i,"upper") = q32_establishment_dynamic_yield.up(i); + oq32_establishment_fixed(t,j,"upper") = q32_establishment_fixed.up(j); + oq32_land_expansion(t,j,type32,ac,"upper") = q32_land_expansion.up(j,type32,ac); + oq32_land_reduction(t,j,type32,ac,"upper") = q32_land_reduction.up(j,type32,ac); + oq32_cost_establishment(t,i,"upper") = q32_cost_establishment.up(i); + oq32_bgp_aff(t,j,ac,"upper") = q32_bgp_aff.up(j,ac); + oq32_forestry_est(t,j,type32,ac,"upper") = q32_forestry_est.up(j,type32,ac); + oq32_cost_hvarea(t,i,"upper") = q32_cost_hvarea.up(i); + oq32_prod_forestry(t,j,"upper") = q32_prod_forestry.up(j); + oq32_bv_aff(t,j,potnatveg,"upper") = q32_bv_aff.up(j,potnatveg); + oq32_bv_ndc(t,j,potnatveg,"upper") = q32_bv_ndc.up(j,potnatveg); + oq32_bv_plant(t,j,potnatveg,"upper") = q32_bv_plant.up(j,potnatveg); + ov_cost_fore(t,i,"lower") = vm_cost_fore.lo(i); + ov32_cost_hvarea(t,i,"lower") = v32_cost_hvarea.lo(i); + ov32_land(t,j,type32,ac,"lower") = v32_land.lo(j,type32,ac); + ov32_land_missing(t,j,"lower") = v32_land_missing.lo(j); + ov_landdiff_forestry(t,"lower") = vm_landdiff_forestry.lo; + ov32_cost_recur(t,i,"lower") = v32_cost_recur.lo(i); + ov32_land_expansion(t,j,type32,ac,"lower") = v32_land_expansion.lo(j,type32,ac); + ov32_land_reduction(t,j,type32,ac,"lower") = v32_land_reduction.lo(j,type32,ac); + ov32_cost_establishment(t,i,"lower") = v32_cost_establishment.lo(i); + ov32_hvarea_forestry(t,j,ac,"lower") = v32_hvarea_forestry.lo(j,ac); + ov_prod_forestry(t,j,kforestry,"lower") = vm_prod_forestry.lo(j,kforestry); + ov_cdr_aff(t,j,ac,aff_effect,"lower") = vm_cdr_aff.lo(j,ac,aff_effect); + oq32_cost_total(t,i,"lower") = q32_cost_total.lo(i); + oq32_land(t,j,"lower") = q32_land.lo(j); + oq32_cdr_aff(t,j,ac,"lower") = q32_cdr_aff.lo(j,ac); + oq32_carbon(t,j,ag_pools,stockType,"lower") = q32_carbon.lo(j,ag_pools,stockType); + oq32_land_diff(t,"lower") = q32_land_diff.lo; + oq32_max_aff(t,"lower") = q32_max_aff.lo; + oq32_max_aff_reg(t,i,"lower") = q32_max_aff_reg.lo(i); + oq32_aff_pol(t,j,"lower") = q32_aff_pol.lo(j); + oq32_aff_est(t,j,"lower") = q32_aff_est.lo(j); + oq32_hvarea_forestry(t,j,ac,"lower") = q32_hvarea_forestry.lo(j,ac); + oq32_cost_recur(t,i,"lower") = q32_cost_recur.lo(i); + oq32_establishment_dynamic(t,i,"lower") = q32_establishment_dynamic.lo(i); + oq32_establishment_dynamic_yield(t,i,"lower") = q32_establishment_dynamic_yield.lo(i); + oq32_establishment_fixed(t,j,"lower") = q32_establishment_fixed.lo(j); + oq32_land_expansion(t,j,type32,ac,"lower") = q32_land_expansion.lo(j,type32,ac); + oq32_land_reduction(t,j,type32,ac,"lower") = q32_land_reduction.lo(j,type32,ac); + oq32_cost_establishment(t,i,"lower") = q32_cost_establishment.lo(i); + oq32_bgp_aff(t,j,ac,"lower") = q32_bgp_aff.lo(j,ac); + oq32_forestry_est(t,j,type32,ac,"lower") = q32_forestry_est.lo(j,type32,ac); + oq32_cost_hvarea(t,i,"lower") = q32_cost_hvarea.lo(i); + oq32_prod_forestry(t,j,"lower") = q32_prod_forestry.lo(j); + oq32_bv_aff(t,j,potnatveg,"lower") = q32_bv_aff.lo(j,potnatveg); + oq32_bv_ndc(t,j,potnatveg,"lower") = q32_bv_ndc.lo(j,potnatveg); + oq32_bv_plant(t,j,potnatveg,"lower") = q32_bv_plant.lo(j,potnatveg); +*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/32_forestry/MMEmu_jul23/preloop.gms b/modules/32_forestry/MMEmu_jul23/preloop.gms new file mode 100644 index 0000000000..4702a2457f --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/preloop.gms @@ -0,0 +1,306 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de +** Calculation of Single rotation model rotation lengths +** Using forestry carbon densitiy here via carbon density data exchange from carbon module. +p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); + +** Calculating the marginal of carbon density i.e. change in carbon density over two time steps +** The carbon densities are tC/ha/year so we don't have to divide by timestep length. +loop(ac$(ord(ac) > 1), + p32_carbon_density_ac_marg(t_all,j,ac) = (p32_carbon_density_ac_forestry(t_all,j,ac) - p32_carbon_density_ac_forestry(t_all,j,ac-1))/5; + ); +p32_carbon_density_ac_marg(t_all,j,"ac0") = 0; + +** Calculating Instantaneous Growth Rates (IGR). +** This is a proxy number which can be compared against interest rate in the economy to +** make investment decisions in plantations (i.e. to keep it growing or to harvest it). +** This parameter is then used to calculate rotation lengths. +p32_IGR(t_all,j,ac) = (p32_carbon_density_ac_marg(t_all,j,ac)/p32_carbon_density_ac_forestry(t_all,j,ac))$(p32_carbon_density_ac_forestry(t_all,j,ac)>0) + + 1$(p32_carbon_density_ac_forestry(t_all,j,ac)=0); + +** For each cluster in MAgPIE ("j") we calculate how long the prevailing interest rates stay lower than the IGR. +** As long as the prevailing interest rates are lower than IGR, plantations shall be kept standing. +** As long as the prevailing interest rate becomes higher than IGR, it is assumed that the forest owner would rather +** keep his/her investment in bank rather than in keeping the forest standing. +** The easiest way to do this calculation is to count a value of 1 for IGR>interest rate and a value of 0 for IGR 0) + + 0$(p32_IGR(t_all,j,ac) - sum(cell(i,j),pm_interest("y1995",i)) <= 0); + display "Rotation lengths are calculated based on equating instantaneous growth rate to regional interest rate."; +$elseif "%c32_interest_rate%" == "global" + p32_rot_flg(t_all,j,ac) = 1$(p32_IGR(t_all,j,ac) - s32_forestry_int_rate > 0) + + 0$(p32_IGR(t_all,j,ac) - s32_forestry_int_rate <= 0); + display "Rotation lengths are calculated based on equating instantaneous growth rate to global interest rate."; +$endif + +$ifthen "%c32_rot_calc_type%" == "current_annual_increment" + p32_rot_flg(t_all,j,ac) = 1$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_carbon_density_ac_marg(t_all,j,ac-1) > 0) + + 0$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_carbon_density_ac_marg(t_all,j,ac-1) <= 0); + display "Rotation lengths are calculated based on maximizing current annual increment in this run."; +$endif + +$ifthen "%c32_rot_calc_type%" == "mean_annual_increment" + p32_avg_increment(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") / ((ord(ac)+1)*5); + p32_rot_flg(t_all,j,ac) = 1$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_avg_increment(t_all,j,ac) > 0) + + 0$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_avg_increment(t_all,j,ac) <= 0); + display "Rotation lengths are calculated based on maximizing mean annual increment in this run."; +$endif + +** From the above calculation, now it is easier to count how many age-classes can be sustained before IGR falls below interest rate. + +********************************************************************************* + +** Faustmann rotation lengths: + +p32_time(ac) = ord(ac); + +p32_discount_factor(t_all,j,ac) = 1/(exp(sum(cell(i,j),pm_interest(t_all,i))*p32_time(ac))); + +p32_net_present_value(t_all,j,ac) = ((s32_price * p32_carbon_density_ac_forestry(t_all,j,ac) * p32_discount_factor(t_all,j,ac)))/(1-p32_discount_factor(t_all,j,ac)); + +p32_stand_value(t_all,j,ac) = s32_price * p32_carbon_density_ac_forestry(t_all,j,ac); +p32_stand_value(t_all,j,ac)$(p32_stand_value(t_all,j,ac)<0.01) = 0.01; + +p32_investment_returns_lost(t_all,j,ac) = sum(cell(i,j),pm_interest(t_all,i)) * p32_net_present_value(t_all,j,ac); +p32_land_rent_weighted(t_all,j,ac) = p32_investment_returns_lost(t_all,j,ac)/p32_stand_value(t_all,j,ac) ; + +p32_rot_flg_faustmann(t_all,j,ac) = 1$(p32_IGR(t_all,j,ac) > sum(cell(i,j),pm_interest(t_all,i)) + p32_land_rent_weighted(t_all,j,ac)) + + 0$(p32_IGR(t_all,j,ac) <= sum(cell(i,j),pm_interest(t_all,i)) + p32_land_rent_weighted(t_all,j,ac)); + +p32_rot_length_faustmann(t_all,j) = sum(ac,p32_rot_flg_faustmann(t_all,j,ac)); + +********************************************************************************* + +** Change rotation based on switch. If not use calculation before faustmann +if(s32_faustmann_rotation = 0, + p32_rot_length_ac_eqivalent(t_all,j) = sum(ac,p32_rot_flg(t_all,j,ac)); +elseif s32_faustmann_rotation = 1, + p32_rot_length_ac_eqivalent(t_all,j) = sum(ac,p32_rot_flg_faustmann(t_all,j,ac)); +); + +** We provide a upper limit of 90 years for commercial plantations. +** 90 years translates to age-class 18 (90/5) +p32_rot_length_ac_eqivalent(t_all,j)$(p32_rot_length_ac_eqivalent(t_all,j)>18) = 18; +p32_rot_length_ac_eqivalent(t_historical,j) = p32_rot_length_ac_eqivalent("y1995",j); + +** Holding rotation lengths constant after the end of this century. +p32_rot_length_ac_eqivalent(t_future,j) = p32_rot_length_ac_eqivalent("y2100",j); + +** Number of cells in each region +p32_ncells(i) = sum(cell(i,j),1); + +**** Representative regional rotation +loop(t_all, + p32_rotation_regional(t_all,i) = ceil(sum(cell(i,j), p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); + pm_representative_rotation(t_all,i) = ord(t_all) + ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); + ); + +** Earlier we converted rotation lengths to absolute numbers, now we make the Conversion +** back to rotation length in age-classes. +p32_rotation_cellular_estb(t_all,j) = ceil(p32_rot_length_ac_eqivalent(t_all,j)); + +** Set harvesting rotations same as establishment rotations -- Don't move this line below extension of rotation. This is overwritten in the next loop anyways +p32_rotation_cellular_harvesting(t_all,j) = p32_rotation_cellular_estb(t_all,j); + +** RL Extension +p32_rotation_cellular_estb(t_all,j) = p32_rotation_cellular_estb(t_all,j) * s32_rotation_extension ; + +** With the following loop, harvesting rotations are updated based on the rotation length +** at which the establishment of plantations was made. For example, an establishment with +** 50 year rotation in mind in year 2000 shall be available for harvest when the age of +** this plantation is 50 years in 2050. The following loop makes sure that the harvesting +** age is updated correctly in the future. + +loop(j, + loop(t_all, + p32_rotation_offset = p32_rotation_cellular_estb(t_all,j); +* The harvest year is calculated for future based on current establishment decision + p32_rotation_cellular_harvesting(t_all+p32_rotation_offset,j) = p32_rotation_cellular_estb(t_all,j); + ); + ); + +** This loop fixes empty gaps. +** For example in 2035, if establishment length was 10 (50yrs) then it should be harvested in 2085 +** But in 2040, lets say if establishment length was 11 (55yrs) then the harvesting should happen in 2095. +** This leaves y2090 with a gap where model doesn't know which value to choose +** At this point, it takes the values which were initialized in lines above +** where we give harvested rotations the same value as establishment rotation to start with +** The loop below makes some educated guess based on jumps during these blind spots and fills them with proper numbers +loop(t_all, + p32_rotation_cellular_harvesting(t_all+1,j)$(abs(p32_rotation_cellular_harvesting(t_all+1,j) - p32_rotation_cellular_harvesting(t_all,j))>2 AND ord(t_all)= 1 AND ac.off < p32_rotation_cellular_harvesting("y1995",j)); + +** divide initial forestry area by number of age classes within ini32 +if(s32_initial_distribution = 0, +** Initialize with highest age class + p32_land_start_ac(j,"plant","acx") = pcm_land(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); + p32_land_start_ac(j,"ndc","acx") = pcm_land(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)); + +elseif s32_initial_distribution = 1, +** Initialize with equal distribution among rotation age classes +** Plantated forest area is divided into ndcs (other planted forest) and plantations + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1- f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + +elseif s32_initial_distribution = 2, +** Initialize with distribution based on FAO data (but this distribution is applied to all cells globally) +** Plantated forest area is divided into ndcs (other planted forest) and plantations + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); + p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * f32_ac_dist(ac); + p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * f32_ac_dist(ac); + +elseif s32_initial_distribution = 3, +** Initialize with Poulter distribution among rotation age classes +** Plantated forest area is divided into ndcs (other planted forest) and plantations + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); + p32_rotation_dist(j,ac) = (im_plantedclass_ac(j,ac)$(ini32(j,ac))/sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2))))$(sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2)))); + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j) * p32_rotation_dist(j,ac); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_rotation_dist(j,ac); + +*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell + loop (j, + if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + ); + ); + +elseif s32_initial_distribution = 4, +** Initialize with Manual distribution among rotation age classes +** Plantated forest area is divided into ndcs (other planted forest) and plantations + loop(j, +** Set all acs to 0 + p32_ac_dist_flag(j,ac) = 0; +** Calculate reverse of age-classes, if rotation is 11acs, then ac0 should get a value of 11, 11th ac should get value of 1 + p32_ac_dist_flag(j,ac) = (10*p32_rotation_cellular_harvesting("y1995",j)-((ord(ac)-1))*5)$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); +** Calculate the weights, youngest age-class will have highest weight + p32_ac_dist(j,ac) = (p32_ac_dist_flag(j,ac) / (sum(ac2,p32_ac_dist_flag(j,ac2)) + ord(ac)))$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); +** there can be isntances where this distribution is not summing up to 1, in that case we take the excess and remove it evenly from all age-classes +** In case the sum of distribution is > 1 : Remove the excess from ac0 + p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))>1) = p32_ac_dist(j,"ac0") - (sum(ac2, p32_ac_dist(j,ac2))-1); +** In case the sum of distribution is < 1 : Add the shortage to ac0 + p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))<1) = p32_ac_dist(j,"ac0") + (1-sum(ac2, p32_ac_dist(j,ac2))); + ); +** Isolate plantations from planted forest (forestry) + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); +** Divide plantations according to distribution + p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * p32_ac_dist(j,ac); +** Divide NDCs according to same distribution + p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_ac_dist(j,ac); + +*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell + loop (j, + if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + ); + ); + +); +** Redistribute to youngest age class in case the distribution to plantations and +** ndcs does not match fully with LUH initialized data +loop(j, + if(pm_land_start(j,"forestry") > sum((type32,ac),p32_land_start_ac(j,type32,ac)), + p32_land_start_ac(j,"ndc","ac0") = p32_land_start_ac(j,"ndc","ac0") + (pm_land_start(j,"forestry") - sum((type32,ac),p32_land_start_ac(j,type32,ac))); + ); +); +** Initialization of land +*p32_land_start_ac(j,type32,ac) = p32_land("y1995",j,type32,ac); + +*** NPI/NDC policies BEGIN +** Afforestation policies NPI and NDCs +p32_aff_pol(t,j) = round(f32_aff_pol(t,j,"%c32_aff_policy%"),6); + +* Calculate the remaining exogenous afforestation with respect to the maximum exogenous target over time. +* `p32_aff_togo` is used to adjust `s32_max_aff_area` in the constraint `q32_max_aff`. +p32_aff_togo(t,i) = smax(t2, sum(cell(i,j), p32_aff_pol(t2,j))) - sum(cell(i,j), p32_aff_pol(t,j)); + +* Calculate the limit for endogenous afforestation +* The global (`s32_max_aff_area`) and regional limit (`f32_max_aff_area`) for total afforestation (sum of endogenous and exogenous) is reduced by exogenous NPI/NDC afforestation (`p32_aff_pol`). +if(s32_max_aff_area_glo = 1, + i32_max_aff_area_glo(t) = s32_max_aff_area - smax(t2, sum(j, p32_aff_pol(t2,j))); + i32_max_aff_area_glo(t)$(i32_max_aff_area_glo(t) < 0) = 0; + i32_max_aff_area_glo(t)$(m_year(t) <= sm_fix_SSP2) = Inf; + i32_max_aff_area_reg(t,i) = 0; +elseif s32_max_aff_area_glo = 0, + i32_max_aff_area_reg(t,i) = f32_max_aff_area(i) - smax(t2, sum(cell(i,j), p32_aff_pol(t2,j))); + i32_max_aff_area_reg(t,i)$(i32_max_aff_area_reg(t,i) < 0) = 0; + i32_max_aff_area_reg(t,i)$(m_year(t) <= sm_fix_SSP2) = Inf; + i32_max_aff_area_glo(t) = 0; +); + +*** NPI/NDC policies END + +*fix bph effect to zero for all age classes except the ac that is chosen for the bph effect to occur after planting (e.g. canopy closure) +*fade-in from ac10 to ac30. First effect in ac10 (ord 3), last effect in ac30 (ord 7). +ac_bph(ac) = no; +ac_bph(ac) = yes$(ord(ac) >= 3 AND ord(ac) <= 7); +display ac_bph; + +p32_aff_bgp(j,ac) = 0; +p32_tcre_glo(j) = 0; +if(s32_tcre_local = 1, + p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/f32_tcre(j,"%c32_tcre_ctrl%")/card(ac_bph); +else +*m_weightedmean returns a global value, which is then used assigned to all j. We use land area as weight. + p32_tcre_glo(j2) = m_weightedmean(f32_tcre(j,"%c32_tcre_ctrl%"),sum(land, pcm_land(j,land)),j) + p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/p32_tcre_glo(j)/card(ac_bph) +); + +** Calculate plantation contribution scaled to Growing stock in plantations +** Initialize with low values +p32_plantation_contribution(t_ext,i) = 0.001; +** Fill parameter with input file based on scenario settings +p32_plantation_contribution(t_ext,i)$(f32_gs_relativetarget(i)>0) = f32_plantation_contribution(t_ext,i,"%c32_dev_scen%","%c32_incr_rate%"); + +************************************************************************** +******************************************************************************* +** Calibrate plantations yields +******************************************************************************* +** Initialize with 1 tDM/ha - to avoid dvision by 0 +p32_observed_gs_reg(i) = 1; +** Wherever FAO reports >0 growing stock, we calculate how much growing stock MAGPIE +** sees even before optimization starts +p32_observed_gs_reg(i)$(f32_gs_relativetarget(i)>0 AND sum((cell(i,j),ac),p32_land_start_ac(j,"plant",ac))>0) = (sum((cell(i,j),ac),(pm_timber_yield_initial(j,ac,"forestry") / sm_wood_density) * p32_land_start_ac(j,"plant",ac))/ sum((cell(i,j),ac),p32_land_start_ac(j,"plant",ac))); + +** Initialze calibration factor for growing stocks as 1 +** we dont set it to 0 as we don't want to modify carbon densities by multiplication with 0 later +p32_gs_scaling_reg(i) = 1; +** Calculate the ratio between target growing stock (reported by FAO) and observed growing stock (value at initialization in MAgPIE) +p32_gs_scaling_reg(i)$(f32_gs_relativetarget(i)>0 AND f32_plantedforest(i)>0) = f32_gs_relativetarget(i) / p32_observed_gs_reg(i); +** Calibration factors lower than 1 are set to 1 +p32_gs_scaling_reg(i)$(p32_gs_scaling_reg(i) < 1) = 1; + +** Save pm_carbon_density_ac_forestry in a parameter before upscaling to FAO growing stocks. +** This allows to use plantation growth curves for CO2 price driven afforestation. +p32_c_density_ac_fast_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); + +** Update c-density for timber plantations based on calibration factor to match FAO growing stocks +pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") * sum(cell(i,j),p32_gs_scaling_reg(i)); + +** set bii coefficients +p32_bii_coeff(type32,bii_class_secd,potnatveg) = 0; +if(s32_aff_bii_coeff = 0, + p32_bii_coeff("aff",bii_class_secd,potnatveg) = fm_bii_coeff(bii_class_secd,potnatveg) +elseif s32_aff_bii_coeff = 1, + p32_bii_coeff("aff",bii_class_secd,potnatveg) = fm_bii_coeff("timber",potnatveg) +); +p32_bii_coeff("ndc",bii_class_secd,potnatveg) = fm_bii_coeff(bii_class_secd,potnatveg); +p32_bii_coeff("plant",bii_class_secd,potnatveg) = fm_bii_coeff("timber",potnatveg); + +* initialize parameter +p32_land(t,j,type32,ac) = 0; + +* initialize forest disturbance losses +p32_disturbance_loss_ftype32(t,j,"aff",ac) = 0; diff --git a/modules/32_forestry/MMEmu_jul23/presolve.gms b/modules/32_forestry/MMEmu_jul23/presolve.gms new file mode 100644 index 0000000000..459ceddd89 --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/presolve.gms @@ -0,0 +1,181 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*define ac_est and ac_sub +ac_est(ac) = no; +ac_est(ac) = yes$(ord(ac) <= (m_yeardiff_forestry(t)/5)); + +ac_sub(ac) = no; +ac_sub(ac) = yes$(ord(ac) > (m_yeardiff_forestry(t)/5)); + +*Reduction of ac_est is not possible. +v32_hvarea_forestry.fx(j,ac_est) = 0; +v32_land_reduction.fx(j,type32,ac_est) = 0; + +** START ndc ** +* calc NPI/NDC afforestation per time step based on forest stock change + p32_aff_pol_timestep("y1995",j) = 0; + p32_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); +* Suitable area (`p32_aff_pot`) for NPI/NDC afforestation + p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); +* suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 + p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; +* Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available + p32_aff_pol_timestep(t,j)$(p32_aff_pol_timestep(t,j) > p32_aff_pot(t,j)) = p32_aff_pot(t,j); +** END ndc ** + +*' @code + +*' Afforestation switch: +*' 0 = Use natveg growth curve towards LPJmL natural vegetation +*' 1 = Use plantation growth curve (faster than natveg) towards LPJmL natural vegetation +if(s32_aff_plantation = 0, + p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); +elseif s32_aff_plantation = 1, + p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = p32_c_density_ac_fast_forestry(t,j,ac); +); + +*' Timber plantations carbon densities: +p32_carbon_density_ac(t,j,"plant",ac,ag_pools) = pm_carbon_density_ac_forestry(t,j,ac,ag_pools); + +*' NDC carbon densities are natveg carbon densities. +p32_carbon_density_ac(t,j,"ndc",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); + +*' CDR from afforestation for each age-class, depending on planning horizon. +p32_cdr_ac(t,j,ac)$(ord(ac) > 1 AND (ord(ac)-1) <= s32_planing_horizon/5) += p32_carbon_density_ac(t,j,"aff",ac,"vegc") - p32_carbon_density_ac(t,j,"aff",ac-1,"vegc"); + +* Disturbance from generic sources to managed and natural forests +if((ord(t) = 1), + pc32_land(j,type32,ac) = p32_land_start_ac(j,type32,ac); +else + pc32_land(j,type32,ac) = p32_land(t-1,j,type32,ac); +); + +p32_disturbance_loss_ftype32(t,j,"aff",ac_sub) = pc32_land(j,"aff",ac_sub) * f32_forest_shock(t,"%c32_shock_scenario%") * m_timestep_length; +pc32_land(j,"aff",ac_est) = pc32_land(j,"aff",ac_est) + sum(ac_sub,p32_disturbance_loss_ftype32(t,j,"aff",ac_sub))/card(ac_est); + +pc32_land(j,"aff",ac_sub) = pc32_land(j,"aff",ac_sub) - p32_disturbance_loss_ftype32(t,j,"aff",ac_sub); + +*' Regrowth of natural vegetation (natural succession) is modelled by shifting +*' age-classes according to time step length. For first year of simulation, the +*' shift is just 1. Division by 5 happends because the age-classes exist in 5 year steps +s32_shift = m_yeardiff_forestry(t)/5; +*' @stop + +*' Shifting of age-classes in land. +*` @code +if((ord(t)=1), +p32_land(t,j,type32,ac)$(ord(ac) > s32_shift) = p32_land_start_ac(j,type32,ac-s32_shift); +p32_land(t,j,type32,"acx") = p32_land(t,j,type32,"acx") + sum(ac$(ord(ac) > card(ac)-s32_shift), p32_land_start_ac(j,type32,ac)); +else +* Example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s32_shift = 1) +p32_land(t,j,type32,ac)$(ord(ac) > s32_shift) = pc32_land(j,type32,ac-s32_shift); +* Account for cases at the end of the age class set (s32_shift > 1) which are not shifted by the above calculation +p32_land(t,j,type32,"acx") = p32_land(t,j,type32,"acx") + sum(ac$(ord(ac) > card(ac)-s32_shift), pc32_land(j,type32,ac)); +); +* set ac_est to zero +p32_land(t,j,type32,ac_est) = 0; +*' @stop + + + + + +** Calculate v32_land.l +v32_land.l(j,type32,ac) = p32_land(t,j,type32,ac); +pc32_land(j,type32,ac) = v32_land.l(j,type32,ac); +p32_land_before(t,j,type32,ac) = p32_land(t,j,type32,ac); +vm_land.l(j,"forestry") = sum((type32,ac), v32_land.l(j,type32,ac)); +pcm_land(j,"forestry") = sum((type32,ac), v32_land.l(j,type32,ac)); + +** reset all bounds +v32_land.lo(j,type32,ac) = 0; +v32_land.up(j,type32,ac) = Inf; + +if(s32_hvarea = 0, +*** zero. Fixed timber plantations. No harvest. No establisment. + v32_hvarea_forestry.fx(j,ac_sub) = 0; + v32_land.fx(j,"plant",ac) = pc32_land(j,"plant",ac); + s32_establishment_static = 1; + s32_establishment_dynamic = 0; +elseif s32_hvarea = 1, +*** exogenous. All timber plantations are harvested at rotation age and are re-established such that the total plantation area remains constant. + v32_land.fx(j,"plant",ac)$(ac.off < p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); + v32_land.fx(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = 0; + s32_establishment_static = 1; + s32_establishment_dynamic = 0; + +** Timber plantations can be harvested at rotation age (the economically +** optimal point in time harvesting usually natural forests would be preferred over harvest +** from timber plantations, mainly because the growing stock at rotation age (e.g. 50 years) +** in timber plantations is smaller compared to the growing stock of old-growth primary and +** secondary forest (> 100 years). + +elseif s32_hvarea = 2, +*** endogenous. All plantations are harvested at rotation age. Plantation establishment is endogenous. +** Fix timber plantations until the end of the rotation. "ac.off" identical to "ord(ac)-1". +** The offset is needed because the first element of ac is ac0, which is not included in p32_rotation_cellular_harvesting. + v32_land.fx(j,"plant",ac)$(ac.off < p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); +** After the rotation period, plantations are free for harvesting + v32_land.up(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); + s32_establishment_static = 0; + s32_establishment_dynamic = 1; +); +** overwrite bounds for ac_est +v32_land.lo(j,"plant",ac_est) = 0; +v32_land.up(j,"plant",ac_est) = Inf; +v32_land.l(j,"plant",ac_est) = 0.001; + + +** fix ndc afforestation forever, all age-classes are fixed except ac_est +v32_land.fx(j,"ndc",ac_sub) = pc32_land(j,"ndc",ac_sub); +v32_land.lo(j,"ndc",ac_est) = 0; +v32_land.up(j,"ndc",ac_est) = Inf; + +** fix c price induced afforestation based on s32_planing_horizon, fixed only until end of s32_planing_horizon, ac_est is free +if(s32_aff_prot = 0, + v32_land.fx(j,"aff",ac)$(ac.off <= s32_planing_horizon/5) = pc32_land(j,"aff",ac); + v32_land.up(j,"aff",ac)$(ac.off > s32_planing_horizon/5) = pc32_land(j,"aff",ac); +elseif s32_aff_prot = 1, + v32_land.fx(j,"aff",ac) = pc32_land(j,"aff",ac); +); +v32_land.lo(j,"aff",ac_est) = 0; +v32_land.up(j,"aff",ac_est) = Inf; +v32_land.l(j,"aff",ac_est) = 0; + +** Certain areas (e.g. the boreal zone) are excluded from endogenous afforestation. +** DON'T USE TYPE32 SET HERE +if(m_year(t) <= sm_fix_SSP2, + v32_land.fx(j,"aff",ac_est) = 0; +else + v32_land.lo(j,"aff",ac_est) = 0; + v32_land.up(j,"aff",ac_est) = f32_aff_mask(j) * sum(land, pcm_land(j,land)); +); +*' No afforestation is allowed if carbon density <= 20 tc/ha +v32_land.fx(j,"aff",ac_est)$(fm_carbon_density(t,j,"forestry","vegc") <= 20) = 0; + +m_boundfix(v32_land,(j,type32,ac_sub),up,10e-5); + +** Calculate future yield based on rotation length +if((ord(t)=1), +pc32_yield_forestry_future(j) = sum(ac$(ord(ac) = p32_rotation_cellular_estb(t,j)-1), pm_timber_yield(t,j,ac,"forestry")); +pc32_area_rotation(j) = sum(ac$(ord(ac) = p32_rotation_cellular_estb(t,j)-1), p32_land(t,j,"plant",ac)); +); +pc32_yield_forestry_future_reg(i) = m_weightedmean(pc32_yield_forestry_future(j),pc32_area_rotation(j),(cell(i,j))); +pc32_yield_forestry_future_reg(i)$(pc32_yield_forestry_future_reg(i) = 0) = smax(cell(i,j),pc32_yield_forestry_future(j)); + +** Display +p32_updated_gs_reg(t,i) = 1; +p32_updated_gs_reg(t,i)$(sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))>0) = (sum((cell(i,j),ac_sub),(pm_timber_yield(t,j,ac_sub,"forestry") / sm_wood_density) * p32_land(t,j,"plant",ac_sub))/ sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))); + +* Avoid conflict between afforestation for carbon uptake on land and secdforest restoration +pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) + = pm_land_conservation(t,j,"secdforest","restore") - (sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)); +pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") <= sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)) = 0; + +*** EOF presolve.gms *** diff --git a/modules/32_forestry/MMEmu_jul23/realization.gms b/modules/32_forestry/MMEmu_jul23/realization.gms new file mode 100644 index 0000000000..9d61742870 --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/realization.gms @@ -0,0 +1,45 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @description The main feature of the this realization is afforestation for CDR +*' and timber production. Afforestation can be modelled exogenously (prescribed +*' by NPI/NDC policies) and/or endogenously (incentivized by a reward for CDR). +*' National policies implemented (NPI) and nationally determined contributions to +*' the Paris agreement (NDC) for afforestation are based on country reports. The +*' interface `vm_cdr_aff` includes the expected CDR and local bph effects from +*' afforestation depending on the planning horizon `s32_planing_horizon`. The +*' reward for CDR and local bph effects from afforestation is calculated in the +*' [56_ghg_policy] module. In this realization, afforestation is modeled by default +*' as regrowth of natural vegetation (see @humpenoder_investigating_2014 for details on the implemenation). +*' The regrowth of natural vegetation follows S-shaped growth curves, which are +*' parametrized based on @braakhekke_modelling_2019. Additionally this module +*' handles the production of two timber products i.e., wood and woodfuel from +*' plantation forests while still accounting for afforestation policies. New plantations +*' are also established in the simulation step to account for future timber demand. +*' This module also calculates the rotation lengths before the solve loop by +*' maximizing current annual increment (CAI) based on @amacher2009economics. This rotation +*' length calculation decision can also be changed to maximization of mean annual increment (MAI) +*' or equating instantaneous growth rate (IGR) with interest rate. Rotation lengths +*' calculated by maximization of CAI are empirically closer to economically optimal Faustmann +*' rotation lengths (see @amacher2009economics). +*' For harvesting decisions we assume that land owners stick to their establishment decision, +*' e.g. if a plantation has been established with a rotation length of 30 years +*' it will be harvested after 30 years, even so the rotation length in the prevailing +*' time step, used for establishment, is shorter or longer. + +*' @limitations Rotation lengths for timber plantations are not endogenous. + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "sets" $include "./modules/32_forestry/dynamic_feb21/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/32_forestry/dynamic_feb21/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/32_forestry/dynamic_feb21/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/32_forestry/dynamic_feb21/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/32_forestry/dynamic_feb21/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/32_forestry/dynamic_feb21/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/32_forestry/dynamic_feb21/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/32_forestry/dynamic_feb21/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### diff --git a/modules/32_forestry/MMEmu_jul23/scaling.gms b/modules/32_forestry/MMEmu_jul23/scaling.gms new file mode 100644 index 0000000000..ddc68df6ae --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/scaling.gms @@ -0,0 +1,12 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +v32_cost_establishment.scale(i) = 10e3; +v32_cost_recur.scale(i) = 10e4; +vm_cost_fore.scale(i) = 10e4; +v32_cost_hvarea.scale(i)$(s32_hvarea = 1 OR s32_hvarea = 2) = 10e3; +vm_cdr_aff.scale(j,ac,aff_effect) = 10e-4; diff --git a/modules/32_forestry/MMEmu_jul23/sets.gms b/modules/32_forestry/MMEmu_jul23/sets.gms new file mode 100644 index 0000000000..5b4b725355 --- /dev/null +++ b/modules/32_forestry/MMEmu_jul23/sets.gms @@ -0,0 +1,50 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de +sets +***FORESTRY COST TYPES*** + + fcostsALL forestry factor cost types + / recur, mon, harv / + + fcosts32(fcostsALL) forestry factor cost per annum + / recur, mon / + + type32 plantation type + / aff, ndc, plant / + + pol32 afforestation policy type + / none, npi, ndc / + + ini32(j,ac) subset for initialization of timber plantations + + rotation_type Rotation type + / min, low, def, high, bio / + + bgp32 biogeophysical effect (degree C) of afforestation on local surface temperature +/ nobgp, ann_bph / + +tcre32 transient surface temperature response to CO2 emission (degree C per tC) +/ ann_TCREmean, ann_TCREhigh, ann_TCRElow / + +aff_effect biochemical and local biophysical effect of afforestation on climate +/ bgc, bph / + +ac_bph(ac) fade-in of bph effect over age-classes + +inter32 Interpolation of scenario from FAO study on proportion of roundwood production coming from plantations +/abare, brown/ + +scen32 Scenario for development of roundwood production share from plantations +/ constant,h5s5l5,h5s2l2,h5s2l1,h5s1l1,h5s1l05,h2s1l05 / + + shock_scen32 Scenario name of forest carbon shock + / none, 002lin2030,004lin2030,008lin2030,016lin2030 + / + +; + +*** EOF sets.gms *** From ee3d0869d4f2a2df3c81af5150dd10a1a1d1d1a1 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 31 Jul 2023 15:12:27 +0200 Subject: [PATCH 026/259] Add afforestation constraint for year 2025 --- modules/32_forestry/dynamic_feb21/input.gms | 1 + modules/32_forestry/dynamic_feb21/presolve.gms | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/modules/32_forestry/dynamic_feb21/input.gms b/modules/32_forestry/dynamic_feb21/input.gms index 7e8362645b..e652065977 100644 --- a/modules/32_forestry/dynamic_feb21/input.gms +++ b/modules/32_forestry/dynamic_feb21/input.gms @@ -47,6 +47,7 @@ scalars s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 0 / + s32_max_aff_cell_2025 Maximum afforestation area in y2025 per cluster (million ha) / Inf / ; parameter f32_aff_mask(j) afforestation mask (binary) diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 459ceddd89..9cb42f3bae 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -156,6 +156,11 @@ else v32_land.lo(j,"aff",ac_est) = 0; v32_land.up(j,"aff",ac_est) = f32_aff_mask(j) * sum(land, pcm_land(j,land)); ); + +if(m_year(t) = 2025, + v32_land.up(j,"aff","ac0") = s32_max_aff_cell_2025; +); + *' No afforestation is allowed if carbon density <= 20 tc/ha v32_land.fx(j,"aff",ac_est)$(fm_carbon_density(t,j,"forestry","vegc") <= 20) = 0; From 5768f6982254ad67c2b8feefa4a592966fed5bf7 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 31 Jul 2023 17:39:09 +0200 Subject: [PATCH 027/259] Add Aff growth constraint --- modules/32_forestry/dynamic_feb21/declarations.gms | 2 ++ modules/32_forestry/dynamic_feb21/equations.gms | 4 ++++ modules/32_forestry/dynamic_feb21/input.gms | 3 ++- modules/32_forestry/dynamic_feb21/presolve.gms | 9 +++++++-- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/modules/32_forestry/dynamic_feb21/declarations.gms b/modules/32_forestry/dynamic_feb21/declarations.gms index 112cf412b6..49bd816c93 100644 --- a/modules/32_forestry/dynamic_feb21/declarations.gms +++ b/modules/32_forestry/dynamic_feb21/declarations.gms @@ -72,6 +72,7 @@ positive variables v32_land_reduction(j,type32,ac) Forestry land reduction (mio. ha) v32_cost_establishment(i) Cost of establishment calculated at the current time step (mio. USD) v32_hvarea_forestry(j,ac) Harvested area from timber plantations (mio. ha) + v32_aff_area(i) Regional afforestation area (aff and ndf) (mio. ha) vm_prod_forestry(j,kforestry) Production of woody biomass from commercial plantations (mio. tDM per yr) ; @@ -87,6 +88,7 @@ equations q32_land_diff Aggregated difference in forestry land compared to previous timestep (mio. ha) q32_max_aff Maximum total global afforestation (mio. ha) q32_max_aff_reg(i) Maximum total regional afforestation (mio. ha) + q32_aff_area(i) Regional afforestation area (aff and ndf) (mio. ha) q32_aff_pol(j) Afforestation policy constraint (mio. ha) q32_aff_est(j) Afforestation constraint for establishment age classes (mio. ha) q32_hvarea_forestry(j,ac) Plantations area harvest (mio. ha) diff --git a/modules/32_forestry/dynamic_feb21/equations.gms b/modules/32_forestry/dynamic_feb21/equations.gms index d17234cce2..75946065b5 100644 --- a/modules/32_forestry/dynamic_feb21/equations.gms +++ b/modules/32_forestry/dynamic_feb21/equations.gms @@ -75,6 +75,10 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( sum((cell(i2,j2),ac), v32_land(j2,"aff",ac)) =l= sum(ct, i32_max_aff_area_reg(ct,i2)); + q32_aff_area(i2) ... + v32_aff_area(i2) + =e= sum((cell(i2,j2),ac), v32_land(j2, "aff", ac) + v32_land(j2, "ndc", ac)); + *----------------------------------------------- ************** Carbon stock ******************** *----------------------------------------------- diff --git a/modules/32_forestry/dynamic_feb21/input.gms b/modules/32_forestry/dynamic_feb21/input.gms index e652065977..a446071d2c 100644 --- a/modules/32_forestry/dynamic_feb21/input.gms +++ b/modules/32_forestry/dynamic_feb21/input.gms @@ -47,7 +47,8 @@ scalars s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 0 / - s32_max_aff_cell_2025 Maximum afforestation area in y2025 per cluster (million ha) / Inf / +** s32_max_aff_cell_2025 Maximum afforestation area in y2025 per cluster (million ha) / Inf / + s32_aff_max_growth Annual regional max afforestation area growth / Inf / ; parameter f32_aff_mask(j) afforestation mask (binary) diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 9cb42f3bae..cacc131c8f 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -157,8 +157,13 @@ else v32_land.up(j,"aff",ac_est) = f32_aff_mask(j) * sum(land, pcm_land(j,land)); ); -if(m_year(t) = 2025, - v32_land.up(j,"aff","ac0") = s32_max_aff_cell_2025; +** if(m_year(t) = 2025, +** v32_land.up(j,"aff","ac0") = s32_max_aff_cell_2025; +** ); + +if(m_year(t) > sm_fix_SSP2, + v32_aff_area.up(i) = sum((cell(i2,j2),ac), p32_land(t-1,j2,"aff",ac) + p32_land(t-1,j2,"ndc",ac)) + * (1+s32_aff_max_growth) ** m_yeardiff(t); ); *' No afforestation is allowed if carbon density <= 20 tc/ha From 773507789fafad739b23d370cc023594aa79565e Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 1 Aug 2023 12:18:26 +0200 Subject: [PATCH 028/259] Revert Aff constraint to absolute aff in 2025 --- modules/32_forestry/dynamic_feb21/declarations.gms | 2 -- modules/32_forestry/dynamic_feb21/equations.gms | 4 ---- modules/32_forestry/dynamic_feb21/input.gms | 3 +-- modules/32_forestry/dynamic_feb21/presolve.gms | 9 ++------- 4 files changed, 3 insertions(+), 15 deletions(-) diff --git a/modules/32_forestry/dynamic_feb21/declarations.gms b/modules/32_forestry/dynamic_feb21/declarations.gms index 49bd816c93..112cf412b6 100644 --- a/modules/32_forestry/dynamic_feb21/declarations.gms +++ b/modules/32_forestry/dynamic_feb21/declarations.gms @@ -72,7 +72,6 @@ positive variables v32_land_reduction(j,type32,ac) Forestry land reduction (mio. ha) v32_cost_establishment(i) Cost of establishment calculated at the current time step (mio. USD) v32_hvarea_forestry(j,ac) Harvested area from timber plantations (mio. ha) - v32_aff_area(i) Regional afforestation area (aff and ndf) (mio. ha) vm_prod_forestry(j,kforestry) Production of woody biomass from commercial plantations (mio. tDM per yr) ; @@ -88,7 +87,6 @@ equations q32_land_diff Aggregated difference in forestry land compared to previous timestep (mio. ha) q32_max_aff Maximum total global afforestation (mio. ha) q32_max_aff_reg(i) Maximum total regional afforestation (mio. ha) - q32_aff_area(i) Regional afforestation area (aff and ndf) (mio. ha) q32_aff_pol(j) Afforestation policy constraint (mio. ha) q32_aff_est(j) Afforestation constraint for establishment age classes (mio. ha) q32_hvarea_forestry(j,ac) Plantations area harvest (mio. ha) diff --git a/modules/32_forestry/dynamic_feb21/equations.gms b/modules/32_forestry/dynamic_feb21/equations.gms index 75946065b5..d17234cce2 100644 --- a/modules/32_forestry/dynamic_feb21/equations.gms +++ b/modules/32_forestry/dynamic_feb21/equations.gms @@ -75,10 +75,6 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( sum((cell(i2,j2),ac), v32_land(j2,"aff",ac)) =l= sum(ct, i32_max_aff_area_reg(ct,i2)); - q32_aff_area(i2) ... - v32_aff_area(i2) - =e= sum((cell(i2,j2),ac), v32_land(j2, "aff", ac) + v32_land(j2, "ndc", ac)); - *----------------------------------------------- ************** Carbon stock ******************** *----------------------------------------------- diff --git a/modules/32_forestry/dynamic_feb21/input.gms b/modules/32_forestry/dynamic_feb21/input.gms index a446071d2c..7d6b7440bd 100644 --- a/modules/32_forestry/dynamic_feb21/input.gms +++ b/modules/32_forestry/dynamic_feb21/input.gms @@ -47,8 +47,7 @@ scalars s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 0 / -** s32_max_aff_cell_2025 Maximum afforestation area in y2025 per cluster (million ha) / Inf / - s32_aff_max_growth Annual regional max afforestation area growth / Inf / + s32_max_aff_cell_2025 Maximum afforestation area in y2025 per cluster (million ha) / Inf / ; parameter f32_aff_mask(j) afforestation mask (binary) diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index cacc131c8f..9cb42f3bae 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -157,13 +157,8 @@ else v32_land.up(j,"aff",ac_est) = f32_aff_mask(j) * sum(land, pcm_land(j,land)); ); -** if(m_year(t) = 2025, -** v32_land.up(j,"aff","ac0") = s32_max_aff_cell_2025; -** ); - -if(m_year(t) > sm_fix_SSP2, - v32_aff_area.up(i) = sum((cell(i2,j2),ac), p32_land(t-1,j2,"aff",ac) + p32_land(t-1,j2,"ndc",ac)) - * (1+s32_aff_max_growth) ** m_yeardiff(t); +if(m_year(t) = 2025, + v32_land.up(j,"aff","ac0") = s32_max_aff_cell_2025; ); *' No afforestation is allowed if carbon density <= 20 tc/ha From 9cf7705954d334592c577da297b4a4f5c33a623f Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 23 Nov 2023 13:46:09 +0100 Subject: [PATCH 029/259] Add MP config file and default script --- config/mp_default.cfg | 1952 +++++++++++++++++ core/sets.gms | 1 + modules/15_food/anthro_iso_jun22/sets.gms | 2 +- .../15_food/anthropometrics_jan18/sets.gms | 2 +- scripts/output/extra/disaggregation.R | 150 +- scripts/output/extra/disaggregation_old.R | 416 ++++ scripts/start/projects/MP_demand.R | 156 ++ scripts/start/projects/MP_feedback.R | 150 ++ scripts/start/projects/MP_price.R | 138 ++ scripts/start/projects/mp_default.R | 17 + 10 files changed, 2938 insertions(+), 46 deletions(-) create mode 100644 config/mp_default.cfg create mode 100644 scripts/output/extra/disaggregation_old.R create mode 100644 scripts/start/projects/MP_demand.R create mode 100644 scripts/start/projects/MP_feedback.R create mode 100644 scripts/start/projects/MP_price.R create mode 100644 scripts/start/projects/mp_default.R diff --git a/config/mp_default.cfg b/config/mp_default.cfg new file mode 100644 index 0000000000..251cc37315 --- /dev/null +++ b/config/mp_default.cfg @@ -0,0 +1,1952 @@ +# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +################## +#### SETTINGS #### +################## + +cfg <- list() + +#### Main settings #### + +# short description of the actual run +cfg$title <- "default-MMR12" + +# path to the submodel to be used relative to main model folder +cfg$model <- "main.gms" #def = "main.gms" + +#### input settings #### + +# which input data sets should be used? +cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", + cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.87_26df900e_validation.tgz", + additional = "additional_data_rev4.43.tgz", + patch = "MMEmuR12_rev4.87.tgz") + + +# NOTE: It is recommended to recalibrate the model when changing cellular input data +# as well as for any other setting that would affect initial values in the model, +# e.g. changes in costs structure, NPI policies, etc. + +#a list of repositories (please pay attention to the list format!) in which the +#files should be searched for. Files will be searched in all repositories until +#found, always starting with the first repository in the list. The argument must +#have the format of a named list with the url of the repository as name and a +#corresponding list of options such as username or password to access the +#repository as value. If no options are required the value has to be NULL. (e.g. +#list("ftp://my_pw_protected_server.de/data"=list(user="me",password=12345), +# "http://free_server.de/dat"=NULL)) +#Please add system or user specific repositories (such as repos with limited +#access for) through the R option "magpie_repos". Through the append command +#below it will get merged into cfg$repositories + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + + + + +# Should input data be downloaded from source even if cfg$input did not change? +cfg$force_download <- FALSE + +# Should an existing output folder be replaced if a new run with the same name is started? +cfg$force_replace <- FALSE + +# Settings for the yield calibration +# * (TRUE): Yield calibration will be performed +# * (ifneeded): Yield calibration will only be executed if input data is +# * downloaded from repository +# * (FALSE): Yield calibration will not be performed +cfg$recalibrate <- "ifneeded" # def = "ifneeded" +# Up to which accuracy shall be recalibrated? +cfg$calib_accuracy <- 0.05 # def = 0.05 +# What is the maximum number of iterations if the precision goal is not reached? +cfg$calib_maxiter <- 20 # def = 20 +# Factor determining how much the divergence infuences the new +# calibration factor in each calibration iteration (0-1) +cfg$damping_factor <- 0.96 # def= 0.96 +# switch on/of calibration of cropland (pasture will be left untouched) +cfg$calib_cropland <- TRUE # def= TRUE +# set upper limit for cropland calibration factor +cfg$crop_calib_max <- 1.5 # def= 1.5 +# Selection type of calibration factors. +# If FALSE, calibration factors from the last iteration are used. +# If TRUE, calibration factors from the iteration with the lowest divergence are used. +cfg$best_calib <- TRUE # def = TRUE + +# Settings for land conversion cost calibration (cropland) +# The calibration routine derives regional calibration factors for +# costs of cropland expansion and rewards for cropland reduction, +# with the goal to match historical regional cropland in 2015. +# * (TRUE): Land conversion cost calibration will be performed +# * (ifneeded): Land conversion cost calibration will only be executed if the input file "f39_calib.csv" is missing +# * (FALSE): Land conversion cost calibration will not be performed +cfg$recalibrate_landconversion_cost <- "ifneeded" #def "ifneeded" +# Up to which accuracy shall be recalibrated? +cfg$calib_accuracy_landconversion_cost <- 0.05 # def = 0.05 +# What is the maximum number of iterations if the precision goal is not reached? +cfg$calib_maxiter_landconversion_cost <- 40 # def = 40 +# Restart from existing calibration factors (TRUE or FALSE) +cfg$restart_landconversion_cost <- FALSE # def = FALSE +# Factor determining how much the divergence infuences the new +# calibration factor in each calibration iteration (0-1) +cfg$damping_factor_landconversion_cost <- 0.96 # def= 0.96 +# Set upper limit for cropland calibration factor +cfg$cost_calib_max_landconversion_cost <- 3 # def= 3 +# Set lower limit for cropland calibration factor +cfg$cost_calib_min_landconversion_cost <- 0.05 # def= 0.05 +# Selection type of calibration factors. +# If FALSE, calibration factors from the last iteration are used. +# If TRUE, calibration factors from the iteration with the lowest divergence are used. +cfg$best_calib_landconversion_cost <- FALSE # def = FALSE + +# Settings for NPI/NDC recalculation +# * (TRUE): NPI/NDC recalculation will be performed +# * (ifneeded): NPI/NDC recalculation will only be executed if current input files are zero +# * and policy switches (c32_aff_pol, c35_ad_pol) are set to "npi" or "ndc". +# * If policy switches are set to "none" (default) NPI/NDC recalculation will not be performed +# * (FALSE): NPI/NDC recalculation will not be performed +cfg$recalc_npi_ndc <- "ifneeded" # def = ifneeded +# * which national or subnational mappinng should be used +# * (iso): policies on the national levels +# * (bra): includes subnational policies for Brazil +cfg$policyregions <- "bra" # def = "bra" + +#### magpie.gms settings #### +cfg$gms <- list() + +# Set number of time steps (1-16) or type "less_TS" for remind time steps +cfg$gms$c_timesteps <- "coup2110" + +# historic time steps +cfg$gms$c_past <- "till_2010" + +# use of gdx files +cfg$gms$s_use_gdx <- 0 # def = 0 +#* 0: gdx will not be loaded +#* 1: gdx is loaded in the first time step +#* 2: gdx is loaded in all time steps + +# **---------------------------------------------------------------------------- +# *** MODULES +# ***--------------------------------------------------------------------------- + +#### Useful shortcuts #### +# Vector of all iso countries (used for regional policy implementations) +all_iso_countries <- "ABW,AFG,AGO,AIA,ALA,ALB,AND,ARE,ARG,ARM, + ASM,ATA,ATF,ATG,AUS,AUT,AZE,BDI,BEL,BEN, + BES,BFA,BGD,BGR,BHR,BHS,BIH,BLM,BLR,BLZ, + BMU,BOL,BRA,BRB,BRN,BTN,BVT,BWA,CAF,CAN, + CCK,CHN,CHE,CHL,CIV,CMR,COD,COG,COK,COL, + COM,CPV,CRI,CUB,CUW,CXR,CYM,CYP,CZE,DEU, + DJI,DMA,DNK,DOM,DZA,ECU,EGY,ERI,ESH,ESP, + EST,ETH,FIN,FJI,FLK,FRA,FRO,FSM,GAB,GBR, + GEO,GGY,GHA,GIB,GIN,GLP,GMB,GNB,GNQ,GRC, + GRD,GRL,GTM,GUF,GUM,GUY,HKG,HMD,HND,HRV, + HTI,HUN,IDN,IMN,IND,IOT,IRL,IRN,IRQ,ISL, + ISR,ITA,JAM,JEY,JOR,JPN,KAZ,KEN,KGZ,KHM, + KIR,KNA,KOR,KWT,LAO,LBN,LBR,LBY,LCA,LIE, + LKA,LSO,LTU,LUX,LVA,MAC,MAF,MAR,MCO,MDA, + MDG,MDV,MEX,MHL,MKD,MLI,MLT,MMR,MNE,MNG, + MNP,MOZ,MRT,MSR,MTQ,MUS,MWI,MYS,MYT,NAM, + NCL,NER,NFK,NGA,NIC,NIU,NLD,NOR,NPL,NRU, + NZL,OMN,PAK,PAN,PCN,PER,PHL,PLW,PNG,POL, + PRI,PRK,PRT,PRY,PSE,PYF,QAT,REU,ROU,RUS, + RWA,SAU,SDN,SEN,SGP,SGS,SHN,SJM,SLB,SLE, + SLV,SMR,SOM,SPM,SRB,SSD,STP,SUR,SVK,SVN, + SWE,SWZ,SXM,SYC,SYR,TCA,TCD,TGO,THA,TJK, + TKL,TKM,TLS,TON,TTO,TUN,TUR,TUV,TWN,TZA, + UGA,UKR,UMI,URY,USA,UZB,VAT,VCT,VEN,VGB, + VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE" + +# * Based on https://tntcat.iiasa.ac.at/SspDb/dsd?Action=htmlpage&page=10#regiondefs +oecd90andEU <- "ALB,AUS,AUT,BEL,BIH,BGR,CAN,CYP,CZE,DNK,EST,FIN,FRA, + DEU,GRC,HUN,HRV,ISL,IRL,ITA,JPN,LUX,LVA,LTU,MLT,MNE, + NLD,NOR,NZL,POL,PRT,ROU,SRB,SVK,SVN,ESP,SWE,CHE,MKD,TUR, + GBR,USA" + +# ***--------------------- 09_drivers ---------------------------------------- +# * (aug17): default drivers +cfg$gms$drivers <- "aug17" # def = aug17 +cfg$gms$c09_pop_scenario <- "SSP2" # def = SSP2 +cfg$gms$c09_gdp_scenario <- "SSP2" # def = SSP2 +# * options: SSP: "SSP1", "SSP2", "SSP2EU", "SSP3", "SSP4", "SSP5" +# * SDP: "SDP", "SDP_EI", "SDP_MC", "SDP_RC" +# * Note: SSP2EU a European Commission population/income scenario for +# * Ariadne project. SDP is same as SSP1 income, while SDP_EI, SDP_RC, SDP_MC +# * see different GDP trajectories as described in SHAPE project. + +# * Physical activity level scenario: +cfg$gms$c09_pal_scenario <- "SSP2" # def = SSP2 +# * options: SSP: "SSP1", "SSP2", "SSP2EU", "SSP3", "SSP4", "SSP5" +# * SDP: "SDP", "SDP_EI", "SDP_MC", "SDP_RC" + +# Year until which all parameters are fixed to SSP2 values +cfg$gms$sm_fix_SSP2 <- 2020 + +# Year until which all parameters affected by climate change are fixed to historical values +cfg$gms$sm_fix_cc <- 2020 + +# ***--------------------- 10_land ---------------------------------------- +# * (feb15): default land realization +# * (landmatrix_dec18): includes a land transition matrix +cfg$gms$land <- "landmatrix_dec18" # def = landmatrix_dec18 + +# * Artificial cost for balance variables (USD05MER per ha) +# * The balance variables in the land module avoid infeasibilities due to +# * differences in accuracy between parameters and variables in GAMS. +# * High costs make sure that the balance variables are only used as a last resort. +cfg$gms$s10_cost_balance <- 1000000 # def = 1000000 + + +# ***--------------------- 11_costs ------ -------------------------------- +# * (default): default cost realization +cfg$gms$costs <- "default" # def = default + +# ***--------------------- 12_interest_rate --------------------------------- +# * (select_apr20): regional interest rates dependent on development state +cfg$gms$interest_rate <- "select_apr20" # def = select_apr20 + +# * Interest rate scenario: +# * Options: coupling (exogenous interest rate) +# * gdp_dependent (regional interest rate dependent on development state) +# * Note: Currently, coupling is included as an option of an exogenous interest +# * rate scenario. It is currently not part of coupled runs with REMIND. +# * Note: In the gdp_dependent scenario, the selected interest rate fully takes +# * effect in 2050. It slowly starts fading in by 2025. +cfg$gms$c12_interest_rate <- "gdp_dependent" # def = "gdp_dependent" + +# * Interest rate coefficients: +# * The coefficients determine the regionally specific interest rate. They do +# * not represent the value of the interest rate. +# * The s12_interest_lic coefficient determines the intercept for future interest +# * rate determination. It represents the interest rate in low income countries. +cfg$gms$s12_interest_lic <- "0.1" # def = 0.1 +# * The s12_interest_hic determines the speed of interest rate adjustment for +# * future interest rates. It represents the interest rate in high income countries. +cfg$gms$s12_interest_hic <- "0.04" # def = 0.04 +# * Analog logic applies to historic interest rate coefficients +cfg$gms$s12_hist_interest_lic <- "0.1" # def = 0.1 +cfg$gms$s12_hist_interest_hic <- "0.04" # def = 0.04 +# * Note: It is also possible to choose a global interest rate by setting the +# * upper (s12_interest_lic) and the lower (s12_interest_hic) bound equal +# * This was formerly used for SSP runs and was set to SSP1, SSP5: 0.07 (hist), +# * 0.04 (future), SSP2: 0.07 (hist, future), SSP3: 0.07 (hist), 0.1 (future), +# * SSP4: s12_interest_lic=0.1, s12_interest_hic=0.04, s12_hist_interest_lic=0.07, +# * s12_hist_interest_hic=0.07 + +# * Regional interest rate policy scenario switch +# * Options: list of iso-codes of countries where above selected coefficients +# * should be in effect. +# * In all other countries, alternative coefficients (s12_interest_lic_noselect, s12_interest_hic_noselect, +# * s12_hist_interest_lic_noselect, s12_hist_interest_hic_noselect) that can be selected below +# * are in effect. +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +cfg$gms$select_countries12 <- all_iso_countries # def = all_iso_countries + +# * Interest rate coefficients for non-selected countries: +cfg$gms$s12_interest_lic_noselect <- "0.1" # def = 0.1 +cfg$gms$s12_interest_hic_noselect <- "0.04" # def = 0.04 +cfg$gms$s12_hist_interest_lic_noselect <- "0.1" # def = 0.1 +cfg$gms$s12_hist_interest_hic_noselect <- "0.04" # def = 0.04 + + +# ***--------------------- 13_tc ----------------------------------------- +# * (endo_jan22): endogenous technological change with full cost accounting and +# * stepwise updated crop and managed pastures area information +# * (exo): exogenous technological change (removes non-linearities from the model); +# * requires an existing model run with endo tc for generating the input file +# * f13_tau_scenario.csv +cfg$gms$tc <- "endo_jan22" # def = endo_jan22 + +# * tc cost scenario crops: low, medium or high +cfg$gms$c13_tccost <- "high" # def = medium + +# * ignore historical tau (1) or use it as lower bound (0) +cfg$gms$s13_ignore_tau_historical <- 1 # def = 1 + +# * Maximum regional tech cost expressed as share of regional GDP +# * A meaningful value would be 0.002. However, this bound causes infeasibilities in some cases. +# * Therefore, this bound is not used in the current model version. +cfg$gms$s13_max_gdp_shr <- Inf # def = Inf + + +# ***--------------------- 14_yield -------------------------------------- +# * (managementcalib_aug19): calibrate potential LPJmL-yields to FAO regional numbers, +# * pasture yields increase based on exogenous demand-side proxy +# * for growth rate of cattle stocks +cfg$gms$yields <- "managementcalib_aug19" # def = managementcalib_aug19 + +# * yield scenario +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c14_yields_scenario <- "nocc" # def = "cc" + +# * switch determing the effectivity of translating crop tc into pasture yield +# * increase. Value has to be in the range of 0 (no pasture yield growth) +# * and 1 (pasture yields increase linearily with tau). Only used in the realizations: +# * biocorrect (tc of current time step) and managementcalib (tc of previous time step). +cfg$gms$s14_yld_past_switch <- 0.25 # def = 0.25 + +# * Switch that allows selecting how yield calibration factors will be calculated. +# * If 0, crop yields calibration will be calculated as multiplicative relative values. +# * If 1, calibration values will be limited to additive absolute values when modeled yields strongly +# * underestimate historical values. For more information, read the description on the 'preloop' +# * file of module 14_yield. +# * options: 1 (limit to absolute values) +# * 0 (pure relative calibration) +cfg$gms$s14_limit_calib <- 1 # def = 1 + +# * Switch on scaling of irrigated yields to AQUASTAT irrigated-to-rainfed yield +# * ratio on regional scale +# NOTE: It is recommended to recalibrate the model when changing this setting! +cfg$gms$s14_calib_ir2rf <- 1 # def = 1 + +# ***--------------------- 15_food --------------------------------------- +# * (anthropometrics_jan18): estimates food using scenario dependent regression +# * and demography drivers +# * (anthro_iso_jun22): estimates food using scenario dependent regression +# * and demography drivers on iso level +cfg$gms$food <- "anthro_iso_jun22" # def = anthro_iso_jun22 + +# * switch between exogenous and endogenous food demand +# * options: 0 (exogenous food demand) and 1 (endogenous food demand) +cfg$gms$s15_elastic_demand <- 0 # def =0 + +# * maximal number of iterations between food and magpie model before +# * simulation proceeds to next time step +cfg$gms$s15_maxiter <- 5 # def = 5 + +# * convergence criteria: maximal allowed country-wise deviation in calculated +# * real income between iterations +cfg$gms$s15_convergence <- 0.005 # def = 0.005 + +# * food scenario for selected (and respectively not selected) countries +# * in scen_countries15 +# * options: SSP: "SSP1", "SSP2", "SSP3", "SSP4", "SSP5" +# * SRES: "A1", "A2", "B1", "B2" +# * OTHER: "PB" (planetary boundaries) +cfg$gms$c15_food_scenario <- "SSP2" # def = SSP2 +cfg$gms$c15_food_scenario_noselect <- "SSP2" # def = SSP2 + +# * Temporal development of ruminant meat share within the livestock food product +# * group (applied before food demand model is executed) +# * options: constant, halving2050, mixed +cfg$gms$c15_rum_share <- "mixed" # def = mixed + +# * Stronger ruminant fadeout in India +# * options: 0 (=off), 1 (=on) +cfg$gms$s15_rum_share_fadeout_india_strong <- 1 # def = 1 + +# * Milk share fadeout in India within the livestock food product +# * group (applied before food demand model is executed) +# * options: 0 (=off), 1 (=on) +cfg$gms$s15_milk_share_fadeout_india <- 1 # def = 1 + +# * Food substitution scenarios including functional forms, targets +# * and transition periods (applied after food demand model is executed) +# * options consist of 3 parts: functional form (lin,sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050) +# * Example for sigmoid_50pc_20_50: +# * Functional form: sigmoid (S-shaped) +# * Target: 50percent reduction at end of transition period (2050 in this case) +# * Transition period: start in 2020, end in 2050 +# * options: constant, +# * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, +# * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, +# * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 +cfg$gms$c15_rumscen <- "constant" # def = constant +cfg$gms$c15_fishscen <- "constant" # def = constant +cfg$gms$c15_alcscen <- "constant" # def = constant +cfg$gms$c15_livescen <- "constant" # def = constant +cfg$gms$c15_rumdairy_scp_scen <- "constant" # def = constant +cfg$gms$c15_rumdairyscen <- "constant" # def = constant + +# * Set items of kfo_rd. This option allows for sensitivity scenarios. +# * kfo_rd is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen (see above) +# * options: "livst_rum,livst_milk", "livst_rum" or "livst_milk" +cfg$gms$kfo_rd <- "livst_rum" #def = livst_rum + +# * Reduction of livestock products towards a kcal/cap/day intake target with or w/o substitution +# * maximum kcal/cap/day intake target used for downwards convergence of livestock products +cfg$gms$s15_kcal_pc_livestock_intake_target <- "430" # def = 430 +# * choice temporal fade-out towards s15_kcal_pc_livestock_intake_target +# * options: constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70 +cfg$gms$c15_livescen_target <- "constant" # def = constant +# * fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) +# * options: 0 (=fade-out), 1 (=substitution) +cfg$gms$s15_livescen_target_subst <- 1 # def = 1 + + +# ***** Start configuration of exogenous food intake and waste scenarios ***** +# +# +# * switch for transition to food waste scenarios +# * (1): transition towards exogenous food waste target +# * (0): regression-based estimation of food waste +cfg$gms$s15_exo_waste <- 0 # def = 0 +# +# * scenario target for the ratio between food demand and intake +# * only activated if s15_exo_waste is set to 1 +# * options: scalars >1 +# * (1.1): corresponds to 10% food waste ~ quarter waste of HIC +# * (1.2): corresponds to 20% food waste ~ half waste of HIC +cfg$gms$s15_waste_scen <- 1.2 # def = 1.2 + +# * switch for transition to exogenous diet scenarios (EAT Lancet and National Institute of Nutrition (NIN)) +# * (2): transition towards exogenous diets (NIN for India and EAT for other regions) +# * Please use this switch in combination with cfg$gms$c15_EAT_scen <- "FLX_hmilk" +# * If only India's diet needs to be changed, then set cfg$gms$scen_countries15 <- "IND" +# * (1): transition towards exogenous diets and food demand +# * (0): regression-based estimation of diets and food demand +cfg$gms$s15_exo_diet <- 0 # def = 0 + +# * exogenous calorie scenario (EAT Lancet diet scenarios) +# * only activated if s15_exo_diet is set to 1 +# * options: healthy_BMI, 2100kcal, 2500kcal, +# * endo, no_underweight, no_overweight +# * half_overweight, no_underweight_half_overweight +# * healthy_BMI: all people have a BMI of 20-25 +# * no_underweight: all people with BMI<20 have a BMI 20-25 +# * no_overweight: all people with BMI>25 have a BMI 20-25 +# * half_overweight: number of people with BMI>25 is halved compared to baseline (have BMI 20-25 instead) +# * no_underweight_half_overweight: combination of no_underweight and half_overweight +# * endo: no changes with respect to endogenous BMI +# * 2100kcal, 2500kcal: an exogenous target of 2100 or 2500 kcal, all +# * people have a BMI 20-25. +cfg$gms$c15_kcal_scen <- "healthy_BMI" # def = healthy_BMI +# +# * exogenous food-specific diet scenario (EAT Lancet diet scenarios) +# * only activated if s15_exo_diet is set to 1 +# * options: BMK, FLX, PSC, VEG, VGN, FLX_hmilk, FLX_hredmeat +cfg$gms$c15_EAT_scen <- "FLX" # def = FLX + +# * Subspecifications: Which commodities shall be included in the diet shift +# * towards cfg$gms$c15_EAT_scen ? Only selected (1) commodities will be +# * included, while the others will remain to be endogenous. +# * Any shift will be compensated to reach the calorie target by adjusting +# * staple calories. +cfg$gms$s15_exo_monogastric <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_ruminant <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_fish <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_fruitvegnut <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_pulses <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_sugar <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_oils <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_brans <- 1 # def = 1, options: 0,1 +cfg$gms$s15_exo_scp <- 1 # def = 1, options: 0,1 + +# * Scenario target for the inclusion of alcohol in the EAT-Lancet diet +# * The EAT-Lancet diet only allows for added sugars, but does not include processed food or +# * alcohol. +# * only activated if s15_exo_diet is set to 1 +cfg$gms$s15_exo_alcohol <- 1 # default: 1 +# * Via 's15_alc_scen' a maximum target for alcohol consumption can be defined. +# * (0): no alcohol consumption, as in the original version of the EAT-Lancet diet +# * (0.014): maximum target for alcohol consumption is 1.4% of total calorie consumption +# * (see Lassen et al., 2020) +cfg$gms$s15_alc_scen <- 0.014 # def = 0.014 +# +# +# * Switch and specification of countries for which exogenous food scenarios +# * (EAT Lancet diet and food waste scenarios), food substitution scenarios and +# * c15_food_scenario shall be applied +# * Options: list of iso-codes of countries where exogenous scenario should be +# * in effect +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +cfg$gms$scen_countries15 <- all_iso_countries +# +# * Transition to exogenous food intake and waste scenarios including functional forms, targets +# * and transition periods (applied after the food demand model is executed). The resulting scenario +# * parametrisation is a linear combination of the default MAgPIE parametrisation and the exogenous +# * scenario data input. +# * Options consist of 3 parts: functional form (lin, sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc; +# * pc: percent) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050). +# * The target defines the relative contribution of the default MAgPIE parametrisation, e.g. zero +# * defines a full transition to the exogenous scenario data input. +# * Examples with target year y2030: lin_zero_20_30 +# * Examples with target year y2050: lin_zero_20_50 +# * Examples with target year y2070: lin_zero_20_70 +# * For the full list of available options, see information on food substitution scenarios above. +# * Only active if at least one of the exogenous food intake and waste scenario +# * switches (s15_exo_diet and s15_exo_waste) is set to 1. +cfg$gms$c15_exo_foodscen <- "lin_zero_20_50" # def = lin_zero_20_50 +# ***** End configuration of exogenous food intake and waste scenarios ***** + + +# * calibration to historical values +# * options: 0, 1 +cfg$gms$s15_calibrate <- 1 # def = 1 + + +# ***--------------------- 16_demand ------------------------------------- +# * (sector_may15): default for flexible regions +cfg$gms$demand <- "sector_may15" # def = sector_may15 + +# ***--------------------- 17_production --------------------------------- +# * (flexreg_apr16): default production aggregation +cfg$gms$production <- "flexreg_apr16" # def = flexreg_apr16 + +#* Additional switch to initialize cellular production +# * (on) : it initializes cellular production +# * (off) : it does not initialize cellular production +cfg$gms$c17_prod_init <- "on" # default = on + +# ***--------------------- 18_residues ----------------------------------- +# * (flexreg_apr16): detailed residue calculations +# * (off): off +cfg$gms$residues <- "flexreg_apr16" # def = flexreg_apr16 + +# * residue on field burning +# * options: phaseout - phaseout of residue burning to minimum burn share (0-10%) +# * constant - constant shares of on field burning (15-25%) +cfg$gms$c18_burn_scen <- "phaseout" # def = phaseout + + +# ***--------------------- 20_processing --------------------------------- +# * (substitution_may21) : processing with couple products allowing for substitution +# * (off): off +cfg$gms$processing <- "substitution_may21" # def = substitution_may21 + + +# * SCP route +# * single-cell microbial protein production route +# * options: mixed, methane, sugar, cellulose, hydrogen +# * Mapping of scp route to feedstock: methane:foddr, sugar:sugar_cane, cellulose:begr +# * Note that hydrogen does not require land-based inputs +# * Mixed assumes equal shares of methane, sugar, cellulose and hydrogen +cfg$gms$c20_scp_type <- "sugar" # def = sugar + +# ***--------------------- 21_trade -------------------------------------- +# * (free_apr16): free trade without restrictions +# * (off): no trade at all +# * (exo): exogenously prescribed trade +# * (selfsuff_reduced): self-sufficiency based trade with trade costs related +# * to exports +cfg$gms$trade <- "selfsuff_reduced" # def = selfsuff_reduced + +# * trade balance reduction scenario +# * (l909090r808080): 10 percent trade liberalisation for secondary and +# * livestock products in 2030,2050,2100 and 20 percent for +# * crops +# * (l908080r807070): livestock/secondary: 10% in 2030, 20% in 2050,2100 +# * crops: 20% in 2030, 30% in 2050,2100 +# * (l909595r809090): livestock/secondary: 10% in 2030, 5% in 2050,2100 +# * crops: 20% in 2030, 10% in 2050,2100 +# * Initial values for the trade balance reduction in 1995 are 1, i.e. all trade in +# * 1995 happens through the self-sufficiency pool. For later time steps, additional +# * scenarios of trade liberalization (i.e. of allocation to the comparative advantage pool) +# * are implemented based on Schmitz et al. 2012 (also described in Popp et al. 2017) + +cfg$gms$c21_trade_liberalization <- "l909090r808080" # def = l909090r808080 + +# * whether trade tariff should be considered at all +# * (0) without trade tariff +# * (1) with trade tariff +cfg$gms$s21_trade_tariff <- 1 # def =1 + +# * whether to fade out trade tariffs (bilateral trade realization) # def = 0 +cfg$gms$s21_trade_tariff_fadeout <- 0 + +# * start year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2020 +cfg$gms$s21_trade_tariff_startyear <- 2020 + +# * end year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2050 +cfg$gms$s21_trade_tariff_targetyear <- 2050 + +# ***--------------------- 22_land_conservation -------------------------------------- +# * (area_based_apr22): Area-based conservation (baseline and future) +# * based on WDPA and conservation priority areas +cfg$gms$land_conservation <- "area_based_apr22" # def = area_based_apr22 + +# * Additional land conservation target based on conservation priority areas +# * during future time steps (after `cfg$gms$sm_fix_SSP2`). +# * ("none") No additional land conservation target (WDPA only) +# * ("30by30") 30 % of global land surface in Key Biodiversity Areas (KBA), +# * GSN Distinct Species Assemblages & Critical Connectivity Areas + WDPA +# * ("KBA") Key Biodiversity Areas + WDPA +# * ("GSN_DSA") Global Safety Net: Distinct Species Assemblages + WDPA +# * ("GSN_RarePhen") Global Safety Net: Rare Phenomena + WDPA +# * ("GSN_AreaIntct") Global Safety Net: Areas of Intactness + WDPA +# * ("GSN_ClimTier1") Global Safety Net: Climate Stabilisation Tier 1 + WDPA +# * ("GSN_ClimTier2") Global Safety Net: Climate Stabilisation Tier 2 + WDPA +# * ("CCA") Critical Connectivity Areas (Brennan et al. 2022) + WDPA +# * ("IrrC_XXpc") Land area that covers XX percent of total global irrecoverable carbon +# * as defined by Noon et al. (2022), where XX correponds to either +# * 50, 75, 95, or 99 percent + WDPA +# * ("IrrC_XXpc_30by30") 30by30 + Land area that covers XX percent of total global irrecoverable +# * carbon as defined by Noon et al. (2022), where XX correponds to either +# * 50, 75, 95, or 99 percent + WDPA +# * ("BH") Biodiversity Hotspots + WDPA +# * ("IFL") Intact Forest Landscapes + WDPA +# * ("BH_IFL") Biodiversity Hotspots + Intact Forest Landscapes + WDPA +# * ("GSN_HalfEarth") Full protection of areas within the Global Safety Net, which +# * roughly corresponds to 50 percent of the global land surface +# * ("PBL_HalfEarth") Ecoregion-based approach to protecting half of the global land surface +# * Note: c22_protect_scenario applies to countries selected in policy_countries22 +# * c22_protect_scenario_noselect applies to all other countries. +cfg$gms$c22_protect_scenario <- "none" # def = None +cfg$gms$c22_protect_scenario_noselect <- "none" # def = None +# * Switch and specification of countries for which land conservation policies in +# * c22_protect_scenario apply. +# * Options: list of iso-codes of countries where land conservation should be applied +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +cfg$gms$policy_countries22 <- all_iso_countries + +# * Whether land restoration is carried out in areas targeted by land conservation +# * (1) Land is fully restored in conservation priority areas +# * (0) Only remaining forest and other land areas are conserved +cfg$gms$s22_restore_land <- 1 # def = 1 + +# * Start and target year of land conservation option ('c22_protect_scenario'). +# * Defines when full protection based on 'future options' is reached, using a +# * sigmoidal trajectory. NOTE: This switch is only relevant +# * if one of the 'future options' (e.g. BH) is chosen. +# * Start year: +cfg$gms$s22_conservation_start <- 2020 # def = 2020 +# * Target year (year when full protection is reached): +cfg$gms$s22_conservation_target <- 2030 # def = 2030 + +# ***--------------------- 29_ageclass ----------------------------------- +# * (feb21): Distribution of age-classes according to Poulter et al 2018 +cfg$gms$ageclass <- "feb21" # def = feb21 + +# ***--------------------- 30_crop --------------------------------------- +# * (endo_apr21): Hard rotational constraints. Dynamic cropland and detailed cropland availability data at grid cell level. +# * (rotation_apr22): hard rotational constraints and fallow constraints with the option of different future scenarios. Dynamic cropland and detailed cropland availability data at grid cell level. +# * (penalty_apr22): rotational and fallow constraints are incentivized via penalty payments. Dynamic cropland and detailed cropland availability data at grid cell level. +# NOTE: It is recommended to recalibrate the model when changing this setting! +cfg$gms$crop <- "endo_apr21" # def = endo_apr21 +# * (c30_bioen_type): switch for type of bioenergy crops; options: begr, betr, all +cfg$gms$c30_bioen_type <- "all" # def = "all" +# * (c30_bioen_water): switch for irrigation of bioenergy crops; options: rainfed, irrigated, all +cfg$gms$c30_bioen_water <- "rainfed" # def = "rainfed" +# * (c30_rotation_constraints): switch for rotational constraints: on, off +cfg$gms$c30_rotation_constraints <- "on" # def = "on" +# * (c30_rotation_scenario): scenarios for constraints. +# * In realization rotation_apr22: min (minimal constraints), default (best guess), good (good practice), +# * good_20div (good practice - 20% for other crops), setaside (default plus fallow), +# * legumes (minimum share of legumes), agroforestry (minimum share of perennials), sixfoldrotation +# * (crops can only repeat after 6 years), agroecology (mix of previous scenarios) +# * In realization penalty_apr22: none (no incentives), default (best guess), fallow (increased fallow incentives), +# * legumes (increased incentives for legumes), agroforestry (increased incentives for perennials), agroecology (mix) +# * In realization endo_apr21: no scenarios exist. +cfg$gms$c30_rotation_scenario <- "default" # def = "default" +# * Year by which rotation scenario is fully implemented: +# * Start year: +cfg$gms$s30_rotation_scenario_start <- 2020 # def = 2020 +# * Target year (year when full implementation is reached): +cfg$gms$s30_rotation_scenario_target <- 2050 # def = 2050 + + +# * Switch to determine whether marginal land (suitability index below 0.33) should be included +# * in the total available cropland. Options are: +# * ("all_marginal"): All marginal land can be used for crop cultivation +# * ("q33_marginal"): The bottom tertile of marginal land is excluded +# * ("no_marginal"): Marginal land is completely excluded from crop cultivation +# * Note: Option "q33_marginal" produces the highest spatial correlation +# * with observed cropland patterns and is recommended for productive runs. +cfg$gms$c30_marginal_land <- "q33_marginal" # def = "q33_marginal" + +# * Share of available cropland that is withheld for maintaining semi-natural vegetation (SNV) +# * in cropland areas, including grassland, forest and other land. For example, +# * a share of 0.2 corresponds to 20 % of SNV in terms of the available cropland. +# * Accepted values are between 0 and 1 +# Note: s30_snv_shr applies to countries selected in policy_countries30 +# s30_snv_shr_noselect applies to all other countries. +cfg$gms$s30_snv_shr <- 0 # def = 0 +cfg$gms$s30_snv_shr_noselect <- 0 # def = 0 +# * Year by which SNV policy ('s30_snv_shr') is fully implemented. +# * Start year: +cfg$gms$s30_snv_scenario_start <- 2020 # def = 2020 +# * Target year (year when full implementation is reached): +cfg$gms$s30_snv_scenario_target <- 2030 # def = 2030 +# * Switch and specification of countries for which SNV policy in +# * s30_snv_shr apply. +# * Options: list of iso-codes of countries where SNV policy should be applied +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +cfg$gms$policy_countries30 <- all_iso_countries +# * Land types included in the SNV policy. This option allows for sensitivity analyses. +# * plausible options: "secdforest, forestry, past, other", +# * "secdforest, other", +# * "secdforest, past, other" etc. +cfg$gms$land_snv <- "secdforest, forestry, past, other" #def = "secdforest, forestry, past, other" + +# * (s30_annual_max_growth): Additional cropland per year per region, relative to the current cropland level (e.g., 0.02 -> 10.4% allowed growth between 2020 and 2025, relative to 2020 cropland area) +cfg$gms$s30_annual_max_growth <- 0.02 # def = Inf + +# ***--------------------- 31_past --------------------------------------- +# * (static): static pasture +# * (endo_jun13): dynamic pasture +# * (grasslands_apr22): Grassland management separating managed pastures from rangelands +# NOTE: It is recommended to recalibrate the model when changing this setting! +cfg$gms$past <- "endo_jun13" # def = endo_jun13 + +# * Factor requirements (USD04 per ton DM) +cfg$gms$s31_fac_req_past <- 1 # def = 1 + +# * switch for unequal (1) or equal (0) sign in pasture production constraint q31_prod. +# * unequal means that pasture production can be lower than pasture area x pasture yield, +# * reflecting that not all pasture area is grazed. +cfg$gms$s31_unequal <- 1 # def = 1 + +# * SSP scenario switch for pasture suitability areas (only take effect for realization grasslands_apr22) +# * options: ssp126, ssp245, ssp370, ssp460, ssp585 +cfg$gms$c31_past_suit_scen <- "ssp370" # def = "ssp370" + +# * Switch that allows selecting how yield calibration factors will be calculated. +# * If 0, grassland yield calibration will be calculated as multiplicative relative values. +# * If 1, calibration values will be limited to additive absolute values when modeled yields strongly +# * underestimate historical values. For more information, read the description on the 'preloop' +# * file of module 31_past. + +# * options: 1 (limit to absolute values) +# * 0 (pure relative calibration) +cfg$gms$s31_limit_calib <- 1 # def = 1 + +# ***--------------------- 32_forestry ----------------------------------- +# * (dynamic_feb21): Dynamic forestry sector including afforestation with detailed age-classes +cfg$gms$forestry <- "dynamic_feb21" # def = dynamic_feb21 + +# * afforestation planing horizon (years) +cfg$gms$s32_planing_horizon <- 50 # def = 50 + +# * Settings for CO2 price driven afforestation (Growth curve and BII) + +# * Growth curve for CO2 price driven afforestation +# * Switch for using natural vegetation (0) or plantation (1) growth curves towards LPJmL natural +# * vegetation carbon density. +# * Afforestation following plantation growth curves reflects managed or assistent regrowth, +# * and might also include non-native species. +cfg$gms$s32_aff_plantation <- 0 # def = 0 + +# * BII coefficient for CO2 price driven afforestation +# * Switch for using secondary vegetation (0) or timber (1) BII coefficients for CO2 price driven afforestation +# * The recommend setting is to map the BII coefficient to the choice of the growth curve. +# * natural vegetation growth curve (0): secondary vegetation BII coefficient (0) +# * plantation growth curve (1): timber BII coefficient (1) +# * However, afforestation with plantations (1) could possibly be done in a biodiversity friendly way (0) +cfg$gms$s32_aff_bii_coeff <- 0 # def = 0 + +# Afforestation policy +# * ("none"): no prescribed afforestation +# * ("npi"): prescribed afforestation based on NPI policies +# * ("ndc"): prescribed afforestation based on NPI+NDC policies +cfg$gms$c32_aff_policy <- "npi" # def = "npi" + +# Maximum total global afforestation in Mha (Inf = no constraint) +# Note 1: the limit applies to the sum of endogenous CO2 price driven and exogenous NPI/NDC afforestation +# Note 2: a limit of 0 or below the level of exogenous NPI/NDC afforestation will be a automatically raised to the level of exogenous NPI/NDC afforestation +cfg$gms$s32_max_aff_area <- Inf # def = Inf + +# Protection of afforested areas (endogenous CO2 price driven) +# 0=until end of planning horizon (see s32_planing_horizon) +# 1=forever +cfg$gms$s32_aff_prot <- 0 # def = 0 + +# Type of afforestation constraint +cfg$gms$s32_max_aff_area_glo <- 1 # def = 1 +# * (1): global limit based on s32_max_aff_area +# * (0): regional limit based on the input file "f32_max_aff_area.cs4" + +# Switch to determine whether afforestation should be limited to +# certain latitudinal zones +# * ("unrestricted"): No regions excluded +# * ("noboreal"): Exclude boreal regions > 50deg N +# * ("onlytropical"): Afforestation only in tropical areas 20deg S-20deg N +cfg$gms$c32_aff_mask <- "noboreal" # def = "noboreal" + +# Switch to determine whether biogeophysical responses to +# afforestation should be considered +# If this endogenous bgp effect is considered it is adviced to use the +# unrestricted afforestation mask +# to avoid superimposing the additional exogeneous bgp implementation +# * ("nobgp"): No biogeophysical influences +# * ("ann"): Annual BGP +# * ("djf"): Boreal winter BGP December January February +# * ("jja"): Boreal summer BGP June July August +cfg$gms$c32_aff_bgp <- "nobgp" # def = "nobgp" + +# Switch for the different TCRE estimates which are used to +# translate the BGP temperature effect into their carbon equivalent. +# The estimates encompass the ensemble mean +/- SD of 20 CMIP5 models. +# Ceq ~ BGP/TCRE - Hence, high TCRE decreases the BGP effect. +# * ("ann_TCREmean"): Ensemble mean +# * ("ann_TCREhigh"): Ensemble mean + SD +# * ("ann_TCRElow"): Ensemble mean - SD +cfg$gms$c32_tcre_ctrl <- "ann_TCREmean" + +# Switch for dynamic timber plantations +# "off" means that timber plantations are initialized in the highest +# age class and that there is no regrowth seen in such plantations. +# In addition, timber plantations are fixed to 1995 levels in the "off" case. +# In other cases, age-classes in timber plantations are initialized based on +# rotation length and can change dynamically over time. +# Note that this switch has no effect in the "static_sep16" realization, +# in which forestry area is assumed static. +# * 0= off +# * 1= Equal distribution +# * 2= FAO distribution based on planted forest estimates 2006 +# * 3= Poulter distribution +# * 4= Manual distribution - Similar to equal distribution but higher weight on +# * younger age-classes as plantation areas increase strongly +# * in recent history (ca. >1990). +cfg$gms$s32_initial_distribution <- 0 # def = 0 + +# Switch fore regional or global interest rate for rotation length calculations. +# Using the global setting would mean that the timber plantation decisions are +# decoupled from other decisions in the model which are based on regional interest +# rates. +# * ("regional") = Regionally differentiated interest rates +# * ("global") = One global interest rate +cfg$gms$c32_interest_rate <- "regional" # def = "regional" + +# Global interest rate for plantations in case c32_interest_rate switch is global +# Accepted values between 0 and 1. +cfg$gms$s32_forestry_int_rate <- 0.05 # def = 0.05 + +# Scenarios for using FAO scenarios of future proportion of production coming from +# Timber plantations used for deciding how much establishment should be made in +# simulation time step. This setting is only used when s32_hvarea is set to 2 ("Endogenous") +# * ("abare") = Global outlook for plantations. Australian Bureau of Agriculture and Resource Economics (ABARE) and Jaakko Pöyry Consulting 1999 +# * ("brown") = The global outlook for future wood supply from forest plantations. Working paper GFPOS/WP/03 prepared for the 1999 Global Forest Products Outlook Study 1999 +cfg$gms$c32_dev_scen <- "abare" # def = "abare" + +# Scenarios for future development of timber production contribution to roundwood demand +# based on the settings from c32_dev_scen. +# * ("constant") = Constant share over time (1995-2250) +# * ("h5s5l5") = In every time step 5% increase from 1995 till 2020, 5% increase from 2025 till 2050, 5% increase from 2055 till 2250 +# * ("h5s2l2") = In every time step 5% increase from 1995 till 2020, 2% increase from 2025 till 2050, 2% increase from 2055 till 2250 +# * ("h5s2l1") = In every time step 5% increase from 1995 till 2020, 2% increase from 2025 till 2050, 1% increase from 2055 till 2250 +# * ("h5s1l1") = In every time step 5% increase from 1995 till 2020, 1% increase from 2025 till 2050, 1% increase from 2055 till 2250 +# * ("h5s1l05") = In every time step 5% increase from 1995 till 2020, 1% increase from 2025 till 2050, 0.5% increase from 2055 till 2250 +# * ("h2s1l05") = In every time step 2% increase from 1995 till 2020, 1% increase from 2025 till 2050, 0.5% increase from 2055 till 2250 +cfg$gms$c32_incr_rate <- "h5s2l1" # def = "h5s2l1" + +# Harvesting switch for timber production +# * 0 = No harvested area from plantations, no age-class shifting (area held constant at 1995 levels) +# * This also means that no harvesting or establishment of new plantations takes place. +# * 1 = "Exogenous" scenario. Harvested area from plantations but with age-class shifting +# * All timber plantations are harvested at rotation age and are re-established +# * such that the total plantation area remains constant. +# * 2 = "Endogenous" scenario. Harvest from plantations including age-class shifting +# * All plantations are harvested at rotation age. Plantation establishment is endogenous. +cfg$gms$s32_hvarea = 0 # def = 0 + +# Type of rotation length selection criteria +# * ("mean_annual_increment") = Harvesting when the average annual increment is maximum +# * ("current_annual_increment") = Harvesting when the marginal increment is maximum +# * ("instantaneous_growth_rate") = Harvest when instantaneous growth rate is equal to interest rate + +cfg$gms$c32_rot_calc_type <- "current_annual_increment" + +# Generic forest shock scenarios. Disturbance sets percentage of all age classes back to 0 +# * ("none") No disturbance applied +# * ("002lin2030") Disturbance applied to 0p2 percent per year linear phase-in over 20yrs from 0 in 2030 +# * ("004lin2030") Disturbance applied to 0p4 percent per year linear phase-in over 20yrs from 0 in 2030 +# * ("008lin2030") Disturbance applied to 0p8 percent per year linear phase-in over 20yrs from 0 in 2030 +# * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 +cfg$gms$c32_shock_scenario = "none" # def = "none" + +# * Prohibit rapid afforestation early on +cfg$gms$s32_max_aff_cell_2025 <- 0.005 # def = inf #0.005 = globally 1Mha Aff allowed in 2025 + +# ***--------------------- 34_urban --------------------------------------- +# * 34_urban includes urban land +# * (static) static urban land fixed on 1995 patterns from LUH2v2 +# * (exo_nov21) has exogenous future urban land patterns based on LUH2v2 +cfg$gms$urban <- "exo_nov21" # def = exo_nov21 + +# * Additional settings for exo_nov21 realization only: +cfg$gms$c34_urban_scenario <- "SSP2" # def = SSP2 +# * options: SSP: "SSP1", "SSP2", "SSP3", "SSP4", "SSP5" + +# ***--------------------- 35_natveg -------------------------------------- +# * 35_natveg includes primforest, secdforest and other land +# * (dynamic_feb21): Dynamic natural vegetation land with detailed age-classes +cfg$gms$natveg <- "dynamic_feb21" # def = dynamic_feb21 + +# Avoided Deforestation policy +# * ("none"): no avoided deforestation +# * ("npi"): avoided deforestation based on NPI policies +# * ("ndc"): avoided deforestation based on NPI+NDC policies +cfg$gms$c35_ad_policy <- "npi" # def = "npi" + +# Avoided Other Land Conversion policy +# * ("none"): no avoided other land conversion +# * ("npi"): avoided other land conversion based on NPI policies +# * ("ndc"): avoided other land conversion based on NPI+NDC policies +cfg$gms$c35_aolc_policy <- "npi" # def = "npi" + +# Distribution of age-classes during secondary forest initialization +# * (0): All secondary forest belongs to highest age class +# * (1): Equal distribution of secondary forest in all age-classes +# * (2): Distribution of secondary forest according to Poulter et al 2018 based on MODIS satellite data +cfg$gms$s35_secdf_distribution <- 0 # def = 0 + +# Damages in natural forests +# * (0): No damage simulated +# * (1): Damage from shifting agriculture (constant) +# * (2): Damage from shifting agriculture is faded out by the year defined in 'cfg$gms$c35_forest_damage_end' +# * (4): Generic forest disturbance scenarios defined in `f35_forest_shock.csv` +cfg$gms$s35_forest_damage <- 2 # def = 2 +# * If option (2) above: Year by which damage from shifting agriculture has petered out +cfg$gms$s35_forest_damage_end <- 2050 #def = 2050 + +# Harvesting switch for timber production +# * 0 = No timber production from natveg, no age-class shifting +# * 1 = No timber production from natveg but with age-class shifting +# * 2 = Timber production from natveg including age-class shifting +cfg$gms$s35_hvarea <- 0 # def = 0 + +# Generic forest shock scenarios. Disturbance sets percentage of all age classes back to 0 +# * ("none") No disturbance applied +# * ("002lin2030") Disturbance applied to 0p2 percent per year linear phase-in over 20yrs from 0 in 2030 +# * ("004lin2030") Disturbance applied to 0p4 percent per year linear phase-in over 20yrs from 0 in 2030 +# * ("008lin2030") Disturbance applied to 0p8 percent per year linear phase-in over 20yrs from 0 in 2030 +# * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 +cfg$gms$c35_shock_scenario = "none" # def = "none" + +# ***--------------------- 36_employment ------------------------------- +# * This module calculates agricultural employment. +# * (exo_may22): employment is calculated based on labor costs and not affecting the +# * optimization +cfg$gms$employment <- "exo_may22" # default = "exo_may22" + +# * global minimum wage in USDMER05 per hour that needs to be reached in all countries by 2050 +cfg$gms$s36_minimum_wage <- 0 # default = 0 (no minimum wage) + +# * A scenario that increases wages can either be fully related to productivity increase +# * (leading to lower employment for the same total labor costs), or keep productivity +# * constant (leading to the same employment for higher total labor costs), or to a +# * mixture between productivity increase an total labor cost increase. +# * The scalar `s36_scale_productivity_with_wage` describes how high the labor productivity +# * gain should be relative to the increase in hourly labor costs. If set to 0, +# * productivity stays constant, if set to 1 productivity scales proportional to hourly +# * labor costs. Other positive values lead to a mixture of productivity gain and increase +# * in total costs. +cfg$gms$s36_scale_productivity_with_wage <- 0 # default = 0 + +# ***--------------------- 37_labor_prod --------------------------------- +# * This module provides a labour productivity factor (0-1), +# * which reflects the efficiency of labour under changing environmental conditions (1 = no change). +# * The labour productivity factor is currently only considered in the sticky_labor +# * realization of the [38_factor_costs] module. +# * (off): labor productivity factor fixed to 1 +# * (exo): labor productivity factor is affected by climate change impacts +cfg$gms$labor_prod <- "off" # default = off + +# * Additional setting for exo realization only: +# * Climate change impact scenario. Options: "rcp119", "rcp585" +cfg$gms$c37_labor_rcp <- "rcp119" # default = "rcp119" +# * Heat assessment metric. Options: "ISO", "HOTHAPS" +cfg$gms$c37_labor_metric <- "ISO" # default = "ISO" +# * Labour intensity. Options: "300W", "400W" +cfg$gms$c37_labor_intensity <- "400W" # default = "400W" +# * Uncertainty over ESMs. Options: "enslower", "ensmean", "ensupper" +cfg$gms$c37_labor_uncertainty <- "ensmean" # default = "ensmean" + +# ***--------------------- 38_factor_costs ------------------------------- +# * Make sure you use the corresponding calibration file to the selected realization +# * Please, check details in input settings. +# * (per_ton_fao_may22) factor costs fixed per ton +# * (sticky_feb18) factor costs including investments in capital +# * (sticky_labor) based on sticky_feb18 + labor productivity factor included +# NOTE: It is recommended to recalibrate the model when changing this setting! +# NOTE: In case the maximum number of iterations is reached without convergence +# in the calibration, please consider to use the best_calib setting for the calibration run +cfg$gms$factor_costs <- "per_ton_fao_may22" # default = per_ton_fao_may22 + +# * Regional (reg) or global (glo) factor requirements (applicable for per_ton_fao_may22, +# * sticky_feb18, sticky_labor). The regional version keeps factor requirements constant +# * after 2010, the global version uses values from 2005 for all years. Typically, the +# * same version (glo or reg) should be chosen for c70_fac_req_regr for consistency. +# NOTE: It is recommended to recalibrate the model when changing this setting! +cfg$gms$c38_fac_req <- "glo" # default "glo" + + +# * Only relevant for sticky_labor implementation: + +# * Year until which the capital share should be fixed to the historical values, not allowing for endogenous +# * substitution between labor and capital. +cfg$gms$s38_startyear_labor_substitution <- 2020 # default 2020 + +# * The following two settings are to create exogenous scenarios in which capital is substituted by labor to increase +# * employment: +# * The taget labor share defins a global target for labor share out of labor + capital needed per unit +# * of output. If 0, no target is set. +cfg$gms$s38_target_labor_share <- 0 # default 0 + +# * The target year defines the year for which the global target labor share should be set. +cfg$gms$s38_targetyear_labor_share <- 2050 + +# * The target fulfillment share indicates the share by which a region moves from its baseline +# * labor share towards the target value +cfg$gms$s38_target_fulfillment <- 0.5 # default 0.5 + +# ***--------------------- 39_landconversion ----------------------------- +# * (calib): Costs for cropland expansion are scaled with a regional calibration factor +# * Costs for pasture and forestry expansion are global static +cfg$gms$landconversion <- "calib" # def = calib +# * Cost for cropland expansion before calibration (USD05MER per hectare) +cfg$gms$s39_cost_establish_crop <- 10000 #def = 10000 +# * Reward for cropland reduction before calibration (USD05MER per hectare) +cfg$gms$s39_reward_crop_reduction <- 6000 +# * Cost for pasture land expansion (USD05MER per hectare) +cfg$gms$s39_cost_establish_past <- 8000 #def = 8000 +# * Cost for foresty land expansion (USD05MER per hectare) +cfg$gms$s39_cost_establish_forestry <- 1000 #def = 1000 +# * Cost for urban land expansion (USD05MER per hectare) +cfg$gms$s39_cost_establish_urban <- 10000 #def = 10000 +# * Switch for ignoring land conversion cost calibration factors +# * Options: 1 (ignore calibration factors) +# * 0 (use calibration factors) +cfg$gms$s39_ignore_calib <- 0 #def = 0 + +# ***--------------------- 40_transport ---------------------------------- +# * (off): no transport costs +# * (gtap_nov12): transport costs applied to crops and ruminant livestock +# * products calibrated based on magpie-output (dynamic pasture) +# * to match GTAP data +cfg$gms$transport <- "gtap_nov12" # def = gtap_nov12 + +# * scalar to introduce pasture transport costs +cfg$gms$s40_pasture_transport_costs <- 0 # def = 0 + +# ***--------------------- 41_area_equipped_for_irrigation --------------- +# * (static): no expansion +# * (endo_apr13): endogenous, cost driven expansion +cfg$gms$area_equipped_for_irrigation <- "endo_apr13" # def = endo_apr13 + +# * switch for initialization area +# * (LUH2v2): area equipped for irrigation based on LUH2v2 irrigated areas +# * (Mehta2022): area equipped for irrigation from Mehta et al. (2022) +cfg$gms$c41_initial_irrigation_area <- "LUH2v2" # def = LUH2v2 + +# * Sets the rate of depreciation of irrigation infrastructure in every timestep. +# * Only applicable when (endo_apr13) realization is selected +cfg$gms$s41_AEI_depreciation <- 0 # def = 0 + + +# ***--------------------- 42_water_demand -------------------------------- +# * (agr_sector_aug13): fixed fraction of water available is reserved +# * for other uses +# * (all_sectors_aug13): manufacturing, electricity and domestic demand are +# * retrieved from WATERGAP data. +cfg$gms$water_demand<- "all_sectors_aug13" # def = all_sectors_aug13 + +# * water demand scenario +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c42_watdem_scenario <- "cc" # def = "cc" + +# * Choice of fraction of available water that is not +# * available for agriculture (only affects agr_sector_aug13 realization) +cfg$gms$s42_reserved_fraction <- 0.5 # def = 0.5 + +# * Scenario for non agricultural water demand from WATERGAP +# * (only affects all_sector_aug13 realization) +# * (1): ssp1 +# * (2): ssp2 +# * (3): ssp3 +cfg$gms$s42_watdem_nonagr_scenario <- 2 # def = 2 + +# * Switch to determine the irrigation efficiency scenario +# * (1): global static value +# * (2): regional static values from gdp regression +# * (3): gdp driven increase +cfg$gms$s42_irrig_eff_scenario <- 2 # def = 2 + +# * Irrigation efficiency +# * (Only used if global static value is requested) +cfg$gms$s42_irrigation_efficiency <- 0.66 # def=0.66 + +# * Environmental flow protection policy +# * (off): no EFP policy +# * (on): global EFP policy +# * (mixed): EFP policy only in hic regions +cfg$gms$c42_env_flow_policy <- "off" # def = "off" + +# * Start and target year of environmental flow protection policy ('c42_env_flow_policy'). +# * Defines when linear fading in of policy starts and when the target of +# * full protection based on 's42_env_flow_scenario' is reached +# * Start year: +cfg$gms$s42_efp_startyear <- 2020 # def = 2020 +# * Target year (year when full protection is reached): +cfg$gms$s42_efp_targetyear <- 2040 # def = 2040 + +# * Switch and specification of countries for which environmental flow policy +# * shall apply. +# * Options: list of iso-codes of countries where EFP should be in effect. +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +cfg$gms$EFP_countries <- all_iso_countries # def = all_iso_countries + +# * Environmental flow protection scenario +# * (0): do not consider environmental flows. +# * s42_env_flow_base_fraction and +# * s42_env_flow_fraction have no effect. +# * (1): Reserve a certain fraction of available water +# * specified by s42_env_flow_fraction for +# * environmental flows +# * (2): Each grid cell receives its own value for +# * environmental flow protection based on LPJ +# * results and a calculation algorithm by Smakhtin 2004. +# * s42_env_flow_fraction has no effect. +cfg$gms$s42_env_flow_scenario <- 2 # def = 2 + +# * Fraction of available water that is reserved for the environment +# * in case of a protection policy +# * In which regions and timesteps a protection policy is in place is determined +# * in the file EFR_protection_policy.csv in the input folder +# * of the 42_water_demand module +cfg$gms$s42_env_flow_fraction <- 0.2 # def = 0.2 + +# * Fraction of available water that is reserved for the environment in case of +# * missing protection policy +cfg$gms$s42_env_flow_base_fraction <- 0.05 # def = 0.05 + +# * Switch to activate pumping costs (only available for India currently), Set to 1 if want to use for India +cfg$gms$s42_pumping <- 0 # def = 0 + +# * Year in which pumping costs will be implemented +cfg$gms$s42_multiplier_startyear <- 1995 # def = 1995 + +# * Scalar to change pumping costs for sensitivity analysis, takes numeric values +# * Default value is 0 for all regions, set value to 1 for India default analysis +# * Only applicable when s42_pumping is equal to 1 +cfg$gms$s42_multiplier <- 0 # def = 0 + +# ***--------------------- 43_water_availability -------------------------- +# * (total_water_aug13): surface and ground water resources available +cfg$gms$water_availability <- "total_water_aug13" # def = total_water_aug13 + +# * water availability scenario +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c43_watavail_scenario <- "cc" # def = "cc" + +# ***------------------------- 44_biodiversity ------------------------------ +# * (bii_target): Biodiversity Intactness Index (BII) for 71 biomes with the option to define a lower bound for BII at biome level +# * (bv_btc_mar21): Global optimization of range-rarity weighted biodiversity stocks based on a price for losses and gains +cfg$gms$biodiversity <- "bii_target" # def = bii_target + +# * Start year for linear increase towards BII target value (in bii_target) or biodiversity target price (in bv_btc_mar21) +cfg$gms$s44_start_year <- 2025 #def = 2025 + +# * Year in which the BII target value (in bii_target) or biodiversity target price (in bv_btc_mar21) is reached +cfg$gms$s44_target_year <- 2100 #def = 2100 + +# ** Options for realization `bii_target` +# * This realisation allows to define a target value and year for the Biodiversity Intactness Index (BII) +# * that is applied in each biome type of each biogeographic realm or at the global level. +# * The lower bound increases in each biome linearly from the BII level in the start year (s44_start_year) to the value defined in `s44_bii_lower_bound` in the target year (s44_target_year). +# * The BII has been proposed as a control variable for changes in ecosystem functioning at the global scale +# * and has shown to capture increasing levels of ecosystem degradation. Steffen et al. (2015, 10.1126/science.1259855) have proposed +# * a premliminary boundary of 0.9 at the biome level (safe space) but with an uncertainty range of 0.9-0.3, +# * in which ecosystem degradation may undermine stable ecosystem functioning and the supply of nature's +# * contributions to people (NCP). With BII values below 0.3, the area's biodiversity has been depleted, +# * causing high risk of ecosystem collapse. Estimates for the global BII range between 0.7975 in 1970 and 0.7754 +# * in 2000. https://www.nhm.ac.uk/our-science/data/biodiversity-indicators/biodiversity-intactness-index-data +# * In MAgPIE, the global BII value is about 0.8 in 1995 and declines to 0.795 by 2020. + +# * Lower bound for BII in target year; plausible range: 0-1 +cfg$gms$s44_bii_lower_bound <- 0 #def = 0 + +# * Indicative outcomes for `s44_bii_lower_bound` based on c44_bii_decrease = 1, s44_start_year = 2025 and s44_target_year = 2100. +# * < 0.7: continued decrease of global BII +# * 0.74: no further decrease of global BII +# * 0.76: moderate increase of global BII +# * >= 0.78: (very) strong increase of global BII accomplished by high conversion of pasture to non-forest natural land + +# * BII lower bound implementation (binary) +# * options: 0 (no decrease allowed) or 1 (decrease allowed) +# * 0 (no decrease allowed): If the biome-level BII in `s44_start_year` exceeds the lower bound defined in `s44_bii_lower_bound, the BII value in the start year is used as lower bound for BII in all future time steps. +# * 1 (decrease allowed): The lower bound for BII can decrease over time, depending on the biome-level BII in the start year and the lower bound defined in `s44_bii_lower_bound. +# * Note: The BII constraint is defined as a minimum constraint. Therefore, the actual BII can be higher than the lower bound. +cfg$gms$c44_bii_decrease <- 1 #def = 1 + +# * Technical costs for missing BII increase (USD per unit of BII) +cfg$gms$s44_cost_bii_missing <- 10000000 + +# ** Options for realization `bv_btc_mar21` + +# * Price for biodiversity stock loss/gain in target year (USD per ha) +# * Plausible range: 0-10000 +# * Indicative outcomes +# * 0: decrease of BII +# * 3000: rather constant BII +# * 6000: moderate increase of BII +# * 10000: stronger increase of BII +cfg$gms$s44_target_price <- 0 #def = 0 + +# * Price for biodiversity stock loss/gain in start year (USD per ha) +cfg$gms$s44_start_price <- 0 #def = 0 + + +# ***------------------------- 45_climate --------------------------------- +# * (static): static koeppengeiger climate classification data +cfg$gms$climate <- "static" # def = static + +# ***------------------------- 50_nr_soil_budget -------------------------- +# * (off): off +# * (macceff_aug22): nr efficiency dependent on MACC curves +cfg$gms$nr_soil_budget <- "macceff_aug22" # def = macceff_aug22 + +# * Scenario for baseline nr efficiency (excluding additional improvements based +# * on marginal abatmeent cost curves) on croplands for selected (and +# * respectively non-selected) countries in cropneff_countries and pastneff_countries +# * +# * Options: +# * "constant", +# * Scenarios keep baseline NUE constant. +# * "baseeff_add3_add10_add20_max75", (SSP1) +# * "baseeff_add3_add5_add10_max65", (SSP2) +# * "baseeff_add3_add0_add0_max55", (SSP3) +# * "baseeff_add3_add10_add15_max75", (SSP4) +# * "baseeff_add3_add5_add15_max75", (SSP5) +# * "baseeff_add3_add15_add25_max65", (lowTech) +# * "baseeff_add3_add15_add25_max75", (MaxMitigation) +# * In the baseeff_add scenarios, the baseline NUE starts from historical +# * values in 2010. The three numbers signify how many percentage points +# * the efficiency increases until 2020,2050 and 2100, always relative to +# * 2010. The max efficiency is the maximum base efficiency in 2050 +# * and 2100. "baseeff_add3_add15_add25_max65" means that China with a +# * current NUE of 41 increases to 44% by 2010, 56% by 2050 and 65% by 2100, +# * while the USA, with a current NUE of 71% has a falling base NUE to 65% +# * by 2050 and 2100. These base NUEs can however be improved by the MACCs, +# * leading to a max NUE of 85% for both China and USA in 2100. +# * The recommmended mapping to storylines is shown above in brackets. +# * "maxeff_add3_glo75_glo85", "maxeff_add3_glo75_glo80", +# * "maxeff_add3_glo60_glo65", "maxeff_add3_glo65_glo75", +# * Scenarios with a globaly uniform target NUE. This target NUE is achieved +# * by the combination of full MACCs and baseline NUE. First number is the +# * again additive efficiency increase until 2020, second number is +# * max NUE in 2050, third in 2100. Example: maxeff_add3_glo75_glo85 +# * means efficiency increases a regional specific 3 percentag point +# * improvement until 2020, and then it achieves a globally uniform 75% +# * efficiency in y2050; the baseline NUE value is therefore about 63%, +# * while the MACCs can increase this to 75%. In 2100, the baseline NUE +# * increases to 74%, which can achieve 85% if combined with +# * the MACCs. +# * "maxeff_ZhangBy2030", "maxeff_ZhangBy2050" +# * These two scenarios reach the max NUE of Zhang et al under application +# * of the full MACCs by 2030 or 2050, and then rise a bit further to +# * achieve a maximum NUE of 80% by 2100. + +cfg$gms$c50_scen_neff <- "baseeff_add3_add5_add10_max65" # def = baseeff_add3_add5_add10_max65 +cfg$gms$c50_scen_neff_noselect <- "baseeff_add3_add5_add10_max65" # def = baseeff_add3_add5_add10_max65 + +# * For pastures, only two scenarios exist: a constant scenario, and one where +# * the minimum NUE increases to 55,60 and 65% for 2020,2050 and 2100, to avoid +# * that pastures which dont have a nutrient deficit are fertilized +# * (historical NUE may be low despite no fertilization) +# * Options: +# * constant, constant_min55_min60_min65 + +cfg$gms$c50_scen_neff_pasture <- "constant_min55_min60_min65" # def = constant_min55_min60_min65 +cfg$gms$c50_scen_neff_pasture_noselect <- "constant_min55_min60_min65" # def = constant_min55_min60_min65 + +# * Switch and specification of countries for which above defined (c50_scen_neff, +# * c50_scen_neff_pasture) apply, respectively. +# * For all other countries c50_scen_neff_noselect / c50_scen_neff_pasture_noselect +# * apply. +# * Options: list of iso-codes of countries where selected neff scenario should +# * be in effect. +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: above defined neff scenario applies to all iso countries +cfg$gms$cropneff_countries <- all_iso_countries +cfg$gms$pastneff_countries <- all_iso_countries + + +# ***--------------------- 51_nitrogen ------------------------------------ +# * (rescaled_jan21): IPCC emissions factors rescaled with efficiency +# * (off): no nitrogen calculations +cfg$gms$nitrogen <- "rescaled_jan21" # def = rescaled_jan21 + + +# ***--------------------- 52_carbon -------------------------------------- +# * (normal_dec17): regrowth of carbon stocks in all c pools starts from pasture levels +# * (off): carbon calculations deactivated +cfg$gms$carbon <- "normal_dec17" # def = normal_dec17 + +# * RCP scenario of land carbon sink adjustment factor, from Grassi et al 2021 +# * options: RCP19, RCP26, RCP34, RCP45, RCP60, RCPBU +cfg$gms$c52_land_carbon_sink_rcp <- "RCPBU" + + +# * carbon scenario +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c52_carbon_scenario <- "cc" # def = "cc" + +# * Minimum threshold of carbon density (tC/ha) in timber plantations +cfg$gms$s52_plantation_threshold <- 8 # def = 8 + +# ***--------------------- 53_methane ------------------------------------- +# * (ipcc2006_aug22): IPCC 2006 methodology +# * (off): methane calculations deactivated +cfg$gms$methane <- "ipcc2006_aug22" # def = ipcc2006_aug22 + +# ***--------------------- 54_phosphorus ---------------------------------- +# * (off): calculations deactivated +cfg$gms$phosphorus <- "off" # def = off + +# ***--------------------- 55_awms --------------------------------------- +# * (ipcc2006_aug16): animal waste management systems +# * (based on IPCC 2006 Guidelines) +# * (off): deactivated animal waste management +cfg$gms$awms <- "ipcc2006_aug16" # def = ipcc2006_aug16 + +# * scenario for animal waste management. +# * option: "ssp1", "ssp2", "ssp3", "ssp4", "ssp5", "constant", "a1", "a2", "b1","b2", +#* "GoodPractice" +# * Note: c55_scen_conf applies to countries selected in scen_countries55 +# * c55_scen_conf_noselect applies to all other countries. +# * Available scenarios for c55_scen_conf_noselect are identical to c55_scen_conf +cfg$gms$c55_scen_conf <- "ssp2" # def = ssp2 +cfg$gms$c55_scen_conf_noselect <- "ssp2" # def = ssp2 + +# * Switch and specification of countries for which awm scenario in +# * c55_scen_conf applies. +# * Options: list of iso-codes of countries where awm scneario should be applied +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +cfg$gms$scen_countries55 <- all_iso_countries + +# ***--------------------- 56_ghg_policy ---------------------------------- +# * (price_aug22): applies pollutant prices to different emission types and calculates the reward for CDR from afforestation +cfg$gms$ghg_policy <- "price_aug22" # def = price_aug22 + +# * Switch for scaling GHG price with development state (1=on 0=off) +cfg$gms$s56_ghgprice_devstate_scaling <- 0 # def = 0 + +# * reduction factor for CO2 price (only used in price_jan19) +# * lowers the economic incentive for CO2 emission reduction (avoided deforestation) and afforestation +cfg$gms$s56_cprice_red_factor <- 1 # def = 1 + +# * GHG emission price scenario +# * Note: For best consistency it is recommended to use trajectories from the most recent +# * coupled REMIND-MAgPIE runs. Currently, this is R21M42. +# * Note on available scenarios from coupled REMIND-MAgPIE runs +# * NPi: Current policies; above 3.0°C in 2100 +# * PkBudg900: Budget with 900 GtCO2; well-below 1.5°C in 2100 (PkBudg1000 for SDP) +# * PkBudg1300: Budget with 1300 GtCO2; well-below 2.0°C in 2100 +# * +# * Available scenarios: +# * Coupled REMIND-MAgPIE runs +# * R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, +# * R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, +# * R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, +# * R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, R21M42-SSP5-PkBudg900, +# * R2M41-SSP2-NPi, R2M41-SSP2-NDC, R2M41-SSP2-Budg1300, R2M41-SSP2-Budg600, R2M41-SSP2-Budg950 +# * Standalone REMIND runs from Strefler et al 2021; well-below 2.0°C in 2100 +# * https://www.nature.com/articles/s41467-021-22211-2 +# * PIK_GDP, PIK_H2C, PIK_HBL, PIK_HOS, PIK_LIN, PIK_NPI, PIK_OPT +# * SSP Database 2018, various SSP, RCP and Model combinations +# * https://tntcat.iiasa.ac.at/SspDb +# * Caution: using trajectories from other models or older MAgPIE versions might be +# * inconsistent with the current MAgPIE version. +# * SSPDB-SSP1-20-IMAGE,SSPDB-SSP1-20-REMIND-MAGPIE, +# * SSPDB-SSP1-26-IMAGE,SSPDB-SSP1-26-REMIND-MAGPIE, +# * SSPDB-SSP1-34-IMAGE,SSPDB-SSP1-34-REMIND-MAGPIE, +# * SSPDB-SSP1-37-REMIND-MAGPIE, +# * SSPDB-SSP1-45-IMAGE,SSPDB-SSP1-45-REMIND-MAGPIE, +# * SSPDB-SSP1-Ref-IMAGE,SSPDB-SSP1-Ref-REMIND-MAGPIE, +# * SSPDB-SSP2-18-MESSAGE-GLOBIOM,SSPDB-SSP2-19-MESSAGE-GLOBIOM, +# * SSPDB-SSP2-20-MESSAGE-GLOBIOM,SSPDB-SSP2-20-REMIND-MAGPIE, +# * SSPDB-SSP2-26-MESSAGE-GLOBIOM,SSPDB-SSP2-26-REMIND-MAGPIE, +# * SSPDB-SSP2-34-MESSAGE-GLOBIOM,SSPDB-SSP2-34-REMIND-MAGPIE, +# * SSPDB-SSP2-37-REMIND-MAGPIE, +# * SSPDB-SSP2-45-MESSAGE-GLOBIOM,SSPDB-SSP2-45-REMIND-MAGPIE, +# * SSPDB-SSP2-60-MESSAGE-GLOBIOM,SSPDB-SSP2-60-REMIND-MAGPIE, +# * SSPDB-SSP2-Ref-MESSAGE-GLOBIOM,SSPDB-SSP2-Ref-REMIND-MAGPIE, +# * SSPDB-SSP3-34-AIM-CGE,SSPDB-SSP3-45-AIM-CGE, +# * SSPDB-SSP3-60-AIM-CGE,SSPDB-SSP4-26-GCAM4, +# * SSPDB-SSP4-34-GCAM4,SSPDB-SSP4-45-GCAM4, +# * SSPDB-SSP4-60-GCAM4,SSPDB-SSP4-Ref-GCAM4, +# * SSPDB-SSP5-20-REMIND-MAGPIE,SSPDB-SSP5-26-REMIND-MAGPIE, +# * SSPDB-SSP5-34-REMIND-MAGPIE,SSPDB-SSP5-37-REMIND-MAGPIE, +# * SSPDB-SSP5-45-REMIND-MAGPIE,SSPDB-SSP5-60-REMIND-MAGPIE, +# * SSPDB-SSP5-Ref-REMIND-MAGPIE, +# * Used for producing coupled runs with REMIND-MAgPIE or for exogenous input (see below) +# * coupling +# * Note: c56_pollutant_prices applies to countries selected in policy_countries56 +# * c56_pollutant_prices_noselect applies to all other countries. +# * Available scenarios for c56_pollutant_prices_noselect are identical to c56_pollutant_prices +# * (see above) except for emulator and coupling (which can only be chosen for c56_pollutant_prices) +cfg$gms$c56_pollutant_prices <- "G0000" # def = R21M42-SSP2-NPi +cfg$gms$c56_pollutant_prices_noselect <- "G0000" # def = R21M42-SSP2-NPi + +# * The following two settings can be used to provide exogenous ghg prices +# * via a file that is not part of the input data. This is currently used +# * in the REMIND-MAgPIE coupling to read in the REMIND data. +# * Takes effect only if cfg$gms$c56_pollutant_prices is set to "coupling" + +# * Use ghg prices from the mif file specified here +cfg$path_to_report_ghgprices <- NA + +# * Mute GHG prices until (and including) the year given here +# * Note: minimum C price (see below) will be set regardless of this setting +cfg$gms$c56_mute_ghgprices_until <- "y2020" # def = y2030 + +# * Minium C price (USD per tC) for future time steps until (and including) the year defined in `c56_mute_ghgprices_until` +# * Note: in case of NDC policy a C price of 18 USD per tC (5 USD per tCO2) is used to guide land-use decisions (set via scenario_config.csv) +cfg$gms$s56_minimum_cprice <- 0 # def = 0 + +# * Switch and specification of countries for which pollutant pricing in +# * c56_pollutant_prices applies. +# * Options: list of iso-codes of countries where ghg policy should be applied +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +# * Note: Only for exogenous scenarios. Does not take any effect when "coupling" / +# * "emulator" is selected above. +cfg$gms$policy_countries56 <- all_iso_countries # def = all_iso_countries + +# * Switch for C price driven afforestation (1=on 0=off) +cfg$gms$s56_c_price_induced_aff <- 1 # def = on + +# * C price used as incentive for afforestation +# * Note: This setting should only be changed by experienced users +# * Options: forestry_vegc, primforest_vegc, secdforest_vegc +# * This setting interacts with `c56_emis_policy`. +# * If "forestry" is not included in `c56_emis_policy` (e.g. reddnatveg_nosoil), there will be no C-price driven afforestation unless `c56_cprice_aff` is changed to primforest_vegc or secdforest_vegc. +cfg$gms$c56_cprice_aff <- "forestry_vegc" # def = forestry_vegc + +# * C price expectation for afforestation decision-making in years +# * 0 is myopic behaviour (only C price of current time step) +# * reflects perfect-foresight if equal to s32_planing_horizon +# * should not be higher than s32_planing_horizon +cfg$gms$s56_c_price_exp_aff <- 50 # def = 50 + +# * share of carbon credits for afforestation projects pooled in a buffer +# * Values > 0 will reduced the incentive for c price induced afforestation +# * a plausible value is 0.2, based on the Gold Standard for afforestation projects +cfg$gms$s56_buffer_aff <- 0.2 # def = 0.2 + +# * Upper limit for CH4 and N2O GHG price (USD05MER per tC) +# * Limits GHG prices selected in c56_pollutant_prices to the chosen value. +# * CH4 and N2O GHG prices are limited by default to 4000 USD05MER per tC equivalent, +# * which induces the maximum abatement possible with c57_macc_version = "PBL_2022" +# * Beyond 4000 USD05MER per tC equivalent no further technical mitigation is possible +# * but would increase agricultural prices. +# * Suggested limits for different c57_macc_version settings +# * PBL_2007: 1000 (200 steps, 5 USD each) +# * PBL_2019: 4000 (200 steps, 20 USD each) +# * PBL_2022: 4000 (200 steps, 20 USD each) +cfg$gms$s56_limit_ch4_n2o_price <- 4000 # def = 4000 + +# * NOTE: The following 2 options for emission pricing have strong interactions in runs with CO2 prices and should only be changed by experienced users. +# * The main purpose of these options is to regulate the pricing of positive emissions. Note that re/afforestation is covered by a separate mechanism. + +# * GHG emission pricing policies +# * options: +# * none (not including any GHG sources), +# * redd_nosoil (Above ground CO2 emis from LUC in forest; all CH4 and N2O emissions), +# * redd_nosoil_nopeat (same as redd_nosoil but without GHG emissions from peatlands), +# * reddnatveg_nosoil (Above ground CO2 emis from LUC in forest and natveg; all CH4 and N2O emissions), +# * reddnatveg_nosoil_nopeat (same as reddnatveg_nosoil but without GHG emissions from peatlands), +# * redd+_nosoil (Above ground CO2 emis from LUC in forest and forestry; all CH4 and N2O emissions), +# * redd+_nosoil_nopeat (same as redd+_nosoil but without GHG emissions from peatlands), +# * redd+natveg_nosoil (Above ground CO2 emis from LUC in forest, forestry and natveg; all CH4 and N2O emissions), +# * redd+natveg_nosoil_nopeat (same as redd+natveg_nosoil but without GHG emissions from peatlands), +# * all (CO2 emis from LUC in all LUs; all CH4 and N2O emissions), all_nosoil (Above ground CO2 emis from LUC for all LUs; all CH4 and N2O emissions) +# * all_nosoil: Above ground CO2 emis from LUC for all LUs; all CH4 and N2O emissions +# * sdp_cropeff (only ch4 from rice), sdp_livestock (only ch4 and n2o from livestock), sdp_peatland (co2, ch4 and n2o from peatland), +# * sdp_redd (only co2 from vegc), sdp_soil (only co2 from litc and soilc), sdp_redd_soil (only co2 from vegc, litc, soilc), +# * sdp_redd_soil_peat (only co2 from vegc, litc, soilc and co2, ch4 and n2o from peatland), sdp_all (all individual sdp scenarios combined) +# * gcs_lbs (land-based mitigation: above-ground CO2 emis from LUC in forest, forestry and natveg; co2, ch4 and n2o from peatland), +# * gcs_res (mitigation in production systems: all agricultural non-CO2 emissions) +# * ecoSysProtAll: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 and N2O emis), +# * ecoSysProtForest: (Above ground CO2 emis from LUC in forest, forestry; All CH4 and N2O emis except peatland), +# * ecoSysProtPrimForest: (Above ground CO2 emis from LUC in primary forest; All CH4 and N2O emis except peatland), +# * ecoSysProtOff: (All CH4 and N2O emis except peatland), +# * ecoSysProtAll_agMgmtExclN2O: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 emis, no further N2O emis) +# * ecoSysProtAll_agMgmtExclCH4: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All N2O emis, no further CH4 emis) +# * ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) +cfg$gms$c56_emis_policy <- "redd+natveg_nosoil" # def = redd+natveg_nosoil + +# * CO2 emissions subject to carbon pricing +# * options: actual, actualNoAcEst +# * actual: CO2 emissions for pricing are based on the difference of actual carbon stocks between time steps +# * actualNoAcEst: CO2 emissions for pricing are based on actual carbon stocks but +# * without newly established forest and non-forest areas. Note that re/afforestation is covered by a separate mechanism. +c56_carbon_stock_pricing <- "actualNoAcEst" # def = actualNoAcEst + + +# ***--------------------- 57_maccs --------------------------------------- +# * (on_aug22): maccs for non-CO2 emission mitigation activated +cfg$gms$maccs <- "on_aug22" # def = on_aug22 + +# * Version of MACCs +# * options: PBL_2007, PBL_2019, PBL_2022 +cfg$gms$c57_macc_version <- "PBL_2022" # def = PBL_2022 + +# * MACC scenario (only for PBL_2022) +# * options: Default, Optimistic, Pessimistic +cfg$gms$c57_macc_scenario <- "Default" # def = Default + +# * Exogenous forced mitigation, independent of pollutant prices +# * Overwrites signal of mitigation price by choosing maximum mitigation levels +# * This avoids that emission tax is rolled over to food prices, only the +# * the mitigaton costs are rolled over to prices. +# * options: -1, 1 to 201 for each MACC mitigation step +# * -1: pollutant-price driven maccs +# * 0: inactive MACCs (price level zero) +# * 201: maximum level of mitigation +cfg$gms$s57_maxmac_n_soil <- -1 # def = -1 +cfg$gms$s57_maxmac_n_awms <- -1 # def = -1 +cfg$gms$s57_maxmac_ch4_rice <- -1 # def = -1 +cfg$gms$s57_maxmac_ch4_entferm <- -1 # def = -1 +cfg$gms$s57_maxmac_ch4_awms <- -1 # def = -1 + +# ***--------------------- 58_peatland ------------------------------------ +# * (off): Peatland area and associated GHG emissions are assumed zero +# * (on): Peatland area is initialized with present-day degraded and intact peatland. +# * GHG emissions are calculated using IPCC Tier 1 emission factors (2013 Wetland supplement). +cfg$gms$peatland <- "on" # def = on + +# * peatland rewetting +# * options: 0 (off) +# * Inf (on) +cfg$gms$s58_rewetting_switch <- Inf # def = Inf + +# * One-time and recurring costs for peatland rewetting (USD05MER per ha) +cfg$gms$s58_rewet_cost_onetime <- 7000 # def = 7000 +cfg$gms$s58_rewet_cost_recur <- 200 # def = 200 + +# * One-time and recurring costs for peatland degradation (USD05MER per ha) +# * Can be used to test area-based incentives for peatland protection and restoration, +# * complementary or in addition to pricing GHG emissions from degraded peatlands (see s56_peatland_policy). +# * One-time costs apply on the conversion of intact (and rewetted) peatland to degraded peatland. +# * Therefore, one-time costs can used to incentivize the protection of intact peatlands. +# * Recurring costs apply on the level of degraded peatland. Therefore, recurring costs, +# * in combination with one-time costs, can be used to incentivize peatland restoration. +cfg$gms$s58_degrad_cost_onetime <- 0 # def = 0 +cfg$gms$s58_degrad_cost_recur <- 0 # def = 0 + +# * Artificial cost for balance variables (USD05MER per ha) +# * The balance variables in the peatland module avoid infeasibilities due to +# * differences in accuracy between parameters and variables in GAMS. +# * High costs make sure that the balance variables are only used as a last resort. +cfg$gms$s58_cost_balance <- 1e+06 # def = 1e+06 + +# * Switch for fixing peatland area to 2015 levels from 1995 onwards until the given year +# * Note: The initial peatland area is only available for the year 2015. +# * Fixing the peatland area in previous time steps to 2015 levels provides a better +# * proxy for GHG emissions from peatlands than assuming no peatland area. +cfg$gms$s58_fix_peatland <- 2015 # def = 2015 + +# ***------------------------- 59_som ------------------------------------- +# * (static_jan19): static soil carbon loss for cropland +# * (cellpool_aug16): dynamic soil organic matter pool on cellular level +# * (cellpool_jan23): dynamic soil organic matter pool on cellular level +# * with updated, regionalized stock change factors (IPCC guidelines 2019) +cfg$gms$som <- "static_jan19" # def = static_jan19 + +# * static realization switch +# * options: cellular (use preprocessed cellular stock change factors) +# * cluster (use cshare_released on cluster within gams) +cfg$gms$c59_static_spatial_level <- "cellular" + +# * cellpool realization switches + +# * som climate impact scenario +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c59_som_scenario <- "cc" # def = "cc" + +# * irrigation feedback +# * options: on (higher carbon sequestration under irrigation) +# * off (no carbon sequestration under irrigation) +cfg$gms$c59_irrigation_scenario <- "on" # def = "on" + +# * Exogenous nr release through som loss (only in static realization) +# * options: constant (constant from 2020) +# * fadeout_2050 (fading out till 2050) +cfg$gms$c59_exo_scen <- "constant" + +# ***--------------------- 60_bioenergy ----------------------------------- +# * (1stgen_priced_dec18): exogenous and price-based 1st generation bioenergy +# * demand, 2nd generation residues exogeneous, +# * 2nd generation betr and begr coupled with REMIND. +cfg$gms$bioenergy <- "MMEmu_feb23" # def = 1stgen_priced_dec18 + +# * 1st generation bioenergy demand scenarios based on Lotze Campen (2014) +# * (phaseout2020): increase until 2020, followed by phaseout until 2050 +# * (const2020): increase until 2020, constant thereafter +# * (const2030): increase until 2030, constant thereafter +cfg$gms$c60_1stgen_biodem <- "phaseout2020" # def = const2020 + +# * 2nd generation bioenergy demand scenario +# * Note: For best consistency it is recommended to use trajectories from the most recent +# * coupled REMIND-MAgPIE runs. Currently, this is R21M42. +# * Note on available scenarios from coupled REMIND-MAgPIE runs +# * NPi: Current policies; above 3.0°C in 2100 +# * PkBudg900: Budget with 900 GtCO2; well-below 1.5°C in 2100 (PkBudg1000 for SDP) +# * PkBudg1300: Budget with 1300 GtCO2; well-below 2.0°C in 2100 +# * +# * Available scenarios: +# * Coupled REMIND-MAgPIE runs +# * R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, +# * R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, +# * R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, +# * R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, R21M42-SSP5-PkBudg900, +# * R2M41-SSP2-NPi, R2M41-SSP2-NDC, R2M41-SSP2-Budg1300, R2M41-SSP2-Budg600, R2M41-SSP2-Budg950 +# * Standalone REMIND runs from Strefler et al 2021; well-below 2.0°C in 2100 +# * https://www.nature.com/articles/s41467-021-22211-2 +# * PIK_GDP, PIK_H2C, PIK_HBL, PIK_HOS, PIK_LIN, PIK_NPI, PIK_OPT +# * SSP Database 2018, various SSP, RCP and Model combinations +# * https://tntcat.iiasa.ac.at/SspDb +# * Caution: using trajectories from other models or older MAgPIE versions might be +# * inconsistent with the current MAgPIE version. +# * SSPDB-SSP1-20-IMAGE,SSPDB-SSP1-20-REMIND-MAGPIE, +# * SSPDB-SSP1-26-IMAGE,SSPDB-SSP1-26-REMIND-MAGPIE, +# * SSPDB-SSP1-34-IMAGE,SSPDB-SSP1-34-REMIND-MAGPIE, +# * SSPDB-SSP1-37-REMIND-MAGPIE, +# * SSPDB-SSP1-45-IMAGE,SSPDB-SSP1-45-REMIND-MAGPIE, +# * SSPDB-SSP1-Ref-IMAGE,SSPDB-SSP1-Ref-REMIND-MAGPIE, +# * SSPDB-SSP2-18-MESSAGE-GLOBIOM,SSPDB-SSP2-19-MESSAGE-GLOBIOM, +# * SSPDB-SSP2-20-MESSAGE-GLOBIOM,SSPDB-SSP2-20-REMIND-MAGPIE, +# * SSPDB-SSP2-26-MESSAGE-GLOBIOM,SSPDB-SSP2-26-REMIND-MAGPIE, +# * SSPDB-SSP2-34-MESSAGE-GLOBIOM,SSPDB-SSP2-34-REMIND-MAGPIE, +# * SSPDB-SSP2-37-REMIND-MAGPIE, +# * SSPDB-SSP2-45-MESSAGE-GLOBIOM,SSPDB-SSP2-45-REMIND-MAGPIE, +# * SSPDB-SSP2-60-MESSAGE-GLOBIOM,SSPDB-SSP2-60-REMIND-MAGPIE, +# * SSPDB-SSP2-Ref-MESSAGE-GLOBIOM,SSPDB-SSP2-Ref-REMIND-MAGPIE, +# * SSPDB-SSP3-34-AIM-CGE,SSPDB-SSP3-45-AIM-CGE, +# * SSPDB-SSP3-60-AIM-CGE,SSPDB-SSP4-26-GCAM4, +# * SSPDB-SSP4-34-GCAM4,SSPDB-SSP4-45-GCAM4, +# * SSPDB-SSP4-60-GCAM4,SSPDB-SSP4-Ref-GCAM4, +# * SSPDB-SSP5-20-REMIND-MAGPIE,SSPDB-SSP5-26-REMIND-MAGPIE, +# * SSPDB-SSP5-34-REMIND-MAGPIE,SSPDB-SSP5-37-REMIND-MAGPIE, +# * SSPDB-SSP5-45-REMIND-MAGPIE,SSPDB-SSP5-60-REMIND-MAGPIE, +# * SSPDB-SSP5-Ref-REMIND-MAGPIE, +# * Used for producing coupled runs with REMIND-MAgPIE or for exogenous input (see below) +# * coupling +# * Note: c60_2ndgen_biodem applies to countries selected in scen_countries60 +# * c60_2ndgen_biodem_noselect applies to all other countries. +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-phaseout2020" # def = R21M42-SSP2-NPi +cfg$gms$c60_2ndgen_biodem_noselect <- "R21M42-SSP2-Npi-phaseout2020" # def = R21M42-SSP2-NPi + +# * The following setting can be used to provide exogenous bioenergy demand +# * via a .mif file that is not part of the input data. This is currently used +# * in the REMIND-MAgPIE coupling to read in the REMIND data. +# * Takes effect only if cfg$gms$c60_2ndgen_biodem is set to "coupling" +cfg$path_to_report_bioenergy <- NA + +# * Switch and specification of countries for which 2nd gen bioenergy demand +# * scenario applies. +# * Options: list of iso-codes of countries where scenario should be applied +# * Note: must be written in the format: "IND, BRA, DEU" +# * Default: all iso countries +# * Note: Only for exogenous scenarios. Does not take any effect when "coupling" / +# * "emulator" selected. +cfg$gms$scen_countries60 <- all_iso_countries + +# * residue demand for 2nd generation bioenergy scenarios +# * options: ssp1, ssp2, ssp3, ssp4, ssp5, off +cfg$gms$c60_res_2ndgenBE_dem <- "ssp2" # def = ssp2 + +# * bioenergy demand level +# * (1): regional +# * (0): global +cfg$gms$c60_biodem_level <- 1 # def = 1 + +# * Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) +# * Without a minimum demand, there is the risk that some regions won't have a price for 2nd generation bioenergy. +# * Therefore, the minimum demand is of particular importance for the coupling with REMIND. +cfg$gms$s60_2ndgen_bioenergy_dem_min <- 1 # def = 1 + +# * Minimum demand can be set to 0 for price-driven runs past the SSP2_fix +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 + +# * first generation bioenergy subsidy (USD05MER per ton) +# * for GJ-based prices post fix_SSP2 only the fix_SSP2 should be > 0 +cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 + +# * For price-based bioenergy implementation (US05MER per GJ) +cfg$gms$s60_bioenergy_gj_price_1st <- 0 # def = 0 +cfg$gms$s60_bioenergy_price_2nd <- 0 # def = 0 + +# * Shape of GJ-based price curve towards defined target price +# * Options: const : constant price equal to target price +# * exp : exponential implementation starting from 0.25 * target price in the sm_fix_SSP2 year +# * lin : linear implementation starting from 0 in the sm_fix_SSP2 year +cfg$gms$c60_price_implementation <- "lin" # def = "lin" + + +# ***--------------------- 62_material ------------------------------------ +# * (exo_flexreg_apr16): default +cfg$gms$material <- "exo_flexreg_apr16" + +# * Biomass demand for bioplastics is based on a logistic curve projecting +# * bioplastic demand, which matches the historic demand in 2020, and is +# * defined by the maximum demand for bioplastics s62_max_dem_bioplastics +# * (in mio. tonnes) and the midpoint s62_midpoint_dem_bioplastics (i.e. +# * where bioplastic demand is half of the maximum demand). +# * If maximum demand is 0, biomass demand for bioplastic production is not included. +# * Projected total plastic use in the "Global Ambiton" scneario of the OECD is +# * about 600 mio. tonnes in 2050 -> E.g. 200 mio. tonnes in 2050 could be a +# * reasonable (but ambitious) bioplastic scenario. With midpoint 2050 this +# * would mean s62_max_dem_bioplastic = 400. +cfg$gms$s62_max_dem_bioplastic <- 0 # def = 0 +cfg$gms$s62_midpoint_dem_bioplastic <- 2050 # def = 2050 + +# ***--------------------- 70_livestock ----------------------------------- +# * (fbask_jan16): default feed basket realization +cfg$gms$livestock <- "fbask_jan16" # def = fbask_jan16 + +# * Year until the pasture management factor is fixed to 1 +cfg$gms$s70_past_mngmnt_factor_fix <- "2005" # def = 2005 + +# * feed scenario +# * options: SSP: ssp1, ssp2, ssp3, ssp4, ssp5 +# * SDP: SDP, SDP_EI, SDP_MC, SDP_RC +# * other: constant +cfg$gms$c70_feed_scen <- "ssp2" # def = ssp2 + +# * Feed substitution scenarios. +# * options consist of 3 parts: functional form (lin,sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050) +# * Example for sigmoid_50pc_20_50: +# * Functional form: sigmoid (S-shaped) +# * Target: 50percent reduction at end of transition period (2050 in this case) +# * Transition period: start in 2020, end in 2050 +# * options: constant, +# * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, +# * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, +# * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 +# * Cereal feed substituted by SCP +cfg$gms$c70_cereal_scp_scen <- "constant" # def = constant +# * Fodder feed substituted by SCP +cfg$gms$c70_foddr_scp_scen <- "constant" # def = constant + +# * Regional (reg) or global (glo) regression for livestock factor requirements. +# * Typically, the same version (glo or reg) should be chosen for c38_fac_req +# * for consistency. +cfg$gms$c70_fac_req_regr <- "glo" # def = glo + +# ***--------------------- 71_disagg_lvst ----------------------------------- +# * (off): default +# * (foragebased_aug18): Disaggregation of livestock to cells +# * with high pasture and fodder availability +cfg$gms$disagg_lvst <- "foragebased_aug18" # def = foragebased_aug18 + + +# ***--------------------- 73_timber ----------------------------------- +# * (default): Demand and production of timber products +cfg$gms$timber <- "default" # def = default + +# Logical switch to turn on or off timber demand (wood and woodfuel). +# Note that "on" requires dynamic timber plantations (s32_hvarea=2 and s35_hvarea=2) +# for actual results. +# Vice-versa, in the "off" case, timber plantations should be static (s32_hvarea=0/1 and s35_hvarea=0/1) +# for a simplified representation of land demand for timber production from plantations +# (implicitly assuming the same rate for plantation harvest and establishment). +# * 1=on +# * 0=off +cfg$gms$s73_timber_demand_switch <- 0 # def = 0 + +# Setting to define if the model should be forward looking or not in terms of +# seeing the future demand for current timestep establishment of new plantations +# in the forward setting, the model sees only current demand for establishment +# decisions in the historical time period but then sees future demand for non +# historic time periods. In myopic setting, the model sees always the current +# timber demand for establishment decisions. +# * 1 = forward looking. Model sees future demand for establishment in current step +# * 0 = myopic. Model sees current demand for establishment in current step +cfg$gms$s73_foresight <- 0 # def = 0 + +# harvesting cost per ton of dry matter produced (USD/tDM) +s73_timber_prod_cost <- 2000 # def = 2000 + +# harvesting cost per ha of forests (USD/ha) +s73_timber_harvest_cost <- 2000 # def = 2000 + +# Cost multiplier for harvesting costs to make natural vegetation harvest expensive +# than timber plantation harvest. This provides a signal to the model to harvest +# timber plantations first. +s73_cost_multiplier <- 1.5 # def = 1.5 + +# Cost of production without using any land in case the model is running into infeasibilities. +# This is a last ditch effort for the model and the variable associated with this cost +# should not be used in a normally feasible model run (USD/tDM) +s73_free_prod_cost <- 1000000 # def = 1000000 + +# Switch for modifying woody biomass demand starting in 2035 +# * ("default") = Default paper demand +# * ("nopaper") = Diminishing paper demand +# * ("construction") = Higher demand for construction wood in future +cfg$gms$c73_wood_scen <- "default" # def = "default" + +# Building material demand +# * ("BAU") = Business as usual, only 0.5% of urban dwellers need timber buildings +# * ("10pc") = 10% of urban dwellers need timber buildings +# * ("50pc") = 50% of urban dwellers need timber buildings +# * ("90pc") = 90% of urban dwellers need timber buildings + +cfg$gms$c73_build_demand <- "BAU" # def = "BAU" + +# Linearized multiplier for scaling construction wood demand for easier demand +# scenario tests. The expansion factor is applied over next 80 years starting in +# 2020. +cfg$gms$s73_expansion <- 0 # def = 0 + +# ***------------------- 80_optimization ------------------------------------ +# * (nlp_apr17): solve procedure solving the whole, nonlinear problem +# * at once +# * (lp_nlp_apr17): alternative approach in which the nonlinear terms are +# * fixed first so that the linear problem can be solved +# * before the full problem is solved +# * (nlp_par): Parallel optimization of regions. Allows to use higher +# * spatial resolution but works only with exogenous trade patterns +# * from a run with lower resolution solved with nlp_apr17. +# * Usage: add "extra/highres" as output script. This will start a +# * second model run with higher resolution. +# * Make sure that the cellular input file specified in +# * scripts/output/extra/highres.R exists. +# * See scripts/output/extra/highres.R for details. + +cfg$gms$optimization <- "nlp_apr17" # def = nlp_apr17 + +# maximal number of solve iterations +cfg$gms$s80_maxiter <- 30 + +# * (conopt3): conopt3 +# * (conopt4): conopt4 +# * (conopt4+cplex): conopt4 followed by cplex with landdiff optimization +# * (conopt4+conopt3): conopt4 followed by conopt3 +cfg$gms$c80_nlp_solver <- "conopt4" # def = conopt4 + +# number of allowed non-optimal variables +# Should be set to 0 for GAMS version 25.x.x or earlier +# Should be set to Inf for GAMS version 26.x.x or later +cfg$gms$s80_num_nonopt_allowed <- Inf + +# * 1: using optfile for specified solver settings +# * 0: default settings (optfile will be ignored) +cfg$gms$s80_optfile <- 1 + + +#*******************************END MODULE SETUP******************************** + +#### Other settings (e.g. clustering, gdx files, ...): #### + +# Choosing scenario for coupling with MAGICC for emissions outside the food system +# (options) bjoernAR6_C_RemSDP-900-MagSSP1.mif, bjoernAR6_C_RemSSP1-1000-MagSDP.mif, +# bjoernAR6_C_SDP-NPi.mif, bjoernAR6_C_SDP-PkBudg1000.mif, +# bjoernAR6_C_SSP1-Base.mif, bjoernAR6_C_SSP1-NDC.mif, +# bjoernAR6_C_SSP1-NPi.mif, bjoernAR6_C_SSP1-PkBudg900.mif, +# bjoernAR6_C_SSP2-Base.mif, bjoernAR6_C_SSP2-NDC.mif, +# bjoernAR6_C_SSP2-NPi.mif, bjoernAR6_C_SSP2-PkBudg900.mif +cfg$magicc_emis_scen <- "bjoernAR6_C_SSP2-NDC.mif" + +# Decide whether the runs should be run sequentially (TRUE), +# or in parallel (FALSE) +# NA means that this decision is taken automatically +# (typically on cluster = FALSE and locally = TRUE) +cfg$sequential <- NA + +# Selection of QOS to be used for submitted runs on cluster. +# Will be ignored for all other runs. +# * options: short (24h max, no preemption) +# * short_maxMem (same as short but with 16 CPUs and max Memory) +# * medium (1 week max, no preemption) +# * priority (immediate start, but slots limited to 5 in parallel) +# * priority_maxMem (same as priority but with 16 CPUs and max Memory) +# * standby (1 week max, preemption possible) +# * standby_dayMax (24h max, preemption possible) +# * standby_maxMem_dayMax (same as standby_dayMax but with 16 CPUs and max Memory) +# * standby_maxMem (same as standby but with 16 CPUs and max Memory) +# * NULL (educated guess of best option based +# * available resources) +cfg$qos <- NULL # def = NULL + +# How should log information be treated? +# (0:no output, 2:write to full.log 3:show in console) +cfg$logoption <- 2 + +# Should output.R generate output? +# List of output scripts that should be used +# Available scripts can be found in scripts/output/ +cfg$output <- c("output_check", "extra/disaggregation", "rds_report") + +# Set the format for the results folder +# :date: is a placeholder for the current time stamp (e.g. "results:date:") +# :title: is a placeholder for the current run title (cfg$title) +cfg$results_folder <- "output/:title::date:" + +# Which files should be copied into the output folder? +cfg$files2export <- list() +# Files that should be copied before MAgPIE is started +cfg$files2export$start <- c("input/info.txt", + "input/avl_land_full_t_0.5.mz", + "input/luh2_side_layers_0.5.mz", + "modules/14_yields/input/lpj_yields_0.5.mz", + "modules/22_land_conservation/input/wdpa_baseline_0.5.mz", + "modules/22_land_conservation/input/consv_prio_areas_0.5.mz", + "modules/30_crop/endo_apr21/input/avl_cropland_0.5.mz", + "modules/50_nr_soil_budget/input/f50_NitrogenFixationRateNatural_0.5.mz", + "modules/50_nr_soil_budget/input/f50_AtmosphericDepositionRates_0.5.mz", + "input/f34_urbanland_0.5.mz", + "input/spatial_header.rda", + "scripts/run_submit/submit.R", + "scripts/run_submit/submit_*.sh", + ".Rprofile", + "input/clustermap*.rds", + "input/lpj_envflow_total_*.mz", + "input/lpj_watavail_total_*.mz", + "input/validation.mif", + "calib_*.cs3", + "land_conversion_cost_calib_*.cs3", + "input/spamplot_*.pdf", + "input/regionmapping*.csv", + "input/kba_land_0.5.mz") + +# Files that should be copied after the MAgPIE run is finished +cfg$files2export$end <- NULL + +# Folder run statistics should be submitted to +cfg$runstatistics <- "/p/projects/rd3mod/models/statistics/magpie" + +# name of the overall model (just used for reporting purposes) +# should usually not be changed +cfg$model_name <- "MAgPIE" + +# a list of additional information characterizing this run. Can be used +# to save relevant information about the run and can, in contrast to all other +# setting, contain list elements which do not exist in the reference +# configuration +cfg$info <- list() + +# Should the restart files of each iteration be kept in the output folder (TRUE) +# or deleted after the run finished (FALSE) +cfg$keep_restarts <- FALSE + +# Should the model run in developer mode? This will loosen some restrictions, +# such as temporary toleration of coding etiquette violations +# Please make sure to set it to FALSE for production runs! +cfg$developer_mode <- FALSE + +# Should the model run in debug mode? +# Download script will copy files from input to destination folder instead of +# moving it allowing to check whether something in the move/copy process goes +# wrong +cfg$debug <- FALSE + +################################################################################ diff --git a/core/sets.gms b/core/sets.gms index 13be12ee50..88b5535664 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -181,6 +181,7 @@ $If "%c_past%"== "till_1995" /y1965, y1970, y1975, y1980, y1985, y1990, y1995/; set t(t_all) Simulated time periods $If "%c_timesteps%"== "less_TS" /y1995,y2000,y2005,y2010,y2015,y2020,y2025,y2030,y2035,y2040,y2045,y2050,y2055,y2060,y2070,y2080,y2090,y2100,y2110,y2130,y2150/; $If "%c_timesteps%"== "coup2100" /y1995,y2000,y2005,y2010,y2015,y2020,y2025,y2030,y2035,y2040,y2045,y2050,y2055,y2060,y2070,y2080,y2090,y2100/; +$If "%c_timesteps%"== "coup2110" /y1995,y2000,y2005,y2010,y2015,y2020,y2025,y2030,y2035,y2040,y2045,y2050,y2055,y2060,y2070,y2080,y2090,y2100,y2110/; $If "%c_timesteps%"== "test_TS" /y1995,y2000,y2005,y2010,y2020,y2030,y2040,y2050,y2070,y2090,y2110,y2130,y2150/; $If "%c_timesteps%"== "TS_benni" /y1995,y2000,y2005,y2010,y2020,y2030,y2040,y2050/; $If "%c_timesteps%"== "TS_WB" /y1995,y2000,y2005,y2010,y2020,y2030,y2040,y2050,y2060,y2070,y2080/; diff --git a/modules/15_food/anthro_iso_jun22/sets.gms b/modules/15_food/anthro_iso_jun22/sets.gms index 942de46d9e..2cceb800da 100644 --- a/modules/15_food/anthro_iso_jun22/sets.gms +++ b/modules/15_food/anthro_iso_jun22/sets.gms @@ -152,7 +152,7 @@ sets / constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, - lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 / + lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50,MP76,MP50,MP30 / t_scen15(t_all) Target years for transition to exogenous scenario diets / y2010, y2030, y2050 / diff --git a/modules/15_food/anthropometrics_jan18/sets.gms b/modules/15_food/anthropometrics_jan18/sets.gms index 04a1576e6f..0d53c684de 100644 --- a/modules/15_food/anthropometrics_jan18/sets.gms +++ b/modules/15_food/anthropometrics_jan18/sets.gms @@ -152,7 +152,7 @@ sets / constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, - lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 / + lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50,MP76,MP50,MP30 / t_scen15(t_all) Target years for transition to exogenous scenario diets / y2010, y2030, y2050 / diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 41c2438ab2..ae5adb26b2 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -28,12 +28,15 @@ map_file <- Sys.glob(file.path(outputdir, "clustermap_*.rds")) gdx <- file.path(outputdir, "fulldata.gdx") land_hr_file <- file.path(outputdir, "avl_land_full_t_0.5.mz") urban_land_hr_file <- file.path(outputdir, "f34_urbanland_0.5.mz") +wdpa_hr_file <- file.path(outputdir, "wdpa_baseline_0.5.mz") +consv_prio_hr_file <- file.path(outputdir, "consv_prio_areas_0.5.mz") +land_consv_hr_out_file <- file.path(outputdir, "cell.conservation_land_0.5.mz") land_hr_out_file <- file.path(outputdir, "cell.land_0.5.mz") land_hr_share_out_file <- file.path(outputdir, "cell.land_0.5_share.mz") croparea_hr_share_out_file <- file.path(outputdir, "cell.croparea_0.5_share.mz") land_hr_split_file <- file.path(outputdir, "cell.land_split_0.5.mz") land_hr_shr_split_file <- file.path(outputdir, "cell.land_split_0.5_share.mz") -luh_side_layers <- file.path(outputdir, "luh2_side_layers_0.5.mz") +luh_side_layers <- file.path(outputdir, "luh2_side_layers_0.5.mz") bii_hr_out_file <- file.path(outputdir, "cell.bii_0.5.mz") cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) @@ -56,7 +59,7 @@ if (length(map_file) > 1) { write.magpie(x, sub(".mz", ".nc", file), comment = comment, verbose = FALSE) } -.dissagcrop <- function(gdx, land_hr, map) { +.dissagcrop <- function(gdx, land_hr, map_file) { area <- croparea(gdx, level = "cell", products = "kcr", product_aggr = FALSE, water_aggr = FALSE @@ -69,11 +72,81 @@ if (length(map_file) > 1) { crop_shr <- setNames(crop_shr[, getYears(area_shr), "crop"], NULL) # calculate crop area as share of total cell area - area_shr_hr <- madrat::toolAggregate(area_shr, map, to = "cell") * crop_shr + area_shr_hr <- madrat::toolAggregate(area_shr, map_file, to = "cell") * crop_shr return(area_shr_hr) } -.dissagBII <- function(gdx, map, dir) { +.dissagLandConsv <- function(gdx, cfg, map_file, wdpa_hr_file, consv_prio_hr_file) { + land_consv_lr <- readGDX(gdx, "pm_land_conservation", react = "silent") + wdpa_hr <- read.magpie(wdpa_hr_file) + map <- readRDS(map_file) + + # create full time series + land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getNames(wdpa_hr)) + land_consv_hr[, getYears(land_consv_hr), ] <- wdpa_hr[, nyears(wdpa_hr), ] + land_consv_hr[, getYears(wdpa_hr), ] <- wdpa_hr + + if (!all(c(cfg$gms$c22_protect_scenario, cfg$gms$c22_protect_scenario_noselect) %in% "none")) { + if (file.exists(consv_prio_hr_file)) { + consv_prio_all <- read.magpie(consv_prio_hr_file) + consv_prio_hr <- new.magpie( + cells_and_regions = map[, "cell"], + names = getNames(consv_prio_all, dim = 2), fill = 0 + ) + iso <- readGDX(gdx, "iso") + consv_iso <- readGDX(gdx, "policy_countries22") + consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.1)] + consv_select <- cfg$gms$c22_protect_scenario + consv_noselect <- cfg$gms$c22_protect_scenario_noselect + + if (consv_noselect != "none") { + consv_prio_hr <- collapseDim(consv_prio_all[, , consv_noselect], dim = 3.1) + } + if (consv_select != "none") { + consv_prio_hr[consv_iso, , ] <- collapseDim(consv_prio_all[consv_iso, , consv_select], dim = 3.1) + } else if (consv_select == "none") { + consv_prio_hr[consv_iso, , ] <- 0 + } + # future conservation only pertains to natveg + consv_prio_hr[, , c("crop", "past", "forestry", "urban")] <- 0 + consv_fader <- readGDX(gdx, "p22_conservation_fader", format = "first_found") + consv_prio_hr <- consv_prio_hr * consv_fader[, getYears(land_consv_hr), ] + + # add conservation priority areas + land_consv_hr <- (land_consv_hr + consv_prio_hr) + } else { + warning(paste( + "Future land conservation used in MAgPIE run but high resolution", + "conservation priority data for disaggregation not found." + )) + } + } + # Due to internal constraints and compensation (e.g. NDC forest conservation) + # the actual land conservation can sometimes be smaller than the land + # conservation in the input data (this can especially happen also if + # land restoration is switched off). Therefore a scaling is applied here separately + # for grassland and natural vegetation + natveg <- c("primforest", "secdforest", "other") + consv_sum_lr <- mbind( + dimSums(land_consv_lr[, , "past"], 3.2), + setNames(dimSums(land_consv_lr[, , natveg], dim = 3), "natveg") + ) + consv_sum_hr_agg <- mbind( + toolAggregate(land_consv_hr[, , "past"], map, from = "cell", to = "cluster"), + toolAggregate(setNames(dimSums(land_consv_hr[, , natveg], dim = 3), "natveg"), + map, + from = "cell", to = "cluster" + ) + ) + consv_scaling <- consv_sum_lr / consv_sum_hr_agg + consv_scaling[is.na(consv_scaling) | is.infinite(consv_scaling)] <- 1 + consv_scaling <- toolAggregate(consv_scaling, map, from = "cluster", to = "cell") + land_consv_hr[, , "past"] <- consv_scaling[, , "past"] * land_consv_hr[, , "past"] + land_consv_hr[, , natveg] <- consv_scaling[, , "natveg"] * land_consv_hr[, , natveg] + return(land_consv_hr) +} + +.dissagBII <- function(gdx, map_file, dir) { # Biodiversity intactness indicator (BII) at cluster level bii_lr <- BII(gdx, file = NULL, level = "cell", mode = "auto", landClass = "all", @@ -119,7 +192,9 @@ if (length(map_file) > 1) { # Prepare data for disaggregation # ======================================== +# ---------------------- # Load input data +# ---------------------- land_ini_lr <- readGDX(gdx, "f10_land", "f_land", format = "first_found")[, "y1995", ] land_lr <- land(gdx, sum = FALSE, level = "cell") land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] @@ -152,7 +227,9 @@ if (any(land_ini_hr < 0)) { land_ini_hr[which(land_ini_hr < 0, arr.ind = T)] <- 0 } -### Read in hr urban land +# ----------------------------- +# Read in hr urban land +# ----------------------------- if (cfg$gms$urban == "exo_nov21") { urban_land_hr <- read.magpie(urban_land_hr_file) ssp <- cfg$gms$c34_urban_scenario @@ -162,37 +239,24 @@ if (cfg$gms$urban == "exo_nov21") { urban_land_hr <- "static" } -### Get land conservation data -wdpa_hr <- NULL -if (file.exists(file.path(outputdir, "wdpa_baseline_0.5.mz"))) { - wdpa_hr <- file.path(outputdir, "wdpa_baseline_0.5.mz") -} -consv_prio_hr <- NULL -if (!all(c(cfg$gms$c22_protect_scenario, cfg$gms$c22_protect_scenario_noselect) %in% "none")) { - if (file.exists(file.path(outputdir, "consv_prio_areas_0.5.mz"))) { - consv_prio_all <- read.magpie(file.path(outputdir, "consv_prio_areas_0.5.mz")) - consv_prio_hr <- new.magpie( - cells = getCells(consv_prio_all), - names = getNames(consv_prio_all, dim = 2), fill = 0 - ) - iso <- readGDX(gdx, "iso") - consv_iso <- readGDX(gdx, "policy_countries22") - consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.1)] - consv_select <- cfg$gms$c22_protect_scenario - consv_noselect <- cfg$gms$c22_protect_scenario_noselect - - if (consv_noselect != "none") { - consv_prio_hr <- collapseDim(consv_prio_all[, , consv_noselect], dim = 3.1) - } - if (consv_select != "none") { - consv_prio_hr[consv_iso, , ] <- collapseDim(consv_prio_all[consv_iso, , consv_select], dim = 3.1) - } else if (consv_select == "none") { - consv_prio_hr[consv_iso, , ] <- 0 - } - } +# ---------------------------------------- +# Prepare land conservation data +# ---------------------------------------- + +land_consv_hr <- NULL +if (file.exists(wdpa_hr_file)) { + land_consv_hr <- .dissagLandConsv(gdx, cfg, map_file, wdpa_hr_file, consv_prio_hr_file) + + # Write gridded conservation land + .writeDisagg(land_consv_hr, land_consv_hr_out_file, + comment = "unit: Mha per grid-cell", + message = "Write outputs cell.conservation_land" + ) } -### Account for country-specific SNV shares in post-processing +# ------------------------------------------------------------- +# Account for country-specific SNV shares in post-processing +# ------------------------------------------------------------- iso <- readGDX(gdx, "iso") snv_pol_iso <- readGDX(gdx, "policy_countries30") snv_pol_select <- readGDX(gdx, "s30_snv_shr", "s30_set_aside_shr") @@ -227,14 +291,13 @@ land_hr <- interpolateAvlCroplandWeighted( x = land_lr, x_ini_lr = land_ini_lr, x_ini_hr = land_ini_hr, - avl_cropland_hr = avl_cropland_hr, map = map_file, + avl_cropland_hr = avl_cropland_hr, marginal_land = marginal_land, - snv_pol_shr = snv_pol_shr, - snv_pol_fader = snv_pol_fader, urban_land_hr = urban_land_hr, - wdpa_hr = wdpa_hr, - consv_prio_hr = consv_prio_hr + land_consv_hr = land_consv_hr, + snv_pol_shr = snv_pol_shr, + snv_pol_fader = snv_pol_fader ) # Write output @@ -375,7 +438,7 @@ if (grepl("grass", cfg$gms$past)) { } # Sort and rename -land_ini_hr <- land_ini_hr[,,getNames(land_ini_lr)] +land_ini_hr <- land_ini_hr[, , getNames(land_ini_lr)] getSets(land_ini_hr)["d3.1"] <- "land" # Disaggregate BII values to high resolution @@ -386,14 +449,13 @@ land_bii_hr <- interpolateAvlCroplandWeighted( x = land_lr, x_ini_lr = land_ini_lr, x_ini_hr = land_ini_hr, - avl_cropland_hr = avl_cropland_hr, map = map_file, + avl_cropland_hr = avl_cropland_hr, marginal_land = marginal_land, + urban_land_hr = urban_land_hr, + land_consv_hr = land_consv_hr, snv_pol_shr = snv_pol_shr, snv_pol_fader = snv_pol_fader, - urban_land_hr = urban_land_hr, - wdpa_hr = wdpa_hr, - consv_prio_hr = consv_prio_hr, unit = "share" ) diff --git a/scripts/output/extra/disaggregation_old.R b/scripts/output/extra/disaggregation_old.R new file mode 100644 index 0000000000..41c2438ab2 --- /dev/null +++ b/scripts/output/extra/disaggregation_old.R @@ -0,0 +1,416 @@ +# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# -------------------------------------------------------------- +# description: Interpolates land pools to 0.5 degree resolution +# comparison script: FALSE +# --------------------------------------------------------------- + +library(lucode2) +library(magpie4) +library(luscale) +library(madrat) +library(dplyr) +library(gms) + +# ============================================= +# Basic configuration +# ============================================= +if (!exists("source_include")) { + outputdir <- "output/LAMA65_Sustainability/" + readArgs("outputdir") +} +map_file <- Sys.glob(file.path(outputdir, "clustermap_*.rds")) +gdx <- file.path(outputdir, "fulldata.gdx") +land_hr_file <- file.path(outputdir, "avl_land_full_t_0.5.mz") +urban_land_hr_file <- file.path(outputdir, "f34_urbanland_0.5.mz") +land_hr_out_file <- file.path(outputdir, "cell.land_0.5.mz") +land_hr_share_out_file <- file.path(outputdir, "cell.land_0.5_share.mz") +croparea_hr_share_out_file <- file.path(outputdir, "cell.croparea_0.5_share.mz") +land_hr_split_file <- file.path(outputdir, "cell.land_split_0.5.mz") +land_hr_shr_split_file <- file.path(outputdir, "cell.land_split_0.5_share.mz") +luh_side_layers <- file.path(outputdir, "luh2_side_layers_0.5.mz") +bii_hr_out_file <- file.path(outputdir, "cell.bii_0.5.mz") + +cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) + +withr::local_options(list(magclass_sizeLimit = 1e+12)) + +if (length(map_file) == 0) stop("Could not find map file!") +if (length(map_file) > 1) { + warning("More than one map file found. First occurrence will be used!") + map_file <- map_file[1] +} + + +# ----------------------------------------- +# Output functions +# ----------------------------------------- + +.writeDisagg <- function(x, file, comment, message) { + write.magpie(x, file, comment = comment) + write.magpie(x, sub(".mz", ".nc", file), comment = comment, verbose = FALSE) +} + +.dissagcrop <- function(gdx, land_hr, map) { + area <- croparea(gdx, + level = "cell", products = "kcr", + product_aggr = FALSE, water_aggr = FALSE + ) + fallow <- fallow(gdx, level = "cell") + area_shr <- area / (dimSums(area, dim = 3) + setNames(fallow, NULL) + 10^-10) + + # calculate share of crop land on total cell area + crop_shr <- land_hr / dimSums(land_hr, dim = 3) + crop_shr <- setNames(crop_shr[, getYears(area_shr), "crop"], NULL) + + # calculate crop area as share of total cell area + area_shr_hr <- madrat::toolAggregate(area_shr, map, to = "cell") * crop_shr + return(area_shr_hr) +} + +.dissagBII <- function(gdx, map, dir) { + # Biodiversity intactness indicator (BII) at cluster level + bii_lr <- BII(gdx, + file = NULL, level = "cell", mode = "auto", landClass = "all", + bii_coeff = NULL, side_layers = NULL, dir = dir + ) + + # add BII values for primary other land (BII = 1) + bii_lr <- mbind( + bii_lr[, , "other", invert = TRUE], + setNames(bii_lr[, , "other"], c("primother.forested", "primother.nonforested")), + setNames(bii_lr[, , "other"], c("secdother.forested", "secdother.nonforested")) + ) + bii_lr[, , c("primother.forested", "primother.nonforested")] <- 1 + + # Disaggregate BII coefficients to grid cell level + bii_hr <- toolAggregate(x = bii_lr, rel = map_file, from = "cluster", to = "cell") + return(bii_hr) +} + +.extend2luhv2 <- function(x, land = deparse(substitute(x))) { + if (land == "land_lr") { + grassland_areas <- readGDX(gdx, "ov31_grass_area")[, , "level"] + grassland_areas <- collapseNames(grassland_areas) + land_lr <- mbind(x, grassland_areas) + drop_past <- !grepl("past$", getNames(land_lr)) + land_lr <- land_lr[, , drop_past] + getNames(land_lr) <- gsub("pastr", "past", getNames(land_lr)) + return(land_lr) + } + + if (land == "land_ini_lr") { + grassland_areas <- readGDX(gdx, "ov31_grass_area")[, "y1995", "level"] + grassland_areas <- collapseNames(grassland_areas) + land_ini_lr <- mbind(x, grassland_areas) + drop_past <- !grepl("past$", getNames(land_ini_lr)) + land_ini_lr <- land_ini_lr[, , drop_past] + getNames(land_ini_lr) <- gsub("pastr", "past", getNames(land_ini_lr)) + return(land_ini_lr) + } +} + +# ======================================== +# Prepare data for disaggregation +# ======================================== + +# Load input data +land_ini_lr <- readGDX(gdx, "f10_land", "f_land", format = "first_found")[, "y1995", ] +land_lr <- land(gdx, sum = FALSE, level = "cell") +land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] + +### Make sure grassland types are consistent +magpie2luh2 <- data.frame(matrix(nrow = 4, ncol = 2)) +names(magpie2luh2) <- c("MAgPIE", "LUH2") +magpie2luh2[1, ] <- c("crop", "crop") +magpie2luh2[4, ] <- c("urban", "urban") +magpie2luh2[5, ] <- c("primforest", "primforest") +magpie2luh2[6, ] <- c("secdforest", "secdforest") +magpie2luh2[7, ] <- c("forestry", "forestry") +magpie2luh2[8, ] <- c("other", "primother") +magpie2luh2[9, ] <- c("other", "secdother") + +if (grepl("grass", cfg$gms$past)) { + land_lr <- .extend2luhv2(land_lr) + land_ini_lr <- .extend2luhv2(land_ini_lr) + magpie2luh2[3, ] <- c("range", "range") + magpie2luh2[2, ] <- c("past", "past") +} else { + magpie2luh2[3, ] <- c("past", "range") + magpie2luh2[2, ] <- c("past", "past") +} + +land_ini_hr <- madrat::toolAggregate(land_ini_hr, magpie2luh2, from = "LUH2", to = "MAgPIE", dim = 3.1) +land_ini_hr <- land_ini_hr[, , getNames(land_lr)] +if (any(land_ini_hr < 0)) { + warning(paste0("Negative values in inital high resolution dataset detected and set to 0. Check the file ", land_hr_file)) + land_ini_hr[which(land_ini_hr < 0, arr.ind = T)] <- 0 +} + +### Read in hr urban land +if (cfg$gms$urban == "exo_nov21") { + urban_land_hr <- read.magpie(urban_land_hr_file) + ssp <- cfg$gms$c34_urban_scenario + urban_land_hr <- urban_land_hr[, , ssp] + getNames(urban_land_hr) <- "urban" +} else if (cfg$gms$urban == "static") { + urban_land_hr <- "static" +} + +### Get land conservation data +wdpa_hr <- NULL +if (file.exists(file.path(outputdir, "wdpa_baseline_0.5.mz"))) { + wdpa_hr <- file.path(outputdir, "wdpa_baseline_0.5.mz") +} +consv_prio_hr <- NULL +if (!all(c(cfg$gms$c22_protect_scenario, cfg$gms$c22_protect_scenario_noselect) %in% "none")) { + if (file.exists(file.path(outputdir, "consv_prio_areas_0.5.mz"))) { + consv_prio_all <- read.magpie(file.path(outputdir, "consv_prio_areas_0.5.mz")) + consv_prio_hr <- new.magpie( + cells = getCells(consv_prio_all), + names = getNames(consv_prio_all, dim = 2), fill = 0 + ) + iso <- readGDX(gdx, "iso") + consv_iso <- readGDX(gdx, "policy_countries22") + consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.1)] + consv_select <- cfg$gms$c22_protect_scenario + consv_noselect <- cfg$gms$c22_protect_scenario_noselect + + if (consv_noselect != "none") { + consv_prio_hr <- collapseDim(consv_prio_all[, , consv_noselect], dim = 3.1) + } + if (consv_select != "none") { + consv_prio_hr[consv_iso, , ] <- collapseDim(consv_prio_all[consv_iso, , consv_select], dim = 3.1) + } else if (consv_select == "none") { + consv_prio_hr[consv_iso, , ] <- 0 + } + } +} + +### Account for country-specific SNV shares in post-processing +iso <- readGDX(gdx, "iso") +snv_pol_iso <- readGDX(gdx, "policy_countries30") +snv_pol_select <- readGDX(gdx, "s30_snv_shr", "s30_set_aside_shr") +snv_pol_noselect <- readGDX(gdx, "s30_snv_shr_noselect", "s30_set_aside_shr_noselect") +snv_pol_shr <- new.magpie(iso, fill = snv_pol_noselect) +snv_pol_shr[snv_pol_iso, , ] <- snv_pol_select + +avl_cropland_hr <- file.path(outputdir, "avl_cropland_0.5.mz") # available cropland (at high resolution) +marginal_land <- cfg$gms$c30_marginal_land # marginal land scenario +target_year <- cfg$gms$c30_snv_target # target year of SNV policy (default: "none") +if (is.null(target_year)) { + target_year <- cfg$gms$c30_set_aside_target +} +snv_pol_fader <- readGDX(gdx, "f30_scenario_fader", "f30_set_aside_fader", + format = "first_found", react = "silent" +)[, , target_year] +if (is.null(snv_pol_fader)) { + snv_pol_fader <- readGDX(gdx, "p30_snv_scenario_fader", format = "first_found") +} + +# ============================================ +# Start disaggregation +# ============================================ + +# --------------------------------- +# Disaggregate MAgPIE land pools +# --------------------------------- + +# Start interpolation (use interpolateAvlCroplandWeighted from luscale) +message("Disaggregating MAgPIE land pools") +land_hr <- interpolateAvlCroplandWeighted( + x = land_lr, + x_ini_lr = land_ini_lr, + x_ini_hr = land_ini_hr, + avl_cropland_hr = avl_cropland_hr, + map = map_file, + marginal_land = marginal_land, + snv_pol_shr = snv_pol_shr, + snv_pol_fader = snv_pol_fader, + urban_land_hr = urban_land_hr, + wdpa_hr = wdpa_hr, + consv_prio_hr = consv_prio_hr +) + +# Write output +.writeDisagg(land_hr, land_hr_out_file, + comment = "unit: Mha per grid-cell", + message = "Write outputs cell.land" +) +.writeDisagg(land_hr / dimSums(land_hr, dim = 3.1), land_hr_share_out_file, + comment = "unit: grid-cell land area fraction", + message = "Write outputs cell.land_share" +) +gc() + +# --------------------------------- +# Disaggregate MAgPIE crop types +# --------------------------------- + +message("Disaggregating MAgPIE crop types") +area_shr_hr <- .dissagcrop(gdx, land_hr, map = map_file) + +# Write output +.writeDisagg(area_shr_hr, croparea_hr_share_out_file, + comment = "unit: croparea fractions of total grid-cell", + message = "Write outputs cell.cropara_share" +) +gc() + +# --------------------------------- +# Split land pools +# --------------------------------- +land_split_hr <- land_hr[, getYears(area_shr_hr), ] +area_hr <- area_shr_hr * dimSums(land_split_hr, dim = 3) + +# replace crop in land_hr in with crop_kfo_rf, crop_kfo_ir, crop_kbe_rf +# and crop_kbe_ir +kbe <- c("betr", "begr") +kfo <- setdiff(getNames(area_hr, dim = 1), kbe) +crop_kfo_rf <- setNames( + dimSums(area_hr[, , kfo][, , "rainfed"], dim = 3), + "crop_kfo_rf" +) +crop_kfo_ir <- setNames( + dimSums(area_hr[, , kfo][, , "irrigated"], dim = 3), + "crop_kfo_ir" +) +crop_kbe_rf <- setNames( + dimSums(area_hr[, , kbe][, , "rainfed"], dim = 3), + "crop_kbe_rf" +) +crop_kbe_ir <- setNames( + dimSums(area_hr[, , kbe][, , "irrigated"], dim = 3), + "crop_kbe_ir" +) +crop_hr <- mbind(crop_kfo_rf, crop_kfo_ir, crop_kbe_rf, crop_kbe_ir) +# calculate Fallow +fallow <- setNames(land_split_hr[, , "crop"] - dimSums(area_hr, dim = 3), "fallow") +# drop crop +land_split_hr <- land_split_hr[, , "crop", invert = TRUE] +# combine land_split_hr with crop_hr. +land_split_hr <- mbind(crop_hr, fallow, land_split_hr) + +# split "forestry" into timber plantations, pre-scribed afforestation (NPi/NDC) and endogenous afforestation (CO2 price driven) +message("Disaggregating forestry") +farea <- dimSums(landForestry(gdx, level = "cell"), dim = "ac") +farea_shr <- farea / (dimSums(farea, dim = 3) + 10^-10) +# calculate forestry area as share of total cell area +farea_hr <- madrat::toolAggregate(farea_shr, map_file, to = "cell") * setNames(land_split_hr[, , "forestry"], NULL) +# check +if (abs(sum(dimSums(farea_hr, dim = 3) - setNames(land_split_hr[, , "forestry"], NULL), na.rm = T)) > 0.1) warning("large Difference in crop disaggregation detected!") +# rename +df <- data.frame(matrix(nrow = 3, ncol = 2)) +names(df) <- c("internal", "output") +df[1, ] <- c("aff", "PlantedForest_Afforestation") +df[2, ] <- c("ndc", "PlantedForest_NPiNDC") +df[3, ] <- c("plant", "PlantedForest_Timber") +farea_hr <- madrat::toolAggregate(farea_hr, df, from = "internal", to = "output", dim = 3.1) + +# drop forestry +land_split_hr <- land_split_hr[, , "forestry", invert = TRUE] +# combine land_split_hr with farea_hr +land_split_hr <- mbind(land_split_hr, farea_hr) + +# Write output +.writeDisagg(land_split_hr, land_hr_split_file, + comment = "unit: Mha per grid-cell", + message = "Write cropsplit land area" +) +.writeDisagg(land_split_hr / dimSums(land_split_hr, dim = 3), land_hr_shr_split_file, + comment = "unit: grid-cell land area fraction", + message = "Write cropsplit land area share" +) +gc() + +# -------------------------------- +# Disaggregate BII +# -------------------------------- + +message("Disaggregating BII values") + +# Load input data for BII disaggregation +land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] +side_layers_hr <- read.magpie(luh_side_layers) +landArea <- dimSums(land_ini_hr, dim = 3) +side_layers_lr <- toolAggregate(x = side_layers_hr, rel = map_file, weight = landArea, from = "cell", to = "cluster") + +# Convert land types for BII disaggregation +land_ini_hr <- mbind( + land_ini_hr[, , c("primother", "secdother"), invert = TRUE], + setNames(dimSums(land_ini_hr[, , c("primother", "secdother")], dim = 3), + nm = "other" + ) +) +getNames(land_ini_hr) <- gsub( + "past", "manpast", + gsub("range", "rangeland", getNames(land_ini_hr)) +) + +if (grepl("grass", cfg$gms$past)) { + getNames(land_ini_lr) <- gsub( + "past", "manpast", + gsub("range", "rangeland", getNames(land_ini_lr)) + ) + getNames(land_lr) <- gsub( + "past", "manpast", + gsub("range", "rangeland", getNames(land_lr)) + ) +} else { + # Disaggregate pasture + land_ini_lr <- mbind( + land_ini_lr[, , c("past"), invert = TRUE], + collapseNames(land_ini_lr[, , "past"]) * side_layers_lr[, , c("manpast", "rangeland")] + ) + + land_lr <- mbind( + land_lr[, , c("past"), invert = TRUE], + collapseNames(land_lr[, , "past"]) * side_layers_lr[, , c("manpast", "rangeland")] + ) +} + +# Sort and rename +land_ini_hr <- land_ini_hr[,,getNames(land_ini_lr)] +getSets(land_ini_hr)["d3.1"] <- "land" + +# Disaggregate BII values to high resolution +bii_hr <- .dissagBII(gdx, map = map_file, dir = outputdir) + +# Disaggregate land pools for BII estimation +land_bii_hr <- interpolateAvlCroplandWeighted( + x = land_lr, + x_ini_lr = land_ini_lr, + x_ini_hr = land_ini_hr, + avl_cropland_hr = avl_cropland_hr, + map = map_file, + marginal_land = marginal_land, + snv_pol_shr = snv_pol_shr, + snv_pol_fader = snv_pol_fader, + urban_land_hr = urban_land_hr, + wdpa_hr = wdpa_hr, + consv_prio_hr = consv_prio_hr, + unit = "share" +) + +# Add primary and secondaray other land +land_bii_hr <- PrimSecdOtherLand(land_bii_hr, land_hr_file) + +# specify potential natural vegetation +land_bii_hr <- land_bii_hr * side_layers_hr[, , c("forested", "nonforested")] + +# Sum over land classes +bii_hr <- dimSums(land_bii_hr * bii_hr, dim = 3, na.rm = TRUE) + +# Write output +.writeDisagg(bii_hr, bii_hr_out_file, + comment = "unitless", + message = "Write output BII at 0.5°" +) +gc() + +message("Finished disaggregation") diff --git a/scripts/start/projects/MP_demand.R b/scripts/start/projects/MP_demand.R new file mode 100644 index 0000000000..ffbdf194e9 --- /dev/null +++ b/scripts/start/projects/MP_demand.R @@ -0,0 +1,156 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Demand-Driven +# position: 5 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$qos <- "standby" +#cfg$qos <- "priority" + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + +#R11: a10a580c, R12: 26df900e +cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", + cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.87_26df900e_validation.tgz", + additional = "additional_data_rev4.43.tgz", + patch = "MMEmuR12_rev4.87.tgz") + +cfg$force_replace <- TRUE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "SCP_23-10-11_set-36_exp2110" +#identifierFlag <-"23-09-11_forest-check" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +cfg$gms$c_timesteps <- "coup2110" + +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" +# non-default BE demands +cfg$gms$c60_1stgen_biodem <- "phaseout2020" +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 + +# Subsidies / Prices +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 +cfg$gms$c60_price_implementation <- "lin" + +cfg$gms$s60_bioenergy_gj_price_1st <- 0 +cfg$gms$s60_bioenergy_price_2nd <- 0 + +#beV <- c(0, 5, 7, 10, 15, 25, 45) +beV <- c(10) + +### GHG +cfg$gms$c56_mute_ghgprices_until <- "y2020" +#gV <- c(0, 10, 20, 50, 100, 200, 400, 600, 990, 2000, 3000, 4000) +#gV <- c(0, 10, 20, 21, 50, 100, 200, 400, 600, 990, 1000, 1990, 2000, 3000, 4000) +gV <-c (20) +#alternatives: 21, 1990 + + +### Tau / Yield +cfg$gms$c14_yields_scenario <- "nocc_hist" +cfg$gms$c13_tccost <- "high" #default: medium + + +### Biodiv +cfg$gms$biodiversity <- "bii_target" +blV <- c(0) #BII lower bound in %(0-100), default 0 +cfg$gms$s44_cost_bii_missing <- 10 * 1000000 + + +### Cropland +cfg$gms$s30_annual_max_growth <- 0.02 + + +### Foresty +cfg$gms$s56_c_price_induced_aff <- 1 +cfg$gms$s32_max_aff_cell_2025 <- 0.005001 +#cfg$gms$s32_max_aff_cell_2025 <- 0.005001 +# def = inf #0.005 = globally 1Mha Aff allowed in 2025 + + +### Food +cfg$gms$food <- "anthropometrics_jan18" +cfg$gms$c20_scp_type <- "hydrogen" + +mpV <- c(0) #0, 20, 50, 76 + + +for (bl in blV) { + bd <- 0 + if (bl == 0) { + bd <- 1 + } + + cfg$gms$c44_bii_decrease <- bd + cfg$gms$s44_bii_lower_bound <- bl + + for (mp in mpV) { + + if (mp != 0){ + cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + } else { + cfg$gms$c15_rumdairy_scp_scen <- "constant" + } + + preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), + "BI", str_pad(bl * 100, 2, pad = "0") + ) + cfg$results_folder <- paste( + "output", identifierFlag, preflag, ":title:", sep = "/" + ) + + for (be in beV) { + + be <- paste0("E", str_pad(be, 2, pad = "0")) + cfg$gms$c60_2ndgen_biodem <- paste0(preflag, be) + + for (g in gV){ + + g <- paste0("G", str_pad(g, 4, pad = "0")) + + #cfg$gms$c56_pollutant_prices <- g + cfg$gms$c56_pollutant_prices <- paste0(g, "exp2110") + + ############################################## + runflag <- "demand" + + cfg$title <- paste0(preflag, be, g, runflag) + + start_run(cfg, codeCheck = FALSE) + + } # GHG + } # BE + } # MP replacement +} # BII lower bound diff --git a/scripts/start/projects/MP_feedback.R b/scripts/start/projects/MP_feedback.R new file mode 100644 index 0000000000..b101a2eb0a --- /dev/null +++ b/scripts/start/projects/MP_feedback.R @@ -0,0 +1,150 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator Demand-Driven +# position: 5 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +#cfg$qos <- "standby" +cfg$qos <- "priority" + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + +#R11: a10a580c, R12: 26df900e +cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", + cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.87_26df900e_validation.tgz", + additional = "additional_data_rev4.43.tgz", + patch = "MMEmuR12_rev4.87.tgz") + +cfg$force_replace <- FALSE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "SCP_23-10-11_set-36_exp2110" +f_flag <- "" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +cfg$gms$c_timesteps <- "coup2110" + +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" +# non-default BE demands +cfg$gms$c60_1stgen_biodem <- "phaseout2020" +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 + +# Subsidies / Prices +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 +cfg$gms$c60_price_implementation <- "lin" + +cfg$gms$s60_bioenergy_gj_price_1st <- 0 +cfg$gms$s60_bioenergy_price_2nd <- 0 + + +### GHG +cfg$gms$c56_mute_ghgprices_until <- "y2020" + + +### Tau / Yield +cfg$gms$c14_yields_scenario <- "nocc_hist" +cfg$gms$c13_tccost <- "high" #default: medium +cfg$gms$tc <- "exo" + + +### Biodiv +cfg$gms$biodiversity <- "bii_target" +blV <- c(0) #BII lower bound (0-1), default 0 +#0, 0.7, 0.74, 0.78 +cfg$gms$s44_cost_bii_missing <- 10 * 1000000 + + +### Cropland +cfg$gms$s30_annual_max_growth <- 0.02 +#cfg$gms$s30_annual_max_growth <- 0.5 + +### Foresty +cfg$gms$s56_c_price_induced_aff <- 1 +cfg$gms$s32_max_aff_cell_2025 <- 0.005 +# def = inf # 0.005 = globally 1Mha Aff allowed in 2025 #nolint + + +### Food +cfg$gms$food <- "anthropometrics_jan18" +cfg$gms$c20_scp_type <- "hydrogen" + +mpV <- c(0) #0, 20, 50, 76 + + +for (bl in blV) { + bd <- 0 + if (bl == 0) { + bd <- 1 + } + + cfg$gms$c44_bii_decrease <- bd + cfg$gms$s44_bii_lower_bound <- bl + + for (mp in mpV) { + + if (mp != 0){ + cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + } else { + cfg$gms$c15_rumdairy_scp_scen <- "constant" + } + + preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), + "BD", bd, "BI", str_pad(bl * 100, 2, pad = "0") + ) + cfg$results_folder <- paste( + # "output", identifierFlag, preflag, ":title:", sep = "/" + "output", identifierFlag, ":title:", sep = "/" + ) + + #n <- paste("Feedback", preflag, sep = "_") + n <- "Feedback_step13_400f" + m <- n + #cfg$gms$c60_2ndgen_biodem <- paste(n, f_flag, sep = "_") + cfg$gms$c60_2ndgen_biodem <- n + #cfg$gms$c56_pollutant_prices <- paste(n, f_flag, sep = "_") + cfg$gms$c56_pollutant_prices <- m + #cfg$gms$c56_pollutant_prices <- "Feedback_MP00BD1BI00_1000f_maxPrice" + + + ############################################## + #runflag <- paste("feedback", f_flag, sep = "_") + runflag <- paste0(m, "") + + cfg$title <- paste0(preflag, runflag) + + start_run(cfg, codeCheck = FALSE) + + + } # MP replacement +} # BII lower bound diff --git a/scripts/start/projects/MP_price.R b/scripts/start/projects/MP_price.R new file mode 100644 index 0000000000..de49a6d4de --- /dev/null +++ b/scripts/start/projects/MP_price.R @@ -0,0 +1,138 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator SCP Price Setup +# position: 5 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$qos <- "standby" +#cfg$qos <- "priority" + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + +#R11: a10a580c, R12: 26df900e +cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", + cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.87_26df900e_validation.tgz", + additional = "additional_data_rev4.43.tgz", + patch = "MMEmuR12_rev4.87.tgz") + + +cfg$force_replace <- FALSE + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) #load config presets + +### Identifier and folder +############################################### +identifierFlag <- "SCP_23-10-11_set-36_exp2110" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +cfg$gms$c_timesteps <- "coup2110" + +### BE +cfg$gms$bioenergy <- "MMEmu_feb23" +# non-default BE demands +cfg$gms$c60_1stgen_biodem <- "phaseout2020" +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-phaseout2020" +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 + +# Subsidies / Prices +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$c60_bioenergy_subsidy <- 0 +cfg$gms$c60_price_implementation <- "lin" + +beV <- c(0, 5, 7, 10, 15, 25, 45) + + +### GHG +cfg$gms$c56_mute_ghgprices_until <- "y2020" +cfg$gms$c56_pollutant_prices <- "G0000" + + +### Tau / Yield +cfg$gms$c14_yields_scenario <- "nocc_hist" +cfg$gms$tc <- "exo" +cfg$gms$c13_tccost <- "high" #default: medium + + +### Biodiv +cfg$gms$biodiversity <- "bii_target" +#bdV <- c(1) # 0: no BD decrease, 1: decrease allowed +#blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 +blV <- c(0) +cfg$gms$s44_cost_bii_missing <- 10 * 1000000 + +### Cropland +cfg$gms$s30_annual_max_growth <- 0.02 + + +### Foresty +cfg$gms$s56_c_price_induced_aff <- 1 +cfg$gms$s32_max_aff_cell_2025 <- 0.005 # def = inf #0.005 = globally 1Mha Aff allowed in 2025 + + +### Food +cfg$gms$food <- "anthropometrics_jan18" +cfg$gms$c20_scp_type <- "hydrogen" + +mpV <- c(0) + + + +for (bl in blV) { + bd <- 0 + if (bl == 0) { + bd <- 1 + } + + cfg$gms$c44_bii_decrease <- bd + cfg$gms$s44_bii_lower_bound <- bl + + for (mp in mpV) { + preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), "BI", str_pad(bl * 100, 2, pad = "0")) + cfg$results_folder <- paste("output", identifierFlag, preflag, ":title:", sep = "/") + + if (mp != 0){ + cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + } + else { + cfg$gms$c15_rumdairy_scp_scen <- "constant" + } + + for (be in beV) { + cfg$gms$s60_bioenergy_gj_price_1st <- be + cfg$gms$s60_bioenergy_price_2nd <- be + + ############################################## + runflag <- "price" + cfg$title <- paste0(preflag, "E", str_pad(be, 2, pad = "0"), "G0000", runflag) + + start_run(cfg, codeCheck = FALSE) + + } # BE + } # MP replacement +} # BII lower bound diff --git a/scripts/start/projects/mp_default.R b/scripts/start/projects/mp_default.R new file mode 100644 index 0000000000..7e183d125f --- /dev/null +++ b/scripts/start/projects/mp_default.R @@ -0,0 +1,17 @@ +# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ------------------------------------------------ +# description: start run with mp_default.cfg settings +# position: 1 +# ------------------------------------------------ + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") + +#start MAgPIE run +start_run(cfg = "mp_default.cfg") From cc42491b4afef124596253a96b4195159ce62c14 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 23 Nov 2023 15:47:19 +0100 Subject: [PATCH 030/259] Update MP start scripts --- scripts/start/projects/MP_demand.R | 132 ++++++++-------------------- scripts/start/projects/MP_price.R | 63 ++----------- scripts/start/projects/mp_default.R | 14 ++- 3 files changed, 57 insertions(+), 152 deletions(-) diff --git a/scripts/start/projects/MP_demand.R b/scripts/start/projects/MP_demand.R index ffbdf194e9..e951203f1f 100644 --- a/scripts/start/projects/MP_demand.R +++ b/scripts/start/projects/MP_demand.R @@ -22,135 +22,81 @@ library(stringr) # Load start_run(cfg) function which is needed to start MAgPIE runs source("scripts/start_functions.R") #nolinter # Source the default config and then over-write it before starting the run. -source("config/default.cfg") #nolinter - -cfg$qos <- "standby" -#cfg$qos <- "priority" - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) - -#R11: a10a580c, R12: 26df900e -cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", - cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.87_26df900e_validation.tgz", - additional = "additional_data_rev4.43.tgz", - patch = "MMEmuR12_rev4.87.tgz") +source("config/mp_default.cfg") #nolinter cfg$force_replace <- TRUE +cfg$qos <- "standby" ssp <- "SSP2" cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### -identifierFlag <- "SCP_23-10-11_set-36_exp2110" -#identifierFlag <-"23-09-11_forest-check" +identifierFlag <- "SCP_23-11-22" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") -cfg$gms$c_timesteps <- "coup2110" ### BE -cfg$gms$bioenergy <- "MMEmu_feb23" -# non-default BE demands -cfg$gms$c60_1stgen_biodem <- "phaseout2020" cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 - -# Subsidies / Prices -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 cfg$gms$c60_bioenergy_subsidy <- 0 -cfg$gms$c60_price_implementation <- "lin" - -cfg$gms$s60_bioenergy_gj_price_1st <- 0 -cfg$gms$s60_bioenergy_price_2nd <- 0 - -#beV <- c(0, 5, 7, 10, 15, 25, 45) -beV <- c(10) +beV <- c(0, 5, 7, 10, 15, 25, 45) ### GHG -cfg$gms$c56_mute_ghgprices_until <- "y2020" -#gV <- c(0, 10, 20, 50, 100, 200, 400, 600, 990, 2000, 3000, 4000) -#gV <- c(0, 10, 20, 21, 50, 100, 200, 400, 600, 990, 1000, 1990, 2000, 3000, 4000) -gV <-c (20) -#alternatives: 21, 1990 - - -### Tau / Yield -cfg$gms$c14_yields_scenario <- "nocc_hist" -cfg$gms$c13_tccost <- "high" #default: medium - +gV <- c(0, 10, 20, 50, 100, 200, 400, 600, 1000, 2000, 3000, 4000) ### Biodiv -cfg$gms$biodiversity <- "bii_target" -blV <- c(0) #BII lower bound in %(0-100), default 0 -cfg$gms$s44_cost_bii_missing <- 10 * 1000000 - - -### Cropland -cfg$gms$s30_annual_max_growth <- 0.02 - - -### Foresty -cfg$gms$s56_c_price_induced_aff <- 1 -cfg$gms$s32_max_aff_cell_2025 <- 0.005001 -#cfg$gms$s32_max_aff_cell_2025 <- 0.005001 -# def = inf #0.005 = globally 1Mha Aff allowed in 2025 - +blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 ### Food -cfg$gms$food <- "anthropometrics_jan18" -cfg$gms$c20_scp_type <- "hydrogen" - -mpV <- c(0) #0, 20, 50, 76 +pV <- c(0, 20, 50, 76) #0, 20, 50, 76 for (bl in blV) { - bd <- 0 - if (bl == 0) { - bd <- 1 - } + bd <- 0 + if (bl == 0) { + bd <- 1 + } - cfg$gms$c44_bii_decrease <- bd - cfg$gms$s44_bii_lower_bound <- bl + cfg$gms$c44_bii_decrease <- bd + cfg$gms$s44_bii_lower_bound <- bl - for (mp in mpV) { + for (mp in mpV) { - if (mp != 0){ - cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) - } else { - cfg$gms$c15_rumdairy_scp_scen <- "constant" - } + if (mp != 0){ + cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + } else { + cfg$gms$c15_rumdairy_scp_scen <- "constant" + } - preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), - "BI", str_pad(bl * 100, 2, pad = "0") - ) - cfg$results_folder <- paste( - "output", identifierFlag, preflag, ":title:", sep = "/" - ) + preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), + "BI", str_pad(bl * 100, 2, pad = "0") + ) + cfg$results_folder <- paste( + "output", identifierFlag, preflag, ":title:", sep = "/" + ) - for (be in beV) { + for (be in beV) { - be <- paste0("E", str_pad(be, 2, pad = "0")) - cfg$gms$c60_2ndgen_biodem <- paste0(preflag, be) + be <- paste0("E", str_pad(be, 2, pad = "0")) + cfg$gms$c60_2ndgen_biodem <- paste0(preflag, be) - for (g in gV){ + for (g in gV){ - g <- paste0("G", str_pad(g, 4, pad = "0")) + g <- paste0("G", str_pad(g, 4, pad = "0")) - #cfg$gms$c56_pollutant_prices <- g - cfg$gms$c56_pollutant_prices <- paste0(g, "exp2110") + #cfg$gms$c56_pollutant_prices <- g + cfg$gms$c56_pollutant_prices <- paste0(g, "exp2110") - ############################################## - runflag <- "demand" + ############################################## + runflag <- "demand" - cfg$title <- paste0(preflag, be, g, runflag) + cfg$title <- paste0(preflag, be, g, runflag) - start_run(cfg, codeCheck = FALSE) + start_run(cfg, codeCheck = FALSE) - } # GHG - } # BE - } # MP replacement + } # GHG + } # BE + } # MP replacement } # BII lower bound diff --git a/scripts/start/projects/MP_price.R b/scripts/start/projects/MP_price.R index de49a6d4de..eef1514bad 100644 --- a/scripts/start/projects/MP_price.R +++ b/scripts/start/projects/MP_price.R @@ -22,85 +22,35 @@ library(stringr) # Load start_run(cfg) function which is needed to start MAgPIE runs source("scripts/start_functions.R") #nolinter # Source the default config and then over-write it before starting the run. -source("config/default.cfg") #nolinter - -cfg$qos <- "standby" -#cfg$qos <- "priority" - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) - -#R11: a10a580c, R12: 26df900e -cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", - cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.87_26df900e_validation.tgz", - additional = "additional_data_rev4.43.tgz", - patch = "MMEmuR12_rev4.87.tgz") - +source("config/mp_default.cfg") #nolinter cfg$force_replace <- FALSE +cfg$qos <- "priority" ssp <- "SSP2" cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### -identifierFlag <- "SCP_23-10-11_set-36_exp2110" +identifierFlag <- "SCP_23-11-22" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") -cfg$gms$c_timesteps <- "coup2110" ### BE -cfg$gms$bioenergy <- "MMEmu_feb23" -# non-default BE demands -cfg$gms$c60_1stgen_biodem <- "phaseout2020" -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-phaseout2020" cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 - -# Subsidies / Prices -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 cfg$gms$c60_bioenergy_subsidy <- 0 -cfg$gms$c60_price_implementation <- "lin" - beV <- c(0, 5, 7, 10, 15, 25, 45) - -### GHG -cfg$gms$c56_mute_ghgprices_until <- "y2020" -cfg$gms$c56_pollutant_prices <- "G0000" - - ### Tau / Yield -cfg$gms$c14_yields_scenario <- "nocc_hist" cfg$gms$tc <- "exo" -cfg$gms$c13_tccost <- "high" #default: medium - ### Biodiv -cfg$gms$biodiversity <- "bii_target" -#bdV <- c(1) # 0: no BD decrease, 1: decrease allowed -#blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 -blV <- c(0) -cfg$gms$s44_cost_bii_missing <- 10 * 1000000 - -### Cropland -cfg$gms$s30_annual_max_growth <- 0.02 - - -### Foresty -cfg$gms$s56_c_price_induced_aff <- 1 -cfg$gms$s32_max_aff_cell_2025 <- 0.005 # def = inf #0.005 = globally 1Mha Aff allowed in 2025 - +blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 ### Food -cfg$gms$food <- "anthropometrics_jan18" -cfg$gms$c20_scp_type <- "hydrogen" - -mpV <- c(0) - +mpV <- c(0, 30, 50, 76) for (bl in blV) { @@ -118,8 +68,7 @@ for (bl in blV) { if (mp != 0){ cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) - } - else { + } else { cfg$gms$c15_rumdairy_scp_scen <- "constant" } diff --git a/scripts/start/projects/mp_default.R b/scripts/start/projects/mp_default.R index 7e183d125f..6873bc2676 100644 --- a/scripts/start/projects/mp_default.R +++ b/scripts/start/projects/mp_default.R @@ -10,8 +10,18 @@ # position: 1 # ------------------------------------------------ +library(lucode2) +library(magclass) +library(gms) + # Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") +source("scripts/start_functions.R") #nolinter +source("config/mp_default.cfg") #nolinter + +identifierFlag <- "SCP_23-11-22" + +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") #start MAgPIE run -start_run(cfg = "mp_default.cfg") +start_run(cfg, codeCheck = FALSE) From 2004c418df5726f67274a3fff05cb7463ed26f09 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 23 Nov 2023 15:50:06 +0100 Subject: [PATCH 031/259] Update mp_default config --- config/mp_default.cfg | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/config/mp_default.cfg b/config/mp_default.cfg index 251cc37315..17254ba7f9 100644 --- a/config/mp_default.cfg +++ b/config/mp_default.cfg @@ -26,7 +26,7 @@ cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.87_26df900e_validation.tgz", additional = "additional_data_rev4.43.tgz", - patch = "MMEmuR12_rev4.87.tgz") + patch = "MMEmuR12_rev4.87.tgz") # NOTE: It is recommended to recalibrate the model when changing cellular input data @@ -51,7 +51,6 @@ cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" - # Should input data be downloaded from source even if cfg$input did not change? cfg$force_download <- FALSE @@ -315,7 +314,7 @@ cfg$gms$s14_calib_ir2rf <- 1 # def = 1 # * and demography drivers # * (anthro_iso_jun22): estimates food using scenario dependent regression # * and demography drivers on iso level -cfg$gms$food <- "anthro_iso_jun22" # def = anthro_iso_jun22 +cfg$gms$food <- "anthropometrics_jan18" # def = anthro_iso_jun22 # * switch between exogenous and endogenous food demand # * options: 0 (exogenous food demand) and 1 (endogenous food demand) @@ -523,7 +522,7 @@ cfg$gms$processing <- "substitution_may21" # def = substitution_may21 # * Mapping of scp route to feedstock: methane:foddr, sugar:sugar_cane, cellulose:begr # * Note that hydrogen does not require land-based inputs # * Mixed assumes equal shares of methane, sugar, cellulose and hydrogen -cfg$gms$c20_scp_type <- "sugar" # def = sugar +cfg$gms$c20_scp_type <- "hydrogen" # def = sugar # ***--------------------- 21_trade -------------------------------------- # * (free_apr16): free trade without restrictions From 696bfa65e62f3b78b98e99b170884c2c19c90124 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 23 Nov 2023 16:12:02 +0100 Subject: [PATCH 032/259] Add MP exo tau script --- scripts/start/projects/MP_demand.R | 4 +-- scripts/start/projects/MP_price.R | 2 +- scripts/start/projects/MP_tau.R | 39 +++++++++++++++++++++++++++++ scripts/start/projects/mp_default.R | 14 ++--------- 4 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 scripts/start/projects/MP_tau.R diff --git a/scripts/start/projects/MP_demand.R b/scripts/start/projects/MP_demand.R index e951203f1f..8ce658558d 100644 --- a/scripts/start/projects/MP_demand.R +++ b/scripts/start/projects/MP_demand.R @@ -6,8 +6,8 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Demand-Driven -# position: 5 +# description: MESSAGE-MAgPIE Emulator SCP Demand Setup +# position: 1 # ---------------------------------------------------------- ###################################### diff --git a/scripts/start/projects/MP_price.R b/scripts/start/projects/MP_price.R index eef1514bad..0fa1eed422 100644 --- a/scripts/start/projects/MP_price.R +++ b/scripts/start/projects/MP_price.R @@ -7,7 +7,7 @@ # ---------------------------------------------------------- # description: MESSAGE-MAgPIE Emulator SCP Price Setup -# position: 5 +# position: 1 # ---------------------------------------------------------- ###################################### diff --git a/scripts/start/projects/MP_tau.R b/scripts/start/projects/MP_tau.R new file mode 100644 index 0000000000..de0b06ff90 --- /dev/null +++ b/scripts/start/projects/MP_tau.R @@ -0,0 +1,39 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator SCP Tau Setup +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +source("config/mp_default.cfg") #nolinter + +identifierFlag <- "SCP_23-11-22" + +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +ssp <- "SSP2" +cfg <- setScenario(cfg, c(ssp)) + +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 +cfg$gms$c60_bioenergy_subsidy <- 0 + +cfg$title <- "B00G0000_tau" + +#start MAgPIE run +start_run(cfg, codeCheck = FALSE) \ No newline at end of file diff --git a/scripts/start/projects/mp_default.R b/scripts/start/projects/mp_default.R index 6873bc2676..cc5e8f76c5 100644 --- a/scripts/start/projects/mp_default.R +++ b/scripts/start/projects/mp_default.R @@ -10,18 +10,8 @@ # position: 1 # ------------------------------------------------ -library(lucode2) -library(magclass) -library(gms) - # Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -source("config/mp_default.cfg") #nolinter - -identifierFlag <- "SCP_23-11-22" - -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") +source("scripts/start_functions.R") #start MAgPIE run -start_run(cfg, codeCheck = FALSE) +start_run(cfg="mp_default.cfg") From 45b25c0cbd060a57caa19619d766969740df10f2 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 24 Nov 2023 10:16:30 +0100 Subject: [PATCH 033/259] Add secondary flag to MP scripts --- scripts/start/projects/MP_demand.R | 1 + scripts/start/projects/MP_price.R | 1 + 2 files changed, 2 insertions(+) diff --git a/scripts/start/projects/MP_demand.R b/scripts/start/projects/MP_demand.R index 8ce658558d..279814e925 100644 --- a/scripts/start/projects/MP_demand.R +++ b/scripts/start/projects/MP_demand.R @@ -76,6 +76,7 @@ for (bl in blV) { cfg$results_folder <- paste( "output", identifierFlag, preflag, ":title:", sep = "/" ) + cfg$info$flag2 <- preflag for (be in beV) { diff --git a/scripts/start/projects/MP_price.R b/scripts/start/projects/MP_price.R index 0fa1eed422..1087a2aec4 100644 --- a/scripts/start/projects/MP_price.R +++ b/scripts/start/projects/MP_price.R @@ -65,6 +65,7 @@ for (bl in blV) { for (mp in mpV) { preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), "BI", str_pad(bl * 100, 2, pad = "0")) cfg$results_folder <- paste("output", identifierFlag, preflag, ":title:", sep = "/") + cfg$info$flag2 <- preflag if (mp != 0){ cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) From 6adc974005cd405595b2d556f72e95aedbfc252d Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 27 Nov 2023 11:45:05 +0100 Subject: [PATCH 034/259] Remove preset loader from start scripts --- scripts/start/projects/MP_demand.R | 10 +++++----- scripts/start/projects/MP_price.R | 5 +---- scripts/start/projects/MP_tau.R | 7 ++++--- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/scripts/start/projects/MP_demand.R b/scripts/start/projects/MP_demand.R index 279814e925..f29675a011 100644 --- a/scripts/start/projects/MP_demand.R +++ b/scripts/start/projects/MP_demand.R @@ -27,12 +27,9 @@ source("config/mp_default.cfg") #nolinter cfg$force_replace <- TRUE cfg$qos <- "standby" -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets - ### Identifier and folder ############################################### -identifierFlag <- "SCP_23-11-22" +identifierFlag <- "SCP_23-11-27" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") @@ -52,11 +49,14 @@ blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 ### Food pV <- c(0, 20, 50, 76) #0, 20, 50, 76 +### Forest +cfg$gms$ s32_max_aff_cell_2025 <- 0.005 + for (bl in blV) { bd <- 0 if (bl == 0) { - bd <- 1 + bd <- 1 } cfg$gms$c44_bii_decrease <- bd diff --git a/scripts/start/projects/MP_price.R b/scripts/start/projects/MP_price.R index 1087a2aec4..380cf9de2d 100644 --- a/scripts/start/projects/MP_price.R +++ b/scripts/start/projects/MP_price.R @@ -27,12 +27,9 @@ source("config/mp_default.cfg") #nolinter cfg$force_replace <- FALSE cfg$qos <- "priority" -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets - ### Identifier and folder ############################################### -identifierFlag <- "SCP_23-11-22" +identifierFlag <- "SCP_23-11-27" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") diff --git a/scripts/start/projects/MP_tau.R b/scripts/start/projects/MP_tau.R index de0b06ff90..21ae8bb76b 100644 --- a/scripts/start/projects/MP_tau.R +++ b/scripts/start/projects/MP_tau.R @@ -22,17 +22,18 @@ library(gms) source("scripts/start_functions.R") #nolinter source("config/mp_default.cfg") #nolinter -identifierFlag <- "SCP_23-11-22" +identifierFlag <- "SCP_23-11-27" cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) +cfg$gms$c44_bii_decrease <- 0 cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 cfg$gms$c60_bioenergy_subsidy <- 0 +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-NPi" + cfg$title <- "B00G0000_tau" #start MAgPIE run From efb6c9cd488c6853a39518ccd13956fd6bdfc9ba Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 27 Nov 2023 12:12:30 +0100 Subject: [PATCH 035/259] Update Queue for Tau Script --- scripts/start/projects/MP_tau.R | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/start/projects/MP_tau.R b/scripts/start/projects/MP_tau.R index 21ae8bb76b..860c723542 100644 --- a/scripts/start/projects/MP_tau.R +++ b/scripts/start/projects/MP_tau.R @@ -22,6 +22,9 @@ library(gms) source("scripts/start_functions.R") #nolinter source("config/mp_default.cfg") #nolinter +cfg$force_replace <- FALSE +cfg$qos <- "priority" + identifierFlag <- "SCP_23-11-27" cfg$info$flag <- identifierFlag From f4b1a53e98a1d00e9d5bc76865ffbc40dfba5030 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 28 Nov 2023 23:01:21 +0100 Subject: [PATCH 036/259] Add MP with BD price test script --- scripts/start/projects/MP_BDprice.R | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 scripts/start/projects/MP_BDprice.R diff --git a/scripts/start/projects/MP_BDprice.R b/scripts/start/projects/MP_BDprice.R new file mode 100644 index 0000000000..d1bcf0b460 --- /dev/null +++ b/scripts/start/projects/MP_BDprice.R @@ -0,0 +1,78 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: MESSAGE-MAgPIE Emulator SCP Price Setup +# position: 1 +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/mp_default.cfg") #nolinter + +cfg$force_replace <- FALSE +cfg$qos <- "standby" + +### Identifier and folder +############################################### +identifierFlag <- "SCP_23-11-28_BDPrice" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + +### BE +cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-NPi" + +### GHG +gV <- c(0, 1000) + +### Tau / Yield +cfg$gms$tc <- "exo" + +### Biodiv +cfg$gms$biodiversity <- "bv_btc_mar21" +bdV <- c(0, 3000, 6000) #BII lower bound (0-1), default 0 + +### Food +mpV <- c(0, 76) + + +for (bd in bdV) { + cfg$gms$s44_target_price <- bd + + for (mp in mpV) { + preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), "BD", str_pad(bd, 4, pad = "0")) + cfg$results_folder <- paste("output", identifierFlag, ":title:", sep = "/") + + if (mp != 0){ + cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + } else { + cfg$gms$c15_rumdairy_scp_scen <- "constant" + } + + for (g in gV) { + g <- paste0("G", str_pad(g, 4, pad = "0")) + cfg$gms$c56_pollutant_prices <- paste0(g, "exp2110") + + ############################################## + cfg$title <- paste0(preflag, g) + + start_run(cfg, codeCheck = FALSE) + + } # GHG + } # MP replacement +} # BII lower bound From 9efa67d8fe90034d972820e053f4f3f49649190c Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 19 Dec 2023 20:06:33 +0100 Subject: [PATCH 037/259] Add beef replacement scenarios --- modules/15_food/anthropometrics_jan18/sets.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/15_food/anthropometrics_jan18/sets.gms b/modules/15_food/anthropometrics_jan18/sets.gms index 0d53c684de..ba654e2ad0 100644 --- a/modules/15_food/anthropometrics_jan18/sets.gms +++ b/modules/15_food/anthropometrics_jan18/sets.gms @@ -152,7 +152,7 @@ sets / constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, - lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50,MP76,MP50,MP30 / + lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50,MP76,MP50,MP30,MP50new,MP49,MP51 / t_scen15(t_all) Target years for transition to exogenous scenario diets / y2010, y2030, y2050 / From c66bbf57f4caaaf2999a999f3b26fc55c71e0c8c Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 16 Feb 2024 13:22:01 +0100 Subject: [PATCH 038/259] Add range-rarity restoration prioritization layer --- modules/44_biodiversity/bii_target/declarations.gms | 2 ++ modules/44_biodiversity/bii_target/equations.gms | 7 ++++++- modules/44_biodiversity/bii_target/input.gms | 8 ++++++++ modules/44_biodiversity/bii_target/preloop.gms | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/modules/44_biodiversity/bii_target/declarations.gms b/modules/44_biodiversity/bii_target/declarations.gms index 419d24471c..d107a97358 100644 --- a/modules/44_biodiversity/bii_target/declarations.gms +++ b/modules/44_biodiversity/bii_target/declarations.gms @@ -11,6 +11,7 @@ positive variables vm_bv(j,landcover44,potnatveg) Biodiversity stock for all land cover classes (Mha) v44_bii(i,biome44) Biodiversity Intactness Index BII (1) v44_bii_missing(i,biome44) Missing BII increase for compliance with BII target (1) + v44_bv_weighted(j) Range-rarity weighted biodiversity stock (Mha) ; parameters @@ -23,6 +24,7 @@ equations q44_bii(i,biome44) Biodiversity Intactness Index BII (1) q44_bii_target(i,biome44) Missing BII increase for compliance with BII target (1) q44_cost(i) Biodiversity cost (mio USD) + q44_bv_weighted(j) Range-rarity weighted biodiversity stock (Mha) ; diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index c1aec812a0..2486d9805d 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -12,7 +12,7 @@ q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44) =e= - (sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44))); + (sum(cell(i2,j2), v44_bv_weighted(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44))); *' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`. *' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased. @@ -26,3 +26,8 @@ q44_cost(i2) .. sum(cell(i2,j2), vm_cost_bv_loss(j2)) =e= sum(biome44, v44_bii_missing(i2,biome44)) * s44_cost_bii_missing; +*' Biodiversity stock weighted by range-rarity restoration prioritization layer (`f44_rr_layer`) + q44_bv_weighted(j2) .. v44_bv_weighted(j2) + =e= + f44_rr_layer(j2) * sum((potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg)); + \ No newline at end of file diff --git a/modules/44_biodiversity/bii_target/input.gms b/modules/44_biodiversity/bii_target/input.gms index ac0f08148d..9d79d1fab4 100644 --- a/modules/44_biodiversity/bii_target/input.gms +++ b/modules/44_biodiversity/bii_target/input.gms @@ -25,3 +25,11 @@ $ondelim $include "./modules/44_biodiversity/bii_target/input/biorealm_biome.cs3" $offdelim ; + +parameters +f44_rr_layer(j) Range-rarity restoration prioritization layer (unitless) +/ +$ondelim +$include "./modules/44_biodiversity/bv_btc_mar21/input/rr_layer.cs2" +$offdelim +/ diff --git a/modules/44_biodiversity/bii_target/preloop.gms b/modules/44_biodiversity/bii_target/preloop.gms index 2c6494fe74..e04675563e 100644 --- a/modules/44_biodiversity/bii_target/preloop.gms +++ b/modules/44_biodiversity/bii_target/preloop.gms @@ -12,3 +12,5 @@ v44_bii_missing.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; p44_bii_lower_bound(t,i,biome44) = 0; vm_bv.l(j,landcover44,potnatveg) = 0; + +v44_bv_weighted.l(j) = 0.3; \ No newline at end of file From 871cf210d88c22384d8413aed83449a4f3a1e72c Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 16 Feb 2024 13:46:12 +0100 Subject: [PATCH 039/259] bugfix --- modules/44_biodiversity/bii_target/equations.gms | 1 - modules/44_biodiversity/bii_target/input.gms | 2 +- modules/44_biodiversity/bii_target/preloop.gms | 2 +- scripts/start/projects/MMEmu_default.R | 15 +++++++-------- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index 2486d9805d..8ff0fdd7c8 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -30,4 +30,3 @@ q44_bv_weighted(j2) .. v44_bv_weighted(j2) =e= f44_rr_layer(j2) * sum((potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg)); - \ No newline at end of file diff --git a/modules/44_biodiversity/bii_target/input.gms b/modules/44_biodiversity/bii_target/input.gms index 9d79d1fab4..e363463c03 100644 --- a/modules/44_biodiversity/bii_target/input.gms +++ b/modules/44_biodiversity/bii_target/input.gms @@ -30,6 +30,6 @@ parameters f44_rr_layer(j) Range-rarity restoration prioritization layer (unitless) / $ondelim -$include "./modules/44_biodiversity/bv_btc_mar21/input/rr_layer.cs2" +$include "./modules/44_biodiversity/bii_target/input/rr_layer.cs2" $offdelim / diff --git a/modules/44_biodiversity/bii_target/preloop.gms b/modules/44_biodiversity/bii_target/preloop.gms index e04675563e..a472f9db5e 100644 --- a/modules/44_biodiversity/bii_target/preloop.gms +++ b/modules/44_biodiversity/bii_target/preloop.gms @@ -13,4 +13,4 @@ p44_bii_lower_bound(t,i,biome44) = 0; vm_bv.l(j,landcover44,potnatveg) = 0; -v44_bv_weighted.l(j) = 0.3; \ No newline at end of file +v44_bv_weighted.l(j) = 0.3; diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index a824055a62..d6d797831f 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -28,12 +28,11 @@ cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" "./patch_input" = NULL), getOption("magpie_repos")) -#R11: a10a580c , R37: acb82c28 -cfg$input <- c(regional = "rev4.84_a10a580c_magpie.tgz", - cellular = "rev4.84_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.84_a10a580c_validation.tgz", - additional = "additional_data_rev4.39.tgz", - patch = "MMEmuR11.tgz") +cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", + cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.87_26df900e_validation.tgz", + additional = "additional_data_rev4.43.tgz", + patch = "MMEmuR12_rev4.87.tgz") cfg$output <- c("output_check", "rds_report") @@ -45,10 +44,10 @@ cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### identifierFlag <- "MMEmu_default" -cfg$title <- "Default_R11_patched" +cfg$title <- "Default_MMRegOnly" ############################################### cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") +#cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") ########################################################## start_run(cfg, codeCheck = FALSE) From 95f7a975914e6873a9a96478fed4e5e2410db089 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 16 Feb 2024 14:10:10 +0100 Subject: [PATCH 040/259] bugfix --- modules/44_biodiversity/bii_target/input/files | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/44_biodiversity/bii_target/input/files b/modules/44_biodiversity/bii_target/input/files index 0ad61cf22c..3afa3b8e8d 100644 --- a/modules/44_biodiversity/bii_target/input/files +++ b/modules/44_biodiversity/bii_target/input/files @@ -1,3 +1,4 @@ * list of files that are required here f44_bii_coeff.cs3 biorealm_biome.cs3 +rr_layer.cs2 From a41442b9f0ce43fdb607733666f860b80db961c5 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Sun, 18 Feb 2024 20:28:07 +0100 Subject: [PATCH 041/259] bugfix --- modules/44_biodiversity/bii_target/equations.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index 8ff0fdd7c8..149cede7b9 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -12,7 +12,7 @@ q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44) =e= - (sum(cell(i2,j2), v44_bv_weighted(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44))); + (sum(cell(i2,j2), v44_bv_weighted(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_rr_layer(j2) * f44_biome(j2,biome44))); *' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`. *' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased. From 70deb64153f7acc264c0685e90158b3ff7eac682 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 23 Feb 2024 11:35:09 +0100 Subject: [PATCH 042/259] Simplify RRLayer implementation --- modules/32_forestry/MMEmu_jul23/realization.gms | 16 ++++++++-------- modules/32_forestry/module.gms | 1 + .../44_biodiversity/bii_target/declarations.gms | 2 -- modules/44_biodiversity/bii_target/equations.gms | 7 ++----- modules/44_biodiversity/bii_target/preloop.gms | 2 -- modules/51_nitrogen/module.gms | 1 - 6 files changed, 11 insertions(+), 18 deletions(-) diff --git a/modules/32_forestry/MMEmu_jul23/realization.gms b/modules/32_forestry/MMEmu_jul23/realization.gms index 9d61742870..c52c9c1dd4 100644 --- a/modules/32_forestry/MMEmu_jul23/realization.gms +++ b/modules/32_forestry/MMEmu_jul23/realization.gms @@ -34,12 +34,12 @@ *' @limitations Rotation lengths for timber plantations are not endogenous. *####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/32_forestry/dynamic_feb21/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/32_forestry/dynamic_feb21/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/32_forestry/dynamic_feb21/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/32_forestry/dynamic_feb21/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/32_forestry/dynamic_feb21/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/32_forestry/dynamic_feb21/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/32_forestry/dynamic_feb21/presolve.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/32_forestry/dynamic_feb21/postsolve.gms" +$Ifi "%phase%" == "sets" $include "./modules/32_forestry/MMEmu_jul23/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/32_forestry/MMEmu_jul23/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/32_forestry/MMEmu_jul23/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/32_forestry/MMEmu_jul23/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/32_forestry/MMEmu_jul23/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/32_forestry/MMEmu_jul23/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/32_forestry/MMEmu_jul23/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/32_forestry/MMEmu_jul23/postsolve.gms" *######################## R SECTION END (PHASES) ############################### diff --git a/modules/32_forestry/module.gms b/modules/32_forestry/module.gms index f929157732..09afced169 100644 --- a/modules/32_forestry/module.gms +++ b/modules/32_forestry/module.gms @@ -16,5 +16,6 @@ *' @authors Florian Humpenöder, Abhijeet Mishra *###################### R SECTION START (MODULETYPES) ########################## +$Ifi "%forestry%" == "MMEmu_jul23" $include "./modules/32_forestry/MMEmu_jul23/realization.gms" $Ifi "%forestry%" == "dynamic_feb21" $include "./modules/32_forestry/dynamic_feb21/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ diff --git a/modules/44_biodiversity/bii_target/declarations.gms b/modules/44_biodiversity/bii_target/declarations.gms index d107a97358..419d24471c 100644 --- a/modules/44_biodiversity/bii_target/declarations.gms +++ b/modules/44_biodiversity/bii_target/declarations.gms @@ -11,7 +11,6 @@ positive variables vm_bv(j,landcover44,potnatveg) Biodiversity stock for all land cover classes (Mha) v44_bii(i,biome44) Biodiversity Intactness Index BII (1) v44_bii_missing(i,biome44) Missing BII increase for compliance with BII target (1) - v44_bv_weighted(j) Range-rarity weighted biodiversity stock (Mha) ; parameters @@ -24,7 +23,6 @@ equations q44_bii(i,biome44) Biodiversity Intactness Index BII (1) q44_bii_target(i,biome44) Missing BII increase for compliance with BII target (1) q44_cost(i) Biodiversity cost (mio USD) - q44_bv_weighted(j) Range-rarity weighted biodiversity stock (Mha) ; diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index 149cede7b9..b7fdc1ea1d 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -8,11 +8,12 @@ *' @equations *' The Biodiversity Intactness Index (BII) is calculated at the level of 71 biomes. +*' Biodiversity stock weighted by range-rarity restoration prioritization layer (`f44_rr_layer`) *' The regional layer is needed for compatibility with the high resolution parallel optimization output script (scripts/output/extra/highres.R) q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44) =e= - (sum(cell(i2,j2), v44_bv_weighted(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_rr_layer(j2) * f44_biome(j2,biome44))); + (sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_rr_layer(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_rr_layer(j2) * f44_biome(j2,biome44))); *' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`. *' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased. @@ -26,7 +27,3 @@ q44_cost(i2) .. sum(cell(i2,j2), vm_cost_bv_loss(j2)) =e= sum(biome44, v44_bii_missing(i2,biome44)) * s44_cost_bii_missing; -*' Biodiversity stock weighted by range-rarity restoration prioritization layer (`f44_rr_layer`) - q44_bv_weighted(j2) .. v44_bv_weighted(j2) - =e= - f44_rr_layer(j2) * sum((potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg)); diff --git a/modules/44_biodiversity/bii_target/preloop.gms b/modules/44_biodiversity/bii_target/preloop.gms index a472f9db5e..2c6494fe74 100644 --- a/modules/44_biodiversity/bii_target/preloop.gms +++ b/modules/44_biodiversity/bii_target/preloop.gms @@ -12,5 +12,3 @@ v44_bii_missing.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; p44_bii_lower_bound(t,i,biome44) = 0; vm_bv.l(j,landcover44,potnatveg) = 0; - -v44_bv_weighted.l(j) = 0.3; diff --git a/modules/51_nitrogen/module.gms b/modules/51_nitrogen/module.gms index 4b530725d6..e28a27bf21 100644 --- a/modules/51_nitrogen/module.gms +++ b/modules/51_nitrogen/module.gms @@ -14,7 +14,6 @@ *' @authors Benjamin Leon Bodirsky *###################### R SECTION START (MODULETYPES) ########################## -$Ifi "%nitrogen%" == "ipcc2006_sep16" $include "./modules/51_nitrogen/ipcc2006_sep16/realization.gms" $Ifi "%nitrogen%" == "off" $include "./modules/51_nitrogen/off/realization.gms" $Ifi "%nitrogen%" == "rescaled_jan21" $include "./modules/51_nitrogen/rescaled_jan21/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ From 0a6854c2f3047ede960f2bb0a6ffe30f13b5a362 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 23 Feb 2024 12:25:55 +0100 Subject: [PATCH 043/259] Remove changes to disaggregation.R --- scripts/output/extra/disaggregation.R | 63 +++------------------------ 1 file changed, 5 insertions(+), 58 deletions(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 05ef287729..d7949cf446 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -38,11 +38,6 @@ land_hr_split_file <- file.path(outputdir, "cell.land_split_0.5.mz") land_hr_shr_split_file <- file.path(outputdir, "cell.land_split_0.5_share.mz") luh_side_layers <- file.path(outputdir, "luh2_side_layers_0.5.mz") bii_hr_out_file <- file.path(outputdir, "cell.bii_0.5.mz") -peatland_v2_hr_file <- file.path(outputdir, "f58_peatland_area_0.5.mz") -peatland_on_intact_hr_file <- file.path(outputdir, "f58_peatland_intact_0.5.mz") -peatland_on_degrad_hr_file <- file.path(outputdir, "f58_peatland_degrad_0.5.mz") -peatland_hr_out_file <- file.path(outputdir, "cell.peatland_0.5.mz") -peatland_hr_share_out_file <- file.path(outputdir, "cell.peatland_0.5_share.mz") cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) @@ -59,14 +54,9 @@ if (length(map_file) > 1) { # Output functions # ----------------------------------------- -.fixCoords <- function(x) { - getSets(x, fulldim = FALSE)[1] <- "x.y.iso" - return(x) -} - .writeDisagg <- function(x, file, comment, message) { - write.magpie(.fixCoords(x), file, comment = comment) - write.magpie(.fixCoords(x), sub(".mz", ".nc", file), comment = comment, verbose = FALSE) + write.magpie(x, file, comment = comment) + write.magpie(x, sub(".mz", ".nc", file), comment = comment, verbose = FALSE) } .dissagcrop <- function(gdx, land_hr, map_file) { @@ -92,8 +82,7 @@ if (length(map_file) > 1) { map <- readRDS(map_file) # create full time series - land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getNames(wdpa_hr), - sets = c("x.y.iso", "year", getSets(wdpa_hr, fulldim = FALSE)[3])) + land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getNames(wdpa_hr)) land_consv_hr[, getYears(land_consv_hr), ] <- wdpa_hr[, nyears(wdpa_hr), ] land_consv_hr[, getYears(wdpa_hr), ] <- wdpa_hr @@ -102,8 +91,7 @@ if (length(map_file) > 1) { consv_prio_all <- read.magpie(consv_prio_hr_file) consv_prio_hr <- new.magpie( cells_and_regions = map[, "cell"], - names = getNames(consv_prio_all, dim = 2), fill = 0, - sets = c("x.y.iso", "year", "data") + names = getNames(consv_prio_all, dim = 2), fill = 0 ) iso <- readGDX(gdx, "iso") consv_iso <- readGDX(gdx, "policy_countries22") @@ -311,7 +299,6 @@ land_hr <- interpolateAvlCroplandWeighted( snv_pol_shr = snv_pol_shr, snv_pol_fader = snv_pol_fader ) -land_hr <- .fixCoords(land_hr) # Write output .writeDisagg(land_hr, land_hr_out_file, @@ -471,7 +458,6 @@ land_bii_hr <- interpolateAvlCroplandWeighted( snv_pol_fader = snv_pol_fader, unit = "share" ) -land_bii_hr <- .fixCoords(land_bii_hr) # Add primary and secondaray other land land_bii_hr <- PrimSecdOtherLand(land_bii_hr, land_hr_file) @@ -489,44 +475,5 @@ bii_hr <- dimSums(land_bii_hr * bii_hr, dim = 3, na.rm = TRUE) ) gc() - -# -------------------------------- -# Disaggregate peatland -# -------------------------------- - -message("Disaggregating peatland") - -#check for peatland version -if(cfg$gms$peatland == "v2") { - peat_lr <- PeatlandArea(gdx,level="cell",sum=FALSE) - peat_ini_hr <- read.magpie(peatland_v2_hr_file) - peat_ini_hr <- add_columns(peat_ini_hr,addnm = "rewetted",dim = "d3",fill = 0) - peat_ini_hr <- add_columns(peat_ini_hr,addnm = "unused",dim = "d3",fill = 0) - peat_hr <- suppressWarnings(luscale::interpolate2(peat_lr,peat_ini_hr,map_file)) - peat_hr <- peat_hr[,getYears(peat_hr,as.integer = T) >= cfg$gms$s58_fix_peatland,] - -} else if (cfg$gms$peatland == "on") { - peat_lr <- PeatlandArea(gdx,level="cell",sum=TRUE) - peat_ini_hr <- mbind(setNames(read.magpie(peatland_on_intact_hr_file),"intact"),setNames(read.magpie(peatland_on_degrad_hr_file),"degrad")) - peat_ini_hr <- add_columns(peat_ini_hr,addnm = "rewet",dim = "d3",fill = 0) - peat_hr <- suppressWarnings(luscale::interpolate2(peat_lr,peat_ini_hr,map_file)) - peat_hr <- peat_hr[,getYears(peat_hr,as.integer = T) >= cfg$gms$s58_fix_peatland,] -} -peat_hr <- .fixCoords(peat_hr) - -# Write output -.writeDisagg(peat_hr, peatland_hr_out_file, - comment = "unit: Mha per grid-cell", - message = "Write outputs peatland Mha") -gc() - -out <- peat_hr / dimSums(land_hr[,getYears(peat_hr),], dim = 3) -out[is.nan(out)] <- 0 -out[is.infinite(out)] <- 0 - -.writeDisagg(out, peatland_hr_share_out_file, - comment = "unit: grid-cell land area fraction", - message = "Write outputs peatland share") -gc() - message("Finished disaggregation") + From 2340d572e3ab2b938e0a074a99a6a82fd8a08a40 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 08:56:11 +0100 Subject: [PATCH 044/259] remove forestry module experiment --- .../32_forestry/MMEmu_jul23/declarations.gms | 149 --------- modules/32_forestry/MMEmu_jul23/equations.gms | 219 ------------- modules/32_forestry/MMEmu_jul23/input.gms | 134 -------- modules/32_forestry/MMEmu_jul23/postsolve.gms | 157 --------- modules/32_forestry/MMEmu_jul23/preloop.gms | 306 ------------------ modules/32_forestry/MMEmu_jul23/presolve.gms | 181 ----------- .../32_forestry/MMEmu_jul23/realization.gms | 45 --- modules/32_forestry/MMEmu_jul23/scaling.gms | 12 - modules/32_forestry/MMEmu_jul23/sets.gms | 50 --- modules/32_forestry/module.gms | 1 - 10 files changed, 1254 deletions(-) delete mode 100644 modules/32_forestry/MMEmu_jul23/declarations.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/equations.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/input.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/postsolve.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/preloop.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/presolve.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/realization.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/scaling.gms delete mode 100644 modules/32_forestry/MMEmu_jul23/sets.gms diff --git a/modules/32_forestry/MMEmu_jul23/declarations.gms b/modules/32_forestry/MMEmu_jul23/declarations.gms deleted file mode 100644 index 112cf412b6..0000000000 --- a/modules/32_forestry/MMEmu_jul23/declarations.gms +++ /dev/null @@ -1,149 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de -scalars - s32_shift Number of 5-year age-classes corresponding to current time step length (1) - s32_establishment_dynamic If plantations should be dynamic (including establishment and harvest decsions) - s32_establishment_static Static plantations with no establishmnet no harvest no regrowth -; - -parameters - i32_max_aff_area_glo(t) Maximum global endogenous afforestation area (mio. ha) - i32_max_aff_area_reg(t,i) Maximum regional endogenous afforestation area (mio. ha) - p32_aff_pol(t,j) NDC forest stock (mio. ha) - p32_aff_pol_timestep(t,j) NDC afforestation per time step (mio. ha) - p32_aff_pot(t,j) Potential afforestation area (mio. ha) - p32_aff_togo(t,i) Remaining exogenous afforestation wrt to the maximum exogenous target over time (mio. ha) - p32_carbon_density_ac(t,j,type32,ac,ag_pools) Carbon density for ac and ag_pools (tC per ha) - p32_carbon_density_ac_forestry(t_all,j,ac) Above ground carbon density for age classes and carbon pools (tC per ha) - p32_carbon_density_ac_marg(t_all,j,ac) Marginal above ground carbon density for age classes and carbon pools (tC per ha) - pc32_area_rotation(j) Forestry area at rotation length end used as weight for regional aggregation (mio. ha) - p32_land(t,j,type32,ac) Forestry land for each cell wood type and age class before and after optimization (mio. ha) - pc32_land(j,type32,ac) Forestry land per forestry land type initialization of the optimization (mio. ha) - pc32_yield_forestry_future(j) Cellular timber yield expected in the future (m3 per ha per year) - pc32_yield_forestry_future_reg(i) Regional timber yield expected in the future (m3 per ha per year) - p32_plant_ini_ac(j) Initialization of plantation area (mio. ha) - p32_IGR(t_all,j,ac) Instantaneous growth rate or periodic annual increment of forest growth (1) - p32_rot_flg(t_all,j,ac) Identifier flag when calculating rotation length (1) - p32_rotation_regional(t_all,i) Regional average rotation length of plantations translated to age class equivalent for future (1) - p32_rot_length_ac_eqivalent(t_all,j) Cellular rotation length of plantations translated to age class equivalent for future (1) - p32_rotation_cellular_estb(t_all,j) Establishment rotation length translated to age classes on cellular level (1) - p32_rotation_cellular_harvesting(t_all,j) Harvesting rotation length of plantations translated to age class equivalent for future (1) - p32_cdr_ac(t,j,ac) Non-cumulative CDR from afforestation plantations for each age-class depending on planning horizon (tC per ha) - p32_rotation_offset Offset calc in age class equivalents (1) - p32_land_start_ac(j,type32,ac) Saving first value of starting land (mio. ha) - p32_land_before(t,j,type32,ac) Saving time value of starting land (mio. ha) - p32_time(ac) Time as a function of age-classes (yr) - p32_discount_factor(t_all,j,ac) Discount factor for each age class (1) - p32_net_present_value(t_all,j,ac) Net present value for a representative 1ha land of plantations (mio. USD) - p32_stand_value(t_all,j,ac) Stand value based on given prices (mio. USD) - p32_investment_returns_lost(t_all,j,ac) Present value of investment returns lost by not harvesting now and beginning a new series of rotations on the land (mio. USD) - p32_land_rent_weighted(t_all,j,ac) Land rent weighted by the value of the trees at harvest age-class (mio. USD) - p32_rot_flg_faustmann(t_all,j,ac) Identifier flag when calculating faustmann rotation length (1) - p32_rot_length_faustmann(t_all,j) Cellular Faustmann rotation length of plantations translated to age class equivalent (1) - p32_ncells(i) Number of cells in each region (1) - pm_representative_rotation(t_all,i) Representative regional rotation (1) - p32_aff_bgp(j,ac) Biophysical impact of afforestation (tCeq per ha) - p32_tcre_glo(j) Global mean Transient Climate Response to cumulative Emissions (degree C per tC per ha) - p32_observed_gs_reg(i) Observed growing stock (tDM per ha) - p32_gs_scaling_reg(i) Calibration factor for scaling up the relative growing stock (1) - p32_rotation_dist(j,ac) Poulter distribution within celular rotation lengths (1) - p32_updated_gs_reg(t,i) Updated growing stock information after calibration (m3 per ha) - p32_plantation_contribution(t_ext,i) Share of roundwood production coming from timber plantations (percent) - p32_ac_dist_flag(j,ac) Distribution flag with inverse weights according to age-classes (1) - p32_ac_dist(j,ac) Actual share of age-class distribution (1) - p32_avg_increment(t_all,j,ac) Mean annual increment (tC per ha per year) - p32_bii_coeff(type32,bii_class_secd,potnatveg) bii coeff (1) - p32_c_density_ac_fast_forestry(t_all,j,ac) Carbon densities in plantations based on Braakhekke et al (tC per ha) - p32_disturbance_loss_ftype32(t,j,type32,ac) Loss due to disturbances in all plantation type forests (mio. ha) -; - -positive variables - vm_cost_fore(i) Forestry costs (Mio USD) - v32_cost_hvarea(i) Cost of harvesting timber from forests (mio. USD per yr) - v32_land(j,type32,ac) Forestry land pools (mio. ha) - v32_land_missing(j) Forestry land which can be used at extrmemly high costs in case not enough area is available for new establishment (mio. ha) - vm_landdiff_forestry Aggregated difference in forestry land compared to previous timestep (mio. ha) - v32_cost_recur(i) Recurring forest management costs (USD per ha) - v32_land_expansion(j,type32,ac) Forestry land expansion (mio. ha) - v32_land_reduction(j,type32,ac) Forestry land reduction (mio. ha) - v32_cost_establishment(i) Cost of establishment calculated at the current time step (mio. USD) - v32_hvarea_forestry(j,ac) Harvested area from timber plantations (mio. ha) - vm_prod_forestry(j,kforestry) Production of woody biomass from commercial plantations (mio. tDM per yr) - ; - -variables - vm_cdr_aff(j,ac,aff_effect) Expected bgc (CDR) and local bph effects of afforestation depending on planning horizon (mio. tC) - ; - -equations - q32_cost_total(i) Total forestry costs constraint (mio. USD) - q32_land(j) Land constraint (mio. ha) - q32_cdr_aff(j,ac) Calculation of CDR from afforestation (mio. tC) - q32_carbon(j,ag_pools,stockType) Forestry carbon stock calculation (mio. tC) - q32_land_diff Aggregated difference in forestry land compared to previous timestep (mio. ha) - q32_max_aff Maximum total global afforestation (mio. ha) - q32_max_aff_reg(i) Maximum total regional afforestation (mio. ha) - q32_aff_pol(j) Afforestation policy constraint (mio. ha) - q32_aff_est(j) Afforestation constraint for establishment age classes (mio. ha) - q32_hvarea_forestry(j,ac) Plantations area harvest (mio. ha) - q32_cost_recur(i) Recurruing costs (mio. USD) - q32_establishment_dynamic(i) Establishment in current time step for future demand (mio. ha) - q32_establishment_dynamic_yield(i) Regional timber yield (tDM per ha) - q32_establishment_fixed(j) Establishment in current time step for future demand (mio. ha) - q32_land_expansion(j,type32,ac) Land expansion (mio. ha) - q32_land_reduction(j,type32,ac) Land contraction (mio. ha) - q32_cost_establishment(i) Present value of cost of establishment (mio. USD) - q32_bgp_aff(j,ac) Biophysical afforestation calculation (mio. tCeq) - q32_forestry_est(j,type32,ac) Distribution of forestry establishment over ac_est (mio. ha) - q32_cost_hvarea(i) Cost of harvesting timber from forests (mio. USD per yr) - q32_prod_forestry(j) Production of woody biomass from commercial plantations (mio. tDM per yr) - q32_bv_aff(j,potnatveg) Biodiversity value for aff forestry land (Mha) - q32_bv_ndc(j,potnatveg) Biodiversity value for ndc forestry land (Mha) - q32_bv_plant(j,potnatveg) Biodiversity value for plantations (Mha) -; - - -*#################### R SECTION START (OUTPUT DECLARATIONS) #################### -parameters - ov_cost_fore(t,i,type) Forestry costs (Mio USD) - ov32_cost_hvarea(t,i,type) Cost of harvesting timber from forests (mio. USD per yr) - ov32_land(t,j,type32,ac,type) Forestry land pools (mio. ha) - ov32_land_missing(t,j,type) Forestry land which can be used at extrmemly high costs in case not enough area is available for new establishment (mio. ha) - ov_landdiff_forestry(t,type) Aggregated difference in forestry land compared to previous timestep (mio. ha) - ov32_cost_recur(t,i,type) Recurring forest management costs (USD per ha) - ov32_land_expansion(t,j,type32,ac,type) Forestry land expansion (mio. ha) - ov32_land_reduction(t,j,type32,ac,type) Forestry land reduction (mio. ha) - ov32_cost_establishment(t,i,type) Cost of establishment calculated at the current time step (mio. USD) - ov32_hvarea_forestry(t,j,ac,type) Harvested area from timber plantations (mio. ha) - ov_prod_forestry(t,j,kforestry,type) Production of woody biomass from commercial plantations (mio. tDM per yr) - ov_cdr_aff(t,j,ac,aff_effect,type) Expected bgc (CDR) and local bph effects of afforestation depending on planning horizon (mio. tC) - oq32_cost_total(t,i,type) Total forestry costs constraint (mio. USD) - oq32_land(t,j,type) Land constraint (mio. ha) - oq32_cdr_aff(t,j,ac,type) Calculation of CDR from afforestation (mio. tC) - oq32_carbon(t,j,ag_pools,stockType,type) Forestry carbon stock calculation (mio. tC) - oq32_land_diff(t,type) Aggregated difference in forestry land compared to previous timestep (mio. ha) - oq32_max_aff(t,type) Maximum total global afforestation (mio. ha) - oq32_max_aff_reg(t,i,type) Maximum total regional afforestation (mio. ha) - oq32_aff_pol(t,j,type) Afforestation policy constraint (mio. ha) - oq32_aff_est(t,j,type) Afforestation constraint for establishment age classes (mio. ha) - oq32_hvarea_forestry(t,j,ac,type) Plantations area harvest (mio. ha) - oq32_cost_recur(t,i,type) Recurruing costs (mio. USD) - oq32_establishment_dynamic(t,i,type) Establishment in current time step for future demand (mio. ha) - oq32_establishment_dynamic_yield(t,i,type) Regional timber yield (tDM per ha) - oq32_establishment_fixed(t,j,type) Establishment in current time step for future demand (mio. ha) - oq32_land_expansion(t,j,type32,ac,type) Land expansion (mio. ha) - oq32_land_reduction(t,j,type32,ac,type) Land contraction (mio. ha) - oq32_cost_establishment(t,i,type) Present value of cost of establishment (mio. USD) - oq32_bgp_aff(t,j,ac,type) Biophysical afforestation calculation (mio. tCeq) - oq32_forestry_est(t,j,type32,ac,type) Distribution of forestry establishment over ac_est (mio. ha) - oq32_cost_hvarea(t,i,type) Cost of harvesting timber from forests (mio. USD per yr) - oq32_prod_forestry(t,j,type) Production of woody biomass from commercial plantations (mio. tDM per yr) - oq32_bv_aff(t,j,potnatveg,type) Biodiversity value for aff forestry land (Mha) - oq32_bv_ndc(t,j,potnatveg,type) Biodiversity value for ndc forestry land (Mha) - oq32_bv_plant(t,j,potnatveg,type) Biodiversity value for plantations (Mha) -; -*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/32_forestry/MMEmu_jul23/equations.gms b/modules/32_forestry/MMEmu_jul23/equations.gms deleted file mode 100644 index d17234cce2..0000000000 --- a/modules/32_forestry/MMEmu_jul23/equations.gms +++ /dev/null @@ -1,219 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*' @equations - -*------------------ -****** Costs ****** -*------------------ - -*' The direct costs of Timber production and afforestation `vm_cost_fore` include -*' maintenance and monitoring costs for newly established plantations as well as -*' standing plantations '[@sathaye_ghg_2005]. In addition, this type of forest management -*' (including afforestation) may cause costs in other parts of the model such as costs -*' for technological change [13_tc] or land expansion [39_landconversion]. Also included -*' are additional costs for producing timber from extremely highly managed plantations -*' which are analogous to intensification using technological change from [13_tc] but -*' in a parametrized form. - -q32_cost_total(i2) .. vm_cost_fore(i2) =e= - v32_cost_recur(i2) - + v32_cost_establishment(i2) - + v32_cost_hvarea(i2) - + sum(cell(i2,j2), v32_land_missing(j2)) * s32_free_land_cost - ; - -*----------------------------------------------- -****** Carbon price induced afforestation ****** -*----------------------------------------------- -*' The interface `vm_cdr_aff` provides the projected biogeochemical (bgc) carbon sequestration -*' and the local biophysical (bph) warming/cooling effects of an afforestation -*' activity for a planning horizon of 50 years `s32_planing_horizon` to the [56_ghg_policy] module. - -q32_cdr_aff(j2,ac) .. -vm_cdr_aff(j2,ac,"bgc") =e= -sum(ac_est, v32_land(j2,"aff",ac_est)) * sum(ct, p32_cdr_ac(ct,j2,ac)) -; - -q32_bgp_aff(j2,ac) .. -vm_cdr_aff(j2,ac,"bph") =e= -sum(ac_est, v32_land(j2,"aff",ac_est)) * p32_aff_bgp(j2,ac); - -*' ac_est can only increase if total afforested land increases -q32_aff_est(j2) .. -sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum((ct,ac), p32_land(ct,j2,"aff",ac)); - -*----------------------------------------------- -****************** Land ************************ -*----------------------------------------------- - -*' The interface `vm_land` provides aggregated forestry land pools (`type32`) to other modules. - - q32_land(j2) .. - vm_land(j2,"forestry") =e= sum((type32,ac), v32_land(j2,type32,ac)); - -*' The constraint `q32_aff_pol` accounts for the exogenous afforestation prescribed by NPI/NDC policies. - - q32_aff_pol(j2) .. - sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, p32_aff_pol_timestep(ct,j2)); - -*' The constraint `q32_max_aff` accounts for the allowed maximum global endogenous -*' afforestation defined in `i32_max_aff_area_glo`. -*' The constraint `q32_max_aff_reg` accounts for the allowed maximum regional endogenous -*' afforestation defined in `i32_max_aff_area_reg`. -*' Only one of the two constraints is active, depending on `s32_max_aff_area_glo`. - - q32_max_aff$(s32_max_aff_area_glo=1) .. - sum((j2,ac), v32_land(j2,"aff",ac)) - =l= sum(ct, i32_max_aff_area_glo(ct)); - - q32_max_aff_reg(i2)$(s32_max_aff_area_glo=0) .. - sum((cell(i2,j2),ac), v32_land(j2,"aff",ac)) - =l= sum(ct, i32_max_aff_area_reg(ct,i2)); - -*----------------------------------------------- -************** Carbon stock ******************** -*----------------------------------------------- -*' Forestry above ground carbon stocks are calculated as the product of forestry land (`v32_land`) and the area -*' weighted mean of carbon density for carbon pools (`p32_carbon_density_ac`). - - q32_carbon(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"forestry",ag_pools,stockType) =e= - m_carbon_stock_ac(v32_land,p32_carbon_density_ac,"type32,ac","type32,ac_sub"); - -*' Forestry land expansion and reduction is calculated as follows: - - q32_land_diff .. vm_landdiff_forestry =e= sum((j2,type32,ac), - v32_land_expansion(j2,type32,ac) - + v32_land_reduction(j2,type32,ac)); - - q32_land_expansion(j2,type32,ac_est) .. - v32_land_expansion(j2,type32,ac_est) =e= v32_land(j2,type32,ac_est) - pc32_land(j2,type32,ac_est); - - q32_land_reduction(j2,type32,ac_sub) .. - v32_land_reduction(j2,type32,ac_sub) =e= pc32_land(j2,type32,ac_sub) - v32_land(j2,type32,ac_sub); - -*------------------------------------------ -*********** Biodiversity value ************ -*------------------------------------------ - -q32_bv_aff(j2,potnatveg) .. vm_bv(j2,"aff_co2p",potnatveg) - =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"aff",ac)) * - p32_bii_coeff("aff",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); - -q32_bv_ndc(j2,potnatveg) .. vm_bv(j2,"aff_ndc",potnatveg) - =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"ndc",ac)) * - p32_bii_coeff("ndc",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); - -q32_bv_plant(j2,potnatveg) .. vm_bv(j2,"plant",potnatveg) - =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"plant",ac)) * - p32_bii_coeff("plant",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); - - -************************************************************ -**** Timber production related equations in plantations **** -************************************************************ - -**** Cost calculations -*--------------------- - -*' Cost of new plantations establishment `v32_cost_establishment` is the investment -*' made in setting up new plantations but also accounts for the expected value of -*' future harvesting costs. This makes sure that the model sticks to reasonable plantation -*' patterns over time. Present value of harvesting costs is (1+`pm_interest`)^`p32_rotation_regional` -*' and annuity factor of `pm_interest`/(1+`pm_interest`) averages the cost of this -*' investment over time. - -q32_cost_establishment(i2).. - v32_cost_establishment(i2) - =e= - (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * s32_reESTBcost) - ) - * sum(ct,pm_interest(ct,i2)/(1+pm_interest(ct,i2))); - - -*' Recurring costs are paid for plantations where the trees have to be regularly monitored -*' and maintained. These costs are only calculated becuase we see active human intervention -*' in commercial plantations. These costs are paid for trees used for timber production or -*' trees established for afforestation purposes. - -q32_cost_recur(i2) .. v32_cost_recur(i2) =e= - sum((cell(i2,j2),type32,ac_sub), v32_land(j2,type32,ac_sub)) * s32_recurring_cost; - - -**** New establishment decision -*------------------------------ -*' New plantations are already established in the optimization step based on a certain -*' percentage (`p32_plantation_contribution`) of current demand (`pm_demand_forestry_future`). -*' Its called `pm_demand_forestry_future` because the model also has a foresight switch which -*' give the model an ability to account for future changes in demand. By default `pm_demand_forestry_future` -*' is set to existing roundwood demand. As plantation establishment decisions should -*' also know some indication of expected future yields, we calculate how much yield -*' newly established plantation can realize based on rotation lengths. This is defined as -*' the expected future yield (`pc32_yield_forestry_future`) at harvest (year in time -*' step are accounted for). - -*' Area constraint for plantation establishment based on expected average regional timber yield at rotation age -*' (`pc32_yield_forestry_future_reg`) to ovoid overspecialization of plantation establishment towards highly productive cells. - -q32_establishment_dynamic(i2)$s32_establishment_dynamic .. - sum(cell(i2,j2), ((sum(ac_est, v32_land(j2,"plant",ac_est)) + v32_land_missing(j2)) / m_timestep_length_forestry) * pc32_yield_forestry_future_reg(i2)) - =e= - sum((ct,kforestry), pm_demand_forestry_future(i2,kforestry) * min(s32_max_self_suff, sum(supreg(h2,i2),pm_selfsuff_ext(ct,h2,kforestry))) * p32_plantation_contribution(ct,i2) * f32_estb_calib(i2)) - ; - -*' Constraint to maintain the average regional timber yield at rotation age, accounting for the cellular timber yield (`pc32_yield_forestry_future`). - -q32_establishment_dynamic_yield(i2)$s32_establishment_dynamic .. - sum(cell(i2,j2), (sum(ac_est, v32_land(j2,"plant",ac_est))+v32_land_missing(j2)) * pc32_yield_forestry_future(j2)) - =e= - pc32_yield_forestry_future_reg(i2) * (sum(cell(i2,j2), sum(ac_est, v32_land(j2,"plant",ac_est))+v32_land_missing(j2))); - -*' If plantations have to be static (defined by `s32_establishment_static`) then -*' the model simply establishes the amount of plantations which are harvested. -*' this keeps the plantation area static but accounts for age-class changes and -*' regrowth during every time step. - -q32_establishment_fixed(j2)$s32_establishment_static .. - sum(ac, v32_land(j2,"plant",ac)) =e= sum(ac, pc32_land(j2,"plant",ac)); - - -*' This constraint distributes additions to forestry land over ac_est, -*' which depends on the time step length (e.g. ac0 and ac5 for a 10 year time step). - -q32_forestry_est(j2,type32,ac_est) .. -v32_land(j2,type32,ac_est) =e= sum(ac_est2, v32_land(j2,type32,ac_est2))/card(ac_est2); - -*' Change in forestry area is the difference between plantation area from previous time -*' step ('pc32_land') and optimized plantation area from current time step ('v32_land') - -q32_hvarea_forestry(j2,ac_sub) .. - v32_hvarea_forestry(j2,ac_sub) - =l= - v32_land_reduction(j2,"plant",ac_sub); - -** Timber plantation -*' Woody biomass production from timber plantations is calculated by multiplying the -*' area under production with corresponding yields of plantation forests, divided by the timestep length. - -q32_prod_forestry(j2).. - sum(kforestry, vm_prod_forestry(j2,kforestry)) - =e= - sum(ac_sub, v32_hvarea_forestry(j2,ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"forestry"))) / m_timestep_length_forestry; - -*' Harvesting cost in plantations is defined as the cost incurred while removing -*' biomass from such forests. - -q32_cost_hvarea(i2).. - v32_cost_hvarea(i2) - =e= - sum((ct,cell(i2,j2),ac_sub), v32_hvarea_forestry(j2,ac_sub)) * s32_harvesting_cost - ; - -*** EOF equations.gms *** diff --git a/modules/32_forestry/MMEmu_jul23/input.gms b/modules/32_forestry/MMEmu_jul23/input.gms deleted file mode 100644 index 7e8362645b..0000000000 --- a/modules/32_forestry/MMEmu_jul23/input.gms +++ /dev/null @@ -1,134 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de -$setglobal c32_timber_plantations plantations -* option: natveg, plantations -$setglobal c32_aff_mask noboreal -* options: unrestricted, noboreal, onlytropical -$setglobal c32_aff_policy npi -* options: none, npi, ndc -$setglobal c32_aff_bgp nobgp -* options: ann,nobgp -$setglobal c32_tcre_ctrl ann_TCREmean -* options: ann_TCREmean, ann_TCREhigh, ann_TCRElow -$setglobal c32_interest_rate regional -* options regional, global -$setglobal c32_dev_scen abare -* options abare, brown -$setglobal c32_incr_rate h5s2l1 -* options constant,h5s5l5,h5s2l2,h5s2l1,h5s1l1,h5s1l05,h2s1l05 -$setglobal c32_rot_calc_type current_annual_increment -* option max_increment, max_npv -$setglobal c32_rot_calc_type current_annual_increment -* options mean_annual_increment, current_annual_increment, instantaneous_growth_rate -$setglobal c32_shock_scenario none -* options none 002lin2030 004lin2030 008lin2030 016lin2030 - - -scalars - s32_hvarea Flag for harvested area and establishemt (0=zero 1=exognous 2=endogneous) / 0 / - s32_reESTBcost Re establishment cost (USD per ha) / 2000 / - s32_recurring_cost Recurring costs (USD per ha) / 500 / - s32_harvesting_cost Harvesting cost (USD per ha) / 1000 / - s32_planing_horizon Afforestation planing horizon (years) / 50 / - s32_rotation_extension Rotation extension factor 1=original rotations 2=100 percent increase in rotations etc (1) / 1 / - s32_faustmann_rotation Switch to activate faustmann rotations (1=on 0=off) / 0 / - s32_initial_distribution Switch to Activate ageclass distribution in plantations 0=off 1=equal distribution 2=FAO distribution 3=Poulter distribution 4=Manual distribution (1) / 0 / - s32_price Price for timber (USD) / 45 / - s32_free_land_cost Very high cost for using non existing land for plantation establishment (USD per ha) /1000000/ - s32_max_aff_area Maximum total global afforestation (mio. ha) / Inf / - s32_aff_plantation Switch for using growth curves for afforestation 0=natveg 1=plantations (1) / 0 / - s32_tcre_local Switch for local (1) or global (0) TRCE factors (1) / 1 / - s32_forestry_int_rate Global interest rate for plantations (percent) / 0.05 / - s32_max_self_suff Upper ceiling for the self sufficiency used in calculation for establishment decision (1) / 0.8 / - s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / - s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / - s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 0 / -; - -parameter f32_aff_mask(j) afforestation mask (binary) -/ -$ondelim -$Ifi "%c32_aff_mask%" == "unrestricted" $include "./modules/32_forestry/input/aff_unrestricted.cs2" -$Ifi "%c32_aff_mask%" == "noboreal" $include "./modules/32_forestry/input/aff_noboreal.cs2" -$Ifi "%c32_aff_mask%" == "onlytropical" $include "./modules/32_forestry/input/aff_onlytropical.cs2" -$offdelim -/; - -$onEmpty -parameter f32_max_aff_area(i) Maximum regional afforestation area (mio. ha) -/ -$ondelim -$if exist "./modules/32_forestry/input/f32_max_aff_area.cs4" $include "./modules/32_forestry/input/f32_max_aff_area.cs4" -$offdelim -/; -$offEmpty - -table f32_aff_pol(t_all,j,pol32) npi+ndc afforestation policy (Mha new forest wrt to 2010) -$ondelim -$include "./modules/32_forestry/input/npi_ndc_aff_pol.cs3" -$offdelim -; - -parameter f32_plant_prod_share(t_all) Share of overall production coming from plantations (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_plant_prod_share.csv" -$offdelim -/ -; - -table f32_aff_bgp(j,bgp32) Biogeophysical temperature change of afforestation (degree C) -$ondelim -$include "./modules/32_forestry/input/f32_bph_effect_noTCRE.cs3" -$ondelim -; - -table f32_tcre(j,tcre32) Transient surface temperature response to CO2 emission (degree C per tC per ha) -$ondelim -$include "./modules/32_forestry/input/f32_localTCRE.cs3" -$ondelim -; - -parameter f32_ac_dist(ac) Age class distribution share (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_ac_dist.csv" -$offdelim -/; - -parameter f32_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) -/ -$ondelim -$include "./modules/32_forestry/input/f32_gs_relativetarget.cs4" -$offdelim -/; - -table f32_plantation_contribution(t_ext,i,inter32,scen32) Share of roundwood production coming from timber plantations (percent) -$ondelim -$include "./modules/32_forestry/input/f32_plantation_contribution.cs3" -$ondelim -; - -parameter f32_plantedforest(i) Share of plantation forest in planted forest (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_plantedforest.cs4" -$offdelim -/; - -parameter f32_estb_calib(i) Calibration factor for plantation forest establishment (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_estb_calib.cs4" -$offdelim -/; - -table f32_forest_shock(t_all, shock_scen32) Forest carbon shock scenarios (area share affected per year) -$ondelim -$include "./modules/32_forestry/input/f32_forest_shock.csv" -$offdelim -; diff --git a/modules/32_forestry/MMEmu_jul23/postsolve.gms b/modules/32_forestry/MMEmu_jul23/postsolve.gms deleted file mode 100644 index c8d03d0a2e..0000000000 --- a/modules/32_forestry/MMEmu_jul23/postsolve.gms +++ /dev/null @@ -1,157 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de -*' @code -*' Exchange land information after optimization -p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); -*' @stop - -*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### - ov_cost_fore(t,i,"marginal") = vm_cost_fore.m(i); - ov32_cost_hvarea(t,i,"marginal") = v32_cost_hvarea.m(i); - ov32_land(t,j,type32,ac,"marginal") = v32_land.m(j,type32,ac); - ov32_land_missing(t,j,"marginal") = v32_land_missing.m(j); - ov_landdiff_forestry(t,"marginal") = vm_landdiff_forestry.m; - ov32_cost_recur(t,i,"marginal") = v32_cost_recur.m(i); - ov32_land_expansion(t,j,type32,ac,"marginal") = v32_land_expansion.m(j,type32,ac); - ov32_land_reduction(t,j,type32,ac,"marginal") = v32_land_reduction.m(j,type32,ac); - ov32_cost_establishment(t,i,"marginal") = v32_cost_establishment.m(i); - ov32_hvarea_forestry(t,j,ac,"marginal") = v32_hvarea_forestry.m(j,ac); - ov_prod_forestry(t,j,kforestry,"marginal") = vm_prod_forestry.m(j,kforestry); - ov_cdr_aff(t,j,ac,aff_effect,"marginal") = vm_cdr_aff.m(j,ac,aff_effect); - oq32_cost_total(t,i,"marginal") = q32_cost_total.m(i); - oq32_land(t,j,"marginal") = q32_land.m(j); - oq32_cdr_aff(t,j,ac,"marginal") = q32_cdr_aff.m(j,ac); - oq32_carbon(t,j,ag_pools,stockType,"marginal") = q32_carbon.m(j,ag_pools,stockType); - oq32_land_diff(t,"marginal") = q32_land_diff.m; - oq32_max_aff(t,"marginal") = q32_max_aff.m; - oq32_max_aff_reg(t,i,"marginal") = q32_max_aff_reg.m(i); - oq32_aff_pol(t,j,"marginal") = q32_aff_pol.m(j); - oq32_aff_est(t,j,"marginal") = q32_aff_est.m(j); - oq32_hvarea_forestry(t,j,ac,"marginal") = q32_hvarea_forestry.m(j,ac); - oq32_cost_recur(t,i,"marginal") = q32_cost_recur.m(i); - oq32_establishment_dynamic(t,i,"marginal") = q32_establishment_dynamic.m(i); - oq32_establishment_dynamic_yield(t,i,"marginal") = q32_establishment_dynamic_yield.m(i); - oq32_establishment_fixed(t,j,"marginal") = q32_establishment_fixed.m(j); - oq32_land_expansion(t,j,type32,ac,"marginal") = q32_land_expansion.m(j,type32,ac); - oq32_land_reduction(t,j,type32,ac,"marginal") = q32_land_reduction.m(j,type32,ac); - oq32_cost_establishment(t,i,"marginal") = q32_cost_establishment.m(i); - oq32_bgp_aff(t,j,ac,"marginal") = q32_bgp_aff.m(j,ac); - oq32_forestry_est(t,j,type32,ac,"marginal") = q32_forestry_est.m(j,type32,ac); - oq32_cost_hvarea(t,i,"marginal") = q32_cost_hvarea.m(i); - oq32_prod_forestry(t,j,"marginal") = q32_prod_forestry.m(j); - oq32_bv_aff(t,j,potnatveg,"marginal") = q32_bv_aff.m(j,potnatveg); - oq32_bv_ndc(t,j,potnatveg,"marginal") = q32_bv_ndc.m(j,potnatveg); - oq32_bv_plant(t,j,potnatveg,"marginal") = q32_bv_plant.m(j,potnatveg); - ov_cost_fore(t,i,"level") = vm_cost_fore.l(i); - ov32_cost_hvarea(t,i,"level") = v32_cost_hvarea.l(i); - ov32_land(t,j,type32,ac,"level") = v32_land.l(j,type32,ac); - ov32_land_missing(t,j,"level") = v32_land_missing.l(j); - ov_landdiff_forestry(t,"level") = vm_landdiff_forestry.l; - ov32_cost_recur(t,i,"level") = v32_cost_recur.l(i); - ov32_land_expansion(t,j,type32,ac,"level") = v32_land_expansion.l(j,type32,ac); - ov32_land_reduction(t,j,type32,ac,"level") = v32_land_reduction.l(j,type32,ac); - ov32_cost_establishment(t,i,"level") = v32_cost_establishment.l(i); - ov32_hvarea_forestry(t,j,ac,"level") = v32_hvarea_forestry.l(j,ac); - ov_prod_forestry(t,j,kforestry,"level") = vm_prod_forestry.l(j,kforestry); - ov_cdr_aff(t,j,ac,aff_effect,"level") = vm_cdr_aff.l(j,ac,aff_effect); - oq32_cost_total(t,i,"level") = q32_cost_total.l(i); - oq32_land(t,j,"level") = q32_land.l(j); - oq32_cdr_aff(t,j,ac,"level") = q32_cdr_aff.l(j,ac); - oq32_carbon(t,j,ag_pools,stockType,"level") = q32_carbon.l(j,ag_pools,stockType); - oq32_land_diff(t,"level") = q32_land_diff.l; - oq32_max_aff(t,"level") = q32_max_aff.l; - oq32_max_aff_reg(t,i,"level") = q32_max_aff_reg.l(i); - oq32_aff_pol(t,j,"level") = q32_aff_pol.l(j); - oq32_aff_est(t,j,"level") = q32_aff_est.l(j); - oq32_hvarea_forestry(t,j,ac,"level") = q32_hvarea_forestry.l(j,ac); - oq32_cost_recur(t,i,"level") = q32_cost_recur.l(i); - oq32_establishment_dynamic(t,i,"level") = q32_establishment_dynamic.l(i); - oq32_establishment_dynamic_yield(t,i,"level") = q32_establishment_dynamic_yield.l(i); - oq32_establishment_fixed(t,j,"level") = q32_establishment_fixed.l(j); - oq32_land_expansion(t,j,type32,ac,"level") = q32_land_expansion.l(j,type32,ac); - oq32_land_reduction(t,j,type32,ac,"level") = q32_land_reduction.l(j,type32,ac); - oq32_cost_establishment(t,i,"level") = q32_cost_establishment.l(i); - oq32_bgp_aff(t,j,ac,"level") = q32_bgp_aff.l(j,ac); - oq32_forestry_est(t,j,type32,ac,"level") = q32_forestry_est.l(j,type32,ac); - oq32_cost_hvarea(t,i,"level") = q32_cost_hvarea.l(i); - oq32_prod_forestry(t,j,"level") = q32_prod_forestry.l(j); - oq32_bv_aff(t,j,potnatveg,"level") = q32_bv_aff.l(j,potnatveg); - oq32_bv_ndc(t,j,potnatveg,"level") = q32_bv_ndc.l(j,potnatveg); - oq32_bv_plant(t,j,potnatveg,"level") = q32_bv_plant.l(j,potnatveg); - ov_cost_fore(t,i,"upper") = vm_cost_fore.up(i); - ov32_cost_hvarea(t,i,"upper") = v32_cost_hvarea.up(i); - ov32_land(t,j,type32,ac,"upper") = v32_land.up(j,type32,ac); - ov32_land_missing(t,j,"upper") = v32_land_missing.up(j); - ov_landdiff_forestry(t,"upper") = vm_landdiff_forestry.up; - ov32_cost_recur(t,i,"upper") = v32_cost_recur.up(i); - ov32_land_expansion(t,j,type32,ac,"upper") = v32_land_expansion.up(j,type32,ac); - ov32_land_reduction(t,j,type32,ac,"upper") = v32_land_reduction.up(j,type32,ac); - ov32_cost_establishment(t,i,"upper") = v32_cost_establishment.up(i); - ov32_hvarea_forestry(t,j,ac,"upper") = v32_hvarea_forestry.up(j,ac); - ov_prod_forestry(t,j,kforestry,"upper") = vm_prod_forestry.up(j,kforestry); - ov_cdr_aff(t,j,ac,aff_effect,"upper") = vm_cdr_aff.up(j,ac,aff_effect); - oq32_cost_total(t,i,"upper") = q32_cost_total.up(i); - oq32_land(t,j,"upper") = q32_land.up(j); - oq32_cdr_aff(t,j,ac,"upper") = q32_cdr_aff.up(j,ac); - oq32_carbon(t,j,ag_pools,stockType,"upper") = q32_carbon.up(j,ag_pools,stockType); - oq32_land_diff(t,"upper") = q32_land_diff.up; - oq32_max_aff(t,"upper") = q32_max_aff.up; - oq32_max_aff_reg(t,i,"upper") = q32_max_aff_reg.up(i); - oq32_aff_pol(t,j,"upper") = q32_aff_pol.up(j); - oq32_aff_est(t,j,"upper") = q32_aff_est.up(j); - oq32_hvarea_forestry(t,j,ac,"upper") = q32_hvarea_forestry.up(j,ac); - oq32_cost_recur(t,i,"upper") = q32_cost_recur.up(i); - oq32_establishment_dynamic(t,i,"upper") = q32_establishment_dynamic.up(i); - oq32_establishment_dynamic_yield(t,i,"upper") = q32_establishment_dynamic_yield.up(i); - oq32_establishment_fixed(t,j,"upper") = q32_establishment_fixed.up(j); - oq32_land_expansion(t,j,type32,ac,"upper") = q32_land_expansion.up(j,type32,ac); - oq32_land_reduction(t,j,type32,ac,"upper") = q32_land_reduction.up(j,type32,ac); - oq32_cost_establishment(t,i,"upper") = q32_cost_establishment.up(i); - oq32_bgp_aff(t,j,ac,"upper") = q32_bgp_aff.up(j,ac); - oq32_forestry_est(t,j,type32,ac,"upper") = q32_forestry_est.up(j,type32,ac); - oq32_cost_hvarea(t,i,"upper") = q32_cost_hvarea.up(i); - oq32_prod_forestry(t,j,"upper") = q32_prod_forestry.up(j); - oq32_bv_aff(t,j,potnatveg,"upper") = q32_bv_aff.up(j,potnatveg); - oq32_bv_ndc(t,j,potnatveg,"upper") = q32_bv_ndc.up(j,potnatveg); - oq32_bv_plant(t,j,potnatveg,"upper") = q32_bv_plant.up(j,potnatveg); - ov_cost_fore(t,i,"lower") = vm_cost_fore.lo(i); - ov32_cost_hvarea(t,i,"lower") = v32_cost_hvarea.lo(i); - ov32_land(t,j,type32,ac,"lower") = v32_land.lo(j,type32,ac); - ov32_land_missing(t,j,"lower") = v32_land_missing.lo(j); - ov_landdiff_forestry(t,"lower") = vm_landdiff_forestry.lo; - ov32_cost_recur(t,i,"lower") = v32_cost_recur.lo(i); - ov32_land_expansion(t,j,type32,ac,"lower") = v32_land_expansion.lo(j,type32,ac); - ov32_land_reduction(t,j,type32,ac,"lower") = v32_land_reduction.lo(j,type32,ac); - ov32_cost_establishment(t,i,"lower") = v32_cost_establishment.lo(i); - ov32_hvarea_forestry(t,j,ac,"lower") = v32_hvarea_forestry.lo(j,ac); - ov_prod_forestry(t,j,kforestry,"lower") = vm_prod_forestry.lo(j,kforestry); - ov_cdr_aff(t,j,ac,aff_effect,"lower") = vm_cdr_aff.lo(j,ac,aff_effect); - oq32_cost_total(t,i,"lower") = q32_cost_total.lo(i); - oq32_land(t,j,"lower") = q32_land.lo(j); - oq32_cdr_aff(t,j,ac,"lower") = q32_cdr_aff.lo(j,ac); - oq32_carbon(t,j,ag_pools,stockType,"lower") = q32_carbon.lo(j,ag_pools,stockType); - oq32_land_diff(t,"lower") = q32_land_diff.lo; - oq32_max_aff(t,"lower") = q32_max_aff.lo; - oq32_max_aff_reg(t,i,"lower") = q32_max_aff_reg.lo(i); - oq32_aff_pol(t,j,"lower") = q32_aff_pol.lo(j); - oq32_aff_est(t,j,"lower") = q32_aff_est.lo(j); - oq32_hvarea_forestry(t,j,ac,"lower") = q32_hvarea_forestry.lo(j,ac); - oq32_cost_recur(t,i,"lower") = q32_cost_recur.lo(i); - oq32_establishment_dynamic(t,i,"lower") = q32_establishment_dynamic.lo(i); - oq32_establishment_dynamic_yield(t,i,"lower") = q32_establishment_dynamic_yield.lo(i); - oq32_establishment_fixed(t,j,"lower") = q32_establishment_fixed.lo(j); - oq32_land_expansion(t,j,type32,ac,"lower") = q32_land_expansion.lo(j,type32,ac); - oq32_land_reduction(t,j,type32,ac,"lower") = q32_land_reduction.lo(j,type32,ac); - oq32_cost_establishment(t,i,"lower") = q32_cost_establishment.lo(i); - oq32_bgp_aff(t,j,ac,"lower") = q32_bgp_aff.lo(j,ac); - oq32_forestry_est(t,j,type32,ac,"lower") = q32_forestry_est.lo(j,type32,ac); - oq32_cost_hvarea(t,i,"lower") = q32_cost_hvarea.lo(i); - oq32_prod_forestry(t,j,"lower") = q32_prod_forestry.lo(j); - oq32_bv_aff(t,j,potnatveg,"lower") = q32_bv_aff.lo(j,potnatveg); - oq32_bv_ndc(t,j,potnatveg,"lower") = q32_bv_ndc.lo(j,potnatveg); - oq32_bv_plant(t,j,potnatveg,"lower") = q32_bv_plant.lo(j,potnatveg); -*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/32_forestry/MMEmu_jul23/preloop.gms b/modules/32_forestry/MMEmu_jul23/preloop.gms deleted file mode 100644 index 4702a2457f..0000000000 --- a/modules/32_forestry/MMEmu_jul23/preloop.gms +++ /dev/null @@ -1,306 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de -** Calculation of Single rotation model rotation lengths -** Using forestry carbon densitiy here via carbon density data exchange from carbon module. -p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); - -** Calculating the marginal of carbon density i.e. change in carbon density over two time steps -** The carbon densities are tC/ha/year so we don't have to divide by timestep length. -loop(ac$(ord(ac) > 1), - p32_carbon_density_ac_marg(t_all,j,ac) = (p32_carbon_density_ac_forestry(t_all,j,ac) - p32_carbon_density_ac_forestry(t_all,j,ac-1))/5; - ); -p32_carbon_density_ac_marg(t_all,j,"ac0") = 0; - -** Calculating Instantaneous Growth Rates (IGR). -** This is a proxy number which can be compared against interest rate in the economy to -** make investment decisions in plantations (i.e. to keep it growing or to harvest it). -** This parameter is then used to calculate rotation lengths. -p32_IGR(t_all,j,ac) = (p32_carbon_density_ac_marg(t_all,j,ac)/p32_carbon_density_ac_forestry(t_all,j,ac))$(p32_carbon_density_ac_forestry(t_all,j,ac)>0) - + 1$(p32_carbon_density_ac_forestry(t_all,j,ac)=0); - -** For each cluster in MAgPIE ("j") we calculate how long the prevailing interest rates stay lower than the IGR. -** As long as the prevailing interest rates are lower than IGR, plantations shall be kept standing. -** As long as the prevailing interest rate becomes higher than IGR, it is assumed that the forest owner would rather -** keep his/her investment in bank rather than in keeping the forest standing. -** The easiest way to do this calculation is to count a value of 1 for IGR>interest rate and a value of 0 for IGR 0) - + 0$(p32_IGR(t_all,j,ac) - sum(cell(i,j),pm_interest("y1995",i)) <= 0); - display "Rotation lengths are calculated based on equating instantaneous growth rate to regional interest rate."; -$elseif "%c32_interest_rate%" == "global" - p32_rot_flg(t_all,j,ac) = 1$(p32_IGR(t_all,j,ac) - s32_forestry_int_rate > 0) - + 0$(p32_IGR(t_all,j,ac) - s32_forestry_int_rate <= 0); - display "Rotation lengths are calculated based on equating instantaneous growth rate to global interest rate."; -$endif - -$ifthen "%c32_rot_calc_type%" == "current_annual_increment" - p32_rot_flg(t_all,j,ac) = 1$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_carbon_density_ac_marg(t_all,j,ac-1) > 0) - + 0$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_carbon_density_ac_marg(t_all,j,ac-1) <= 0); - display "Rotation lengths are calculated based on maximizing current annual increment in this run."; -$endif - -$ifthen "%c32_rot_calc_type%" == "mean_annual_increment" - p32_avg_increment(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") / ((ord(ac)+1)*5); - p32_rot_flg(t_all,j,ac) = 1$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_avg_increment(t_all,j,ac) > 0) - + 0$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_avg_increment(t_all,j,ac) <= 0); - display "Rotation lengths are calculated based on maximizing mean annual increment in this run."; -$endif - -** From the above calculation, now it is easier to count how many age-classes can be sustained before IGR falls below interest rate. - -********************************************************************************* - -** Faustmann rotation lengths: - -p32_time(ac) = ord(ac); - -p32_discount_factor(t_all,j,ac) = 1/(exp(sum(cell(i,j),pm_interest(t_all,i))*p32_time(ac))); - -p32_net_present_value(t_all,j,ac) = ((s32_price * p32_carbon_density_ac_forestry(t_all,j,ac) * p32_discount_factor(t_all,j,ac)))/(1-p32_discount_factor(t_all,j,ac)); - -p32_stand_value(t_all,j,ac) = s32_price * p32_carbon_density_ac_forestry(t_all,j,ac); -p32_stand_value(t_all,j,ac)$(p32_stand_value(t_all,j,ac)<0.01) = 0.01; - -p32_investment_returns_lost(t_all,j,ac) = sum(cell(i,j),pm_interest(t_all,i)) * p32_net_present_value(t_all,j,ac); -p32_land_rent_weighted(t_all,j,ac) = p32_investment_returns_lost(t_all,j,ac)/p32_stand_value(t_all,j,ac) ; - -p32_rot_flg_faustmann(t_all,j,ac) = 1$(p32_IGR(t_all,j,ac) > sum(cell(i,j),pm_interest(t_all,i)) + p32_land_rent_weighted(t_all,j,ac)) - + 0$(p32_IGR(t_all,j,ac) <= sum(cell(i,j),pm_interest(t_all,i)) + p32_land_rent_weighted(t_all,j,ac)); - -p32_rot_length_faustmann(t_all,j) = sum(ac,p32_rot_flg_faustmann(t_all,j,ac)); - -********************************************************************************* - -** Change rotation based on switch. If not use calculation before faustmann -if(s32_faustmann_rotation = 0, - p32_rot_length_ac_eqivalent(t_all,j) = sum(ac,p32_rot_flg(t_all,j,ac)); -elseif s32_faustmann_rotation = 1, - p32_rot_length_ac_eqivalent(t_all,j) = sum(ac,p32_rot_flg_faustmann(t_all,j,ac)); -); - -** We provide a upper limit of 90 years for commercial plantations. -** 90 years translates to age-class 18 (90/5) -p32_rot_length_ac_eqivalent(t_all,j)$(p32_rot_length_ac_eqivalent(t_all,j)>18) = 18; -p32_rot_length_ac_eqivalent(t_historical,j) = p32_rot_length_ac_eqivalent("y1995",j); - -** Holding rotation lengths constant after the end of this century. -p32_rot_length_ac_eqivalent(t_future,j) = p32_rot_length_ac_eqivalent("y2100",j); - -** Number of cells in each region -p32_ncells(i) = sum(cell(i,j),1); - -**** Representative regional rotation -loop(t_all, - p32_rotation_regional(t_all,i) = ceil(sum(cell(i,j), p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); - pm_representative_rotation(t_all,i) = ord(t_all) + ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); - ); - -** Earlier we converted rotation lengths to absolute numbers, now we make the Conversion -** back to rotation length in age-classes. -p32_rotation_cellular_estb(t_all,j) = ceil(p32_rot_length_ac_eqivalent(t_all,j)); - -** Set harvesting rotations same as establishment rotations -- Don't move this line below extension of rotation. This is overwritten in the next loop anyways -p32_rotation_cellular_harvesting(t_all,j) = p32_rotation_cellular_estb(t_all,j); - -** RL Extension -p32_rotation_cellular_estb(t_all,j) = p32_rotation_cellular_estb(t_all,j) * s32_rotation_extension ; - -** With the following loop, harvesting rotations are updated based on the rotation length -** at which the establishment of plantations was made. For example, an establishment with -** 50 year rotation in mind in year 2000 shall be available for harvest when the age of -** this plantation is 50 years in 2050. The following loop makes sure that the harvesting -** age is updated correctly in the future. - -loop(j, - loop(t_all, - p32_rotation_offset = p32_rotation_cellular_estb(t_all,j); -* The harvest year is calculated for future based on current establishment decision - p32_rotation_cellular_harvesting(t_all+p32_rotation_offset,j) = p32_rotation_cellular_estb(t_all,j); - ); - ); - -** This loop fixes empty gaps. -** For example in 2035, if establishment length was 10 (50yrs) then it should be harvested in 2085 -** But in 2040, lets say if establishment length was 11 (55yrs) then the harvesting should happen in 2095. -** This leaves y2090 with a gap where model doesn't know which value to choose -** At this point, it takes the values which were initialized in lines above -** where we give harvested rotations the same value as establishment rotation to start with -** The loop below makes some educated guess based on jumps during these blind spots and fills them with proper numbers -loop(t_all, - p32_rotation_cellular_harvesting(t_all+1,j)$(abs(p32_rotation_cellular_harvesting(t_all+1,j) - p32_rotation_cellular_harvesting(t_all,j))>2 AND ord(t_all)= 1 AND ac.off < p32_rotation_cellular_harvesting("y1995",j)); - -** divide initial forestry area by number of age classes within ini32 -if(s32_initial_distribution = 0, -** Initialize with highest age class - p32_land_start_ac(j,"plant","acx") = pcm_land(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_land_start_ac(j,"ndc","acx") = pcm_land(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)); - -elseif s32_initial_distribution = 1, -** Initialize with equal distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1- f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - -elseif s32_initial_distribution = 2, -** Initialize with distribution based on FAO data (but this distribution is applied to all cells globally) -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * f32_ac_dist(ac); - p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * f32_ac_dist(ac); - -elseif s32_initial_distribution = 3, -** Initialize with Poulter distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_rotation_dist(j,ac) = (im_plantedclass_ac(j,ac)$(ini32(j,ac))/sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2))))$(sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2)))); - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j) * p32_rotation_dist(j,ac); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_rotation_dist(j,ac); - -*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell - loop (j, - if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - ); - ); - -elseif s32_initial_distribution = 4, -** Initialize with Manual distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - loop(j, -** Set all acs to 0 - p32_ac_dist_flag(j,ac) = 0; -** Calculate reverse of age-classes, if rotation is 11acs, then ac0 should get a value of 11, 11th ac should get value of 1 - p32_ac_dist_flag(j,ac) = (10*p32_rotation_cellular_harvesting("y1995",j)-((ord(ac)-1))*5)$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); -** Calculate the weights, youngest age-class will have highest weight - p32_ac_dist(j,ac) = (p32_ac_dist_flag(j,ac) / (sum(ac2,p32_ac_dist_flag(j,ac2)) + ord(ac)))$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); -** there can be isntances where this distribution is not summing up to 1, in that case we take the excess and remove it evenly from all age-classes -** In case the sum of distribution is > 1 : Remove the excess from ac0 - p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))>1) = p32_ac_dist(j,"ac0") - (sum(ac2, p32_ac_dist(j,ac2))-1); -** In case the sum of distribution is < 1 : Add the shortage to ac0 - p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))<1) = p32_ac_dist(j,"ac0") + (1-sum(ac2, p32_ac_dist(j,ac2))); - ); -** Isolate plantations from planted forest (forestry) - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); -** Divide plantations according to distribution - p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * p32_ac_dist(j,ac); -** Divide NDCs according to same distribution - p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_ac_dist(j,ac); - -*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell - loop (j, - if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - ); - ); - -); -** Redistribute to youngest age class in case the distribution to plantations and -** ndcs does not match fully with LUH initialized data -loop(j, - if(pm_land_start(j,"forestry") > sum((type32,ac),p32_land_start_ac(j,type32,ac)), - p32_land_start_ac(j,"ndc","ac0") = p32_land_start_ac(j,"ndc","ac0") + (pm_land_start(j,"forestry") - sum((type32,ac),p32_land_start_ac(j,type32,ac))); - ); -); -** Initialization of land -*p32_land_start_ac(j,type32,ac) = p32_land("y1995",j,type32,ac); - -*** NPI/NDC policies BEGIN -** Afforestation policies NPI and NDCs -p32_aff_pol(t,j) = round(f32_aff_pol(t,j,"%c32_aff_policy%"),6); - -* Calculate the remaining exogenous afforestation with respect to the maximum exogenous target over time. -* `p32_aff_togo` is used to adjust `s32_max_aff_area` in the constraint `q32_max_aff`. -p32_aff_togo(t,i) = smax(t2, sum(cell(i,j), p32_aff_pol(t2,j))) - sum(cell(i,j), p32_aff_pol(t,j)); - -* Calculate the limit for endogenous afforestation -* The global (`s32_max_aff_area`) and regional limit (`f32_max_aff_area`) for total afforestation (sum of endogenous and exogenous) is reduced by exogenous NPI/NDC afforestation (`p32_aff_pol`). -if(s32_max_aff_area_glo = 1, - i32_max_aff_area_glo(t) = s32_max_aff_area - smax(t2, sum(j, p32_aff_pol(t2,j))); - i32_max_aff_area_glo(t)$(i32_max_aff_area_glo(t) < 0) = 0; - i32_max_aff_area_glo(t)$(m_year(t) <= sm_fix_SSP2) = Inf; - i32_max_aff_area_reg(t,i) = 0; -elseif s32_max_aff_area_glo = 0, - i32_max_aff_area_reg(t,i) = f32_max_aff_area(i) - smax(t2, sum(cell(i,j), p32_aff_pol(t2,j))); - i32_max_aff_area_reg(t,i)$(i32_max_aff_area_reg(t,i) < 0) = 0; - i32_max_aff_area_reg(t,i)$(m_year(t) <= sm_fix_SSP2) = Inf; - i32_max_aff_area_glo(t) = 0; -); - -*** NPI/NDC policies END - -*fix bph effect to zero for all age classes except the ac that is chosen for the bph effect to occur after planting (e.g. canopy closure) -*fade-in from ac10 to ac30. First effect in ac10 (ord 3), last effect in ac30 (ord 7). -ac_bph(ac) = no; -ac_bph(ac) = yes$(ord(ac) >= 3 AND ord(ac) <= 7); -display ac_bph; - -p32_aff_bgp(j,ac) = 0; -p32_tcre_glo(j) = 0; -if(s32_tcre_local = 1, - p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/f32_tcre(j,"%c32_tcre_ctrl%")/card(ac_bph); -else -*m_weightedmean returns a global value, which is then used assigned to all j. We use land area as weight. - p32_tcre_glo(j2) = m_weightedmean(f32_tcre(j,"%c32_tcre_ctrl%"),sum(land, pcm_land(j,land)),j) - p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/p32_tcre_glo(j)/card(ac_bph) -); - -** Calculate plantation contribution scaled to Growing stock in plantations -** Initialize with low values -p32_plantation_contribution(t_ext,i) = 0.001; -** Fill parameter with input file based on scenario settings -p32_plantation_contribution(t_ext,i)$(f32_gs_relativetarget(i)>0) = f32_plantation_contribution(t_ext,i,"%c32_dev_scen%","%c32_incr_rate%"); - -************************************************************************** -******************************************************************************* -** Calibrate plantations yields -******************************************************************************* -** Initialize with 1 tDM/ha - to avoid dvision by 0 -p32_observed_gs_reg(i) = 1; -** Wherever FAO reports >0 growing stock, we calculate how much growing stock MAGPIE -** sees even before optimization starts -p32_observed_gs_reg(i)$(f32_gs_relativetarget(i)>0 AND sum((cell(i,j),ac),p32_land_start_ac(j,"plant",ac))>0) = (sum((cell(i,j),ac),(pm_timber_yield_initial(j,ac,"forestry") / sm_wood_density) * p32_land_start_ac(j,"plant",ac))/ sum((cell(i,j),ac),p32_land_start_ac(j,"plant",ac))); - -** Initialze calibration factor for growing stocks as 1 -** we dont set it to 0 as we don't want to modify carbon densities by multiplication with 0 later -p32_gs_scaling_reg(i) = 1; -** Calculate the ratio between target growing stock (reported by FAO) and observed growing stock (value at initialization in MAgPIE) -p32_gs_scaling_reg(i)$(f32_gs_relativetarget(i)>0 AND f32_plantedforest(i)>0) = f32_gs_relativetarget(i) / p32_observed_gs_reg(i); -** Calibration factors lower than 1 are set to 1 -p32_gs_scaling_reg(i)$(p32_gs_scaling_reg(i) < 1) = 1; - -** Save pm_carbon_density_ac_forestry in a parameter before upscaling to FAO growing stocks. -** This allows to use plantation growth curves for CO2 price driven afforestation. -p32_c_density_ac_fast_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); - -** Update c-density for timber plantations based on calibration factor to match FAO growing stocks -pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") * sum(cell(i,j),p32_gs_scaling_reg(i)); - -** set bii coefficients -p32_bii_coeff(type32,bii_class_secd,potnatveg) = 0; -if(s32_aff_bii_coeff = 0, - p32_bii_coeff("aff",bii_class_secd,potnatveg) = fm_bii_coeff(bii_class_secd,potnatveg) -elseif s32_aff_bii_coeff = 1, - p32_bii_coeff("aff",bii_class_secd,potnatveg) = fm_bii_coeff("timber",potnatveg) -); -p32_bii_coeff("ndc",bii_class_secd,potnatveg) = fm_bii_coeff(bii_class_secd,potnatveg); -p32_bii_coeff("plant",bii_class_secd,potnatveg) = fm_bii_coeff("timber",potnatveg); - -* initialize parameter -p32_land(t,j,type32,ac) = 0; - -* initialize forest disturbance losses -p32_disturbance_loss_ftype32(t,j,"aff",ac) = 0; diff --git a/modules/32_forestry/MMEmu_jul23/presolve.gms b/modules/32_forestry/MMEmu_jul23/presolve.gms deleted file mode 100644 index 459ceddd89..0000000000 --- a/modules/32_forestry/MMEmu_jul23/presolve.gms +++ /dev/null @@ -1,181 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*define ac_est and ac_sub -ac_est(ac) = no; -ac_est(ac) = yes$(ord(ac) <= (m_yeardiff_forestry(t)/5)); - -ac_sub(ac) = no; -ac_sub(ac) = yes$(ord(ac) > (m_yeardiff_forestry(t)/5)); - -*Reduction of ac_est is not possible. -v32_hvarea_forestry.fx(j,ac_est) = 0; -v32_land_reduction.fx(j,type32,ac_est) = 0; - -** START ndc ** -* calc NPI/NDC afforestation per time step based on forest stock change - p32_aff_pol_timestep("y1995",j) = 0; - p32_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); -* Suitable area (`p32_aff_pot`) for NPI/NDC afforestation - p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); -* suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 - p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; -* Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available - p32_aff_pol_timestep(t,j)$(p32_aff_pol_timestep(t,j) > p32_aff_pot(t,j)) = p32_aff_pot(t,j); -** END ndc ** - -*' @code - -*' Afforestation switch: -*' 0 = Use natveg growth curve towards LPJmL natural vegetation -*' 1 = Use plantation growth curve (faster than natveg) towards LPJmL natural vegetation -if(s32_aff_plantation = 0, - p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); -elseif s32_aff_plantation = 1, - p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = p32_c_density_ac_fast_forestry(t,j,ac); -); - -*' Timber plantations carbon densities: -p32_carbon_density_ac(t,j,"plant",ac,ag_pools) = pm_carbon_density_ac_forestry(t,j,ac,ag_pools); - -*' NDC carbon densities are natveg carbon densities. -p32_carbon_density_ac(t,j,"ndc",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); - -*' CDR from afforestation for each age-class, depending on planning horizon. -p32_cdr_ac(t,j,ac)$(ord(ac) > 1 AND (ord(ac)-1) <= s32_planing_horizon/5) -= p32_carbon_density_ac(t,j,"aff",ac,"vegc") - p32_carbon_density_ac(t,j,"aff",ac-1,"vegc"); - -* Disturbance from generic sources to managed and natural forests -if((ord(t) = 1), - pc32_land(j,type32,ac) = p32_land_start_ac(j,type32,ac); -else - pc32_land(j,type32,ac) = p32_land(t-1,j,type32,ac); -); - -p32_disturbance_loss_ftype32(t,j,"aff",ac_sub) = pc32_land(j,"aff",ac_sub) * f32_forest_shock(t,"%c32_shock_scenario%") * m_timestep_length; -pc32_land(j,"aff",ac_est) = pc32_land(j,"aff",ac_est) + sum(ac_sub,p32_disturbance_loss_ftype32(t,j,"aff",ac_sub))/card(ac_est); - -pc32_land(j,"aff",ac_sub) = pc32_land(j,"aff",ac_sub) - p32_disturbance_loss_ftype32(t,j,"aff",ac_sub); - -*' Regrowth of natural vegetation (natural succession) is modelled by shifting -*' age-classes according to time step length. For first year of simulation, the -*' shift is just 1. Division by 5 happends because the age-classes exist in 5 year steps -s32_shift = m_yeardiff_forestry(t)/5; -*' @stop - -*' Shifting of age-classes in land. -*` @code -if((ord(t)=1), -p32_land(t,j,type32,ac)$(ord(ac) > s32_shift) = p32_land_start_ac(j,type32,ac-s32_shift); -p32_land(t,j,type32,"acx") = p32_land(t,j,type32,"acx") + sum(ac$(ord(ac) > card(ac)-s32_shift), p32_land_start_ac(j,type32,ac)); -else -* Example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s32_shift = 1) -p32_land(t,j,type32,ac)$(ord(ac) > s32_shift) = pc32_land(j,type32,ac-s32_shift); -* Account for cases at the end of the age class set (s32_shift > 1) which are not shifted by the above calculation -p32_land(t,j,type32,"acx") = p32_land(t,j,type32,"acx") + sum(ac$(ord(ac) > card(ac)-s32_shift), pc32_land(j,type32,ac)); -); -* set ac_est to zero -p32_land(t,j,type32,ac_est) = 0; -*' @stop - - - - - -** Calculate v32_land.l -v32_land.l(j,type32,ac) = p32_land(t,j,type32,ac); -pc32_land(j,type32,ac) = v32_land.l(j,type32,ac); -p32_land_before(t,j,type32,ac) = p32_land(t,j,type32,ac); -vm_land.l(j,"forestry") = sum((type32,ac), v32_land.l(j,type32,ac)); -pcm_land(j,"forestry") = sum((type32,ac), v32_land.l(j,type32,ac)); - -** reset all bounds -v32_land.lo(j,type32,ac) = 0; -v32_land.up(j,type32,ac) = Inf; - -if(s32_hvarea = 0, -*** zero. Fixed timber plantations. No harvest. No establisment. - v32_hvarea_forestry.fx(j,ac_sub) = 0; - v32_land.fx(j,"plant",ac) = pc32_land(j,"plant",ac); - s32_establishment_static = 1; - s32_establishment_dynamic = 0; -elseif s32_hvarea = 1, -*** exogenous. All timber plantations are harvested at rotation age and are re-established such that the total plantation area remains constant. - v32_land.fx(j,"plant",ac)$(ac.off < p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); - v32_land.fx(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = 0; - s32_establishment_static = 1; - s32_establishment_dynamic = 0; - -** Timber plantations can be harvested at rotation age (the economically -** optimal point in time harvesting usually natural forests would be preferred over harvest -** from timber plantations, mainly because the growing stock at rotation age (e.g. 50 years) -** in timber plantations is smaller compared to the growing stock of old-growth primary and -** secondary forest (> 100 years). - -elseif s32_hvarea = 2, -*** endogenous. All plantations are harvested at rotation age. Plantation establishment is endogenous. -** Fix timber plantations until the end of the rotation. "ac.off" identical to "ord(ac)-1". -** The offset is needed because the first element of ac is ac0, which is not included in p32_rotation_cellular_harvesting. - v32_land.fx(j,"plant",ac)$(ac.off < p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); -** After the rotation period, plantations are free for harvesting - v32_land.up(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); - s32_establishment_static = 0; - s32_establishment_dynamic = 1; -); -** overwrite bounds for ac_est -v32_land.lo(j,"plant",ac_est) = 0; -v32_land.up(j,"plant",ac_est) = Inf; -v32_land.l(j,"plant",ac_est) = 0.001; - - -** fix ndc afforestation forever, all age-classes are fixed except ac_est -v32_land.fx(j,"ndc",ac_sub) = pc32_land(j,"ndc",ac_sub); -v32_land.lo(j,"ndc",ac_est) = 0; -v32_land.up(j,"ndc",ac_est) = Inf; - -** fix c price induced afforestation based on s32_planing_horizon, fixed only until end of s32_planing_horizon, ac_est is free -if(s32_aff_prot = 0, - v32_land.fx(j,"aff",ac)$(ac.off <= s32_planing_horizon/5) = pc32_land(j,"aff",ac); - v32_land.up(j,"aff",ac)$(ac.off > s32_planing_horizon/5) = pc32_land(j,"aff",ac); -elseif s32_aff_prot = 1, - v32_land.fx(j,"aff",ac) = pc32_land(j,"aff",ac); -); -v32_land.lo(j,"aff",ac_est) = 0; -v32_land.up(j,"aff",ac_est) = Inf; -v32_land.l(j,"aff",ac_est) = 0; - -** Certain areas (e.g. the boreal zone) are excluded from endogenous afforestation. -** DON'T USE TYPE32 SET HERE -if(m_year(t) <= sm_fix_SSP2, - v32_land.fx(j,"aff",ac_est) = 0; -else - v32_land.lo(j,"aff",ac_est) = 0; - v32_land.up(j,"aff",ac_est) = f32_aff_mask(j) * sum(land, pcm_land(j,land)); -); -*' No afforestation is allowed if carbon density <= 20 tc/ha -v32_land.fx(j,"aff",ac_est)$(fm_carbon_density(t,j,"forestry","vegc") <= 20) = 0; - -m_boundfix(v32_land,(j,type32,ac_sub),up,10e-5); - -** Calculate future yield based on rotation length -if((ord(t)=1), -pc32_yield_forestry_future(j) = sum(ac$(ord(ac) = p32_rotation_cellular_estb(t,j)-1), pm_timber_yield(t,j,ac,"forestry")); -pc32_area_rotation(j) = sum(ac$(ord(ac) = p32_rotation_cellular_estb(t,j)-1), p32_land(t,j,"plant",ac)); -); -pc32_yield_forestry_future_reg(i) = m_weightedmean(pc32_yield_forestry_future(j),pc32_area_rotation(j),(cell(i,j))); -pc32_yield_forestry_future_reg(i)$(pc32_yield_forestry_future_reg(i) = 0) = smax(cell(i,j),pc32_yield_forestry_future(j)); - -** Display -p32_updated_gs_reg(t,i) = 1; -p32_updated_gs_reg(t,i)$(sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))>0) = (sum((cell(i,j),ac_sub),(pm_timber_yield(t,j,ac_sub,"forestry") / sm_wood_density) * p32_land(t,j,"plant",ac_sub))/ sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))); - -* Avoid conflict between afforestation for carbon uptake on land and secdforest restoration -pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) - = pm_land_conservation(t,j,"secdforest","restore") - (sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)); -pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") <= sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)) = 0; - -*** EOF presolve.gms *** diff --git a/modules/32_forestry/MMEmu_jul23/realization.gms b/modules/32_forestry/MMEmu_jul23/realization.gms deleted file mode 100644 index c52c9c1dd4..0000000000 --- a/modules/32_forestry/MMEmu_jul23/realization.gms +++ /dev/null @@ -1,45 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*' @description The main feature of the this realization is afforestation for CDR -*' and timber production. Afforestation can be modelled exogenously (prescribed -*' by NPI/NDC policies) and/or endogenously (incentivized by a reward for CDR). -*' National policies implemented (NPI) and nationally determined contributions to -*' the Paris agreement (NDC) for afforestation are based on country reports. The -*' interface `vm_cdr_aff` includes the expected CDR and local bph effects from -*' afforestation depending on the planning horizon `s32_planing_horizon`. The -*' reward for CDR and local bph effects from afforestation is calculated in the -*' [56_ghg_policy] module. In this realization, afforestation is modeled by default -*' as regrowth of natural vegetation (see @humpenoder_investigating_2014 for details on the implemenation). -*' The regrowth of natural vegetation follows S-shaped growth curves, which are -*' parametrized based on @braakhekke_modelling_2019. Additionally this module -*' handles the production of two timber products i.e., wood and woodfuel from -*' plantation forests while still accounting for afforestation policies. New plantations -*' are also established in the simulation step to account for future timber demand. -*' This module also calculates the rotation lengths before the solve loop by -*' maximizing current annual increment (CAI) based on @amacher2009economics. This rotation -*' length calculation decision can also be changed to maximization of mean annual increment (MAI) -*' or equating instantaneous growth rate (IGR) with interest rate. Rotation lengths -*' calculated by maximization of CAI are empirically closer to economically optimal Faustmann -*' rotation lengths (see @amacher2009economics). -*' For harvesting decisions we assume that land owners stick to their establishment decision, -*' e.g. if a plantation has been established with a rotation length of 30 years -*' it will be harvested after 30 years, even so the rotation length in the prevailing -*' time step, used for establishment, is shorter or longer. - -*' @limitations Rotation lengths for timber plantations are not endogenous. - -*####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/32_forestry/MMEmu_jul23/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/32_forestry/MMEmu_jul23/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/32_forestry/MMEmu_jul23/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/32_forestry/MMEmu_jul23/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/32_forestry/MMEmu_jul23/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/32_forestry/MMEmu_jul23/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/32_forestry/MMEmu_jul23/presolve.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/32_forestry/MMEmu_jul23/postsolve.gms" -*######################## R SECTION END (PHASES) ############################### diff --git a/modules/32_forestry/MMEmu_jul23/scaling.gms b/modules/32_forestry/MMEmu_jul23/scaling.gms deleted file mode 100644 index ddc68df6ae..0000000000 --- a/modules/32_forestry/MMEmu_jul23/scaling.gms +++ /dev/null @@ -1,12 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -v32_cost_establishment.scale(i) = 10e3; -v32_cost_recur.scale(i) = 10e4; -vm_cost_fore.scale(i) = 10e4; -v32_cost_hvarea.scale(i)$(s32_hvarea = 1 OR s32_hvarea = 2) = 10e3; -vm_cdr_aff.scale(j,ac,aff_effect) = 10e-4; diff --git a/modules/32_forestry/MMEmu_jul23/sets.gms b/modules/32_forestry/MMEmu_jul23/sets.gms deleted file mode 100644 index 5b4b725355..0000000000 --- a/modules/32_forestry/MMEmu_jul23/sets.gms +++ /dev/null @@ -1,50 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de -sets -***FORESTRY COST TYPES*** - - fcostsALL forestry factor cost types - / recur, mon, harv / - - fcosts32(fcostsALL) forestry factor cost per annum - / recur, mon / - - type32 plantation type - / aff, ndc, plant / - - pol32 afforestation policy type - / none, npi, ndc / - - ini32(j,ac) subset for initialization of timber plantations - - rotation_type Rotation type - / min, low, def, high, bio / - - bgp32 biogeophysical effect (degree C) of afforestation on local surface temperature -/ nobgp, ann_bph / - -tcre32 transient surface temperature response to CO2 emission (degree C per tC) -/ ann_TCREmean, ann_TCREhigh, ann_TCRElow / - -aff_effect biochemical and local biophysical effect of afforestation on climate -/ bgc, bph / - -ac_bph(ac) fade-in of bph effect over age-classes - -inter32 Interpolation of scenario from FAO study on proportion of roundwood production coming from plantations -/abare, brown/ - -scen32 Scenario for development of roundwood production share from plantations -/ constant,h5s5l5,h5s2l2,h5s2l1,h5s1l1,h5s1l05,h2s1l05 / - - shock_scen32 Scenario name of forest carbon shock - / none, 002lin2030,004lin2030,008lin2030,016lin2030 - / - -; - -*** EOF sets.gms *** diff --git a/modules/32_forestry/module.gms b/modules/32_forestry/module.gms index 58d404e45e..002538276d 100644 --- a/modules/32_forestry/module.gms +++ b/modules/32_forestry/module.gms @@ -22,6 +22,5 @@ *' @authors Florian Humpenöder, Abhijeet Mishra *###################### R SECTION START (MODULETYPES) ########################## -$Ifi "%forestry%" == "MMEmu_jul23" $include "./modules/32_forestry/MMEmu_jul23/realization.gms" $Ifi "%forestry%" == "dynamic_feb21" $include "./modules/32_forestry/dynamic_feb21/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ From 463339abb0ddd8663f7ba198d9574d9e1deb9d3c Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 09:03:14 +0100 Subject: [PATCH 045/259] Update input files for MM-Emulator --- scripts/output/extra/disaggregation_LUH2.R | 2 +- scripts/start/projects/MMEmu_default.R | 13 +++++-------- scripts/start/projects/MP_tau.R | 2 +- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/scripts/output/extra/disaggregation_LUH2.R b/scripts/output/extra/disaggregation_LUH2.R index b5f18049b8..d8ec9dfac8 100644 --- a/scripts/output/extra/disaggregation_LUH2.R +++ b/scripts/output/extra/disaggregation_LUH2.R @@ -490,4 +490,4 @@ gc() write.magpie(a, paste0(out_dir, "/LUH2_Yield_Nr.nc"), comment = "unit: kgN-per-ha", datatype = "FLT8S", zname = "time", xname = "lon", yname = "lat") rm(a,yield_kr,yield_kr_su) gc() -} \ No newline at end of file +} diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index d6d797831f..151878e243 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -28,23 +28,20 @@ cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" "./patch_input" = NULL), getOption("magpie_repos")) -cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", - cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.87_26df900e_validation.tgz", - additional = "additional_data_rev4.43.tgz", - patch = "MMEmuR12_rev4.87.tgz") +cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", + cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.96_26df900e_validation.tgz", + additional = "additional_data_rev4.43.tgz") cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets ### Identifier and folder ############################################### identifierFlag <- "MMEmu_default" -cfg$title <- "Default_MMRegOnly" +cfg$title <- "Default_rev4.87-calib" ############################################### cfg$info$flag <- identifierFlag #cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") diff --git a/scripts/start/projects/MP_tau.R b/scripts/start/projects/MP_tau.R index 860c723542..fe80b9069d 100644 --- a/scripts/start/projects/MP_tau.R +++ b/scripts/start/projects/MP_tau.R @@ -40,4 +40,4 @@ cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-NPi" cfg$title <- "B00G0000_tau" #start MAgPIE run -start_run(cfg, codeCheck = FALSE) \ No newline at end of file +start_run(cfg, codeCheck = FALSE) From 5df8aaac90ee03b3f48317b87b901ddbd3d1d772 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 09:07:55 +0100 Subject: [PATCH 046/259] bugfix --- scripts/start/projects/MMEmu_default.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index 151878e243..965a6a7554 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -31,7 +31,7 @@ cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.96_26df900e_validation.tgz", - additional = "additional_data_rev4.43.tgz") + additional = "additional_data_rev4.47.tgz") cfg$output <- c("output_check", "rds_report") @@ -41,7 +41,7 @@ cfg$force_replace <- TRUE ### Identifier and folder ############################################### identifierFlag <- "MMEmu_default" -cfg$title <- "Default_rev4.87-calib" +cfg$title <- "Default_rev4.96-calib" ############################################### cfg$info$flag <- identifierFlag #cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") From 5b74c14e98c75e9105465d3f262aec33bb9b63e0 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 11:15:42 +0100 Subject: [PATCH 047/259] Update Emulator input data --- scripts/start/projects/MMEmu_default.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index 965a6a7554..eb348a283d 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -25,13 +25,14 @@ source("scripts/start_functions.R") #nolinter source("config/default.cfg") #nolinter cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), + "./patch_input" = NULL), getOption("magpie_repos")) cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.96_26df900e_validation.tgz", - additional = "additional_data_rev4.47.tgz") + additional = "additional_data_rev4.47.tgz", + patch = "MMEmuR12_rev4.96.tgz") cfg$output <- c("output_check", "rds_report") From e43d07536f4a1123a4994e6ab11abda3ac80a142 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 14:27:05 +0100 Subject: [PATCH 048/259] add GENIE to scenario config --- config/scenario_config.csv | 184 ++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 85 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 167b6c5696..63db368b4c 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,85 +1,99 @@ -;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem -gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; -gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; -gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; -gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 -gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 -gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;; -gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;; -gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50 -gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1 -gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2 -gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1 -gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI -gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;;FLX;;;FLX;;;;;;;;;;;;;;;;;;; -gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;; -gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;; -gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;; -gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;; -gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;; -gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;; -gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;; -gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;; -gms$c34_urban_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP1;SSP2;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; -gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;; -gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;; -gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;; -gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;; -gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;; -gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;3;3;3;3;3;;;;;;;;;;;;;;;;;;; -gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;on;on;on;on;on;;;;;;;;;;;;;;;;;;; -gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;; -gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;; -gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;; -gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;; -gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; -gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; -gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;; -gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;; -gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;; -gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;; -gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;; -gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;; -gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;; -gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;; -gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;; -gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;; -gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;; -gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.96_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.96_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.96_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.96_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.96_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.96_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz; -gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU; -gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;; -gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;; -gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;; +;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP +gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; +gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; +gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; +gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; +gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; +gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; +gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; +gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; +gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; +gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; +gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;;; +gms$c34_urban_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP1;SSP2;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; +gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; +gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; +gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; +gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; +gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; +gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; +gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; +gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;; +gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; +gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 +gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc +gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; +gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; +gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; +gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; +gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; +gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; +gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.96_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.96_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.96_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.96_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.96_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.96_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; +gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; +gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; +gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; +gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high +cfg$gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 +cfg$gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen +cfg$gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,02 +cfg$gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,005 +cfg$gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 +cfg$gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 +cfg$gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 +cfg$gms$c60_1stgen_biodem;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;phaseout2020 +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 +cfg$gms$c60_bioenergy_subsidy_fix_SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;300 +cfg$gms$s60_bioenergy_gj_price_1st;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 +cfg$gms$s60_bioenergy_price_2nd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 +cfg$gms$c60_price_implementation;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lin From 59cab1bf783758071dd3a799fe390200dbc20f8e Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 14:29:18 +0100 Subject: [PATCH 049/259] update mp default config --- config/mp_default.cfg | 180 ++++++++++++++++++++++++++++-------------- 1 file changed, 119 insertions(+), 61 deletions(-) diff --git a/config/mp_default.cfg b/config/mp_default.cfg index 17254ba7f9..435d365a07 100644 --- a/config/mp_default.cfg +++ b/config/mp_default.cfg @@ -58,11 +58,18 @@ cfg$force_download <- FALSE cfg$force_replace <- FALSE # Settings for the yield calibration +# For this yield calibration (that uses results from a special MAgPIE calibration run +# triggered by the recalibrate switch) to be activated the switch s14_use_yield_calib needs +# to be turned on. (Default is off) +# This switch should only be activated for penalty_apr22 crop realization. +# For other realizations, it is recommended not to use this yield calibration. +# +# Switch to turn on/off recalibration of yields. # * (TRUE): Yield calibration will be performed # * (ifneeded): Yield calibration will only be executed if input data is # * downloaded from repository # * (FALSE): Yield calibration will not be performed -cfg$recalibrate <- "ifneeded" # def = "ifneeded" +cfg$recalibrate <- FALSE # def = FALSE # Up to which accuracy shall be recalibrated? cfg$calib_accuracy <- 0.05 # def = 0.05 # What is the maximum number of iterations if the precision goal is not reached? @@ -97,7 +104,7 @@ cfg$restart_landconversion_cost <- FALSE # def = FALSE # calibration factor in each calibration iteration (0-1) cfg$damping_factor_landconversion_cost <- 0.96 # def= 0.96 # Set upper limit for cropland calibration factor -cfg$cost_calib_max_landconversion_cost <- 3 # def= 3 +cfg$cost_calib_max_landconversion_cost <- 3 # def= 3 # Set lower limit for cropland calibration factor cfg$cost_calib_min_landconversion_cost <- 0.05 # def= 0.05 # Selection type of calibration factors. @@ -309,6 +316,23 @@ cfg$gms$s14_limit_calib <- 1 # def = 1 # NOTE: It is recommended to recalibrate the model when changing this setting! cfg$gms$s14_calib_ir2rf <- 1 # def = 1 +# * Switch to include yield impacts of land degradation. +# * The state of yield-relevant nature's contributions to people (NCP) +# * is reported through ./modules/14_yields/input/f14_yld_ncp_report.cs3 +# * based on estimated outcomes for soil loss or pollination sufficiency +# * per cluster from an existing model run. +# * options: 1 (yields are reduced based on yield reduction coefficients) +# * 0 (land degradation is switched off) +cfg$gms$s14_degradation <- 0 # def = 0 + +# Switch to toggle the use of yield calibration factors (that resulted from a calibration run). +# If 0, no yield calibration factors are used, meaning all calibration factors are set to 1. +# If 1, yield calibration factors are used. (For this option to function, either an existing calibration file +# must be supplied in the input directory, or yields must be recalibrated during preprocessing.) +# This switch should only be activated for penalty_apr22 crop realization. +# For other realizations, it is recommended not to use this yield calibration. +cfg$gms$s14_use_yield_calib <- 0 # def = 0 + # ***--------------------- 15_food --------------------------------------- # * (anthropometrics_jan18): estimates food using scenario dependent regression # * and demography drivers @@ -699,9 +723,11 @@ cfg$gms$s31_fac_req_past <- 1 # def = 1 # * reflecting that not all pasture area is grazed. cfg$gms$s31_unequal <- 1 # def = 1 -# * SSP scenario switch for pasture suitability areas (only take effect for realization grasslands_apr22) -# * options: ssp126, ssp245, ssp370, ssp460, ssp585 -cfg$gms$c31_past_suit_scen <- "ssp370" # def = "ssp370" +# * Scenario for grassland, pasture suitability areas and pasture yields (only take effect for realization grasslands_apr22) +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c31_grassl_yld_scenario <- "cc" # def = "cc" # * Switch that allows selecting how yield calibration factors will be calculated. # * If 0, grassland yield calibration will be calculated as multiplicative relative values. @@ -751,7 +777,12 @@ cfg$gms$s32_max_aff_area <- Inf # def = Inf # Protection of afforested areas (endogenous CO2 price driven) # 0=until end of planning horizon (see s32_planing_horizon) # 1=forever -cfg$gms$s32_aff_prot <- 0 # def = 0 +# Note: Without a price on CO2 emissions from land-use change in module 32_forestry, +# which is the current default (c56_emis_policy <- "reddnatveg_nosoil"), +# the recommended setting for s32_aff_prot is 1. +# Otherwise, the model can do re/afforestation on existing re/afforestation areas +# after the end of planning horizon without penalty for CO2 emissions. +cfg$gms$s32_aff_prot <- 1 # def = 1 # Type of afforestation constraint cfg$gms$s32_max_aff_area_glo <- 1 # def = 1 @@ -1282,7 +1313,9 @@ cfg$gms$nitrogen <- "rescaled_jan21" # def = rescaled_jan21 cfg$gms$carbon <- "normal_dec17" # def = normal_dec17 # * RCP scenario of land carbon sink adjustment factor, from Grassi et al 2021 -# * options: RCP19, RCP26, RCP34, RCP45, RCP60, RCPBU +# * options: RCP19, RCP26, RCP34, RCP45, RCP60, RCPBU, +# * nocc (fixed to values from 1995), +# * nocc_hist (RCPBU until year defined in sm_fix_cc, fixed thereafter) cfg$gms$c52_land_carbon_sink_rcp <- "RCPBU" @@ -1339,18 +1372,27 @@ cfg$gms$s56_cprice_red_factor <- 1 # def = 1 # * GHG emission price scenario # * Note: For best consistency it is recommended to use trajectories from the most recent -# * coupled REMIND-MAgPIE runs. Currently, this is R21M42. -# * Note on available scenarios from coupled REMIND-MAgPIE runs -# * NPi: Current policies; above 3.0°C in 2100 +# * coupled REMIND-MAgPIE runs. Currently, this is R32M46. +# * Available options: +# * none: no 2nd generation bioenergy demand +# * R32M46: Coupled REMIND-MAgPIE runs with REMIND 3.2.1.dev412 and MAgPIE 4.6.11 +# * NPi: Current policies; limit peak warming to 3.0°C +# * NDC: Nationally determined contributions; limit peak warming to 2.5°C +# * PkBudg650: Peak Budget with 650 GtCO2 until net-zero CO2 emissions; well-below 1.5°C in 2100 +# * PkBudg1050: Peak Budget with 1050 GtCO2 until net-zero CO2 emissions; well-below 2.0°C in 2100 +# * R32M46-SDP_MC-NPi, R32M46-SDP_MC-NDC, R32M46-SDP_MC-PkBudg650, +# * R32M46-SSP1-NPi, R32M46-SSP1-NDC, R32M46-SSP1-PkBudg1050, R32M46-SSP1-PkBudg650, +# * R32M46-SSP2EU-NPi, R32M46-SSP2EU-NDC, R32M46-SSP2EU-PkBudg1050, R32M46-SSP2EU-PkBudg650, +# * R32M46-SSP5-NPi, R32M46-SSP5-NDC, R32M46-SSP5-PkBudg1050, R32M46-SSP5-PkBudg650, +# * R21M42: Coupled REMIND-MAgPIE runs with REMIND 2.1 and MAgPIE 4.2 +# * NPi: Current policies; above 3.0°C in 2100 # * PkBudg900: Budget with 900 GtCO2; well-below 1.5°C in 2100 (PkBudg1000 for SDP) # * PkBudg1300: Budget with 1300 GtCO2; well-below 2.0°C in 2100 -# * -# * Available scenarios: -# * Coupled REMIND-MAgPIE runs # * R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, # * R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, # * R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, # * R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, R21M42-SSP5-PkBudg900, +# * R2M41: Coupled REMIND-MAgPIE runs with REMIND 2.0 and MAgPIE 4.1 # * R2M41-SSP2-NPi, R2M41-SSP2-NDC, R2M41-SSP2-Budg1300, R2M41-SSP2-Budg600, R2M41-SSP2-Budg950 # * Standalone REMIND runs from Strefler et al 2021; well-below 2.0°C in 2100 # * https://www.nature.com/articles/s41467-021-22211-2 @@ -1387,8 +1429,8 @@ cfg$gms$s56_cprice_red_factor <- 1 # def = 1 # * c56_pollutant_prices_noselect applies to all other countries. # * Available scenarios for c56_pollutant_prices_noselect are identical to c56_pollutant_prices # * (see above) except for emulator and coupling (which can only be chosen for c56_pollutant_prices) -cfg$gms$c56_pollutant_prices <- "G0000" # def = R21M42-SSP2-NPi -cfg$gms$c56_pollutant_prices_noselect <- "G0000" # def = R21M42-SSP2-NPi +cfg$gms$c56_pollutant_prices <- "G0000" # def = R32M46-SSP2EU-NPi +cfg$gms$c56_pollutant_prices_noselect <- "G0000" # def = R32M46-SSP2EU-NPi # * The following two settings can be used to provide exogenous ghg prices # * via a file that is not part of the input data. This is currently used @@ -1423,7 +1465,7 @@ cfg$gms$s56_c_price_induced_aff <- 1 # def = on # * Options: forestry_vegc, primforest_vegc, secdforest_vegc # * This setting interacts with `c56_emis_policy`. # * If "forestry" is not included in `c56_emis_policy` (e.g. reddnatveg_nosoil), there will be no C-price driven afforestation unless `c56_cprice_aff` is changed to primforest_vegc or secdforest_vegc. -cfg$gms$c56_cprice_aff <- "forestry_vegc" # def = forestry_vegc +cfg$gms$c56_cprice_aff <- "secdforest_vegc" # def = secdforest_vegc # * C price expectation for afforestation decision-making in years # * 0 is myopic behaviour (only C price of current time step) @@ -1431,10 +1473,12 @@ cfg$gms$c56_cprice_aff <- "forestry_vegc" # def = forestry_vegc # * should not be higher than s32_planing_horizon cfg$gms$s56_c_price_exp_aff <- 50 # def = 50 -# * share of carbon credits for afforestation projects pooled in a buffer -# * Values > 0 will reduced the incentive for c price induced afforestation -# * a plausible value is 0.2, based on the Gold Standard for afforestation projects -cfg$gms$s56_buffer_aff <- 0.2 # def = 0.2 +# * Share of carbon credits for re/afforestation projects set aside in a buffer to +# * account for potential failure of permanent carbon storage. +# * Alternatively, this parameter can be interpreted as a reduction factor +# * of the carbon price for non-permanent CDR. +# * Values > 0 will reduce the incentive for c-price-induced re/afforestation +cfg$gms$s56_buffer_aff <- 0.5 # def = 0.5 # * Upper limit for CH4 and N2O GHG price (USD05MER per tC) # * Limits GHG prices selected in c56_pollutant_prices to the chosen value. @@ -1476,7 +1520,7 @@ cfg$gms$s56_limit_ch4_n2o_price <- 4000 # def = 4000 # * ecoSysProtAll_agMgmtExclN2O: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 emis, no further N2O emis) # * ecoSysProtAll_agMgmtExclCH4: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All N2O emis, no further CH4 emis) # * ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) -cfg$gms$c56_emis_policy <- "redd+natveg_nosoil" # def = redd+natveg_nosoil +cfg$gms$c56_emis_policy <- "reddnatveg_nosoil" # def = reddnatveg_nosoil # * CO2 emissions subject to carbon pricing # * options: actual, actualNoAcEst @@ -1514,9 +1558,12 @@ cfg$gms$s57_maxmac_ch4_awms <- -1 # def = -1 # ***--------------------- 58_peatland ------------------------------------ # * (off): Peatland area and associated GHG emissions are assumed zero -# * (on): Peatland area is initialized with present-day degraded and intact peatland. -# * GHG emissions are calculated using IPCC Tier 1 emission factors (2013 Wetland supplement). -cfg$gms$peatland <- "on" # def = on +# * (v2): Peatland area is initialized with degraded and intact peatland area for the year 2022, +# * and projected into the future based on changes in managed land. +# * For boreal and tropical climates, GHG emissions are calculated using emission +# * factors from the IPCC 2013 Wetland supplement. For temperate climates, more recent +# * estimates from Tiemeyer et al 2020 are used. +cfg$gms$peatland <- "v2" # def = v2 # * peatland rewetting # * options: 0 (off) @@ -1524,30 +1571,23 @@ cfg$gms$peatland <- "on" # def = on cfg$gms$s58_rewetting_switch <- Inf # def = Inf # * One-time and recurring costs for peatland rewetting (USD05MER per ha) -cfg$gms$s58_rewet_cost_onetime <- 7000 # def = 7000 -cfg$gms$s58_rewet_cost_recur <- 200 # def = 200 - -# * One-time and recurring costs for peatland degradation (USD05MER per ha) -# * Can be used to test area-based incentives for peatland protection and restoration, -# * complementary or in addition to pricing GHG emissions from degraded peatlands (see s56_peatland_policy). -# * One-time costs apply on the conversion of intact (and rewetted) peatland to degraded peatland. -# * Therefore, one-time costs can used to incentivize the protection of intact peatlands. -# * Recurring costs apply on the level of degraded peatland. Therefore, recurring costs, -# * in combination with one-time costs, can be used to incentivize peatland restoration. -cfg$gms$s58_degrad_cost_onetime <- 0 # def = 0 -cfg$gms$s58_degrad_cost_recur <- 0 # def = 0 +cfg$gms$s58_cost_rewet_onetime <- 7000 # def = 7000 +cfg$gms$s58_cost_rewet_recur <- 200 # def = 200 + +# * One-time and recurring costs for peatland drainage (USD05MER per ha) +# * One-time costs apply on the drainage of intact and rewetted peatland +# * Recurring costs apply on the level of drained and managed peatland +cfg$gms$s58_cost_drain_intact_onetime <- 0 # def = 0 +cfg$gms$s58_cost_drain_rewet_onetime <- 0 # def = 0 +cfg$gms$s58_cost_drain_recur <- 0 # def = 0 -# * Artificial cost for balance variables (USD05MER per ha) -# * The balance variables in the peatland module avoid infeasibilities due to -# * differences in accuracy between parameters and variables in GAMS. -# * High costs make sure that the balance variables are only used as a last resort. -cfg$gms$s58_cost_balance <- 1e+06 # def = 1e+06 -# * Switch for fixing peatland area to 2015 levels from 1995 onwards until the given year -# * Note: The initial peatland area is only available for the year 2015. -# * Fixing the peatland area in previous time steps to 2015 levels provides a better +# * Switch for fixing peatland area until the year given by s58_fix_peatland to historic levels (not available in `off`). +# * Note: In the realisation `v2`, historic peatland area is only available for the year 2022. +# * Due to the 5-year time step limitation in MAgPIE, the suggested default is 2020. +# * Fixing peatland area in previous time steps provides a better # * proxy for GHG emissions from peatlands than assuming no peatland area. -cfg$gms$s58_fix_peatland <- 2015 # def = 2015 +cfg$gms$s58_fix_peatland <- 2020 # def = 2020 # ***------------------------- 59_som ------------------------------------- # * (static_jan19): static soil carbon loss for cropland @@ -1593,18 +1633,27 @@ cfg$gms$c60_1stgen_biodem <- "phaseout2020" # def = const2020 # * 2nd generation bioenergy demand scenario # * Note: For best consistency it is recommended to use trajectories from the most recent -# * coupled REMIND-MAgPIE runs. Currently, this is R21M42. -# * Note on available scenarios from coupled REMIND-MAgPIE runs -# * NPi: Current policies; above 3.0°C in 2100 +# * coupled REMIND-MAgPIE runs. Currently, this is R32M46. +# * Available options: +# * none: no 2nd generation bioenergy demand +# * R32M46: Coupled REMIND-MAgPIE runs with REMIND 3.2.1.dev412 and MAgPIE 4.6.11 +# * NPi: Current policies; limit peak warming to 3.0°C +# * NDC: Nationally determined contributions; limit peak warming to 2.5°C +# * PkBudg650: Peak Budget with 650 GtCO2 until net-zero CO2 emissions; well-below 1.5°C in 2100 +# * PkBudg1050: Peak Budget with 1050 GtCO2 until net-zero CO2 emissions; well-below 2.0°C in 2100 +# * R32M46-SDP_MC-NPi, R32M46-SDP_MC-NDC, R32M46-SDP_MC-PkBudg650, +# * R32M46-SSP1-NPi, R32M46-SSP1-NDC, R32M46-SSP1-PkBudg1050, R32M46-SSP1-PkBudg650, +# * R32M46-SSP2EU-NPi, R32M46-SSP2EU-NDC, R32M46-SSP2EU-PkBudg1050, R32M46-SSP2EU-PkBudg650, +# * R32M46-SSP5-NPi, R32M46-SSP5-NDC, R32M46-SSP5-PkBudg1050, R32M46-SSP5-PkBudg650, +# * R21M42: Coupled REMIND-MAgPIE runs with REMIND 2.1 and MAgPIE 4.2 +# * NPi: Current policies; above 3.0°C in 2100 # * PkBudg900: Budget with 900 GtCO2; well-below 1.5°C in 2100 (PkBudg1000 for SDP) # * PkBudg1300: Budget with 1300 GtCO2; well-below 2.0°C in 2100 -# * -# * Available scenarios: -# * Coupled REMIND-MAgPIE runs # * R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, # * R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, # * R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, # * R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, R21M42-SSP5-PkBudg900, +# * R2M41: Coupled REMIND-MAgPIE runs with REMIND 2.0 and MAgPIE 4.1 # * R2M41-SSP2-NPi, R2M41-SSP2-NDC, R2M41-SSP2-Budg1300, R2M41-SSP2-Budg600, R2M41-SSP2-Budg950 # * Standalone REMIND runs from Strefler et al 2021; well-below 2.0°C in 2100 # * https://www.nature.com/articles/s41467-021-22211-2 @@ -1639,8 +1688,8 @@ cfg$gms$c60_1stgen_biodem <- "phaseout2020" # def = const2020 # * coupling # * Note: c60_2ndgen_biodem applies to countries selected in scen_countries60 # * c60_2ndgen_biodem_noselect applies to all other countries. -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-phaseout2020" # def = R21M42-SSP2-NPi -cfg$gms$c60_2ndgen_biodem_noselect <- "R21M42-SSP2-Npi-phaseout2020" # def = R21M42-SSP2-NPi +cfg$gms$c60_2ndgen_biodem <- "R32M46-SSP2EU-NPi-phaseout2020" # def = R32M46-SSP2EU-NPi +cfg$gms$c60_2ndgen_biodem_noselect <- "R32M46-SSP2EU-NPi-phaseout2020" # def = R32M46-SSP2EU-NPi # * The following setting can be used to provide exogenous bioenergy demand # * via a .mif file that is not part of the input data. This is currently used @@ -1685,7 +1734,7 @@ cfg$gms$s60_bioenergy_price_2nd <- 0 # def = 0 # * Shape of GJ-based price curve towards defined target price # * Options: const : constant price equal to target price -# * exp : exponential implementation starting from 0.25 * target price in the sm_fix_SSP2 year +# * exp : exponential implementation starting from 0.25 * target price in the first sm_fix_SSP2 year; steps <= sm_fix_SSP2 then fixed to 0 # * lin : linear implementation starting from 0 in the sm_fix_SSP2 year cfg$gms$c60_price_implementation <- "lin" # def = "lin" @@ -1744,7 +1793,10 @@ cfg$gms$c70_fac_req_regr <- "glo" # def = glo # * (off): default # * (foragebased_aug18): Disaggregation of livestock to cells # * with high pasture and fodder availability -cfg$gms$disagg_lvst <- "foragebased_aug18" # def = foragebased_aug18 +# * (foragebased_jul23): Disaggregation of livestock to cells +# * with high pasture and fodder availability +# * (improved and flexibitized) +cfg$gms$disagg_lvst <- "foragebased_jul23" # def = foragebased_jul23 # ***--------------------- 73_timber ----------------------------------- @@ -1832,11 +1884,6 @@ cfg$gms$s80_maxiter <- 30 # * (conopt4+conopt3): conopt4 followed by conopt3 cfg$gms$c80_nlp_solver <- "conopt4" # def = conopt4 -# number of allowed non-optimal variables -# Should be set to 0 for GAMS version 25.x.x or earlier -# Should be set to Inf for GAMS version 26.x.x or later -cfg$gms$s80_num_nonopt_allowed <- Inf - # * 1: using optfile for specified solver settings # * 0: default settings (optfile will be ignored) cfg$gms$s80_optfile <- 1 @@ -1890,6 +1937,12 @@ cfg$output <- c("output_check", "extra/disaggregation", "rds_report") # :title: is a placeholder for the current run title (cfg$title) cfg$results_folder <- "output/:title::date:" +# Results folder used by the "highres.R" output script +# If NULL, the default set in "highres.R" is used (currently a subfolder in "output") +# To place highres runs directly in the "output" folder, change to "output" +# To place highres runs in a specific subfolder change to "output/HR" +cfg$results_folder_highres <- NULL + # Which files should be copied into the output folder? cfg$files2export <- list() # Files that should be copied before MAgPIE is started @@ -1915,11 +1968,16 @@ cfg$files2export$start <- c("input/info.txt", "land_conversion_cost_calib_*.cs3", "input/spamplot_*.pdf", "input/regionmapping*.csv", - "input/kba_land_0.5.mz") + "input/kba_land_0.5.mz", + "input/f58_peatland_area_0.5.mz") # Files that should be copied after the MAgPIE run is finished cfg$files2export$end <- NULL +# Expert use only, should not be set manually. Path to a renv.lock file +# defining the package environment for newly started runs. +cfg$renv_lock <- NULL + # Folder run statistics should be submitted to cfg$runstatistics <- "/p/projects/rd3mod/models/statistics/magpie" From 83e2f7cb8b239aa50ac4d6d65d1d457f0ba63ff8 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 14:43:08 +0100 Subject: [PATCH 050/259] Update MM-Default --- scripts/start/projects/MMEmu_default.R | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/MMEmu_default.R index eb348a283d..0e211141a1 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/MMEmu_default.R @@ -38,11 +38,14 @@ cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", cfg$output <- c("output_check", "rds_report") cfg$force_replace <- TRUE +preset <- "GENIE_SCP" +cfg <- setScenario(cfg, c(preset)) #load config presets + ### Identifier and folder ############################################### identifierFlag <- "MMEmu_default" -cfg$title <- "Default_rev4.96-calib" +cfg$title <- "Default_rev4.96-preset" ############################################### cfg$info$flag <- identifierFlag #cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") From f19af18d96b784256b6c6d2e74182bf1f5a4d6e8 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 15:06:54 +0100 Subject: [PATCH 051/259] bugfix --- config/scenario_config.csv | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 63db368b4c..7afc005717 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -84,16 +84,16 @@ gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_20 gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high -cfg$gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 -cfg$gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen -cfg$gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,02 -cfg$gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,005 -cfg$gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 -cfg$gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 -cfg$gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 -cfg$gms$c60_1stgen_biodem;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;phaseout2020 -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 -cfg$gms$c60_bioenergy_subsidy_fix_SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;300 -cfg$gms$s60_bioenergy_gj_price_1st;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 -cfg$gms$s60_bioenergy_price_2nd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 -cfg$gms$c60_price_implementation;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lin +gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 +gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen +gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,02 +gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,005 +gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 +gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 +gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 +gms$c60_1stgen_biodem;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;phaseout2020 +gms$s60_2ndgen_bioenergy_dem_min_post_fix;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 +gms$c60_bioenergy_subsidy_fix_SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;300 +gms$s60_bioenergy_gj_price_1st;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 +gms$s60_bioenergy_price_2nd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 +gms$c60_price_implementation;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lin From 267f7b2c7d63f0a1fcadb20c0f987c86d70921fc Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 15:17:01 +0100 Subject: [PATCH 052/259] bugfix --- config/scenario_config.csv | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 7afc005717..3323918aeb 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -59,7 +59,7 @@ gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; -gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;; +gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; @@ -86,12 +86,11 @@ gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen -gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,02 -gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0,005 +gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 +gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 -gms$c60_1stgen_biodem;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;phaseout2020 gms$s60_2ndgen_bioenergy_dem_min_post_fix;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 gms$c60_bioenergy_subsidy_fix_SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;300 gms$s60_bioenergy_gj_price_1st;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 From 256bc84ca84c0da608c7e9ae7a2106dfa634d82d Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 26 Feb 2024 15:54:20 +0100 Subject: [PATCH 053/259] Update default config and scenario config --- config/default.cfg | 21 +++++++++++++++++++++ config/scenario_config.csv | 13 ++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index a1762f47bd..d240c58317 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -886,6 +886,10 @@ cfg$gms$c32_rot_calc_type <- "current_annual_increment" # * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 cfg$gms$c32_shock_scenario = "none" # def = "none" +# Prohibit rapid afforestation early on. +# * 0.005 = globally 1Mha Aff allowed in 2025 +cfg$gms$s32_max_aff_cell_2025 <- Inf # def = inf + # ***--------------------- 34_urban --------------------------------------- # * 34_urban includes urban land # * (static) static urban land fixed on 1995 patterns from LUH2v2 @@ -1203,6 +1207,8 @@ cfg$gms$s44_bii_lower_bound <- 0 #def = 0 # * Note: The BII constraint is defined as a minimum constraint. Therefore, the actual BII can be higher than the lower bound. cfg$gms$c44_bii_decrease <- 1 #def = 1 +# * Technical costs for missing BII increase (USD per unit of BII) +cfg$gms$s44_cost_bii_missing <- 1000000 #def = 1000000 # ** Options for realization `bv_btc_mar21` @@ -1713,8 +1719,23 @@ cfg$gms$c60_biodem_level <- 1 # def = 1 # * Therefore, the minimum demand is of particular importance for the coupling with REMIND. cfg$gms$s60_2ndgen_bioenergy_dem_min <- 1 # def = 1 +# * Minimum demand can be set to 0 for price-driven runs past the SSP2_fix +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 + # * first generation bioenergy subsidy (USD05MER per ton) +# * for GJ-based prices post fix_SSP2 only the fix_SSP2 should be > 0 cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 + +# * For price-based bioenergy implementation (US05MER per GJ) +cfg$gms$s60_bioenergy_gj_price_1st <- 0 # def = 0 +cfg$gms$s60_bioenergy_price_2nd <- 0 # def = 0 + +# * Shape of GJ-based price curve towards defined target price +# * Options: const : constant price equal to target price +# * exp : exponential implementation starting from 0.25 * target price in the first sm_fix_SSP2 year; steps <= sm_fix_SSP2 then fixed to 0 +# * lin : linear implementation starting from 0 in the sm_fix_SSP2 year +cfg$gms$c60_price_implementation <- "lin" # def = "lin" # ***--------------------- 62_material ------------------------------------ diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 3323918aeb..8ca17f1c0b 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -50,15 +50,15 @@ gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max6 gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -91,8 +91,3 @@ gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 -gms$s60_2ndgen_bioenergy_dem_min_post_fix;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1 -gms$c60_bioenergy_subsidy_fix_SSP2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;300 -gms$s60_bioenergy_gj_price_1st;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 -gms$s60_bioenergy_price_2nd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0 -gms$c60_price_implementation;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lin From 6b738be95e1b1921637a26b2868d59456ad4582d Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 27 Feb 2024 08:42:56 +0100 Subject: [PATCH 054/259] Remove emulator GHG test --- .../MMEmu_feb23/declarations.gms | 59 ------- .../56_ghg_policy/MMEmu_feb23/equations.gms | 79 --------- modules/56_ghg_policy/MMEmu_feb23/input.gms | 89 ---------- .../56_ghg_policy/MMEmu_feb23/not_used.txt | 3 - .../56_ghg_policy/MMEmu_feb23/postsolve.gms | 65 ------- modules/56_ghg_policy/MMEmu_feb23/preloop.gms | 97 ---------- .../56_ghg_policy/MMEmu_feb23/realization.gms | 34 ---- modules/56_ghg_policy/MMEmu_feb23/scaling.gms | 10 -- modules/56_ghg_policy/MMEmu_feb23/sets.gms | 165 ------------------ modules/56_ghg_policy/module.gms | 1 - 10 files changed, 602 deletions(-) delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/declarations.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/equations.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/input.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/not_used.txt delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/postsolve.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/preloop.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/realization.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/scaling.gms delete mode 100644 modules/56_ghg_policy/MMEmu_feb23/sets.gms diff --git a/modules/56_ghg_policy/MMEmu_feb23/declarations.gms b/modules/56_ghg_policy/MMEmu_feb23/declarations.gms deleted file mode 100644 index 8844cb04f8..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/declarations.gms +++ /dev/null @@ -1,59 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -parameters - im_pollutant_prices(t_all,i,pollutants,emis_source) Certificate prices for N2O-N CH4 CO2-C used in the model (USD05MER per Mg) - p56_co2_price(t_all) Certificate prices for CO2 derived from input parameters (USD05MER per Mg) - p56_pollutant_prices_input(t_all,i,pollutants,emis_source) Certificate prices for N2O-N CH4 CO2-C from input files (USD05MER per Mg) - p56_c_price_aff(t_all,i,ac) C price used for afforestation decision-making (USD05MER per tC) - pc56_c_price_induced_aff Helper for fixing C price driven afforestation to zero for historic time steps (binary) - p56_region_price_shr(t_all,i) GHG price share of the region (1) - p56_country_dummy(iso) Dummy parameter indicating whether country is affected by selected GHG policy (1) -; - -equations - q56_emission_costs(i) Calculation of total emission costs (mio. USD05MER per yr) - q56_emission_cost_annual(i,emis_annual) Calculation of regional costs for annual emissions (mio. USD05MER per yr) - q56_emission_cost_oneoff(i,emis_oneoff) Calculation of regional costs for emissions occuring only once in time (mio. USD05MER per yr) - q56_reward_cdr_aff_reg(i) Regional revenues for carbon captured by afforestation (mio. USD05MER per yr) - q56_reward_cdr_aff(j) Cellular revenues for carbon captured by afforestation (mio. USD05MER per yr) - q56_emis_pricing(i,pollutants,emis_source) Calculation of annual CO2 emissions for pricing (Tg per yr) - q56_emis_pricing_co2(i,emis_oneoff) Calculation of annual CO2 emissions for pricing (Tg per yr) -; - -positive variables - vm_carbon_stock(j,land,c_pools,stockType) Carbon stock in vegetation soil and litter for different land types (mio. tC) -; - - -variables - vm_emission_costs(i) Costs for emission rights for pollutants and greenhouse gases (mio. USD05MER per yr) - vm_emissions_reg(i,emis_source,pollutants) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) - v56_emis_pricing(i,emis_source,pollutants) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) - v56_emission_cost(i,emis_source) GHG emissions cost (mio. USD05MER per yr) - vm_reward_cdr_aff(i) Regional average annual expected revenue from afforestation (mio. USD05MER per yr) - v56_reward_cdr_aff(j) Cellular average annual expected revenue from afforestation (mio. USD05MER per yr) -; - -*#################### R SECTION START (OUTPUT DECLARATIONS) #################### -parameters - ov_carbon_stock(t,j,land,c_pools,stockType,type) Carbon stock in vegetation soil and litter for different land types (mio. tC) - ov_emission_costs(t,i,type) Costs for emission rights for pollutants and greenhouse gases (mio. USD05MER per yr) - ov_emissions_reg(t,i,emis_source,pollutants,type) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) - ov56_emis_pricing(t,i,emis_source,pollutants,type) Regional emissions by source and gas after technical mitigation N CH4 C (Tg per yr) - ov56_emission_cost(t,i,emis_source,type) GHG emissions cost (mio. USD05MER per yr) - ov_reward_cdr_aff(t,i,type) Regional average annual expected revenue from afforestation (mio. USD05MER per yr) - ov56_reward_cdr_aff(t,j,type) Cellular average annual expected revenue from afforestation (mio. USD05MER per yr) - oq56_emission_costs(t,i,type) Calculation of total emission costs (mio. USD05MER per yr) - oq56_emission_cost_annual(t,i,emis_annual,type) Calculation of regional costs for annual emissions (mio. USD05MER per yr) - oq56_emission_cost_oneoff(t,i,emis_oneoff,type) Calculation of regional costs for emissions occuring only once in time (mio. USD05MER per yr) - oq56_reward_cdr_aff_reg(t,i,type) Regional revenues for carbon captured by afforestation (mio. USD05MER per yr) - oq56_reward_cdr_aff(t,j,type) Cellular revenues for carbon captured by afforestation (mio. USD05MER per yr) - oq56_emis_pricing(t,i,pollutants,emis_source,type) Calculation of annual CO2 emissions for pricing (Tg per yr) - oq56_emis_pricing_co2(t,i,emis_oneoff,type) Calculation of annual CO2 emissions for pricing (Tg per yr) -; -*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/56_ghg_policy/MMEmu_feb23/equations.gms b/modules/56_ghg_policy/MMEmu_feb23/equations.gms deleted file mode 100644 index ca728bbe0b..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/equations.gms +++ /dev/null @@ -1,79 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - - -*' @equations - - -*' GHG emissions for pricing can differ for CO2 emissions from land-use change depending on `c56_carbon_stock_pricing`. -*' CO2 emission subject to emission pricing are calculated based on changes in carbon stocks between timesteps in the interface `vm_carbon_stock`, depending on `c56_carbon_stock_pricing`. - - q56_emis_pricing(i2,pollutants,emis_annual) .. - v56_emis_pricing(i2,emis_annual,pollutants) =e= - vm_emissions_reg(i2,emis_annual,pollutants); - - q56_emis_pricing_co2(i2,emis_oneoff) .. - v56_emis_pricing(i2,emis_oneoff,"co2_c") =e= - sum((cell(i2,j2),emis_land(emis_oneoff,land,c_pools)), - (vm_carbon_stock.l(j2,land,c_pools,"actual") - vm_carbon_stock(j2,land,c_pools,"%c56_carbon_stock_pricing%"))/m_timestep_length); - -*** Emission costs - -*' **Emission costs** are calculated by multiplying regional emissions with the emission price `im_pollutant_prices`, -*' taking into account the price policy that was defined above in `c56_emis_policy`. - - q56_emission_cost_annual(i2,emis_annual) .. - v56_emission_cost(i2,emis_annual) =e= - sum(pollutants, - v56_emis_pricing(i2,emis_annual,pollutants) * - sum(ct, im_pollutant_prices(ct,i2,pollutants,emis_annual))); - -*' As MAgPIE is a recursive dynamic model, within the optimization of the current time step it does not account for benefits or costs in future time steps. -*' This can be problematic for the treatment of emissions that occur only once under continuous management (such as deforestation, -*' where the forest has been cut down the cropland can be continuously cultivated without further deforestation emissions) versus -*' emissions that occur continously (such as fertilization emissions, that will re-occur every year for continuously management). -*' We therefore distinguish one-off and yearly emissions, and discount one-off emissions assuming an infinite time-horizon to -*' level them with yearly emissions. Since one-off emissions in `vm_emissions_reg` and `v56_emis_cell_pricing` are expressed as annual emissions -*' they are converted back into emissions of the entire timestep by multiplication with `m_timestep_length`, and are then -*' transformed into annual costs by multiplication with the emission price (`im_pollutant_prices`) -*' and an annuity (annuity due with infinite time horizon) factor that depends on `pm_interest`. - - q56_emission_cost_oneoff(i2,emis_oneoff) .. - v56_emission_cost(i2,emis_oneoff) =e= - sum(pollutants, - v56_emis_pricing(i2,emis_oneoff,pollutants) - * m_timestep_length - * sum(ct, - im_pollutant_prices(ct,i2,pollutants,emis_oneoff) - * pm_interest(ct,i2)/(1+pm_interest(ct,i2)))); - -*' **Total regional emission costs** consist of costs from yearly and one-off emissions. - - q56_emission_costs(i2) .. - vm_emission_costs(i2) =e= - sum(emis_source, v56_emission_cost(i2,emis_source)); - -*' The value of CDR from C-price induced afforestation enters the objective function as negative costs. -*' The reward, which serves as incentive for afforestation, is calculated in 3 steps: -*' First, the sum of the expected CDR for each 5-year age-class and the carbon equivalent of local biophysical effects (`vm_cdr_aff`) -*' are multiplied by the corresponding future C price (`p56_c_price_aff`). -*' Second, these future cash flows are discounted to present value, depending on `pm_interest`. -*' Third, an annuity factor (annuity due with infinite time horizon) is used to obtain average annual rewards - - q56_reward_cdr_aff_reg(i2) .. - vm_reward_cdr_aff(i2) =e= - sum(cell(i2,j2), - v56_reward_cdr_aff(j2) - ); - - q56_reward_cdr_aff(j2) .. - v56_reward_cdr_aff(j2) =e= - s56_c_price_induced_aff* - sum(ac, - (sum(aff_effect,(1-s56_buffer_aff)*vm_cdr_aff(j2,ac,aff_effect)) * sum((cell(i2,j2),ct), p56_c_price_aff(ct,i2,ac))) - / ((1+sum((cell(i2,j2),ct),pm_interest(ct,i2)))**(ac.off*5))) - *sum((cell(i2,j2),ct),pm_interest(ct,i2)/(1+pm_interest(ct,i2))); diff --git a/modules/56_ghg_policy/MMEmu_feb23/input.gms b/modules/56_ghg_policy/MMEmu_feb23/input.gms deleted file mode 100644 index b15e17f6c3..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/input.gms +++ /dev/null @@ -1,89 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -* Set-switch for countries affected by regional ghg policy -* Default: all iso countries selected -sets - policy_countries56(iso) countries to be affected by ghg policy / ABW,AFG,AGO,AIA,ALA,ALB,AND,ARE,ARG,ARM, - ASM,ATA,ATF,ATG,AUS,AUT,AZE,BDI,BEL,BEN, - BES,BFA,BGD,BGR,BHR,BHS,BIH,BLM,BLR,BLZ, - BMU,BOL,BRA,BRB,BRN,BTN,BVT,BWA,CAF,CAN, - CCK,CHN,CHE,CHL,CIV,CMR,COD,COG,COK,COL, - COM,CPV,CRI,CUB,CUW,CXR,CYM,CYP,CZE,DEU, - DJI,DMA,DNK,DOM,DZA,ECU,EGY,ERI,ESH,ESP, - EST,ETH,FIN,FJI,FLK,FRA,FRO,FSM,GAB,GBR, - GEO,GGY,GHA,GIB,GIN,GLP,GMB,GNB,GNQ,GRC, - GRD,GRL,GTM,GUF,GUM,GUY,HKG,HMD,HND,HRV, - HTI,HUN,IDN,IMN,IND,IOT,IRL,IRN,IRQ,ISL, - ISR,ITA,JAM,JEY,JOR,JPN,KAZ,KEN,KGZ,KHM, - KIR,KNA,KOR,KWT,LAO,LBN,LBR,LBY,LCA,LIE, - LKA,LSO,LTU,LUX,LVA,MAC,MAF,MAR,MCO,MDA, - MDG,MDV,MEX,MHL,MKD,MLI,MLT,MMR,MNE,MNG, - MNP,MOZ,MRT,MSR,MTQ,MUS,MWI,MYS,MYT,NAM, - NCL,NER,NFK,NGA,NIC,NIU,NLD,NOR,NPL,NRU, - NZL,OMN,PAK,PAN,PCN,PER,PHL,PLW,PNG,POL, - PRI,PRK,PRT,PRY,PSE,PYF,QAT,REU,ROU,RUS, - RWA,SAU,SDN,SEN,SGP,SGS,SHN,SJM,SLB,SLE, - SLV,SMR,SOM,SPM,SRB,SSD,STP,SUR,SVK,SVN, - SWE,SWZ,SXM,SYC,SYR,TCA,TCD,TGO,THA,TJK, - TKL,TKM,TLS,TON,TTO,TUN,TUR,TUV,TWN,TZA, - UGA,UKR,UMI,URY,USA,UZB,VAT,VCT,VEN,VGB, - VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE / -; - -scalars - s56_limit_ch4_n2o_price upper limit for CH4 and N2O GHG prices (USD05MER per tC) / 4000 / - s56_cprice_red_factor reduction factor for CO2 price (-) / 1 / - s56_minimum_cprice Minium C price for future time steps (USD per tC) / 0 / - s56_ghgprice_start start year for ghg price phase-in (year) / 2025 / - s56_ghgprice_end end year for ghg price phase-in (year) / 2100 / - c56_ghgprice_linexp Switch between linear (0) and exponential (1) GHG price trajectory / 1 / - s56_ghgprice_startprice CO2 price at start of phase-in (USD05MER per tCO2) / 0 / - s56_ghgprice_endprice CO2 price at end of phase-in (USD05MER per tCO2) / 0 / - s56_ghgprice_devstate_scaling Switch for scaling GHG price with development state (1=on 0=off) / 0 / - s56_c_price_induced_aff Switch for C price driven afforestation (1=on 0=off) / 1 / - s56_c_price_exp_aff c price expectation for afforestation (years) / 50 / - s56_buffer_aff share of carbon credits for afforestation projects pooled in a buffer (1) / 0.2 / - s56_counter counter for C price interpolation (1) / 0 / - s56_timesteps number of time steps for C price interpolation (1) / 0 / - s56_offset helper for C price interpolation (1) / 0 / -; - -$setglobal c56_pollutant_prices R21M42-SSP2-NPi -$setglobal c56_pollutant_prices_noselect R21M42-SSP2-NPi -$setglobal c56_emis_policy redd+natveg_nosoil -$setglobal c56_cprice_aff forestry_vegc -$setglobal c56_mute_ghgprices_until y2030 - -$setglobal c56_carbon_stock_pricing actualNoAcEst -* options: actual, actualNoAcEst - -table f56_pollutant_prices(t_all,i,pollutants,ghgscen56) GHG certificate prices for N2O-N CH4 CO2-C (USD05MER per t) -$ondelim -$include "./modules/56_ghg_policy/input/f56_pollutant_prices.cs3" -$offdelim -; - -$if "%c56_pollutant_prices%" == "coupling" table f56_pollutant_prices_coupling(t_all,i,pollutants) Regional ghg certificate prices for N2O-N CH4 CO2-C (USD05MER per t) -$if "%c56_pollutant_prices%" == "coupling" $ondelim -$if "%c56_pollutant_prices%" == "coupling" $include "./modules/56_ghg_policy/input/f56_pollutant_prices_coupling.cs3" -$if "%c56_pollutant_prices%" == "coupling" $offdelim -$if "%c56_pollutant_prices%" == "coupling" ; - -$if "%c56_pollutant_prices%" == "emulator" table f56_pollutant_prices_emulator(t_all,i,pollutants) Global ghg certificate prices for N2O-N CH4 CO2-C (USD05MER per t) -$if "%c56_pollutant_prices%" == "emulator" $ondelim -$if "%c56_pollutant_prices%" == "emulator" $include "./modules/56_ghg_policy/input/f56_pollutant_prices_emulator.cs3" -$if "%c56_pollutant_prices%" == "emulator" $offdelim -$if "%c56_pollutant_prices%" == "emulator" ; - -* f56_emis_policy contains scenarios determining for each gas and source whether it is priced or not - -table f56_emis_policy(scen56,pollutants_all,emis_source) GHG emission policy scenarios (1) -$ondelim -$include "./modules/56_ghg_policy/input/f56_emis_policy.csv" -$offdelim -; diff --git a/modules/56_ghg_policy/MMEmu_feb23/not_used.txt b/modules/56_ghg_policy/MMEmu_feb23/not_used.txt deleted file mode 100644 index a1f9037175..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/not_used.txt +++ /dev/null @@ -1,3 +0,0 @@ -name,type,reason -im_pop_iso,input,added by codeCheck - diff --git a/modules/56_ghg_policy/MMEmu_feb23/postsolve.gms b/modules/56_ghg_policy/MMEmu_feb23/postsolve.gms deleted file mode 100644 index 767a3d4d9f..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/postsolve.gms +++ /dev/null @@ -1,65 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### - ov_carbon_stock(t,j,land,c_pools,stockType,"marginal") = vm_carbon_stock.m(j,land,c_pools,stockType); - ov_emission_costs(t,i,"marginal") = vm_emission_costs.m(i); - ov_emissions_reg(t,i,emis_source,pollutants,"marginal") = vm_emissions_reg.m(i,emis_source,pollutants); - ov56_emis_pricing(t,i,emis_source,pollutants,"marginal") = v56_emis_pricing.m(i,emis_source,pollutants); - ov56_emission_cost(t,i,emis_source,"marginal") = v56_emission_cost.m(i,emis_source); - ov_reward_cdr_aff(t,i,"marginal") = vm_reward_cdr_aff.m(i); - ov56_reward_cdr_aff(t,j,"marginal") = v56_reward_cdr_aff.m(j); - oq56_emission_costs(t,i,"marginal") = q56_emission_costs.m(i); - oq56_emission_cost_annual(t,i,emis_annual,"marginal") = q56_emission_cost_annual.m(i,emis_annual); - oq56_emission_cost_oneoff(t,i,emis_oneoff,"marginal") = q56_emission_cost_oneoff.m(i,emis_oneoff); - oq56_reward_cdr_aff_reg(t,i,"marginal") = q56_reward_cdr_aff_reg.m(i); - oq56_reward_cdr_aff(t,j,"marginal") = q56_reward_cdr_aff.m(j); - oq56_emis_pricing(t,i,pollutants,emis_source,"marginal") = q56_emis_pricing.m(i,pollutants,emis_source); - oq56_emis_pricing_co2(t,i,emis_oneoff,"marginal") = q56_emis_pricing_co2.m(i,emis_oneoff); - ov_carbon_stock(t,j,land,c_pools,stockType,"level") = vm_carbon_stock.l(j,land,c_pools,stockType); - ov_emission_costs(t,i,"level") = vm_emission_costs.l(i); - ov_emissions_reg(t,i,emis_source,pollutants,"level") = vm_emissions_reg.l(i,emis_source,pollutants); - ov56_emis_pricing(t,i,emis_source,pollutants,"level") = v56_emis_pricing.l(i,emis_source,pollutants); - ov56_emission_cost(t,i,emis_source,"level") = v56_emission_cost.l(i,emis_source); - ov_reward_cdr_aff(t,i,"level") = vm_reward_cdr_aff.l(i); - ov56_reward_cdr_aff(t,j,"level") = v56_reward_cdr_aff.l(j); - oq56_emission_costs(t,i,"level") = q56_emission_costs.l(i); - oq56_emission_cost_annual(t,i,emis_annual,"level") = q56_emission_cost_annual.l(i,emis_annual); - oq56_emission_cost_oneoff(t,i,emis_oneoff,"level") = q56_emission_cost_oneoff.l(i,emis_oneoff); - oq56_reward_cdr_aff_reg(t,i,"level") = q56_reward_cdr_aff_reg.l(i); - oq56_reward_cdr_aff(t,j,"level") = q56_reward_cdr_aff.l(j); - oq56_emis_pricing(t,i,pollutants,emis_source,"level") = q56_emis_pricing.l(i,pollutants,emis_source); - oq56_emis_pricing_co2(t,i,emis_oneoff,"level") = q56_emis_pricing_co2.l(i,emis_oneoff); - ov_carbon_stock(t,j,land,c_pools,stockType,"upper") = vm_carbon_stock.up(j,land,c_pools,stockType); - ov_emission_costs(t,i,"upper") = vm_emission_costs.up(i); - ov_emissions_reg(t,i,emis_source,pollutants,"upper") = vm_emissions_reg.up(i,emis_source,pollutants); - ov56_emis_pricing(t,i,emis_source,pollutants,"upper") = v56_emis_pricing.up(i,emis_source,pollutants); - ov56_emission_cost(t,i,emis_source,"upper") = v56_emission_cost.up(i,emis_source); - ov_reward_cdr_aff(t,i,"upper") = vm_reward_cdr_aff.up(i); - ov56_reward_cdr_aff(t,j,"upper") = v56_reward_cdr_aff.up(j); - oq56_emission_costs(t,i,"upper") = q56_emission_costs.up(i); - oq56_emission_cost_annual(t,i,emis_annual,"upper") = q56_emission_cost_annual.up(i,emis_annual); - oq56_emission_cost_oneoff(t,i,emis_oneoff,"upper") = q56_emission_cost_oneoff.up(i,emis_oneoff); - oq56_reward_cdr_aff_reg(t,i,"upper") = q56_reward_cdr_aff_reg.up(i); - oq56_reward_cdr_aff(t,j,"upper") = q56_reward_cdr_aff.up(j); - oq56_emis_pricing(t,i,pollutants,emis_source,"upper") = q56_emis_pricing.up(i,pollutants,emis_source); - oq56_emis_pricing_co2(t,i,emis_oneoff,"upper") = q56_emis_pricing_co2.up(i,emis_oneoff); - ov_carbon_stock(t,j,land,c_pools,stockType,"lower") = vm_carbon_stock.lo(j,land,c_pools,stockType); - ov_emission_costs(t,i,"lower") = vm_emission_costs.lo(i); - ov_emissions_reg(t,i,emis_source,pollutants,"lower") = vm_emissions_reg.lo(i,emis_source,pollutants); - ov56_emis_pricing(t,i,emis_source,pollutants,"lower") = v56_emis_pricing.lo(i,emis_source,pollutants); - ov56_emission_cost(t,i,emis_source,"lower") = v56_emission_cost.lo(i,emis_source); - ov_reward_cdr_aff(t,i,"lower") = vm_reward_cdr_aff.lo(i); - ov56_reward_cdr_aff(t,j,"lower") = v56_reward_cdr_aff.lo(j); - oq56_emission_costs(t,i,"lower") = q56_emission_costs.lo(i); - oq56_emission_cost_annual(t,i,emis_annual,"lower") = q56_emission_cost_annual.lo(i,emis_annual); - oq56_emission_cost_oneoff(t,i,emis_oneoff,"lower") = q56_emission_cost_oneoff.lo(i,emis_oneoff); - oq56_reward_cdr_aff_reg(t,i,"lower") = q56_reward_cdr_aff_reg.lo(i); - oq56_reward_cdr_aff(t,j,"lower") = q56_reward_cdr_aff.lo(j); - oq56_emis_pricing(t,i,pollutants,emis_source,"lower") = q56_emis_pricing.lo(i,pollutants,emis_source); - oq56_emis_pricing_co2(t,i,emis_oneoff,"lower") = q56_emis_pricing_co2.lo(i,emis_oneoff); -*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms b/modules/56_ghg_policy/MMEmu_feb23/preloop.gms deleted file mode 100644 index 7a9ea1567d..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/preloop.gms +++ /dev/null @@ -1,97 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -* starting value of above ground carbon stocks 1995 is only an estimate. -* ATTENTION: emissions in 1995 are not meaningful -vm_carbon_stock.l(j,land,ag_pools,stockType) = fm_carbon_density("y1995",j,land,ag_pools)*pcm_land(j,land); - -v56_emis_pricing.fx(i,emis_oneoff,pollutants)$(not sameas(pollutants,"co2_c")) = 0; - -**** Exponentially or linearly implement globally uniform pollution prices -* 44/12 conversion from USD per tCO2 to USD per tC -* 28 and 265 Global Warming Potentials from AR5 WG1 CH08 Table 8.7, conversion from USD per tCO2 to USD per tCH4 and USD per tN2O -* 44/28 conversion from USD per tN2O to USD per tN - -loop(t_all, - if(m_year(t_all) < s56_ghgprice_start, - p56_co2_price(t_all) = 0; - elseif m_year(t_all) >= s56_ghgprice_end, - p56_co2_price(t_all) = s56_ghgprice_endprice; - else - if(c56_ghgprice_linexp = 0, - p56_co2_price(t_all) = s56_ghgprice_startprice + ((s56_ghgprice_endprice - s56_ghgprice_startprice) / (s56_ghgprice_end - s56_ghgprice_start)) * (m_year(t_all) - s56_ghgprice_start); - elseif c56_ghgprice_linexp = 1, - p56_co2_price(t_all) = 0 + (s56_ghgprice_startprice * ((s56_ghgprice_endprice / s56_ghgprice_startprice) ** (1 / (s56_ghgprice_end - s56_ghgprice_start))) ** (m_year(t_all) - s56_ghgprice_start)) $ (s56_ghgprice_startprice <> 0); - ); - ); -); - -im_pollutant_prices(t_all,i,pollutants,emis_source) = 0; -im_pollutant_prices(t_all,i,"co2_c",emis_source) = (44 / 12) * p56_co2_price(t_all); -im_pollutant_prices(t_all,i,"ch4",emis_source) = 28 * p56_co2_price(t_all); -im_pollutant_prices(t_all,i,"n2o_n_direct",emis_source) = 265 * (44 / 28) * p56_co2_price(t_all); -im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source) = 265 * (44 / 28) * p56_co2_price(t_all); - -***save im_pollutant_prices to parameter -p56_pollutant_prices_input(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all,i,pollutants,emis_source); - -** set GHG prices to zero for historic period -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) <= sm_fix_SSP2) = 0; -** set GHG prices to zero for all future time steps until the year defined by `c56_mute_ghgprices_until` -im_pollutant_prices(t_all,i,pollutants,emis_source)$(m_year(t_all) > sm_fix_SSP2 AND m_year(t_all) <= m_year("%c56_mute_ghgprices_until%")) = 0; -** Exception for C price, which can be set to a minium price for all future time steps until the year defined by `c56_mute_ghgprices_until` -im_pollutant_prices(t_all,i,"co2_c",emis_source)$(m_year(t_all) > sm_fix_SSP2 AND m_year(t_all) <= m_year("%c56_mute_ghgprices_until%")) = s56_minimum_cprice; - -***limit CH4 and N2O GHG prices based on s56_limit_ch4_n2o_price -*12/44 conversion from USD per tC to USD per tCO2 -*28 and 265 Global Warming Potentials from AR5 WG1 CH08 Table 8.7, conversion from USD per tCO2 to USD per tCH4 and USD per tN2O -*44/28 conversion from USD per tN2O to USD per tN -im_pollutant_prices(t_all,i,"ch4",emis_source)$(im_pollutant_prices(t_all,i,"ch4",emis_source) > s56_limit_ch4_n2o_price*12/44*28) = s56_limit_ch4_n2o_price*12/44*28; -im_pollutant_prices(t_all,i,"n2o_n_direct",emis_source)$(im_pollutant_prices(t_all,i,"n2o_n_direct",emis_source) > s56_limit_ch4_n2o_price*12/44*265*44/28) = s56_limit_ch4_n2o_price*12/44*265*44/28; -im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source)$(im_pollutant_prices(t_all,i,"n2o_n_indirect",emis_source) > s56_limit_ch4_n2o_price*12/44*265*44/28) = s56_limit_ch4_n2o_price*12/44*265*44/28; - -***apply reduction factor on CO2 price to account for potential negative side effects -***lowers the economic incentive for CO2 emission reduction (avoided deforestation) and afforestation -im_pollutant_prices(t_all,i,"co2_c",emis_source) = im_pollutant_prices(t_all,i,"co2_c",emis_source)*s56_cprice_red_factor; - -***multiply GHG prices with development state to account for institutional requirements needed for implementing a GHG pricing scheme -im_pollutant_prices(t_all,i,pollutants,emis_source)$(s56_ghgprice_devstate_scaling = 1) = im_pollutant_prices(t_all,i,pollutants,emis_source)*im_development_state(t_all,i); - -***GHG emission policy -im_pollutant_prices(t_all,i,pollutants,emis_source) = im_pollutant_prices(t_all,i,pollutants,emis_source) * f56_emis_policy("%c56_emis_policy%",pollutants,emis_source); - -***construct age-class dependent C price for afforestation incentive -***this is needed because time steps (t) and age-classes (ac) can differ. ac and t_all are always in 5-year time steps. -*For missing years in t_all use C price of previous time step. This step makes sure that C prices for every 5-year time step are available. -loop(t_all$(m_year(t_all) > m_year("%c56_mute_ghgprices_until%")), - im_pollutant_prices(t_all,i,"co2_c",emis_source)$(im_pollutant_prices(t_all,i,"co2_c",emis_source) = 0) = im_pollutant_prices(t_all-1,i,"co2_c",emis_source); -); -*Linear interpolation of C price for missing time steps -loop(t, - s56_timesteps = m_yeardiff(t)/5; - if (s56_timesteps > 1, - s56_counter = 0; - repeat( - s56_counter = s56_counter + 1; - s56_offset = s56_timesteps-s56_counter; - im_pollutant_prices(t_all-s56_offset,i,"co2_c",emis_source)$(m_year(t_all) = m_year(t)) = - im_pollutant_prices(t-1,i,"co2_c",emis_source) + - (im_pollutant_prices(t,i,"co2_c",emis_source) - im_pollutant_prices(t-1,i,"co2_c",emis_source))*s56_counter/(s56_timesteps); - until s56_counter = s56_timesteps-1); - ); -); - -*initialize age-class dependent C price with same C price for all age-classes -p56_c_price_aff(t_all,i,ac) = im_pollutant_prices(t_all,i,"co2_c","%c56_cprice_aff%"); -*Shift C prices in age-classes for reflecting foresight. -*e.g. ac5 in 2020 should have the C price of ac0 in 2025, and ac20 in 2020 equals to ac0 in 2040 -p56_c_price_aff(t_all,i,ac)$(ord(t_all)+ac.off= s56_c_price_exp_aff/5) = sum(ac_exp, p56_c_price_aff(t_all,i,ac_exp)); -*zero C price before starting year -p56_c_price_aff(t_all,i,ac)$(m_year(t_all) <= m_year("%c56_mute_ghgprices_until%")) = 0; diff --git a/modules/56_ghg_policy/MMEmu_feb23/realization.gms b/modules/56_ghg_policy/MMEmu_feb23/realization.gms deleted file mode 100644 index ff78340883..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/realization.gms +++ /dev/null @@ -1,34 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*' @description This realization applies pollutant prices to different -*' emission types in Agriculture, Forestry and Other Land Use (AFOLU), -*' depending on the GHG emission pricing policy defined in `c56_emis_policy`. -*' CO2 emissions from Land Use, Land-Use Change and Forestry (LULUCF) are calculated -*' based on carbon stock changes between timesteps in the interface `vm_carbon_stock`. -*' Note that the CO2 emissions subject to pricing can differ from the actual CO2 emissions, -*' depending on the choice of `c56_carbon_stock_pricing`. -*' In addition, the average annual reward for carbon dioxide removal (CDR) -*' and the reward or penalty of local biophysical effects -*' from afforestation [32_forestry] is calculated as the present value (PV) of all -*' future cash flows multiplied with an annuity factor. The PV is obtained by -*' multiplication of `vm_cdr_aff` with the corresponding carbon price and subsequent -*' discouting based on the given discount rate `pm_interest`. -*' Technically, the reward for CDR and bph effects from afforestation is a negative cash flow -*' lowering the costs in the objective function of the model. -*' If pollutant prices are zero, which is the default for reference scenarios without -*' mitigation, total emission costs entering the objective function are zero. - -*####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/56_ghg_policy/MMEmu_feb23/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/56_ghg_policy/MMEmu_feb23/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/56_ghg_policy/MMEmu_feb23/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/56_ghg_policy/MMEmu_feb23/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/56_ghg_policy/MMEmu_feb23/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/56_ghg_policy/MMEmu_feb23/preloop.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/56_ghg_policy/MMEmu_feb23/postsolve.gms" -*######################## R SECTION END (PHASES) ############################### diff --git a/modules/56_ghg_policy/MMEmu_feb23/scaling.gms b/modules/56_ghg_policy/MMEmu_feb23/scaling.gms deleted file mode 100644 index 5fa1e8603c..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/scaling.gms +++ /dev/null @@ -1,10 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -vm_emission_costs.scale(i) = 10e5; -v56_emission_cost.scale(i,emis_source) = 10e4; -vm_carbon_stock.scale(j,land,c_pools,stockType) = 10e3; diff --git a/modules/56_ghg_policy/MMEmu_feb23/sets.gms b/modules/56_ghg_policy/MMEmu_feb23/sets.gms deleted file mode 100644 index 93118855d6..0000000000 --- a/modules/56_ghg_policy/MMEmu_feb23/sets.gms +++ /dev/null @@ -1,165 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*############################################################################### -*######################## R SECTION START (SETS) ############################### -* THIS CODE IS CREATED AUTOMATICALLY, DO NOT MODIFY THESE LINES DIRECTLY -* ANY DIRECT MODIFICATION WILL BE LOST AFTER NEXT AUTOMATIC UPDATE! - -sets - - ghgscen56 ghg price scenarios - / PIK_GDP, - PIK_H2C, - PIK_HBL, - PIK_HOS, - PIK_LIN, - PIK_NPI, - PIK_OPT, - R21M42-SDP-NPi, - R21M42-SDP-PkBudg1000, - R21M42-SDP-PkBudg1100, - R21M42-SDP-PkBudg900, - R21M42-SSP1-NPi, - R21M42-SSP1-PkBudg1100, - R21M42-SSP1-PkBudg1300, - R21M42-SSP1-PkBudg900, - R21M42-SSP2-NPi, - R21M42-SSP2-PkBudg1100, - R21M42-SSP2-PkBudg1300, - R21M42-SSP2-PkBudg900, - R21M42-SSP5-NPi, - R21M42-SSP5-PkBudg1100, - R21M42-SSP5-PkBudg1300, - R21M42-SSP5-PkBudg900, - R2M41-SSP2-Budg1300, - R2M41-SSP2-Budg600, - R2M41-SSP2-Budg950, - R2M41-SSP2-NDC, - R2M41-SSP2-NPi, - SSPDB-SSP1-19-IMAGE, - SSPDB-SSP1-19-REMIND-MAGPIE, - SSPDB-SSP1-26-IMAGE, - SSPDB-SSP1-26-REMIND-MAGPIE, - SSPDB-SSP1-34-IMAGE, - SSPDB-SSP1-34-REMIND-MAGPIE, - SSPDB-SSP1-45-IMAGE, - SSPDB-SSP1-45-REMIND-MAGPIE, - SSPDB-SSP1-Ref-IMAGE, - SSPDB-SSP1-Ref-REMIND-MAGPIE, - SSPDB-SSP2-19-MESSAGE-GLOBIOM, - SSPDB-SSP2-19-REMIND-MAGPIE, - SSPDB-SSP2-26-MESSAGE-GLOBIOM, - SSPDB-SSP2-26-REMIND-MAGPIE, - SSPDB-SSP2-34-MESSAGE-GLOBIOM, - SSPDB-SSP2-34-REMIND-MAGPIE, - SSPDB-SSP2-45-MESSAGE-GLOBIOM, - SSPDB-SSP2-45-REMIND-MAGPIE, - SSPDB-SSP2-60-MESSAGE-GLOBIOM, - SSPDB-SSP2-60-REMIND-MAGPIE, - SSPDB-SSP2-Ref-MESSAGE-GLOBIOM, - SSPDB-SSP2-Ref-REMIND-MAGPIE, - SSPDB-SSP3-34-AIM-CGE, - SSPDB-SSP3-45-AIM-CGE, - SSPDB-SSP3-60-AIM-CGE, - SSPDB-SSP4-26-GCAM4, - SSPDB-SSP4-34-GCAM4, - SSPDB-SSP4-45-GCAM4, - SSPDB-SSP4-60-GCAM4, - SSPDB-SSP4-Ref-GCAM4, - SSPDB-SSP5-19-REMIND-MAGPIE, - SSPDB-SSP5-26-REMIND-MAGPIE, - SSPDB-SSP5-34-REMIND-MAGPIE, - SSPDB-SSP5-45-REMIND-MAGPIE, - SSPDB-SSP5-60-REMIND-MAGPIE, - SSPDB-SSP5-Ref-REMIND-MAGPIE / - - scen56 emission policy scenarios - / none, - all, - all_nosoil, - redd_nosoil, - redd_nosoil_nopeat, - reddnatveg_nosoil, - reddnatveg_nosoil_nopeat, - redd+_nosoil, - redd+_nosoil_nopeat, - redd+natveg_nosoil, - redd+natveg_nosoil_nopeat, - all_vegc, - redd_vegc, - reddnatveg_vegc, - redd+_vegc, - redd+natveg_vegc, - sdp_cropeff, - sdp_livestock, - sdp_redd, - sdp_soil, - sdp_peatland, - sdp_redd_soil, - sdp_redd_soil_peat, - sdp_all, - gcs_lbs, - gcs_res, - ecoSysProtAll, - ecoSysProtForest, - ecoSysProtPrimForest, - ecoSysProtOff, - ecoSysProtAll_agMgmtExclN2O, - ecoSysProtAll_agMgmtExclCH4, - ecoSysProtAll_agMgmtOff / - -; -*######################### R SECTION END (SETS) ################################ -*############################################################################### - -sets - - pollutants_all all pollutants - / co2_c, - ch4, - n2o_n_direct, nh3_n, no2_n, - no3_n, - n2o_n_indirect, - co, - nmhc, - h2, - pm2_5, - tpm, - tc, - oc, - bc, - so2 / - - pollutants(pollutants_all) subset of pollutants_all that can be taxed - / co2_c, - ch4, - n2o_n_direct, n2o_n_indirect, - nh3_n, no2_n, - no3_n / - - n_pollutants(pollutants) subset of n pollutants - / n2o_n_direct,n2o_n_indirect, - nh3_n, no2_n, - no3_n / - - n_pollutants_direct(n_pollutants) subset of n pollutants - / n2o_n_direct, - nh3_n, no2_n, - no3_n / - - pollutant_nh3no2_51(n_pollutants_direct) nitrogen emissions relevant for deposition - / nh3_n, no2_n / - - ac_exp(ac) age-class corresponding to planning horizon - - ag_pools(c_pools) Above ground carbon pools - / vegc, litc / - - stockType Carbon stock types - / actual, actualNoAcEst / -; diff --git a/modules/56_ghg_policy/module.gms b/modules/56_ghg_policy/module.gms index f30d0611f0..e10c49e771 100644 --- a/modules/56_ghg_policy/module.gms +++ b/modules/56_ghg_policy/module.gms @@ -24,6 +24,5 @@ *' @authors Benjamin Bodirsky, Florian Humpenoeder *###################### R SECTION START (MODULETYPES) ########################## -$Ifi "%ghg_policy%" == "MMEmu_feb23" $include "./modules/56_ghg_policy/MMEmu_feb23/realization.gms" $Ifi "%ghg_policy%" == "price_aug22" $include "./modules/56_ghg_policy/price_aug22/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ From 9554b9c7c1ec4b656fc1f8226b8bff6561c9128a Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 27 Feb 2024 08:44:28 +0100 Subject: [PATCH 055/259] Rename Emulator BE realization --- .../declarations.gms | 0 .../equations.gms | 0 .../input.gms | 0 .../postsolve.gms | 0 .../preloop.gms | 0 .../presolve.gms | 0 .../1st2ndgen_priced_feb24/realization.gms | 17 +++++++++++++++++ .../scaling.gms | 0 .../sets.gms | 0 .../60_bioenergy/MMEmu_feb23/realization.gms | 17 ----------------- modules/60_bioenergy/module.gms | 2 +- 11 files changed, 18 insertions(+), 18 deletions(-) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/declarations.gms (100%) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/equations.gms (100%) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/input.gms (100%) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/postsolve.gms (100%) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/preloop.gms (100%) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/presolve.gms (100%) create mode 100644 modules/60_bioenergy/1st2ndgen_priced_feb24/realization.gms rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/scaling.gms (100%) rename modules/60_bioenergy/{MMEmu_feb23 => 1st2ndgen_priced_feb24}/sets.gms (100%) delete mode 100644 modules/60_bioenergy/MMEmu_feb23/realization.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/declarations.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/declarations.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/declarations.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/declarations.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/equations.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/equations.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/input.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/input.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/postsolve.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/postsolve.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/postsolve.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/postsolve.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/preloop.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/preloop.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/preloop.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/preloop.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/presolve.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/presolve.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/presolve.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/presolve.gms diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/realization.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/realization.gms new file mode 100644 index 0000000000..5584f155fa --- /dev/null +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/realization.gms @@ -0,0 +1,17 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "sets" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### diff --git a/modules/60_bioenergy/MMEmu_feb23/scaling.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/scaling.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/scaling.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/scaling.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/sets.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms similarity index 100% rename from modules/60_bioenergy/MMEmu_feb23/sets.gms rename to modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms diff --git a/modules/60_bioenergy/MMEmu_feb23/realization.gms b/modules/60_bioenergy/MMEmu_feb23/realization.gms deleted file mode 100644 index 33e86c4afa..0000000000 --- a/modules/60_bioenergy/MMEmu_feb23/realization.gms +++ /dev/null @@ -1,17 +0,0 @@ -*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/60_bioenergy/MMEmu_feb23/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/60_bioenergy/MMEmu_feb23/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/60_bioenergy/MMEmu_feb23/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/60_bioenergy/MMEmu_feb23/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/60_bioenergy/MMEmu_feb23/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/60_bioenergy/MMEmu_feb23/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/60_bioenergy/MMEmu_feb23/presolve.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/60_bioenergy/MMEmu_feb23/postsolve.gms" -*######################## R SECTION END (PHASES) ############################### diff --git a/modules/60_bioenergy/module.gms b/modules/60_bioenergy/module.gms index 37c53225f9..df38a46b74 100644 --- a/modules/60_bioenergy/module.gms +++ b/modules/60_bioenergy/module.gms @@ -19,6 +19,6 @@ *###################### R SECTION START (MODULETYPES) ########################## +$Ifi "%bioenergy%" == "1st2ndgen_priced_feb24" $include "./modules/60_bioenergy/1st2ndgen_priced_feb24/realization.gms" $Ifi "%bioenergy%" == "1stgen_priced_dec18" $include "./modules/60_bioenergy/1stgen_priced_dec18/realization.gms" -$Ifi "%bioenergy%" == "MMEmu_feb23" $include "./modules/60_bioenergy/MMEmu_feb23/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ From 38aecb7adbc2106cac52bdc7362048d0e9fbfc3e Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Tue, 27 Feb 2024 10:12:46 +0100 Subject: [PATCH 056/259] Adjust files to renamed BE realization --- config/scenario_config.csv | 2 +- scripts/start_functions.R | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 8ca17f1c0b..c8e41abd0e 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -90,4 +90,4 @@ gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 -gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 +gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 diff --git a/scripts/start_functions.R b/scripts/start_functions.R index 15cffc835e..cfc26b448a 100644 --- a/scripts/start_functions.R +++ b/scripts/start_functions.R @@ -89,7 +89,6 @@ items = scen56)) gms::writeSets(sets, "modules/56_ghg_policy/price_aug22/sets.gms") - gms::writeSets(sets, "modules/56_ghg_policy/MMEmu_feb23/sets.gms") ### 60_bioenergy scen2nd60 <- magclass::read.magpie("modules/60_bioenergy/input/f60_bioenergy_dem.cs3") @@ -100,7 +99,7 @@ items = scen2nd60)) gms::writeSets(sets , "modules/60_bioenergy/1stgen_priced_dec18/sets.gms") - gms::writeSets(sets , "modules/60_bioenergy/MMEmu_feb23/sets.gms") + gms::writeSets(sets , "modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms") } # Function to extract information from info.txt From ecfd4bf6c8665de685d7ecb4645acb0586fcd704 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 28 Feb 2024 21:55:07 +0100 Subject: [PATCH 057/259] Update SCP settings --- config/scenario_config.csv | 2 +- modules/15_food/anthro_iso_jun22/sets.gms | 2 +- modules/15_food/anthropometrics_jan18/sets.gms | 2 +- modules/44_biodiversity/bii_target/equations.gms | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 8ca17f1c0b..f1f907f356 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -6,7 +6,7 @@ gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; diff --git a/modules/15_food/anthro_iso_jun22/sets.gms b/modules/15_food/anthro_iso_jun22/sets.gms index d71d1ef2f8..679e2c0637 100644 --- a/modules/15_food/anthro_iso_jun22/sets.gms +++ b/modules/15_food/anthro_iso_jun22/sets.gms @@ -153,7 +153,7 @@ sets / constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, - lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50,MP76,MP50,MP30 / + lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50, sigmoid_75pc_25_50, sigmoid_50pc_25_50, sigmoid_25pc_25_50 / t_scen15(t_all) Target years for transition to exogenous scenario diets / y2010, y2030, y2050 / diff --git a/modules/15_food/anthropometrics_jan18/sets.gms b/modules/15_food/anthropometrics_jan18/sets.gms index 0c02aa2de9..9d63a59a69 100644 --- a/modules/15_food/anthropometrics_jan18/sets.gms +++ b/modules/15_food/anthropometrics_jan18/sets.gms @@ -153,7 +153,7 @@ sets / constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, - lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50,MP76,MP50,MP30,MP50new,MP49,MP51 / + lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50, sigmoid_75pc_25_50, sigmoid_50pc_25_50, sigmoid_25pc_25_50 / t_scen15(t_all) Target years for transition to exogenous scenario diets / y2010, y2030, y2050 / diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index b7fdc1ea1d..c143e63fc4 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -26,4 +26,3 @@ q44_cost(i2) .. sum(cell(i2,j2), vm_cost_bv_loss(j2)) =e= sum(biome44, v44_bii_missing(i2,biome44)) * s44_cost_bii_missing; - From e3e69d7fb95e7e868b9fd86a7e0ada1b3979ecd4 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 28 Feb 2024 23:16:15 +0100 Subject: [PATCH 058/259] Remove unused scripts --- .../{MMEmu_default.R => GENIE_0_default.R} | 6 +- .../{MMEmu_debug.R => GENIE_1_tau-export.R} | 45 ++++---- scripts/start/projects/MMEmu_demand.R | 102 ------------------ scripts/start/projects/MMEmu_price.R | 98 ----------------- scripts/start/projects/MMEmu_tau.R | 83 -------------- scripts/start/projects/MP_BDprice.R | 78 -------------- scripts/start/projects/MP_tau.R | 43 -------- scripts/start/projects/mp_default.R | 17 --- 8 files changed, 24 insertions(+), 448 deletions(-) rename scripts/start/projects/{MMEmu_default.R => GENIE_0_default.R} (91%) rename scripts/start/projects/{MMEmu_debug.R => GENIE_1_tau-export.R} (61%) delete mode 100644 scripts/start/projects/MMEmu_demand.R delete mode 100644 scripts/start/projects/MMEmu_price.R delete mode 100644 scripts/start/projects/MMEmu_tau.R delete mode 100644 scripts/start/projects/MP_BDprice.R delete mode 100644 scripts/start/projects/MP_tau.R delete mode 100644 scripts/start/projects/mp_default.R diff --git a/scripts/start/projects/MMEmu_default.R b/scripts/start/projects/GENIE_0_default.R similarity index 91% rename from scripts/start/projects/MMEmu_default.R rename to scripts/start/projects/GENIE_0_default.R index 0e211141a1..41df4836f4 100644 --- a/scripts/start/projects/MMEmu_default.R +++ b/scripts/start/projects/GENIE_0_default.R @@ -6,8 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Default varient for Tau readout -# position: 1 +# description: GENIE project MESSAGE-MAgPIE Emulator Default script # ---------------------------------------------------------- ###################################### @@ -36,19 +35,16 @@ cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", cfg$output <- c("output_check", "rds_report") -cfg$force_replace <- TRUE preset <- "GENIE_SCP" cfg <- setScenario(cfg, c(preset)) #load config presets - ### Identifier and folder ############################################### identifierFlag <- "MMEmu_default" cfg$title <- "Default_rev4.96-preset" ############################################### cfg$info$flag <- identifierFlag -#cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") ########################################################## start_run(cfg, codeCheck = FALSE) diff --git a/scripts/start/projects/MMEmu_debug.R b/scripts/start/projects/GENIE_1_tau-export.R similarity index 61% rename from scripts/start/projects/MMEmu_debug.R rename to scripts/start/projects/GENIE_1_tau-export.R index f509e5be9c..4e77720ad1 100644 --- a/scripts/start/projects/MMEmu_debug.R +++ b/scripts/start/projects/GENIE_1_tau-export.R @@ -6,8 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Debug Setup -# position: 1 +# description: GENIE project MESSAGE-MAgPIE Emulator exo Tau export # ---------------------------------------------------------- ###################################### @@ -25,40 +24,42 @@ source("scripts/start_functions.R") #nolinter source("config/default.cfg") #nolinter cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), + "./patch_input" = NULL), getOption("magpie_repos")) -cfg$input <- append(cfg$input, c(patch = "patch.tgz")) + +cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", + cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.96_26df900e_validation.tgz", + additional = "additional_data_rev4.47.tgz", + patch = "MMEmuR12_rev4.96.tgz") + cfg$output <- c("output_check", "rds_report") -cfg$force_replace <- TRUE -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets +preset <- "GENIE_SCP" +cfg <- setScenario(cfg, c(preset)) #load config presets + +cfg$force_replace <- FALSE +cfg$qos <- "priority" ### Identifier and folder ############################################### -identifierFlag <- "Emulator_debug" -cfg$title <- "6_Cropland_A_BE10_Inf" +identifierFlag <- "SCP_24_02_29" +cfg$title <- "Default_rev4.96-preset" ############################################### + cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") -### BE -cfg$gms$bioenergy <- "MMEmu_feb23" +cfg$gms$c44_bii_decrease <- 0 +cfg$gms$c22_protect_scenario <- "BH" -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 cfg$gms$c60_bioenergy_subsidy <- 0 -cfg$gms$s60_bioenergy_gj_price_1st <- 10 -cfg$gms$s60_bioenergy_price_2nd <- 10 - -### Yield -#cfg$gms$c14_yields_scenario <- "nocc_hist" - -### Biodiv -#cfg$gms$c44_bii_decrease <- 0 +cfg$gms$c60_2ndgen_biodem <- "R32M46-SSP2EU-NPi" -### Cropland -cfg$gms$s30_annual_max_growth <- Inf +cfg$title <- "Tau" +#start MAgPIE run start_run(cfg, codeCheck = FALSE) diff --git a/scripts/start/projects/MMEmu_demand.R b/scripts/start/projects/MMEmu_demand.R deleted file mode 100644 index b2149b48ac..0000000000 --- a/scripts/start/projects/MMEmu_demand.R +++ /dev/null @@ -1,102 +0,0 @@ -# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Demand-Driven -# position: 1 -# ---------------------------------------------------------- - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(lucode2) -library(magclass) -library(gms) -library(stringr) - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -# Source the default config and then over-write it before starting the run. -source("config/default.cfg") #nolinter - -cfg$qos <- "standby" - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) -cfg$input <- c(regional = "rev4.84_a10a580c_magpie.tgz", - cellular = "rev4.84_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.84_a10a580c_validation.tgz", - additional = "additional_data_rev4.39.tgz", - patch = "MMEmuR11.tgz") - -cfg$output <- c("output_check", "rds_report") -cfg$force_replace <- TRUE - -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets - -### Identifier and folder -############################################### -identifierFlag <- "Emulator_23-04-25_set-76" -############################################### -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") - -### BE -cfg$gms$bioenergy <- "MMEmu_feb23" -# non-default BE demands -cfg$gms$c60_1stgen_biodem <- "phaseout2020" -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 - -# Subsidies / Prices -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 -cfg$gms$c60_bioenergy_subsidy <- 0 - -cfg$gms$s60_bioenergy_gj_price_1st <- 0 -cfg$gms$s60_bioenergy_price_2nd <- 0 - -#beV <- c(0, 6, 8, 10, 12, 15, 25) -beV <- c(25) - -### GHG -cfg$gms$ghg_policy <- "MMEmu_feb23" - -gV <- c(0, 100, 1000, 2000, 3000, 4000) - -### Tau / Yield -cfg$gms$c14_yields_scenario <- "nocc_hist" -cfg$gms$tc <- "exo" - -### Biodiv -cfg$gms$c44_bii_decrease <- 0 - - -### Cropland -cfg$gms$s30_annual_max_growth <- 0.02 - - -us00_05 <- 1.1197 #src: https://data.worldbank.org/indicator/NY.GDP.DEFL.ZS?end=2005&locations=US&start=2000 - - -for (be in beV){ - - cfg$gms$c60_2ndgen_biodem <- paste0("Emu", str_pad(be, 2, pad = "0"), "const") - - for (g in gV){ - - cfg$gms$s56_ghgprice_startprice <- g / 40 * us00_05 - cfg$gms$s56_ghgprice_endprice <- g * us00_05 - - ############################################## - runflag <- "demand" - cfg$title <- paste0("E", str_pad(be, 2, pad = "0"), "G", str_pad(g, 4, pad = "0"), runflag) - - start_run(cfg, codeCheck = FALSE) - } #GHG -} #BE diff --git a/scripts/start/projects/MMEmu_price.R b/scripts/start/projects/MMEmu_price.R deleted file mode 100644 index 9b6336b373..0000000000 --- a/scripts/start/projects/MMEmu_price.R +++ /dev/null @@ -1,98 +0,0 @@ -# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Debug Setup -# position: 1 -# ---------------------------------------------------------- - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(lucode2) -library(magclass) -library(gms) -library(stringr) - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -# Source the default config and then over-write it before starting the run. -source("config/default.cfg") #nolinter - -cfg$qos <- "standby" - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) -cfg$input <- c(regional = "rev4.84_a10a580c_magpie.tgz", - cellular = "rev4.84_a10a580c_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.84_a10a580c_validation.tgz", - additional = "additional_data_rev4.39.tgz", - patch = "MMEmuR11.tgz") - -cfg$output <- c("output_check", "rds_report") -cfg$force_replace <- TRUE - -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets - -### Identifier and folder -############################################### -identifierFlag <- "Emulator_23-04-25_set-76" -############################################### -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") - -### BE -cfg$gms$bioenergy <- "MMEmu_feb23" -# non-default BE demands -cfg$gms$c60_1stgen_biodem <- "phaseout2020" -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-PhaseOut50" -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 - -# Subsidies / Prices -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 -cfg$gms$c60_bioenergy_subsidy <- 0 -cfg$gms$c60_price_implementation <- "exp" - -#beV <- c(0, 6, 8, 10, 12, 15, 25) -beV <- c(25) - -### GHG -cfg$gms$ghg_policy <- "MMEmu_feb23" -cfg$gms$s56_ghgprice_startprice <- 0 -cfg$gms$s56_ghgprice_endprice <- 0 - - -### Tau / Yield -cfg$gms$c14_yields_scenario <- "nocc_hist" -cfg$gms$tc <- "exo" - -### Biodiv -cfg$gms$c44_bii_decrease <- 0 - - -### Cropland -cfg$gms$s30_annual_max_growth <- 0.02 - - -us00_05 <- 1.1197 #src: https://data.worldbank.org/indicator/NY.GDP.DEFL.ZS?end=2005&locations=US&start=2000 - - -for (be in beV){ - cfg$gms$s60_bioenergy_gj_price_1st <- be * us00_05 - cfg$gms$s60_bioenergy_price_2nd <- be * us00_05 - - ############################################## - runflag <- "price-exp" - cfg$title <- paste0(str_pad(be, 2, pad = "0"), "G0000", runflag) - - start_run(cfg, codeCheck = FALSE) - - -} #GHG diff --git a/scripts/start/projects/MMEmu_tau.R b/scripts/start/projects/MMEmu_tau.R deleted file mode 100644 index a6032a922a..0000000000 --- a/scripts/start/projects/MMEmu_tau.R +++ /dev/null @@ -1,83 +0,0 @@ -# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Debug Setup -# position: 1 -# ---------------------------------------------------------- - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(lucode2) -library(magclass) -library(gms) -library(stringr) - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -# Source the default config and then over-write it before starting the run. -source("config/default.cfg") #nolinter - -cfg$qos <- "standby" - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) -cfg$input <- append(cfg$input, c(patch = "patch.tgz")) - -cfg$output <- c("output_check", "rds_report") -cfg$force_replace <- TRUE - -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets - -### Identifier and folder -############################################### -identifierFlag <- "Emulator_23-02-14_set-71" -############################################### -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") - -### BE -cfg$gms$bioenergy <- "MMEmu_feb23" -# non-default BE demands -cfg$gms$c60_1stgen_biodem <- "phaseout2020" -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-Npi-PhaseOut20" -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 - -# Subsidies / Prices -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 -cfg$gms$c60_bioenergy_subsidy <- 0 - -cfg$gms$s60_bioenergy_gj_price_1st <- 0 -cfg$gms$s60_bioenergy_price_2nd <- 0 - - -### GHG -cfg$gms$ghg_policy <- "MMEmu_feb23" -cfg$gms$s56_ghgprice_startprice <- 0 -cfg$gms$s56_ghgprice_endprice <- 0 - - -### Tau / Yield -cfg$gms$c14_yields_scenario <- "nocc_hist" - -### Biodiv -cfg$gms$c44_bii_decrease <- 0 - - -### Cropland -cfg$gms$s30_annual_max_growth <- 0.02 - - - -############################################## -cfg$title <- "B00G0000_tau" - -start_run(cfg, codeCheck = FALSE) diff --git a/scripts/start/projects/MP_BDprice.R b/scripts/start/projects/MP_BDprice.R deleted file mode 100644 index d1bcf0b460..0000000000 --- a/scripts/start/projects/MP_BDprice.R +++ /dev/null @@ -1,78 +0,0 @@ -# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator SCP Price Setup -# position: 1 -# ---------------------------------------------------------- - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(lucode2) -library(magclass) -library(gms) -library(stringr) - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -# Source the default config and then over-write it before starting the run. -source("config/mp_default.cfg") #nolinter - -cfg$force_replace <- FALSE -cfg$qos <- "standby" - -### Identifier and folder -############################################### -identifierFlag <- "SCP_23-11-28_BDPrice" -############################################### -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") - -### BE -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-NPi" - -### GHG -gV <- c(0, 1000) - -### Tau / Yield -cfg$gms$tc <- "exo" - -### Biodiv -cfg$gms$biodiversity <- "bv_btc_mar21" -bdV <- c(0, 3000, 6000) #BII lower bound (0-1), default 0 - -### Food -mpV <- c(0, 76) - - -for (bd in bdV) { - cfg$gms$s44_target_price <- bd - - for (mp in mpV) { - preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), "BD", str_pad(bd, 4, pad = "0")) - cfg$results_folder <- paste("output", identifierFlag, ":title:", sep = "/") - - if (mp != 0){ - cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) - } else { - cfg$gms$c15_rumdairy_scp_scen <- "constant" - } - - for (g in gV) { - g <- paste0("G", str_pad(g, 4, pad = "0")) - cfg$gms$c56_pollutant_prices <- paste0(g, "exp2110") - - ############################################## - cfg$title <- paste0(preflag, g) - - start_run(cfg, codeCheck = FALSE) - - } # GHG - } # MP replacement -} # BII lower bound diff --git a/scripts/start/projects/MP_tau.R b/scripts/start/projects/MP_tau.R deleted file mode 100644 index fe80b9069d..0000000000 --- a/scripts/start/projects/MP_tau.R +++ /dev/null @@ -1,43 +0,0 @@ -# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator SCP Tau Setup -# position: 1 -# ---------------------------------------------------------- - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(lucode2) -library(magclass) -library(gms) - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -source("config/mp_default.cfg") #nolinter - -cfg$force_replace <- FALSE -cfg$qos <- "priority" - -identifierFlag <- "SCP_23-11-27" - -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") - -cfg$gms$c44_bii_decrease <- 0 - -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 -cfg$gms$c60_bioenergy_subsidy <- 0 - -cfg$gms$c60_2ndgen_biodem <- "R21M42-SSP2-NPi" - -cfg$title <- "B00G0000_tau" - -#start MAgPIE run -start_run(cfg, codeCheck = FALSE) diff --git a/scripts/start/projects/mp_default.R b/scripts/start/projects/mp_default.R deleted file mode 100644 index cc5e8f76c5..0000000000 --- a/scripts/start/projects/mp_default.R +++ /dev/null @@ -1,17 +0,0 @@ -# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ------------------------------------------------ -# description: start run with mp_default.cfg settings -# position: 1 -# ------------------------------------------------ - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") - -#start MAgPIE run -start_run(cfg="mp_default.cfg") From e2dd24bdff50e6a404ae10b352225f39ec1428ea Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 28 Feb 2024 23:17:23 +0100 Subject: [PATCH 059/259] Rename and update GENIE start scripts --- config/scenario_config.csv | 1 + scripts/start/projects/GENIE_1_tau-export.R | 2 +- .../{MP_price.R => GENIE_2_bm-priced.R} | 31 +++- .../{MP_demand.R => GENIE_3_bm-demand.R} | 33 +++- scripts/start/projects/GENIE_4_feedback.R | 112 +++++++++++++ scripts/start/projects/MP_feedback.R | 150 ------------------ 6 files changed, 164 insertions(+), 165 deletions(-) rename scripts/start/projects/{MP_price.R => GENIE_2_bm-priced.R} (67%) rename scripts/start/projects/{MP_demand.R => GENIE_3_bm-demand.R} (69%) create mode 100644 scripts/start/projects/GENIE_4_feedback.R delete mode 100644 scripts/start/projects/MP_feedback.R diff --git a/config/scenario_config.csv b/config/scenario_config.csv index f1f907f356..7f9e875d11 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -91,3 +91,4 @@ gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MMEmu_feb23 +gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 diff --git a/scripts/start/projects/GENIE_1_tau-export.R b/scripts/start/projects/GENIE_1_tau-export.R index 4e77720ad1..407959ce8d 100644 --- a/scripts/start/projects/GENIE_1_tau-export.R +++ b/scripts/start/projects/GENIE_1_tau-export.R @@ -6,7 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: GENIE project MESSAGE-MAgPIE Emulator exo Tau export +# description: GENIE project MESSAGE-MAgPIE Emulator - Step 1: export tau # ---------------------------------------------------------- ###################################### diff --git a/scripts/start/projects/MP_price.R b/scripts/start/projects/GENIE_2_bm-priced.R similarity index 67% rename from scripts/start/projects/MP_price.R rename to scripts/start/projects/GENIE_2_bm-priced.R index 380cf9de2d..b67263fe23 100644 --- a/scripts/start/projects/MP_price.R +++ b/scripts/start/projects/GENIE_2_bm-priced.R @@ -6,8 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator SCP Price Setup -# position: 1 +# description: GENIE project MESSAGE-MAgPIE Emulator - Step 2: price-based biomass potential # ---------------------------------------------------------- ###################################### @@ -22,14 +21,30 @@ library(stringr) # Load start_run(cfg) function which is needed to start MAgPIE runs source("scripts/start_functions.R") #nolinter # Source the default config and then over-write it before starting the run. -source("config/mp_default.cfg") #nolinter +source("config/default.cfg") #nolinter + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + +cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", + cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.96_26df900e_validation.tgz", + additional = "additional_data_rev4.47.tgz", + patch = "MMEmuR12_rev4.96.tgz") + + +cfg$output <- c("output_check", "rds_report") + +preset <- "GENIE_SCP" +cfg <- setScenario(cfg, c(preset)) #load config presetswrite it before starting the run. cfg$force_replace <- FALSE cfg$qos <- "priority" ### Identifier and folder ############################################### -identifierFlag <- "SCP_23-11-27" +identifierFlag <- "SCP_24_02_29" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") @@ -47,17 +62,20 @@ cfg$gms$tc <- "exo" blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 ### Food -mpV <- c(0, 30, 50, 76) +mpV <- c(0, 25, 50, 75) for (bl in blV) { bd <- 0 + pa <- "BH" if (bl == 0) { bd <- 1 + pa <- "none" } cfg$gms$c44_bii_decrease <- bd cfg$gms$s44_bii_lower_bound <- bl + cfg$gms$c22_protect_scenario <- pa for (mp in mpV) { preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), "BI", str_pad(bl * 100, 2, pad = "0")) @@ -65,7 +83,8 @@ for (bl in blV) { cfg$info$flag2 <- preflag if (mp != 0){ - cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + m = 100 - mp + cfg$gms$c15_rumdairy_scp_scen <- paste0("sigmoid_", m, "pc_25_50") } else { cfg$gms$c15_rumdairy_scp_scen <- "constant" } diff --git a/scripts/start/projects/MP_demand.R b/scripts/start/projects/GENIE_3_bm-demand.R similarity index 69% rename from scripts/start/projects/MP_demand.R rename to scripts/start/projects/GENIE_3_bm-demand.R index f29675a011..678c25665f 100644 --- a/scripts/start/projects/MP_demand.R +++ b/scripts/start/projects/GENIE_3_bm-demand.R @@ -6,8 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator SCP Demand Setup -# position: 1 +# description: GENIE project MESSAGE-MAgPIE Emulator - Step 3: ghg price sensitivity for step 2 biomass demands # ---------------------------------------------------------- ###################################### @@ -22,14 +21,30 @@ library(stringr) # Load start_run(cfg) function which is needed to start MAgPIE runs source("scripts/start_functions.R") #nolinter # Source the default config and then over-write it before starting the run. -source("config/mp_default.cfg") #nolinter +source("config/default.cfg") #nolinter + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + +cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", + cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.96_26df900e_validation.tgz", + additional = "additional_data_rev4.47.tgz", + patch = "MMEmuR12_rev4.96.tgz") + + +cfg$output <- c("output_check", "extra/disaggregation", "rds_report") + +preset <- "GENIE_SCP" +cfg <- setScenario(cfg, c(preset)) #load config presetswrite it before starting the run. cfg$force_replace <- TRUE -cfg$qos <- "standby" +cfg$qos <- "standby_maxMem_dayMax" ### Identifier and folder ############################################### -identifierFlag <- "SCP_23-11-27" +identifierFlag <- "SCP_24_02_29" ############################################### cfg$info$flag <- identifierFlag cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") @@ -47,20 +62,23 @@ gV <- c(0, 10, 20, 50, 100, 200, 400, 600, 1000, 2000, 3000, 4000) blV <- c(0, 0.7, 0.74, 0.78) #BII lower bound (0-1), default 0 ### Food -pV <- c(0, 20, 50, 76) #0, 20, 50, 76 +mpV <- c(0, 25, 50, 75) ### Forest -cfg$gms$ s32_max_aff_cell_2025 <- 0.005 +cfg$gms$s32_max_aff_cell_2025 <- 0.005 for (bl in blV) { bd <- 0 + pa <- "BH" if (bl == 0) { bd <- 1 + pa <- "none" } cfg$gms$c44_bii_decrease <- bd cfg$gms$s44_bii_lower_bound <- bl + cfg$gms$c22_protect_scenario <- pa for (mp in mpV) { @@ -87,7 +105,6 @@ for (bl in blV) { g <- paste0("G", str_pad(g, 4, pad = "0")) - #cfg$gms$c56_pollutant_prices <- g cfg$gms$c56_pollutant_prices <- paste0(g, "exp2110") ############################################## diff --git a/scripts/start/projects/GENIE_4_feedback.R b/scripts/start/projects/GENIE_4_feedback.R new file mode 100644 index 0000000000..6a95f562e0 --- /dev/null +++ b/scripts/start/projects/GENIE_4_feedback.R @@ -0,0 +1,112 @@ +# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: GENIE project MESSAGE-MAgPIE Emulator - emulator feedback run +# ---------------------------------------------------------- + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(lucode2) +library(magclass) +library(gms) +library(stringr) + +# Load start_run(cfg) function which is needed to start MAgPIE runs +source("scripts/start_functions.R") #nolinter +# Source the default config and then over-write it before starting the run. +source("config/default.cfg") #nolinter + +cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, + "./patch_input" = NULL), + getOption("magpie_repos")) + +cfg$input <- c(regional = "rev4.96_26df900e_magpie.tgz", + cellular = "rev4.96_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.96_26df900e_validation.tgz", + additional = "additional_data_rev4.47.tgz", + patch = "MMEmuR12_rev4.96.tgz") + + +cfg$output <- c("output_check", "extra/disaggregation", "rds_report") + +preset <- "GENIE_SCP" +cfg <- setScenario(cfg, c(preset)) #load config presetswrite it before starting the run. + +cfg$force_replace <- FALSE + +### Identifier and folder +############################################### +identifierFlag <- "SCP_24_02_29" +############################################### +cfg$info$flag <- identifierFlag +cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") + + +### BE +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 +cfg$gms$c60_bioenergy_subsidy <- 0 + +### Tau / Yield +cfg$gms$tc <- "exo" + +### Biodiv +blV <- c(0) #BII lower bound (0-1), default 0 +#0, 0.7, 0.74, 0.78 + +### Food +mpV <- c(0) #0, 25, 50, 75 + + +for (bl in blV) { + bd <- 0 + pa <- "BH" + if (bl == 0) { + bd <- 1 + pa <- "none" + } + + cfg$gms$c44_bii_decrease <- bd + cfg$gms$s44_bii_lower_bound <- bl + cfg$gms$c22_protect_scenario <- pa + + for (mp in mpV) { + + if (mp != 0){ + m = 100 - mp + cfg$gms$c15_rumdairy_scp_scen <- paste0("sigmoid_", m, "pc_25_50") + } else { + cfg$gms$c15_rumdairy_scp_scen <- "constant" + } + + preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), + "BD", bd, "BI", str_pad(bl * 100, 2, pad = "0") + ) + cfg$results_folder <- paste( + # "output", identifierFlag, preflag, ":title:", sep = "/" + "output", identifierFlag, ":title:", sep = "/" + ) + + n <- "Feedback_step13_400f" + m <- n + cfg$gms$c60_2ndgen_biodem <- n + cfg$gms$c56_pollutant_prices <- m + + + ############################################## + #runflag <- paste("feedback", f_flag, sep = "_") + runflag <- paste0(m, "") + + cfg$title <- paste0(preflag, runflag) + + start_run(cfg, codeCheck = FALSE) + + + } # MP replacement +} # BII lower bound diff --git a/scripts/start/projects/MP_feedback.R b/scripts/start/projects/MP_feedback.R deleted file mode 100644 index b101a2eb0a..0000000000 --- a/scripts/start/projects/MP_feedback.R +++ /dev/null @@ -1,150 +0,0 @@ -# | (C) 2008-2021 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: MESSAGE-MAgPIE Emulator Demand-Driven -# position: 5 -# ---------------------------------------------------------- - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(lucode2) -library(magclass) -library(gms) -library(stringr) - -# Load start_run(cfg) function which is needed to start MAgPIE runs -source("scripts/start_functions.R") #nolinter -# Source the default config and then over-write it before starting the run. -source("config/default.cfg") #nolinter - -#cfg$qos <- "standby" -cfg$qos <- "priority" - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) - -#R11: a10a580c, R12: 26df900e -cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", - cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.87_26df900e_validation.tgz", - additional = "additional_data_rev4.43.tgz", - patch = "MMEmuR12_rev4.87.tgz") - -cfg$force_replace <- FALSE - -ssp <- "SSP2" -cfg <- setScenario(cfg, c(ssp)) #load config presets - -### Identifier and folder -############################################### -identifierFlag <- "SCP_23-10-11_set-36_exp2110" -f_flag <- "" -############################################### -cfg$info$flag <- identifierFlag -cfg$results_folder <- paste0("output/", identifierFlag, "/:title:") - -cfg$gms$c_timesteps <- "coup2110" - -### BE -cfg$gms$bioenergy <- "MMEmu_feb23" -# non-default BE demands -cfg$gms$c60_1stgen_biodem <- "phaseout2020" -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 0 - -# Subsidies / Prices -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 -cfg$gms$c60_bioenergy_subsidy <- 0 -cfg$gms$c60_price_implementation <- "lin" - -cfg$gms$s60_bioenergy_gj_price_1st <- 0 -cfg$gms$s60_bioenergy_price_2nd <- 0 - - -### GHG -cfg$gms$c56_mute_ghgprices_until <- "y2020" - - -### Tau / Yield -cfg$gms$c14_yields_scenario <- "nocc_hist" -cfg$gms$c13_tccost <- "high" #default: medium -cfg$gms$tc <- "exo" - - -### Biodiv -cfg$gms$biodiversity <- "bii_target" -blV <- c(0) #BII lower bound (0-1), default 0 -#0, 0.7, 0.74, 0.78 -cfg$gms$s44_cost_bii_missing <- 10 * 1000000 - - -### Cropland -cfg$gms$s30_annual_max_growth <- 0.02 -#cfg$gms$s30_annual_max_growth <- 0.5 - -### Foresty -cfg$gms$s56_c_price_induced_aff <- 1 -cfg$gms$s32_max_aff_cell_2025 <- 0.005 -# def = inf # 0.005 = globally 1Mha Aff allowed in 2025 #nolint - - -### Food -cfg$gms$food <- "anthropometrics_jan18" -cfg$gms$c20_scp_type <- "hydrogen" - -mpV <- c(0) #0, 20, 50, 76 - - -for (bl in blV) { - bd <- 0 - if (bl == 0) { - bd <- 1 - } - - cfg$gms$c44_bii_decrease <- bd - cfg$gms$s44_bii_lower_bound <- bl - - for (mp in mpV) { - - if (mp != 0){ - cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) - } else { - cfg$gms$c15_rumdairy_scp_scen <- "constant" - } - - preflag <- paste0("MP", str_pad(mp, 2, pad = "0"), - "BD", bd, "BI", str_pad(bl * 100, 2, pad = "0") - ) - cfg$results_folder <- paste( - # "output", identifierFlag, preflag, ":title:", sep = "/" - "output", identifierFlag, ":title:", sep = "/" - ) - - #n <- paste("Feedback", preflag, sep = "_") - n <- "Feedback_step13_400f" - m <- n - #cfg$gms$c60_2ndgen_biodem <- paste(n, f_flag, sep = "_") - cfg$gms$c60_2ndgen_biodem <- n - #cfg$gms$c56_pollutant_prices <- paste(n, f_flag, sep = "_") - cfg$gms$c56_pollutant_prices <- m - #cfg$gms$c56_pollutant_prices <- "Feedback_MP00BD1BI00_1000f_maxPrice" - - - ############################################## - #runflag <- paste("feedback", f_flag, sep = "_") - runflag <- paste0(m, "") - - cfg$title <- paste0(preflag, runflag) - - start_run(cfg, codeCheck = FALSE) - - - } # MP replacement -} # BII lower bound From 9bd070552eb326b0cdb7dbf3f3b30a59641920c7 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 29 Feb 2024 08:54:34 +0100 Subject: [PATCH 060/259] Fix typos --- config/scenario_config.csv | 8 ++++---- scripts/start/projects/GENIE_1_tau-export.R | 2 +- scripts/start/projects/GENIE_2_bm-priced.R | 2 +- scripts/start/projects/GENIE_3_bm-demand.R | 5 +++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 7f9e875d11..876e4d080d 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -50,15 +50,15 @@ gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max6 gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-Npi +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/scripts/start/projects/GENIE_1_tau-export.R b/scripts/start/projects/GENIE_1_tau-export.R index 407959ce8d..4859e78552 100644 --- a/scripts/start/projects/GENIE_1_tau-export.R +++ b/scripts/start/projects/GENIE_1_tau-export.R @@ -6,7 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: GENIE project MESSAGE-MAgPIE Emulator - Step 1: export tau +# description: GENIE project MESSAGE-MAgPIE Emulator - Step 1 - export tau # ---------------------------------------------------------- ###################################### diff --git a/scripts/start/projects/GENIE_2_bm-priced.R b/scripts/start/projects/GENIE_2_bm-priced.R index b67263fe23..a1988aa30f 100644 --- a/scripts/start/projects/GENIE_2_bm-priced.R +++ b/scripts/start/projects/GENIE_2_bm-priced.R @@ -6,7 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: GENIE project MESSAGE-MAgPIE Emulator - Step 2: price-based biomass potential +# description: GENIE project MESSAGE-MAgPIE Emulator - Step 2 - price-based biomass potential # ---------------------------------------------------------- ###################################### diff --git a/scripts/start/projects/GENIE_3_bm-demand.R b/scripts/start/projects/GENIE_3_bm-demand.R index 678c25665f..624e75c7be 100644 --- a/scripts/start/projects/GENIE_3_bm-demand.R +++ b/scripts/start/projects/GENIE_3_bm-demand.R @@ -6,7 +6,7 @@ # | Contact: magpie@pik-potsdam.de # ---------------------------------------------------------- -# description: GENIE project MESSAGE-MAgPIE Emulator - Step 3: ghg price sensitivity for step 2 biomass demands +# description: GENIE project MESSAGE-MAgPIE Emulator - Step 3 - ghg price sensitivity for step 2 biomass demands # ---------------------------------------------------------- ###################################### @@ -83,7 +83,8 @@ for (bl in blV) { for (mp in mpV) { if (mp != 0){ - cfg$gms$c15_rumdairy_scp_scen <- paste0("MP", str_pad(mp, 2, pad = "0")) + m = 100 - mp + cfg$gms$c15_rumdairy_scp_scen <- paste0("sigmoid_", m, "pc_25_50") } else { cfg$gms$c15_rumdairy_scp_scen <- "constant" } From 85434e609e9291962d322bb3236c9ca1ce4cc7b0 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Thu, 29 Feb 2024 13:38:25 +0100 Subject: [PATCH 061/259] manual merge --- config/scenario_config.csv | 192 +++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 94 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 67bb0f5668..61479ad064 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,94 +1,98 @@ -;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP -gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; -gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; -gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; -gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk -gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; -gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; -gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; -gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; -gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; -gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; -gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; -gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; -gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; -gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; -gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;;; -gms$c34_urban_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP1;SSP2;SSP1;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; -gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; -gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; -gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; -gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; -gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; -gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; -gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; -gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; -gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; -gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 -gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; -gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 -gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc -gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; -gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; -gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; -gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; -gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.96_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.96_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.96_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.96_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.96_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.96_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; -gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; -gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; -gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; -gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; -gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high -gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 -gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen -gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 -gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 -gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 -gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 -gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 -gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 +;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP +gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; +gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; +gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; +gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk +gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; +gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; +gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;3;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;healthy_BMI;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; +gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;FLX;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_roots;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;0;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_alc_scen;0.014;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; +gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; +gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; +gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; +gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;;; +gms$c34_urban_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP1;SSP2;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; +gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; +gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; +gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; +gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; +gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; +gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 +gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; +gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 +gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc +gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; +gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; +gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; +gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; +gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; +gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; +gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.99_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.99_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.99_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.99_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.99_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; +gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; +gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; +gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; +gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high +gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 +gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen +gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 +gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 +gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 +gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 +gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 +gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 From 034f5356ab2cd84e22c0e4d636b1bf428e296f9e Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 1 Mar 2024 17:19:27 +0100 Subject: [PATCH 062/259] Add cropland growth constraint to all realizations --- CHANGELOG.md | 8 + config/default.cfg | 21 +- config/mp_default.cfg | 2009 ----------------- modules/30_crop/endo_apr21/equations.gms | 1 + modules/30_crop/endo_apr21/presolve.gms | 1 + .../30_crop/penalty_apr22/declarations.gms | 4 + modules/30_crop/penalty_apr22/equations.gms | 5 + modules/30_crop/penalty_apr22/input.gms | 1 + modules/30_crop/penalty_apr22/postsolve.gms | 8 + modules/30_crop/penalty_apr22/presolve.gms | 7 + .../30_crop/rotation_apr22/declarations.gms | 6 +- modules/30_crop/rotation_apr22/equations.gms | 5 + modules/30_crop/rotation_apr22/input.gms | 1 + modules/30_crop/rotation_apr22/postsolve.gms | 8 + modules/30_crop/rotation_apr22/presolve.gms | 7 + 15 files changed, 74 insertions(+), 2018 deletions(-) delete mode 100644 config/mp_default.cfg diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a3b044ae..7c45ea23d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **56_ghg_policy_** added new trajectories for R32M46 - **60_bioenergy** added new trajectories for R32M46 - **scripts** added a new validation_cell.R output script that generates a pdf with the comparison of magpie land use and crop type outputs with LUH and MAPSPAM historical data at cellular resolution. +- **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` +- **default.cfg** added early afforestation constraint `cfg$gms$s32_max_aff_cell_2025` +- **default.cfg** added technical cost for missing BII increase `cfg$gms$s44_cost_bii_missing` +- **default.cfg** added settings for new price-driven bioenergy realization `1st2ndgen_priced_feb24`: `cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix`, `cfg$gms$c60_bioenergy_subsidy_fix_SSP2`, `s60_bioenergy_gj_price_1st`, +`s60_bioenergy_price_2nd`, `c60_price_implementation` +- **core** added `coup2110`timesteps +- **15_food** added additional sigmoid food substition scenarios `sigmoid_75pc_25_50`, `sigmoid_50pc_25_50` and `sigmoid_25pc_25_50` +- **30_crop** Add regional cropland equation `q30_crop_reg` and presolve growth constraint ### removed - **default.cfg** Removed description of cfg$gms$c31_past_suit_scen since no longer needed due to changes in 31_past described below. Its function is now done by cfg$gms$c31_grassl_yld_scenario. diff --git a/config/default.cfg b/config/default.cfg index f3b301a163..22bf626f13 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -719,7 +719,8 @@ cfg$gms$policy_countries30 <- all_iso_countries # * "secdforest, past, other" etc. cfg$gms$land_snv <- "secdforest, forestry, past, other" #def = "secdforest, forestry, past, other" -# * (s30_annual_max_growth): Additional cropland per year per region, relative to the current cropland level (e.g., 0.02 -> 10.4% allowed growth between 2020 and 2025, relative to 2020 cropland area) +# * Allowed annual cropland per year per region, relative to the current cropland level +# * e.g., 0.02: 2% annual growth, compounded to 10.4% growth for five-years timestep cfg$gms$s30_annual_max_growth <- Inf # def = Inf # ***--------------------- 31_past --------------------------------------- @@ -902,7 +903,7 @@ cfg$gms$c32_rot_calc_type <- "current_annual_increment" # * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 cfg$gms$c32_shock_scenario = "none" # def = "none" -# Prohibit rapid afforestation early on. +# Prohibit rapid afforestation early on. This is done on cluster-level to avoid a single region or cluster abusing low boundaries > 0 # * 0.005 = globally 1Mha Aff allowed in 2025 cfg$gms$s32_max_aff_cell_2025 <- Inf # def = inf @@ -1389,7 +1390,7 @@ cfg$gms$s56_cprice_red_factor <- 1 # def = 1 # * Note: For best consistency it is recommended to use trajectories from the most recent # * coupled REMIND-MAgPIE runs. Currently, this is R32M46. # * Available options: -# * none: no 2nd generation bioenergy demand +# * none: no 2nd generation bioenergy demand # * R32M46: Coupled REMIND-MAgPIE runs with REMIND 3.2.1.dev412 and MAgPIE 4.6.11 # * NPi: Current policies; limit peak warming to 3.0°C # * NDC: Nationally determined contributions; limit peak warming to 2.5°C @@ -1488,9 +1489,9 @@ cfg$gms$c56_cprice_aff <- "secdforest_vegc" # def = secdforest_vegc # * should not be higher than s32_planing_horizon cfg$gms$s56_c_price_exp_aff <- 50 # def = 50 -# * Share of carbon credits for re/afforestation projects set aside in a buffer to +# * Share of carbon credits for re/afforestation projects set aside in a buffer to # * account for potential failure of permanent carbon storage. -# * Alternatively, this parameter can be interpreted as a reduction factor +# * Alternatively, this parameter can be interpreted as a reduction factor # * of the carbon price for non-permanent CDR. # * Values > 0 will reduce the incentive for c-price-induced re/afforestation cfg$gms$s56_buffer_aff <- 0.5 # def = 0.5 @@ -1638,6 +1639,9 @@ cfg$gms$c59_exo_scen <- "constant" # * (1stgen_priced_dec18): exogenous and price-based 1st generation bioenergy # * demand, 2nd generation residues exogeneous, # * 2nd generation betr and begr coupled with REMIND. +# * (1st2ndgen_priced_feb24): exogenous and price-based 1st generation bioenergy +# * demand, 2nd generation residues exogeneous, +# * 2nd generation betr and begr exogenous and price-based cfg$gms$bioenergy <- "1stgen_priced_dec18" # def = 1stgen_priced_dec18 # * 1st generation bioenergy demand scenarios based on Lotze Campen (2014) @@ -1735,15 +1739,16 @@ cfg$gms$c60_biodem_level <- 1 # def = 1 # * Therefore, the minimum demand is of particular importance for the coupling with REMIND. cfg$gms$s60_2ndgen_bioenergy_dem_min <- 1 # def = 1 -# * Minimum demand can be set to 0 for price-driven runs past the SSP2_fix +# * Minimum demand can be set to 0 for price-driven runs past the SSP2_fix (1st2ndgen_priced_feb24 only) cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 # * first generation bioenergy subsidy (USD05MER per ton) -# * for GJ-based prices post fix_SSP2 only the fix_SSP2 should be > 0 +# * for GJ-based prices post fix_SSP2 only the fix_SSP2 should be > 0 (1st2ndgen_priced_feb24 only) +# * In 1stgen_priced_dec18, c60_bioenergy_subsidy is applied as constant value over the full time horizon cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 -# * For price-based bioenergy implementation (US05MER per GJ) +# * For 1st2ndgen_priced_feb24, target prices (US05MER per GJ) for 1st and 2nd gen bioenergy cfg$gms$s60_bioenergy_gj_price_1st <- 0 # def = 0 cfg$gms$s60_bioenergy_price_2nd <- 0 # def = 0 diff --git a/config/mp_default.cfg b/config/mp_default.cfg deleted file mode 100644 index 435d365a07..0000000000 --- a/config/mp_default.cfg +++ /dev/null @@ -1,2009 +0,0 @@ -# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -################## -#### SETTINGS #### -################## - -cfg <- list() - -#### Main settings #### - -# short description of the actual run -cfg$title <- "default-MMR12" - -# path to the submodel to be used relative to main model folder -cfg$model <- "main.gms" #def = "main.gms" - -#### input settings #### - -# which input data sets should be used? -cfg$input <- c(regional = "rev4.87_26df900e_magpie.tgz", - cellular = "rev4.87_26df900e_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.87_26df900e_validation.tgz", - additional = "additional_data_rev4.43.tgz", - patch = "MMEmuR12_rev4.87.tgz") - - -# NOTE: It is recommended to recalibrate the model when changing cellular input data -# as well as for any other setting that would affect initial values in the model, -# e.g. changes in costs structure, NPI policies, etc. - -#a list of repositories (please pay attention to the list format!) in which the -#files should be searched for. Files will be searched in all repositories until -#found, always starting with the first repository in the list. The argument must -#have the format of a named list with the url of the repository as name and a -#corresponding list of options such as username or password to access the -#repository as value. If no options are required the value has to be NULL. (e.g. -#list("ftp://my_pw_protected_server.de/data"=list(user="me",password=12345), -# "http://free_server.de/dat"=NULL)) -#Please add system or user specific repositories (such as repos with limited -#access for) through the R option "magpie_repos". Through the append command -#below it will get merged into cfg$repositories - -cfg$repositories <- append(list("https://rse.pik-potsdam.de/data/magpie/public" = NULL, - "./patch_input" = NULL), - getOption("magpie_repos")) - - - -# Should input data be downloaded from source even if cfg$input did not change? -cfg$force_download <- FALSE - -# Should an existing output folder be replaced if a new run with the same name is started? -cfg$force_replace <- FALSE - -# Settings for the yield calibration -# For this yield calibration (that uses results from a special MAgPIE calibration run -# triggered by the recalibrate switch) to be activated the switch s14_use_yield_calib needs -# to be turned on. (Default is off) -# This switch should only be activated for penalty_apr22 crop realization. -# For other realizations, it is recommended not to use this yield calibration. -# -# Switch to turn on/off recalibration of yields. -# * (TRUE): Yield calibration will be performed -# * (ifneeded): Yield calibration will only be executed if input data is -# * downloaded from repository -# * (FALSE): Yield calibration will not be performed -cfg$recalibrate <- FALSE # def = FALSE -# Up to which accuracy shall be recalibrated? -cfg$calib_accuracy <- 0.05 # def = 0.05 -# What is the maximum number of iterations if the precision goal is not reached? -cfg$calib_maxiter <- 20 # def = 20 -# Factor determining how much the divergence infuences the new -# calibration factor in each calibration iteration (0-1) -cfg$damping_factor <- 0.96 # def= 0.96 -# switch on/of calibration of cropland (pasture will be left untouched) -cfg$calib_cropland <- TRUE # def= TRUE -# set upper limit for cropland calibration factor -cfg$crop_calib_max <- 1.5 # def= 1.5 -# Selection type of calibration factors. -# If FALSE, calibration factors from the last iteration are used. -# If TRUE, calibration factors from the iteration with the lowest divergence are used. -cfg$best_calib <- TRUE # def = TRUE - -# Settings for land conversion cost calibration (cropland) -# The calibration routine derives regional calibration factors for -# costs of cropland expansion and rewards for cropland reduction, -# with the goal to match historical regional cropland in 2015. -# * (TRUE): Land conversion cost calibration will be performed -# * (ifneeded): Land conversion cost calibration will only be executed if the input file "f39_calib.csv" is missing -# * (FALSE): Land conversion cost calibration will not be performed -cfg$recalibrate_landconversion_cost <- "ifneeded" #def "ifneeded" -# Up to which accuracy shall be recalibrated? -cfg$calib_accuracy_landconversion_cost <- 0.05 # def = 0.05 -# What is the maximum number of iterations if the precision goal is not reached? -cfg$calib_maxiter_landconversion_cost <- 40 # def = 40 -# Restart from existing calibration factors (TRUE or FALSE) -cfg$restart_landconversion_cost <- FALSE # def = FALSE -# Factor determining how much the divergence infuences the new -# calibration factor in each calibration iteration (0-1) -cfg$damping_factor_landconversion_cost <- 0.96 # def= 0.96 -# Set upper limit for cropland calibration factor -cfg$cost_calib_max_landconversion_cost <- 3 # def= 3 -# Set lower limit for cropland calibration factor -cfg$cost_calib_min_landconversion_cost <- 0.05 # def= 0.05 -# Selection type of calibration factors. -# If FALSE, calibration factors from the last iteration are used. -# If TRUE, calibration factors from the iteration with the lowest divergence are used. -cfg$best_calib_landconversion_cost <- FALSE # def = FALSE - -# Settings for NPI/NDC recalculation -# * (TRUE): NPI/NDC recalculation will be performed -# * (ifneeded): NPI/NDC recalculation will only be executed if current input files are zero -# * and policy switches (c32_aff_pol, c35_ad_pol) are set to "npi" or "ndc". -# * If policy switches are set to "none" (default) NPI/NDC recalculation will not be performed -# * (FALSE): NPI/NDC recalculation will not be performed -cfg$recalc_npi_ndc <- "ifneeded" # def = ifneeded -# * which national or subnational mappinng should be used -# * (iso): policies on the national levels -# * (bra): includes subnational policies for Brazil -cfg$policyregions <- "bra" # def = "bra" - -#### magpie.gms settings #### -cfg$gms <- list() - -# Set number of time steps (1-16) or type "less_TS" for remind time steps -cfg$gms$c_timesteps <- "coup2110" - -# historic time steps -cfg$gms$c_past <- "till_2010" - -# use of gdx files -cfg$gms$s_use_gdx <- 0 # def = 0 -#* 0: gdx will not be loaded -#* 1: gdx is loaded in the first time step -#* 2: gdx is loaded in all time steps - -# **---------------------------------------------------------------------------- -# *** MODULES -# ***--------------------------------------------------------------------------- - -#### Useful shortcuts #### -# Vector of all iso countries (used for regional policy implementations) -all_iso_countries <- "ABW,AFG,AGO,AIA,ALA,ALB,AND,ARE,ARG,ARM, - ASM,ATA,ATF,ATG,AUS,AUT,AZE,BDI,BEL,BEN, - BES,BFA,BGD,BGR,BHR,BHS,BIH,BLM,BLR,BLZ, - BMU,BOL,BRA,BRB,BRN,BTN,BVT,BWA,CAF,CAN, - CCK,CHN,CHE,CHL,CIV,CMR,COD,COG,COK,COL, - COM,CPV,CRI,CUB,CUW,CXR,CYM,CYP,CZE,DEU, - DJI,DMA,DNK,DOM,DZA,ECU,EGY,ERI,ESH,ESP, - EST,ETH,FIN,FJI,FLK,FRA,FRO,FSM,GAB,GBR, - GEO,GGY,GHA,GIB,GIN,GLP,GMB,GNB,GNQ,GRC, - GRD,GRL,GTM,GUF,GUM,GUY,HKG,HMD,HND,HRV, - HTI,HUN,IDN,IMN,IND,IOT,IRL,IRN,IRQ,ISL, - ISR,ITA,JAM,JEY,JOR,JPN,KAZ,KEN,KGZ,KHM, - KIR,KNA,KOR,KWT,LAO,LBN,LBR,LBY,LCA,LIE, - LKA,LSO,LTU,LUX,LVA,MAC,MAF,MAR,MCO,MDA, - MDG,MDV,MEX,MHL,MKD,MLI,MLT,MMR,MNE,MNG, - MNP,MOZ,MRT,MSR,MTQ,MUS,MWI,MYS,MYT,NAM, - NCL,NER,NFK,NGA,NIC,NIU,NLD,NOR,NPL,NRU, - NZL,OMN,PAK,PAN,PCN,PER,PHL,PLW,PNG,POL, - PRI,PRK,PRT,PRY,PSE,PYF,QAT,REU,ROU,RUS, - RWA,SAU,SDN,SEN,SGP,SGS,SHN,SJM,SLB,SLE, - SLV,SMR,SOM,SPM,SRB,SSD,STP,SUR,SVK,SVN, - SWE,SWZ,SXM,SYC,SYR,TCA,TCD,TGO,THA,TJK, - TKL,TKM,TLS,TON,TTO,TUN,TUR,TUV,TWN,TZA, - UGA,UKR,UMI,URY,USA,UZB,VAT,VCT,VEN,VGB, - VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE" - -# * Based on https://tntcat.iiasa.ac.at/SspDb/dsd?Action=htmlpage&page=10#regiondefs -oecd90andEU <- "ALB,AUS,AUT,BEL,BIH,BGR,CAN,CYP,CZE,DNK,EST,FIN,FRA, - DEU,GRC,HUN,HRV,ISL,IRL,ITA,JPN,LUX,LVA,LTU,MLT,MNE, - NLD,NOR,NZL,POL,PRT,ROU,SRB,SVK,SVN,ESP,SWE,CHE,MKD,TUR, - GBR,USA" - -# ***--------------------- 09_drivers ---------------------------------------- -# * (aug17): default drivers -cfg$gms$drivers <- "aug17" # def = aug17 -cfg$gms$c09_pop_scenario <- "SSP2" # def = SSP2 -cfg$gms$c09_gdp_scenario <- "SSP2" # def = SSP2 -# * options: SSP: "SSP1", "SSP2", "SSP2EU", "SSP3", "SSP4", "SSP5" -# * SDP: "SDP", "SDP_EI", "SDP_MC", "SDP_RC" -# * Note: SSP2EU a European Commission population/income scenario for -# * Ariadne project. SDP is same as SSP1 income, while SDP_EI, SDP_RC, SDP_MC -# * see different GDP trajectories as described in SHAPE project. - -# * Physical activity level scenario: -cfg$gms$c09_pal_scenario <- "SSP2" # def = SSP2 -# * options: SSP: "SSP1", "SSP2", "SSP2EU", "SSP3", "SSP4", "SSP5" -# * SDP: "SDP", "SDP_EI", "SDP_MC", "SDP_RC" - -# Year until which all parameters are fixed to SSP2 values -cfg$gms$sm_fix_SSP2 <- 2020 - -# Year until which all parameters affected by climate change are fixed to historical values -cfg$gms$sm_fix_cc <- 2020 - -# ***--------------------- 10_land ---------------------------------------- -# * (feb15): default land realization -# * (landmatrix_dec18): includes a land transition matrix -cfg$gms$land <- "landmatrix_dec18" # def = landmatrix_dec18 - -# * Artificial cost for balance variables (USD05MER per ha) -# * The balance variables in the land module avoid infeasibilities due to -# * differences in accuracy between parameters and variables in GAMS. -# * High costs make sure that the balance variables are only used as a last resort. -cfg$gms$s10_cost_balance <- 1000000 # def = 1000000 - - -# ***--------------------- 11_costs ------ -------------------------------- -# * (default): default cost realization -cfg$gms$costs <- "default" # def = default - -# ***--------------------- 12_interest_rate --------------------------------- -# * (select_apr20): regional interest rates dependent on development state -cfg$gms$interest_rate <- "select_apr20" # def = select_apr20 - -# * Interest rate scenario: -# * Options: coupling (exogenous interest rate) -# * gdp_dependent (regional interest rate dependent on development state) -# * Note: Currently, coupling is included as an option of an exogenous interest -# * rate scenario. It is currently not part of coupled runs with REMIND. -# * Note: In the gdp_dependent scenario, the selected interest rate fully takes -# * effect in 2050. It slowly starts fading in by 2025. -cfg$gms$c12_interest_rate <- "gdp_dependent" # def = "gdp_dependent" - -# * Interest rate coefficients: -# * The coefficients determine the regionally specific interest rate. They do -# * not represent the value of the interest rate. -# * The s12_interest_lic coefficient determines the intercept for future interest -# * rate determination. It represents the interest rate in low income countries. -cfg$gms$s12_interest_lic <- "0.1" # def = 0.1 -# * The s12_interest_hic determines the speed of interest rate adjustment for -# * future interest rates. It represents the interest rate in high income countries. -cfg$gms$s12_interest_hic <- "0.04" # def = 0.04 -# * Analog logic applies to historic interest rate coefficients -cfg$gms$s12_hist_interest_lic <- "0.1" # def = 0.1 -cfg$gms$s12_hist_interest_hic <- "0.04" # def = 0.04 -# * Note: It is also possible to choose a global interest rate by setting the -# * upper (s12_interest_lic) and the lower (s12_interest_hic) bound equal -# * This was formerly used for SSP runs and was set to SSP1, SSP5: 0.07 (hist), -# * 0.04 (future), SSP2: 0.07 (hist, future), SSP3: 0.07 (hist), 0.1 (future), -# * SSP4: s12_interest_lic=0.1, s12_interest_hic=0.04, s12_hist_interest_lic=0.07, -# * s12_hist_interest_hic=0.07 - -# * Regional interest rate policy scenario switch -# * Options: list of iso-codes of countries where above selected coefficients -# * should be in effect. -# * In all other countries, alternative coefficients (s12_interest_lic_noselect, s12_interest_hic_noselect, -# * s12_hist_interest_lic_noselect, s12_hist_interest_hic_noselect) that can be selected below -# * are in effect. -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -cfg$gms$select_countries12 <- all_iso_countries # def = all_iso_countries - -# * Interest rate coefficients for non-selected countries: -cfg$gms$s12_interest_lic_noselect <- "0.1" # def = 0.1 -cfg$gms$s12_interest_hic_noselect <- "0.04" # def = 0.04 -cfg$gms$s12_hist_interest_lic_noselect <- "0.1" # def = 0.1 -cfg$gms$s12_hist_interest_hic_noselect <- "0.04" # def = 0.04 - - -# ***--------------------- 13_tc ----------------------------------------- -# * (endo_jan22): endogenous technological change with full cost accounting and -# * stepwise updated crop and managed pastures area information -# * (exo): exogenous technological change (removes non-linearities from the model); -# * requires an existing model run with endo tc for generating the input file -# * f13_tau_scenario.csv -cfg$gms$tc <- "endo_jan22" # def = endo_jan22 - -# * tc cost scenario crops: low, medium or high -cfg$gms$c13_tccost <- "high" # def = medium - -# * ignore historical tau (1) or use it as lower bound (0) -cfg$gms$s13_ignore_tau_historical <- 1 # def = 1 - -# * Maximum regional tech cost expressed as share of regional GDP -# * A meaningful value would be 0.002. However, this bound causes infeasibilities in some cases. -# * Therefore, this bound is not used in the current model version. -cfg$gms$s13_max_gdp_shr <- Inf # def = Inf - - -# ***--------------------- 14_yield -------------------------------------- -# * (managementcalib_aug19): calibrate potential LPJmL-yields to FAO regional numbers, -# * pasture yields increase based on exogenous demand-side proxy -# * for growth rate of cattle stocks -cfg$gms$yields <- "managementcalib_aug19" # def = managementcalib_aug19 - -# * yield scenario -# * options: cc (climate change) -# * nocc (no climate change) -# * nocc_hist (no climate change after year defined by sm_fix_cc) -cfg$gms$c14_yields_scenario <- "nocc" # def = "cc" - -# * switch determing the effectivity of translating crop tc into pasture yield -# * increase. Value has to be in the range of 0 (no pasture yield growth) -# * and 1 (pasture yields increase linearily with tau). Only used in the realizations: -# * biocorrect (tc of current time step) and managementcalib (tc of previous time step). -cfg$gms$s14_yld_past_switch <- 0.25 # def = 0.25 - -# * Switch that allows selecting how yield calibration factors will be calculated. -# * If 0, crop yields calibration will be calculated as multiplicative relative values. -# * If 1, calibration values will be limited to additive absolute values when modeled yields strongly -# * underestimate historical values. For more information, read the description on the 'preloop' -# * file of module 14_yield. -# * options: 1 (limit to absolute values) -# * 0 (pure relative calibration) -cfg$gms$s14_limit_calib <- 1 # def = 1 - -# * Switch on scaling of irrigated yields to AQUASTAT irrigated-to-rainfed yield -# * ratio on regional scale -# NOTE: It is recommended to recalibrate the model when changing this setting! -cfg$gms$s14_calib_ir2rf <- 1 # def = 1 - -# * Switch to include yield impacts of land degradation. -# * The state of yield-relevant nature's contributions to people (NCP) -# * is reported through ./modules/14_yields/input/f14_yld_ncp_report.cs3 -# * based on estimated outcomes for soil loss or pollination sufficiency -# * per cluster from an existing model run. -# * options: 1 (yields are reduced based on yield reduction coefficients) -# * 0 (land degradation is switched off) -cfg$gms$s14_degradation <- 0 # def = 0 - -# Switch to toggle the use of yield calibration factors (that resulted from a calibration run). -# If 0, no yield calibration factors are used, meaning all calibration factors are set to 1. -# If 1, yield calibration factors are used. (For this option to function, either an existing calibration file -# must be supplied in the input directory, or yields must be recalibrated during preprocessing.) -# This switch should only be activated for penalty_apr22 crop realization. -# For other realizations, it is recommended not to use this yield calibration. -cfg$gms$s14_use_yield_calib <- 0 # def = 0 - -# ***--------------------- 15_food --------------------------------------- -# * (anthropometrics_jan18): estimates food using scenario dependent regression -# * and demography drivers -# * (anthro_iso_jun22): estimates food using scenario dependent regression -# * and demography drivers on iso level -cfg$gms$food <- "anthropometrics_jan18" # def = anthro_iso_jun22 - -# * switch between exogenous and endogenous food demand -# * options: 0 (exogenous food demand) and 1 (endogenous food demand) -cfg$gms$s15_elastic_demand <- 0 # def =0 - -# * maximal number of iterations between food and magpie model before -# * simulation proceeds to next time step -cfg$gms$s15_maxiter <- 5 # def = 5 - -# * convergence criteria: maximal allowed country-wise deviation in calculated -# * real income between iterations -cfg$gms$s15_convergence <- 0.005 # def = 0.005 - -# * food scenario for selected (and respectively not selected) countries -# * in scen_countries15 -# * options: SSP: "SSP1", "SSP2", "SSP3", "SSP4", "SSP5" -# * SRES: "A1", "A2", "B1", "B2" -# * OTHER: "PB" (planetary boundaries) -cfg$gms$c15_food_scenario <- "SSP2" # def = SSP2 -cfg$gms$c15_food_scenario_noselect <- "SSP2" # def = SSP2 - -# * Temporal development of ruminant meat share within the livestock food product -# * group (applied before food demand model is executed) -# * options: constant, halving2050, mixed -cfg$gms$c15_rum_share <- "mixed" # def = mixed - -# * Stronger ruminant fadeout in India -# * options: 0 (=off), 1 (=on) -cfg$gms$s15_rum_share_fadeout_india_strong <- 1 # def = 1 - -# * Milk share fadeout in India within the livestock food product -# * group (applied before food demand model is executed) -# * options: 0 (=off), 1 (=on) -cfg$gms$s15_milk_share_fadeout_india <- 1 # def = 1 - -# * Food substitution scenarios including functional forms, targets -# * and transition periods (applied after food demand model is executed) -# * options consist of 3 parts: functional form (lin,sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050) -# * Example for sigmoid_50pc_20_50: -# * Functional form: sigmoid (S-shaped) -# * Target: 50percent reduction at end of transition period (2050 in this case) -# * Transition period: start in 2020, end in 2050 -# * options: constant, -# * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, -# * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, -# * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 -cfg$gms$c15_rumscen <- "constant" # def = constant -cfg$gms$c15_fishscen <- "constant" # def = constant -cfg$gms$c15_alcscen <- "constant" # def = constant -cfg$gms$c15_livescen <- "constant" # def = constant -cfg$gms$c15_rumdairy_scp_scen <- "constant" # def = constant -cfg$gms$c15_rumdairyscen <- "constant" # def = constant - -# * Set items of kfo_rd. This option allows for sensitivity scenarios. -# * kfo_rd is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen (see above) -# * options: "livst_rum,livst_milk", "livst_rum" or "livst_milk" -cfg$gms$kfo_rd <- "livst_rum" #def = livst_rum - -# * Reduction of livestock products towards a kcal/cap/day intake target with or w/o substitution -# * maximum kcal/cap/day intake target used for downwards convergence of livestock products -cfg$gms$s15_kcal_pc_livestock_intake_target <- "430" # def = 430 -# * choice temporal fade-out towards s15_kcal_pc_livestock_intake_target -# * options: constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70 -cfg$gms$c15_livescen_target <- "constant" # def = constant -# * fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) -# * options: 0 (=fade-out), 1 (=substitution) -cfg$gms$s15_livescen_target_subst <- 1 # def = 1 - - -# ***** Start configuration of exogenous food intake and waste scenarios ***** -# -# -# * switch for transition to food waste scenarios -# * (1): transition towards exogenous food waste target -# * (0): regression-based estimation of food waste -cfg$gms$s15_exo_waste <- 0 # def = 0 -# -# * scenario target for the ratio between food demand and intake -# * only activated if s15_exo_waste is set to 1 -# * options: scalars >1 -# * (1.1): corresponds to 10% food waste ~ quarter waste of HIC -# * (1.2): corresponds to 20% food waste ~ half waste of HIC -cfg$gms$s15_waste_scen <- 1.2 # def = 1.2 - -# * switch for transition to exogenous diet scenarios (EAT Lancet and National Institute of Nutrition (NIN)) -# * (2): transition towards exogenous diets (NIN for India and EAT for other regions) -# * Please use this switch in combination with cfg$gms$c15_EAT_scen <- "FLX_hmilk" -# * If only India's diet needs to be changed, then set cfg$gms$scen_countries15 <- "IND" -# * (1): transition towards exogenous diets and food demand -# * (0): regression-based estimation of diets and food demand -cfg$gms$s15_exo_diet <- 0 # def = 0 - -# * exogenous calorie scenario (EAT Lancet diet scenarios) -# * only activated if s15_exo_diet is set to 1 -# * options: healthy_BMI, 2100kcal, 2500kcal, -# * endo, no_underweight, no_overweight -# * half_overweight, no_underweight_half_overweight -# * healthy_BMI: all people have a BMI of 20-25 -# * no_underweight: all people with BMI<20 have a BMI 20-25 -# * no_overweight: all people with BMI>25 have a BMI 20-25 -# * half_overweight: number of people with BMI>25 is halved compared to baseline (have BMI 20-25 instead) -# * no_underweight_half_overweight: combination of no_underweight and half_overweight -# * endo: no changes with respect to endogenous BMI -# * 2100kcal, 2500kcal: an exogenous target of 2100 or 2500 kcal, all -# * people have a BMI 20-25. -cfg$gms$c15_kcal_scen <- "healthy_BMI" # def = healthy_BMI -# -# * exogenous food-specific diet scenario (EAT Lancet diet scenarios) -# * only activated if s15_exo_diet is set to 1 -# * options: BMK, FLX, PSC, VEG, VGN, FLX_hmilk, FLX_hredmeat -cfg$gms$c15_EAT_scen <- "FLX" # def = FLX - -# * Subspecifications: Which commodities shall be included in the diet shift -# * towards cfg$gms$c15_EAT_scen ? Only selected (1) commodities will be -# * included, while the others will remain to be endogenous. -# * Any shift will be compensated to reach the calorie target by adjusting -# * staple calories. -cfg$gms$s15_exo_monogastric <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_ruminant <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_fish <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_fruitvegnut <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_pulses <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_sugar <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_oils <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_brans <- 1 # def = 1, options: 0,1 -cfg$gms$s15_exo_scp <- 1 # def = 1, options: 0,1 - -# * Scenario target for the inclusion of alcohol in the EAT-Lancet diet -# * The EAT-Lancet diet only allows for added sugars, but does not include processed food or -# * alcohol. -# * only activated if s15_exo_diet is set to 1 -cfg$gms$s15_exo_alcohol <- 1 # default: 1 -# * Via 's15_alc_scen' a maximum target for alcohol consumption can be defined. -# * (0): no alcohol consumption, as in the original version of the EAT-Lancet diet -# * (0.014): maximum target for alcohol consumption is 1.4% of total calorie consumption -# * (see Lassen et al., 2020) -cfg$gms$s15_alc_scen <- 0.014 # def = 0.014 -# -# -# * Switch and specification of countries for which exogenous food scenarios -# * (EAT Lancet diet and food waste scenarios), food substitution scenarios and -# * c15_food_scenario shall be applied -# * Options: list of iso-codes of countries where exogenous scenario should be -# * in effect -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -cfg$gms$scen_countries15 <- all_iso_countries -# -# * Transition to exogenous food intake and waste scenarios including functional forms, targets -# * and transition periods (applied after the food demand model is executed). The resulting scenario -# * parametrisation is a linear combination of the default MAgPIE parametrisation and the exogenous -# * scenario data input. -# * Options consist of 3 parts: functional form (lin, sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc; -# * pc: percent) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050). -# * The target defines the relative contribution of the default MAgPIE parametrisation, e.g. zero -# * defines a full transition to the exogenous scenario data input. -# * Examples with target year y2030: lin_zero_20_30 -# * Examples with target year y2050: lin_zero_20_50 -# * Examples with target year y2070: lin_zero_20_70 -# * For the full list of available options, see information on food substitution scenarios above. -# * Only active if at least one of the exogenous food intake and waste scenario -# * switches (s15_exo_diet and s15_exo_waste) is set to 1. -cfg$gms$c15_exo_foodscen <- "lin_zero_20_50" # def = lin_zero_20_50 -# ***** End configuration of exogenous food intake and waste scenarios ***** - - -# * calibration to historical values -# * options: 0, 1 -cfg$gms$s15_calibrate <- 1 # def = 1 - - -# ***--------------------- 16_demand ------------------------------------- -# * (sector_may15): default for flexible regions -cfg$gms$demand <- "sector_may15" # def = sector_may15 - -# ***--------------------- 17_production --------------------------------- -# * (flexreg_apr16): default production aggregation -cfg$gms$production <- "flexreg_apr16" # def = flexreg_apr16 - -#* Additional switch to initialize cellular production -# * (on) : it initializes cellular production -# * (off) : it does not initialize cellular production -cfg$gms$c17_prod_init <- "on" # default = on - -# ***--------------------- 18_residues ----------------------------------- -# * (flexreg_apr16): detailed residue calculations -# * (off): off -cfg$gms$residues <- "flexreg_apr16" # def = flexreg_apr16 - -# * residue on field burning -# * options: phaseout - phaseout of residue burning to minimum burn share (0-10%) -# * constant - constant shares of on field burning (15-25%) -cfg$gms$c18_burn_scen <- "phaseout" # def = phaseout - - -# ***--------------------- 20_processing --------------------------------- -# * (substitution_may21) : processing with couple products allowing for substitution -# * (off): off -cfg$gms$processing <- "substitution_may21" # def = substitution_may21 - - -# * SCP route -# * single-cell microbial protein production route -# * options: mixed, methane, sugar, cellulose, hydrogen -# * Mapping of scp route to feedstock: methane:foddr, sugar:sugar_cane, cellulose:begr -# * Note that hydrogen does not require land-based inputs -# * Mixed assumes equal shares of methane, sugar, cellulose and hydrogen -cfg$gms$c20_scp_type <- "hydrogen" # def = sugar - -# ***--------------------- 21_trade -------------------------------------- -# * (free_apr16): free trade without restrictions -# * (off): no trade at all -# * (exo): exogenously prescribed trade -# * (selfsuff_reduced): self-sufficiency based trade with trade costs related -# * to exports -cfg$gms$trade <- "selfsuff_reduced" # def = selfsuff_reduced - -# * trade balance reduction scenario -# * (l909090r808080): 10 percent trade liberalisation for secondary and -# * livestock products in 2030,2050,2100 and 20 percent for -# * crops -# * (l908080r807070): livestock/secondary: 10% in 2030, 20% in 2050,2100 -# * crops: 20% in 2030, 30% in 2050,2100 -# * (l909595r809090): livestock/secondary: 10% in 2030, 5% in 2050,2100 -# * crops: 20% in 2030, 10% in 2050,2100 -# * Initial values for the trade balance reduction in 1995 are 1, i.e. all trade in -# * 1995 happens through the self-sufficiency pool. For later time steps, additional -# * scenarios of trade liberalization (i.e. of allocation to the comparative advantage pool) -# * are implemented based on Schmitz et al. 2012 (also described in Popp et al. 2017) - -cfg$gms$c21_trade_liberalization <- "l909090r808080" # def = l909090r808080 - -# * whether trade tariff should be considered at all -# * (0) without trade tariff -# * (1) with trade tariff -cfg$gms$s21_trade_tariff <- 1 # def =1 - -# * whether to fade out trade tariffs (bilateral trade realization) # def = 0 -cfg$gms$s21_trade_tariff_fadeout <- 0 - -# * start year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2020 -cfg$gms$s21_trade_tariff_startyear <- 2020 - -# * end year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2050 -cfg$gms$s21_trade_tariff_targetyear <- 2050 - -# ***--------------------- 22_land_conservation -------------------------------------- -# * (area_based_apr22): Area-based conservation (baseline and future) -# * based on WDPA and conservation priority areas -cfg$gms$land_conservation <- "area_based_apr22" # def = area_based_apr22 - -# * Additional land conservation target based on conservation priority areas -# * during future time steps (after `cfg$gms$sm_fix_SSP2`). -# * ("none") No additional land conservation target (WDPA only) -# * ("30by30") 30 % of global land surface in Key Biodiversity Areas (KBA), -# * GSN Distinct Species Assemblages & Critical Connectivity Areas + WDPA -# * ("KBA") Key Biodiversity Areas + WDPA -# * ("GSN_DSA") Global Safety Net: Distinct Species Assemblages + WDPA -# * ("GSN_RarePhen") Global Safety Net: Rare Phenomena + WDPA -# * ("GSN_AreaIntct") Global Safety Net: Areas of Intactness + WDPA -# * ("GSN_ClimTier1") Global Safety Net: Climate Stabilisation Tier 1 + WDPA -# * ("GSN_ClimTier2") Global Safety Net: Climate Stabilisation Tier 2 + WDPA -# * ("CCA") Critical Connectivity Areas (Brennan et al. 2022) + WDPA -# * ("IrrC_XXpc") Land area that covers XX percent of total global irrecoverable carbon -# * as defined by Noon et al. (2022), where XX correponds to either -# * 50, 75, 95, or 99 percent + WDPA -# * ("IrrC_XXpc_30by30") 30by30 + Land area that covers XX percent of total global irrecoverable -# * carbon as defined by Noon et al. (2022), where XX correponds to either -# * 50, 75, 95, or 99 percent + WDPA -# * ("BH") Biodiversity Hotspots + WDPA -# * ("IFL") Intact Forest Landscapes + WDPA -# * ("BH_IFL") Biodiversity Hotspots + Intact Forest Landscapes + WDPA -# * ("GSN_HalfEarth") Full protection of areas within the Global Safety Net, which -# * roughly corresponds to 50 percent of the global land surface -# * ("PBL_HalfEarth") Ecoregion-based approach to protecting half of the global land surface -# * Note: c22_protect_scenario applies to countries selected in policy_countries22 -# * c22_protect_scenario_noselect applies to all other countries. -cfg$gms$c22_protect_scenario <- "none" # def = None -cfg$gms$c22_protect_scenario_noselect <- "none" # def = None -# * Switch and specification of countries for which land conservation policies in -# * c22_protect_scenario apply. -# * Options: list of iso-codes of countries where land conservation should be applied -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -cfg$gms$policy_countries22 <- all_iso_countries - -# * Whether land restoration is carried out in areas targeted by land conservation -# * (1) Land is fully restored in conservation priority areas -# * (0) Only remaining forest and other land areas are conserved -cfg$gms$s22_restore_land <- 1 # def = 1 - -# * Start and target year of land conservation option ('c22_protect_scenario'). -# * Defines when full protection based on 'future options' is reached, using a -# * sigmoidal trajectory. NOTE: This switch is only relevant -# * if one of the 'future options' (e.g. BH) is chosen. -# * Start year: -cfg$gms$s22_conservation_start <- 2020 # def = 2020 -# * Target year (year when full protection is reached): -cfg$gms$s22_conservation_target <- 2030 # def = 2030 - -# ***--------------------- 29_ageclass ----------------------------------- -# * (feb21): Distribution of age-classes according to Poulter et al 2018 -cfg$gms$ageclass <- "feb21" # def = feb21 - -# ***--------------------- 30_crop --------------------------------------- -# * (endo_apr21): Hard rotational constraints. Dynamic cropland and detailed cropland availability data at grid cell level. -# * (rotation_apr22): hard rotational constraints and fallow constraints with the option of different future scenarios. Dynamic cropland and detailed cropland availability data at grid cell level. -# * (penalty_apr22): rotational and fallow constraints are incentivized via penalty payments. Dynamic cropland and detailed cropland availability data at grid cell level. -# NOTE: It is recommended to recalibrate the model when changing this setting! -cfg$gms$crop <- "endo_apr21" # def = endo_apr21 -# * (c30_bioen_type): switch for type of bioenergy crops; options: begr, betr, all -cfg$gms$c30_bioen_type <- "all" # def = "all" -# * (c30_bioen_water): switch for irrigation of bioenergy crops; options: rainfed, irrigated, all -cfg$gms$c30_bioen_water <- "rainfed" # def = "rainfed" -# * (c30_rotation_constraints): switch for rotational constraints: on, off -cfg$gms$c30_rotation_constraints <- "on" # def = "on" -# * (c30_rotation_scenario): scenarios for constraints. -# * In realization rotation_apr22: min (minimal constraints), default (best guess), good (good practice), -# * good_20div (good practice - 20% for other crops), setaside (default plus fallow), -# * legumes (minimum share of legumes), agroforestry (minimum share of perennials), sixfoldrotation -# * (crops can only repeat after 6 years), agroecology (mix of previous scenarios) -# * In realization penalty_apr22: none (no incentives), default (best guess), fallow (increased fallow incentives), -# * legumes (increased incentives for legumes), agroforestry (increased incentives for perennials), agroecology (mix) -# * In realization endo_apr21: no scenarios exist. -cfg$gms$c30_rotation_scenario <- "default" # def = "default" -# * Year by which rotation scenario is fully implemented: -# * Start year: -cfg$gms$s30_rotation_scenario_start <- 2020 # def = 2020 -# * Target year (year when full implementation is reached): -cfg$gms$s30_rotation_scenario_target <- 2050 # def = 2050 - - -# * Switch to determine whether marginal land (suitability index below 0.33) should be included -# * in the total available cropland. Options are: -# * ("all_marginal"): All marginal land can be used for crop cultivation -# * ("q33_marginal"): The bottom tertile of marginal land is excluded -# * ("no_marginal"): Marginal land is completely excluded from crop cultivation -# * Note: Option "q33_marginal" produces the highest spatial correlation -# * with observed cropland patterns and is recommended for productive runs. -cfg$gms$c30_marginal_land <- "q33_marginal" # def = "q33_marginal" - -# * Share of available cropland that is withheld for maintaining semi-natural vegetation (SNV) -# * in cropland areas, including grassland, forest and other land. For example, -# * a share of 0.2 corresponds to 20 % of SNV in terms of the available cropland. -# * Accepted values are between 0 and 1 -# Note: s30_snv_shr applies to countries selected in policy_countries30 -# s30_snv_shr_noselect applies to all other countries. -cfg$gms$s30_snv_shr <- 0 # def = 0 -cfg$gms$s30_snv_shr_noselect <- 0 # def = 0 -# * Year by which SNV policy ('s30_snv_shr') is fully implemented. -# * Start year: -cfg$gms$s30_snv_scenario_start <- 2020 # def = 2020 -# * Target year (year when full implementation is reached): -cfg$gms$s30_snv_scenario_target <- 2030 # def = 2030 -# * Switch and specification of countries for which SNV policy in -# * s30_snv_shr apply. -# * Options: list of iso-codes of countries where SNV policy should be applied -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -cfg$gms$policy_countries30 <- all_iso_countries -# * Land types included in the SNV policy. This option allows for sensitivity analyses. -# * plausible options: "secdforest, forestry, past, other", -# * "secdforest, other", -# * "secdforest, past, other" etc. -cfg$gms$land_snv <- "secdforest, forestry, past, other" #def = "secdforest, forestry, past, other" - -# * (s30_annual_max_growth): Additional cropland per year per region, relative to the current cropland level (e.g., 0.02 -> 10.4% allowed growth between 2020 and 2025, relative to 2020 cropland area) -cfg$gms$s30_annual_max_growth <- 0.02 # def = Inf - -# ***--------------------- 31_past --------------------------------------- -# * (static): static pasture -# * (endo_jun13): dynamic pasture -# * (grasslands_apr22): Grassland management separating managed pastures from rangelands -# NOTE: It is recommended to recalibrate the model when changing this setting! -cfg$gms$past <- "endo_jun13" # def = endo_jun13 - -# * Factor requirements (USD04 per ton DM) -cfg$gms$s31_fac_req_past <- 1 # def = 1 - -# * switch for unequal (1) or equal (0) sign in pasture production constraint q31_prod. -# * unequal means that pasture production can be lower than pasture area x pasture yield, -# * reflecting that not all pasture area is grazed. -cfg$gms$s31_unequal <- 1 # def = 1 - -# * Scenario for grassland, pasture suitability areas and pasture yields (only take effect for realization grasslands_apr22) -# * options: cc (climate change) -# * nocc (no climate change) -# * nocc_hist (no climate change after year defined by sm_fix_cc) -cfg$gms$c31_grassl_yld_scenario <- "cc" # def = "cc" - -# * Switch that allows selecting how yield calibration factors will be calculated. -# * If 0, grassland yield calibration will be calculated as multiplicative relative values. -# * If 1, calibration values will be limited to additive absolute values when modeled yields strongly -# * underestimate historical values. For more information, read the description on the 'preloop' -# * file of module 31_past. - -# * options: 1 (limit to absolute values) -# * 0 (pure relative calibration) -cfg$gms$s31_limit_calib <- 1 # def = 1 - -# ***--------------------- 32_forestry ----------------------------------- -# * (dynamic_feb21): Dynamic forestry sector including afforestation with detailed age-classes -cfg$gms$forestry <- "dynamic_feb21" # def = dynamic_feb21 - -# * afforestation planing horizon (years) -cfg$gms$s32_planing_horizon <- 50 # def = 50 - -# * Settings for CO2 price driven afforestation (Growth curve and BII) - -# * Growth curve for CO2 price driven afforestation -# * Switch for using natural vegetation (0) or plantation (1) growth curves towards LPJmL natural -# * vegetation carbon density. -# * Afforestation following plantation growth curves reflects managed or assistent regrowth, -# * and might also include non-native species. -cfg$gms$s32_aff_plantation <- 0 # def = 0 - -# * BII coefficient for CO2 price driven afforestation -# * Switch for using secondary vegetation (0) or timber (1) BII coefficients for CO2 price driven afforestation -# * The recommend setting is to map the BII coefficient to the choice of the growth curve. -# * natural vegetation growth curve (0): secondary vegetation BII coefficient (0) -# * plantation growth curve (1): timber BII coefficient (1) -# * However, afforestation with plantations (1) could possibly be done in a biodiversity friendly way (0) -cfg$gms$s32_aff_bii_coeff <- 0 # def = 0 - -# Afforestation policy -# * ("none"): no prescribed afforestation -# * ("npi"): prescribed afforestation based on NPI policies -# * ("ndc"): prescribed afforestation based on NPI+NDC policies -cfg$gms$c32_aff_policy <- "npi" # def = "npi" - -# Maximum total global afforestation in Mha (Inf = no constraint) -# Note 1: the limit applies to the sum of endogenous CO2 price driven and exogenous NPI/NDC afforestation -# Note 2: a limit of 0 or below the level of exogenous NPI/NDC afforestation will be a automatically raised to the level of exogenous NPI/NDC afforestation -cfg$gms$s32_max_aff_area <- Inf # def = Inf - -# Protection of afforested areas (endogenous CO2 price driven) -# 0=until end of planning horizon (see s32_planing_horizon) -# 1=forever -# Note: Without a price on CO2 emissions from land-use change in module 32_forestry, -# which is the current default (c56_emis_policy <- "reddnatveg_nosoil"), -# the recommended setting for s32_aff_prot is 1. -# Otherwise, the model can do re/afforestation on existing re/afforestation areas -# after the end of planning horizon without penalty for CO2 emissions. -cfg$gms$s32_aff_prot <- 1 # def = 1 - -# Type of afforestation constraint -cfg$gms$s32_max_aff_area_glo <- 1 # def = 1 -# * (1): global limit based on s32_max_aff_area -# * (0): regional limit based on the input file "f32_max_aff_area.cs4" - -# Switch to determine whether afforestation should be limited to -# certain latitudinal zones -# * ("unrestricted"): No regions excluded -# * ("noboreal"): Exclude boreal regions > 50deg N -# * ("onlytropical"): Afforestation only in tropical areas 20deg S-20deg N -cfg$gms$c32_aff_mask <- "noboreal" # def = "noboreal" - -# Switch to determine whether biogeophysical responses to -# afforestation should be considered -# If this endogenous bgp effect is considered it is adviced to use the -# unrestricted afforestation mask -# to avoid superimposing the additional exogeneous bgp implementation -# * ("nobgp"): No biogeophysical influences -# * ("ann"): Annual BGP -# * ("djf"): Boreal winter BGP December January February -# * ("jja"): Boreal summer BGP June July August -cfg$gms$c32_aff_bgp <- "nobgp" # def = "nobgp" - -# Switch for the different TCRE estimates which are used to -# translate the BGP temperature effect into their carbon equivalent. -# The estimates encompass the ensemble mean +/- SD of 20 CMIP5 models. -# Ceq ~ BGP/TCRE - Hence, high TCRE decreases the BGP effect. -# * ("ann_TCREmean"): Ensemble mean -# * ("ann_TCREhigh"): Ensemble mean + SD -# * ("ann_TCRElow"): Ensemble mean - SD -cfg$gms$c32_tcre_ctrl <- "ann_TCREmean" - -# Switch for dynamic timber plantations -# "off" means that timber plantations are initialized in the highest -# age class and that there is no regrowth seen in such plantations. -# In addition, timber plantations are fixed to 1995 levels in the "off" case. -# In other cases, age-classes in timber plantations are initialized based on -# rotation length and can change dynamically over time. -# Note that this switch has no effect in the "static_sep16" realization, -# in which forestry area is assumed static. -# * 0= off -# * 1= Equal distribution -# * 2= FAO distribution based on planted forest estimates 2006 -# * 3= Poulter distribution -# * 4= Manual distribution - Similar to equal distribution but higher weight on -# * younger age-classes as plantation areas increase strongly -# * in recent history (ca. >1990). -cfg$gms$s32_initial_distribution <- 0 # def = 0 - -# Switch fore regional or global interest rate for rotation length calculations. -# Using the global setting would mean that the timber plantation decisions are -# decoupled from other decisions in the model which are based on regional interest -# rates. -# * ("regional") = Regionally differentiated interest rates -# * ("global") = One global interest rate -cfg$gms$c32_interest_rate <- "regional" # def = "regional" - -# Global interest rate for plantations in case c32_interest_rate switch is global -# Accepted values between 0 and 1. -cfg$gms$s32_forestry_int_rate <- 0.05 # def = 0.05 - -# Scenarios for using FAO scenarios of future proportion of production coming from -# Timber plantations used for deciding how much establishment should be made in -# simulation time step. This setting is only used when s32_hvarea is set to 2 ("Endogenous") -# * ("abare") = Global outlook for plantations. Australian Bureau of Agriculture and Resource Economics (ABARE) and Jaakko Pöyry Consulting 1999 -# * ("brown") = The global outlook for future wood supply from forest plantations. Working paper GFPOS/WP/03 prepared for the 1999 Global Forest Products Outlook Study 1999 -cfg$gms$c32_dev_scen <- "abare" # def = "abare" - -# Scenarios for future development of timber production contribution to roundwood demand -# based on the settings from c32_dev_scen. -# * ("constant") = Constant share over time (1995-2250) -# * ("h5s5l5") = In every time step 5% increase from 1995 till 2020, 5% increase from 2025 till 2050, 5% increase from 2055 till 2250 -# * ("h5s2l2") = In every time step 5% increase from 1995 till 2020, 2% increase from 2025 till 2050, 2% increase from 2055 till 2250 -# * ("h5s2l1") = In every time step 5% increase from 1995 till 2020, 2% increase from 2025 till 2050, 1% increase from 2055 till 2250 -# * ("h5s1l1") = In every time step 5% increase from 1995 till 2020, 1% increase from 2025 till 2050, 1% increase from 2055 till 2250 -# * ("h5s1l05") = In every time step 5% increase from 1995 till 2020, 1% increase from 2025 till 2050, 0.5% increase from 2055 till 2250 -# * ("h2s1l05") = In every time step 2% increase from 1995 till 2020, 1% increase from 2025 till 2050, 0.5% increase from 2055 till 2250 -cfg$gms$c32_incr_rate <- "h5s2l1" # def = "h5s2l1" - -# Harvesting switch for timber production -# * 0 = No harvested area from plantations, no age-class shifting (area held constant at 1995 levels) -# * This also means that no harvesting or establishment of new plantations takes place. -# * 1 = "Exogenous" scenario. Harvested area from plantations but with age-class shifting -# * All timber plantations are harvested at rotation age and are re-established -# * such that the total plantation area remains constant. -# * 2 = "Endogenous" scenario. Harvest from plantations including age-class shifting -# * All plantations are harvested at rotation age. Plantation establishment is endogenous. -cfg$gms$s32_hvarea = 0 # def = 0 - -# Type of rotation length selection criteria -# * ("mean_annual_increment") = Harvesting when the average annual increment is maximum -# * ("current_annual_increment") = Harvesting when the marginal increment is maximum -# * ("instantaneous_growth_rate") = Harvest when instantaneous growth rate is equal to interest rate - -cfg$gms$c32_rot_calc_type <- "current_annual_increment" - -# Generic forest shock scenarios. Disturbance sets percentage of all age classes back to 0 -# * ("none") No disturbance applied -# * ("002lin2030") Disturbance applied to 0p2 percent per year linear phase-in over 20yrs from 0 in 2030 -# * ("004lin2030") Disturbance applied to 0p4 percent per year linear phase-in over 20yrs from 0 in 2030 -# * ("008lin2030") Disturbance applied to 0p8 percent per year linear phase-in over 20yrs from 0 in 2030 -# * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 -cfg$gms$c32_shock_scenario = "none" # def = "none" - -# * Prohibit rapid afforestation early on -cfg$gms$s32_max_aff_cell_2025 <- 0.005 # def = inf #0.005 = globally 1Mha Aff allowed in 2025 - -# ***--------------------- 34_urban --------------------------------------- -# * 34_urban includes urban land -# * (static) static urban land fixed on 1995 patterns from LUH2v2 -# * (exo_nov21) has exogenous future urban land patterns based on LUH2v2 -cfg$gms$urban <- "exo_nov21" # def = exo_nov21 - -# * Additional settings for exo_nov21 realization only: -cfg$gms$c34_urban_scenario <- "SSP2" # def = SSP2 -# * options: SSP: "SSP1", "SSP2", "SSP3", "SSP4", "SSP5" - -# ***--------------------- 35_natveg -------------------------------------- -# * 35_natveg includes primforest, secdforest and other land -# * (dynamic_feb21): Dynamic natural vegetation land with detailed age-classes -cfg$gms$natveg <- "dynamic_feb21" # def = dynamic_feb21 - -# Avoided Deforestation policy -# * ("none"): no avoided deforestation -# * ("npi"): avoided deforestation based on NPI policies -# * ("ndc"): avoided deforestation based on NPI+NDC policies -cfg$gms$c35_ad_policy <- "npi" # def = "npi" - -# Avoided Other Land Conversion policy -# * ("none"): no avoided other land conversion -# * ("npi"): avoided other land conversion based on NPI policies -# * ("ndc"): avoided other land conversion based on NPI+NDC policies -cfg$gms$c35_aolc_policy <- "npi" # def = "npi" - -# Distribution of age-classes during secondary forest initialization -# * (0): All secondary forest belongs to highest age class -# * (1): Equal distribution of secondary forest in all age-classes -# * (2): Distribution of secondary forest according to Poulter et al 2018 based on MODIS satellite data -cfg$gms$s35_secdf_distribution <- 0 # def = 0 - -# Damages in natural forests -# * (0): No damage simulated -# * (1): Damage from shifting agriculture (constant) -# * (2): Damage from shifting agriculture is faded out by the year defined in 'cfg$gms$c35_forest_damage_end' -# * (4): Generic forest disturbance scenarios defined in `f35_forest_shock.csv` -cfg$gms$s35_forest_damage <- 2 # def = 2 -# * If option (2) above: Year by which damage from shifting agriculture has petered out -cfg$gms$s35_forest_damage_end <- 2050 #def = 2050 - -# Harvesting switch for timber production -# * 0 = No timber production from natveg, no age-class shifting -# * 1 = No timber production from natveg but with age-class shifting -# * 2 = Timber production from natveg including age-class shifting -cfg$gms$s35_hvarea <- 0 # def = 0 - -# Generic forest shock scenarios. Disturbance sets percentage of all age classes back to 0 -# * ("none") No disturbance applied -# * ("002lin2030") Disturbance applied to 0p2 percent per year linear phase-in over 20yrs from 0 in 2030 -# * ("004lin2030") Disturbance applied to 0p4 percent per year linear phase-in over 20yrs from 0 in 2030 -# * ("008lin2030") Disturbance applied to 0p8 percent per year linear phase-in over 20yrs from 0 in 2030 -# * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 -cfg$gms$c35_shock_scenario = "none" # def = "none" - -# ***--------------------- 36_employment ------------------------------- -# * This module calculates agricultural employment. -# * (exo_may22): employment is calculated based on labor costs and not affecting the -# * optimization -cfg$gms$employment <- "exo_may22" # default = "exo_may22" - -# * global minimum wage in USDMER05 per hour that needs to be reached in all countries by 2050 -cfg$gms$s36_minimum_wage <- 0 # default = 0 (no minimum wage) - -# * A scenario that increases wages can either be fully related to productivity increase -# * (leading to lower employment for the same total labor costs), or keep productivity -# * constant (leading to the same employment for higher total labor costs), or to a -# * mixture between productivity increase an total labor cost increase. -# * The scalar `s36_scale_productivity_with_wage` describes how high the labor productivity -# * gain should be relative to the increase in hourly labor costs. If set to 0, -# * productivity stays constant, if set to 1 productivity scales proportional to hourly -# * labor costs. Other positive values lead to a mixture of productivity gain and increase -# * in total costs. -cfg$gms$s36_scale_productivity_with_wage <- 0 # default = 0 - -# ***--------------------- 37_labor_prod --------------------------------- -# * This module provides a labour productivity factor (0-1), -# * which reflects the efficiency of labour under changing environmental conditions (1 = no change). -# * The labour productivity factor is currently only considered in the sticky_labor -# * realization of the [38_factor_costs] module. -# * (off): labor productivity factor fixed to 1 -# * (exo): labor productivity factor is affected by climate change impacts -cfg$gms$labor_prod <- "off" # default = off - -# * Additional setting for exo realization only: -# * Climate change impact scenario. Options: "rcp119", "rcp585" -cfg$gms$c37_labor_rcp <- "rcp119" # default = "rcp119" -# * Heat assessment metric. Options: "ISO", "HOTHAPS" -cfg$gms$c37_labor_metric <- "ISO" # default = "ISO" -# * Labour intensity. Options: "300W", "400W" -cfg$gms$c37_labor_intensity <- "400W" # default = "400W" -# * Uncertainty over ESMs. Options: "enslower", "ensmean", "ensupper" -cfg$gms$c37_labor_uncertainty <- "ensmean" # default = "ensmean" - -# ***--------------------- 38_factor_costs ------------------------------- -# * Make sure you use the corresponding calibration file to the selected realization -# * Please, check details in input settings. -# * (per_ton_fao_may22) factor costs fixed per ton -# * (sticky_feb18) factor costs including investments in capital -# * (sticky_labor) based on sticky_feb18 + labor productivity factor included -# NOTE: It is recommended to recalibrate the model when changing this setting! -# NOTE: In case the maximum number of iterations is reached without convergence -# in the calibration, please consider to use the best_calib setting for the calibration run -cfg$gms$factor_costs <- "per_ton_fao_may22" # default = per_ton_fao_may22 - -# * Regional (reg) or global (glo) factor requirements (applicable for per_ton_fao_may22, -# * sticky_feb18, sticky_labor). The regional version keeps factor requirements constant -# * after 2010, the global version uses values from 2005 for all years. Typically, the -# * same version (glo or reg) should be chosen for c70_fac_req_regr for consistency. -# NOTE: It is recommended to recalibrate the model when changing this setting! -cfg$gms$c38_fac_req <- "glo" # default "glo" - - -# * Only relevant for sticky_labor implementation: - -# * Year until which the capital share should be fixed to the historical values, not allowing for endogenous -# * substitution between labor and capital. -cfg$gms$s38_startyear_labor_substitution <- 2020 # default 2020 - -# * The following two settings are to create exogenous scenarios in which capital is substituted by labor to increase -# * employment: -# * The taget labor share defins a global target for labor share out of labor + capital needed per unit -# * of output. If 0, no target is set. -cfg$gms$s38_target_labor_share <- 0 # default 0 - -# * The target year defines the year for which the global target labor share should be set. -cfg$gms$s38_targetyear_labor_share <- 2050 - -# * The target fulfillment share indicates the share by which a region moves from its baseline -# * labor share towards the target value -cfg$gms$s38_target_fulfillment <- 0.5 # default 0.5 - -# ***--------------------- 39_landconversion ----------------------------- -# * (calib): Costs for cropland expansion are scaled with a regional calibration factor -# * Costs for pasture and forestry expansion are global static -cfg$gms$landconversion <- "calib" # def = calib -# * Cost for cropland expansion before calibration (USD05MER per hectare) -cfg$gms$s39_cost_establish_crop <- 10000 #def = 10000 -# * Reward for cropland reduction before calibration (USD05MER per hectare) -cfg$gms$s39_reward_crop_reduction <- 6000 -# * Cost for pasture land expansion (USD05MER per hectare) -cfg$gms$s39_cost_establish_past <- 8000 #def = 8000 -# * Cost for foresty land expansion (USD05MER per hectare) -cfg$gms$s39_cost_establish_forestry <- 1000 #def = 1000 -# * Cost for urban land expansion (USD05MER per hectare) -cfg$gms$s39_cost_establish_urban <- 10000 #def = 10000 -# * Switch for ignoring land conversion cost calibration factors -# * Options: 1 (ignore calibration factors) -# * 0 (use calibration factors) -cfg$gms$s39_ignore_calib <- 0 #def = 0 - -# ***--------------------- 40_transport ---------------------------------- -# * (off): no transport costs -# * (gtap_nov12): transport costs applied to crops and ruminant livestock -# * products calibrated based on magpie-output (dynamic pasture) -# * to match GTAP data -cfg$gms$transport <- "gtap_nov12" # def = gtap_nov12 - -# * scalar to introduce pasture transport costs -cfg$gms$s40_pasture_transport_costs <- 0 # def = 0 - -# ***--------------------- 41_area_equipped_for_irrigation --------------- -# * (static): no expansion -# * (endo_apr13): endogenous, cost driven expansion -cfg$gms$area_equipped_for_irrigation <- "endo_apr13" # def = endo_apr13 - -# * switch for initialization area -# * (LUH2v2): area equipped for irrigation based on LUH2v2 irrigated areas -# * (Mehta2022): area equipped for irrigation from Mehta et al. (2022) -cfg$gms$c41_initial_irrigation_area <- "LUH2v2" # def = LUH2v2 - -# * Sets the rate of depreciation of irrigation infrastructure in every timestep. -# * Only applicable when (endo_apr13) realization is selected -cfg$gms$s41_AEI_depreciation <- 0 # def = 0 - - -# ***--------------------- 42_water_demand -------------------------------- -# * (agr_sector_aug13): fixed fraction of water available is reserved -# * for other uses -# * (all_sectors_aug13): manufacturing, electricity and domestic demand are -# * retrieved from WATERGAP data. -cfg$gms$water_demand<- "all_sectors_aug13" # def = all_sectors_aug13 - -# * water demand scenario -# * options: cc (climate change) -# * nocc (no climate change) -# * nocc_hist (no climate change after year defined by sm_fix_cc) -cfg$gms$c42_watdem_scenario <- "cc" # def = "cc" - -# * Choice of fraction of available water that is not -# * available for agriculture (only affects agr_sector_aug13 realization) -cfg$gms$s42_reserved_fraction <- 0.5 # def = 0.5 - -# * Scenario for non agricultural water demand from WATERGAP -# * (only affects all_sector_aug13 realization) -# * (1): ssp1 -# * (2): ssp2 -# * (3): ssp3 -cfg$gms$s42_watdem_nonagr_scenario <- 2 # def = 2 - -# * Switch to determine the irrigation efficiency scenario -# * (1): global static value -# * (2): regional static values from gdp regression -# * (3): gdp driven increase -cfg$gms$s42_irrig_eff_scenario <- 2 # def = 2 - -# * Irrigation efficiency -# * (Only used if global static value is requested) -cfg$gms$s42_irrigation_efficiency <- 0.66 # def=0.66 - -# * Environmental flow protection policy -# * (off): no EFP policy -# * (on): global EFP policy -# * (mixed): EFP policy only in hic regions -cfg$gms$c42_env_flow_policy <- "off" # def = "off" - -# * Start and target year of environmental flow protection policy ('c42_env_flow_policy'). -# * Defines when linear fading in of policy starts and when the target of -# * full protection based on 's42_env_flow_scenario' is reached -# * Start year: -cfg$gms$s42_efp_startyear <- 2020 # def = 2020 -# * Target year (year when full protection is reached): -cfg$gms$s42_efp_targetyear <- 2040 # def = 2040 - -# * Switch and specification of countries for which environmental flow policy -# * shall apply. -# * Options: list of iso-codes of countries where EFP should be in effect. -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -cfg$gms$EFP_countries <- all_iso_countries # def = all_iso_countries - -# * Environmental flow protection scenario -# * (0): do not consider environmental flows. -# * s42_env_flow_base_fraction and -# * s42_env_flow_fraction have no effect. -# * (1): Reserve a certain fraction of available water -# * specified by s42_env_flow_fraction for -# * environmental flows -# * (2): Each grid cell receives its own value for -# * environmental flow protection based on LPJ -# * results and a calculation algorithm by Smakhtin 2004. -# * s42_env_flow_fraction has no effect. -cfg$gms$s42_env_flow_scenario <- 2 # def = 2 - -# * Fraction of available water that is reserved for the environment -# * in case of a protection policy -# * In which regions and timesteps a protection policy is in place is determined -# * in the file EFR_protection_policy.csv in the input folder -# * of the 42_water_demand module -cfg$gms$s42_env_flow_fraction <- 0.2 # def = 0.2 - -# * Fraction of available water that is reserved for the environment in case of -# * missing protection policy -cfg$gms$s42_env_flow_base_fraction <- 0.05 # def = 0.05 - -# * Switch to activate pumping costs (only available for India currently), Set to 1 if want to use for India -cfg$gms$s42_pumping <- 0 # def = 0 - -# * Year in which pumping costs will be implemented -cfg$gms$s42_multiplier_startyear <- 1995 # def = 1995 - -# * Scalar to change pumping costs for sensitivity analysis, takes numeric values -# * Default value is 0 for all regions, set value to 1 for India default analysis -# * Only applicable when s42_pumping is equal to 1 -cfg$gms$s42_multiplier <- 0 # def = 0 - -# ***--------------------- 43_water_availability -------------------------- -# * (total_water_aug13): surface and ground water resources available -cfg$gms$water_availability <- "total_water_aug13" # def = total_water_aug13 - -# * water availability scenario -# * options: cc (climate change) -# * nocc (no climate change) -# * nocc_hist (no climate change after year defined by sm_fix_cc) -cfg$gms$c43_watavail_scenario <- "cc" # def = "cc" - -# ***------------------------- 44_biodiversity ------------------------------ -# * (bii_target): Biodiversity Intactness Index (BII) for 71 biomes with the option to define a lower bound for BII at biome level -# * (bv_btc_mar21): Global optimization of range-rarity weighted biodiversity stocks based on a price for losses and gains -cfg$gms$biodiversity <- "bii_target" # def = bii_target - -# * Start year for linear increase towards BII target value (in bii_target) or biodiversity target price (in bv_btc_mar21) -cfg$gms$s44_start_year <- 2025 #def = 2025 - -# * Year in which the BII target value (in bii_target) or biodiversity target price (in bv_btc_mar21) is reached -cfg$gms$s44_target_year <- 2100 #def = 2100 - -# ** Options for realization `bii_target` -# * This realisation allows to define a target value and year for the Biodiversity Intactness Index (BII) -# * that is applied in each biome type of each biogeographic realm or at the global level. -# * The lower bound increases in each biome linearly from the BII level in the start year (s44_start_year) to the value defined in `s44_bii_lower_bound` in the target year (s44_target_year). -# * The BII has been proposed as a control variable for changes in ecosystem functioning at the global scale -# * and has shown to capture increasing levels of ecosystem degradation. Steffen et al. (2015, 10.1126/science.1259855) have proposed -# * a premliminary boundary of 0.9 at the biome level (safe space) but with an uncertainty range of 0.9-0.3, -# * in which ecosystem degradation may undermine stable ecosystem functioning and the supply of nature's -# * contributions to people (NCP). With BII values below 0.3, the area's biodiversity has been depleted, -# * causing high risk of ecosystem collapse. Estimates for the global BII range between 0.7975 in 1970 and 0.7754 -# * in 2000. https://www.nhm.ac.uk/our-science/data/biodiversity-indicators/biodiversity-intactness-index-data -# * In MAgPIE, the global BII value is about 0.8 in 1995 and declines to 0.795 by 2020. - -# * Lower bound for BII in target year; plausible range: 0-1 -cfg$gms$s44_bii_lower_bound <- 0 #def = 0 - -# * Indicative outcomes for `s44_bii_lower_bound` based on c44_bii_decrease = 1, s44_start_year = 2025 and s44_target_year = 2100. -# * < 0.7: continued decrease of global BII -# * 0.74: no further decrease of global BII -# * 0.76: moderate increase of global BII -# * >= 0.78: (very) strong increase of global BII accomplished by high conversion of pasture to non-forest natural land - -# * BII lower bound implementation (binary) -# * options: 0 (no decrease allowed) or 1 (decrease allowed) -# * 0 (no decrease allowed): If the biome-level BII in `s44_start_year` exceeds the lower bound defined in `s44_bii_lower_bound, the BII value in the start year is used as lower bound for BII in all future time steps. -# * 1 (decrease allowed): The lower bound for BII can decrease over time, depending on the biome-level BII in the start year and the lower bound defined in `s44_bii_lower_bound. -# * Note: The BII constraint is defined as a minimum constraint. Therefore, the actual BII can be higher than the lower bound. -cfg$gms$c44_bii_decrease <- 1 #def = 1 - -# * Technical costs for missing BII increase (USD per unit of BII) -cfg$gms$s44_cost_bii_missing <- 10000000 - -# ** Options for realization `bv_btc_mar21` - -# * Price for biodiversity stock loss/gain in target year (USD per ha) -# * Plausible range: 0-10000 -# * Indicative outcomes -# * 0: decrease of BII -# * 3000: rather constant BII -# * 6000: moderate increase of BII -# * 10000: stronger increase of BII -cfg$gms$s44_target_price <- 0 #def = 0 - -# * Price for biodiversity stock loss/gain in start year (USD per ha) -cfg$gms$s44_start_price <- 0 #def = 0 - - -# ***------------------------- 45_climate --------------------------------- -# * (static): static koeppengeiger climate classification data -cfg$gms$climate <- "static" # def = static - -# ***------------------------- 50_nr_soil_budget -------------------------- -# * (off): off -# * (macceff_aug22): nr efficiency dependent on MACC curves -cfg$gms$nr_soil_budget <- "macceff_aug22" # def = macceff_aug22 - -# * Scenario for baseline nr efficiency (excluding additional improvements based -# * on marginal abatmeent cost curves) on croplands for selected (and -# * respectively non-selected) countries in cropneff_countries and pastneff_countries -# * -# * Options: -# * "constant", -# * Scenarios keep baseline NUE constant. -# * "baseeff_add3_add10_add20_max75", (SSP1) -# * "baseeff_add3_add5_add10_max65", (SSP2) -# * "baseeff_add3_add0_add0_max55", (SSP3) -# * "baseeff_add3_add10_add15_max75", (SSP4) -# * "baseeff_add3_add5_add15_max75", (SSP5) -# * "baseeff_add3_add15_add25_max65", (lowTech) -# * "baseeff_add3_add15_add25_max75", (MaxMitigation) -# * In the baseeff_add scenarios, the baseline NUE starts from historical -# * values in 2010. The three numbers signify how many percentage points -# * the efficiency increases until 2020,2050 and 2100, always relative to -# * 2010. The max efficiency is the maximum base efficiency in 2050 -# * and 2100. "baseeff_add3_add15_add25_max65" means that China with a -# * current NUE of 41 increases to 44% by 2010, 56% by 2050 and 65% by 2100, -# * while the USA, with a current NUE of 71% has a falling base NUE to 65% -# * by 2050 and 2100. These base NUEs can however be improved by the MACCs, -# * leading to a max NUE of 85% for both China and USA in 2100. -# * The recommmended mapping to storylines is shown above in brackets. -# * "maxeff_add3_glo75_glo85", "maxeff_add3_glo75_glo80", -# * "maxeff_add3_glo60_glo65", "maxeff_add3_glo65_glo75", -# * Scenarios with a globaly uniform target NUE. This target NUE is achieved -# * by the combination of full MACCs and baseline NUE. First number is the -# * again additive efficiency increase until 2020, second number is -# * max NUE in 2050, third in 2100. Example: maxeff_add3_glo75_glo85 -# * means efficiency increases a regional specific 3 percentag point -# * improvement until 2020, and then it achieves a globally uniform 75% -# * efficiency in y2050; the baseline NUE value is therefore about 63%, -# * while the MACCs can increase this to 75%. In 2100, the baseline NUE -# * increases to 74%, which can achieve 85% if combined with -# * the MACCs. -# * "maxeff_ZhangBy2030", "maxeff_ZhangBy2050" -# * These two scenarios reach the max NUE of Zhang et al under application -# * of the full MACCs by 2030 or 2050, and then rise a bit further to -# * achieve a maximum NUE of 80% by 2100. - -cfg$gms$c50_scen_neff <- "baseeff_add3_add5_add10_max65" # def = baseeff_add3_add5_add10_max65 -cfg$gms$c50_scen_neff_noselect <- "baseeff_add3_add5_add10_max65" # def = baseeff_add3_add5_add10_max65 - -# * For pastures, only two scenarios exist: a constant scenario, and one where -# * the minimum NUE increases to 55,60 and 65% for 2020,2050 and 2100, to avoid -# * that pastures which dont have a nutrient deficit are fertilized -# * (historical NUE may be low despite no fertilization) -# * Options: -# * constant, constant_min55_min60_min65 - -cfg$gms$c50_scen_neff_pasture <- "constant_min55_min60_min65" # def = constant_min55_min60_min65 -cfg$gms$c50_scen_neff_pasture_noselect <- "constant_min55_min60_min65" # def = constant_min55_min60_min65 - -# * Switch and specification of countries for which above defined (c50_scen_neff, -# * c50_scen_neff_pasture) apply, respectively. -# * For all other countries c50_scen_neff_noselect / c50_scen_neff_pasture_noselect -# * apply. -# * Options: list of iso-codes of countries where selected neff scenario should -# * be in effect. -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: above defined neff scenario applies to all iso countries -cfg$gms$cropneff_countries <- all_iso_countries -cfg$gms$pastneff_countries <- all_iso_countries - - -# ***--------------------- 51_nitrogen ------------------------------------ -# * (rescaled_jan21): IPCC emissions factors rescaled with efficiency -# * (off): no nitrogen calculations -cfg$gms$nitrogen <- "rescaled_jan21" # def = rescaled_jan21 - - -# ***--------------------- 52_carbon -------------------------------------- -# * (normal_dec17): regrowth of carbon stocks in all c pools starts from pasture levels -# * (off): carbon calculations deactivated -cfg$gms$carbon <- "normal_dec17" # def = normal_dec17 - -# * RCP scenario of land carbon sink adjustment factor, from Grassi et al 2021 -# * options: RCP19, RCP26, RCP34, RCP45, RCP60, RCPBU, -# * nocc (fixed to values from 1995), -# * nocc_hist (RCPBU until year defined in sm_fix_cc, fixed thereafter) -cfg$gms$c52_land_carbon_sink_rcp <- "RCPBU" - - -# * carbon scenario -# * options: cc (climate change) -# * nocc (no climate change) -# * nocc_hist (no climate change after year defined by sm_fix_cc) -cfg$gms$c52_carbon_scenario <- "cc" # def = "cc" - -# * Minimum threshold of carbon density (tC/ha) in timber plantations -cfg$gms$s52_plantation_threshold <- 8 # def = 8 - -# ***--------------------- 53_methane ------------------------------------- -# * (ipcc2006_aug22): IPCC 2006 methodology -# * (off): methane calculations deactivated -cfg$gms$methane <- "ipcc2006_aug22" # def = ipcc2006_aug22 - -# ***--------------------- 54_phosphorus ---------------------------------- -# * (off): calculations deactivated -cfg$gms$phosphorus <- "off" # def = off - -# ***--------------------- 55_awms --------------------------------------- -# * (ipcc2006_aug16): animal waste management systems -# * (based on IPCC 2006 Guidelines) -# * (off): deactivated animal waste management -cfg$gms$awms <- "ipcc2006_aug16" # def = ipcc2006_aug16 - -# * scenario for animal waste management. -# * option: "ssp1", "ssp2", "ssp3", "ssp4", "ssp5", "constant", "a1", "a2", "b1","b2", -#* "GoodPractice" -# * Note: c55_scen_conf applies to countries selected in scen_countries55 -# * c55_scen_conf_noselect applies to all other countries. -# * Available scenarios for c55_scen_conf_noselect are identical to c55_scen_conf -cfg$gms$c55_scen_conf <- "ssp2" # def = ssp2 -cfg$gms$c55_scen_conf_noselect <- "ssp2" # def = ssp2 - -# * Switch and specification of countries for which awm scenario in -# * c55_scen_conf applies. -# * Options: list of iso-codes of countries where awm scneario should be applied -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -cfg$gms$scen_countries55 <- all_iso_countries - -# ***--------------------- 56_ghg_policy ---------------------------------- -# * (price_aug22): applies pollutant prices to different emission types and calculates the reward for CDR from afforestation -cfg$gms$ghg_policy <- "price_aug22" # def = price_aug22 - -# * Switch for scaling GHG price with development state (1=on 0=off) -cfg$gms$s56_ghgprice_devstate_scaling <- 0 # def = 0 - -# * reduction factor for CO2 price (only used in price_jan19) -# * lowers the economic incentive for CO2 emission reduction (avoided deforestation) and afforestation -cfg$gms$s56_cprice_red_factor <- 1 # def = 1 - -# * GHG emission price scenario -# * Note: For best consistency it is recommended to use trajectories from the most recent -# * coupled REMIND-MAgPIE runs. Currently, this is R32M46. -# * Available options: -# * none: no 2nd generation bioenergy demand -# * R32M46: Coupled REMIND-MAgPIE runs with REMIND 3.2.1.dev412 and MAgPIE 4.6.11 -# * NPi: Current policies; limit peak warming to 3.0°C -# * NDC: Nationally determined contributions; limit peak warming to 2.5°C -# * PkBudg650: Peak Budget with 650 GtCO2 until net-zero CO2 emissions; well-below 1.5°C in 2100 -# * PkBudg1050: Peak Budget with 1050 GtCO2 until net-zero CO2 emissions; well-below 2.0°C in 2100 -# * R32M46-SDP_MC-NPi, R32M46-SDP_MC-NDC, R32M46-SDP_MC-PkBudg650, -# * R32M46-SSP1-NPi, R32M46-SSP1-NDC, R32M46-SSP1-PkBudg1050, R32M46-SSP1-PkBudg650, -# * R32M46-SSP2EU-NPi, R32M46-SSP2EU-NDC, R32M46-SSP2EU-PkBudg1050, R32M46-SSP2EU-PkBudg650, -# * R32M46-SSP5-NPi, R32M46-SSP5-NDC, R32M46-SSP5-PkBudg1050, R32M46-SSP5-PkBudg650, -# * R21M42: Coupled REMIND-MAgPIE runs with REMIND 2.1 and MAgPIE 4.2 -# * NPi: Current policies; above 3.0°C in 2100 -# * PkBudg900: Budget with 900 GtCO2; well-below 1.5°C in 2100 (PkBudg1000 for SDP) -# * PkBudg1300: Budget with 1300 GtCO2; well-below 2.0°C in 2100 -# * R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, -# * R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, -# * R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, -# * R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, R21M42-SSP5-PkBudg900, -# * R2M41: Coupled REMIND-MAgPIE runs with REMIND 2.0 and MAgPIE 4.1 -# * R2M41-SSP2-NPi, R2M41-SSP2-NDC, R2M41-SSP2-Budg1300, R2M41-SSP2-Budg600, R2M41-SSP2-Budg950 -# * Standalone REMIND runs from Strefler et al 2021; well-below 2.0°C in 2100 -# * https://www.nature.com/articles/s41467-021-22211-2 -# * PIK_GDP, PIK_H2C, PIK_HBL, PIK_HOS, PIK_LIN, PIK_NPI, PIK_OPT -# * SSP Database 2018, various SSP, RCP and Model combinations -# * https://tntcat.iiasa.ac.at/SspDb -# * Caution: using trajectories from other models or older MAgPIE versions might be -# * inconsistent with the current MAgPIE version. -# * SSPDB-SSP1-20-IMAGE,SSPDB-SSP1-20-REMIND-MAGPIE, -# * SSPDB-SSP1-26-IMAGE,SSPDB-SSP1-26-REMIND-MAGPIE, -# * SSPDB-SSP1-34-IMAGE,SSPDB-SSP1-34-REMIND-MAGPIE, -# * SSPDB-SSP1-37-REMIND-MAGPIE, -# * SSPDB-SSP1-45-IMAGE,SSPDB-SSP1-45-REMIND-MAGPIE, -# * SSPDB-SSP1-Ref-IMAGE,SSPDB-SSP1-Ref-REMIND-MAGPIE, -# * SSPDB-SSP2-18-MESSAGE-GLOBIOM,SSPDB-SSP2-19-MESSAGE-GLOBIOM, -# * SSPDB-SSP2-20-MESSAGE-GLOBIOM,SSPDB-SSP2-20-REMIND-MAGPIE, -# * SSPDB-SSP2-26-MESSAGE-GLOBIOM,SSPDB-SSP2-26-REMIND-MAGPIE, -# * SSPDB-SSP2-34-MESSAGE-GLOBIOM,SSPDB-SSP2-34-REMIND-MAGPIE, -# * SSPDB-SSP2-37-REMIND-MAGPIE, -# * SSPDB-SSP2-45-MESSAGE-GLOBIOM,SSPDB-SSP2-45-REMIND-MAGPIE, -# * SSPDB-SSP2-60-MESSAGE-GLOBIOM,SSPDB-SSP2-60-REMIND-MAGPIE, -# * SSPDB-SSP2-Ref-MESSAGE-GLOBIOM,SSPDB-SSP2-Ref-REMIND-MAGPIE, -# * SSPDB-SSP3-34-AIM-CGE,SSPDB-SSP3-45-AIM-CGE, -# * SSPDB-SSP3-60-AIM-CGE,SSPDB-SSP4-26-GCAM4, -# * SSPDB-SSP4-34-GCAM4,SSPDB-SSP4-45-GCAM4, -# * SSPDB-SSP4-60-GCAM4,SSPDB-SSP4-Ref-GCAM4, -# * SSPDB-SSP5-20-REMIND-MAGPIE,SSPDB-SSP5-26-REMIND-MAGPIE, -# * SSPDB-SSP5-34-REMIND-MAGPIE,SSPDB-SSP5-37-REMIND-MAGPIE, -# * SSPDB-SSP5-45-REMIND-MAGPIE,SSPDB-SSP5-60-REMIND-MAGPIE, -# * SSPDB-SSP5-Ref-REMIND-MAGPIE, -# * Used for producing coupled runs with REMIND-MAgPIE or for exogenous input (see below) -# * coupling -# * Note: c56_pollutant_prices applies to countries selected in policy_countries56 -# * c56_pollutant_prices_noselect applies to all other countries. -# * Available scenarios for c56_pollutant_prices_noselect are identical to c56_pollutant_prices -# * (see above) except for emulator and coupling (which can only be chosen for c56_pollutant_prices) -cfg$gms$c56_pollutant_prices <- "G0000" # def = R32M46-SSP2EU-NPi -cfg$gms$c56_pollutant_prices_noselect <- "G0000" # def = R32M46-SSP2EU-NPi - -# * The following two settings can be used to provide exogenous ghg prices -# * via a file that is not part of the input data. This is currently used -# * in the REMIND-MAgPIE coupling to read in the REMIND data. -# * Takes effect only if cfg$gms$c56_pollutant_prices is set to "coupling" - -# * Use ghg prices from the mif file specified here -cfg$path_to_report_ghgprices <- NA - -# * Mute GHG prices until (and including) the year given here -# * Note: minimum C price (see below) will be set regardless of this setting -cfg$gms$c56_mute_ghgprices_until <- "y2020" # def = y2030 - -# * Minium C price (USD per tC) for future time steps until (and including) the year defined in `c56_mute_ghgprices_until` -# * Note: in case of NDC policy a C price of 18 USD per tC (5 USD per tCO2) is used to guide land-use decisions (set via scenario_config.csv) -cfg$gms$s56_minimum_cprice <- 0 # def = 0 - -# * Switch and specification of countries for which pollutant pricing in -# * c56_pollutant_prices applies. -# * Options: list of iso-codes of countries where ghg policy should be applied -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -# * Note: Only for exogenous scenarios. Does not take any effect when "coupling" / -# * "emulator" is selected above. -cfg$gms$policy_countries56 <- all_iso_countries # def = all_iso_countries - -# * Switch for C price driven afforestation (1=on 0=off) -cfg$gms$s56_c_price_induced_aff <- 1 # def = on - -# * C price used as incentive for afforestation -# * Note: This setting should only be changed by experienced users -# * Options: forestry_vegc, primforest_vegc, secdforest_vegc -# * This setting interacts with `c56_emis_policy`. -# * If "forestry" is not included in `c56_emis_policy` (e.g. reddnatveg_nosoil), there will be no C-price driven afforestation unless `c56_cprice_aff` is changed to primforest_vegc or secdforest_vegc. -cfg$gms$c56_cprice_aff <- "secdforest_vegc" # def = secdforest_vegc - -# * C price expectation for afforestation decision-making in years -# * 0 is myopic behaviour (only C price of current time step) -# * reflects perfect-foresight if equal to s32_planing_horizon -# * should not be higher than s32_planing_horizon -cfg$gms$s56_c_price_exp_aff <- 50 # def = 50 - -# * Share of carbon credits for re/afforestation projects set aside in a buffer to -# * account for potential failure of permanent carbon storage. -# * Alternatively, this parameter can be interpreted as a reduction factor -# * of the carbon price for non-permanent CDR. -# * Values > 0 will reduce the incentive for c-price-induced re/afforestation -cfg$gms$s56_buffer_aff <- 0.5 # def = 0.5 - -# * Upper limit for CH4 and N2O GHG price (USD05MER per tC) -# * Limits GHG prices selected in c56_pollutant_prices to the chosen value. -# * CH4 and N2O GHG prices are limited by default to 4000 USD05MER per tC equivalent, -# * which induces the maximum abatement possible with c57_macc_version = "PBL_2022" -# * Beyond 4000 USD05MER per tC equivalent no further technical mitigation is possible -# * but would increase agricultural prices. -# * Suggested limits for different c57_macc_version settings -# * PBL_2007: 1000 (200 steps, 5 USD each) -# * PBL_2019: 4000 (200 steps, 20 USD each) -# * PBL_2022: 4000 (200 steps, 20 USD each) -cfg$gms$s56_limit_ch4_n2o_price <- 4000 # def = 4000 - -# * NOTE: The following 2 options for emission pricing have strong interactions in runs with CO2 prices and should only be changed by experienced users. -# * The main purpose of these options is to regulate the pricing of positive emissions. Note that re/afforestation is covered by a separate mechanism. - -# * GHG emission pricing policies -# * options: -# * none (not including any GHG sources), -# * redd_nosoil (Above ground CO2 emis from LUC in forest; all CH4 and N2O emissions), -# * redd_nosoil_nopeat (same as redd_nosoil but without GHG emissions from peatlands), -# * reddnatveg_nosoil (Above ground CO2 emis from LUC in forest and natveg; all CH4 and N2O emissions), -# * reddnatveg_nosoil_nopeat (same as reddnatveg_nosoil but without GHG emissions from peatlands), -# * redd+_nosoil (Above ground CO2 emis from LUC in forest and forestry; all CH4 and N2O emissions), -# * redd+_nosoil_nopeat (same as redd+_nosoil but without GHG emissions from peatlands), -# * redd+natveg_nosoil (Above ground CO2 emis from LUC in forest, forestry and natveg; all CH4 and N2O emissions), -# * redd+natveg_nosoil_nopeat (same as redd+natveg_nosoil but without GHG emissions from peatlands), -# * all (CO2 emis from LUC in all LUs; all CH4 and N2O emissions), all_nosoil (Above ground CO2 emis from LUC for all LUs; all CH4 and N2O emissions) -# * all_nosoil: Above ground CO2 emis from LUC for all LUs; all CH4 and N2O emissions -# * sdp_cropeff (only ch4 from rice), sdp_livestock (only ch4 and n2o from livestock), sdp_peatland (co2, ch4 and n2o from peatland), -# * sdp_redd (only co2 from vegc), sdp_soil (only co2 from litc and soilc), sdp_redd_soil (only co2 from vegc, litc, soilc), -# * sdp_redd_soil_peat (only co2 from vegc, litc, soilc and co2, ch4 and n2o from peatland), sdp_all (all individual sdp scenarios combined) -# * gcs_lbs (land-based mitigation: above-ground CO2 emis from LUC in forest, forestry and natveg; co2, ch4 and n2o from peatland), -# * gcs_res (mitigation in production systems: all agricultural non-CO2 emissions) -# * ecoSysProtAll: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 and N2O emis), -# * ecoSysProtForest: (Above ground CO2 emis from LUC in forest, forestry; All CH4 and N2O emis except peatland), -# * ecoSysProtPrimForest: (Above ground CO2 emis from LUC in primary forest; All CH4 and N2O emis except peatland), -# * ecoSysProtOff: (All CH4 and N2O emis except peatland), -# * ecoSysProtAll_agMgmtExclN2O: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 emis, no further N2O emis) -# * ecoSysProtAll_agMgmtExclCH4: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All N2O emis, no further CH4 emis) -# * ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) -cfg$gms$c56_emis_policy <- "reddnatveg_nosoil" # def = reddnatveg_nosoil - -# * CO2 emissions subject to carbon pricing -# * options: actual, actualNoAcEst -# * actual: CO2 emissions for pricing are based on the difference of actual carbon stocks between time steps -# * actualNoAcEst: CO2 emissions for pricing are based on actual carbon stocks but -# * without newly established forest and non-forest areas. Note that re/afforestation is covered by a separate mechanism. -c56_carbon_stock_pricing <- "actualNoAcEst" # def = actualNoAcEst - - -# ***--------------------- 57_maccs --------------------------------------- -# * (on_aug22): maccs for non-CO2 emission mitigation activated -cfg$gms$maccs <- "on_aug22" # def = on_aug22 - -# * Version of MACCs -# * options: PBL_2007, PBL_2019, PBL_2022 -cfg$gms$c57_macc_version <- "PBL_2022" # def = PBL_2022 - -# * MACC scenario (only for PBL_2022) -# * options: Default, Optimistic, Pessimistic -cfg$gms$c57_macc_scenario <- "Default" # def = Default - -# * Exogenous forced mitigation, independent of pollutant prices -# * Overwrites signal of mitigation price by choosing maximum mitigation levels -# * This avoids that emission tax is rolled over to food prices, only the -# * the mitigaton costs are rolled over to prices. -# * options: -1, 1 to 201 for each MACC mitigation step -# * -1: pollutant-price driven maccs -# * 0: inactive MACCs (price level zero) -# * 201: maximum level of mitigation -cfg$gms$s57_maxmac_n_soil <- -1 # def = -1 -cfg$gms$s57_maxmac_n_awms <- -1 # def = -1 -cfg$gms$s57_maxmac_ch4_rice <- -1 # def = -1 -cfg$gms$s57_maxmac_ch4_entferm <- -1 # def = -1 -cfg$gms$s57_maxmac_ch4_awms <- -1 # def = -1 - -# ***--------------------- 58_peatland ------------------------------------ -# * (off): Peatland area and associated GHG emissions are assumed zero -# * (v2): Peatland area is initialized with degraded and intact peatland area for the year 2022, -# * and projected into the future based on changes in managed land. -# * For boreal and tropical climates, GHG emissions are calculated using emission -# * factors from the IPCC 2013 Wetland supplement. For temperate climates, more recent -# * estimates from Tiemeyer et al 2020 are used. -cfg$gms$peatland <- "v2" # def = v2 - -# * peatland rewetting -# * options: 0 (off) -# * Inf (on) -cfg$gms$s58_rewetting_switch <- Inf # def = Inf - -# * One-time and recurring costs for peatland rewetting (USD05MER per ha) -cfg$gms$s58_cost_rewet_onetime <- 7000 # def = 7000 -cfg$gms$s58_cost_rewet_recur <- 200 # def = 200 - -# * One-time and recurring costs for peatland drainage (USD05MER per ha) -# * One-time costs apply on the drainage of intact and rewetted peatland -# * Recurring costs apply on the level of drained and managed peatland -cfg$gms$s58_cost_drain_intact_onetime <- 0 # def = 0 -cfg$gms$s58_cost_drain_rewet_onetime <- 0 # def = 0 -cfg$gms$s58_cost_drain_recur <- 0 # def = 0 - - -# * Switch for fixing peatland area until the year given by s58_fix_peatland to historic levels (not available in `off`). -# * Note: In the realisation `v2`, historic peatland area is only available for the year 2022. -# * Due to the 5-year time step limitation in MAgPIE, the suggested default is 2020. -# * Fixing peatland area in previous time steps provides a better -# * proxy for GHG emissions from peatlands than assuming no peatland area. -cfg$gms$s58_fix_peatland <- 2020 # def = 2020 - -# ***------------------------- 59_som ------------------------------------- -# * (static_jan19): static soil carbon loss for cropland -# * (cellpool_aug16): dynamic soil organic matter pool on cellular level -# * (cellpool_jan23): dynamic soil organic matter pool on cellular level -# * with updated, regionalized stock change factors (IPCC guidelines 2019) -cfg$gms$som <- "static_jan19" # def = static_jan19 - -# * static realization switch -# * options: cellular (use preprocessed cellular stock change factors) -# * cluster (use cshare_released on cluster within gams) -cfg$gms$c59_static_spatial_level <- "cellular" - -# * cellpool realization switches - -# * som climate impact scenario -# * options: cc (climate change) -# * nocc (no climate change) -# * nocc_hist (no climate change after year defined by sm_fix_cc) -cfg$gms$c59_som_scenario <- "cc" # def = "cc" - -# * irrigation feedback -# * options: on (higher carbon sequestration under irrigation) -# * off (no carbon sequestration under irrigation) -cfg$gms$c59_irrigation_scenario <- "on" # def = "on" - -# * Exogenous nr release through som loss (only in static realization) -# * options: constant (constant from 2020) -# * fadeout_2050 (fading out till 2050) -cfg$gms$c59_exo_scen <- "constant" - -# ***--------------------- 60_bioenergy ----------------------------------- -# * (1stgen_priced_dec18): exogenous and price-based 1st generation bioenergy -# * demand, 2nd generation residues exogeneous, -# * 2nd generation betr and begr coupled with REMIND. -cfg$gms$bioenergy <- "MMEmu_feb23" # def = 1stgen_priced_dec18 - -# * 1st generation bioenergy demand scenarios based on Lotze Campen (2014) -# * (phaseout2020): increase until 2020, followed by phaseout until 2050 -# * (const2020): increase until 2020, constant thereafter -# * (const2030): increase until 2030, constant thereafter -cfg$gms$c60_1stgen_biodem <- "phaseout2020" # def = const2020 - -# * 2nd generation bioenergy demand scenario -# * Note: For best consistency it is recommended to use trajectories from the most recent -# * coupled REMIND-MAgPIE runs. Currently, this is R32M46. -# * Available options: -# * none: no 2nd generation bioenergy demand -# * R32M46: Coupled REMIND-MAgPIE runs with REMIND 3.2.1.dev412 and MAgPIE 4.6.11 -# * NPi: Current policies; limit peak warming to 3.0°C -# * NDC: Nationally determined contributions; limit peak warming to 2.5°C -# * PkBudg650: Peak Budget with 650 GtCO2 until net-zero CO2 emissions; well-below 1.5°C in 2100 -# * PkBudg1050: Peak Budget with 1050 GtCO2 until net-zero CO2 emissions; well-below 2.0°C in 2100 -# * R32M46-SDP_MC-NPi, R32M46-SDP_MC-NDC, R32M46-SDP_MC-PkBudg650, -# * R32M46-SSP1-NPi, R32M46-SSP1-NDC, R32M46-SSP1-PkBudg1050, R32M46-SSP1-PkBudg650, -# * R32M46-SSP2EU-NPi, R32M46-SSP2EU-NDC, R32M46-SSP2EU-PkBudg1050, R32M46-SSP2EU-PkBudg650, -# * R32M46-SSP5-NPi, R32M46-SSP5-NDC, R32M46-SSP5-PkBudg1050, R32M46-SSP5-PkBudg650, -# * R21M42: Coupled REMIND-MAgPIE runs with REMIND 2.1 and MAgPIE 4.2 -# * NPi: Current policies; above 3.0°C in 2100 -# * PkBudg900: Budget with 900 GtCO2; well-below 1.5°C in 2100 (PkBudg1000 for SDP) -# * PkBudg1300: Budget with 1300 GtCO2; well-below 2.0°C in 2100 -# * R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, -# * R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, -# * R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, -# * R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, R21M42-SSP5-PkBudg900, -# * R2M41: Coupled REMIND-MAgPIE runs with REMIND 2.0 and MAgPIE 4.1 -# * R2M41-SSP2-NPi, R2M41-SSP2-NDC, R2M41-SSP2-Budg1300, R2M41-SSP2-Budg600, R2M41-SSP2-Budg950 -# * Standalone REMIND runs from Strefler et al 2021; well-below 2.0°C in 2100 -# * https://www.nature.com/articles/s41467-021-22211-2 -# * PIK_GDP, PIK_H2C, PIK_HBL, PIK_HOS, PIK_LIN, PIK_NPI, PIK_OPT -# * SSP Database 2018, various SSP, RCP and Model combinations -# * https://tntcat.iiasa.ac.at/SspDb -# * Caution: using trajectories from other models or older MAgPIE versions might be -# * inconsistent with the current MAgPIE version. -# * SSPDB-SSP1-20-IMAGE,SSPDB-SSP1-20-REMIND-MAGPIE, -# * SSPDB-SSP1-26-IMAGE,SSPDB-SSP1-26-REMIND-MAGPIE, -# * SSPDB-SSP1-34-IMAGE,SSPDB-SSP1-34-REMIND-MAGPIE, -# * SSPDB-SSP1-37-REMIND-MAGPIE, -# * SSPDB-SSP1-45-IMAGE,SSPDB-SSP1-45-REMIND-MAGPIE, -# * SSPDB-SSP1-Ref-IMAGE,SSPDB-SSP1-Ref-REMIND-MAGPIE, -# * SSPDB-SSP2-18-MESSAGE-GLOBIOM,SSPDB-SSP2-19-MESSAGE-GLOBIOM, -# * SSPDB-SSP2-20-MESSAGE-GLOBIOM,SSPDB-SSP2-20-REMIND-MAGPIE, -# * SSPDB-SSP2-26-MESSAGE-GLOBIOM,SSPDB-SSP2-26-REMIND-MAGPIE, -# * SSPDB-SSP2-34-MESSAGE-GLOBIOM,SSPDB-SSP2-34-REMIND-MAGPIE, -# * SSPDB-SSP2-37-REMIND-MAGPIE, -# * SSPDB-SSP2-45-MESSAGE-GLOBIOM,SSPDB-SSP2-45-REMIND-MAGPIE, -# * SSPDB-SSP2-60-MESSAGE-GLOBIOM,SSPDB-SSP2-60-REMIND-MAGPIE, -# * SSPDB-SSP2-Ref-MESSAGE-GLOBIOM,SSPDB-SSP2-Ref-REMIND-MAGPIE, -# * SSPDB-SSP3-34-AIM-CGE,SSPDB-SSP3-45-AIM-CGE, -# * SSPDB-SSP3-60-AIM-CGE,SSPDB-SSP4-26-GCAM4, -# * SSPDB-SSP4-34-GCAM4,SSPDB-SSP4-45-GCAM4, -# * SSPDB-SSP4-60-GCAM4,SSPDB-SSP4-Ref-GCAM4, -# * SSPDB-SSP5-20-REMIND-MAGPIE,SSPDB-SSP5-26-REMIND-MAGPIE, -# * SSPDB-SSP5-34-REMIND-MAGPIE,SSPDB-SSP5-37-REMIND-MAGPIE, -# * SSPDB-SSP5-45-REMIND-MAGPIE,SSPDB-SSP5-60-REMIND-MAGPIE, -# * SSPDB-SSP5-Ref-REMIND-MAGPIE, -# * Used for producing coupled runs with REMIND-MAgPIE or for exogenous input (see below) -# * coupling -# * Note: c60_2ndgen_biodem applies to countries selected in scen_countries60 -# * c60_2ndgen_biodem_noselect applies to all other countries. -cfg$gms$c60_2ndgen_biodem <- "R32M46-SSP2EU-NPi-phaseout2020" # def = R32M46-SSP2EU-NPi -cfg$gms$c60_2ndgen_biodem_noselect <- "R32M46-SSP2EU-NPi-phaseout2020" # def = R32M46-SSP2EU-NPi - -# * The following setting can be used to provide exogenous bioenergy demand -# * via a .mif file that is not part of the input data. This is currently used -# * in the REMIND-MAgPIE coupling to read in the REMIND data. -# * Takes effect only if cfg$gms$c60_2ndgen_biodem is set to "coupling" -cfg$path_to_report_bioenergy <- NA - -# * Switch and specification of countries for which 2nd gen bioenergy demand -# * scenario applies. -# * Options: list of iso-codes of countries where scenario should be applied -# * Note: must be written in the format: "IND, BRA, DEU" -# * Default: all iso countries -# * Note: Only for exogenous scenarios. Does not take any effect when "coupling" / -# * "emulator" selected. -cfg$gms$scen_countries60 <- all_iso_countries - -# * residue demand for 2nd generation bioenergy scenarios -# * options: ssp1, ssp2, ssp3, ssp4, ssp5, off -cfg$gms$c60_res_2ndgenBE_dem <- "ssp2" # def = ssp2 - -# * bioenergy demand level -# * (1): regional -# * (0): global -cfg$gms$c60_biodem_level <- 1 # def = 1 - -# * Minimum dedicated 2nd generation bioenergy demand assumed in each region (mio. GJ per yr) -# * Without a minimum demand, there is the risk that some regions won't have a price for 2nd generation bioenergy. -# * Therefore, the minimum demand is of particular importance for the coupling with REMIND. -cfg$gms$s60_2ndgen_bioenergy_dem_min <- 1 # def = 1 - -# * Minimum demand can be set to 0 for price-driven runs past the SSP2_fix -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 - -# * first generation bioenergy subsidy (USD05MER per ton) -# * for GJ-based prices post fix_SSP2 only the fix_SSP2 should be > 0 -cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 - -# * For price-based bioenergy implementation (US05MER per GJ) -cfg$gms$s60_bioenergy_gj_price_1st <- 0 # def = 0 -cfg$gms$s60_bioenergy_price_2nd <- 0 # def = 0 - -# * Shape of GJ-based price curve towards defined target price -# * Options: const : constant price equal to target price -# * exp : exponential implementation starting from 0.25 * target price in the first sm_fix_SSP2 year; steps <= sm_fix_SSP2 then fixed to 0 -# * lin : linear implementation starting from 0 in the sm_fix_SSP2 year -cfg$gms$c60_price_implementation <- "lin" # def = "lin" - - -# ***--------------------- 62_material ------------------------------------ -# * (exo_flexreg_apr16): default -cfg$gms$material <- "exo_flexreg_apr16" - -# * Biomass demand for bioplastics is based on a logistic curve projecting -# * bioplastic demand, which matches the historic demand in 2020, and is -# * defined by the maximum demand for bioplastics s62_max_dem_bioplastics -# * (in mio. tonnes) and the midpoint s62_midpoint_dem_bioplastics (i.e. -# * where bioplastic demand is half of the maximum demand). -# * If maximum demand is 0, biomass demand for bioplastic production is not included. -# * Projected total plastic use in the "Global Ambiton" scneario of the OECD is -# * about 600 mio. tonnes in 2050 -> E.g. 200 mio. tonnes in 2050 could be a -# * reasonable (but ambitious) bioplastic scenario. With midpoint 2050 this -# * would mean s62_max_dem_bioplastic = 400. -cfg$gms$s62_max_dem_bioplastic <- 0 # def = 0 -cfg$gms$s62_midpoint_dem_bioplastic <- 2050 # def = 2050 - -# ***--------------------- 70_livestock ----------------------------------- -# * (fbask_jan16): default feed basket realization -cfg$gms$livestock <- "fbask_jan16" # def = fbask_jan16 - -# * Year until the pasture management factor is fixed to 1 -cfg$gms$s70_past_mngmnt_factor_fix <- "2005" # def = 2005 - -# * feed scenario -# * options: SSP: ssp1, ssp2, ssp3, ssp4, ssp5 -# * SDP: SDP, SDP_EI, SDP_MC, SDP_RC -# * other: constant -cfg$gms$c70_feed_scen <- "ssp2" # def = ssp2 - -# * Feed substitution scenarios. -# * options consist of 3 parts: functional form (lin,sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050) -# * Example for sigmoid_50pc_20_50: -# * Functional form: sigmoid (S-shaped) -# * Target: 50percent reduction at end of transition period (2050 in this case) -# * Transition period: start in 2020, end in 2050 -# * options: constant, -# * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, -# * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, -# * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 -# * Cereal feed substituted by SCP -cfg$gms$c70_cereal_scp_scen <- "constant" # def = constant -# * Fodder feed substituted by SCP -cfg$gms$c70_foddr_scp_scen <- "constant" # def = constant - -# * Regional (reg) or global (glo) regression for livestock factor requirements. -# * Typically, the same version (glo or reg) should be chosen for c38_fac_req -# * for consistency. -cfg$gms$c70_fac_req_regr <- "glo" # def = glo - -# ***--------------------- 71_disagg_lvst ----------------------------------- -# * (off): default -# * (foragebased_aug18): Disaggregation of livestock to cells -# * with high pasture and fodder availability -# * (foragebased_jul23): Disaggregation of livestock to cells -# * with high pasture and fodder availability -# * (improved and flexibitized) -cfg$gms$disagg_lvst <- "foragebased_jul23" # def = foragebased_jul23 - - -# ***--------------------- 73_timber ----------------------------------- -# * (default): Demand and production of timber products -cfg$gms$timber <- "default" # def = default - -# Logical switch to turn on or off timber demand (wood and woodfuel). -# Note that "on" requires dynamic timber plantations (s32_hvarea=2 and s35_hvarea=2) -# for actual results. -# Vice-versa, in the "off" case, timber plantations should be static (s32_hvarea=0/1 and s35_hvarea=0/1) -# for a simplified representation of land demand for timber production from plantations -# (implicitly assuming the same rate for plantation harvest and establishment). -# * 1=on -# * 0=off -cfg$gms$s73_timber_demand_switch <- 0 # def = 0 - -# Setting to define if the model should be forward looking or not in terms of -# seeing the future demand for current timestep establishment of new plantations -# in the forward setting, the model sees only current demand for establishment -# decisions in the historical time period but then sees future demand for non -# historic time periods. In myopic setting, the model sees always the current -# timber demand for establishment decisions. -# * 1 = forward looking. Model sees future demand for establishment in current step -# * 0 = myopic. Model sees current demand for establishment in current step -cfg$gms$s73_foresight <- 0 # def = 0 - -# harvesting cost per ton of dry matter produced (USD/tDM) -s73_timber_prod_cost <- 2000 # def = 2000 - -# harvesting cost per ha of forests (USD/ha) -s73_timber_harvest_cost <- 2000 # def = 2000 - -# Cost multiplier for harvesting costs to make natural vegetation harvest expensive -# than timber plantation harvest. This provides a signal to the model to harvest -# timber plantations first. -s73_cost_multiplier <- 1.5 # def = 1.5 - -# Cost of production without using any land in case the model is running into infeasibilities. -# This is a last ditch effort for the model and the variable associated with this cost -# should not be used in a normally feasible model run (USD/tDM) -s73_free_prod_cost <- 1000000 # def = 1000000 - -# Switch for modifying woody biomass demand starting in 2035 -# * ("default") = Default paper demand -# * ("nopaper") = Diminishing paper demand -# * ("construction") = Higher demand for construction wood in future -cfg$gms$c73_wood_scen <- "default" # def = "default" - -# Building material demand -# * ("BAU") = Business as usual, only 0.5% of urban dwellers need timber buildings -# * ("10pc") = 10% of urban dwellers need timber buildings -# * ("50pc") = 50% of urban dwellers need timber buildings -# * ("90pc") = 90% of urban dwellers need timber buildings - -cfg$gms$c73_build_demand <- "BAU" # def = "BAU" - -# Linearized multiplier for scaling construction wood demand for easier demand -# scenario tests. The expansion factor is applied over next 80 years starting in -# 2020. -cfg$gms$s73_expansion <- 0 # def = 0 - -# ***------------------- 80_optimization ------------------------------------ -# * (nlp_apr17): solve procedure solving the whole, nonlinear problem -# * at once -# * (lp_nlp_apr17): alternative approach in which the nonlinear terms are -# * fixed first so that the linear problem can be solved -# * before the full problem is solved -# * (nlp_par): Parallel optimization of regions. Allows to use higher -# * spatial resolution but works only with exogenous trade patterns -# * from a run with lower resolution solved with nlp_apr17. -# * Usage: add "extra/highres" as output script. This will start a -# * second model run with higher resolution. -# * Make sure that the cellular input file specified in -# * scripts/output/extra/highres.R exists. -# * See scripts/output/extra/highres.R for details. - -cfg$gms$optimization <- "nlp_apr17" # def = nlp_apr17 - -# maximal number of solve iterations -cfg$gms$s80_maxiter <- 30 - -# * (conopt3): conopt3 -# * (conopt4): conopt4 -# * (conopt4+cplex): conopt4 followed by cplex with landdiff optimization -# * (conopt4+conopt3): conopt4 followed by conopt3 -cfg$gms$c80_nlp_solver <- "conopt4" # def = conopt4 - -# * 1: using optfile for specified solver settings -# * 0: default settings (optfile will be ignored) -cfg$gms$s80_optfile <- 1 - - -#*******************************END MODULE SETUP******************************** - -#### Other settings (e.g. clustering, gdx files, ...): #### - -# Choosing scenario for coupling with MAGICC for emissions outside the food system -# (options) bjoernAR6_C_RemSDP-900-MagSSP1.mif, bjoernAR6_C_RemSSP1-1000-MagSDP.mif, -# bjoernAR6_C_SDP-NPi.mif, bjoernAR6_C_SDP-PkBudg1000.mif, -# bjoernAR6_C_SSP1-Base.mif, bjoernAR6_C_SSP1-NDC.mif, -# bjoernAR6_C_SSP1-NPi.mif, bjoernAR6_C_SSP1-PkBudg900.mif, -# bjoernAR6_C_SSP2-Base.mif, bjoernAR6_C_SSP2-NDC.mif, -# bjoernAR6_C_SSP2-NPi.mif, bjoernAR6_C_SSP2-PkBudg900.mif -cfg$magicc_emis_scen <- "bjoernAR6_C_SSP2-NDC.mif" - -# Decide whether the runs should be run sequentially (TRUE), -# or in parallel (FALSE) -# NA means that this decision is taken automatically -# (typically on cluster = FALSE and locally = TRUE) -cfg$sequential <- NA - -# Selection of QOS to be used for submitted runs on cluster. -# Will be ignored for all other runs. -# * options: short (24h max, no preemption) -# * short_maxMem (same as short but with 16 CPUs and max Memory) -# * medium (1 week max, no preemption) -# * priority (immediate start, but slots limited to 5 in parallel) -# * priority_maxMem (same as priority but with 16 CPUs and max Memory) -# * standby (1 week max, preemption possible) -# * standby_dayMax (24h max, preemption possible) -# * standby_maxMem_dayMax (same as standby_dayMax but with 16 CPUs and max Memory) -# * standby_maxMem (same as standby but with 16 CPUs and max Memory) -# * NULL (educated guess of best option based -# * available resources) -cfg$qos <- NULL # def = NULL - -# How should log information be treated? -# (0:no output, 2:write to full.log 3:show in console) -cfg$logoption <- 2 - -# Should output.R generate output? -# List of output scripts that should be used -# Available scripts can be found in scripts/output/ -cfg$output <- c("output_check", "extra/disaggregation", "rds_report") - -# Set the format for the results folder -# :date: is a placeholder for the current time stamp (e.g. "results:date:") -# :title: is a placeholder for the current run title (cfg$title) -cfg$results_folder <- "output/:title::date:" - -# Results folder used by the "highres.R" output script -# If NULL, the default set in "highres.R" is used (currently a subfolder in "output") -# To place highres runs directly in the "output" folder, change to "output" -# To place highres runs in a specific subfolder change to "output/HR" -cfg$results_folder_highres <- NULL - -# Which files should be copied into the output folder? -cfg$files2export <- list() -# Files that should be copied before MAgPIE is started -cfg$files2export$start <- c("input/info.txt", - "input/avl_land_full_t_0.5.mz", - "input/luh2_side_layers_0.5.mz", - "modules/14_yields/input/lpj_yields_0.5.mz", - "modules/22_land_conservation/input/wdpa_baseline_0.5.mz", - "modules/22_land_conservation/input/consv_prio_areas_0.5.mz", - "modules/30_crop/endo_apr21/input/avl_cropland_0.5.mz", - "modules/50_nr_soil_budget/input/f50_NitrogenFixationRateNatural_0.5.mz", - "modules/50_nr_soil_budget/input/f50_AtmosphericDepositionRates_0.5.mz", - "input/f34_urbanland_0.5.mz", - "input/spatial_header.rda", - "scripts/run_submit/submit.R", - "scripts/run_submit/submit_*.sh", - ".Rprofile", - "input/clustermap*.rds", - "input/lpj_envflow_total_*.mz", - "input/lpj_watavail_total_*.mz", - "input/validation.mif", - "calib_*.cs3", - "land_conversion_cost_calib_*.cs3", - "input/spamplot_*.pdf", - "input/regionmapping*.csv", - "input/kba_land_0.5.mz", - "input/f58_peatland_area_0.5.mz") - -# Files that should be copied after the MAgPIE run is finished -cfg$files2export$end <- NULL - -# Expert use only, should not be set manually. Path to a renv.lock file -# defining the package environment for newly started runs. -cfg$renv_lock <- NULL - -# Folder run statistics should be submitted to -cfg$runstatistics <- "/p/projects/rd3mod/models/statistics/magpie" - -# name of the overall model (just used for reporting purposes) -# should usually not be changed -cfg$model_name <- "MAgPIE" - -# a list of additional information characterizing this run. Can be used -# to save relevant information about the run and can, in contrast to all other -# setting, contain list elements which do not exist in the reference -# configuration -cfg$info <- list() - -# Should the restart files of each iteration be kept in the output folder (TRUE) -# or deleted after the run finished (FALSE) -cfg$keep_restarts <- FALSE - -# Should the model run in developer mode? This will loosen some restrictions, -# such as temporary toleration of coding etiquette violations -# Please make sure to set it to FALSE for production runs! -cfg$developer_mode <- FALSE - -# Should the model run in debug mode? -# Download script will copy files from input to destination folder instead of -# moving it allowing to check whether something in the move/copy process goes -# wrong -cfg$debug <- FALSE - -################################################################################ diff --git a/modules/30_crop/endo_apr21/equations.gms b/modules/30_crop/endo_apr21/equations.gms index 30586c6aef..4db5a7a40e 100644 --- a/modules/30_crop/endo_apr21/equations.gms +++ b/modules/30_crop/endo_apr21/equations.gms @@ -72,6 +72,7 @@ (vm_land(j2,"crop") - sum((crop_ann30,w), vm_area(j2,crop_ann30,w))) * fm_bii_coeff("crop_per",potnatveg) * fm_luh2_side_layers(j2,potnatveg); +*' regional cropland area is calculated for the cropland growth constraint q30_crop_reg(i2) .. v30_crop_area(i2) =e= sum(cell(i2,j2), vm_land(j2,"crop")); diff --git a/modules/30_crop/endo_apr21/presolve.gms b/modules/30_crop/endo_apr21/presolve.gms index 31512706ca..ebc93a828d 100644 --- a/modules/30_crop/endo_apr21/presolve.gms +++ b/modules/30_crop/endo_apr21/presolve.gms @@ -37,6 +37,7 @@ p30_snv_shr(t,j) = p30_snv_scenario_fader(t) * p30_avl_cropland(t,j) = f30_avl_cropland(j,"%c30_marginal_land%") * (1 - p30_snv_shr(t,j)); *' @stop +*' Cropland growth constraint after SSP2 fix if(m_year(t) <= sm_fix_SSP2, v30_crop_area.up(i) = Inf; else diff --git a/modules/30_crop/penalty_apr22/declarations.gms b/modules/30_crop/penalty_apr22/declarations.gms index 9f5120b9ca..2d3a4e3f40 100644 --- a/modules/30_crop/penalty_apr22/declarations.gms +++ b/modules/30_crop/penalty_apr22/declarations.gms @@ -23,6 +23,7 @@ positive variables vm_rotation_penalty(i) Penalty for violating rotational constraints (mio. USD05MER) v30_penalty_max_irrig(j,rotamax30) Penalty for violating max rotational constraints on irrigated land (mio. USD05MER) v30_penalty(j,rota30) Penalty for violating rotational constraints (mio. USD05MER) + v30_crop_area(i) Total regional crop production area (mio. ha) ; equations @@ -37,6 +38,7 @@ equations q30_bv_ann(j,potnatveg) Biodiversity value of annual cropland (mio. ha) q30_bv_per(j,potnatveg) Biodiversity value of perennial cropland (mio. ha) q30_land_snv(j) Land constraint for the SNV policy in cropland areas (mio. ha) + q30_crop_reg(i) Total regional crop production area (mio. ha) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### @@ -46,6 +48,7 @@ parameters ov_rotation_penalty(t,i,type) Penalty for violating rotational constraints (mio. USD05MER) ov30_penalty_max_irrig(t,j,rotamax30,type) Penalty for violating max rotational constraints on irrigated land (mio. USD05MER) ov30_penalty(t,j,rota30,type) Penalty for violating rotational constraints (mio. USD05MER) + ov30_crop_area(t,i,type) Total regional crop production area (mio. ha) oq30_cropland(t,j,type) Total cropland calculation (mio. ha) oq30_avl_cropland(t,j,type) Available cropland constraint (mio. ha) oq30_rotation_penalty(t,i,type) Total penalty for rotational constraint violations (mio. USD05MER) @@ -57,6 +60,7 @@ parameters oq30_bv_ann(t,j,potnatveg,type) Biodiversity value of annual cropland (mio. ha) oq30_bv_per(t,j,potnatveg,type) Biodiversity value of perennial cropland (mio. ha) oq30_land_snv(t,j,type) Land constraint for the SNV policy in cropland areas (mio. ha) + oq30_crop_reg(t,i,type) Total regional crop production area (mio. ha) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/30_crop/penalty_apr22/equations.gms b/modules/30_crop/penalty_apr22/equations.gms index bb649fa47f..e53972bb4e 100644 --- a/modules/30_crop/penalty_apr22/equations.gms +++ b/modules/30_crop/penalty_apr22/equations.gms @@ -102,3 +102,8 @@ q30_rotation_penalty(i2) .. =e= (vm_land(j2,"crop") - sum((crop_ann30,w), vm_area(j2,crop_ann30,w))) * fm_bii_coeff("crop_per",potnatveg) * fm_luh2_side_layers(j2,potnatveg); + +*' regional cropland area is calculated for the cropland growth constraint + q30_crop_reg(i2) .. v30_crop_area(i2) + =e= + sum(cell(i2,j2), vm_land(j2,"crop")); diff --git a/modules/30_crop/penalty_apr22/input.gms b/modules/30_crop/penalty_apr22/input.gms index 22bc0de7d0..1734221dd9 100644 --- a/modules/30_crop/penalty_apr22/input.gms +++ b/modules/30_crop/penalty_apr22/input.gms @@ -33,6 +33,7 @@ s30_snv_scenario_start SNV scenario start year / 2020 / s30_snv_scenario_target SNV scenario target year / 2030 / s30_rotation_scenario_start Rotation scenario start year / 2020 / s30_rotation_scenario_target Rotation scenario target year / 2050 / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / ; * Set-switch for countries affected by regional SNV policy diff --git a/modules/30_crop/penalty_apr22/postsolve.gms b/modules/30_crop/penalty_apr22/postsolve.gms index 1f3170e857..8adb586dd2 100644 --- a/modules/30_crop/penalty_apr22/postsolve.gms +++ b/modules/30_crop/penalty_apr22/postsolve.gms @@ -12,6 +12,7 @@ ov_rotation_penalty(t,i,"marginal") = vm_rotation_penalty.m(i); ov30_penalty_max_irrig(t,j,rotamax30,"marginal") = v30_penalty_max_irrig.m(j,rotamax30); ov30_penalty(t,j,rota30,"marginal") = v30_penalty.m(j,rota30); + ov30_crop_area(t,i,"marginal") = v30_crop_area.m(i); oq30_cropland(t,j,"marginal") = q30_cropland.m(j); oq30_avl_cropland(t,j,"marginal") = q30_avl_cropland.m(j); oq30_rotation_penalty(t,i,"marginal") = q30_rotation_penalty.m(i); @@ -23,11 +24,13 @@ oq30_bv_ann(t,j,potnatveg,"marginal") = q30_bv_ann.m(j,potnatveg); oq30_bv_per(t,j,potnatveg,"marginal") = q30_bv_per.m(j,potnatveg); oq30_land_snv(t,j,"marginal") = q30_land_snv.m(j); + oq30_crop_reg(t,i,"marginal") = q30_crop_reg.m(i); ov_fallow(t,j,"level") = vm_fallow.l(j); ov_area(t,j,kcr,w,"level") = vm_area.l(j,kcr,w); ov_rotation_penalty(t,i,"level") = vm_rotation_penalty.l(i); ov30_penalty_max_irrig(t,j,rotamax30,"level") = v30_penalty_max_irrig.l(j,rotamax30); ov30_penalty(t,j,rota30,"level") = v30_penalty.l(j,rota30); + ov30_crop_area(t,i,"level") = v30_crop_area.l(i); oq30_cropland(t,j,"level") = q30_cropland.l(j); oq30_avl_cropland(t,j,"level") = q30_avl_cropland.l(j); oq30_rotation_penalty(t,i,"level") = q30_rotation_penalty.l(i); @@ -39,11 +42,13 @@ oq30_bv_ann(t,j,potnatveg,"level") = q30_bv_ann.l(j,potnatveg); oq30_bv_per(t,j,potnatveg,"level") = q30_bv_per.l(j,potnatveg); oq30_land_snv(t,j,"level") = q30_land_snv.l(j); + oq30_crop_reg(t,i,"level") = q30_crop_reg.l(i); ov_fallow(t,j,"upper") = vm_fallow.up(j); ov_area(t,j,kcr,w,"upper") = vm_area.up(j,kcr,w); ov_rotation_penalty(t,i,"upper") = vm_rotation_penalty.up(i); ov30_penalty_max_irrig(t,j,rotamax30,"upper") = v30_penalty_max_irrig.up(j,rotamax30); ov30_penalty(t,j,rota30,"upper") = v30_penalty.up(j,rota30); + ov30_crop_area(t,i,"upper") = v30_crop_area.up(i); oq30_cropland(t,j,"upper") = q30_cropland.up(j); oq30_avl_cropland(t,j,"upper") = q30_avl_cropland.up(j); oq30_rotation_penalty(t,i,"upper") = q30_rotation_penalty.up(i); @@ -55,11 +60,13 @@ oq30_bv_ann(t,j,potnatveg,"upper") = q30_bv_ann.up(j,potnatveg); oq30_bv_per(t,j,potnatveg,"upper") = q30_bv_per.up(j,potnatveg); oq30_land_snv(t,j,"upper") = q30_land_snv.up(j); + oq30_crop_reg(t,i,"upper") = q30_crop_reg.up(i); ov_fallow(t,j,"lower") = vm_fallow.lo(j); ov_area(t,j,kcr,w,"lower") = vm_area.lo(j,kcr,w); ov_rotation_penalty(t,i,"lower") = vm_rotation_penalty.lo(i); ov30_penalty_max_irrig(t,j,rotamax30,"lower") = v30_penalty_max_irrig.lo(j,rotamax30); ov30_penalty(t,j,rota30,"lower") = v30_penalty.lo(j,rota30); + ov30_crop_area(t,i,"lower") = v30_crop_area.lo(i); oq30_cropland(t,j,"lower") = q30_cropland.lo(j); oq30_avl_cropland(t,j,"lower") = q30_avl_cropland.lo(j); oq30_rotation_penalty(t,i,"lower") = q30_rotation_penalty.lo(i); @@ -71,4 +78,5 @@ oq30_bv_ann(t,j,potnatveg,"lower") = q30_bv_ann.lo(j,potnatveg); oq30_bv_per(t,j,potnatveg,"lower") = q30_bv_per.lo(j,potnatveg); oq30_land_snv(t,j,"lower") = q30_land_snv.lo(j); + oq30_crop_reg(t,i,"lower") = q30_crop_reg.lo(i); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/30_crop/penalty_apr22/presolve.gms b/modules/30_crop/penalty_apr22/presolve.gms index 35ec026f8a..9e06ed2d39 100644 --- a/modules/30_crop/penalty_apr22/presolve.gms +++ b/modules/30_crop/penalty_apr22/presolve.gms @@ -32,3 +32,10 @@ p30_avl_cropland(t,j) = f30_avl_cropland(j,"%c30_marginal_land%") * (1 - p30_snv * only activate constraints which are binding rotamax_red30(rotamax30) = yes$(i30_rotation_incentives(t,rotamax30) > 0); rotamin_red30(rotamin30) = yes$(i30_rotation_incentives(t,rotamin30) > 0); + +*' Cropland growth constraint after SSP2 fix +if(m_year(t) <= sm_fix_SSP2, + v30_crop_area.up(i) = Inf; +else + v30_crop_area.up(i) = v30_crop_area.l(i) * (1 + s30_annual_max_growth) ** m_yeardiff(t); +); diff --git a/modules/30_crop/rotation_apr22/declarations.gms b/modules/30_crop/rotation_apr22/declarations.gms index 4fd7cb47e2..d27cc3a1c8 100644 --- a/modules/30_crop/rotation_apr22/declarations.gms +++ b/modules/30_crop/rotation_apr22/declarations.gms @@ -22,6 +22,7 @@ positive variables vm_fallow(j) Fallow land (mio. ha) vm_area(j,kcr,w) Agricultural production area (mio. ha) vm_rotation_penalty(i) Penalty for violating rotational constraints (USD05MER) + v30_crop_area(i) Total regional crop production area (mio. ha) ; equations @@ -34,7 +35,8 @@ equations q30_carbon(j,ag_pools,stockType) Cropland above ground carbon content calculation (mio. tC) q30_bv_ann(j,potnatveg) Biodiversity value of annual cropland (mio. ha) q30_bv_per(j,potnatveg) Biodiversity value of perennial cropland (mio. ha) - q30_land_snv(j) Land constraint for the SNV policy in cropland areas (mio. ha) + q30_land_snv(j) Land constraint for the SNV policy in cropland areas (mio. ha) + q30_crop_reg(i) Total regional crop production area (mio. ha) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### @@ -42,6 +44,7 @@ parameters ov_fallow(t,j,type) Fallow land (mio. ha) ov_area(t,j,kcr,w,type) Agricultural production area (mio. ha) ov_rotation_penalty(t,i,type) Penalty for violating rotational constraints (USD05MER) + ov30_crop_area(t,i,type) Total regional crop production area (mio. ha) oq30_cropland(t,j,type) Total cropland calculation (mio. ha) oq30_avl_cropland(t,j,type) Available cropland constraint (mio. ha) oq30_rotation_max(t,j,rotamax30,type) Local maximum rotational constraints (mio. ha) @@ -52,6 +55,7 @@ parameters oq30_bv_ann(t,j,potnatveg,type) Biodiversity value of annual cropland (mio. ha) oq30_bv_per(t,j,potnatveg,type) Biodiversity value of perennial cropland (mio. ha) oq30_land_snv(t,j,type) Land constraint for the SNV policy in cropland areas (mio. ha) + oq30_crop_reg(t,i,type) Total regional crop production area (mio. ha) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/30_crop/rotation_apr22/equations.gms b/modules/30_crop/rotation_apr22/equations.gms index d3db06641a..9938020200 100644 --- a/modules/30_crop/rotation_apr22/equations.gms +++ b/modules/30_crop/rotation_apr22/equations.gms @@ -83,3 +83,8 @@ =e= (vm_land(j2,"crop") - sum((crop_ann30,w), vm_area(j2,crop_ann30,w))) * fm_bii_coeff("crop_per",potnatveg) * fm_luh2_side_layers(j2,potnatveg); + +*' regional cropland area is calculated for the cropland growth constraint + q30_crop_reg(i2) .. v30_crop_area(i2) + =e= + sum(cell(i2,j2), vm_land(j2,"crop")); diff --git a/modules/30_crop/rotation_apr22/input.gms b/modules/30_crop/rotation_apr22/input.gms index 38c2288b78..1b6bb49c87 100644 --- a/modules/30_crop/rotation_apr22/input.gms +++ b/modules/30_crop/rotation_apr22/input.gms @@ -33,6 +33,7 @@ s30_snv_scenario_start SNV scenario start year / 2020 / s30_snv_scenario_target SNV scenario target year / 2030 / s30_rotation_scenario_start Rotation scenario start year / 2020 / s30_rotation_scenario_target Rotation scenario target year / 2050 / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / ; * Set-switch for countries affected by regional SNV policy diff --git a/modules/30_crop/rotation_apr22/postsolve.gms b/modules/30_crop/rotation_apr22/postsolve.gms index f0dddfe6f9..df8f34f52e 100644 --- a/modules/30_crop/rotation_apr22/postsolve.gms +++ b/modules/30_crop/rotation_apr22/postsolve.gms @@ -10,6 +10,7 @@ ov_fallow(t,j,"marginal") = vm_fallow.m(j); ov_area(t,j,kcr,w,"marginal") = vm_area.m(j,kcr,w); ov_rotation_penalty(t,i,"marginal") = vm_rotation_penalty.m(i); + ov30_crop_area(t,i,"marginal") = v30_crop_area.m(i); oq30_cropland(t,j,"marginal") = q30_cropland.m(j); oq30_avl_cropland(t,j,"marginal") = q30_avl_cropland.m(j); oq30_rotation_max(t,j,rotamax30,"marginal") = q30_rotation_max.m(j,rotamax30); @@ -20,9 +21,11 @@ oq30_bv_ann(t,j,potnatveg,"marginal") = q30_bv_ann.m(j,potnatveg); oq30_bv_per(t,j,potnatveg,"marginal") = q30_bv_per.m(j,potnatveg); oq30_land_snv(t,j,"marginal") = q30_land_snv.m(j); + oq30_crop_reg(t,i,"marginal") = q30_crop_reg.m(i); ov_fallow(t,j,"level") = vm_fallow.l(j); ov_area(t,j,kcr,w,"level") = vm_area.l(j,kcr,w); ov_rotation_penalty(t,i,"level") = vm_rotation_penalty.l(i); + ov30_crop_area(t,i,"level") = v30_crop_area.l(i); oq30_cropland(t,j,"level") = q30_cropland.l(j); oq30_avl_cropland(t,j,"level") = q30_avl_cropland.l(j); oq30_rotation_max(t,j,rotamax30,"level") = q30_rotation_max.l(j,rotamax30); @@ -33,9 +36,11 @@ oq30_bv_ann(t,j,potnatveg,"level") = q30_bv_ann.l(j,potnatveg); oq30_bv_per(t,j,potnatveg,"level") = q30_bv_per.l(j,potnatveg); oq30_land_snv(t,j,"level") = q30_land_snv.l(j); + oq30_crop_reg(t,i,"level") = q30_crop_reg.l(i); ov_fallow(t,j,"upper") = vm_fallow.up(j); ov_area(t,j,kcr,w,"upper") = vm_area.up(j,kcr,w); ov_rotation_penalty(t,i,"upper") = vm_rotation_penalty.up(i); + ov30_crop_area(t,i,"upper") = v30_crop_area.up(i); oq30_cropland(t,j,"upper") = q30_cropland.up(j); oq30_avl_cropland(t,j,"upper") = q30_avl_cropland.up(j); oq30_rotation_max(t,j,rotamax30,"upper") = q30_rotation_max.up(j,rotamax30); @@ -46,9 +51,11 @@ oq30_bv_ann(t,j,potnatveg,"upper") = q30_bv_ann.up(j,potnatveg); oq30_bv_per(t,j,potnatveg,"upper") = q30_bv_per.up(j,potnatveg); oq30_land_snv(t,j,"upper") = q30_land_snv.up(j); + oq30_crop_reg(t,i,"upper") = q30_crop_reg.up(i); ov_fallow(t,j,"lower") = vm_fallow.lo(j); ov_area(t,j,kcr,w,"lower") = vm_area.lo(j,kcr,w); ov_rotation_penalty(t,i,"lower") = vm_rotation_penalty.lo(i); + ov30_crop_area(t,i,"lower") = v30_crop_area.lo(i); oq30_cropland(t,j,"lower") = q30_cropland.lo(j); oq30_avl_cropland(t,j,"lower") = q30_avl_cropland.lo(j); oq30_rotation_max(t,j,rotamax30,"lower") = q30_rotation_max.lo(j,rotamax30); @@ -59,4 +66,5 @@ oq30_bv_ann(t,j,potnatveg,"lower") = q30_bv_ann.lo(j,potnatveg); oq30_bv_per(t,j,potnatveg,"lower") = q30_bv_per.lo(j,potnatveg); oq30_land_snv(t,j,"lower") = q30_land_snv.lo(j); + oq30_crop_reg(t,i,"lower") = q30_crop_reg.lo(i); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/30_crop/rotation_apr22/presolve.gms b/modules/30_crop/rotation_apr22/presolve.gms index 989bc33c34..6598009c50 100644 --- a/modules/30_crop/rotation_apr22/presolve.gms +++ b/modules/30_crop/rotation_apr22/presolve.gms @@ -34,3 +34,10 @@ rotamax_red30(rotamax30) = yes$(i30_rotation_max_shr(t,rotamax30) < 1); rotamin_red30(rotamin30) = yes$(i30_rotation_min_shr(t,rotamin30) > 0); vm_rotation_penalty.fx(i)=0; + +*' Cropland growth constraint after SSP2 fix +if(m_year(t) <= sm_fix_SSP2, + v30_crop_area.up(i) = Inf; +else + v30_crop_area.up(i) = v30_crop_area.l(i) * (1 + s30_annual_max_growth) ** m_yeardiff(t); +); From 4c87f0d4c35a47b55c961572f528135b0f2c45b5 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 1 Mar 2024 18:25:42 +0100 Subject: [PATCH 063/259] update Changelog --- CHANGELOG.md | 8 +- scripts/output/extra/disaggregation_old.R | 416 ---------------------- 2 files changed, 7 insertions(+), 417 deletions(-) delete mode 100644 scripts/output/extra/disaggregation_old.R diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c45ea23d9..aab3556d64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **default.cfg** changed default for `cfg$gms$s56_buffer_aff` from 0.2 to 0.5 - **default.cfg** changed default for `cfg$gms$s32_aff_prot` from 0 to 1 - **21_trade** s21_trade_bal_damper for roundwood changed from 0.75 to 0.65 +- **44_biodiversity** update `bii_target realization` to take `f44_rr_layer` into account in `q44_bii` ### added - **32_forestry** new interfaces `vm_land_forestry`, `pcm_land_forestry` `vm_landexpansion_forestry` and `vm_landreduction_forestry` @@ -35,7 +36,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). `s60_bioenergy_price_2nd`, `c60_price_implementation` - **core** added `coup2110`timesteps - **15_food** added additional sigmoid food substition scenarios `sigmoid_75pc_25_50`, `sigmoid_50pc_25_50` and `sigmoid_25pc_25_50` -- **30_crop** Add regional cropland equation `q30_crop_reg` and presolve growth constraint +- **30_crop** added regional cropland equation `q30_crop_reg` and presolve growth constraint +- **32_forestry** added cluster-level new afforestation area constraint +- **60_bioenergy** added new realization `1st2ndgen_priced_feb24` to enable price-driven 2nd gen bioenergy production +- **scripts** added automatic set writer for new bioenergy realization to `start_functions` +- **scripts** added start scripts for the GENIE project +- **scenario_config.csv** added preset for GENIE project ### removed - **default.cfg** Removed description of cfg$gms$c31_past_suit_scen since no longer needed due to changes in 31_past described below. Its function is now done by cfg$gms$c31_grassl_yld_scenario. diff --git a/scripts/output/extra/disaggregation_old.R b/scripts/output/extra/disaggregation_old.R deleted file mode 100644 index 41c2438ab2..0000000000 --- a/scripts/output/extra/disaggregation_old.R +++ /dev/null @@ -1,416 +0,0 @@ -# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# -------------------------------------------------------------- -# description: Interpolates land pools to 0.5 degree resolution -# comparison script: FALSE -# --------------------------------------------------------------- - -library(lucode2) -library(magpie4) -library(luscale) -library(madrat) -library(dplyr) -library(gms) - -# ============================================= -# Basic configuration -# ============================================= -if (!exists("source_include")) { - outputdir <- "output/LAMA65_Sustainability/" - readArgs("outputdir") -} -map_file <- Sys.glob(file.path(outputdir, "clustermap_*.rds")) -gdx <- file.path(outputdir, "fulldata.gdx") -land_hr_file <- file.path(outputdir, "avl_land_full_t_0.5.mz") -urban_land_hr_file <- file.path(outputdir, "f34_urbanland_0.5.mz") -land_hr_out_file <- file.path(outputdir, "cell.land_0.5.mz") -land_hr_share_out_file <- file.path(outputdir, "cell.land_0.5_share.mz") -croparea_hr_share_out_file <- file.path(outputdir, "cell.croparea_0.5_share.mz") -land_hr_split_file <- file.path(outputdir, "cell.land_split_0.5.mz") -land_hr_shr_split_file <- file.path(outputdir, "cell.land_split_0.5_share.mz") -luh_side_layers <- file.path(outputdir, "luh2_side_layers_0.5.mz") -bii_hr_out_file <- file.path(outputdir, "cell.bii_0.5.mz") - -cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) - -withr::local_options(list(magclass_sizeLimit = 1e+12)) - -if (length(map_file) == 0) stop("Could not find map file!") -if (length(map_file) > 1) { - warning("More than one map file found. First occurrence will be used!") - map_file <- map_file[1] -} - - -# ----------------------------------------- -# Output functions -# ----------------------------------------- - -.writeDisagg <- function(x, file, comment, message) { - write.magpie(x, file, comment = comment) - write.magpie(x, sub(".mz", ".nc", file), comment = comment, verbose = FALSE) -} - -.dissagcrop <- function(gdx, land_hr, map) { - area <- croparea(gdx, - level = "cell", products = "kcr", - product_aggr = FALSE, water_aggr = FALSE - ) - fallow <- fallow(gdx, level = "cell") - area_shr <- area / (dimSums(area, dim = 3) + setNames(fallow, NULL) + 10^-10) - - # calculate share of crop land on total cell area - crop_shr <- land_hr / dimSums(land_hr, dim = 3) - crop_shr <- setNames(crop_shr[, getYears(area_shr), "crop"], NULL) - - # calculate crop area as share of total cell area - area_shr_hr <- madrat::toolAggregate(area_shr, map, to = "cell") * crop_shr - return(area_shr_hr) -} - -.dissagBII <- function(gdx, map, dir) { - # Biodiversity intactness indicator (BII) at cluster level - bii_lr <- BII(gdx, - file = NULL, level = "cell", mode = "auto", landClass = "all", - bii_coeff = NULL, side_layers = NULL, dir = dir - ) - - # add BII values for primary other land (BII = 1) - bii_lr <- mbind( - bii_lr[, , "other", invert = TRUE], - setNames(bii_lr[, , "other"], c("primother.forested", "primother.nonforested")), - setNames(bii_lr[, , "other"], c("secdother.forested", "secdother.nonforested")) - ) - bii_lr[, , c("primother.forested", "primother.nonforested")] <- 1 - - # Disaggregate BII coefficients to grid cell level - bii_hr <- toolAggregate(x = bii_lr, rel = map_file, from = "cluster", to = "cell") - return(bii_hr) -} - -.extend2luhv2 <- function(x, land = deparse(substitute(x))) { - if (land == "land_lr") { - grassland_areas <- readGDX(gdx, "ov31_grass_area")[, , "level"] - grassland_areas <- collapseNames(grassland_areas) - land_lr <- mbind(x, grassland_areas) - drop_past <- !grepl("past$", getNames(land_lr)) - land_lr <- land_lr[, , drop_past] - getNames(land_lr) <- gsub("pastr", "past", getNames(land_lr)) - return(land_lr) - } - - if (land == "land_ini_lr") { - grassland_areas <- readGDX(gdx, "ov31_grass_area")[, "y1995", "level"] - grassland_areas <- collapseNames(grassland_areas) - land_ini_lr <- mbind(x, grassland_areas) - drop_past <- !grepl("past$", getNames(land_ini_lr)) - land_ini_lr <- land_ini_lr[, , drop_past] - getNames(land_ini_lr) <- gsub("pastr", "past", getNames(land_ini_lr)) - return(land_ini_lr) - } -} - -# ======================================== -# Prepare data for disaggregation -# ======================================== - -# Load input data -land_ini_lr <- readGDX(gdx, "f10_land", "f_land", format = "first_found")[, "y1995", ] -land_lr <- land(gdx, sum = FALSE, level = "cell") -land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] - -### Make sure grassland types are consistent -magpie2luh2 <- data.frame(matrix(nrow = 4, ncol = 2)) -names(magpie2luh2) <- c("MAgPIE", "LUH2") -magpie2luh2[1, ] <- c("crop", "crop") -magpie2luh2[4, ] <- c("urban", "urban") -magpie2luh2[5, ] <- c("primforest", "primforest") -magpie2luh2[6, ] <- c("secdforest", "secdforest") -magpie2luh2[7, ] <- c("forestry", "forestry") -magpie2luh2[8, ] <- c("other", "primother") -magpie2luh2[9, ] <- c("other", "secdother") - -if (grepl("grass", cfg$gms$past)) { - land_lr <- .extend2luhv2(land_lr) - land_ini_lr <- .extend2luhv2(land_ini_lr) - magpie2luh2[3, ] <- c("range", "range") - magpie2luh2[2, ] <- c("past", "past") -} else { - magpie2luh2[3, ] <- c("past", "range") - magpie2luh2[2, ] <- c("past", "past") -} - -land_ini_hr <- madrat::toolAggregate(land_ini_hr, magpie2luh2, from = "LUH2", to = "MAgPIE", dim = 3.1) -land_ini_hr <- land_ini_hr[, , getNames(land_lr)] -if (any(land_ini_hr < 0)) { - warning(paste0("Negative values in inital high resolution dataset detected and set to 0. Check the file ", land_hr_file)) - land_ini_hr[which(land_ini_hr < 0, arr.ind = T)] <- 0 -} - -### Read in hr urban land -if (cfg$gms$urban == "exo_nov21") { - urban_land_hr <- read.magpie(urban_land_hr_file) - ssp <- cfg$gms$c34_urban_scenario - urban_land_hr <- urban_land_hr[, , ssp] - getNames(urban_land_hr) <- "urban" -} else if (cfg$gms$urban == "static") { - urban_land_hr <- "static" -} - -### Get land conservation data -wdpa_hr <- NULL -if (file.exists(file.path(outputdir, "wdpa_baseline_0.5.mz"))) { - wdpa_hr <- file.path(outputdir, "wdpa_baseline_0.5.mz") -} -consv_prio_hr <- NULL -if (!all(c(cfg$gms$c22_protect_scenario, cfg$gms$c22_protect_scenario_noselect) %in% "none")) { - if (file.exists(file.path(outputdir, "consv_prio_areas_0.5.mz"))) { - consv_prio_all <- read.magpie(file.path(outputdir, "consv_prio_areas_0.5.mz")) - consv_prio_hr <- new.magpie( - cells = getCells(consv_prio_all), - names = getNames(consv_prio_all, dim = 2), fill = 0 - ) - iso <- readGDX(gdx, "iso") - consv_iso <- readGDX(gdx, "policy_countries22") - consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.1)] - consv_select <- cfg$gms$c22_protect_scenario - consv_noselect <- cfg$gms$c22_protect_scenario_noselect - - if (consv_noselect != "none") { - consv_prio_hr <- collapseDim(consv_prio_all[, , consv_noselect], dim = 3.1) - } - if (consv_select != "none") { - consv_prio_hr[consv_iso, , ] <- collapseDim(consv_prio_all[consv_iso, , consv_select], dim = 3.1) - } else if (consv_select == "none") { - consv_prio_hr[consv_iso, , ] <- 0 - } - } -} - -### Account for country-specific SNV shares in post-processing -iso <- readGDX(gdx, "iso") -snv_pol_iso <- readGDX(gdx, "policy_countries30") -snv_pol_select <- readGDX(gdx, "s30_snv_shr", "s30_set_aside_shr") -snv_pol_noselect <- readGDX(gdx, "s30_snv_shr_noselect", "s30_set_aside_shr_noselect") -snv_pol_shr <- new.magpie(iso, fill = snv_pol_noselect) -snv_pol_shr[snv_pol_iso, , ] <- snv_pol_select - -avl_cropland_hr <- file.path(outputdir, "avl_cropland_0.5.mz") # available cropland (at high resolution) -marginal_land <- cfg$gms$c30_marginal_land # marginal land scenario -target_year <- cfg$gms$c30_snv_target # target year of SNV policy (default: "none") -if (is.null(target_year)) { - target_year <- cfg$gms$c30_set_aside_target -} -snv_pol_fader <- readGDX(gdx, "f30_scenario_fader", "f30_set_aside_fader", - format = "first_found", react = "silent" -)[, , target_year] -if (is.null(snv_pol_fader)) { - snv_pol_fader <- readGDX(gdx, "p30_snv_scenario_fader", format = "first_found") -} - -# ============================================ -# Start disaggregation -# ============================================ - -# --------------------------------- -# Disaggregate MAgPIE land pools -# --------------------------------- - -# Start interpolation (use interpolateAvlCroplandWeighted from luscale) -message("Disaggregating MAgPIE land pools") -land_hr <- interpolateAvlCroplandWeighted( - x = land_lr, - x_ini_lr = land_ini_lr, - x_ini_hr = land_ini_hr, - avl_cropland_hr = avl_cropland_hr, - map = map_file, - marginal_land = marginal_land, - snv_pol_shr = snv_pol_shr, - snv_pol_fader = snv_pol_fader, - urban_land_hr = urban_land_hr, - wdpa_hr = wdpa_hr, - consv_prio_hr = consv_prio_hr -) - -# Write output -.writeDisagg(land_hr, land_hr_out_file, - comment = "unit: Mha per grid-cell", - message = "Write outputs cell.land" -) -.writeDisagg(land_hr / dimSums(land_hr, dim = 3.1), land_hr_share_out_file, - comment = "unit: grid-cell land area fraction", - message = "Write outputs cell.land_share" -) -gc() - -# --------------------------------- -# Disaggregate MAgPIE crop types -# --------------------------------- - -message("Disaggregating MAgPIE crop types") -area_shr_hr <- .dissagcrop(gdx, land_hr, map = map_file) - -# Write output -.writeDisagg(area_shr_hr, croparea_hr_share_out_file, - comment = "unit: croparea fractions of total grid-cell", - message = "Write outputs cell.cropara_share" -) -gc() - -# --------------------------------- -# Split land pools -# --------------------------------- -land_split_hr <- land_hr[, getYears(area_shr_hr), ] -area_hr <- area_shr_hr * dimSums(land_split_hr, dim = 3) - -# replace crop in land_hr in with crop_kfo_rf, crop_kfo_ir, crop_kbe_rf -# and crop_kbe_ir -kbe <- c("betr", "begr") -kfo <- setdiff(getNames(area_hr, dim = 1), kbe) -crop_kfo_rf <- setNames( - dimSums(area_hr[, , kfo][, , "rainfed"], dim = 3), - "crop_kfo_rf" -) -crop_kfo_ir <- setNames( - dimSums(area_hr[, , kfo][, , "irrigated"], dim = 3), - "crop_kfo_ir" -) -crop_kbe_rf <- setNames( - dimSums(area_hr[, , kbe][, , "rainfed"], dim = 3), - "crop_kbe_rf" -) -crop_kbe_ir <- setNames( - dimSums(area_hr[, , kbe][, , "irrigated"], dim = 3), - "crop_kbe_ir" -) -crop_hr <- mbind(crop_kfo_rf, crop_kfo_ir, crop_kbe_rf, crop_kbe_ir) -# calculate Fallow -fallow <- setNames(land_split_hr[, , "crop"] - dimSums(area_hr, dim = 3), "fallow") -# drop crop -land_split_hr <- land_split_hr[, , "crop", invert = TRUE] -# combine land_split_hr with crop_hr. -land_split_hr <- mbind(crop_hr, fallow, land_split_hr) - -# split "forestry" into timber plantations, pre-scribed afforestation (NPi/NDC) and endogenous afforestation (CO2 price driven) -message("Disaggregating forestry") -farea <- dimSums(landForestry(gdx, level = "cell"), dim = "ac") -farea_shr <- farea / (dimSums(farea, dim = 3) + 10^-10) -# calculate forestry area as share of total cell area -farea_hr <- madrat::toolAggregate(farea_shr, map_file, to = "cell") * setNames(land_split_hr[, , "forestry"], NULL) -# check -if (abs(sum(dimSums(farea_hr, dim = 3) - setNames(land_split_hr[, , "forestry"], NULL), na.rm = T)) > 0.1) warning("large Difference in crop disaggregation detected!") -# rename -df <- data.frame(matrix(nrow = 3, ncol = 2)) -names(df) <- c("internal", "output") -df[1, ] <- c("aff", "PlantedForest_Afforestation") -df[2, ] <- c("ndc", "PlantedForest_NPiNDC") -df[3, ] <- c("plant", "PlantedForest_Timber") -farea_hr <- madrat::toolAggregate(farea_hr, df, from = "internal", to = "output", dim = 3.1) - -# drop forestry -land_split_hr <- land_split_hr[, , "forestry", invert = TRUE] -# combine land_split_hr with farea_hr -land_split_hr <- mbind(land_split_hr, farea_hr) - -# Write output -.writeDisagg(land_split_hr, land_hr_split_file, - comment = "unit: Mha per grid-cell", - message = "Write cropsplit land area" -) -.writeDisagg(land_split_hr / dimSums(land_split_hr, dim = 3), land_hr_shr_split_file, - comment = "unit: grid-cell land area fraction", - message = "Write cropsplit land area share" -) -gc() - -# -------------------------------- -# Disaggregate BII -# -------------------------------- - -message("Disaggregating BII values") - -# Load input data for BII disaggregation -land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] -side_layers_hr <- read.magpie(luh_side_layers) -landArea <- dimSums(land_ini_hr, dim = 3) -side_layers_lr <- toolAggregate(x = side_layers_hr, rel = map_file, weight = landArea, from = "cell", to = "cluster") - -# Convert land types for BII disaggregation -land_ini_hr <- mbind( - land_ini_hr[, , c("primother", "secdother"), invert = TRUE], - setNames(dimSums(land_ini_hr[, , c("primother", "secdother")], dim = 3), - nm = "other" - ) -) -getNames(land_ini_hr) <- gsub( - "past", "manpast", - gsub("range", "rangeland", getNames(land_ini_hr)) -) - -if (grepl("grass", cfg$gms$past)) { - getNames(land_ini_lr) <- gsub( - "past", "manpast", - gsub("range", "rangeland", getNames(land_ini_lr)) - ) - getNames(land_lr) <- gsub( - "past", "manpast", - gsub("range", "rangeland", getNames(land_lr)) - ) -} else { - # Disaggregate pasture - land_ini_lr <- mbind( - land_ini_lr[, , c("past"), invert = TRUE], - collapseNames(land_ini_lr[, , "past"]) * side_layers_lr[, , c("manpast", "rangeland")] - ) - - land_lr <- mbind( - land_lr[, , c("past"), invert = TRUE], - collapseNames(land_lr[, , "past"]) * side_layers_lr[, , c("manpast", "rangeland")] - ) -} - -# Sort and rename -land_ini_hr <- land_ini_hr[,,getNames(land_ini_lr)] -getSets(land_ini_hr)["d3.1"] <- "land" - -# Disaggregate BII values to high resolution -bii_hr <- .dissagBII(gdx, map = map_file, dir = outputdir) - -# Disaggregate land pools for BII estimation -land_bii_hr <- interpolateAvlCroplandWeighted( - x = land_lr, - x_ini_lr = land_ini_lr, - x_ini_hr = land_ini_hr, - avl_cropland_hr = avl_cropland_hr, - map = map_file, - marginal_land = marginal_land, - snv_pol_shr = snv_pol_shr, - snv_pol_fader = snv_pol_fader, - urban_land_hr = urban_land_hr, - wdpa_hr = wdpa_hr, - consv_prio_hr = consv_prio_hr, - unit = "share" -) - -# Add primary and secondaray other land -land_bii_hr <- PrimSecdOtherLand(land_bii_hr, land_hr_file) - -# specify potential natural vegetation -land_bii_hr <- land_bii_hr * side_layers_hr[, , c("forested", "nonforested")] - -# Sum over land classes -bii_hr <- dimSums(land_bii_hr * bii_hr, dim = 3, na.rm = TRUE) - -# Write output -.writeDisagg(bii_hr, bii_hr_out_file, - comment = "unitless", - message = "Write output BII at 0.5°" -) -gc() - -message("Finished disaggregation") From e54d961552485b9fc205a31e1414f47b3eac29b1 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 1 Mar 2024 19:06:09 +0100 Subject: [PATCH 064/259] Update Citation --- CITATION.cff | 6 ++++++ config/default.cfg | 6 +++--- .../1st2ndgen_priced_feb24/equations.gms | 10 ++++++---- scripts/output/extra/disaggregation.R | 18 +++++++++++++++--- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index c08883e0ce..2f8e0d71b3 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -118,6 +118,12 @@ authors: affiliation: "Potsdam Institute for Climate Impact Research" email: alexkob@pik-potsdam.de + - family-names: Steinhauser + given-names: Jan + orcid: https://orcid.org/0000-0002-5989-6855 + affiliation: "Potsdam Institute for Climate Impact Research" + email: janstein@pik-potsdam.de + - family-names: Lotze-Campen given-names: Hermann orcid: https://orcid.org/0000-0002-0003-5508 diff --git a/config/default.cfg b/config/default.cfg index 22bf626f13..5b0aca38e8 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1390,7 +1390,7 @@ cfg$gms$s56_cprice_red_factor <- 1 # def = 1 # * Note: For best consistency it is recommended to use trajectories from the most recent # * coupled REMIND-MAgPIE runs. Currently, this is R32M46. # * Available options: -# * none: no 2nd generation bioenergy demand +# * none: no 2nd generation bioenergy demand # * R32M46: Coupled REMIND-MAgPIE runs with REMIND 3.2.1.dev412 and MAgPIE 4.6.11 # * NPi: Current policies; limit peak warming to 3.0°C # * NDC: Nationally determined contributions; limit peak warming to 2.5°C @@ -1489,9 +1489,9 @@ cfg$gms$c56_cprice_aff <- "secdforest_vegc" # def = secdforest_vegc # * should not be higher than s32_planing_horizon cfg$gms$s56_c_price_exp_aff <- 50 # def = 50 -# * Share of carbon credits for re/afforestation projects set aside in a buffer to +# * Share of carbon credits for re/afforestation projects set aside in a buffer to # * account for potential failure of permanent carbon storage. -# * Alternatively, this parameter can be interpreted as a reduction factor +# * Alternatively, this parameter can be interpreted as a reduction factor # * of the carbon price for non-permanent CDR. # * Values > 0 will reduce the incentive for c-price-induced re/afforestation cfg$gms$s56_buffer_aff <- 0.5 # def = 0.5 diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms index ec38cc2e0f..da3801b747 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms @@ -66,10 +66,12 @@ q60_res_2ndgenBE(i2) .. =g= sum(ct,i60_res_2ndgenBE_dem(ct,i2)); -*' Finally, an incentive is provided for the production of 1st generation -*' bioenergy from oils and ethanol even beyond the exogeneous minimum demand. -*' The incentive is kept low, but should provide a more realistic -*' overproduction from couple products. +*' Finally, an incentive is provided for the production of 1st and 2nd generation +*' bioenergy beyond the exogeneous minimum demand. 1st generation bioenergy can be incentivized +*' mass- or energy-based, the former, for comparability, in line with other realizations and constant over time. +*' The energy-based incentive can take different forms and is applied to both 1st and 2nd generation. +*' Combined with low or fade-out exogenous demands, this is useful to assess bioenergy production potentials, however +*' the endogenous technological change in $13\_TC may react very strongly and create a positive feedback loop q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index bcf9d86037..9c4b2736db 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -38,6 +38,11 @@ land_hr_split_file <- file.path(outputdir, "cell.land_split_0.5.mz") land_hr_shr_split_file <- file.path(outputdir, "cell.land_split_0.5_share.mz") luh_side_layers <- file.path(outputdir, "luh2_side_layers_0.5.mz") bii_hr_out_file <- file.path(outputdir, "cell.bii_0.5.mz") +peatland_v2_hr_file <- file.path(outputdir, "f58_peatland_area_0.5.mz") +peatland_on_intact_hr_file <- file.path(outputdir, "f58_peatland_intact_0.5.mz") +peatland_on_degrad_hr_file <- file.path(outputdir, "f58_peatland_degrad_0.5.mz") +peatland_hr_out_file <- file.path(outputdir, "cell.peatland_0.5.mz") +peatland_hr_share_out_file <- file.path(outputdir, "cell.peatland_0.5_share.mz") cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) @@ -54,6 +59,11 @@ if (length(map_file) > 1) { # Output functions # ----------------------------------------- +.fixCoords <- function(x) { + getSets(x, fulldim = FALSE)[1] <- "x.y.iso" + return(x) +} + .writeDisagg <- function(x, file, comment, message) { base::message(message) x <- .fixCoords(x) @@ -84,7 +94,8 @@ if (length(map_file) > 1) { map <- readRDS(map_file) # create full time series - land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getNames(wdpa_hr)) + land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getNames(wdpa_hr), + sets = c("x.y.iso", "year", getSets(wdpa_hr, fulldim = FALSE)[3])) land_consv_hr[, getYears(land_consv_hr), ] <- wdpa_hr[, nyears(wdpa_hr), ] land_consv_hr[, getYears(wdpa_hr), ] <- wdpa_hr @@ -93,7 +104,8 @@ if (length(map_file) > 1) { consv_prio_all <- read.magpie(consv_prio_hr_file) consv_prio_hr <- new.magpie( cells_and_regions = map[, "cell"], - names = getNames(consv_prio_all, dim = 2), fill = 0 + names = getNames(consv_prio_all, dim = 2), fill = 0, + sets = c("x.y.iso", "year", "data") ) iso <- readGDX(gdx, "iso") consv_iso <- readGDX(gdx, "policy_countries22") @@ -301,6 +313,7 @@ land_hr <- interpolateAvlCroplandWeighted( snv_pol_shr = snv_pol_shr, snv_pol_fader = snv_pol_fader ) +land_hr <- .fixCoords(land_hr) # Write output .writeDisagg(land_hr, land_hr_out_file, @@ -535,4 +548,3 @@ rm(land_hr, peat_hr) gc() message("Finished disaggregation") - From f5786c341c1e65403acb66d5b6bb2522803d6418 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 1 Mar 2024 19:48:34 +0100 Subject: [PATCH 065/259] documentation correction --- modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms index da3801b747..a2b373ce1f 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms @@ -71,7 +71,7 @@ q60_res_2ndgenBE(i2) .. *' mass- or energy-based, the former, for comparability, in line with other realizations and constant over time. *' The energy-based incentive can take different forms and is applied to both 1st and 2nd generation. *' Combined with low or fade-out exogenous demands, this is useful to assess bioenergy production potentials, however -*' the endogenous technological change in $13\_TC may react very strongly and create a positive feedback loop +*' the endogenous technological change in [13_tc] may react very strongly and create a positive feedback loop q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) From 587dfdc30448a224302910664857fea01401c592 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 4 Mar 2024 14:09:47 +0100 Subject: [PATCH 066/259] remove tabs --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index 5b0aca38e8..9a11e4e4ea 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1990,7 +1990,7 @@ cfg$files2export$start <- c("input/info.txt", "input/regionmapping*.csv", "input/kba_land_0.5.mz", "input/f58_peatland_area_0.5.mz", - "input/MAPSPAM_croparea_0.5.mz", + "input/MAPSPAM_croparea_0.5.mz", "input/LUH2_croparea_0.5.mz") # Files that should be copied after the MAgPIE run is finished From cb4616b03465a7880c54e420df8de94c1167792c Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 4 Mar 2024 15:45:57 +0100 Subject: [PATCH 067/259] Update additional data to include new SCP scenarios --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index 9a11e4e4ea..ac6c5fd372 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -25,7 +25,7 @@ cfg$model <- "main.gms" #def = "main.gms" cfg$input <- c(regional = "rev4.99_h12_magpie.tgz", cellular = "rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.99_h12_validation.tgz", - additional = "additional_data_rev4.48.tgz", + additional = "additional_data_rev4.49.tgz", calibration = "calibration_H12_per_ton_fao_may22_glo_08Aug23.tgz") # NOTE: It is recommended to recalibrate the model when changing cellular input data From 452d2b9cb7156b95006d273acadd0718845e1bbc Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 4 Mar 2024 15:49:26 +0100 Subject: [PATCH 068/259] update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aab3556d64..aa57f2885d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **default.cfg** changed default for `cfg$gms$s56_buffer_aff` from 0.2 to 0.5 - **default.cfg** changed default for `cfg$gms$s32_aff_prot` from 0 to 1 - **21_trade** s21_trade_bal_damper for roundwood changed from 0.75 to 0.65 -- **44_biodiversity** update `bii_target realization` to take `f44_rr_layer` into account in `q44_bii` +- **44_biodiversity** update `bii_target realization` to take `f44_rr_layer` into account in `q44_bii` +- **config** update additional data to rev4.49 ### added - **32_forestry** new interfaces `vm_land_forestry`, `pcm_land_forestry` `vm_landexpansion_forestry` and `vm_landreduction_forestry` From 6a33924c7a15af3357bf0fc0f17b8c6e9529c056 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 4 Mar 2024 16:47:43 +0100 Subject: [PATCH 069/259] Adjust changelog to account for 4.7.1 release --- CHANGELOG.md | 68 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa57f2885d..72691dc108 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,27 +8,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- **15_food** Added improved EAT Lancet diet implementation (EAT 2p0) -- **default.cfg** update input data to rev 4.99 (new validation data, new EATLancet recommendations, new semi-natural vegtation cropland data) -- **start_functions** Check if cfg$recalibrate is consistent with cfg$gms$s14_use_yield_calib -- **31_past** in grasslands_apr22 realization: changed structure of f31_pastr_suitability to align with ssp-rcp specific input data formulation. Changed input filename from cs3 to cs2. Added `cc`, `nocc` and `nocc_hist` options for `i31_manpast_suit` and changed input gams code from table to parameter. Climate scenario assignment moved from preloop.gms to input.gms. Removed pastSuit set in sets.gms as not needed anymore. Adjusted not_used.txt in both grasslands_apr22 and static realizations. -- **default.cfg** Default for cfg$gms$peatland changed from `on` to `v2` -- **default.cfg and scenario_config.csv** Default for cfg$gms$c56_emis_policy changed from `redd+natveg_nosoil` to `reddnatveg_nosoil`,i.e. timber plantations are excluded from carbon pricing by default -- **default.cfg** Default for cfg$gms$c56_cprice_aff changed from `forestry_vegc` to `secdforest_vegc` -- **scenario_config.csv** settings for cfg$gms$s35_secdf_distribution in `ForestryEndo` and `ForestryExo` changed from `2` to `0` -- **scenario_config.csv** removed erroneous setting `cc` from column `input` -- **default.cfg** update default `cfg$gms$c56_pollutant_prices` and `cfg$gms$c60_2ndgen_biodem` to `R32M46-SSP2EU-NPi` -- **default.cfg** changed default for `cfg$gms$s56_buffer_aff` from 0.2 to 0.5 -- **default.cfg** changed default for `cfg$gms$s32_aff_prot` from 0 to 1 -- **21_trade** s21_trade_bal_damper for roundwood changed from 0.75 to 0.65 - **44_biodiversity** update `bii_target realization` to take `f44_rr_layer` into account in `q44_bii` -- **config** update additional data to rev4.49 +- **default.cfg** update additional data to rev4.49 ### added -- **32_forestry** new interfaces `vm_land_forestry`, `pcm_land_forestry` `vm_landexpansion_forestry` and `vm_landreduction_forestry` -- **scripts** added peatland to output/extra/disaggregation.R -- **56_ghg_policy_** added new trajectories for R32M46 -- **60_bioenergy** added new trajectories for R32M46 - **scripts** added a new validation_cell.R output script that generates a pdf with the comparison of magpie land use and crop type outputs with LUH and MAPSPAM historical data at cellular resolution. - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` - **default.cfg** added early afforestation constraint `cfg$gms$s32_max_aff_cell_2025` @@ -45,21 +28,52 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scenario_config.csv** added preset for GENIE project ### removed -- **default.cfg** Removed description of cfg$gms$c31_past_suit_scen since no longer needed due to changes in 31_past described below. Its function is now done by cfg$gms$c31_grassl_yld_scenario. +- + +### fixed +- + + +## [4.7.1] - 2024-02-28 + +### changed +- **15_food** Added improved EAT Lancet diet implementation (EAT 2p0) +- **21_trade** s21_trade_bal_damper for roundwood changed from 0.75 to 0.65 +- **31_past** in grasslands_apr22 realization: changed structure of f31_pastr_suitability to align with ssp-rcp specific input data formulation. Changed input filename from cs3 to cs2. Added `cc`, `nocc` and `nocc_hist` options for `i31_manpast_suit` and changed input gams code from table to parameter. Climate scenario assignment moved from preloop.gms to input.gms. Removed pastSuit set in sets.gms as not needed anymore. Adjusted not_used.txt in both grasslands_apr22 and static realizations. +- **default.cfg and scenario_config.csv** Default for cfg$gms$c56_emis_policy changed from `redd+natveg_nosoil` to `reddnatveg_nosoil`,i.e. timber plantations are excluded from carbon pricing by default +- **default.cfg** changed default for `cfg$gms$s32_aff_prot` from 0 to 1 +- **default.cfg** changed default for `cfg$gms$s56_buffer_aff` from 0.2 to 0.5 +- **default.cfg** Default for cfg$gms$c56_cprice_aff changed from `forestry_vegc` to `secdforest_vegc` +- **default.cfg** Default for cfg$gms$peatland changed from `on` to `v2` +- **default.cfg** update default `cfg$gms$c56_pollutant_prices` and `cfg$gms$c60_2ndgen_biodem` to `R32M46-SSP2EU-NPi` +- **default.cfg** update input data to rev 4.99 (new validation data, new EATLancet recommendations, new semi-natural vegtation cropland data) +- **scenario_config.csv** removed erroneous setting `cc` from column `input` +- **scenario_config.csv** settings for cfg$gms$s35_secdf_distribution in `ForestryEndo` and `ForestryExo` changed from `2` to `0` +- **start_functions** Check if cfg$recalibrate is consistent with cfg$gms$s14_use_yield_calib + +### added +- **32_forestry** new interfaces `vm_land_forestry`, `pcm_land_forestry` `vm_landexpansion_forestry` and `vm_landreduction_forestry` +- **56_ghg_policy_** added new trajectories for R32M46 +- **60_bioenergy** added new trajectories for R32M46 +- **scripts** added peatland to output/extra/disaggregation.R + +### removed - **58_peatland** removed realization "on" +- **default.cfg** Removed description of cfg$gms$c31_past_suit_scen since no longer needed due to changes in 31_past described below. Its function is now done by cfg$gms$c31_grassl_yld_scenario. ### fixed -- **scripts** disaggregation_LUH2.R which no longer relies on the old raster-based write.magpie for nc files -- **scripts** fixed memory spike leading to crashes in disaggregation.R -- **scripts** fixed writing of NetCDF files in output/reportMAgPIE2SEALS.R -- **scripts** fixed disaggregation.R and disaggregation_LUH2.R to be used with 67k -- **scripts** bugfix highres.R for bioenergy demand and GHG prices in coupled runs +- **21_trade** introduced s21_manna_from_heaven for fixing v21_manna_from_heaven to zero. Without fixing to zero, v21_manna_from_heaven was used unnecessarily in runs started with highres.R +- **32_forestry** bugfix unit p32_observed_gs_reg +- **32_forestry** keep c-density for timber plantations constant after rotation length to avoid unrealistic carbon sequestration in unharvested timber plantation - **35_natveg** bugfixes ac_est - **35_natveg** removed scaling of pm_carbon_density_ac - **52_carbon** bugfix acx long-term carbon density -- **32_forestry** keep c-density for timber plantations constant after rotation length to avoid unrealistic carbon sequestration in unharvested timber plantation -- **32_forestry** bugfix unit p32_observed_gs_reg -- **21_trade** introduced s21_manna_from_heaven for fixing v21_manna_from_heaven to zero. Without fixing to zero, v21_manna_from_heaven was used unnecessarily in runs started with highres.R +- **scripts** bugfix highres.R for bioenergy demand and GHG prices in coupled runs +- **scripts** disaggregation_LUH2.R which no longer relies on the old raster-based write.magpie for nc files +- **scripts** fixed disaggregation.R and disaggregation_LUH2.R to be used with 67k +- **scripts** fixed memory spike leading to crashes in disaggregation.R +- **scripts** fixed writing of NetCDF files in output/reportMAgPIE2SEALS.R + ## [4.7.0] - 2023-12-11 From 77aac3f410ce7f46f09cd59d557c3e5f2153a70a Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Sat, 23 Mar 2024 21:56:02 +0100 Subject: [PATCH 070/259] update scenario config --- config/scenario_config.csv | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 61479ad064..eca7e64e86 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,4 +1,4 @@ -;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP +;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; @@ -82,7 +82,7 @@ gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;; gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.99_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.99_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.99_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.99_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.99_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.101_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.101_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.101_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.101_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.101_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.101_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; From e305c7989b76c07f0ea63174c97cfe1206ae5240 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser <72768733+jansteinhauser@users.noreply.github.com> Date: Wed, 27 Mar 2024 18:54:14 +0100 Subject: [PATCH 071/259] Update config/default.cfg Co-authored-by: Jan Dietrich --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index b8e19fedf2..4179c37914 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1651,7 +1651,7 @@ cfg$gms$c59_exo_scen <- "constant" # * 2nd generation betr and begr coupled with REMIND. # * (1st2ndgen_priced_feb24): exogenous and price-based 1st generation bioenergy # * demand, 2nd generation residues exogeneous, -# * 2nd generation betr and begr exogenous and price-based +# * 2nd generation betr and begr exogenous as well as price driven cfg$gms$bioenergy <- "1stgen_priced_dec18" # def = 1stgen_priced_dec18 # * 1st generation bioenergy demand scenarios based on Lotze Campen (2014) From c7b26ea9cacf5115c0738eb1f95446308ea5413f Mon Sep 17 00:00:00 2001 From: Jan Steinhauser <72768733+jansteinhauser@users.noreply.github.com> Date: Wed, 27 Mar 2024 19:03:52 +0100 Subject: [PATCH 072/259] Apply suggestions from code review Co-authored-by: Jan Dietrich Co-authored-by: pvjeetze <50408549+pvjeetze@users.noreply.github.com> --- config/default.cfg | 2 +- modules/30_crop/endo_apr21/input.gms | 2 +- modules/30_crop/penalty_apr22/input.gms | 2 +- modules/30_crop/rotation_apr22/input.gms | 2 +- modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 4179c37914..01e606a574 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -729,7 +729,7 @@ cfg$gms$policy_countries30 <- all_iso_countries # * "secdforest, past, other" etc. cfg$gms$land_snv <- "secdforest, forestry, past, other" #def = "secdforest, forestry, past, other" -# * Allowed annual cropland per year per region, relative to the current cropland level +# * Allowed annual cropland growth per year per region, relative to the current cropland level # * e.g., 0.02: 2% annual growth, compounded to 10.4% growth for five-years timestep cfg$gms$s30_annual_max_growth <- Inf # def = Inf diff --git a/modules/30_crop/endo_apr21/input.gms b/modules/30_crop/endo_apr21/input.gms index ca99711ca8..365e6dfdce 100644 --- a/modules/30_crop/endo_apr21/input.gms +++ b/modules/30_crop/endo_apr21/input.gms @@ -29,7 +29,7 @@ s30_snv_relocation_data_x1 First reference value in SNV target cropland dat s30_snv_relocation_data_x2 Second reference value in SNV target cropland data (1) / 0.5 / s30_rotation_scenario_start Rotation scenario start year / 2020 / s30_rotation_scenario_target Rotation scenario target year / 2050 / -s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (1) / Inf / ; * Set-switch for countries affected by regional SNV policy diff --git a/modules/30_crop/penalty_apr22/input.gms b/modules/30_crop/penalty_apr22/input.gms index ec9f7a2468..f2ecaa6268 100644 --- a/modules/30_crop/penalty_apr22/input.gms +++ b/modules/30_crop/penalty_apr22/input.gms @@ -33,7 +33,7 @@ s30_snv_scenario_start SNV scenario start year / 2020 / s30_snv_scenario_target SNV scenario target year / 2030 / s30_rotation_scenario_start Rotation scenario start year / 2020 / s30_rotation_scenario_target Rotation scenario target year / 2050 / -s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (1) / Inf / s30_snv_relocation_data_x1 First reference value in SNV target cropland data (1) / 0.2 / s30_snv_relocation_data_x2 Second reference value in SNV target cropland data (1) / 0.5 / ; diff --git a/modules/30_crop/rotation_apr22/input.gms b/modules/30_crop/rotation_apr22/input.gms index 324219e936..58130b7c27 100644 --- a/modules/30_crop/rotation_apr22/input.gms +++ b/modules/30_crop/rotation_apr22/input.gms @@ -33,7 +33,7 @@ s30_snv_scenario_start SNV scenario start year / 2020 / s30_snv_scenario_target SNV scenario target year / 2030 / s30_rotation_scenario_start Rotation scenario start year / 2020 / s30_rotation_scenario_target Rotation scenario target year / 2050 / -s30_annual_max_growth Max annual cropland growth as share of previous cropland (-) / Inf / +s30_annual_max_growth Max annual cropland growth as share of previous cropland (1) / Inf / s30_snv_relocation_data_x1 First reference value in SNV target cropland data (1) / 0.2 / s30_snv_relocation_data_x2 Second reference value in SNV target cropland data (1) / 0.5 / ; diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms index a2b373ce1f..170a025aad 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms @@ -11,7 +11,7 @@ *' @code *' Total demand for bioenergy comes from different origins *' 1st generation bioenergy demand is a fixed trajectory of minimum production -*' requirements. Second generation bioenergy splits into a Demand +*' requirements. Second generation bioenergy splits into a demand *' for dedicated bioenergy crops, which are fully substitutable based on their *' energy content, and residues which are also fully substitutable based on *' their energy content. @@ -68,7 +68,7 @@ q60_res_2ndgenBE(i2) .. *' Finally, an incentive is provided for the production of 1st and 2nd generation *' bioenergy beyond the exogeneous minimum demand. 1st generation bioenergy can be incentivized -*' mass- or energy-based, the former, for comparability, in line with other realizations and constant over time. +*' mass- or energy-based. For comparability, the former is in line with other realizations and constant over time. *' The energy-based incentive can take different forms and is applied to both 1st and 2nd generation. *' Combined with low or fade-out exogenous demands, this is useful to assess bioenergy production potentials, however *' the endogenous technological change in [13_tc] may react very strongly and create a positive feedback loop From 4766d87eec33bbd7bf2ee655737bda7da409124e Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 5 Apr 2024 12:01:59 +0200 Subject: [PATCH 073/259] Apply PR feedback --- config/default.cfg | 28 +++++++++++-------- .../1st2ndgen_priced_feb24/equations.gms | 5 +--- .../1stgen_priced_dec18/equations.gms | 3 -- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 01e606a574..8688927e28 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -913,8 +913,8 @@ cfg$gms$c32_rot_calc_type <- "current_annual_increment" # * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 cfg$gms$c32_shock_scenario = "none" # def = "none" -# Prohibit rapid afforestation early on. This is done on cluster-level to avoid a single region or cluster abusing low boundaries > 0 -# * 0.005 = globally 1Mha Aff allowed in 2025 +# Maximum allowed area (Mha) for new endogenous afforestation per cluster in 2025. +# Can be used to avoid or limit unwanted early model behavior for specific carbon price curves. cfg$gms$s32_max_aff_cell_2025 <- Inf # def = inf # ***--------------------- 34_urban --------------------------------------- @@ -1749,23 +1749,27 @@ cfg$gms$c60_biodem_level <- 1 # def = 1 # * Therefore, the minimum demand is of particular importance for the coupling with REMIND. cfg$gms$s60_2ndgen_bioenergy_dem_min <- 1 # def = 1 -# * Minimum demand can be set to 0 for price-driven runs past the SSP2_fix (1st2ndgen_priced_feb24 only) +# * Minimum demand (mio. GJ per yr) can be set to 0 for price-driven runs past the SSP2_fix (1st2ndgen_priced_feb24 only) cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 -# * first generation bioenergy subsidy (USD05MER per ton) -# * for GJ-based prices post fix_SSP2 only the fix_SSP2 should be > 0 (1st2ndgen_priced_feb24 only) -# * In 1stgen_priced_dec18, c60_bioenergy_subsidy is applied as constant value over the full time horizon +# * t DM-based first generation bioenergy subsidy (USD05MER per ton) +# * (1stgen_priced_dec18): c60_bioenergy_subsidy is applied constant over historic and model horizon, c60_bioenergy_subsidy_fix_SSP2 has no effect +# * (1st2ndgen_priced_feb24): c60_bioenergy_subsidy_fix_SSP2 is applied constant to historic time steps (up until sm_fix_SSP2). +# * c60_bioenergy_subsidy is applied constant to model horizon (after sm_fix_SSP2) +# * If GJ-based prices are used (setting below), c60_bioenergy_subsidy should be set to 0 cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 -# * For 1st2ndgen_priced_feb24, target prices (US05MER per GJ) for 1st and 2nd gen bioenergy +# * GJ-based bioenergy subsidy (USD05MER per GJ), only used in 1st2ndgen_priced_feb24 +# * Target prices for 1st and 2nd gen bioenergy cfg$gms$s60_bioenergy_gj_price_1st <- 0 # def = 0 cfg$gms$s60_bioenergy_price_2nd <- 0 # def = 0 -# * Shape of GJ-based price curve towards defined target price -# * Options: const : constant price equal to target price -# * exp : exponential implementation starting from 0.25 * target price in the first sm_fix_SSP2 year; steps <= sm_fix_SSP2 then fixed to 0 -# * lin : linear implementation starting from 0 in the sm_fix_SSP2 year +# * Shape of GJ-based price curve towards defined target price, reached in 2100 +# * Options: const, exp, lin +# * (const): constant price equal to target price +# * (exp): exponential implementation starting from 0.25 * target price in the first sm_fix_SSP2 year; steps <= sm_fix_SSP2 then fixed to 0 +# * (lin): linear implementation starting from 0 in the sm_fix_SSP2 year cfg$gms$c60_price_implementation <- "lin" # def = "lin" diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms index 170a025aad..a5ea034af9 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/equations.gms @@ -6,9 +6,6 @@ *** | Contact: magpie@pik-potsdam.de *' @equations - - -*' @code *' Total demand for bioenergy comes from different origins *' 1st generation bioenergy demand is a fixed trajectory of minimum production *' requirements. Second generation bioenergy splits into a demand @@ -71,7 +68,7 @@ q60_res_2ndgenBE(i2) .. *' mass- or energy-based. For comparability, the former is in line with other realizations and constant over time. *' The energy-based incentive can take different forms and is applied to both 1st and 2nd generation. *' Combined with low or fade-out exogenous demands, this is useful to assess bioenergy production potentials, however -*' the endogenous technological change in [13_tc] may react very strongly and create a positive feedback loop +*' the endogenous technological change in [13_tc] may react very strongly and create a positive feedback loop. q60_bioenergy_incentive(i2).. vm_bioenergy_utility(i2) =e= sum((ct,k1st60), vm_dem_bioen(i2,k1st60) * (-i60_1stgen_bioenergy_subsidy_tdm(ct))) diff --git a/modules/60_bioenergy/1stgen_priced_dec18/equations.gms b/modules/60_bioenergy/1stgen_priced_dec18/equations.gms index 6d2b697dd0..04b97e47d9 100644 --- a/modules/60_bioenergy/1stgen_priced_dec18/equations.gms +++ b/modules/60_bioenergy/1stgen_priced_dec18/equations.gms @@ -6,9 +6,6 @@ *** | Contact: magpie@pik-potsdam.de *' @equations - - -*' @code *' Total demand for bioenergy comes from different origins *' 1st generation bioenergy demand is a fixed trajectory of minimum production *' requirements. Second generation bioenergy splits into a Demand From d6003678ba1673eea9dc8a58a7ade1aeaf748008 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser <72768733+jansteinhauser@users.noreply.github.com> Date: Fri, 5 Apr 2024 18:54:22 +0200 Subject: [PATCH 074/259] Update default.cfg --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index fa29194081..77d58e96c8 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1758,7 +1758,7 @@ cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 # * c60_bioenergy_subsidy is applied constant to model horizon (after sm_fix_SSP2) # * If GJ-based prices are used (setting below), c60_bioenergy_subsidy should be set to 0 cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 -cfg$gms$c60_bioenergy_subsidy_fix_SSP2 +cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 # * GJ-based bioenergy subsidy (USD05MER per GJ), only used in 1st2ndgen_priced_feb24 # * Target prices for 1st and 2nd gen bioenergy From 174c29aa54853e49d82b32c3b8d3b5cc960edb5d Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 8 Apr 2024 14:10:16 +0200 Subject: [PATCH 075/259] Create new Biodiv default realization with RR layer --- config/default.cfg | 7 ++-- .../44_biodiversity/bii_target/equations.gms | 3 +- modules/44_biodiversity/bii_target/input.gms | 8 ---- .../44_biodiversity/bii_target/input/files | 1 - .../bii_target_apr24/declarations.gms | 40 +++++++++++++++++++ .../bii_target_apr24/equations.gms | 28 +++++++++++++ .../bii_target_apr24/input.gms | 35 ++++++++++++++++ .../bii_target_apr24/input/files | 4 ++ .../bii_target_apr24/postsolve.gms | 38 ++++++++++++++++++ .../bii_target_apr24/preloop.gms | 14 +++++++ .../bii_target_apr24/presolve.gms | 29 ++++++++++++++ .../bii_target_apr24/realization.gms | 25 ++++++++++++ .../44_biodiversity/bii_target_apr24/sets.gms | 32 +++++++++++++++ modules/44_biodiversity/module.gms | 1 + 14 files changed, 251 insertions(+), 14 deletions(-) create mode 100644 modules/44_biodiversity/bii_target_apr24/declarations.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/equations.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/input.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/input/files create mode 100644 modules/44_biodiversity/bii_target_apr24/postsolve.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/preloop.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/presolve.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/realization.gms create mode 100644 modules/44_biodiversity/bii_target_apr24/sets.gms diff --git a/config/default.cfg b/config/default.cfg index 77d58e96c8..e1ec4aae4b 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1195,9 +1195,10 @@ cfg$gms$water_availability <- "total_water_aug13" # def = total_water_aug13 cfg$gms$c43_watavail_scenario <- "cc" # def = "cc" # ***------------------------- 44_biodiversity ------------------------------ -# * (bii_target): Biodiversity Intactness Index (BII) for 71 biomes with the option to define a lower bound for BII at biome level +# * (bii_target_apr24): Biodiversity Intactness Index (BII) for 71 biomes with the option to define a lower bound for BII at biome level, including range-rarity weighting +# * (bii_target): Biodiversity Intactness Index (BII) for 71 biomes with the option to define a lower bound for BII at biome level, without range-rarity weighting # * (bv_btc_mar21): Global optimization of range-rarity weighted biodiversity stocks based on a price for losses and gains -cfg$gms$biodiversity <- "bii_target" # def = bii_target +cfg$gms$biodiversity <- "bii_target_apr24" # def = bii_target_apr24 # * Start year for linear increase towards BII target value (in bii_target) or biodiversity target price (in bv_btc_mar21) cfg$gms$s44_start_year <- 2025 #def = 2025 @@ -1756,7 +1757,7 @@ cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 # * (1stgen_priced_dec18): c60_bioenergy_subsidy is applied constant over historic and model horizon, c60_bioenergy_subsidy_fix_SSP2 has no effect # * (1st2ndgen_priced_feb24): c60_bioenergy_subsidy_fix_SSP2 is applied constant to historic time steps (up until sm_fix_SSP2). # * c60_bioenergy_subsidy is applied constant to model horizon (after sm_fix_SSP2) -# * If GJ-based prices are used (setting below), c60_bioenergy_subsidy should be set to 0 +# * If GJ-based prices are used (setting below), c60_bioenergy_subsidy should be set to 0. cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index 8069d3c37b..e03693861b 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -8,12 +8,11 @@ *' @equations *' The Biodiversity Intactness Index (BII) is calculated at the level of 71 biomes. -*' Biodiversity stock weighted by range-rarity restoration prioritization layer (`f44_rr_layer`) *' The regional layer is needed for compatibility with the high resolution parallel optimization output script (scripts/output/extra/highres.R) q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44) =e= - (sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_rr_layer(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_rr_layer(j2) * f44_biome(j2,biome44))); + (sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44))); *' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`. *' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased. diff --git a/modules/44_biodiversity/bii_target/input.gms b/modules/44_biodiversity/bii_target/input.gms index 2d83084825..3840e6c4ed 100644 --- a/modules/44_biodiversity/bii_target/input.gms +++ b/modules/44_biodiversity/bii_target/input.gms @@ -25,11 +25,3 @@ $ondelim $include "./modules/44_biodiversity/bii_target/input/biorealm_biome.cs3" $offdelim ; - -parameters -f44_rr_layer(j) Range-rarity restoration prioritization layer (unitless) -/ -$ondelim -$include "./modules/44_biodiversity/bii_target/input/rr_layer.cs2" -$offdelim -/ diff --git a/modules/44_biodiversity/bii_target/input/files b/modules/44_biodiversity/bii_target/input/files index 3afa3b8e8d..0ad61cf22c 100644 --- a/modules/44_biodiversity/bii_target/input/files +++ b/modules/44_biodiversity/bii_target/input/files @@ -1,4 +1,3 @@ * list of files that are required here f44_bii_coeff.cs3 biorealm_biome.cs3 -rr_layer.cs2 diff --git a/modules/44_biodiversity/bii_target_apr24/declarations.gms b/modules/44_biodiversity/bii_target_apr24/declarations.gms new file mode 100644 index 0000000000..419d24471c --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/declarations.gms @@ -0,0 +1,40 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + + +positive variables + vm_cost_bv_loss(j) Biodiversity cost (mio USD) + vm_bv(j,landcover44,potnatveg) Biodiversity stock for all land cover classes (Mha) + v44_bii(i,biome44) Biodiversity Intactness Index BII (1) + v44_bii_missing(i,biome44) Missing BII increase for compliance with BII target (1) +; + +parameters + p44_bii_lower_bound(t,i,biome44) Interpolated lower bound for BII over time (1) + p44_start_value(i,biome44) Start value for BII lower bound (1) + p44_target_value(i,biome44) Target value for BII lower bound (1) +; + +equations + q44_bii(i,biome44) Biodiversity Intactness Index BII (1) + q44_bii_target(i,biome44) Missing BII increase for compliance with BII target (1) + q44_cost(i) Biodiversity cost (mio USD) +; + + +*#################### R SECTION START (OUTPUT DECLARATIONS) #################### +parameters + ov_cost_bv_loss(t,j,type) Biodiversity cost (mio USD) + ov_bv(t,j,landcover44,potnatveg,type) Biodiversity stock for all land cover classes (Mha) + ov44_bii(t,i,biome44,type) Biodiversity Intactness Index BII (1) + ov44_bii_missing(t,i,biome44,type) Missing BII increase for compliance with BII target (1) + oq44_bii(t,i,biome44,type) Biodiversity Intactness Index BII (1) + oq44_bii_target(t,i,biome44,type) Missing BII increase for compliance with BII target (1) + oq44_cost(t,i,type) Biodiversity cost (mio USD) +; +*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### + diff --git a/modules/44_biodiversity/bii_target_apr24/equations.gms b/modules/44_biodiversity/bii_target_apr24/equations.gms new file mode 100644 index 0000000000..c143e63fc4 --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/equations.gms @@ -0,0 +1,28 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @equations + +*' The Biodiversity Intactness Index (BII) is calculated at the level of 71 biomes. +*' Biodiversity stock weighted by range-rarity restoration prioritization layer (`f44_rr_layer`) +*' The regional layer is needed for compatibility with the high resolution parallel optimization output script (scripts/output/extra/highres.R) + + q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44) + =e= + (sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_rr_layer(j2) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_rr_layer(j2) * f44_biome(j2,biome44))); + +*' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`. +*' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased. + + q44_bii_target(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. + v44_bii(i2,biome44) + v44_bii_missing(i2,biome44) =g= sum(ct, p44_bii_lower_bound(ct,i2,biome44)); + +*' Costs accrue only for `v44_bii_missing`. In the best case costs should be zero or close to zero. +*' Costs strongly depend on the choice of `s44_bii_lower_bound`. + + q44_cost(i2) .. sum(cell(i2,j2), vm_cost_bv_loss(j2)) =e= + sum(biome44, v44_bii_missing(i2,biome44)) * s44_cost_bii_missing; diff --git a/modules/44_biodiversity/bii_target_apr24/input.gms b/modules/44_biodiversity/bii_target_apr24/input.gms new file mode 100644 index 0000000000..e363463c03 --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/input.gms @@ -0,0 +1,35 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +scalars + s44_bii_lower_bound Lower bound for BII (1) / 0 / + c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / + s44_target_year Year in which the BII lower bound is reached (1) / 2100 / + s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / +; + + +table fm_bii_coeff(bii_class44,potnatveg) Biodiversity Intactness Index coefficients (unitless) +$ondelim +$include "./modules/44_biodiversity/bii_target/input/f44_bii_coeff.cs3" +$offdelim +; + +table f44_biome(j,biome44) Share of biome type in each spatial unit (1) +$ondelim +$include "./modules/44_biodiversity/bii_target/input/biorealm_biome.cs3" +$offdelim +; + +parameters +f44_rr_layer(j) Range-rarity restoration prioritization layer (unitless) +/ +$ondelim +$include "./modules/44_biodiversity/bii_target/input/rr_layer.cs2" +$offdelim +/ diff --git a/modules/44_biodiversity/bii_target_apr24/input/files b/modules/44_biodiversity/bii_target_apr24/input/files new file mode 100644 index 0000000000..3afa3b8e8d --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/input/files @@ -0,0 +1,4 @@ +* list of files that are required here +f44_bii_coeff.cs3 +biorealm_biome.cs3 +rr_layer.cs2 diff --git a/modules/44_biodiversity/bii_target_apr24/postsolve.gms b/modules/44_biodiversity/bii_target_apr24/postsolve.gms new file mode 100644 index 0000000000..1974fa3da6 --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/postsolve.gms @@ -0,0 +1,38 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### + ov_cost_bv_loss(t,j,"marginal") = vm_cost_bv_loss.m(j); + ov_bv(t,j,landcover44,potnatveg,"marginal") = vm_bv.m(j,landcover44,potnatveg); + ov44_bii(t,i,biome44,"marginal") = v44_bii.m(i,biome44); + ov44_bii_missing(t,i,biome44,"marginal") = v44_bii_missing.m(i,biome44); + oq44_bii(t,i,biome44,"marginal") = q44_bii.m(i,biome44); + oq44_bii_target(t,i,biome44,"marginal") = q44_bii_target.m(i,biome44); + oq44_cost(t,i,"marginal") = q44_cost.m(i); + ov_cost_bv_loss(t,j,"level") = vm_cost_bv_loss.l(j); + ov_bv(t,j,landcover44,potnatveg,"level") = vm_bv.l(j,landcover44,potnatveg); + ov44_bii(t,i,biome44,"level") = v44_bii.l(i,biome44); + ov44_bii_missing(t,i,biome44,"level") = v44_bii_missing.l(i,biome44); + oq44_bii(t,i,biome44,"level") = q44_bii.l(i,biome44); + oq44_bii_target(t,i,biome44,"level") = q44_bii_target.l(i,biome44); + oq44_cost(t,i,"level") = q44_cost.l(i); + ov_cost_bv_loss(t,j,"upper") = vm_cost_bv_loss.up(j); + ov_bv(t,j,landcover44,potnatveg,"upper") = vm_bv.up(j,landcover44,potnatveg); + ov44_bii(t,i,biome44,"upper") = v44_bii.up(i,biome44); + ov44_bii_missing(t,i,biome44,"upper") = v44_bii_missing.up(i,biome44); + oq44_bii(t,i,biome44,"upper") = q44_bii.up(i,biome44); + oq44_bii_target(t,i,biome44,"upper") = q44_bii_target.up(i,biome44); + oq44_cost(t,i,"upper") = q44_cost.up(i); + ov_cost_bv_loss(t,j,"lower") = vm_cost_bv_loss.lo(j); + ov_bv(t,j,landcover44,potnatveg,"lower") = vm_bv.lo(j,landcover44,potnatveg); + ov44_bii(t,i,biome44,"lower") = v44_bii.lo(i,biome44); + ov44_bii_missing(t,i,biome44,"lower") = v44_bii_missing.lo(i,biome44); + oq44_bii(t,i,biome44,"lower") = q44_bii.lo(i,biome44); + oq44_bii_target(t,i,biome44,"lower") = q44_bii_target.lo(i,biome44); + oq44_cost(t,i,"lower") = q44_cost.lo(i); +*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### + diff --git a/modules/44_biodiversity/bii_target_apr24/preloop.gms b/modules/44_biodiversity/bii_target_apr24/preloop.gms new file mode 100644 index 0000000000..2c6494fe74 --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/preloop.gms @@ -0,0 +1,14 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +v44_bii.l(i,biome44) = 0.75; + +v44_bii.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; +v44_bii_missing.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; +p44_bii_lower_bound(t,i,biome44) = 0; + +vm_bv.l(j,landcover44,potnatveg) = 0; diff --git a/modules/44_biodiversity/bii_target_apr24/presolve.gms b/modules/44_biodiversity/bii_target_apr24/presolve.gms new file mode 100644 index 0000000000..7f9ba294f7 --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/presolve.gms @@ -0,0 +1,29 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +if(m_year(t) = s44_start_year, +* The start value for the linear interpolation is the BII at biome level in the start year. + p44_start_value(i,biome44) = v44_bii.l(i,biome44); +* The target value for the linear interpolation is the lower bound defined in `s44_bii_lower_bound`. + p44_target_value(i,biome44) = s44_bii_lower_bound; + +* Linear increase of BII target values at biome level from start year to target year, and constant values thereafter. + p44_bii_lower_bound(t2,i,biome44) = p44_start_value(i,biome44) + ((m_year(t2) - s44_start_year) / (s44_target_year - s44_start_year)) * (p44_target_value(i,biome44) - p44_start_value(i,biome44)); + p44_bii_lower_bound(t2,i,biome44)$(m_year(t2) > s44_target_year) = p44_target_value(i,biome44); + if(c44_bii_decrease = 0, + p44_bii_lower_bound(t2,i,biome44)$(v44_bii.l(i,biome44) >= p44_target_value(i,biome44)) = v44_bii.l(i,biome44); + elseif c44_bii_decrease = 1, + p44_bii_lower_bound(t2,i,biome44)$(v44_bii.l(i,biome44) >= p44_target_value(i,biome44)) = p44_target_value(i,biome44); + ); + p44_bii_lower_bound(t2,i,biome44)$(p44_bii_lower_bound(t2,i,biome44) >= 1) = 1; + p44_bii_lower_bound(t2,i,biome44)$(m_year(t2) < s44_start_year) = 0; + p44_bii_lower_bound(t2,i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; +* The lower bound of `v44_bii` is set to `p44_bii_lower_bound` to avoid a reduction of BII in combination with `v44_bii_missing`. + v44_bii.lo(i,biome44) = p44_bii_lower_bound(t,i,biome44); + display p44_bii_lower_bound; +); + diff --git a/modules/44_biodiversity/bii_target_apr24/realization.gms b/modules/44_biodiversity/bii_target_apr24/realization.gms new file mode 100644 index 0000000000..1b1298ab5a --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/realization.gms @@ -0,0 +1,25 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @description In this realisation, the Biodiversity Intactness Index (BII) is +*' calculated separately for each biome type of each biogeographic realm, which results in 71 different spatial units (@olson_biome_2001). +*' The BII is a relative indicator, wich measures the intactness of local species assemblages (species richness) +*' compared to a reference state (space-for-time approach) (@purvis_chapter_2018). +*' The implementation uses the BII coefficients described in @leclere_biodiv_2018 and @leclere_bending_2020. +*' The realisation allows to set a lower bound for the BII in the future, based on an annual growth rate. + +*' @limitations + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "sets" $include "./modules/44_biodiversity/bii_target_apr24/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/44_biodiversity/bii_target_apr24/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/44_biodiversity/bii_target_apr24/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/44_biodiversity/bii_target_apr24/equations.gms" +$Ifi "%phase%" == "preloop" $include "./modules/44_biodiversity/bii_target_apr24/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/44_biodiversity/bii_target_apr24/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/44_biodiversity/bii_target_apr24/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### diff --git a/modules/44_biodiversity/bii_target_apr24/sets.gms b/modules/44_biodiversity/bii_target_apr24/sets.gms new file mode 100644 index 0000000000..0a826f7791 --- /dev/null +++ b/modules/44_biodiversity/bii_target_apr24/sets.gms @@ -0,0 +1,32 @@ +*** | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +sets + + landcover44 land cover classes used in bii calculation + / crop_ann, crop_per, manpast, rangeland, urban, aff_ndc, aff_co2p, primforest, secdforest, other, plant / + + bii_class44 bii coefficent land cover classes + / crop_ann, crop_per, manpast, rangeland, urban, primary, secd_mature, secd_young, timber / + + bii_class_secd(bii_class44) bii coefficent land cover classes secondary vegetation + / secd_mature, secd_young / + + ac_to_bii_class_secd(ac,bii_class_secd) Mapping between forest ageclasses and bii coefficent land cover classes + / (ac0,ac5,ac10,ac15,ac20,ac25,ac30) . (secd_young) + (ac35,ac40,ac45,ac50,ac55,ac60, + ac65,ac70,ac75,ac80,ac85,ac90, + ac95,ac100,ac105,ac110,ac115, + ac120,ac125,ac130,ac135,ac140, + ac145,ac150,ac155,acx) . (secd_mature) / + + biome44 biomes + / AA1,AA2,AA4,AA7,AA8,AA10,AA11,AA14,AN11,AT1,AT2,AT7,AT8,AT9,AT10,AT12,AT13,AT14,IM1, + IM2,NA4,IM3,IM13,IM14,NA3,NA8,NA11,IM4,IM5,IM7,IM9,IM10,NT2,NA13,NT1,NT9,NT98,NT99, + OC1,OC2,OC7,NT3,NT4,NT7,NT8,NT10,NT12,NT13,NT14,PA11,PA12,PA13,NA5,PA1,PA4,PA5,PA6, + PA8,PA9,PA10,AN99,AT98,NA2,NA6,NA7,NA12,NA99,PA98,PA99,AA12,AA13 / +; diff --git a/modules/44_biodiversity/module.gms b/modules/44_biodiversity/module.gms index c0b8879714..1b4bc88358 100644 --- a/modules/44_biodiversity/module.gms +++ b/modules/44_biodiversity/module.gms @@ -15,5 +15,6 @@ *###################### R SECTION START (MODULETYPES) ########################## $Ifi "%biodiversity%" == "bii_target" $include "./modules/44_biodiversity/bii_target/realization.gms" +$Ifi "%biodiversity%" == "bii_target_apr24" $include "./modules/44_biodiversity/bii_target_apr24/realization.gms" $Ifi "%biodiversity%" == "bv_btc_mar21" $include "./modules/44_biodiversity/bv_btc_mar21/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ From fbabfc235aea74ca198eeac2d7618331f4e61268 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 8 Apr 2024 14:13:24 +0200 Subject: [PATCH 076/259] update changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cee9d788e..a68800bbd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,8 +8,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- **44_biodiversity** update `bii_target realization` to take `f44_rr_layer` into account in `q44_bii` - **default.cfg** update additional data to rev4.50 +- **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` @@ -21,6 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **15_food** added additional sigmoid food substition scenarios `sigmoid_75pc_25_50`, `sigmoid_50pc_25_50` and `sigmoid_25pc_25_50` - **30_crop** added regional cropland equation `q30_crop_reg` and presolve growth constraint - **32_forestry** added cluster-level new afforestation area constraint for 2025 +- **44_biodiversity** added new realization `bii_target_apr24`, taking into account `f44_rr_layer` - **60_bioenergy** added new realization `1st2ndgen_priced_feb24` to enable price-driven 2nd gen bioenergy production - **scripts** added automatic set writer for new bioenergy realization to `start_functions` - **scripts** added start scripts for the GENIE project From 0263d26a5a142035d89ed90f613027b59a05a8e2 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 8 Apr 2024 14:41:00 +0200 Subject: [PATCH 077/259] bugfix --- modules/44_biodiversity/bii_target_apr24/input.gms | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/44_biodiversity/bii_target_apr24/input.gms b/modules/44_biodiversity/bii_target_apr24/input.gms index e363463c03..fc6d28b687 100644 --- a/modules/44_biodiversity/bii_target_apr24/input.gms +++ b/modules/44_biodiversity/bii_target_apr24/input.gms @@ -16,13 +16,13 @@ scalars table fm_bii_coeff(bii_class44,potnatveg) Biodiversity Intactness Index coefficients (unitless) $ondelim -$include "./modules/44_biodiversity/bii_target/input/f44_bii_coeff.cs3" +$include "./modules/44_biodiversity/bii_target_apr24/input/f44_bii_coeff.cs3" $offdelim ; table f44_biome(j,biome44) Share of biome type in each spatial unit (1) $ondelim -$include "./modules/44_biodiversity/bii_target/input/biorealm_biome.cs3" +$include "./modules/44_biodiversity/bii_target_apr24/input/biorealm_biome.cs3" $offdelim ; @@ -30,6 +30,6 @@ parameters f44_rr_layer(j) Range-rarity restoration prioritization layer (unitless) / $ondelim -$include "./modules/44_biodiversity/bii_target/input/rr_layer.cs2" +$include "./modules/44_biodiversity/bii_target_apr24/input/rr_layer.cs2" $offdelim / From db240651f8dba48558ca9235b7d0fce5616433e9 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 10 Apr 2024 13:18:00 +0200 Subject: [PATCH 078/259] Add end line --- modules/44_biodiversity/bii_target/equations.gms | 1 + modules/44_biodiversity/bii_target_apr24/equations.gms | 1 + 2 files changed, 2 insertions(+) diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index e03693861b..bd3c31fb95 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -25,3 +25,4 @@ q44_cost(i2) .. sum(cell(i2,j2), vm_cost_bv_loss(j2)) =e= sum(biome44, v44_bii_missing(i2,biome44)) * s44_cost_bii_missing; + diff --git a/modules/44_biodiversity/bii_target_apr24/equations.gms b/modules/44_biodiversity/bii_target_apr24/equations.gms index c143e63fc4..b7fdc1ea1d 100644 --- a/modules/44_biodiversity/bii_target_apr24/equations.gms +++ b/modules/44_biodiversity/bii_target_apr24/equations.gms @@ -26,3 +26,4 @@ q44_cost(i2) .. sum(cell(i2,j2), vm_cost_bv_loss(j2)) =e= sum(biome44, v44_bii_missing(i2,biome44)) * s44_cost_bii_missing; + From 1fdaa502a4250c24e4ae874f56074cd43cfe14e8 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Fri, 12 Apr 2024 15:45:05 +0200 Subject: [PATCH 079/259] merge master into develop --- .zenodo.json | 2 +- CHANGELOG.md | 16 ++++++++++++++++ CITATION.cff | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 9a7510def7..efa149f699 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,6 +1,6 @@ { "title": "MAgPIE - An Open Source land-use modeling framework", - "version": "4.7.3", + "version": "4.7.3dev", "creators": [ { "name": "Dietrich, Jan Philipp", diff --git a/CHANGELOG.md b/CHANGELOG.md index 126a34b2ef..ad764e3cf8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [Unreleased] + +### changed +- + +### added +- + +### removed +- + +### fixed +- + + ## [4.7.3] - 2024-04-12 ### changed @@ -23,6 +38,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **56_ghg_policy** added NDC scenarios - **60_bioenergy** added NDC scenarios - **scripts** start script for EAT2p0 Deep Dive project + ### fixed - **15_food** Small number rather 0 in condition checking calorie balancing - **34_urban** `static` realization was not working because `vm_carbon_stock` was referenced without the set `stockType` diff --git a/CITATION.cff b/CITATION.cff index 0a96dd9a16..2e089c7c3d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -131,7 +131,7 @@ authors: email: popp@pik-potsdam.de title: MAgPIE - An Open Source land-use modeling framework -version: 4.7.3 +version: 4.7.3dev date-released: 2024-04-12 repository-code: https://github.com/magpiemodel/magpie keywords: From 0ef652e64db4bfb1c03b8aca4df947730ae61d2a Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 12 Apr 2024 17:36:52 +0200 Subject: [PATCH 080/259] added baseline conservation options --- CHANGELOG.md | 7 +- config/default.cfg | 49 ++++++++------ main.gms | 66 +++++++++---------- .../area_based_apr22/declarations.gms | 19 +++--- .../area_based_apr22/input.gms | 6 +- .../area_based_apr22/preloop.gms | 9 ++- .../area_based_apr22/presolve.gms | 15 ++++- .../area_based_apr22/sets.gms | 6 ++ 8 files changed, 107 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57111eb3fd..e77bd00e1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed +- **22_land_conservation and default.cfg** Added options for baseline protection - **default.cfg** updated inputdata revision to 4.104 to have NDC scenarios included - **scripts** cfg$gms$s35_secdf_distribution <- 2 for FSEC - **scripts** modified output reporting for SEALS to account for forestry plantations @@ -16,12 +17,12 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **21_trade** v21_import_for_feasibility now available for all coutnries, not just for importers - **70_livestock** if `c70_fac_req_regr` is set to `reg`: use of USDA/FAO values for historic factor requirements for livestock instead of using regression values and change of calibration year from 2005 to 2010 for regional factor requirements regression - **21_trade** Revision of trade module. Replaced `cfg$gms$s21_trade_bal_damper` in favour of `cfg$gms$k_import21`, which allows for additional imports to maintain feasibility -- **scripts/calibration/landconversion_cost.R** Revised calibration approach for conversion costs for cropland. Information from all calibration time steps in combination with a lowpass filter is now used for deriving the calibration factors, which avoids the previous zickzack pattern. The previous option `cfg$damping_factor_landconversion_cost` has been removed in favor of `cfg$lowpass_filter_landconversion_cost`. +- **scripts/calibration/landconversion_cost.R** Revised calibration approach for conversion costs for cropland. Information from all calibration time steps in combination with a lowpass filter is now used for deriving the calibration factors, which avoids the previous zickzack pattern. The previous option `cfg$damping_factor_landconversion_cost` has been removed in favor of `cfg$lowpass_filter_landconversion_cost`. ### added - **14_yields** added minimum threshold for wood yields. Below this threshold, wood yields are set to zero. - **56_ghg_policy** added NDC scenarios -- **60_bioenergy** added NDC scenarios +- **60_bioenergy** added NDC scenarios ### removed - @@ -29,7 +30,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### fixed - **52_carbon** removing jump of carbon content into fully grown forest when a forest changes from second-last age class to last age-class. - **80_optimization** duplicated solve statement in all instances to avoid non-matchting left- and right-hand sides of equations -- **58_peatland** Equation `q58_scalingFactorExp` revised to avoid division by zero. +- **58_peatland** Equation `q58_scalingFactorExp` revised to avoid division by zero. ## [4.7.2] - 2024-04-02 diff --git a/config/default.cfg b/config/default.cfg index 7d519e85f4..f7443dfc92 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -98,7 +98,7 @@ cfg$calib_accuracy_landconversion_cost <- 0.05 # def = 0.05 cfg$calib_maxiter_landconversion_cost <- 40 # def = 40 # Restart from existing calibration factors (TRUE or FALSE) cfg$restart_landconversion_cost <- FALSE # def = FALSE -# Number of lowpass filter iterations applied on calibration factors +# Number of lowpass filter iterations applied on calibration factors # for time steps 1995-2015 cfg$lowpass_filter_landconversion_cost <- 1 # def= 1 # Set upper limit for cropland calibration factor @@ -615,36 +615,47 @@ cfg$gms$s21_trade_tariff_targetyear <- 2050 # * based on WDPA and conservation priority areas cfg$gms$land_conservation <- "area_based_apr22" # def = area_based_apr22 +# * Baseline protection in historic and future time steps +# * ("WDPA") All legally designated protected areas across all IUCN categories +# * ("WDPA_I-II-III") All legally designated protected areas in IUCN categories I, II & III +# * ("WDPA_IV-V-VI") All legally designated protected areas in IUCN categories IV, V & VI +# * ("none") No baseline protection +# * Note: c22_base_protect applies to countries selected in policy_countries22 +# * c22_protect_scenario_noselect applies to all other countries. +cfg$gms$c22_base_protect <- "WDPA" # def = WDPA +cfg$gms$c22_base_protect_noselect <- "WDPA" # def = WDPA + # * Additional land conservation target based on conservation priority areas # * during future time steps (after `cfg$gms$sm_fix_SSP2`). -# * ("none") No additional land conservation target (WDPA only) +# * ("none") No additional land conservation target (Baseline only) # * ("30by30") 30 % of global land surface in Key Biodiversity Areas (KBA), -# * GSN Distinct Species Assemblages & Critical Connectivity Areas + WDPA -# * ("KBA") Key Biodiversity Areas + WDPA -# * ("GSN_DSA") Global Safety Net: Distinct Species Assemblages + WDPA -# * ("GSN_RarePhen") Global Safety Net: Rare Phenomena + WDPA -# * ("GSN_AreaIntct") Global Safety Net: Areas of Intactness + WDPA -# * ("GSN_ClimTier1") Global Safety Net: Climate Stabilisation Tier 1 + WDPA -# * ("GSN_ClimTier2") Global Safety Net: Climate Stabilisation Tier 2 + WDPA -# * ("CCA") Critical Connectivity Areas (Brennan et al. 2022) + WDPA +# * GSN Distinct Species Assemblages & Critical Connectivity Areas + Baseline +# * ("KBA") Key Biodiversity Areas + Baseline +# * ("GSN_DSA") Global Safety Net: Distinct Species Assemblages + Baseline +# * ("GSN_RarePhen") Global Safety Net: Rare Phenomena + Baseline +# * ("GSN_AreaIntct") Global Safety Net: Areas of Intactness + Baseline +# * ("GSN_ClimTier1") Global Safety Net: Climate Stabilisation Tier 1 + Baseline +# * ("GSN_ClimTier2") Global Safety Net: Climate Stabilisation Tier 2 + Baseline +# * ("CCA") Critical Connectivity Areas (Brennan et al. 2022) + Baseline # * ("IrrC_XXpc") Land area that covers XX percent of total global irrecoverable carbon # * as defined by Noon et al. (2022), where XX correponds to either -# * 50, 75, 95, or 99 percent + WDPA +# * 50, 75, 95, or 99 percent + Baseline # * ("IrrC_XXpc_30by30") 30by30 + Land area that covers XX percent of total global irrecoverable # * carbon as defined by Noon et al. (2022), where XX correponds to either -# * 50, 75, 95, or 99 percent + WDPA -# * ("BH") Biodiversity Hotspots + WDPA -# * ("IFL") Intact Forest Landscapes + WDPA -# * ("BH_IFL") Biodiversity Hotspots + Intact Forest Landscapes + WDPA +# * 50, 75, 95, or 99 percent + Baseline +# * ("BH") Biodiversity Hotspots + Baseline +# * ("IFL") Intact Forest Landscapes + Baseline +# * ("BH_IFL") Biodiversity Hotspots + Intact Forest Landscapes + Baseline # * ("GSN_HalfEarth") Full protection of areas within the Global Safety Net, which # * roughly corresponds to 50 percent of the global land surface # * ("PBL_HalfEarth") Ecoregion-based approach to protecting half of the global land surface # * Note: c22_protect_scenario applies to countries selected in policy_countries22 # * c22_protect_scenario_noselect applies to all other countries. -cfg$gms$c22_protect_scenario <- "none" # def = None -cfg$gms$c22_protect_scenario_noselect <- "none" # def = None -# * Switch and specification of countries for which land conservation policies in -# * c22_protect_scenario apply. +cfg$gms$c22_protect_scenario <- "none" # def = none +cfg$gms$c22_protect_scenario_noselect <- "none" # def = none + +# * Switch and specification of countries for which land conservation +# * in c22_base_protect and c22_protect_scenario apply. # * Options: list of iso-codes of countries where land conservation should be applied # * Note: must be written in the format: "IND, BRA, DEU" # * Default: all iso countries diff --git a/main.gms b/main.gms index 413135031c..ccfdc7d953 100644 --- a/main.gms +++ b/main.gms @@ -147,44 +147,44 @@ $title magpie *' * Always try to access model outputs through the corresponding magpie package instead of accessing them directly with readGDX. It cannot be guaranteed that your script will work in the future if you do otherwise (as only the corresponding magpie package will be continuously adapted to changes in the GAMS code). *##################### R SECTION START (VERSION INFO) ########################## -* -* Used data set: rev4.99_h12_magpie.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.99_h12_validation.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: additional_data_rev4.47.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive -* -* Used data set: calibration_H12_per_ton_fao_may22_glo_08Aug23.tgz -* md5sum: NA -* Repository: https://rse.pik-potsdam.de/data/magpie/public -* +* +* Used data set: rev4.104_h12_magpie.tgz +* md5sum: 533c0a589c7f5d5cf40bab6ec2297640 +* Repository: /p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz +* md5sum: c2036af336688758ffd4cb03c2d1a05c +* Repository: /p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.104_h12_validation.tgz +* md5sum: 4b222cbca5f2134ce378e3838f7cd0d5 +* Repository: /p/projects/rd3mod/inputdata/output +* +* Used data set: additional_data_rev4.48.tgz +* md5sum: 0788a1d39cab12f89a9411c2636bffc7 +* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public +* +* Used data set: calibration_H12_26Mar24.tgz +* md5sum: d295e7ff0c65d97c1e0b84c440d0056b +* Repository: /p/projects/landuse/data/input/calibration +* * Low resolution: c200 * High resolution: 0.5 -* +* * Total number of cells: 200 -* +* * Number of cells per region: * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 -* +* * Regionscode: 62eff8f7 -* -* Regions data revision: 4.99 -* +* +* Regions data revision: 4.104 +* * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 -* * Revision: 4.99 -* +* * Revision: 4.104 +* * aggregation settings: * * Input resolution: 0.5 * * Output resolution: c200 @@ -193,10 +193,10 @@ $title magpie * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) -* -* -* Last modification (input data): Wed Feb 7 15:35:14 2024 -* +* +* +* Last modification (input data): Wed Apr 10 14:38:12 2024 +* *###################### R SECTION END (VERSION INFO) ########################### $offupper diff --git a/modules/22_land_conservation/area_based_apr22/declarations.gms b/modules/22_land_conservation/area_based_apr22/declarations.gms index 2b41c74337..5ea850c85b 100644 --- a/modules/22_land_conservation/area_based_apr22/declarations.gms +++ b/modules/22_land_conservation/area_based_apr22/declarations.gms @@ -10,15 +10,16 @@ scalars ; parameters - p22_conservation_area(t,j,land) Total land conservation area for all land types (mio. ha) + p22_wdpa_baseline(t,j,base22,land) Baseline protection (mio. ha) + p22_conservation_area(t,j,land) Total land conservation area for all land types (mio. ha) pm_land_conservation(t,j,land,consv_type) Land protection and restoration for all land types (mio. ha) - p22_conservation_fader(t_all) Land conservation fader (1) - p22_add_consv(t,j,consv22_all,land) Addtional land conservation in conservation priority areas (mio. ha) - p22_secdforest_restore_pot(t,j) Potential secondary forest restoration area (mio. ha) - p22_past_restore_pot(t,j) Potential pasture restoration area (mio. ha) - p22_other_restore_pot(t,j) Potential other land restoration area (mio. ha) - p22_country_weight(i) Land conservation country weight per region (1) - p22_country_dummy(iso) Dummy parameter indicating whether country is affected by selected land conservation policy (1) - i22_land_iso(iso) Total land area at ISO level (mio. ha) + p22_conservation_fader(t_all) Land conservation fader (1) + p22_add_consv(t,j,consv22_all,land) Addtional land conservation in conservation priority areas (mio. ha) + p22_secdforest_restore_pot(t,j) Potential secondary forest restoration area (mio. ha) + p22_past_restore_pot(t,j) Potential pasture restoration area (mio. ha) + p22_other_restore_pot(t,j) Potential other land restoration area (mio. ha) + p22_country_weight(i) Land conservation country weight per region (1) + p22_country_dummy(iso) Dummy parameter indicating whether country is affected by selected land conservation policy (1) + i22_land_iso(iso) Total land area at ISO level (mio. ha) ; diff --git a/modules/22_land_conservation/area_based_apr22/input.gms b/modules/22_land_conservation/area_based_apr22/input.gms index 6fc42da0c1..6d574bdc51 100644 --- a/modules/22_land_conservation/area_based_apr22/input.gms +++ b/modules/22_land_conservation/area_based_apr22/input.gms @@ -5,6 +5,8 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de +$setglobal c22_base_protect WDPA +$setglobal c22_base_protect_noselect WDPA $setglobal c22_protect_scenario none $setglobal c22_protect_scenario_noselect none @@ -45,13 +47,13 @@ sets VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE / ; -table f22_wdpa_baseline(t_all,j,land) Initial protected area as derived from WDPA until 2020 (mio. ha) +table f22_wdpa_baseline(t_all,j,wdpa_cat22,land) Initial protected area as derived from WDPA until 2020 (mio. ha) $ondelim $include "./modules/22_land_conservation/input/wdpa_baseline.cs3" $offdelim ; * fix to 2020 values for years after 2020 -m_fillmissingyears(f22_wdpa_baseline,"j,land"); +m_fillmissingyears(f22_wdpa_baseline,"j,wdpa_cat22,land"); table f22_consv_prio(j,consv_prio22,land) Conservation priority areas (mio. ha) $ondelim diff --git a/modules/22_land_conservation/area_based_apr22/preloop.gms b/modules/22_land_conservation/area_based_apr22/preloop.gms index 9c184690c9..ab4b497f81 100644 --- a/modules/22_land_conservation/area_based_apr22/preloop.gms +++ b/modules/22_land_conservation/area_based_apr22/preloop.gms @@ -21,9 +21,16 @@ i22_land_iso(iso) = sum(land, fm_land_iso("y1995",iso,land)); p22_country_weight(i) = sum(i_to_iso(i,iso), p22_country_dummy(iso) * i22_land_iso(iso)) / sum(i_to_iso(i,iso), i22_land_iso(iso)); * --------------------------------------------------------------------- -* Initialise addtional land protection in conservation priority areas +* Initialise baseline protection and conservation priority areas * --------------------------------------------------------------------- +** Initialise baseline protection area +p22_wdpa_baseline(t,j,base22,land) = 0; + +* Get baseline protection in based on WDPA data +p22_wdpa_baseline(t,j,wdpa_cat22,land) = f22_wdpa_baseline(t,j,wdpa_cat22,land); + + ** Trajectory for implementation of land conservation * sigmoidal interpolation between 2020 and target year m_sigmoid_time_interpol(p22_conservation_fader,s22_conservation_start,s22_conservation_target,0,1); diff --git a/modules/22_land_conservation/area_based_apr22/presolve.gms b/modules/22_land_conservation/area_based_apr22/presolve.gms index 169c3930c8..1ff0c39820 100644 --- a/modules/22_land_conservation/area_based_apr22/presolve.gms +++ b/modules/22_land_conservation/area_based_apr22/presolve.gms @@ -20,15 +20,24 @@ p22_add_consv(t,j,"BH_IFL","primforest") = pcm_land(j,"primforest") * p22_conser if(m_year(t) <= sm_fix_SSP2, * from 1995 to 2020 land conservation is based on * historic trends as derived from WDPA - p22_conservation_area(t,j,land) = f22_wdpa_baseline(t,j,land); + p22_conservation_area(t,j,land) = sum(cell(i,j), + p22_wdpa_baseline(t,j,"%c22_base_protect%",land) * p22_country_weight(i) + + p22_wdpa_baseline(t,j,"%c22_base_protect_noselect%",land) * (1-p22_country_weight(i)) + ); else ** Future land conservation only pertains to natural vegetation classes (land_natveg) -p22_conservation_area(t,j,land) = f22_wdpa_baseline(t,j,land); +p22_conservation_area(t,j,land) = sum(cell(i,j), + p22_wdpa_baseline(t,j,"%c22_base_protect%",land) * p22_country_weight(i) + + p22_wdpa_baseline(t,j,"%c22_base_protect_noselect%",land) * (1-p22_country_weight(i)) + ); * future options for land conservation are added to the WDPA baseline p22_conservation_area(t,j,land_natveg) = - f22_wdpa_baseline(t,j,land_natveg) + sum(cell(i,j), + p22_wdpa_baseline(t,j,"%c22_base_protect%",land_natveg) * p22_country_weight(i) + + p22_wdpa_baseline(t,j,"%c22_base_protect_noselect%",land_natveg) * (1-p22_country_weight(i)) + ) + sum(cell(i,j), p22_add_consv(t,j,"%c22_protect_scenario%",land_natveg) * p22_country_weight(i) + p22_add_consv(t,j,"%c22_protect_scenario_noselect%",land_natveg) * (1-p22_country_weight(i)) diff --git a/modules/22_land_conservation/area_based_apr22/sets.gms b/modules/22_land_conservation/area_based_apr22/sets.gms index ac391833f5..2f3cb09eb9 100644 --- a/modules/22_land_conservation/area_based_apr22/sets.gms +++ b/modules/22_land_conservation/area_based_apr22/sets.gms @@ -7,6 +7,12 @@ sets + base22 All baseline protection options + / none, WDPA, WDPA_I-II-III, WDPA_IV-V-VI / + + wdpa_cat22(base22) Protected area categories + / WDPA, WDPA_I-II-III, WDPA_IV-V-VI / + consv22_all All conservation options / none, 30by30, KBA, GSN_DSA, GSN_RarePhen, GSN_AreaIntct, GSN_ClimTier1, GSN_ClimTier2, BH, IFL, BH_IFL, IrrC_50pc, IrrC_75pc, IrrC_95pc, IrrC_99pc, IrrC_75pc_30by30, From 58b580e0d23ed7f1a86e33ec0b35493876a2828d Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Mon, 15 Apr 2024 10:19:05 +0200 Subject: [PATCH 081/259] upload doc for release as rse user --- scripts/release.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/release.R b/scripts/release.R index 3160219ff9..e51ca12427 100644 --- a/scripts/release.R +++ b/scripts/release.R @@ -31,7 +31,7 @@ release <- function(newVersion) { message("creating documentation using goxygen...") goxygen::goxygen() message("uploading documentation to RSE server") - system(paste0("rsync -e ssh -avz doc/html/* rse:/webservice/doc/magpie/", newVersion)) + system(paste0("rsync -e ssh -avz doc/html/* rse@rse.pik-potsdam.de:/webservice/doc/magpie/", newVersion)) message("uploading input data to RSE server") sys.source("scripts/start/extra/publish_data.R", envir = new.env()) # only works on cluster From 2f29c61c4dab435c44c4ab5440408f8dab8e2d65 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 15 Apr 2024 10:40:25 +0200 Subject: [PATCH 082/259] bugfixes develop --- CHANGELOG.md | 5 ++++- config/scenario_config.csv | 2 +- config/scenario_fsec.csv | 6 +++--- modules/44_biodiversity/bii_target/equations.gms | 6 +++--- modules/44_biodiversity/bii_target/preloop.gms | 4 ++-- scripts/projects/fsec.R | 6 +++--- 6 files changed, 16 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad764e3cf8..a0b6279249 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - ### fixed -- +- **44_biodiversity** avoid division by zero +- **scenario_config.csv** same revision for input files as in default.cfg +- **scenario_fsec.csv** scenario settings +- **start/projects/fsec.R** scenario settings ## [4.7.3] - 2024-04-12 diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 55df2a190b..4c1657a7d8 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -82,7 +82,7 @@ gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;; gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;; gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;; gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.101_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.101_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.101_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.101_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.101_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.101_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.104_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.104_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.104_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.104_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.104_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz; gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU; gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;; diff --git a/config/scenario_fsec.csv b/config/scenario_fsec.csv index 95b736bf21..b4b96c2a90 100644 --- a/config/scenario_fsec.csv +++ b/config/scenario_fsec.csv @@ -1,4 +1,4 @@ -;FSEC;population;institutions;energy;bioplastics;capitalSubst;minWage;noUnderweight;halfOverweight;fruitsNutsVegSeeds;monogastrics;ruminants;pulses;processed;fish;waste;awms;livestock;cropefficiency;nueMAC;riceMAC;biodiversity;fairTrade;timberCities;REDDaff;REDD;landscapeElements;landSharing;landSparing;waterSparing;peatland;soil;allDiet;allDietAndWaste;allEnvPrice;allEmisPrice;SSP1;SSP2;SSP3;SSP4;SSP5;RCP19;RCP26;RCP34;RCP45;RCP60;RCP70;RCP85;SSP1energy;labor8p5;labor1p9 +;FSEC;population;institutions;energy;bioplastics;capitalSubst;minWage;noUnderweight;halfOverweight;fruitsNutsVegSeeds;monogastrics;ruminants;pulses;processed;fish;waste;awms;livestock;cropefficiency;nueMAC;riceMAC;biodiversity;fairTrade;timberCities;REDDaff;REDD;landscapeElements;landSharing;landSparing;waterSparing;peatland;soil;allDiet;allDietAndWaste;allEnvPrice;allEmisPrice;SSP1;SSP2;SSP3;SSP4;SSP5;RCP19;RCP26;RCP34;RCP45;RCP60;RCP70;RCP85;SDPenergy;labor8p5;labor1p9 gms$c09_pop_scenario;;SSP1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c09_gdp_scenario;;;SSP1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c09_pal_scenario;;;SDP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -68,7 +68,7 @@ gms$s57_maxmac_ch4_entferm;-1;;;;;;;;;;;;;;;;;201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s57_maxmac_ch4_awms;-1;;;;;;;;;;;;;;;;201;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Inf;;;;;;;;;;;;;;;;;;;; gms$som;cellpool_aug16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;R21M42-SSP2-NDC;;;R21M42-SSP2-PkBudg900;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;R21M42-SSP1-PkBudg900;; +gms$c60_2ndgen_biodem;R21M42-SSP2-NDC;;;R21M42-SSP2-PkBudg900;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;R21M42-SDP-PkBudg900;; gms$c60_res_2ndgenBE_dem;;;;sdp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s62_max_dem_bioplastic;0;;;;400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_fac_req_regr;reg;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -79,4 +79,4 @@ input['regional'];rev4.104_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['validation'];rev4.104_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['additional'];additional_data_rev4.48.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['calibration'];calibration_FSEC_26Mar24.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_SSP1-PkBudg900.mif;; +magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_RemSDP-900-MagSSP1.mif;; diff --git a/modules/44_biodiversity/bii_target/equations.gms b/modules/44_biodiversity/bii_target/equations.gms index bd3c31fb95..cc753571e8 100644 --- a/modules/44_biodiversity/bii_target/equations.gms +++ b/modules/44_biodiversity/bii_target/equations.gms @@ -10,14 +10,14 @@ *' The Biodiversity Intactness Index (BII) is calculated at the level of 71 biomes. *' The regional layer is needed for compatibility with the high resolution parallel optimization output script (scripts/output/extra/highres.R) - q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. v44_bii(i2,biome44) + q44_bii(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 1e-10) .. v44_bii(i2,biome44) * sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44)) =e= - (sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_biome(j2,biome44)) / sum((cell(i2,j2),land), pcm_land(j2,land) * f44_biome(j2,biome44))); + sum((cell(i2,j2),potnatveg,landcover44), vm_bv(j2,landcover44,potnatveg) * f44_biome(j2,biome44)); *' For each of the 71 biomes, the BII has to meet a minium level based on `s44_bii_lower_bound`. *' `v44_bii_missing` is a technical variable to maintain feasibility in case `v44_bii` cannot be increased. - q44_bii_target(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 0) .. + q44_bii_target(i2,biome44)$(sum(cell(i2,j2), f44_biome(j2,biome44)) > 1e-10) .. v44_bii(i2,biome44) + v44_bii_missing(i2,biome44) =g= sum(ct, p44_bii_lower_bound(ct,i2,biome44)); *' Costs accrue only for `v44_bii_missing`. In the best case costs should be zero or close to zero. diff --git a/modules/44_biodiversity/bii_target/preloop.gms b/modules/44_biodiversity/bii_target/preloop.gms index 8c51d5f2a2..e14172dca5 100644 --- a/modules/44_biodiversity/bii_target/preloop.gms +++ b/modules/44_biodiversity/bii_target/preloop.gms @@ -7,8 +7,8 @@ v44_bii.l(i,biome44) = 0.75; -v44_bii.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; -v44_bii_missing.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) = 0) = 0; +v44_bii.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) <= 1e-10) = 0; +v44_bii_missing.fx(i,biome44)$(sum(cell(i,j), f44_biome(j,biome44)) <= 1e-10) = 0; p44_bii_lower_bound(t,i,biome44) = 0; vm_bv.l(j,landcover44,potnatveg) = 0; diff --git a/scripts/projects/fsec.R b/scripts/projects/fsec.R index 5cb94c2442..0924c3f579 100644 --- a/scripts/projects/fsec.R +++ b/scripts/projects/fsec.R @@ -37,13 +37,13 @@ fsecScenario <- function(scenario) { "energy", "bioplastics", "population", "institutions", "timberCities", "awms", "livestock", "nueMAC", "riceMAC", "biodiversity", "fairTrade", "capitalSubst", "minWage", "REDDaff", "REDD", "landscapeElements", "landSharing", "landSparing", "waterSparing", "peatland", - "soil", "allDietAndWaste", "allEnvPrice", "SSP1energy", "RCP19")), + "soil", "allDietAndWaste", "allEnvPrice", "SDPenergy", "RCP19")), f_FSDPlabor1p9 = list(standard = c("cc", "SSP2", "NDC", "ForestryEndo"), fsec = c("FSEC", "energy", "bioplastics", "population", "institutions", "timberCities", "awms", "livestock", "nueMAC", "riceMAC", "biodiversity", "fairTrade", "capitalSubst", "minWage", "REDDaff", "REDD", "landscapeElements", "landSharing", "landSparing", "waterSparing", "peatland", - "soil", "allDietAndWaste", "allEnvPrice", "SSP1energy", "RCP19", "labor1p9")), + "soil", "allDietAndWaste", "allEnvPrice", "SDPenergy", "RCP19", "labor1p9")), # FSDPs (without external) d_SSP1fsdp = list(standard = c("cc", "SSP1", "NDC", "ForestryEndo"), fsec = c("FSEC", "SSP1", @@ -135,7 +135,7 @@ fsecScenario <- function(scenario) { fsec = c("FSEC", "soil", "RCP60")), # Scenarios (combinations of transformation clusters) b_ExternalPressures = list(standard = c("cc", "SSP2", "NDC", "ForestryEndo"), - fsec = c("FSEC", "population", "institutions", "energy", "bioplastics", "timberCities", "SSP1energy", "RCP26")), + fsec = c("FSEC", "population", "institutions", "energy", "bioplastics", "timberCities", "SDPenergy", "RCP26")), b_WaterSoil = list(standard = c("cc", "SSP2", "NDC", "ForestryEndo"), fsec = c("FSEC", "waterSparing", "soil", "RCP60")), b_REDDaffRuminants = list(standard = c("cc", "SSP2", "NDC", "ForestryEndo"), From f428c9694762832b5d0217cd9327c7e7e5bd1715 Mon Sep 17 00:00:00 2001 From: pvjeetze <50408549+pvjeetze@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:51:36 +0000 Subject: [PATCH 083/259] land conservation disaggregation fix --- scripts/output/extra/disaggregation.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 769ee3f95c..17190f6adc 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -109,7 +109,7 @@ if (length(map_file) > 1) { ) iso <- readGDX(gdx, "iso") consv_iso <- readGDX(gdx, "policy_countries22") - consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.1)] + consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.3)] consv_select <- cfg$gms$c22_protect_scenario consv_noselect <- cfg$gms$c22_protect_scenario_noselect From 052b0faefc8bffb9a781206c43f8839228cbef9d Mon Sep 17 00:00:00 2001 From: pvjeetze <50408549+pvjeetze@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:54:23 +0000 Subject: [PATCH 084/259] added error message --- scripts/output/extra/disaggregation.R | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 17190f6adc..79c79e5ec3 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -110,6 +110,9 @@ if (length(map_file) > 1) { iso <- readGDX(gdx, "iso") consv_iso <- readGDX(gdx, "policy_countries22") consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.3)] + if (length(consv_iso) == 0) { + warning("No countries selected in land conservation disaggregation. Results may be erroneous") + } consv_select <- cfg$gms$c22_protect_scenario consv_noselect <- cfg$gms$c22_protect_scenario_noselect From aff90f42cb8bb53921e10e1d7b052db6408fb5d4 Mon Sep 17 00:00:00 2001 From: pvjeetze <50408549+pvjeetze@users.noreply.github.com> Date: Mon, 15 Apr 2024 11:59:21 +0000 Subject: [PATCH 085/259] added disagg fix to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0b6279249..f175ac1078 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - ### fixed +- **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs - **44_biodiversity** avoid division by zero - **scenario_config.csv** same revision for input files as in default.cfg - **scenario_fsec.csv** scenario settings From ef4bc13704482a6d095016dacaf19782c7bef93f Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 15 Apr 2024 15:03:22 +0200 Subject: [PATCH 086/259] modified extra/disaggregation to account for different basline protection options --- config/default.cfg | 8 +-- main.gms | 66 +++++++++++------------ scripts/output/extra/disaggregation.R | 75 +++++++++++++++++---------- scripts/start/testWDPABase.R | 61 ++++++++++++++++++++++ 4 files changed, 145 insertions(+), 65 deletions(-) create mode 100644 scripts/start/testWDPABase.R diff --git a/config/default.cfg b/config/default.cfg index f7443dfc92..87eff87a9c 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -616,12 +616,12 @@ cfg$gms$s21_trade_tariff_targetyear <- 2050 cfg$gms$land_conservation <- "area_based_apr22" # def = area_based_apr22 # * Baseline protection in historic and future time steps -# * ("WDPA") All legally designated protected areas across all IUCN categories -# * ("WDPA_I-II-III") All legally designated protected areas in IUCN categories I, II & III -# * ("WDPA_IV-V-VI") All legally designated protected areas in IUCN categories IV, V & VI +# * ("WDPA") All legally protected areas across all IUCN categories +# * ("WDPA_I-II-III") All legally protected areas in IUCN categories I, II & III +# * ("WDPA_IV-V-VI") All legally protected areas in IUCN categories IV, V & VI # * ("none") No baseline protection # * Note: c22_base_protect applies to countries selected in policy_countries22 -# * c22_protect_scenario_noselect applies to all other countries. +# * c22_base_protect_noselect applies to all other countries. cfg$gms$c22_base_protect <- "WDPA" # def = WDPA cfg$gms$c22_base_protect_noselect <- "WDPA" # def = WDPA diff --git a/main.gms b/main.gms index ccfdc7d953..413135031c 100644 --- a/main.gms +++ b/main.gms @@ -147,44 +147,44 @@ $title magpie *' * Always try to access model outputs through the corresponding magpie package instead of accessing them directly with readGDX. It cannot be guaranteed that your script will work in the future if you do otherwise (as only the corresponding magpie package will be continuously adapted to changes in the GAMS code). *##################### R SECTION START (VERSION INFO) ########################## -* -* Used data set: rev4.104_h12_magpie.tgz -* md5sum: 533c0a589c7f5d5cf40bab6ec2297640 -* Repository: /p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: c2036af336688758ffd4cb03c2d1a05c -* Repository: /p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.104_h12_validation.tgz -* md5sum: 4b222cbca5f2134ce378e3838f7cd0d5 -* Repository: /p/projects/rd3mod/inputdata/output -* -* Used data set: additional_data_rev4.48.tgz -* md5sum: 0788a1d39cab12f89a9411c2636bffc7 -* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public -* -* Used data set: calibration_H12_26Mar24.tgz -* md5sum: d295e7ff0c65d97c1e0b84c440d0056b -* Repository: /p/projects/landuse/data/input/calibration -* +* +* Used data set: rev4.99_h12_magpie.tgz +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.99_h12_validation.tgz +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* +* Used data set: additional_data_rev4.47.tgz +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive +* +* Used data set: calibration_H12_per_ton_fao_may22_glo_08Aug23.tgz +* md5sum: NA +* Repository: https://rse.pik-potsdam.de/data/magpie/public +* * Low resolution: c200 * High resolution: 0.5 -* +* * Total number of cells: 200 -* +* * Number of cells per region: * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 -* +* * Regionscode: 62eff8f7 -* -* Regions data revision: 4.104 -* +* +* Regions data revision: 4.99 +* * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 -* * Revision: 4.104 -* +* * Revision: 4.99 +* * aggregation settings: * * Input resolution: 0.5 * * Output resolution: c200 @@ -193,10 +193,10 @@ $title magpie * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) -* -* -* Last modification (input data): Wed Apr 10 14:38:12 2024 -* +* +* +* Last modification (input data): Wed Feb 7 15:35:14 2024 +* *###################### R SECTION END (VERSION INFO) ########################### $offupper diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 769ee3f95c..b4918e9f11 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -54,7 +54,6 @@ if (length(map_file) > 1) { map_file <- map_file[1] } - # ----------------------------------------- # Output functions # ----------------------------------------- @@ -89,15 +88,36 @@ if (length(map_file) > 1) { } .dissagLandConsv <- function(gdx, cfg, map_file, wdpa_hr_file, consv_prio_hr_file) { - land_consv_lr <- readGDX(gdx, "pm_land_conservation", react = "silent") + land_consv_lr <- readGDX(gdx, "p22_conservation_area", react = "silent") wdpa_hr <- read.magpie(wdpa_hr_file) map <- readRDS(map_file) # create full time series - land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getNames(wdpa_hr), - sets = c("x.y.iso", "year", getSets(wdpa_hr, fulldim = FALSE)[3])) - land_consv_hr[, getYears(land_consv_hr), ] <- wdpa_hr[, nyears(wdpa_hr), ] - land_consv_hr[, getYears(wdpa_hr), ] <- wdpa_hr + land_consv_hr <- new.magpie(map[, "cell"], getYears(land_consv_lr), getItems(wdpa_hr, dim = 3.2), + fill = 0, sets = c("x.y.iso", "year", "data") + ) + + iso <- readGDX(gdx, "iso") + consv_iso <- readGDX(gdx, "policy_countries22") + consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.3)] + if (length(consv_iso) == 0) { + warning("No countries selected in land conservation disaggregation. Results may be erroneous") + } + + if (!all(c(cfg$gms$c22_base_protect, cfg$gms$c22_base_protect_noselect) %in% "none")) { + base_protect_select <- cfg$gms$c22_base_protect + base_protect_noselect <- cfg$gms$c22_base_protect_noselect + + if (base_protect_noselect != "none") { + land_consv_hr[, getYears(land_consv_hr), ] <- collapseDim(wdpa_hr[, nyears(wdpa_hr), base_protect_noselect], dim = 3.1) + land_consv_hr[, getYears(wdpa_hr), ] <- collapseDim(wdpa_hr[, , base_protect_noselect], dim = 3.1) + } + if (base_protect_select != "none") { + land_consv_hr[consv_iso, , ] <- collapseDim(wdpa_hr[consv_iso, nyears(wdpa_hr), base_protect_select], dim = 3.1) + } else if (base_protect_select == "none") { + land_consv_hr[consv_iso, , ] <- 0 + } + } if (!all(c(cfg$gms$c22_protect_scenario, cfg$gms$c22_protect_scenario_noselect) %in% "none")) { if (file.exists(consv_prio_hr_file)) { @@ -107,9 +127,7 @@ if (length(map_file) > 1) { names = getNames(consv_prio_all, dim = 2), fill = 0, sets = c("x.y.iso", "year", "data") ) - iso <- readGDX(gdx, "iso") - consv_iso <- readGDX(gdx, "policy_countries22") - consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.1)] + consv_select <- cfg$gms$c22_protect_scenario consv_noselect <- cfg$gms$c22_protect_scenario_noselect @@ -512,39 +530,40 @@ gc() message("Disaggregating peatland") -#check for peatland version -if(cfg$gms$peatland == "v2") { - peat_lr <- PeatlandArea(gdx,level="cell",sum=FALSE) +# check for peatland version +if (cfg$gms$peatland == "v2") { + peat_lr <- PeatlandArea(gdx, level = "cell", sum = FALSE) peat_ini_hr <- read.magpie(peatland_v2_hr_file) - peat_ini_hr <- add_columns(peat_ini_hr,addnm = "rewetted",dim = "d3",fill = 0) - peat_ini_hr <- add_columns(peat_ini_hr,addnm = "unused",dim = "d3",fill = 0) - peat_hr <- suppressWarnings(luscale::interpolate2(peat_lr,peat_ini_hr,map_file)) - peat_hr <- peat_hr[,getYears(peat_hr,as.integer = T) >= cfg$gms$s58_fix_peatland,] - -} else if (cfg$gms$peatland == "on") { - peat_lr <- PeatlandArea(gdx,level="cell",sum=TRUE) - peat_ini_hr <- mbind(setNames(read.magpie(peatland_on_intact_hr_file),"intact"),setNames(read.magpie(peatland_on_degrad_hr_file),"degrad")) - peat_ini_hr <- add_columns(peat_ini_hr,addnm = "rewet",dim = "d3",fill = 0) - peat_hr <- suppressWarnings(luscale::interpolate2(peat_lr,peat_ini_hr,map_file)) - peat_hr <- peat_hr[,getYears(peat_hr,as.integer = T) >= cfg$gms$s58_fix_peatland,] + peat_ini_hr <- add_columns(peat_ini_hr, addnm = "rewetted", dim = "d3", fill = 0) + peat_ini_hr <- add_columns(peat_ini_hr, addnm = "unused", dim = "d3", fill = 0) + peat_hr <- suppressWarnings(luscale::interpolate2(peat_lr, peat_ini_hr, map_file)) + peat_hr <- peat_hr[, getYears(peat_hr, as.integer = T) >= cfg$gms$s58_fix_peatland, ] +} else if (cfg$gms$peatland == "on") { + peat_lr <- PeatlandArea(gdx, level = "cell", sum = TRUE) + peat_ini_hr <- mbind(setNames(read.magpie(peatland_on_intact_hr_file), "intact"), setNames(read.magpie(peatland_on_degrad_hr_file), "degrad")) + peat_ini_hr <- add_columns(peat_ini_hr, addnm = "rewet", dim = "d3", fill = 0) + peat_hr <- suppressWarnings(luscale::interpolate2(peat_lr, peat_ini_hr, map_file)) + peat_hr <- peat_hr[, getYears(peat_hr, as.integer = T) >= cfg$gms$s58_fix_peatland, ] } peat_hr <- .fixCoords(peat_hr) # Write output .writeDisagg(peat_hr, peatland_hr_out_file, - comment = "unit: Mha per grid-cell", - message = "Write outputs peatland Mha") + comment = "unit: Mha per grid-cell", + message = "Write outputs peatland Mha" +) gc() -out <- peat_hr / dimSums(land_hr[,getYears(peat_hr),], dim = 3) +out <- peat_hr / dimSums(land_hr[, getYears(peat_hr), ], dim = 3) out[is.nan(out)] <- 0 out[is.infinite(out)] <- 0 rm(land_hr, peat_hr) .writeDisagg(out, peatland_hr_share_out_file, - comment = "unit: grid-cell land area fraction", - message = "Write outputs peatland share") + comment = "unit: grid-cell land area fraction", + message = "Write outputs peatland share" +) gc() message("Finished disaggregation") diff --git a/scripts/start/testWDPABase.R b/scripts/start/testWDPABase.R new file mode 100644 index 0000000000..6995d1dfcb --- /dev/null +++ b/scripts/start/testWDPABase.R @@ -0,0 +1,61 @@ +# | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# ---------------------------------------------------------- +# description: Base test runs +# ---------------------------------------------------------- + +rev <- "rev1" + +cres <- "c200" + +###################################### +#### Script to start a MAgPIE run #### +###################################### + +library(gms) +library(lucode2) +library(magclass) + +# Load start functions +source("scripts/start_functions.R") + +# ==================== +# Scenario runs +# ==================== + +prefix <- paste(rev, "PR662", cres, sep = "_") + + +scenarios <- c("default", + "WDPA_I-II-III", + "WDPA_IV-V-VI", + "none") + + + for (scen in scenarios) { + + source("config/default.cfg") + + cfg$results_folder <- "output/:title::date:" + + cfg$output <- c( + "output_check", "extra/disaggregation", "rds_report", + "extra/reportMAgPIE2SEALS", "projects/FSEC_cropDiversityGrid" + ) + + cfg$force_download <- FALSE + + if ("default" == scen) { + cfg$gms$c22_base_protect <- "WDPA" + } else { + cfg$gms$c22_base_protect <- scen + } + + cfg$title <- paste0(prefix, "_", paste(scen, collapse = "-")) + start_run(cfg = cfg, codeCheck = FALSE) + } From c72219419fc0c34c126ab1089e43f0cc65b80873 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Mon, 15 Apr 2024 15:15:08 +0200 Subject: [PATCH 087/259] check doc rsync worked --- scripts/release.R | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/release.R b/scripts/release.R index e51ca12427..498c4b99a0 100644 --- a/scripts/release.R +++ b/scripts/release.R @@ -31,7 +31,9 @@ release <- function(newVersion) { message("creating documentation using goxygen...") goxygen::goxygen() message("uploading documentation to RSE server") - system(paste0("rsync -e ssh -avz doc/html/* rse@rse.pik-potsdam.de:/webservice/doc/magpie/", newVersion)) + exitCode <- system(paste0("rsync -e ssh -avz doc/html/* ", + "rse@rse.pik-potsdam.de:/webservice/doc/magpie/", newVersion)) + stopifnot(exitCode == 0) message("uploading input data to RSE server") sys.source("scripts/start/extra/publish_data.R", envir = new.env()) # only works on cluster From 3f37b476eb05f51f8f565f1cbf77a15f24c8d1bd Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Mon, 15 Apr 2024 15:45:25 +0200 Subject: [PATCH 088/259] add input data rev check to release script --- scripts/release.R | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/scripts/release.R b/scripts/release.R index 498c4b99a0..09592136f9 100644 --- a/scripts/release.R +++ b/scripts/release.R @@ -1,3 +1,18 @@ +checkInputDataRevs <- function() { + source("config/default.cfg") + targetRev <- sub("_.+$", "", cfg$input["regional"]) + if (!startsWith(cfg$input["cellular"], targetRev) || !startsWith(cfg$input["validation"], targetRev)) { + stop("in 'config/default.cfg' cellular/validation input data rev does not match regional input data rev") + } + + scenarioConfig <- read.csv2("config/scenario_config.csv", row.names = 1) + rcps <- paste0("rcp", c("1p9", "2p6", "4p5", "6p0", "7p0", "8p5")) + rcpInput <- t(scenarioConfig)[rcps, "input['cellular']"] + if (!all(startsWith(rcpInput, targetRev))) { + stop("config/scenario_config.csv rcps do not use same input data revision as default.cfg") + } +} + release <- function(newVersion) { if (Sys.which("sbatch") == "") { stop("release must be created on cluster") @@ -53,6 +68,8 @@ arguments <- commandArgs(TRUE) if (length(arguments) != 1) { stop("Please pass the new version number, e.g. `Rscript scripts/release.R 4.6.2`") } + +checkInputDataRevs() release(arguments) message("warnings:") print(warnings()) From 91880a2c090437340b9a494922f0fdbca87da72b Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 16 Apr 2024 09:53:38 +0200 Subject: [PATCH 089/259] new input data --- config/default.cfg | 6 +- config/scenario_config.csv | 2 +- main.gms | 2 +- .../area_based_apr22/input.gms | 2 +- scripts/start/testWDPABase.R | 61 ------------------- 5 files changed, 6 insertions(+), 67 deletions(-) delete mode 100644 scripts/start/testWDPABase.R diff --git a/config/default.cfg b/config/default.cfg index 87eff87a9c..44c3c97718 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "rev4.104_h12_magpie.tgz", - cellular = "rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.104_h12_validation.tgz", +cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", + cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.105_h12_validation.tgz", additional = "additional_data_rev4.48.tgz", calibration = "calibration_H12_26Mar24.tgz") diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 55df2a190b..c3bff4eee5 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -82,7 +82,7 @@ gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;; gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;; gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;; gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.101_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.101_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.101_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.101_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.101_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.101_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.105_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz; gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU; gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;; diff --git a/main.gms b/main.gms index 413135031c..80a27c9606 100644 --- a/main.gms +++ b/main.gms @@ -221,7 +221,7 @@ $offlisting $setglobal c_timesteps coup2100 $setglobal c_past till_2010 -$setglobal c_title default +$setglobal c_title rev1_PR662_c200_none scalars s_use_gdx use of gdx files / 0 / diff --git a/modules/22_land_conservation/area_based_apr22/input.gms b/modules/22_land_conservation/area_based_apr22/input.gms index 6d574bdc51..14ae1ab4dd 100644 --- a/modules/22_land_conservation/area_based_apr22/input.gms +++ b/modules/22_land_conservation/area_based_apr22/input.gms @@ -5,7 +5,7 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -$setglobal c22_base_protect WDPA +$setglobal c22_base_protect none $setglobal c22_base_protect_noselect WDPA $setglobal c22_protect_scenario none $setglobal c22_protect_scenario_noselect none diff --git a/scripts/start/testWDPABase.R b/scripts/start/testWDPABase.R deleted file mode 100644 index 6995d1dfcb..0000000000 --- a/scripts/start/testWDPABase.R +++ /dev/null @@ -1,61 +0,0 @@ -# | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# ---------------------------------------------------------- -# description: Base test runs -# ---------------------------------------------------------- - -rev <- "rev1" - -cres <- "c200" - -###################################### -#### Script to start a MAgPIE run #### -###################################### - -library(gms) -library(lucode2) -library(magclass) - -# Load start functions -source("scripts/start_functions.R") - -# ==================== -# Scenario runs -# ==================== - -prefix <- paste(rev, "PR662", cres, sep = "_") - - -scenarios <- c("default", - "WDPA_I-II-III", - "WDPA_IV-V-VI", - "none") - - - for (scen in scenarios) { - - source("config/default.cfg") - - cfg$results_folder <- "output/:title::date:" - - cfg$output <- c( - "output_check", "extra/disaggregation", "rds_report", - "extra/reportMAgPIE2SEALS", "projects/FSEC_cropDiversityGrid" - ) - - cfg$force_download <- FALSE - - if ("default" == scen) { - cfg$gms$c22_base_protect <- "WDPA" - } else { - cfg$gms$c22_base_protect <- scen - } - - cfg$title <- paste0(prefix, "_", paste(scen, collapse = "-")) - start_run(cfg = cfg, codeCheck = FALSE) - } From b1cdc4d7a3c7e152460b0c6042ba175d6e1168bd Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 16 Apr 2024 09:59:55 +0200 Subject: [PATCH 090/259] reverted run settings in main.gms --- main.gms | 2 +- modules/22_land_conservation/area_based_apr22/input.gms | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/main.gms b/main.gms index 80a27c9606..413135031c 100644 --- a/main.gms +++ b/main.gms @@ -221,7 +221,7 @@ $offlisting $setglobal c_timesteps coup2100 $setglobal c_past till_2010 -$setglobal c_title rev1_PR662_c200_none +$setglobal c_title default scalars s_use_gdx use of gdx files / 0 / diff --git a/modules/22_land_conservation/area_based_apr22/input.gms b/modules/22_land_conservation/area_based_apr22/input.gms index 14ae1ab4dd..f72e91fe8a 100644 --- a/modules/22_land_conservation/area_based_apr22/input.gms +++ b/modules/22_land_conservation/area_based_apr22/input.gms @@ -5,7 +5,7 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -$setglobal c22_base_protect none +$setglobal c22_base_protect WDPA $setglobal c22_base_protect_noselect WDPA $setglobal c22_protect_scenario none $setglobal c22_protect_scenario_noselect none From f2e46f3159e45f6d691081e203f5ef077a34eb62 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Tue, 16 Apr 2024 11:52:59 +0200 Subject: [PATCH 091/259] run codecheck only if gms file staged --- .githooks/pre-commit | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 6f03f253e7..6fb3ef8962 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -7,18 +7,22 @@ if (tryCatch(utils::packageVersion("gms") < gmsRequiredVersion, error = function } message("Checking files for tabs... ", appendLF = FALSE) -gms::checkNoTabs(pattern = "\\.(R|Rprofile|gms|cfg|bib)$", excludeFolders = c("output", "renv", ".git")) +gms::checkNoTabs(pattern = "\\.(R|Rprofile|gms|cfg|bib)$", + excludeFolders = c("output", "renv", ".git")) message("done.") -# run codeCheck -invisible(gms::codeCheck(strict = TRUE)) -message("") +stagedFiles <- system("git diff --cached --name-only", intern = TRUE) + +# run codeCheck only if .gms file is staged +if (any(endsWith(stagedFiles, ".gms"))) { + invisible(gms::codeCheck(strict = TRUE)) + message("") +} # make sure that files are not too big maxfilesize <- function(max) { - files <- union(system("git ls-tree -r HEAD --name-only", intern = TRUE), - system("git diff --cached --name-only", intern = TRUE)) + files <- union(system("git ls-tree -r HEAD --name-only", intern = TRUE), stagedFiles) out <- data.frame(files = files, size = round(file.size(files) / 1024, 2)) out <- out[!is.na(out$size), ] out <- out[out$size > max, ] From 8b10aa605bc7b924848a20c96cbfe5edb6fb2299 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 16 Apr 2024 14:18:52 +0200 Subject: [PATCH 092/259] bugfix solve --- modules/80_optimization/nlp_apr17/solve.gms | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index d9196b456a..d320c4d386 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -62,7 +62,6 @@ if (magpie.modelstat > 2, magpie.optfile = 2; solve magpie USING nlp MINIMIZING vm_cost_glo; solve magpie USING nlp MINIMIZING vm_cost_glo; - magpie.optfile = s80_optfile; else display "Modelstat > 2 | Retry solve with CONOPT3"; option nlp = conopt; @@ -74,6 +73,8 @@ if (magpie.modelstat > 2, s80_modelstat_previter = magpie.modelstat; s80_optfile_previter = magpie.optfile; +* reset optfile after saving + magpie.optfile = s80_optfile; display "vm_cost_glo.l"; display vm_cost_glo.l; From 5030b4b561e95ba01077852374af857f477d6436 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 16 Apr 2024 16:15:50 +0200 Subject: [PATCH 093/259] bugfix solve --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f175ac1078..038ec80373 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scenario_config.csv** same revision for input files as in default.cfg - **scenario_fsec.csv** scenario settings - **start/projects/fsec.R** scenario settings +- **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working ## [4.7.3] - 2024-04-12 From bb9cafdc86f98c794cdd099b0650b54c4b1aab5f Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 16 Apr 2024 17:18:04 +0200 Subject: [PATCH 094/259] fix --- scripts/output/extra/disaggregation.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index b4918e9f11..9318de7b4b 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -99,7 +99,7 @@ if (length(map_file) > 1) { iso <- readGDX(gdx, "iso") consv_iso <- readGDX(gdx, "policy_countries22") - consv_iso <- consv_iso[consv_iso %in% getItems(consv_prio_all, dim = 1.3)] + consv_iso <- consv_iso[consv_iso %in% getItems(wdpa_hr, dim = 1.3)] if (length(consv_iso) == 0) { warning("No countries selected in land conservation disaggregation. Results may be erroneous") } From 7bb2a9a325dddb8c8f940bec3f7da915e352f9e3 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 17 Apr 2024 12:19:06 +0200 Subject: [PATCH 095/259] Remove y2025 afforestation constraint --- config/scenario_config.csv | 196 +++++++++--------- modules/32_forestry/dynamic_feb21/input.gms | 1 - .../32_forestry/dynamic_feb21/presolve.gms | 4 - 3 files changed, 98 insertions(+), 103 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 161d40c32e..5b5c3e6b56 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,98 +1,98 @@ -;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP -gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; -gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; -gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; -gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk -gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; -gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; -gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; -gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;3;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; -gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;healthy_BMI;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; -gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;FLX;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_roots;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;0;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_alc_scen;0.014;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; -gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; -gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; -gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; -gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; -gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; -gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;;; -gms$c34_urban_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP1;SSP2;SSP1;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; -gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; -gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; -gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; -gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; -gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; -gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; -gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; -gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; -gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; -gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 -gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; -gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp1;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 -gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc -gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; -gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; -gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; -gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; -gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.101_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.101_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.101_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.101_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.101_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.101_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; -gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; -gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; -gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; -gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; -gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high -gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 -gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen -gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 -gms$s32_max_aff_cell_2025;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.005 -gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 -gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 -gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 -gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 +;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;EL2_default;EL2_lessSus;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP +gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; +gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; +gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; +gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum +gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;;;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; +gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;;;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; +gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;3;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;healthy_BMI;;;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; +gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;FLX;;;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_roots;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;0;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_alc_scen;0.014;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; +gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;;;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; +gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; +gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;rainfed;all;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;;;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; +gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;0;1;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;;;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; +gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;;;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;;; +gms$c34_urban_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP1;SSP2;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; +gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;;;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; +gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;;;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; +gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;;;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; +gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; +gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; +gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;none;none;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;;;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 +gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;;;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; +gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp1;;;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; +gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 +gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc +gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; +gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; +gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; +gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; +gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; +gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; +gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.104_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.104_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.104_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.104_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.104_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; +gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; +gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; +gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; +magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;SSP2EU-DSPkB500-DS_betax.mif;SSP2EU-DSPkB500-DS_betax.mif;SSP2EU-DSPkB500-DS_betax.mif;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high +gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 +gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen +gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 +gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 +gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 +gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 +gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 \ No newline at end of file diff --git a/modules/32_forestry/dynamic_feb21/input.gms b/modules/32_forestry/dynamic_feb21/input.gms index a4a09cd2a5..961bb68cb5 100644 --- a/modules/32_forestry/dynamic_feb21/input.gms +++ b/modules/32_forestry/dynamic_feb21/input.gms @@ -47,7 +47,6 @@ scalars s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 1 / - s32_max_aff_cell_2025 Maximum afforestation area in y2025 per cluster (million ha) / Inf / ; parameter f32_aff_mask(j) afforestation mask (binary) diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index b83a26aedc..3717ece058 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -158,10 +158,6 @@ else v32_land.up(j,"aff",ac_est) = f32_aff_mask(j) * sum(land, pcm_land(j,land)); ); -if(m_year(t) = 2025, - v32_land.up(j,"aff","ac0") = s32_max_aff_cell_2025; -); - *' No afforestation is allowed if carbon density <= 20 tc/ha v32_land.fx(j,"aff",ac_est)$(fm_carbon_density(t,j,"forestry","vegc") <= 20) = 0; From 32f6c5d4b1298db256b780372babf7cf2eee7e91 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 17 Apr 2024 12:32:27 +0200 Subject: [PATCH 096/259] Update Changelog --- CHANGELOG.md | 1 - config/scenario_config.csv | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e73800f26a..a01c15339d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,7 +32,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **core** added `coup2110`timesteps - **15_food** added additional sigmoid food substition scenarios `sigmoid_75pc_25_50`, `sigmoid_50pc_25_50` and `sigmoid_25pc_25_50` - **30_crop** added regional cropland equation `q30_crop_reg` and presolve growth constraint -- **32_forestry** added cluster-level new afforestation area constraint for 2025 - **44_biodiversity** added new realization `bii_target_apr24`, taking into account `f44_rr_layer` - **60_bioenergy** added new realization `1st2ndgen_priced_feb24` to enable price-driven 2nd gen bioenergy production - **scripts** added automatic set writer for new bioenergy realization to `start_functions` diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 5b5c3e6b56..9ae0ad2ca1 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -8,7 +8,7 @@ gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum +gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;;;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50; gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;;;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; From e342c91cdbd9167880355ab4ec3ac6fa3e903052 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 17 Apr 2024 12:49:40 +0200 Subject: [PATCH 097/259] Remove aff constraint from config --- config/default.cfg | 4 ---- 1 file changed, 4 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index e294c2ef4a..d1c4982d98 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -916,10 +916,6 @@ cfg$gms$c32_rot_calc_type <- "current_annual_increment" # * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 cfg$gms$c32_shock_scenario = "none" # def = "none" -# Maximum allowed area (Mha) for new endogenous afforestation per cluster in 2025. -# Can be used to avoid or limit unwanted early model behavior for specific carbon price curves. -cfg$gms$s32_max_aff_cell_2025 <- Inf # def = inf - # ***--------------------- 34_urban --------------------------------------- # * 34_urban includes urban land # * (static) static urban land fixed on 1995 patterns from LUH2v2 From 2bae7ade97389476f080550621065926f62649fb Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 17 Apr 2024 12:52:04 +0200 Subject: [PATCH 098/259] Auto stash before merge of "develop" and "origin/develop" --- .RData | Bin 0 -> 2687 bytes main.gms | 54 ++- modules/44_biodiversity/bii_target/input.gms | 2 +- .../bii_target_apr24/input.gms | 2 +- .../1st2ndgen_priced_feb24/input.gms | 6 +- patch_input/MMEmuR12_rev4.87.tgz | Bin 0 -> 237716 bytes patch_input/MMEmuR12_rev4.96.tgz | Bin 0 -> 2851 bytes renv/activate.R | 409 ++++++------------ 8 files changed, 157 insertions(+), 316 deletions(-) create mode 100644 .RData create mode 100644 patch_input/MMEmuR12_rev4.87.tgz create mode 100644 patch_input/MMEmuR12_rev4.96.tgz diff --git a/.RData b/.RData new file mode 100644 index 0000000000000000000000000000000000000000..e1ea8dd98356dcc54be3e4db3e3dad213c85979b GIT binary patch literal 2687 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 literal 0 HcmV?d00001 diff --git a/main.gms b/main.gms index 413135031c..9ec13b5d0a 100644 --- a/main.gms +++ b/main.gms @@ -147,44 +147,40 @@ $title magpie *' * Always try to access model outputs through the corresponding magpie package instead of accessing them directly with readGDX. It cannot be guaranteed that your script will work in the future if you do otherwise (as only the corresponding magpie package will be continuously adapted to changes in the GAMS code). *##################### R SECTION START (VERSION INFO) ########################## -* -* Used data set: rev4.99_h12_magpie.tgz +* +* Used data set: rev4.104_h12_magpie.tgz * md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.99_h12_validation.tgz +* Repository: https://rse.pik-potsdam.de/data/magpie/public +* +* Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz * md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: additional_data_rev4.47.tgz +* Repository: https://rse.pik-potsdam.de/data/magpie/public +* +* Used data set: rev4.104_h12_validation.tgz * md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive -* -* Used data set: calibration_H12_per_ton_fao_may22_glo_08Aug23.tgz +* Repository: https://rse.pik-potsdam.de/data/magpie/public +* +* Used data set: calibration_H12_26Mar24.tgz * md5sum: NA * Repository: https://rse.pik-potsdam.de/data/magpie/public -* +* * Low resolution: c200 * High resolution: 0.5 -* +* * Total number of cells: 200 -* +* * Number of cells per region: * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 -* +* * Regionscode: 62eff8f7 -* -* Regions data revision: 4.99 -* +* +* Regions data revision: 4.104 +* * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 -* * Revision: 4.99 -* +* * Revision: 4.104 +* * aggregation settings: * * Input resolution: 0.5 * * Output resolution: c200 @@ -193,10 +189,10 @@ $title magpie * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) -* -* -* Last modification (input data): Wed Feb 7 15:35:14 2024 -* +* +* +* Last modification (input data): Wed Apr 17 11:38:33 2024 +* *###################### R SECTION END (VERSION INFO) ########################### $offupper @@ -266,7 +262,7 @@ $setglobal transport gtap_nov12 $setglobal area_equipped_for_irrigation endo_apr13 $setglobal water_demand all_sectors_aug13 $setglobal water_availability total_water_aug13 -$setglobal biodiversity bii_target +$setglobal biodiversity bii_target_apr24 $setglobal climate static $setglobal nr_soil_budget macceff_aug22 diff --git a/modules/44_biodiversity/bii_target/input.gms b/modules/44_biodiversity/bii_target/input.gms index 3840e6c4ed..26deafacfd 100644 --- a/modules/44_biodiversity/bii_target/input.gms +++ b/modules/44_biodiversity/bii_target/input.gms @@ -10,7 +10,7 @@ scalars c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / s44_target_year Year in which the BII lower bound is reached (1) / 2100 / s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / - s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1e+06 / ; diff --git a/modules/44_biodiversity/bii_target_apr24/input.gms b/modules/44_biodiversity/bii_target_apr24/input.gms index fc6d28b687..f5d19800c5 100644 --- a/modules/44_biodiversity/bii_target_apr24/input.gms +++ b/modules/44_biodiversity/bii_target_apr24/input.gms @@ -10,7 +10,7 @@ scalars c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / s44_target_year Year in which the BII lower bound is reached (1) / 2100 / s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / - s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1e+06 / ; diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms index 5f8da47522..da938046e9 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms @@ -43,9 +43,9 @@ scalars s60_2ndgen_bioenergy_dem_min_post_fix Minimum dedicated 2nd generation bioenergy demand assumed in each region after SSP2-fix (mio. GJ per yr) / 1 / ; -$setglobal c60_price_implementation exp -$setglobal c60_2ndgen_biodem R21M42-SSP2-Npi-PhaseOut50 -$setglobal c60_2ndgen_biodem_noselect R21M42-SSP2-NPi +$setglobal c60_price_implementation lin +$setglobal c60_2ndgen_biodem R32M46-SSP2EU-NPi +$setglobal c60_2ndgen_biodem_noselect R32M46-SSP2EU-NPi $if "%c60_2ndgen_biodem%" == "coupling" table f60_bioenergy_dem_coupling(t_all,i) Bioenergy demand (regional) (mio. GJ per yr) diff --git a/patch_input/MMEmuR12_rev4.87.tgz b/patch_input/MMEmuR12_rev4.87.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4d250bb782bab25616e8635840fcc673ede0c0b9 GIT binary patch literal 237716 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 A761SM literal 0 HcmV?d00001 diff --git a/patch_input/MMEmuR12_rev4.96.tgz b/patch_input/MMEmuR12_rev4.96.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0ec8e52d865a7bcb694815aad6076baa12450562 GIT binary patch literal 2851 zcmZY5do&aLAHZ?aO_C5jC~`~YelHK{M&>qRR!p9jOBQpt!ssG2QLe?9k`Z&4Hii*$ zCp47HST@P6VZ_*e=Q&T0e&=z{=X}rWd_M2LzA|z9c`Pfb?mT?+7#CluRR&TgO+fC*>g`vn5C=bEwipMv)Q#R?0dAXlv!7S)rpO1 zt5eKEw(5{uHHTX@JSVgjy6jMgX`#&5L>l%qVMZXZn04C5Mo=}2b`;Yz!wS{m)=_Orb0MD{q|wV9!bS2mFBXxi&njS&rVPIOlUo+%n#$CJr?E? z04LcflV<%%4KE$Tt7vc*c~5I@e|30SdEIiWh@7IW=_7Sh3;oQGVN&(gnS5h@27)Vn=2-)z3I?MN~Ueqfu1Cn8sGBiFyfXw#9>@ zM!*Ph!WzRiTen`tiMkW^gGrsN;K(IwB;lIOcu471e)sA}@_fBd;Tg&nQTjjbjhY(|+70%$A~XLMY^Lh`|Ura%@a>5QC^1XLUA(Ai170 zVb!ztNW7`}geP}~&B^&%Bfsj{L9jq(`roanAyrqKSaYLoY>->zqa^USN9fv?#-x|R z^ZKnx7w1rFT0MIq+j@pw`EF%^l#S`{rB=;z4o#1f+51v@GWsP_dMqRTAF51AIGRv| z?X5u<(vD_>PM_7L2UwjMym7(P)oRql_z_N`ohG>J{ekdXQkSAkUlm|aDVT(%ND0mC7s_E_z-$<^ zv5z@tydO?c&>&ztWs&F@}Yc3r_dnonn+u5aaGbeiB-u8 zB?0dX+0$=trBwo6U#>l6^;#)h%);5)!3+dOd9Ba}qozKKequ_zChjfM4ofz~1^J{? z{Oyg;U;p+rHGViZzQ9QyC_3s0N*io8ek##t6_B;&maMHF2+DMK7X~tO6IJ|AOQrZ@ zjbA=VJx(=3Ou;*gteD?{9W(}bRl&#)sIN2g6UF|m#PyJhWc|j1LEsm_Gehq$U{Kx0(siw5t)^X$0rHr=~Pco_s2Mapf9uELs2c>sxC_?f`$Lgov zgrfBkE~`_er_WBMkZCW9u{qripuUp>YFE#nC3}e(!Vo^Fpr2j?g=Ytz5Vx~m5GOiK z!0+Stl!P=>c0mN7YJOD>J0M@Oo&5q|$swZQ#P@r6DgWRG3NK_I^tj)DF&2y8&i+PC zno9ZqPYm>N)sE3>`~4v@0g8DiAbY9-|L#=$6elbiQtzqoLL~jSxvOM1l%FW_?=Ai} zc_Dw_&iK(AQu!c4@~?Q zXko~9_6xfp{7^-|)CO<@(P9E{AHTaqWCsG8!Q0tCc*GKK42}D%&a`Yir|%c!uKEfW z5%v!{@19kI4?4SUh_$-)4$Cicaha|~L(BAcGlexyFuW_N8xF&YwR}g5C zYx1yak$YU(y%?J)>ps{1kSjU08INM@v-~qZ)+W4(-W2^niXj!@Wu1(wInIU4IEQmf zv7y{W0mdY&lxRD^=Jwv8{%l;NO&|%R`50EAYw*#vF{(J{=9)dZb^(b(R*#GanQ(qC z%#C@i4MkKs`Igi)m7)l>BdBkr`8?89U&!pwy<9)4i|-nH^W9beY1WuRneiYgXM+&P zSxn0UM|bn+0~8tB?JFKba*@Fv^Z4*hbI)5F&jkV!gC{!MB%H~L(7cYH6UX4sZib(z z6BC|t*zocDS*OeI1wx2pMp`(BUGtO5JDP_KIJv=B(8+W}*q`Ki Reading from a connection which does not supply a 'gzip' magic - # > header is equivalent to reading from the original connection - conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) - on.exit(close(conn)) - - # The default pax header is 512 bytes long and the first pax extended header - # with the comment should be 51 bytes long - # `52 comment=` (11 chars) + 40 byte SHA1 hash - len <- 0x200 + 0x33 - res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) - - if (grepl("^52 comment=", res)) { - sub("52 comment=", "", res) - } else { - NULL - } } renv_bootstrap_install <- function(version, tarball, library) { # attempt to install it into project library + message("* Installing renv ", version, " ... ", appendLF = FALSE) dir.create(library, showWarnings = FALSE, recursive = TRUE) - output <- renv_bootstrap_install_impl(library, tarball) - - # check for successful install - status <- attr(output, "status") - if (is.null(status) || identical(status, 0L)) - return(status) - - # an error occurred; report it - header <- "installation of renv failed" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- paste(c(header, lines, output), collapse = "\n") - stop(text) - - } - - renv_bootstrap_install_impl <- function(library, tarball) { # invoke using system2 so we can capture and report output bin <- R.home("bin") exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - R <- file.path(bin, exe) + r <- file.path(bin, exe) args <- c( "--vanilla", "CMD", "INSTALL", "--no-multiarch", @@ -607,7 +482,19 @@ local({ shQuote(path.expand(tarball)) ) - system2(R, args, stdout = TRUE, stderr = TRUE) + output <- system2(r, args, stdout = TRUE, stderr = TRUE) + message("Done!") + + # check for successful install + status <- attr(output, "status") + if (is.numeric(status) && !identical(status, 0L)) { + header <- "Error installing renv:" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- c(header, lines, output) + writeLines(text, con = stderr()) + } + + status } @@ -820,22 +707,19 @@ local({ } - renv_bootstrap_validate_version <- function(version, description = NULL) { + renv_bootstrap_validate_version <- function(version) { - # resolve description file - # - # avoid passing lib.loc to `packageDescription()` below, since R will - # use the loaded version of the package by default anyhow. note that - # this function should only be called after 'renv' is loaded - # https://github.com/rstudio/renv/issues/1625 - description <- description %||% packageDescription("renv") + loadedversion <- utils::packageDescription("renv", fields = "Version") + if (version == loadedversion) + return(TRUE) - # check whether requested version 'version' matches loaded version of renv - sha <- attr(version, "sha", exact = TRUE) - valid <- if (!is.null(sha)) - renv_bootstrap_validate_version_dev(sha, description) + # assume four-component versions are from GitHub; three-component + # versions are from CRAN + components <- strsplit(loadedversion, "[.-]")[[1]] + remote <- if (length(components) == 4L) + paste("rstudio/renv", loadedversion, sep = "@") else - renv_bootstrap_validate_version_release(version, description) + paste("renv", loadedversion, sep = "@") if (valid) return(TRUE) @@ -861,18 +745,11 @@ local({ ") catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) - FALSE - - } + msg <- sprintf(fmt, loadedversion, version, remote) + warning(msg, call. = FALSE) - renv_bootstrap_validate_version_dev <- function(version, description) { - expected <- description[["RemoteSha"]] - is.character(expected) && startswith(expected, version) - } + FALSE - renv_bootstrap_validate_version_release <- function(version, description) { - expected <- description[["Version"]] - is.character(expected) && identical(expected, version) } renv_bootstrap_hash_text <- function(text) { @@ -894,12 +771,6 @@ local({ # warn if the version of renv loaded does not match renv_bootstrap_validate_version(version) - # execute renv load hooks, if any - hooks <- getHook("renv::autoload") - for (hook in hooks) - if (is.function(hook)) - tryCatch(hook(), error = warnify) - # load the project renv::load(project) @@ -1039,78 +910,26 @@ local({ } - renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { - sha <- sha %||% attr(version, "sha", exact = TRUE) - parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) - paste(parts, collapse = "") - } - - renv_bootstrap_exec <- function(project, libpath, version) { - if (!renv_bootstrap_load(project, libpath, version)) - renv_bootstrap_run(version, libpath) - } - - renv_bootstrap_run <- function(version, libpath) { - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - return(renv::load(project = getwd())) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) - - warning(paste(msg, collapse = "\n"), call. = FALSE) - - } renv_json_read <- function(file = NULL, text = NULL) { - jlerr <- NULL - # if jsonlite is loaded, use that instead - if ("jsonlite" %in% loadedNamespaces()) { - - json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) - if (!inherits(json, "error")) - return(json) - - jlerr <- json - - } - - # otherwise, fall back to the default JSON reader - json <- tryCatch(renv_json_read_default(file, text), error = identity) - if (!inherits(json, "error")) - return(json) - - # report an error - if (!is.null(jlerr)) - stop(jlerr) + if ("jsonlite" %in% loadedNamespaces()) + renv_json_read_jsonlite(file, text) else - stop(json) + renv_json_read_default(file, text) } renv_json_read_jsonlite <- function(file = NULL, text = NULL) { - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + text <- paste(text %||% read(file), collapse = "\n") jsonlite::fromJSON(txt = text, simplifyVector = FALSE) } renv_json_read_default <- function(file = NULL, text = NULL) { # find strings in the JSON - text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") + text <- paste(text %||% read(file), collapse = "\n") pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' locs <- gregexpr(pattern, text, perl = TRUE)[[1]] @@ -1158,14 +977,14 @@ local({ map <- as.list(map) # remap strings in object - remapped <- renv_json_read_remap(json, map) + remapped <- renv_json_remap(json, map) # evaluate eval(remapped, envir = baseenv()) } - renv_json_read_remap <- function(json, map) { + renv_json_remap <- function(json, map) { # fix names if (!is.null(names(json))) { @@ -1192,7 +1011,7 @@ local({ # recurse if (is.recursive(json)) { for (i in seq_along(json)) { - json[i] <- list(renv_json_read_remap(json[[i]], map)) + json[i] <- list(renv_json_remap(json[[i]], map)) } } @@ -1212,9 +1031,35 @@ local({ # construct full libpath libpath <- file.path(root, prefix) - # run bootstrap code - renv_bootstrap_exec(project, libpath, version) + # attempt to load + if (renv_bootstrap_load(project, libpath, version)) + return(TRUE) + + # load failed; inform user we're about to bootstrap + prefix <- paste("# Bootstrapping renv", version) + postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") + header <- paste(prefix, postfix) + message(header) + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + message("* Successfully installed and loaded renv ", version, ".") + return(renv::load()) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) - invisible() + warning(paste(msg, collapse = "\n"), call. = FALSE) }) From 2b433dda0ad930e4f0eb9f5b659357795f4b6891 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Wed, 17 Apr 2024 12:56:16 +0200 Subject: [PATCH 099/259] Revert last commit --- .RData | Bin 2687 -> 0 bytes main.gms | 54 +-- modules/44_biodiversity/bii_target/input.gms | 2 +- .../bii_target_apr24/input.gms | 2 +- .../1st2ndgen_priced_feb24/input.gms | 6 +- patch_input/MMEmuR12_rev4.87.tgz | Bin 237716 -> 0 bytes patch_input/MMEmuR12_rev4.96.tgz | Bin 2851 -> 0 bytes renv/activate.R | 409 ++++++++++++------ 8 files changed, 316 insertions(+), 157 deletions(-) delete mode 100644 .RData delete mode 100644 patch_input/MMEmuR12_rev4.87.tgz delete mode 100644 patch_input/MMEmuR12_rev4.96.tgz diff --git a/.RData b/.RData deleted file mode 100644 index e1ea8dd98356dcc54be3e4db3e3dad213c85979b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2687 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 diff --git a/main.gms b/main.gms index 9ec13b5d0a..413135031c 100644 --- a/main.gms +++ b/main.gms @@ -147,40 +147,44 @@ $title magpie *' * Always try to access model outputs through the corresponding magpie package instead of accessing them directly with readGDX. It cannot be guaranteed that your script will work in the future if you do otherwise (as only the corresponding magpie package will be continuously adapted to changes in the GAMS code). *##################### R SECTION START (VERSION INFO) ########################## -* -* Used data set: rev4.104_h12_magpie.tgz +* +* Used data set: rev4.99_h12_magpie.tgz * md5sum: NA -* Repository: https://rse.pik-potsdam.de/data/magpie/public -* -* Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz * md5sum: NA -* Repository: https://rse.pik-potsdam.de/data/magpie/public -* -* Used data set: rev4.104_h12_validation.tgz +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.99_h12_validation.tgz * md5sum: NA -* Repository: https://rse.pik-potsdam.de/data/magpie/public -* -* Used data set: calibration_H12_26Mar24.tgz +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* +* Used data set: additional_data_rev4.47.tgz +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive +* +* Used data set: calibration_H12_per_ton_fao_may22_glo_08Aug23.tgz * md5sum: NA * Repository: https://rse.pik-potsdam.de/data/magpie/public -* +* * Low resolution: c200 * High resolution: 0.5 -* +* * Total number of cells: 200 -* +* * Number of cells per region: * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 -* +* * Regionscode: 62eff8f7 -* -* Regions data revision: 4.104 -* +* +* Regions data revision: 4.99 +* * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 -* * Revision: 4.104 -* +* * Revision: 4.99 +* * aggregation settings: * * Input resolution: 0.5 * * Output resolution: c200 @@ -189,10 +193,10 @@ $title magpie * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) -* -* -* Last modification (input data): Wed Apr 17 11:38:33 2024 -* +* +* +* Last modification (input data): Wed Feb 7 15:35:14 2024 +* *###################### R SECTION END (VERSION INFO) ########################### $offupper @@ -262,7 +266,7 @@ $setglobal transport gtap_nov12 $setglobal area_equipped_for_irrigation endo_apr13 $setglobal water_demand all_sectors_aug13 $setglobal water_availability total_water_aug13 -$setglobal biodiversity bii_target_apr24 +$setglobal biodiversity bii_target $setglobal climate static $setglobal nr_soil_budget macceff_aug22 diff --git a/modules/44_biodiversity/bii_target/input.gms b/modules/44_biodiversity/bii_target/input.gms index 26deafacfd..3840e6c4ed 100644 --- a/modules/44_biodiversity/bii_target/input.gms +++ b/modules/44_biodiversity/bii_target/input.gms @@ -10,7 +10,7 @@ scalars c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / s44_target_year Year in which the BII lower bound is reached (1) / 2100 / s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / - s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1e+06 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / ; diff --git a/modules/44_biodiversity/bii_target_apr24/input.gms b/modules/44_biodiversity/bii_target_apr24/input.gms index f5d19800c5..fc6d28b687 100644 --- a/modules/44_biodiversity/bii_target_apr24/input.gms +++ b/modules/44_biodiversity/bii_target_apr24/input.gms @@ -10,7 +10,7 @@ scalars c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / s44_target_year Year in which the BII lower bound is reached (1) / 2100 / s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / - s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1e+06 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / ; diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms index da938046e9..5f8da47522 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms @@ -43,9 +43,9 @@ scalars s60_2ndgen_bioenergy_dem_min_post_fix Minimum dedicated 2nd generation bioenergy demand assumed in each region after SSP2-fix (mio. GJ per yr) / 1 / ; -$setglobal c60_price_implementation lin -$setglobal c60_2ndgen_biodem R32M46-SSP2EU-NPi -$setglobal c60_2ndgen_biodem_noselect R32M46-SSP2EU-NPi +$setglobal c60_price_implementation exp +$setglobal c60_2ndgen_biodem R21M42-SSP2-Npi-PhaseOut50 +$setglobal c60_2ndgen_biodem_noselect R21M42-SSP2-NPi $if "%c60_2ndgen_biodem%" == "coupling" table f60_bioenergy_dem_coupling(t_all,i) Bioenergy demand (regional) (mio. GJ per yr) diff --git a/patch_input/MMEmuR12_rev4.87.tgz b/patch_input/MMEmuR12_rev4.87.tgz deleted file mode 100644 index 4d250bb782bab25616e8635840fcc673ede0c0b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237716 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 A761SM diff --git a/patch_input/MMEmuR12_rev4.96.tgz b/patch_input/MMEmuR12_rev4.96.tgz deleted file mode 100644 index 0ec8e52d865a7bcb694815aad6076baa12450562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2851 zcmZY5do&aLAHZ?aO_C5jC~`~YelHK{M&>qRR!p9jOBQpt!ssG2QLe?9k`Z&4Hii*$ zCp47HST@P6VZ_*e=Q&T0e&=z{=X}rWd_M2LzA|z9c`Pfb?mT?+7#CluRR&TgO+fC*>g`vn5C=bEwipMv)Q#R?0dAXlv!7S)rpO1 zt5eKEw(5{uHHTX@JSVgjy6jMgX`#&5L>l%qVMZXZn04C5Mo=}2b`;Yz!wS{m)=_Orb0MD{q|wV9!bS2mFBXxi&njS&rVPIOlUo+%n#$CJr?E? z04LcflV<%%4KE$Tt7vc*c~5I@e|30SdEIiWh@7IW=_7Sh3;oQGVN&(gnS5h@27)Vn=2-)z3I?MN~Ueqfu1Cn8sGBiFyfXw#9>@ zM!*Ph!WzRiTen`tiMkW^gGrsN;K(IwB;lIOcu471e)sA}@_fBd;Tg&nQTjjbjhY(|+70%$A~XLMY^Lh`|Ura%@a>5QC^1XLUA(Ai170 zVb!ztNW7`}geP}~&B^&%Bfsj{L9jq(`roanAyrqKSaYLoY>->zqa^USN9fv?#-x|R z^ZKnx7w1rFT0MIq+j@pw`EF%^l#S`{rB=;z4o#1f+51v@GWsP_dMqRTAF51AIGRv| z?X5u<(vD_>PM_7L2UwjMym7(P)oRql_z_N`ohG>J{ekdXQkSAkUlm|aDVT(%ND0mC7s_E_z-$<^ zv5z@tydO?c&>&ztWs&F@}Yc3r_dnonn+u5aaGbeiB-u8 zB?0dX+0$=trBwo6U#>l6^;#)h%);5)!3+dOd9Ba}qozKKequ_zChjfM4ofz~1^J{? z{Oyg;U;p+rHGViZzQ9QyC_3s0N*io8ek##t6_B;&maMHF2+DMK7X~tO6IJ|AOQrZ@ zjbA=VJx(=3Ou;*gteD?{9W(}bRl&#)sIN2g6UF|m#PyJhWc|j1LEsm_Gehq$U{Kx0(siw5t)^X$0rHr=~Pco_s2Mapf9uELs2c>sxC_?f`$Lgov zgrfBkE~`_er_WBMkZCW9u{qripuUp>YFE#nC3}e(!Vo^Fpr2j?g=Ytz5Vx~m5GOiK z!0+Stl!P=>c0mN7YJOD>J0M@Oo&5q|$swZQ#P@r6DgWRG3NK_I^tj)DF&2y8&i+PC zno9ZqPYm>N)sE3>`~4v@0g8DiAbY9-|L#=$6elbiQtzqoLL~jSxvOM1l%FW_?=Ai} zc_Dw_&iK(AQu!c4@~?Q zXko~9_6xfp{7^-|)CO<@(P9E{AHTaqWCsG8!Q0tCc*GKK42}D%&a`Yir|%c!uKEfW z5%v!{@19kI4?4SUh_$-)4$Cicaha|~L(BAcGlexyFuW_N8xF&YwR}g5C zYx1yak$YU(y%?J)>ps{1kSjU08INM@v-~qZ)+W4(-W2^niXj!@Wu1(wInIU4IEQmf zv7y{W0mdY&lxRD^=Jwv8{%l;NO&|%R`50EAYw*#vF{(J{=9)dZb^(b(R*#GanQ(qC z%#C@i4MkKs`Igi)m7)l>BdBkr`8?89U&!pwy<9)4i|-nH^W9beY1WuRneiYgXM+&P zSxn0UM|bn+0~8tB?JFKba*@Fv^Z4*hbI)5F&jkV!gC{!MB%H~L(7cYH6UX4sZib(z z6BC|t*zocDS*OeI1wx2pMp`(BUGtO5JDP_KIJv=B(8+W}*q`Ki Reading from a connection which does not supply a 'gzip' magic + # > header is equivalent to reading from the original connection + conn <- gzcon(file(bundle, open = "rb", raw = TRUE)) + on.exit(close(conn)) + + # The default pax header is 512 bytes long and the first pax extended header + # with the comment should be 51 bytes long + # `52 comment=` (11 chars) + 40 byte SHA1 hash + len <- 0x200 + 0x33 + res <- rawToChar(readBin(conn, "raw", n = len)[0x201:len]) + + if (grepl("^52 comment=", res)) { + sub("52 comment=", "", res) + } else { + NULL + } + } + renv_bootstrap_install <- function(version, tarball, library) { # attempt to install it into project library - message("* Installing renv ", version, " ... ", appendLF = FALSE) dir.create(library, showWarnings = FALSE, recursive = TRUE) + output <- renv_bootstrap_install_impl(library, tarball) + + # check for successful install + status <- attr(output, "status") + if (is.null(status) || identical(status, 0L)) + return(status) + + # an error occurred; report it + header <- "installation of renv failed" + lines <- paste(rep.int("=", nchar(header)), collapse = "") + text <- paste(c(header, lines, output), collapse = "\n") + stop(text) + + } + + renv_bootstrap_install_impl <- function(library, tarball) { # invoke using system2 so we can capture and report output bin <- R.home("bin") exe <- if (Sys.info()[["sysname"]] == "Windows") "R.exe" else "R" - r <- file.path(bin, exe) + R <- file.path(bin, exe) args <- c( "--vanilla", "CMD", "INSTALL", "--no-multiarch", @@ -482,19 +607,7 @@ local({ shQuote(path.expand(tarball)) ) - output <- system2(r, args, stdout = TRUE, stderr = TRUE) - message("Done!") - - # check for successful install - status <- attr(output, "status") - if (is.numeric(status) && !identical(status, 0L)) { - header <- "Error installing renv:" - lines <- paste(rep.int("=", nchar(header)), collapse = "") - text <- c(header, lines, output) - writeLines(text, con = stderr()) - } - - status + system2(R, args, stdout = TRUE, stderr = TRUE) } @@ -707,19 +820,22 @@ local({ } - renv_bootstrap_validate_version <- function(version) { + renv_bootstrap_validate_version <- function(version, description = NULL) { - loadedversion <- utils::packageDescription("renv", fields = "Version") - if (version == loadedversion) - return(TRUE) + # resolve description file + # + # avoid passing lib.loc to `packageDescription()` below, since R will + # use the loaded version of the package by default anyhow. note that + # this function should only be called after 'renv' is loaded + # https://github.com/rstudio/renv/issues/1625 + description <- description %||% packageDescription("renv") - # assume four-component versions are from GitHub; three-component - # versions are from CRAN - components <- strsplit(loadedversion, "[.-]")[[1]] - remote <- if (length(components) == 4L) - paste("rstudio/renv", loadedversion, sep = "@") + # check whether requested version 'version' matches loaded version of renv + sha <- attr(version, "sha", exact = TRUE) + valid <- if (!is.null(sha)) + renv_bootstrap_validate_version_dev(sha, description) else - paste("renv", loadedversion, sep = "@") + renv_bootstrap_validate_version_release(version, description) if (valid) return(TRUE) @@ -745,13 +861,20 @@ local({ ") catf(fmt, friendly, renv_bootstrap_version_friendly(version), remote) - msg <- sprintf(fmt, loadedversion, version, remote) - warning(msg, call. = FALSE) - FALSE } + renv_bootstrap_validate_version_dev <- function(version, description) { + expected <- description[["RemoteSha"]] + is.character(expected) && startswith(expected, version) + } + + renv_bootstrap_validate_version_release <- function(version, description) { + expected <- description[["Version"]] + is.character(expected) && identical(expected, version) + } + renv_bootstrap_hash_text <- function(text) { hashfile <- tempfile("renv-hash-") @@ -771,6 +894,12 @@ local({ # warn if the version of renv loaded does not match renv_bootstrap_validate_version(version) + # execute renv load hooks, if any + hooks <- getHook("renv::autoload") + for (hook in hooks) + if (is.function(hook)) + tryCatch(hook(), error = warnify) + # load the project renv::load(project) @@ -910,26 +1039,78 @@ local({ } + renv_bootstrap_version_friendly <- function(version, shafmt = NULL, sha = NULL) { + sha <- sha %||% attr(version, "sha", exact = TRUE) + parts <- c(version, sprintf(shafmt %||% " [sha: %s]", substring(sha, 1L, 7L))) + paste(parts, collapse = "") + } + + renv_bootstrap_exec <- function(project, libpath, version) { + if (!renv_bootstrap_load(project, libpath, version)) + renv_bootstrap_run(version, libpath) + } + + renv_bootstrap_run <- function(version, libpath) { + + # perform bootstrap + bootstrap(version, libpath) + + # exit early if we're just testing bootstrap + if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) + return(TRUE) + + # try again to load + if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { + return(renv::load(project = getwd())) + } + + # failed to download or load renv; warn the user + msg <- c( + "Failed to find an renv installation: the project will not be loaded.", + "Use `renv::activate()` to re-initialize the project." + ) + + warning(paste(msg, collapse = "\n"), call. = FALSE) + + } renv_json_read <- function(file = NULL, text = NULL) { + jlerr <- NULL + # if jsonlite is loaded, use that instead - if ("jsonlite" %in% loadedNamespaces()) - renv_json_read_jsonlite(file, text) + if ("jsonlite" %in% loadedNamespaces()) { + + json <- tryCatch(renv_json_read_jsonlite(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + jlerr <- json + + } + + # otherwise, fall back to the default JSON reader + json <- tryCatch(renv_json_read_default(file, text), error = identity) + if (!inherits(json, "error")) + return(json) + + # report an error + if (!is.null(jlerr)) + stop(jlerr) else - renv_json_read_default(file, text) + stop(json) } renv_json_read_jsonlite <- function(file = NULL, text = NULL) { - text <- paste(text %||% read(file), collapse = "\n") + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") jsonlite::fromJSON(txt = text, simplifyVector = FALSE) } renv_json_read_default <- function(file = NULL, text = NULL) { # find strings in the JSON - text <- paste(text %||% read(file), collapse = "\n") + text <- paste(text %||% readLines(file, warn = FALSE), collapse = "\n") pattern <- '["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]' locs <- gregexpr(pattern, text, perl = TRUE)[[1]] @@ -977,14 +1158,14 @@ local({ map <- as.list(map) # remap strings in object - remapped <- renv_json_remap(json, map) + remapped <- renv_json_read_remap(json, map) # evaluate eval(remapped, envir = baseenv()) } - renv_json_remap <- function(json, map) { + renv_json_read_remap <- function(json, map) { # fix names if (!is.null(names(json))) { @@ -1011,7 +1192,7 @@ local({ # recurse if (is.recursive(json)) { for (i in seq_along(json)) { - json[i] <- list(renv_json_remap(json[[i]], map)) + json[i] <- list(renv_json_read_remap(json[[i]], map)) } } @@ -1031,35 +1212,9 @@ local({ # construct full libpath libpath <- file.path(root, prefix) - # attempt to load - if (renv_bootstrap_load(project, libpath, version)) - return(TRUE) - - # load failed; inform user we're about to bootstrap - prefix <- paste("# Bootstrapping renv", version) - postfix <- paste(rep.int("-", 77L - nchar(prefix)), collapse = "") - header <- paste(prefix, postfix) - message(header) - - # perform bootstrap - bootstrap(version, libpath) - - # exit early if we're just testing bootstrap - if (!is.na(Sys.getenv("RENV_BOOTSTRAP_INSTALL_ONLY", unset = NA))) - return(TRUE) - - # try again to load - if (requireNamespace("renv", lib.loc = libpath, quietly = TRUE)) { - message("* Successfully installed and loaded renv ", version, ".") - return(renv::load()) - } - - # failed to download or load renv; warn the user - msg <- c( - "Failed to find an renv installation: the project will not be loaded.", - "Use `renv::activate()` to re-initialize the project." - ) + # run bootstrap code + renv_bootstrap_exec(project, libpath, version) - warning(paste(msg, collapse = "\n"), call. = FALSE) + invisible() }) From 3fb504c037a6fc3ddfa2d265fcef11388791be19 Mon Sep 17 00:00:00 2001 From: florianh Date: Wed, 17 Apr 2024 14:01:10 +0200 Subject: [PATCH 100/259] default for `s14_minimum_wood_yield` aligned with FSEC settings --- CHANGELOG.md | 1 + config/default.cfg | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 038ec80373..358b0370d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scenario_fsec.csv** scenario settings - **start/projects/fsec.R** scenario settings - **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working +- **default.cfg** default for `s14_minimum_wood_yield` aligned with FSEC settings ## [4.7.3] - 2024-04-12 diff --git a/config/default.cfg b/config/default.cfg index 7d519e85f4..b45d9bccbf 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -332,7 +332,7 @@ cfg$gms$s14_use_yield_calib <- 0 # def = 0 # Include a minimum yield for wood harvest in secondary vegetation (tDM per ha per yr). # Age classes with wood yields below this threshold have a production of zero. -cfg$gms$s14_minimum_wood_yield <- 20 #def = 20 +cfg$gms$s14_minimum_wood_yield <- 10 #def = 10 # ***--------------------- 15_food --------------------------------------- # * (anthropometrics_jan18): estimates food using scenario dependent regression From 5d0727fd4880fcd1cb098e671f28257a9f800b66 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 18 Apr 2024 00:22:12 +0200 Subject: [PATCH 101/259] bugfix start.R memory --- start.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start.R b/start.R index 4362fd8c0a..79771dc14c 100644 --- a/start.R +++ b/start.R @@ -97,13 +97,13 @@ runOutputs <- function(runscripts=NULL, submit=NULL) { log <- format(Sys.time(), paste0("logs/", rout_name, "-%Y-%H-%M-%S-%OS3.log")) system2("Rscript",name, stderr = log, stdout = log, wait=FALSE) } else if(submit=="slurmpriority") { - system(paste(sbatch_command,"--qos=priority")) + system(paste(sbatch_command,"--qos=priority --cpus-per-task=3")) Sys.sleep(1) } else if(submit=="slurmstandby") { - system(paste(sbatch_command,"--qos=standby")) + system(paste(sbatch_command,"--qos=standby --cpus-per-task=3")) Sys.sleep(1) } else if(submit=="slurmmedium") { - system(paste(sbatch_command,"--qos=medium")) + system(paste(sbatch_command,"--qos=medium --cpus-per-task=3")) Sys.sleep(1) } else if(submit=="debug") { tmp.env <- new.env() From ed374a71957e10bea36a4943cabfc15cf7e62be8 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Thu, 18 Apr 2024 09:33:48 +0200 Subject: [PATCH 102/259] inline maxfilesize function in precommit --- .Rprofile | 3 +-- .githooks/pre-commit | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/.Rprofile b/.Rprofile index dfc2cf3562..7913b2deba 100644 --- a/.Rprofile +++ b/.Rprofile @@ -36,7 +36,6 @@ if (isTRUE(rownames(installed.packages(priority = "NA")) == "renv")) { } # in case bootstrapping fails halfway, install piamenv and rely on requirement auto-fixing -if (tryCatch(packageVersion("piamenv"), - error = function(e) package_version("0.0")) < package_version("0.3.4")) { +if (tryCatch(utils::packageVersion("piamenv") < "0.3.4", error = function(error) TRUE)) { renv::install("piamenv", prompt = FALSE) } diff --git a/.githooks/pre-commit b/.githooks/pre-commit index 6fb3ef8962..c4846f7a89 100755 --- a/.githooks/pre-commit +++ b/.githooks/pre-commit @@ -21,16 +21,14 @@ if (any(endsWith(stagedFiles, ".gms"))) { # make sure that files are not too big -maxfilesize <- function(max) { - files <- union(system("git ls-tree -r HEAD --name-only", intern = TRUE), stagedFiles) - out <- data.frame(files = files, size = round(file.size(files) / 1024, 2)) - out <- out[!is.na(out$size), ] - out <- out[out$size > max, ] - if (nrow(out) > 0) { - stop(nrow(out), " files with size > ", max, "kB detected: \n", - paste0(out$files, " (", out$size, "kB)", collapse = "\n")) - } - message("All files are smaller than ", max, "kB\n") -} +maxFilesize <- 250 # kB -maxfilesize(250) +files <- union(system("git ls-tree -r HEAD --name-only", intern = TRUE), stagedFiles) +out <- data.frame(files = files, size = round(file.size(files) / 1024, 2)) +out <- out[!is.na(out$size), ] +out <- out[out$size > maxFilesize, ] +if (nrow(out) > 0) { + stop(nrow(out), " files with size > ", maxFilesize, "kB detected: \n", + paste0(out$files, " (", out$size, "kB)", collapse = "\n")) +} +message("All files are smaller than ", maxFilesize, "kB\n") From f012feb219db8b53f92c309ed551edec56a1716e Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 18 Apr 2024 16:24:47 +0200 Subject: [PATCH 103/259] code cleanup --- config/default.cfg | 2 +- .../lp_nlp_apr17/declarations.gms | 2 +- .../80_optimization/lp_nlp_apr17/solve.gms | 4 +- .../nlp_apr17/declarations.gms | 2 +- modules/80_optimization/nlp_apr17/input.gms | 4 -- modules/80_optimization/nlp_apr17/solve.gms | 61 ++++++++----------- .../80_optimization/nlp_par/declarations.gms | 4 +- modules/80_optimization/nlp_par/input.gms | 2 +- modules/80_optimization/nlp_par/solve.gms | 58 +++++++++--------- 9 files changed, 63 insertions(+), 76 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index b45d9bccbf..9768e4c897 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1884,7 +1884,7 @@ cfg$gms$optimization <- "nlp_apr17" # def = nlp_apr17 # maximal number of solve iterations cfg$gms$s80_maxiter <- 30 -# * (conopt3): conopt3 +# Solver settings only for realization `lp_nlp_apr17`. All other realizations use `conopt4`. # * (conopt4): conopt4 # * (conopt4+cplex): conopt4 followed by cplex with landdiff optimization # * (conopt4+conopt3): conopt4 followed by conopt3 diff --git a/modules/80_optimization/lp_nlp_apr17/declarations.gms b/modules/80_optimization/lp_nlp_apr17/declarations.gms index 0411e24104..18bc7ca4d9 100644 --- a/modules/80_optimization/lp_nlp_apr17/declarations.gms +++ b/modules/80_optimization/lp_nlp_apr17/declarations.gms @@ -6,7 +6,7 @@ *** | Contact: magpie@pik-potsdam.de parameters - p80_modelstat(t) modelstat indicator (1) + p80_modelstat(t) modelstat indicator (1) p80_num_nonopt(t) numNOpt indicator (1) ; diff --git a/modules/80_optimization/lp_nlp_apr17/solve.gms b/modules/80_optimization/lp_nlp_apr17/solve.gms index acdeb9bf7f..881dca8768 100644 --- a/modules/80_optimization/lp_nlp_apr17/solve.gms +++ b/modules/80_optimization/lp_nlp_apr17/solve.gms @@ -23,9 +23,7 @@ $onecho > cplex.opt $offecho * non-linear solver -$ifthen "%c80_nlp_solver%" == "conopt3" - option nlp = conopt ; -$elseif "%c80_nlp_solver%" == "conopt4" +$ifthen "%c80_nlp_solver%" == "conopt4" option nlp = conopt4; $elseif "%c80_nlp_solver%" == "conopt4+cplex" option nlp = conopt4; diff --git a/modules/80_optimization/nlp_apr17/declarations.gms b/modules/80_optimization/nlp_apr17/declarations.gms index bdd0c53998..be5b332fc0 100644 --- a/modules/80_optimization/nlp_apr17/declarations.gms +++ b/modules/80_optimization/nlp_apr17/declarations.gms @@ -11,7 +11,7 @@ parameters ; scalars - s80_counter counter (1) + s80_counter counter (1) s80_modelstat_previter modelstat of previous iteration (1) s80_optfile_previter optfile used in previous iteration (1) ; diff --git a/modules/80_optimization/nlp_apr17/input.gms b/modules/80_optimization/nlp_apr17/input.gms index 2641b38a52..8fbcc4271a 100644 --- a/modules/80_optimization/nlp_apr17/input.gms +++ b/modules/80_optimization/nlp_apr17/input.gms @@ -9,7 +9,3 @@ scalars s80_maxiter maximal solve iterations if modelstat is > 2 (1) / 30 / s80_optfile switch to use specfied solver settings (1) / 0 / ; - -$setglobal c80_nlp_solver conopt4 -* options: (conopt3): conopt3 -* (conopt4): conopt4 diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index d320c4d386..bae758fec1 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -6,20 +6,13 @@ *** | Contact: magpie@pik-potsdam.de **************start solve loop************** -$ifthen "%c80_nlp_solver%" == "conopt3" - option nlp = conopt ; -$elseif "%c80_nlp_solver%" == "conopt4" - option nlp = conopt4; -$else - abort "c80_nlp_solver setting not supported in nlp_apr17 realization!"; -$endif - s80_counter = 0; p80_modelstat(t) = 14; s80_modelstat_previter = 14; s80_optfile_previter = s80_optfile; *** solver settings +option nlp = conopt4; magpie.optfile = s80_optfile; magpie.scaleopt = 1 ; magpie.solprint = 0 ; @@ -52,42 +45,42 @@ if (magpie.modelstat > 2, repeat( s80_counter = s80_counter + 1 ; - if (magpie.modelstat ne s80_modelstat_previter, - display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; - solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; - elseif magpie.modelstat = s80_modelstat_previter, - if(magpie.optfile = s80_optfile_previter, - display "Modelstat > 2 | Retry solve without CONOPT4 pre-processing"; - magpie.optfile = 2; - solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; - else - display "Modelstat > 2 | Retry solve with CONOPT3"; - option nlp = conopt; + if (magpie.modelstat ne s80_modelstat_previter, + display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; solve magpie USING nlp MINIMIZING vm_cost_glo; solve magpie USING nlp MINIMIZING vm_cost_glo; - option nlp = conopt4; + elseif magpie.modelstat = s80_modelstat_previter, + if (magpie.optfile = s80_optfile_previter, + display "Modelstat > 2 | Retry solve without CONOPT4 pre-processing"; + magpie.optfile = 2; + solve magpie USING nlp MINIMIZING vm_cost_glo; + solve magpie USING nlp MINIMIZING vm_cost_glo; + else + display "Modelstat > 2 | Retry solve with CONOPT3"; + option nlp = conopt; + solve magpie USING nlp MINIMIZING vm_cost_glo; + solve magpie USING nlp MINIMIZING vm_cost_glo; + option nlp = conopt4; ); ); - s80_modelstat_previter = magpie.modelstat; - s80_optfile_previter = magpie.optfile; -* reset optfile after saving - magpie.optfile = s80_optfile; + s80_modelstat_previter = magpie.modelstat; + s80_optfile_previter = magpie.optfile; +* reset `magpie.optfile` to default after saving value to `s80_optfile_previter` + magpie.optfile = s80_optfile; - display "vm_cost_glo.l"; - display vm_cost_glo.l; + display "vm_cost_glo.l"; + display vm_cost_glo.l; * write extended run information in list file in the case that the final solution is infeasible - if ((s80_counter >= (s80_maxiter-1) and magpie.modelstat > 2), - magpie.solprint = 1 - ); + if ((s80_counter >= (s80_maxiter-1) and magpie.modelstat > 2), + magpie.solprint = 1 + ); - display s80_counter; - display magpie.modelstat; + display s80_counter; + display magpie.modelstat; - until (magpie.modelstat <= 2 or s80_counter >= s80_maxiter) + until (magpie.modelstat <= 2 or s80_counter >= s80_maxiter) ); ); diff --git a/modules/80_optimization/nlp_par/declarations.gms b/modules/80_optimization/nlp_par/declarations.gms index 567c8b9468..7a8f5e5b71 100644 --- a/modules/80_optimization/nlp_par/declarations.gms +++ b/modules/80_optimization/nlp_par/declarations.gms @@ -12,8 +12,8 @@ parameters ; scalars - s80_counter counter (1) + s80_counter counter (1) s80_modelstat_previter modelstat of previous iteration (1) s80_optfile_previter optfile used in previous iteration (1) - s80_resolve indicator for restarting solve (1) + s80_resolve indicator for restarting solve (1) ; diff --git a/modules/80_optimization/nlp_par/input.gms b/modules/80_optimization/nlp_par/input.gms index d229c99cdc..77e8e9f487 100644 --- a/modules/80_optimization/nlp_par/input.gms +++ b/modules/80_optimization/nlp_par/input.gms @@ -7,5 +7,5 @@ scalars s80_maxiter maximal solve iterations if modelstat is > 2 (1) / 30 / - s80_optfile switch to use specfied solver settings (1) / 0 / + s80_optfile switch to use specfied solver settings (1) / 0 / ; diff --git a/modules/80_optimization/nlp_par/solve.gms b/modules/80_optimization/nlp_par/solve.gms index 42ec01728f..d550c5e4ae 100644 --- a/modules/80_optimization/nlp_par/solve.gms +++ b/modules/80_optimization/nlp_par/solve.gms @@ -50,24 +50,24 @@ repeat loop(h$p80_handle(h), if(handleStatus(p80_handle(h)) = 2, p80_counter(h) = p80_counter(h) + 1; - s80_resolve = 1; + s80_resolve = 1; - magpie.handle = p80_handle(h); - execute_loadhandle magpie; - magpie.modelStat$(magpie.modelStat=NA) = 13; + magpie.handle = p80_handle(h); + execute_loadhandle magpie; + magpie.modelStat$(magpie.modelStat=NA) = 13; - s80_modelstat_previter = p80_modelstat(t,h); - p80_modelstat(t,h) = magpie.modelStat; - s80_optfile_previter = magpie.optfile; - magpie.optfile = s80_optfile; + s80_modelstat_previter = p80_modelstat(t,h); + p80_modelstat(t,h) = magpie.modelStat; + s80_optfile_previter = magpie.optfile; + magpie.optfile = s80_optfile; - h2(h) = yes; - i2(i)$supreg(h,i) = yes; + h2(h) = yes; + i2(i)$supreg(h,i) = yes; loop(i2, j2(j)$cell(i2,j) = yes); - display h2; - s80_counter = sum(h2,p80_counter(h2)); - display s80_counter; - display magpie.modelStat; + display h2; + s80_counter = sum(h2,p80_counter(h2)); + display s80_counter; + display magpie.modelStat; if ((p80_counter(h) >= s80_maxiter AND p80_modelstat(t,h) > 2), display "No feasible solution found. Writing LST file."; @@ -79,42 +79,42 @@ repeat display$handledelete(p80_handle(h)) 'trouble deleting handles' ; - if (p80_modelstat(t,h) <= 2, + if (p80_modelstat(t,h) <= 2, display "Model status <= 2. Handle cleared."; s80_resolve = 0; p80_handle(h) = 0; ); - if (s80_resolve = 1, - display "Resolve" - if (p80_modelstat(t,h) ne s80_modelstat_previter, - display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; + if (s80_resolve = 1, + display "Resolve" + if (p80_modelstat(t,h) ne s80_modelstat_previter, + display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; solve magpie USING nlp MINIMIZING vm_cost_glo; elseif p80_modelstat(t,h) = s80_modelstat_previter, - if(magpie.optfile = s80_optfile_previter, - display "Modelstat > 2 | Retry solve without CONOPT4 pre-processing"; - magpie.optfile = 2; + if(magpie.optfile = s80_optfile_previter, + display "Modelstat > 2 | Retry solve without CONOPT4 pre-processing"; + magpie.optfile = 2; solve magpie USING nlp MINIMIZING vm_cost_glo; else display "Modelstat > 2 | Retry solve with CONOPT3"; option nlp = conopt; solve magpie USING nlp MINIMIZING vm_cost_glo; option nlp = conopt4; - ); - ); + ); + ); execerror = 0; - if(magpie.handle = 0, + if (magpie.handle = 0, display "Problem. Handle is zero despite resolve. Setting handle to 1 for continuation."; magpie.handle = 1; - ); + ); p80_handle(h) = magpie.handle; - ); - h2(h) = no; + ); + h2(h) = no; i2(i) = no; j2(j) = no; ); ); - display$readyCollect(p80_handle,INF) 'Problem waiting for next instance to complete'; +display$readyCollect(p80_handle,INF) 'Problem waiting for next instance to complete'; until card(p80_handle) = 0 OR smax(h, p80_counter(h)) >= s80_maxiter; if (smax(h,p80_modelstat(t,h)) > 2 and smax(h,p80_modelstat(t,h)) ne 7, From 59d252070cb423dfdcacc9d5c8e8a47e1f55ac84 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Fri, 19 Apr 2024 16:36:56 +0200 Subject: [PATCH 104/259] update main.gms --- main.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.gms b/main.gms index 413135031c..5974154a87 100644 --- a/main.gms +++ b/main.gms @@ -266,7 +266,7 @@ $setglobal transport gtap_nov12 $setglobal area_equipped_for_irrigation endo_apr13 $setglobal water_demand all_sectors_aug13 $setglobal water_availability total_water_aug13 -$setglobal biodiversity bii_target +$setglobal biodiversity bii_target_apr24 $setglobal climate static $setglobal nr_soil_budget macceff_aug22 From 6119eead803ea27e3cb01859a47fbec39d591091 Mon Sep 17 00:00:00 2001 From: Jan Steinhauser <72768733+jansteinhauser@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:38:03 +0200 Subject: [PATCH 105/259] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Florian Humpenöder --- modules/30_crop/endo_apr21/equations.gms | 2 +- modules/30_crop/penalty_apr22/equations.gms | 2 +- modules/30_crop/rotation_apr22/equations.gms | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/30_crop/endo_apr21/equations.gms b/modules/30_crop/endo_apr21/equations.gms index bb8f0afae5..a9abc49e6c 100644 --- a/modules/30_crop/endo_apr21/equations.gms +++ b/modules/30_crop/endo_apr21/equations.gms @@ -83,4 +83,4 @@ *' regional cropland area is calculated for the cropland growth constraint q30_crop_reg(i2) .. v30_crop_area(i2) =e= - sum(cell(i2,j2), vm_land(j2,"crop")); + sum((cell(i2,j2), kcr, w), vm_area(j2,kcr,w)); diff --git a/modules/30_crop/penalty_apr22/equations.gms b/modules/30_crop/penalty_apr22/equations.gms index a056aff463..da1b55f9c0 100644 --- a/modules/30_crop/penalty_apr22/equations.gms +++ b/modules/30_crop/penalty_apr22/equations.gms @@ -114,4 +114,4 @@ q30_rotation_penalty(i2) .. *' regional cropland area is calculated for the cropland growth constraint q30_crop_reg(i2) .. v30_crop_area(i2) =e= - sum(cell(i2,j2), vm_land(j2,"crop")); + sum((cell(i2,j2), kcr, w), vm_area(j2,kcr,w)); diff --git a/modules/30_crop/rotation_apr22/equations.gms b/modules/30_crop/rotation_apr22/equations.gms index f3e1302b43..0ffafca291 100644 --- a/modules/30_crop/rotation_apr22/equations.gms +++ b/modules/30_crop/rotation_apr22/equations.gms @@ -95,4 +95,4 @@ *' regional cropland area is calculated for the cropland growth constraint q30_crop_reg(i2) .. v30_crop_area(i2) =e= - sum(cell(i2,j2), vm_land(j2,"crop")); + sum((cell(i2,j2), kcr, w), vm_area(j2,kcr,w)); From bc74c9ab864c701eb867d31ce7e2d448a42efcea Mon Sep 17 00:00:00 2001 From: florianh Date: Sat, 20 Apr 2024 19:56:39 +0200 Subject: [PATCH 106/259] added balance variable in peatland module --- CHANGELOG.md | 2 +- config/default.cfg | 4 +++- modules/58_peatland/v2/declarations.gms | 2 ++ modules/58_peatland/v2/equations.gms | 8 +++++--- modules/58_peatland/v2/input.gms | 1 + modules/58_peatland/v2/postsolve.gms | 4 ++++ modules/58_peatland/v2/presolve.gms | 12 ++++++++++-- modules/58_peatland/v2/realization.gms | 1 + 8 files changed, 27 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 358b0370d3..2072cddd55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,7 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scenario_fsec.csv** scenario settings - **start/projects/fsec.R** scenario settings - **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working -- **default.cfg** default for `s14_minimum_wood_yield` aligned with FSEC settings +- **58_peatland** Added balance variable to avoid random infeasibilites ## [4.7.3] - 2024-04-12 diff --git a/config/default.cfg b/config/default.cfg index 9768e4c897..8cb29833e9 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -332,7 +332,7 @@ cfg$gms$s14_use_yield_calib <- 0 # def = 0 # Include a minimum yield for wood harvest in secondary vegetation (tDM per ha per yr). # Age classes with wood yields below this threshold have a production of zero. -cfg$gms$s14_minimum_wood_yield <- 10 #def = 10 +cfg$gms$s14_minimum_wood_yield <- 20 #def = 20 # ***--------------------- 15_food --------------------------------------- # * (anthropometrics_jan18): estimates food using scenario dependent regression @@ -1601,6 +1601,8 @@ cfg$gms$s58_cost_drain_intact_onetime <- 0 # def = 0 cfg$gms$s58_cost_drain_rewet_onetime <- 0 # def = 0 cfg$gms$s58_cost_drain_recur <- 0 # def = 0 +# * Penalty for technical peatland balance term (USD05MER) +cfg$gms$s58_balance_penalty <- 1000000 # def = 1000000 # * Switch for fixing peatland area until the year given by s58_fix_peatland to historic levels (not available in `off`). # * Note: In the realisation `v2`, historic peatland area is only available for the year 2022. diff --git a/modules/58_peatland/v2/declarations.gms b/modules/58_peatland/v2/declarations.gms index 040af4b988..a33ac2a46b 100644 --- a/modules/58_peatland/v2/declarations.gms +++ b/modules/58_peatland/v2/declarations.gms @@ -43,6 +43,7 @@ positive variables v58_manLandExp(j,manPeat58) Managed land area expansion (mio. ha) v58_manLandRed(j,manPeat58) Managed land area reduction (mio. ha) v58_scalingFactorExp(j,manPeat58) Scaling factor for peatland expansion (1) + v58_balance(j,manPeat58) Technical balance term for peatland scaling factor (1) v58_peatland_cost_annuity(j,cost58) Annuity costs for peatland conversion in the current timestep (mio. USD05MER per yr) ; @@ -56,6 +57,7 @@ parameters ov58_manLandExp(t,j,manPeat58,type) Managed land area expansion (mio. ha) ov58_manLandRed(t,j,manPeat58,type) Managed land area reduction (mio. ha) ov58_scalingFactorExp(t,j,manPeat58,type) Scaling factor for peatland expansion (1) + ov58_balance(t,j,manPeat58,type) Technical balance term for peatland scaling factor (1) ov58_peatland_cost_annuity(t,j,cost58,type) Annuity costs for peatland conversion in the current timestep (mio. USD05MER per yr) oq58_peatland(t,j,type) Constraint for total peatland area (mio. ha) oq58_peatlandChange(t,j,land58,type) Peatland area change (mio. ha) diff --git a/modules/58_peatland/v2/equations.gms b/modules/58_peatland/v2/equations.gms index 1856a209a3..45f4e82d1c 100644 --- a/modules/58_peatland/v2/equations.gms +++ b/modules/58_peatland/v2/equations.gms @@ -48,15 +48,17 @@ *' See macro `m58_LandLeft` for details. q58_scalingFactorExp(j2,manPeat58)$(sum(ct, m_year(ct)) > s58_fix_peatland) .. - v58_scalingFactorExp(j2,manPeat58) * m58_LandLeft(pcm_land,"land",v58_manLand,pc58_manLand) =e= - m58_LandLeft(pc58_peatland,"land58",v58_peatland,pc58_peatland) ; + v58_scalingFactorExp(j2,manPeat58) * m58_LandLeft(pcm_land,"land",v58_manLand,pc58_manLand) + v58_balance(j2,manPeat58) + =e= + m58_LandLeft(pc58_peatland,"land58",v58_peatland,pc58_peatland); *' Costs for peatland degradation and rewetting q58_peatland_cost(j2) .. vm_peatland_cost(j2) =e= sum(cost58, v58_peatland_cost_annuity(j2,cost58)) + v58_peatland(j2,"rewetted") * sum(ct, i58_cost_rewet_recur(ct)) - + sum(manPeat58, v58_peatland(j2,manPeat58)) * sum(ct, i58_cost_drain_recur(ct)); + + sum(manPeat58, v58_peatland(j2,manPeat58)) * sum(ct, i58_cost_drain_recur(ct)) + + sum(manPeat58, v58_balance(j2,manPeat58)) * s58_balance_penalty; q58_peatland_cost_annuity(j2,cost58) .. v58_peatland_cost_annuity(j2,cost58) =g= diff --git a/modules/58_peatland/v2/input.gms b/modules/58_peatland/v2/input.gms index 5ed9a838b2..0508ea5c3f 100644 --- a/modules/58_peatland/v2/input.gms +++ b/modules/58_peatland/v2/input.gms @@ -13,6 +13,7 @@ scalars s58_cost_drain_rewet_onetime One-time costs for drainage of rewetted peatland (USD05MER per ha) / 0 / s58_rewetting_switch Peatland rewetting on (Inf) or off (0) / Inf / s58_fix_peatland Year indicating until when peatland area should be fixed (year) / 2020 / + s58_balance_penalty Penalty for technical peatland balance term (USD05MER) / 1000000 / ; *Peatland area based on Global Peatland Map 2.0 and Global Peatland Database diff --git a/modules/58_peatland/v2/postsolve.gms b/modules/58_peatland/v2/postsolve.gms index 0f321ce78d..38e6ded2cc 100644 --- a/modules/58_peatland/v2/postsolve.gms +++ b/modules/58_peatland/v2/postsolve.gms @@ -17,6 +17,7 @@ pc58_manLand(j,manPeat58) = v58_manLand.l(j,manPeat58); ov58_manLandExp(t,j,manPeat58,"marginal") = v58_manLandExp.m(j,manPeat58); ov58_manLandRed(t,j,manPeat58,"marginal") = v58_manLandRed.m(j,manPeat58); ov58_scalingFactorExp(t,j,manPeat58,"marginal") = v58_scalingFactorExp.m(j,manPeat58); + ov58_balance(t,j,manPeat58,"marginal") = v58_balance.m(j,manPeat58); ov58_peatland_cost_annuity(t,j,cost58,"marginal") = v58_peatland_cost_annuity.m(j,cost58); oq58_peatland(t,j,"marginal") = q58_peatland.m(j); oq58_peatlandChange(t,j,land58,"marginal") = q58_peatlandChange.m(j,land58); @@ -37,6 +38,7 @@ pc58_manLand(j,manPeat58) = v58_manLand.l(j,manPeat58); ov58_manLandExp(t,j,manPeat58,"level") = v58_manLandExp.l(j,manPeat58); ov58_manLandRed(t,j,manPeat58,"level") = v58_manLandRed.l(j,manPeat58); ov58_scalingFactorExp(t,j,manPeat58,"level") = v58_scalingFactorExp.l(j,manPeat58); + ov58_balance(t,j,manPeat58,"level") = v58_balance.l(j,manPeat58); ov58_peatland_cost_annuity(t,j,cost58,"level") = v58_peatland_cost_annuity.l(j,cost58); oq58_peatland(t,j,"level") = q58_peatland.l(j); oq58_peatlandChange(t,j,land58,"level") = q58_peatlandChange.l(j,land58); @@ -57,6 +59,7 @@ pc58_manLand(j,manPeat58) = v58_manLand.l(j,manPeat58); ov58_manLandExp(t,j,manPeat58,"upper") = v58_manLandExp.up(j,manPeat58); ov58_manLandRed(t,j,manPeat58,"upper") = v58_manLandRed.up(j,manPeat58); ov58_scalingFactorExp(t,j,manPeat58,"upper") = v58_scalingFactorExp.up(j,manPeat58); + ov58_balance(t,j,manPeat58,"upper") = v58_balance.up(j,manPeat58); ov58_peatland_cost_annuity(t,j,cost58,"upper") = v58_peatland_cost_annuity.up(j,cost58); oq58_peatland(t,j,"upper") = q58_peatland.up(j); oq58_peatlandChange(t,j,land58,"upper") = q58_peatlandChange.up(j,land58); @@ -77,6 +80,7 @@ pc58_manLand(j,manPeat58) = v58_manLand.l(j,manPeat58); ov58_manLandExp(t,j,manPeat58,"lower") = v58_manLandExp.lo(j,manPeat58); ov58_manLandRed(t,j,manPeat58,"lower") = v58_manLandRed.lo(j,manPeat58); ov58_scalingFactorExp(t,j,manPeat58,"lower") = v58_scalingFactorExp.lo(j,manPeat58); + ov58_balance(t,j,manPeat58,"lower") = v58_balance.lo(j,manPeat58); ov58_peatland_cost_annuity(t,j,cost58,"lower") = v58_peatland_cost_annuity.lo(j,cost58); oq58_peatland(t,j,"lower") = q58_peatland.lo(j); oq58_peatlandChange(t,j,land58,"lower") = q58_peatlandChange.lo(j,land58); diff --git a/modules/58_peatland/v2/presolve.gms b/modules/58_peatland/v2/presolve.gms index b0c3672191..cb977936b4 100644 --- a/modules/58_peatland/v2/presolve.gms +++ b/modules/58_peatland/v2/presolve.gms @@ -21,6 +21,9 @@ if (m_year(t) <= s58_fix_peatland, * Peatland area is fixed to `pc58_peatland` until the year given by s58_fix_peatland v58_peatland.fx(j,land58) = pc58_peatland(j,land58); + v58_scalingFactorExp.fx(j,manPeat58) = 0; + v58_balance.fx(j,manPeat58) = 0; + i58_cost_rewet_recur(t) = 0; i58_cost_drain_recur(t) = 0; i58_cost_drain_intact_onetime(t) = 0; @@ -34,6 +37,11 @@ else v58_peatland.up(j,"rewetted") = s58_rewetting_switch; v58_peatland.up(j,"intact") = pc58_peatland(j,"intact"); v58_peatland.fx(j,"peatExtract") = pc58_peatland(j,"peatExtract"); + v58_scalingFactorExp.lo(j,manPeat58) = 0; + v58_scalingFactorExp.up(j,manPeat58) = Inf; + v58_balance.lo(j,manPeat58) = 0; + v58_balance.up(j,manPeat58) = Inf; + i58_cost_rewet_recur(t) = s58_cost_rewet_recur; i58_cost_drain_recur(t) = s58_cost_drain_recur; i58_cost_drain_intact_onetime(t) = s58_cost_drain_intact_onetime; @@ -46,7 +54,7 @@ else p58_scalingFactorRed(t,j,manPeat58) = (pc58_peatland(j,manPeat58)/pc58_manLand(j,manPeat58)) - $(pc58_peatland(j,manPeat58) > 1e-8 AND pc58_manLand(j,manPeat58) > 1e-8) - + 0$(pc58_peatland(j,manPeat58) <= 1e-8 OR pc58_manLand(j,manPeat58) <= 1e-8); + $(pc58_peatland(j,manPeat58) > 1e-10 AND pc58_manLand(j,manPeat58) > 1e-10) + + 0$(pc58_peatland(j,manPeat58) <= 1e-10 OR pc58_manLand(j,manPeat58) <= 1e-10); *' @stop diff --git a/modules/58_peatland/v2/realization.gms b/modules/58_peatland/v2/realization.gms index 45a87f7957..95aecd5adc 100644 --- a/modules/58_peatland/v2/realization.gms +++ b/modules/58_peatland/v2/realization.gms @@ -33,6 +33,7 @@ $Ifi "%phase%" == "sets" $include "./modules/58_peatland/v2/sets.gms" $Ifi "%phase%" == "declarations" $include "./modules/58_peatland/v2/declarations.gms" $Ifi "%phase%" == "input" $include "./modules/58_peatland/v2/input.gms" $Ifi "%phase%" == "equations" $include "./modules/58_peatland/v2/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/58_peatland/v2/scaling.gms" $Ifi "%phase%" == "preloop" $include "./modules/58_peatland/v2/preloop.gms" $Ifi "%phase%" == "presolve" $include "./modules/58_peatland/v2/presolve.gms" $Ifi "%phase%" == "postsolve" $include "./modules/58_peatland/v2/postsolve.gms" From 612afb077d9a4d450e7675444b7471f74cd34d5e Mon Sep 17 00:00:00 2001 From: florianh Date: Sat, 20 Apr 2024 19:59:53 +0200 Subject: [PATCH 107/259] added balance variable in peatland module --- modules/58_peatland/v2/scaling.gms | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 modules/58_peatland/v2/scaling.gms diff --git a/modules/58_peatland/v2/scaling.gms b/modules/58_peatland/v2/scaling.gms new file mode 100644 index 0000000000..3acae9e9b6 --- /dev/null +++ b/modules/58_peatland/v2/scaling.gms @@ -0,0 +1,8 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +v58_peatlandChange.scale(j,land58) = 10e-3; From 8557e5959282a524fd55a80a079bb871df85ffc3 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Tue, 23 Apr 2024 16:06:56 +0200 Subject: [PATCH 108/259] replace speed_aggregate --- scripts/output/extra/disaggregation_LUH2.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation_LUH2.R b/scripts/output/extra/disaggregation_LUH2.R index 2d43a52d00..8bee1a53ed 100644 --- a/scripts/output/extra/disaggregation_LUH2.R +++ b/scripts/output/extra/disaggregation_LUH2.R @@ -122,7 +122,7 @@ if(!dir.exists(paste0(out_dir,"/mappingLUH2MAgPIE/"))) dir.create(paste0(out_dir if(!file.exists(paste0(out_dir,"/mappingLUH2MAgPIE/LUH2MAgPIE.csv"))) write.csv(as.data.frame(mapping),file=paste0(out_dir,"/mappingLUH2MAgPIE/LUH2MAgPIE.csv")) countries<-intersect(getCells(mapping),unique(mapping_spatial$country)) mapping_spatial<-subset(mapping_spatial,country %in% countries) -map_LUHMAg_grid<-setYears(speed_aggregate(mapping[countries,,],rel=mapping_spatial,weight=NULL,from="country",to="cell",dim=1),NULL) +map_LUHMAg_grid<-setYears(madrat::toolAggregate(mapping[countries,,],rel=mapping_spatial,weight=NULL,from="country",to="cell",dim=1),NULL) #### calculates grid cell area of the earths sphere land_hr <- read.magpie(land_hr_out_file) From 9bf3b4de7de0cfa76433f5e7ef4cb0e4607960a2 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Wed, 24 Apr 2024 16:01:00 +0200 Subject: [PATCH 109/259] remove deprecated scripts + spam related code --- scripts/insertheader/insertheader.R | 2 +- .../deprecated/disaggregation_cropsplit.R | 145 ------------------ .../deprecated/disaggregation_transitions.R | 126 --------------- scripts/start_functions.R | 17 -- 4 files changed, 1 insertion(+), 289 deletions(-) delete mode 100644 scripts/output/deprecated/disaggregation_cropsplit.R delete mode 100644 scripts/output/deprecated/disaggregation_transitions.R diff --git a/scripts/insertheader/insertheader.R b/scripts/insertheader/insertheader.R index a739931056..622424abd3 100644 --- a/scripts/insertheader/insertheader.R +++ b/scripts/insertheader/insertheader.R @@ -13,7 +13,7 @@ insertheader <- function(maindir=".", "MAgPIE License Exception, version 1.0 (see LICENSE file).", "Contact: magpie@pik-potsdam.de"), donottouch=c("AUTHORS","README","LICENSE",".lhd",".mz",".rda",".opt", - ".spam",".xlsx",".sh","files",".md",".RData", ".jpg", + ".xlsx",".sh","files",".md",".RData", ".jpg", ".png",".cff", ".rds", ".aux", ".log", ".out", ".pdf", ".tex", ".htm", ".css", ".bib", ".ref", ".mif", ".gdx", ".lst", ".git-id", ".csv", ".Rdata", ".txt"), diff --git a/scripts/output/deprecated/disaggregation_cropsplit.R b/scripts/output/deprecated/disaggregation_cropsplit.R deleted file mode 100644 index d2bcc54fef..0000000000 --- a/scripts/output/deprecated/disaggregation_cropsplit.R +++ /dev/null @@ -1,145 +0,0 @@ -# | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# -------------------------------------------------------------- -# description: Interpolates land pools to 0.5 degree resolution - Cropland is split into Food/Feed and Bioenergy crops -# comparison script: FALSE -# --------------------------------------------------------------- - - -######################################################################### -#### Interpolates land pools from low to high resolution, calculates #### -#### corresponding spam-files for following disaggregations ############# -######################################################################### - -#Version 1.03 - Jan Philipp Dietrich -# 1.00: first working version -# 1.01: execution of reshape_folder function added at the end -# 1.02: uses now the land function to read the simulated land input -# 1.03: introduced function interpolate, all possible input is read from the GDX file now - -library(lucode2) -library(magpie4) -library(luscale) -library(gms) - -############################# BASIC CONFIGURATION ####################################### -land_lr_file <- "avl_land_t.cs3" -land_hr_file <- "avl_land_t_0.5.mz" -land_hr_out_file <- "cell_land_cropsplit_0.5.mz" -land_hr_share_out_file <- "cell_land_cropsplit_0.5_share.mz" - -prev_year <- "y1985" #timestep before calculations in MAgPIE -in_folder <- "modules/10_land/input" - -if(!exists("source_include")) { - sum_spam_file <- "0.5-to-n200_sum.spam" - title <- "base_run" - outputdir <- "output/SSP2_Ref_c200" - - ###Define arguments that can be read from command line - readArgs("sum_spam_file","outputdir","title") -} -######################################################################################### - -cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) -title <- cfg$title -print(title) - -# Function to extract information from info.txt -get_info <- function(file, grep_expression, sep, pattern="", replacement="") { - if(!file.exists(file)) return("#MISSING#") - file <- readLines(file, warn=FALSE) - tmp <- grep(grep_expression, file, value=TRUE) - tmp <- strsplit(tmp, sep) - tmp <- sapply(tmp, "[[", 2) - tmp <- gsub(pattern, replacement ,tmp) - if(all(!is.na(as.logical(tmp)))) return(as.vector(sapply(tmp, as.logical))) - if (all(!(regexpr("[a-zA-Z]",tmp) > 0))) { - tmp <- as.numeric(tmp) - } - return(tmp) -} -low_res <- get_info(paste0(outputdir,"/info.txt"),"^\\* Output ?resolution:",": ") -sum_spam_file <- paste0("0.5-to-",low_res,"_sum.spam") -print(sum_spam_file) - - -# Load input data -gdx <- file.path(outputdir,"fulldata.gdx") -land_ini_lr <- readGDX(gdx,"f10_land","f_land", format="first_found")[,"y1995",] -land_lr <- land(gdx,sum=FALSE,level="cell") -land_ini_hr <- read.magpie(file.path(in_folder,land_hr_file))[,"y1995",] -land_ini_hr <- land_ini_hr[,,getNames(land_lr)] -if(any(land_ini_hr < 0)) { - warning(paste0("Negative values in inital high resolution dataset detected and set to 0. Check the file ",land_hr_file)) - land_ini_hr[which(land_ini_hr < 0,arr.ind = T)] <- 0 -} - -# Start interpolation (use interpolate from luscale) -print("Interpolation") -land_hr <- interpolate( x = land_lr, - x_ini_lr = land_ini_lr, - x_ini_hr = land_ini_hr, - spam = file.path(outputdir,sum_spam_file), - prev_year = prev_year) - - -# Write outputs - -# Write spam files (crop weighted for each time step) -for(y in getYears(land_hr)) create_spam(land_hr[,y,"crop"],read.spam(file.path(outputdir,sum_spam_file)),fname=file.path(outputdir,sub("sum",paste("crop_weighted_mean",y,sep="_"),sum_spam_file))) - -# Disaggregate other cellular files -reshape_folder(outputdir) - - -print("Disaggregation crop types") -# detailed output (crop types, rf + if), disaggregate shares of cropland within cluster level to cellular level -# get rid of y1985 -land_hr <- land_hr[,-1,] - -# total crop tpye specific croparea -area <- croparea(gdx,level="cell",products="kcr",product_aggr=FALSE,water_aggr = FALSE) - -# share of crop types in terms of croparea -area_shr <- area/dimSums(area,dim=c(3.1,3.2)) - -# set inf to 0 -area_shr[is.na(area_shr)] <- 0 -area_shr[is.nan(area_shr)] <- 0 -area_shr[is.infinite(area_shr)] <- 0 - -# disaggregate share of crop types in terms of croparea to 0.5 resolution -area_shr_hr <- speed_aggregate(area_shr,t(read.spam(file.path(outputdir,sum_spam_file)))) - -# calculate crop tpye specific croparea in 0.5 resolution -area_hr <- area_shr_hr*setNames(land_hr[,,"crop"],NULL) - -print("Write netCDF outputs #1") -### replace crop in land_hr in with crop_kfo_rf, crop_kfo_ir, crop_kbe_rf and crop_kbe_ir -kbe <- c("betr","begr") -kfo <- setdiff(getNames(area_hr,dim=1),kbe) -crop_kfo_rf <- setNames(dimSums(area_hr[,,kfo][,,"rainfed"],dim=3),"crop_kfo_rf") -crop_kfo_ir <- setNames(dimSums(area_hr[,,kfo][,,"irrigated"],dim=3),"crop_kfo_ir") -crop_kbe_rf <- setNames(dimSums(area_hr[,,kbe][,,"rainfed"],dim=3),"crop_kbe_rf") -crop_kbe_ir <- setNames(dimSums(area_hr[,,kbe][,,"irrigated"],dim=3),"crop_kbe_ir") -crop_hr <- mbind(crop_kfo_rf,crop_kfo_ir,crop_kbe_rf,crop_kbe_ir) -#drop crop -land_hr <- land_hr[,,"crop",invert=TRUE] -#combine land_hr with crop_hr. -land_hr <- mbind(crop_hr,land_hr) -#write landpool -write.magpie(land_hr,file.path(outputdir,paste(land_hr_out_file,sep="_")),comment="unit: Mha per grid-cell") -write.magpie(land_hr,file.path(outputdir,paste(sub(".mz",".nc",land_hr_out_file),sep="_")),comment="unit: Mha per grid-cell", verbose=FALSE) - -print("Write netCDF outputs #2") -#calculate share of land pools in terms of tatal cell size -land_shr_hr <- land_hr/dimSums(land_hr,dim=3.1) -#write landpool shares -write.magpie(land_shr_hr,file.path(outputdir,paste(land_hr_share_out_file,sep="_")),comment="unit: grid-cell land area fraction") -write.magpie(land_shr_hr,file.path(outputdir,paste(sub(".mz",".nc",land_hr_share_out_file),sep="_")),comment="unit: grid-cell land area fraction", verbose=FALSE) diff --git a/scripts/output/deprecated/disaggregation_transitions.R b/scripts/output/deprecated/disaggregation_transitions.R deleted file mode 100644 index 5c0e40f611..0000000000 --- a/scripts/output/deprecated/disaggregation_transitions.R +++ /dev/null @@ -1,126 +0,0 @@ -# | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -# | authors, and contributors see CITATION.cff file. This file is part -# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -# | AGPL-3.0, you are granted additional permissions described in the -# | MAgPIE License Exception, version 1.0 (see LICENSE file). -# | Contact: magpie@pik-potsdam.de - -# -------------------------------------------------------------- -# description: Interpolates land transitions to 0.5 degree resolution -# comparison script: FALSE -# --------------------------------------------------------------- - -#Version 1.00 - Florian Humpenoeder - -library(lucode2) -library(magpie4) -library(luscale) -library(madrat) -library(gms) - -############################# BASIC CONFIGURATION ####################################### -land_lr_file <- "avl_land_t.cs3" -land_hr_file <- "avl_land_t_0.5.mz" -land_hr_out_file <- "cell.land_transitions_0.5.mz" -land_hr_share_out_file <- "cell.land_transitions_0.5_share.mz" - -prev_year <- "y1985" #timestep before calculations in MAgPIE -in_folder <- "modules/10_land/input" - -if(!exists("source_include")) { - sum_spam_file <- "0.5-to-n200_sum.spam" - title <- "base_run" - outputdir <- "output/SSP2_Ref_c200" - - ###Define arguments that can be read from command line - readArgs("sum_spam_file","outputdir","title") -} -######################################################################################### - -cfg <- gms::loadConfig(file.path(outputdir, "config.yml")) -title <- cfg$title -print(title) - -# Function to extract information from info.txt -get_info <- function(file, grep_expression, sep, pattern="", replacement="") { - if(!file.exists(file)) return("#MISSING#") - file <- readLines(file, warn=FALSE) - tmp <- grep(grep_expression, file, value=TRUE) - tmp <- strsplit(tmp, sep) - tmp <- sapply(tmp, "[[", 2) - tmp <- gsub(pattern, replacement ,tmp) - if(all(!is.na(as.logical(tmp)))) return(as.vector(sapply(tmp, as.logical))) - if (all(!(regexpr("[a-zA-Z]",tmp) > 0))) { - tmp <- as.numeric(tmp) - } - return(tmp) -} -low_res <- get_info(paste0(outputdir,"/info.txt"),"^\\* Output ?resolution:",": ") -sum_spam_file <- paste0("0.5-to-",low_res,"_sum.spam") -print(sum_spam_file) - -### Land Stock - -# Load input data -gdx <- file.path(outputdir,"fulldata.gdx") -land_ini_lr <- readGDX(gdx,"f10_land","f_land", format="first_found")[,"y1995",] -land_lr <- land(gdx,sum=FALSE,level="cell") -land_ini_hr <- read.magpie(file.path(in_folder,land_hr_file))[,"y1995",] -land_ini_hr <- land_ini_hr[,,getNames(land_lr)] -if(any(land_ini_hr < 0)) { - warning(paste0("Negative values in inital high resolution dataset detected and set to 0. Check the file ",land_hr_file)) - land_ini_hr[which(land_ini_hr < 0,arr.ind = T)] <- 0 -} - -# Start interpolation (use interpolate from luscale) -print("Disaggregation Land Stock") -land_hr <- interpolate( x = land_lr, - x_ini_lr = land_ini_lr, - x_ini_hr = land_ini_hr, - spam = file.path(outputdir,sum_spam_file), - prev_year = prev_year) -land_hr <- land_hr[,-1,] - -### Land Tranitions - -# prepare input data -CountryToCell <- toolGetMapping("CountryToCellMapping.csv", type = "cell") -land_lr <- readGDX(gdx,"ov10_lu_transitions",select = list(type="level"),react = "silent") -if(is.null(land_lr)) stop("No land transitions available in GDX file") -land_ini_hr <- new.magpie(CountryToCell$cell,NULL,getNames(land_lr),fill = 0) -x <- read.magpie(file.path(in_folder,land_hr_file))[,"y1995",] -x <- x[,,getNames(land_lr,dim=1)] -for (i in getNames(land_lr,dim=1)) { - land_ini_hr[,,paste(i,i,sep=".")] <- x[,,i] -} -land_ini_lr <- speed_aggregate(land_ini_hr,file.path(outputdir,sum_spam_file)) -getCells(land_ini_lr) <- getCells(land_lr) - -# Interpolate Transitions -print("Disaggregation Land Transitions") -land_trans_hr <- interpolate( x = land_lr, - x_ini_lr = land_ini_lr, - x_ini_hr = land_ini_hr, - spam = file.path(outputdir,sum_spam_file), - prev_year = prev_year) -land_trans_hr <- land_trans_hr[,-1,] - -# Test -test <- dimSums(land_trans_hr,dim=3.1) - land_hr -if(max(test)>0.1||min(test)< -0.1) warning("Sum over land transitions and land stock differ, but should be equal!") -#dimSums(land_hr[1,,],dim=c(1))[,,"crop"] -#dimSums(land_trans_hr[1,,],dim=c(1,3.1))[,,"crop"] - -# Write outputs - -print("Write outputs cell.land") -# write landpool -write.magpie(land_trans_hr,file.path(outputdir,paste(land_hr_out_file,sep="_")),comment="unit: Mha per grid-cell") -write.magpie(land_trans_hr,file.path(outputdir,paste(sub(".mz",".nc",land_hr_out_file),sep="_")),comment="unit: Mha per grid-cell", verbose=FALSE) - -print("Write outputs cell.land_share") -# calculate share of land pools in terms of tatal cell size -land_trans_hr_shr <- land_trans_hr/dimSums(land_trans_hr,dim=3) -# write landpool shares -write.magpie(land_trans_hr_shr,file.path(outputdir,paste(land_hr_share_out_file,sep="_")),comment="unit: grid-cell land area fraction") -write.magpie(land_trans_hr_shr,file.path(outputdir,paste(sub(".mz",".nc",land_hr_share_out_file),sep="_")),comment="unit: grid-cell land area fraction", verbose=FALSE) diff --git a/scripts/start_functions.R b/scripts/start_functions.R index b6e92ef845..4074b48c69 100644 --- a/scripts/start_functions.R +++ b/scripts/start_functions.R @@ -167,21 +167,6 @@ gms::replace_in_file("main.gms",paste('*',content),subject) } - -.spam2rds <- function(spatial_header, cells_tmp, - outfile = "clustermap_rev0_dummy.rds", - spamfile = Sys.glob("input/0.5-to-*_sum.spam")) { - - sp <- luscale::read.spam(spamfile) - a <- apply(sp, 2, function(x) return(which(x == 1))) - out <- data.frame(cell = cells_tmp, region = sub("\\..*$","",spatial_header), - country = sub("\\..*$", "", cells_tmp), global = "GLO") - out$cluster <- paste0(out$region,".", a) - out <- out[,c("cell", "cluster", "region", "country", "global")] - saveRDS(out, paste0("input/", outfile), version = 2) -} - - ################################################################################ ######################### MAIN FUNCTIONS ####################################### ################################################################################ @@ -210,8 +195,6 @@ download_and_update <- function(cfg) { cel <- magclass::getItems(tmp2, dim = 1) # read spatial_header, map, reg_revision and regionscode load("input/spatial_header.rda") - rds <- any(grepl(pattern = "clustermap_rev.*.rds", x = list.files("input"))) - if (!rds) .spam2rds(spatial_header, cel, "clustermap_rev0_dummy.rds") .update_info(filemap, x = tmp, regionscode, reg_revision, warnings) .update_sets_core(x = tmp, map = map) .update_sets_modules() From ff1839238904c3fe31d13c07675c296a4d3e522f Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Wed, 24 Apr 2024 16:13:46 +0200 Subject: [PATCH 110/259] changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2072cddd55..db5bab28b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,13 +8,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- +- **scripts** start_functions no longer support reading spam files ### added - ### removed -- +- **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs From 4d9191d64454547e2368b258737a3111dd3fdeea Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Wed, 24 Apr 2024 19:47:56 +0200 Subject: [PATCH 111/259] changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db5bab28b9..e79c68937e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,3 @@ - # Changelog All notable changes to this project will be documented in this file. @@ -8,13 +7,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- **scripts** start_functions no longer support reading spam files +- ### added - ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions +- **scripts** removed support for spam files in start_functions ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs From fe498810470bbd82ae2a87b71d7cdb3db69ac997 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Thu, 25 Apr 2024 12:04:54 +0200 Subject: [PATCH 112/259] updated (non-default) AEI data (from Mehta2022 to Mehta2024) --- CHANGELOG.md | 2 +- config/default.cfg | 9 ++--- literature.bib | 35 ++++++++++++++++++- .../endo_apr13/realization.gms | 5 +-- .../endo_apr13/sets.gms | 2 +- .../static/realization.gms | 2 +- .../static/sets.gms | 2 +- .../agr_sector_aug13/realization.gms | 1 + 8 files changed, 47 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e79c68937e..fec09f1e45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- +- **41_area_equipped_for_irrigation** updated (non-default) AEI data (from Mehta2022 to Mehta2024) ### added - diff --git a/config/default.cfg b/config/default.cfg index 8cb29833e9..da7c361c64 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "rev4.104_h12_magpie.tgz", - cellular = "rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.104_h12_validation.tgz", +cfg$input <- c(regional = "rev4.107_h12_magpie.tgz", + cellular = "rev4.107_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.107_h12_validation.tgz", additional = "additional_data_rev4.48.tgz", calibration = "calibration_H12_26Mar24.tgz") @@ -1081,7 +1081,8 @@ cfg$gms$area_equipped_for_irrigation <- "endo_apr13" # def = endo_apr13 # * switch for initialization area # * (LUH2v2): area equipped for irrigation based on LUH2v2 irrigated areas -# * (Mehta2022): area equipped for irrigation from Mehta et al. (2022) +# * (Mehta2024_Siebert2013): area equipped for irrigation from Mehta et al. (2024) using GMIA (Siebert et al, 2013) base map +# * (Mehta2024_Meier2018): are equipped for irrigation from Mehta et al. (2024) using Meier et al. (2018) base map cfg$gms$c41_initial_irrigation_area <- "LUH2v2" # def = LUH2v2 # * Sets the rate of depreciation of irrigation infrastructure in every timestep. diff --git a/literature.bib b/literature.bib index d4ee7ea751..7f64577c5a 100644 --- a/literature.bib +++ b/literature.bib @@ -1023,6 +1023,39 @@ @article{siebert_FAO_2007 year = {2007}, } +@article{siebert_FAO_2007, + author = {Stefan Siebert and Petra Döll and Sebastian Feick and Jippe Hoogeveen and Karen Frenken}, + year = {2007}, + title = {Global Map of Irrigation Areas version 4.0.1.}, + journal = {Johann Wolfgang Goethe University, Frankfurt am Main, Germany / Food and Agriculture Organization of the United Nations, Rome, Italy.}, + url = {http://www.fao.org/nr/water/aquastat/irrigationmap/index10.stm}, +} + +@article{siebert_FAO_2013, + author = {Stefan Siebert, Verena Henrich, Karen Frenken and Jacob Burk}, + year = {2013}, + title = {Global Map of Irrigation Areas version 5}, + journal = {Rheinische Friedrich-Wilhelms-University, Bonn, Germany / Food and Agriculture Organization of the United Nations, Rome, Italy}, + url = {https://data.apps.fao.org/catalog/iso/f79213a0-88fd-11da-a88f-000d939bc5d8}, +} + +@article{meier_global_2018, + author = {Meier, Jonas; Zabel, Florian; Mauser, Wolfram}, + year = {2018}, + title = {Global Irrigated Areas dataset}, + journal = {PANGAEA}, + doi = {https://doi.org/10.1594/PANGAEA.884744}, + url = {https://doi.pangaea.de/10.1594/PANGAEA.884744}, +} + +@article{mehta_half_2024, + author = {Mehta, P., Siebert, S., Kummu, M. et al.}, + year = {2024}, + title = {Half of twenty-first century global irrigation expansion has been in water-stressed regions}, + journal = {Nature Water}, + doi = {https://doi.org/10.1038/s44221-024-00206-9}, +} + @book{fao_aquastat_2016, address = {Rome}, title = {{AQUASTAT} core database}, @@ -1030,7 +1063,7 @@ @book{fao_aquastat_2016 author = {{FAO}}, url = {{https://data.harvestportal.org/de/dataset/fao-aquastat/resource/c4668555-eb76-4882-83b1-230038e24f02?inner_span=True}}, year = {2016}, - note = {Database accessed on 2023/02/06} + note = {Database accessed on 2023/02/06}, } @techreport{worldbank_irrigation_1995, diff --git a/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms b/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms index 9208456cb5..07fb647508 100644 --- a/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms +++ b/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms @@ -7,8 +7,9 @@ *' @description This realization allows the model to endogenously decide on investments to deploy additional -*' irrigation infrastructure, i.e. to increase the area equipped for irrigation (AEI). Initial values for AEI -*' in 1995 are taken from @siebert_FAO_2007. Contraction of AEI is not possible. +*' irrigation infrastructure, i.e. to increase the area equipped for irrigation (AEI). +*' Initial values for AEI are areas that are irrigated in the initial time step in LUH2v2. +*' Contraction of AEI is not possible. *' Irrigated crop production can only take place where irrigation infrastructure is present. *' *' Unit costs per hectare for AEI expansion are derived from a World Bank study (@worldbank_irrigation_1995) diff --git a/modules/41_area_equipped_for_irrigation/endo_apr13/sets.gms b/modules/41_area_equipped_for_irrigation/endo_apr13/sets.gms index 6f0264ed1b..3ffe557c32 100644 --- a/modules/41_area_equipped_for_irrigation/endo_apr13/sets.gms +++ b/modules/41_area_equipped_for_irrigation/endo_apr13/sets.gms @@ -10,5 +10,5 @@ sets / y1995, y2000, y2005, y2010, y2015 / aei41 Data source for area equipped for irrigation - / LUH2v2, Mehta2022 / + / LUH2v2, Mehta2024_Siebert2013, Mehta2024_Meier2018 / ; diff --git a/modules/41_area_equipped_for_irrigation/static/realization.gms b/modules/41_area_equipped_for_irrigation/static/realization.gms index a838b9fc32..5a50115a9c 100644 --- a/modules/41_area_equipped_for_irrigation/static/realization.gms +++ b/modules/41_area_equipped_for_irrigation/static/realization.gms @@ -7,7 +7,7 @@ *' In this realization, area equipped for irrigation is fixed to input data (around the year 2000) -*' for all time steps. The source of the input data is @siebert_FAO_2007. +*' for all time steps. The sources of the input data are @siebert_FAO_2013 and @mehta_half_2024. *' *' @limitations No irrigation is possible on areas that have not been equipped for irrigation in the past. *' diff --git a/modules/41_area_equipped_for_irrigation/static/sets.gms b/modules/41_area_equipped_for_irrigation/static/sets.gms index 6f0264ed1b..3ffe557c32 100644 --- a/modules/41_area_equipped_for_irrigation/static/sets.gms +++ b/modules/41_area_equipped_for_irrigation/static/sets.gms @@ -10,5 +10,5 @@ sets / y1995, y2000, y2005, y2010, y2015 / aei41 Data source for area equipped for irrigation - / LUH2v2, Mehta2022 / + / LUH2v2, Mehta2024_Siebert2013, Mehta2024_Meier2018 / ; diff --git a/modules/42_water_demand/agr_sector_aug13/realization.gms b/modules/42_water_demand/agr_sector_aug13/realization.gms index 4682d1fc6b..06cafc3fbc 100644 --- a/modules/42_water_demand/agr_sector_aug13/realization.gms +++ b/modules/42_water_demand/agr_sector_aug13/realization.gms @@ -33,6 +33,7 @@ *' efficiency times management factor") from @PIK_report104_2007. *' Here, irrigated area from @siebert_FAO_2007 has been used as aggregation *' weight. +*' Contraction of AEI happens if a depreciation rate is set in the switch `s41_AEI_depreciation`. *' *' * A regression of country values of the "conveyance efficiency times *' management factor" from @PIK_report104_2007 on GDP. From 49473ac606cb2fa0068d8fed4787e028b7c1de04 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 25 Apr 2024 16:10:09 +0200 Subject: [PATCH 113/259] PR review fixes --- config/scenario_fsec.csv | 6 +++--- .../area_based_apr22/declarations.gms | 2 +- scripts/output/extra/disaggregation.R | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/config/scenario_fsec.csv b/config/scenario_fsec.csv index b4b96c2a90..1ef7d7cb66 100644 --- a/config/scenario_fsec.csv +++ b/config/scenario_fsec.csv @@ -74,9 +74,9 @@ gms$s62_max_dem_bioplastic;0;;;;400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_fac_req_regr;reg;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_feed_scen;;;;;;;;;;;;;;;;;;ssp1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c73_build_demand;;;;;;;;;;;;;;;;;;;;;;;;50pc;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['cellular'];rev4.104_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.104_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.104_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.104_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.104_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.104_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.104_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; -input['regional'];rev4.104_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['validation'];rev4.104_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['cellular'];rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.105_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; +input['regional'];rev4.105_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['validation'];rev4.105_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['additional'];additional_data_rev4.48.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['calibration'];calibration_FSEC_26Mar24.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_RemSDP-900-MagSSP1.mif;; diff --git a/modules/22_land_conservation/area_based_apr22/declarations.gms b/modules/22_land_conservation/area_based_apr22/declarations.gms index 5ea850c85b..c036eee1ea 100644 --- a/modules/22_land_conservation/area_based_apr22/declarations.gms +++ b/modules/22_land_conservation/area_based_apr22/declarations.gms @@ -14,7 +14,7 @@ parameters p22_conservation_area(t,j,land) Total land conservation area for all land types (mio. ha) pm_land_conservation(t,j,land,consv_type) Land protection and restoration for all land types (mio. ha) p22_conservation_fader(t_all) Land conservation fader (1) - p22_add_consv(t,j,consv22_all,land) Addtional land conservation in conservation priority areas (mio. ha) + p22_add_consv(t,j,consv22_all,land) Additional land conservation in conservation priority areas (mio. ha) p22_secdforest_restore_pot(t,j) Potential secondary forest restoration area (mio. ha) p22_past_restore_pot(t,j) Potential pasture restoration area (mio. ha) p22_other_restore_pot(t,j) Potential other land restoration area (mio. ha) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 613ba486c0..ef98b04fca 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -104,9 +104,10 @@ if (length(map_file) > 1) { warning("No countries selected in land conservation disaggregation. Results may be erroneous") } - if (!all(c(cfg$gms$c22_base_protect, cfg$gms$c22_base_protect_noselect) %in% "none")) { - base_protect_select <- cfg$gms$c22_base_protect - base_protect_noselect <- cfg$gms$c22_base_protect_noselect + base_protect_select <- cfg$gms$c22_base_protect + base_protect_noselect <- cfg$gms$c22_base_protect_noselect + + if (!all(c(base_protect_select, base_protect_noselect) %in% "none")) { if (base_protect_noselect != "none") { land_consv_hr[, getYears(land_consv_hr), ] <- collapseDim(wdpa_hr[, nyears(wdpa_hr), base_protect_noselect], dim = 3.1) @@ -114,12 +115,15 @@ if (length(map_file) > 1) { } if (base_protect_select != "none") { land_consv_hr[consv_iso, , ] <- collapseDim(wdpa_hr[consv_iso, nyears(wdpa_hr), base_protect_select], dim = 3.1) - } else if (base_protect_select == "none") { + } else { land_consv_hr[consv_iso, , ] <- 0 } } - if (!all(c(cfg$gms$c22_protect_scenario, cfg$gms$c22_protect_scenario_noselect) %in% "none")) { + consv_select <- cfg$gms$c22_protect_scenario + consv_noselect <- cfg$gms$c22_protect_scenario_noselect + + if (!all(c(consv_select, consv_noselect) %in% "none")) { if (file.exists(consv_prio_hr_file)) { consv_prio_all <- read.magpie(consv_prio_hr_file) consv_prio_hr <- new.magpie( @@ -127,15 +131,13 @@ if (length(map_file) > 1) { names = getNames(consv_prio_all, dim = 2), fill = 0, sets = c("x.y.iso", "year", "data") ) - consv_select <- cfg$gms$c22_protect_scenario - consv_noselect <- cfg$gms$c22_protect_scenario_noselect if (consv_noselect != "none") { consv_prio_hr <- collapseDim(consv_prio_all[, , consv_noselect], dim = 3.1) } if (consv_select != "none") { consv_prio_hr[consv_iso, , ] <- collapseDim(consv_prio_all[consv_iso, , consv_select], dim = 3.1) - } else if (consv_select == "none") { + } else { consv_prio_hr[consv_iso, , ] <- 0 } # future conservation only pertains to natveg From dd0cc6836a5f860ff8c8de255f081d60805f63e3 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 25 Apr 2024 16:47:24 +0200 Subject: [PATCH 114/259] new forest recovery based on potential forest area --- core/sets.gms | 7 +- .../managementcalib_aug19/declarations.gms | 8 +- .../14_yields/managementcalib_aug19/input.gms | 2 +- .../area_based_apr22/presolve.gms | 4 +- .../35_natveg/dynamic_may24/declarations.gms | 129 +++++++++++ modules/35_natveg/dynamic_may24/equations.gms | 209 ++++++++++++++++++ modules/35_natveg/dynamic_may24/input.gms | 63 ++++++ modules/35_natveg/dynamic_may24/postsolve.gms | 179 +++++++++++++++ modules/35_natveg/dynamic_may24/preloop.gms | 65 ++++++ modules/35_natveg/dynamic_may24/presolve.gms | 185 ++++++++++++++++ .../35_natveg/dynamic_may24/realization.gms | 44 ++++ modules/35_natveg/dynamic_may24/scaling.gms | 8 + modules/35_natveg/dynamic_may24/sets.gms | 28 +++ modules/35_natveg/module.gms | 1 + 14 files changed, 923 insertions(+), 9 deletions(-) create mode 100644 modules/35_natveg/dynamic_may24/declarations.gms create mode 100644 modules/35_natveg/dynamic_may24/equations.gms create mode 100644 modules/35_natveg/dynamic_may24/input.gms create mode 100644 modules/35_natveg/dynamic_may24/postsolve.gms create mode 100644 modules/35_natveg/dynamic_may24/preloop.gms create mode 100644 modules/35_natveg/dynamic_may24/presolve.gms create mode 100644 modules/35_natveg/dynamic_may24/realization.gms create mode 100644 modules/35_natveg/dynamic_may24/scaling.gms create mode 100644 modules/35_natveg/dynamic_may24/sets.gms diff --git a/core/sets.gms b/core/sets.gms index f142e5c0eb..e506848e8b 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -247,10 +247,13 @@ sets land_ag(land) Agricultural land pools / crop, past / - forest_land(land) land from which timber can be taken away + land_timber(land) land from which timber can be taken away / forestry, primforest, secdforest,other / - land_natveg(forest_land) Natural vegetation land pools + land_forest(land) Forested land pools + / forestry, primforest, secdforest / + + land_natveg(land_timber) Natural vegetation land pools / primforest, secdforest, other / forest_type forest type diff --git a/modules/14_yields/managementcalib_aug19/declarations.gms b/modules/14_yields/managementcalib_aug19/declarations.gms index 68eaecbcaf..75fde4f8a9 100644 --- a/modules/14_yields/managementcalib_aug19/declarations.gms +++ b/modules/14_yields/managementcalib_aug19/declarations.gms @@ -14,10 +14,10 @@ parameters i14_fao_yields_hist(t,i,kcr) FAO yields per region at the historical referende year (tDM per ha per yr) i14_lambda_yields(t,i,kcr) Scaling factor for non-linear management calibration (1) i14_managementcalib(t,j,kcr,w) Regional management calibration factor accounting for FAO yield levels (1) - p14_growing_stock(t,j,ac,forest_land,forest_type) Forest growing stock (tDM per ha per yr) - pm_timber_yield(t,j,ac,forest_land) Forest growing stock (tDM per ha per yr) - p14_growing_stock_initial(j,ac,forest_land,forest_type) Initial Forest growing stock (tDM per ha per yr) - pm_timber_yield_initial(j,ac,forest_land) Initial Forest yield (tDM per ha per yr) + p14_growing_stock(t,j,ac,land_timber,forest_type) Forest growing stock (tDM per ha per yr) + pm_timber_yield(t,j,ac,land_timber) Forest growing stock (tDM per ha per yr) + p14_growing_stock_initial(j,ac,land_timber,forest_type) Initial Forest growing stock (tDM per ha per yr) + pm_timber_yield_initial(j,ac,land_timber) Initial Forest yield (tDM per ha per yr) pm_yields_semi_calib(j,kve,w) Potential yields calibrated to FAO regional levels (tDM per ha per yr) i14_calib_yields_hist(i,w) Calibrated yields average over region and crop type at the historical reference year (tDM per ha per yr) i14_calib_yields_ratio(i) Irrigated to rainfed yield ratio for calibrated yields (1) diff --git a/modules/14_yields/managementcalib_aug19/input.gms b/modules/14_yields/managementcalib_aug19/input.gms index 4677381139..4cf1313223 100644 --- a/modules/14_yields/managementcalib_aug19/input.gms +++ b/modules/14_yields/managementcalib_aug19/input.gms @@ -77,7 +77,7 @@ $include "./modules/14_yields/input/f14_ipcc_bce.cs3" $offdelim ; -parameter f14_aboveground_fraction(forest_land) Root to shoot ratio (1) +parameter f14_aboveground_fraction(land_timber) Root to shoot ratio (1) / $ondelim $include "./modules/14_yields/input/f14_aboveground_fraction.csv" diff --git a/modules/22_land_conservation/area_based_apr22/presolve.gms b/modules/22_land_conservation/area_based_apr22/presolve.gms index 1ff0c39820..9debb3b725 100644 --- a/modules/22_land_conservation/area_based_apr22/presolve.gms +++ b/modules/22_land_conservation/area_based_apr22/presolve.gms @@ -88,7 +88,7 @@ pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secd * Grassland restoration is limited by grassland restoration potential p22_past_restore_pot(t,j) = sum(land, pcm_land(j, land)) - pcm_land(j, "urban") - - sum(forest_land, pcm_land(j, forest_land)) + - sum(land_timber, pcm_land(j, land_timber)) - pm_land_conservation(t,j,"past","protect") - pm_land_conservation(t,j,"secdforest","restore"); p22_past_restore_pot(t,j)$(p22_past_restore_pot(t,j) < 0) = 0; @@ -97,7 +97,7 @@ pm_land_conservation(t,j,"past","restore")$(pm_land_conservation(t,j,"past","res * Other land restoration is limited by other land restoration potential p22_other_restore_pot(t,j) = sum(land, pcm_land(j, land)) - pcm_land(j, "urban") - - sum(forest_land, pcm_land(j, forest_land)) + - sum(land_timber, pcm_land(j, land_timber)) - sum(consv_type, pm_land_conservation(t,j,"past",consv_type)) - pm_land_conservation(t,j,"secdforest","restore"); p22_other_restore_pot(t,j)$(p22_other_restore_pot(t,j) < 0) = 0; diff --git a/modules/35_natveg/dynamic_may24/declarations.gms b/modules/35_natveg/dynamic_may24/declarations.gms new file mode 100644 index 0000000000..ec3dad2e85 --- /dev/null +++ b/modules/35_natveg/dynamic_may24/declarations.gms @@ -0,0 +1,129 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +scalars + s35_shift number of 5-year age-classes corresponding to current time step length (1) +; + +parameters + i35_secdforest(j,ac) Initial secdforest (mio. ha) + i35_other(j,ac) Initial other land (mio. ha) + p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) + p35_other(t,j,ac) Other land per age class (mio. ha) + pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) + pc35_other(j,ac) Other land per age class in current time step (mio. ha) + p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) + p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) + p35_damage_fader(t_all) Fader for forest damage (1) + p35_max_forest_recovery(j) Forest recovery potential (mio. ha) + p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) + p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) + p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) + p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) + i35_plantedclass_ac(j,ac) Area of age-classes in secondary forest (1) + p35_poulter_dist(j,ac) Share of age-classes in secondary forest (1) + p35_land(t,j,land_natveg,ac) Natural vegetation area (mio. ha) + p35_updated_gs_natfor(t,i) Updated growing stock in natural forests after calibration (m3 per ha) + p35_land_start_ac(j,ac,land_natveg) Initial Natural vegetation area (mio. ha) + p35_protection_dist(j,ac) Distribution of secondary forest protection (1) + p35_land_restoration(j,land_natveg) Actual secondary forest and other land restoration area (mio. ha) +; + +equations + q35_land_secdforest(j) Secdforest land pool calculation (mio. ha) + q35_land_other(j) Other land pool calculation (mio. ha) + q35_carbon_primforest(j,ag_pools,stockType) Primforest carbon stock calculation (mio tC) + q35_carbon_secdforest(j,ag_pools,stockType) Secdforest carbon stock calculation (mio tC) + q35_carbon_other(j,ag_pools,stockType) Other land carbon stock calculation (mio tC) + q35_min_forest(j) Minimum forest land constraint (mio. ha) + q35_min_other(j) Minimum other land constraint (mio. ha) + q35_landdiff Difference in natveg land (mio. ha) + q35_other_expansion(j) Other land expansion (mio. ha) + q35_other_reduction(j,ac) Other land reduction (mio. ha) + q35_secdforest_expansion(j) Secdforest reduction (mio. ha) + q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) + q35_primforest_reduction(j) Primforest reduction (mio. ha) + q35_secdforest_regeneration(j) Secondary forest remains secondary forest (mio. ha) + q35_max_secdforest_regeneration(j) Secondary (mio. ha) + q35_other_regeneration(j) Other land remains other land (mio. ha) + q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) + q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) + q35_hvarea_other(j,ac) Harvested area other land (mio. ha) + q35_hvarea_secdforest(j,ac) Harvested area secdforest (mio. ha) + q35_hvarea_primforest(j) Harvested area primforest (mio. ha) + q35_prod_secdforest(j) Production of woody biomass from secondary forests (mio. tDM per yr) + q35_prod_primforest(j) Production of woody biomass from primary forests (mio. tDM per yr) + q35_prod_other(j) Production of woody biomass from other land (mio. tDM per yr) + q35_cost_hvarea(i) Cost of harvesting natural vegetation (mio. USD) + q35_bv_primforest(j,potnatveg) Biodiversity value of primary forest (mio. ha) + q35_bv_secdforest(j,potnatveg) Biodiversity value of secondary forest (mio. ha) + q35_bv_other(j,potnatveg) Biodiversity value of other land (mio. ha) + q35_natveg_conservation(j) Total natural vegetation conservation constraint (mio. ha) +; + +positive variables + v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) + v35_other(j,ac) Detailed stock of other land (mio. ha) + vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) + v35_other_expansion(j) Other land expansion compared to previous timestep (mio. ha) + v35_other_reduction(j,ac) Other land reduction compared to previous timestep (mio. ha) + v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) + v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) + v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) + v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) + v35_hvarea_other(j,ac) Harvested area from other land (mio. ha) + v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) + vm_prod_natveg(j,land_natveg,kforestry) Production of woody biomass from natural vegetation (mio. tDM per yr) + vm_cost_hvarea_natveg(i) Cost of harvesting natural vegetation (mio. USD) +; + + +*#################### R SECTION START (OUTPUT DECLARATIONS) #################### +parameters + ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (mio. ha) + ov35_other(t,j,ac,type) Detailed stock of other land (mio. ha) + ov_landdiff_natveg(t,type) Aggregated difference in natveg land compared to previous timestep (mio. ha) + ov35_other_expansion(t,j,type) Other land expansion compared to previous timestep (mio. ha) + ov35_other_reduction(t,j,ac,type) Other land reduction compared to previous timestep (mio. ha) + ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha) + ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha) + ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha) + ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha) + ov35_hvarea_other(t,j,ac,type) Harvested area from other land (mio. ha) + ov35_hvarea_primforest(t,j,type) Harvested area from primary forest (mio. ha) + ov_prod_natveg(t,j,land_natveg,kforestry,type) Production of woody biomass from natural vegetation (mio. tDM per yr) + ov_cost_hvarea_natveg(t,i,type) Cost of harvesting natural vegetation (mio. USD) + oq35_land_secdforest(t,j,type) Secdforest land pool calculation (mio. ha) + oq35_land_other(t,j,type) Other land pool calculation (mio. ha) + oq35_carbon_primforest(t,j,ag_pools,stockType,type) Primforest carbon stock calculation (mio tC) + oq35_carbon_secdforest(t,j,ag_pools,stockType,type) Secdforest carbon stock calculation (mio tC) + oq35_carbon_other(t,j,ag_pools,stockType,type) Other land carbon stock calculation (mio tC) + oq35_min_forest(t,j,type) Minimum forest land constraint (mio. ha) + oq35_min_other(t,j,type) Minimum other land constraint (mio. ha) + oq35_landdiff(t,type) Difference in natveg land (mio. ha) + oq35_other_expansion(t,j,type) Other land expansion (mio. ha) + oq35_other_reduction(t,j,ac,type) Other land reduction (mio. ha) + oq35_secdforest_expansion(t,j,type) Secdforest reduction (mio. ha) + oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) + oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) + oq35_secdforest_regeneration(t,j,type) Secondary forest remains secondary forest (mio. ha) + oq35_other_regeneration(t,j,type) Other land remains other land (mio. ha) + oq35_other_est(t,j,ac,type) Distribution of other land additions over ac_est (mio. ha) + oq35_secdforest_est(t,j,ac,type) Distribution of secdforest additions over ac_est (mio. ha) + oq35_hvarea_other(t,j,ac,type) Harvested area other land (mio. ha) + oq35_hvarea_secdforest(t,j,ac,type) Harvested area secdforest (mio. ha) + oq35_hvarea_primforest(t,j,type) Harvested area primforest (mio. ha) + oq35_prod_secdforest(t,j,type) Production of woody biomass from secondary forests (mio. tDM per yr) + oq35_prod_primforest(t,j,type) Production of woody biomass from primary forests (mio. tDM per yr) + oq35_prod_other(t,j,type) Production of woody biomass from other land (mio. tDM per yr) + oq35_cost_hvarea(t,i,type) Cost of harvesting natural vegetation (mio. USD) + oq35_bv_primforest(t,j,potnatveg,type) Biodiversity value of primary forest (mio. ha) + oq35_bv_secdforest(t,j,potnatveg,type) Biodiversity value of secondary forest (mio. ha) + oq35_bv_other(t,j,potnatveg,type) Biodiversity value of other land (mio. ha) + oq35_natveg_conservation(t,j,type) Total natural vegetation conservation constraint (mio. ha) +; +*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/35_natveg/dynamic_may24/equations.gms b/modules/35_natveg/dynamic_may24/equations.gms new file mode 100644 index 0000000000..72c3c71047 --- /dev/null +++ b/modules/35_natveg/dynamic_may24/equations.gms @@ -0,0 +1,209 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @equations +*' The interface `vm_land` provides aggregated natveg land pools (`ac`) to other modules. + + q35_land_secdforest(j2) .. vm_land(j2,"secdforest") =e= sum(ac, v35_secdforest(j2,ac)); + + q35_land_other(j2) .. vm_land(j2,"other") =e= sum(ac, v35_other(j2,ac)); + +*' The total natural land area cannot be smaller than the total natural land conservation target. +*' Area requirements for natural land conservation are derived from WDPA and formulated based on +*' conservation priority areas during future time steps. + + q35_natveg_conservation(j2) .. + sum(land_natveg, vm_land(j2,land_natveg)) + =g= + sum((ct,land_natveg,consv_type), pm_land_conservation(ct,j2,land_natveg,consv_type)); + +*' Carbon stocks for primary forest, secondary forest or other natural land are calculated +*' as the product of respective area and carbon density. +*' Carbon stocks decline if the area decreases +*' (e.g. due to cropland expansion into forests). +*' In case of abandoned agricultural land (increase of other natural land), +*' natural succession, represented by age-class growth, results in increasing carbon stocks. + + q35_carbon_primforest(j2,ag_pools,stockType) .. + vm_carbon_stock(j2,"primforest",ag_pools,stockType) =e= + m_carbon_stock(vm_land,fm_carbon_density,"primforest"); + + q35_carbon_secdforest(j2,ag_pools,stockType) .. + vm_carbon_stock(j2,"secdforest",ag_pools,stockType) =e= + m_carbon_stock_ac(v35_secdforest,pm_carbon_density_ac,"ac","ac_sub"); + + q35_carbon_other(j2,ag_pools,stockType) .. + vm_carbon_stock(j2,"other",ag_pools,stockType) =e= + m_carbon_stock_ac(v35_other,pm_carbon_density_ac,"ac","ac_sub"); + +*' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). + + q35_bv_primforest(j2,potnatveg) .. vm_bv(j2,"primforest",potnatveg) + =e= + vm_land(j2,"primforest") * fm_bii_coeff("primary",potnatveg) * fm_luh2_side_layers(j2,potnatveg); + + q35_bv_secdforest(j2,potnatveg) .. vm_bv(j2,"secdforest",potnatveg) + =e= + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v35_secdforest(j2,ac)) * + fm_bii_coeff(bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); + + q35_bv_other(j2,potnatveg) .. vm_bv(j2,"other",potnatveg) + =e= + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v35_other(j2,ac)) * + fm_bii_coeff(bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); + +*' NPI/NDC land protection policies based on country reports are implemented as +*' minium forest and other land stocks. They are not interchangeable (as compared to +*' the natural land conservation constraint) and specifically formulated for forest and +*' other land stocks. + + q35_min_forest(j2) .. vm_land(j2,"primforest") + vm_land(j2,"secdforest") + =g= + sum(ct, p35_min_forest(ct,j2)); + + q35_min_other(j2) .. vm_land(j2,"other") =g= sum(ct, p35_min_other(ct,j2)); + +*' The following technical calculations are needed for reducing differences in land-use patterns between time steps. +*' The gross change in natural vegetation is calculated based on land expansion and +*' land contraction of other land, and land reduction of primary and secondary forest. +*' This information is then passed to the land module ([10_land]): + + q35_landdiff .. vm_landdiff_natveg =e= + sum(j2, + v35_other_expansion(j2) + + sum(ac_sub, v35_other_reduction(j2,ac_sub)) + + v35_secdforest_expansion(j2) + + sum(ac_sub, v35_secdforest_reduction(j2,ac_sub)) + + v35_primforest_reduction(j2)); + + q35_other_expansion(j2) .. + v35_other_expansion(j2) =e= + sum(ac_est, v35_other(j2,ac_est) + v35_secdforest(j2,ac_est)); + + q35_other_reduction(j2,ac_sub) .. + v35_other_reduction(j2,ac_sub) =e= + pc35_other(j2,ac_sub) - v35_other(j2,ac_sub); + + q35_secdforest_expansion(j2) .. + v35_secdforest_expansion(j2) =e= + sum(ac_est, v35_secdforest(j2,ac_est)); + + q35_secdforest_reduction(j2,ac_sub) .. + v35_secdforest_reduction(j2,ac_sub) =e= + pc35_secdforest(j2,ac_sub) - v35_secdforest(j2,ac_sub); + + q35_primforest_reduction(j2) .. + v35_primforest_reduction(j2) =e= + pcm_land(j2,"primforest") - vm_land(j2,"primforest"); + +******************************************************************* +**** Timber production related equations in natural vegetation **** +******************************************************************* + +*' For natural forest, per-hectare harvesting costs are positive to make sure that older +*' forest with higher growing stock is preferred over younger forest. +*' To mimic the difficulties in accessing primary forest, per-hectare harvesting +*' costs for primary forest are higher than for secondary forest. Harvesting costs +*' are paid everytime natural vegetation is harvested. The "real" harvested area +*' are received from the timber module [73_timber]. + +q35_cost_hvarea(i2).. + vm_cost_hvarea_natveg(i2) + =e= + sum((ct,cell(i2,j2),ac_sub), v35_hvarea_secdforest(j2,ac_sub)) * s35_timber_harvest_cost_secdforest + + sum((ct,cell(i2,j2),ac_sub), v35_hvarea_other(j2, ac_sub)) * s35_timber_harvest_cost_other + + sum((ct,cell(i2,j2)), v35_hvarea_primforest(j2)) * s35_timber_harvest_cost_primforest + ; + +** Secondary forest +*' Woody biomass production from secondary forests is calculated by multiplying the +*' area under production with corresponding yields of secondary forests, divided by the timestep length. + +q35_prod_secdforest(j2).. + sum(kforestry, vm_prod_natveg(j2,"secdforest",kforestry)) + =e= + sum(ac_sub, v35_hvarea_secdforest(j2,ac_sub) * sum(ct,pm_timber_yield(ct,j2,ac_sub,"secdforest"))) / m_timestep_length_forestry; + +** Primary forest +*' Woody biomass production from primary forests is calculated by multiplying the +*' area under production with corresponding yields of primary forests, divided by the timestep length. + +q35_prod_primforest(j2).. + sum(kforestry, vm_prod_natveg(j2,"primforest",kforestry)) + =e= + v35_hvarea_primforest(j2) * sum(ct, pm_timber_yield(ct,j2,"acx","primforest")) / m_timestep_length_forestry; + +** Other land +*' Wood-fuel production from other land is calculated by multiplying the area under +*' production with corresponding yields of other land, divided by the timestep length. +*' Wood production from other landis not allowed. + +q35_prod_other(j2).. + vm_prod_natveg(j2,"other","woodfuel") + =e= + sum(ac_sub, v35_hvarea_other(j2,ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"other"))) / m_timestep_length_forestry + ; + +*' Following equations show the harvested area from natural vegetation i.e. primary +*' forests, secondary forests and other land. Important to note here that no wood +*' production should be realized from other land. Harvested area for production +*' purposes can be lower oe equal than land reduction in natural vegetation as +*' not all lost area is (or should be) used for production. + +q35_hvarea_secdforest(j2,ac_sub).. + v35_hvarea_secdforest(j2,ac_sub) + =l= + v35_secdforest_reduction(j2,ac_sub); + +q35_hvarea_primforest(j2).. + v35_hvarea_primforest(j2) + =l= + v35_primforest_reduction(j2); + +q35_hvarea_other(j2,ac_sub).. + v35_hvarea_other(j2,ac_sub) + =l= + v35_other_reduction(j2,ac_sub); + + +*' Harvested secondary forest is still considered secondary forests due to +*' restrictive NPI definitions. Also primary forest harvested will be considered +*' to be secondary forest i.e., harvested primary forest gets reclassified as +*' secondary forest and ends up in the youngest age-class (and follows regrowth) + +q35_secdforest_regeneration(j2).. + sum(ac_est, v35_secdforest(j2,ac_est)) + =g= + sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + + v35_hvarea_primforest(j2) + + p35_land_restoration(j2,"secdforest") + ; + +q35_max_secdforest_regeneration(j2).. + sum(ac_est, v35_secdforest(j2,ac_est)) + + sum(type32, vm_landexpansion_forestry(j2,type32)) + =l= + p35_max_forest_recovery(j2) + ; + +*' Harvested other land is still considered other land + +q35_other_regeneration(j2).. + sum(ac_est, v35_other(j2,ac_est)) + =g= + sum(ac_sub,v35_hvarea_other(j2,ac_sub)) + ; + +*' The following two constraints distribute additions to secdforest and other land +*' over ac_est, which depends on the time step length (e.g. ac0 and ac5 for a 10 year time step). + +q35_secdforest_est(j2,ac_est) .. +v35_secdforest(j2,ac_est) =e= sum(ac_est2, v35_secdforest(j2,ac_est2))/card(ac_est2); + +q35_other_est(j2,ac_est) .. +v35_other(j2,ac_est) =e= sum(ac_est2, v35_other(j2,ac_est2))/card(ac_est2); + diff --git a/modules/35_natveg/dynamic_may24/input.gms b/modules/35_natveg/dynamic_may24/input.gms new file mode 100644 index 0000000000..de5bef3564 --- /dev/null +++ b/modules/35_natveg/dynamic_may24/input.gms @@ -0,0 +1,63 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +$setglobal c35_ad_policy npi +$setglobal c35_aolc_policy npi +$setglobal c35_shock_scenario none + +scalars +s35_hvarea Flag for harvested area (0=zero 1=exognous 2=endogneous) / 0 / +s35_hvarea_secdforest annual secdforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / +s35_hvarea_primforest annual primforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / +s35_hvarea_other annual other land harvest rate for s35_hvarea equals 1 (percent per year) / 0 / +s35_timber_harvest_cost_secdforest Cost for harvesting from secondary forest (USD per ha) / 2000/ +s35_timber_harvest_cost_other Cost for harvesting from other land (USD per ha) / 1500 / +s35_timber_harvest_cost_primforest Cost for harvesting from primary forest (USD per ha) / 3000/ +s35_natveg_harvest_shr Constrains the allowed wood harvest from natural vegetation (1=unconstrained) (1) /1/ +s35_secdf_distribution Flag for secdf initialization (0=all secondary forest in highest age class 1=Equal distribution among all age classes 2=Poulter distribution from MODIS satellite data) (1) / 0 / +s35_forest_damage Damage simulation in forests (0=none 1=shifting agriculture 2= Damage from shifting agriculture is faded out by c35_forest_damage_end 4= f35_forest_shock scenario) / 2 / +s35_forest_damage_end Year of forest damage end (1) / 2050 / +; + +table f35_forest_lost_share(i,driver_source) Share of area damanged by forest fires (1) +$ondelim +$include "./modules/35_natveg/input/f35_forest_lost_share.cs3" +$offdelim +; + +table f35_min_land_stock(t_all,j,pol35,pol_stock35) Avoided deforestation and land protection policies [minimum land stock] (Mha) +$ondelim +$include "./modules/35_natveg/input/npi_ndc_ad_aolc_pol.cs3" +$offdelim +; + +table f35_forest_shock(t_all, shock_scen) Forest carbon shock scenarios (area share affected per year) +$ondelim +$include "./modules/35_natveg/input/f35_forest_shock.csv" +$offdelim +; + +parameter f35_forest_disturbance_share(i) Share of area damanged by forest disturbances (1) +/ +$ondelim +$include "./modules/35_natveg/input/f35_forest_disturbance_share.cs4" +$offdelim +/; + +parameter f35_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) +/ +$ondelim +$include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" +$offdelim +/; + +parameter fm_pot_forest_area(j) Potential forest area (mio. ha) +/ +$ondelim +$include "./modules/35_natveg/input/pot_forest_area.cs3" +$offdelim +/; diff --git a/modules/35_natveg/dynamic_may24/postsolve.gms b/modules/35_natveg/dynamic_may24/postsolve.gms new file mode 100644 index 0000000000..41f427750b --- /dev/null +++ b/modules/35_natveg/dynamic_may24/postsolve.gms @@ -0,0 +1,179 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*secdforest age class calculation +p35_secdforest(t,j,ac) = v35_secdforest.l(j,ac); + +*other land age class calculation +p35_other(t,j,ac) = v35_other.l(j,ac); + +*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### + ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); + ov35_other(t,j,ac,"marginal") = v35_other.m(j,ac); + ov_landdiff_natveg(t,"marginal") = vm_landdiff_natveg.m; + ov35_other_expansion(t,j,"marginal") = v35_other_expansion.m(j); + ov35_other_reduction(t,j,ac,"marginal") = v35_other_reduction.m(j,ac); + ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j); + ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac); + ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j); + ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac); + ov35_hvarea_other(t,j,ac,"marginal") = v35_hvarea_other.m(j,ac); + ov35_hvarea_primforest(t,j,"marginal") = v35_hvarea_primforest.m(j); + ov_prod_natveg(t,j,land_natveg,kforestry,"marginal") = vm_prod_natveg.m(j,land_natveg,kforestry); + ov_cost_hvarea_natveg(t,i,"marginal") = vm_cost_hvarea_natveg.m(i); + oq35_land_secdforest(t,j,"marginal") = q35_land_secdforest.m(j); + oq35_land_other(t,j,"marginal") = q35_land_other.m(j); + oq35_carbon_primforest(t,j,ag_pools,stockType,"marginal") = q35_carbon_primforest.m(j,ag_pools,stockType); + oq35_carbon_secdforest(t,j,ag_pools,stockType,"marginal") = q35_carbon_secdforest.m(j,ag_pools,stockType); + oq35_carbon_other(t,j,ag_pools,stockType,"marginal") = q35_carbon_other.m(j,ag_pools,stockType); + oq35_min_forest(t,j,"marginal") = q35_min_forest.m(j); + oq35_min_other(t,j,"marginal") = q35_min_other.m(j); + oq35_landdiff(t,"marginal") = q35_landdiff.m; + oq35_other_expansion(t,j,"marginal") = q35_other_expansion.m(j); + oq35_other_reduction(t,j,ac,"marginal") = q35_other_reduction.m(j,ac); + oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j); + oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); + oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); + oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.m(j); + oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); + oq35_other_est(t,j,ac,"marginal") = q35_other_est.m(j,ac); + oq35_secdforest_est(t,j,ac,"marginal") = q35_secdforest_est.m(j,ac); + oq35_hvarea_other(t,j,ac,"marginal") = q35_hvarea_other.m(j,ac); + oq35_hvarea_secdforest(t,j,ac,"marginal") = q35_hvarea_secdforest.m(j,ac); + oq35_hvarea_primforest(t,j,"marginal") = q35_hvarea_primforest.m(j); + oq35_prod_secdforest(t,j,"marginal") = q35_prod_secdforest.m(j); + oq35_prod_primforest(t,j,"marginal") = q35_prod_primforest.m(j); + oq35_prod_other(t,j,"marginal") = q35_prod_other.m(j); + oq35_cost_hvarea(t,i,"marginal") = q35_cost_hvarea.m(i); + oq35_bv_primforest(t,j,potnatveg,"marginal") = q35_bv_primforest.m(j,potnatveg); + oq35_bv_secdforest(t,j,potnatveg,"marginal") = q35_bv_secdforest.m(j,potnatveg); + oq35_bv_other(t,j,potnatveg,"marginal") = q35_bv_other.m(j,potnatveg); + oq35_natveg_conservation(t,j,"marginal") = q35_natveg_conservation.m(j); + ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac); + ov35_other(t,j,ac,"level") = v35_other.l(j,ac); + ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l; + ov35_other_expansion(t,j,"level") = v35_other_expansion.l(j); + ov35_other_reduction(t,j,ac,"level") = v35_other_reduction.l(j,ac); + ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j); + ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac); + ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j); + ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac); + ov35_hvarea_other(t,j,ac,"level") = v35_hvarea_other.l(j,ac); + ov35_hvarea_primforest(t,j,"level") = v35_hvarea_primforest.l(j); + ov_prod_natveg(t,j,land_natveg,kforestry,"level") = vm_prod_natveg.l(j,land_natveg,kforestry); + ov_cost_hvarea_natveg(t,i,"level") = vm_cost_hvarea_natveg.l(i); + oq35_land_secdforest(t,j,"level") = q35_land_secdforest.l(j); + oq35_land_other(t,j,"level") = q35_land_other.l(j); + oq35_carbon_primforest(t,j,ag_pools,stockType,"level") = q35_carbon_primforest.l(j,ag_pools,stockType); + oq35_carbon_secdforest(t,j,ag_pools,stockType,"level") = q35_carbon_secdforest.l(j,ag_pools,stockType); + oq35_carbon_other(t,j,ag_pools,stockType,"level") = q35_carbon_other.l(j,ag_pools,stockType); + oq35_min_forest(t,j,"level") = q35_min_forest.l(j); + oq35_min_other(t,j,"level") = q35_min_other.l(j); + oq35_landdiff(t,"level") = q35_landdiff.l; + oq35_other_expansion(t,j,"level") = q35_other_expansion.l(j); + oq35_other_reduction(t,j,ac,"level") = q35_other_reduction.l(j,ac); + oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j); + oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); + oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); + oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.l(j); + oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); + oq35_other_est(t,j,ac,"level") = q35_other_est.l(j,ac); + oq35_secdforest_est(t,j,ac,"level") = q35_secdforest_est.l(j,ac); + oq35_hvarea_other(t,j,ac,"level") = q35_hvarea_other.l(j,ac); + oq35_hvarea_secdforest(t,j,ac,"level") = q35_hvarea_secdforest.l(j,ac); + oq35_hvarea_primforest(t,j,"level") = q35_hvarea_primforest.l(j); + oq35_prod_secdforest(t,j,"level") = q35_prod_secdforest.l(j); + oq35_prod_primforest(t,j,"level") = q35_prod_primforest.l(j); + oq35_prod_other(t,j,"level") = q35_prod_other.l(j); + oq35_cost_hvarea(t,i,"level") = q35_cost_hvarea.l(i); + oq35_bv_primforest(t,j,potnatveg,"level") = q35_bv_primforest.l(j,potnatveg); + oq35_bv_secdforest(t,j,potnatveg,"level") = q35_bv_secdforest.l(j,potnatveg); + oq35_bv_other(t,j,potnatveg,"level") = q35_bv_other.l(j,potnatveg); + oq35_natveg_conservation(t,j,"level") = q35_natveg_conservation.l(j); + ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac); + ov35_other(t,j,ac,"upper") = v35_other.up(j,ac); + ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up; + ov35_other_expansion(t,j,"upper") = v35_other_expansion.up(j); + ov35_other_reduction(t,j,ac,"upper") = v35_other_reduction.up(j,ac); + ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j); + ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac); + ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j); + ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac); + ov35_hvarea_other(t,j,ac,"upper") = v35_hvarea_other.up(j,ac); + ov35_hvarea_primforest(t,j,"upper") = v35_hvarea_primforest.up(j); + ov_prod_natveg(t,j,land_natveg,kforestry,"upper") = vm_prod_natveg.up(j,land_natveg,kforestry); + ov_cost_hvarea_natveg(t,i,"upper") = vm_cost_hvarea_natveg.up(i); + oq35_land_secdforest(t,j,"upper") = q35_land_secdforest.up(j); + oq35_land_other(t,j,"upper") = q35_land_other.up(j); + oq35_carbon_primforest(t,j,ag_pools,stockType,"upper") = q35_carbon_primforest.up(j,ag_pools,stockType); + oq35_carbon_secdforest(t,j,ag_pools,stockType,"upper") = q35_carbon_secdforest.up(j,ag_pools,stockType); + oq35_carbon_other(t,j,ag_pools,stockType,"upper") = q35_carbon_other.up(j,ag_pools,stockType); + oq35_min_forest(t,j,"upper") = q35_min_forest.up(j); + oq35_min_other(t,j,"upper") = q35_min_other.up(j); + oq35_landdiff(t,"upper") = q35_landdiff.up; + oq35_other_expansion(t,j,"upper") = q35_other_expansion.up(j); + oq35_other_reduction(t,j,ac,"upper") = q35_other_reduction.up(j,ac); + oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j); + oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); + oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); + oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.up(j); + oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); + oq35_other_est(t,j,ac,"upper") = q35_other_est.up(j,ac); + oq35_secdforest_est(t,j,ac,"upper") = q35_secdforest_est.up(j,ac); + oq35_hvarea_other(t,j,ac,"upper") = q35_hvarea_other.up(j,ac); + oq35_hvarea_secdforest(t,j,ac,"upper") = q35_hvarea_secdforest.up(j,ac); + oq35_hvarea_primforest(t,j,"upper") = q35_hvarea_primforest.up(j); + oq35_prod_secdforest(t,j,"upper") = q35_prod_secdforest.up(j); + oq35_prod_primforest(t,j,"upper") = q35_prod_primforest.up(j); + oq35_prod_other(t,j,"upper") = q35_prod_other.up(j); + oq35_cost_hvarea(t,i,"upper") = q35_cost_hvarea.up(i); + oq35_bv_primforest(t,j,potnatveg,"upper") = q35_bv_primforest.up(j,potnatveg); + oq35_bv_secdforest(t,j,potnatveg,"upper") = q35_bv_secdforest.up(j,potnatveg); + oq35_bv_other(t,j,potnatveg,"upper") = q35_bv_other.up(j,potnatveg); + oq35_natveg_conservation(t,j,"upper") = q35_natveg_conservation.up(j); + ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac); + ov35_other(t,j,ac,"lower") = v35_other.lo(j,ac); + ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo; + ov35_other_expansion(t,j,"lower") = v35_other_expansion.lo(j); + ov35_other_reduction(t,j,ac,"lower") = v35_other_reduction.lo(j,ac); + ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j); + ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac); + ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j); + ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac); + ov35_hvarea_other(t,j,ac,"lower") = v35_hvarea_other.lo(j,ac); + ov35_hvarea_primforest(t,j,"lower") = v35_hvarea_primforest.lo(j); + ov_prod_natveg(t,j,land_natveg,kforestry,"lower") = vm_prod_natveg.lo(j,land_natveg,kforestry); + ov_cost_hvarea_natveg(t,i,"lower") = vm_cost_hvarea_natveg.lo(i); + oq35_land_secdforest(t,j,"lower") = q35_land_secdforest.lo(j); + oq35_land_other(t,j,"lower") = q35_land_other.lo(j); + oq35_carbon_primforest(t,j,ag_pools,stockType,"lower") = q35_carbon_primforest.lo(j,ag_pools,stockType); + oq35_carbon_secdforest(t,j,ag_pools,stockType,"lower") = q35_carbon_secdforest.lo(j,ag_pools,stockType); + oq35_carbon_other(t,j,ag_pools,stockType,"lower") = q35_carbon_other.lo(j,ag_pools,stockType); + oq35_min_forest(t,j,"lower") = q35_min_forest.lo(j); + oq35_min_other(t,j,"lower") = q35_min_other.lo(j); + oq35_landdiff(t,"lower") = q35_landdiff.lo; + oq35_other_expansion(t,j,"lower") = q35_other_expansion.lo(j); + oq35_other_reduction(t,j,ac,"lower") = q35_other_reduction.lo(j,ac); + oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j); + oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); + oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); + oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.lo(j); + oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); + oq35_other_est(t,j,ac,"lower") = q35_other_est.lo(j,ac); + oq35_secdforest_est(t,j,ac,"lower") = q35_secdforest_est.lo(j,ac); + oq35_hvarea_other(t,j,ac,"lower") = q35_hvarea_other.lo(j,ac); + oq35_hvarea_secdforest(t,j,ac,"lower") = q35_hvarea_secdforest.lo(j,ac); + oq35_hvarea_primforest(t,j,"lower") = q35_hvarea_primforest.lo(j); + oq35_prod_secdforest(t,j,"lower") = q35_prod_secdforest.lo(j); + oq35_prod_primforest(t,j,"lower") = q35_prod_primforest.lo(j); + oq35_prod_other(t,j,"lower") = q35_prod_other.lo(j); + oq35_cost_hvarea(t,i,"lower") = q35_cost_hvarea.lo(i); + oq35_bv_primforest(t,j,potnatveg,"lower") = q35_bv_primforest.lo(j,potnatveg); + oq35_bv_secdforest(t,j,potnatveg,"lower") = q35_bv_secdforest.lo(j,potnatveg); + oq35_bv_other(t,j,potnatveg,"lower") = q35_bv_other.lo(j,potnatveg); + oq35_natveg_conservation(t,j,"lower") = q35_natveg_conservation.lo(j); +*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/35_natveg/dynamic_may24/preloop.gms b/modules/35_natveg/dynamic_may24/preloop.gms new file mode 100644 index 0000000000..3d897377d7 --- /dev/null +++ b/modules/35_natveg/dynamic_may24/preloop.gms @@ -0,0 +1,65 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +** initialize other land +i35_other(j,ac) = 0; +i35_other(j,"acx") = pcm_land(j,"other"); + +** initialize secdforest area depending on switch. +if(s35_secdf_distribution = 0, + i35_secdforest(j,"acx") = pcm_land(j,"secdforest"); +elseif s35_secdf_distribution = 1, +* ac0 is excluded here. Therefore no initial shifting is needed. + i35_secdforest(j,ac)$(not sameas(ac,"ac0")) = pcm_land(j,"secdforest")/(card(ac)-1); +elseif s35_secdf_distribution = 2, +*classes 1, 2, 3 include plantation and are therefore excluded +*As disturbance history (fire) would affect the age structure +*We use the sahre from class 4 to be in class 1,2,3 +*class 15 is primary forest and is therefore excluded + i35_plantedclass_ac(j,ac) = im_plantedclass_ac(j,ac); + i35_plantedclass_ac(j,ac_planted)$(i35_plantedclass_ac(j,ac_planted) > im_plantedclass_ac(j,"ac35")) = im_plantedclass_ac(j,"ac35"); + +* Distribute this area correctly + p35_poulter_dist(j,ac) = 0; + p35_poulter_dist(j,ac) = (i35_plantedclass_ac(j,ac)/sum(ac2,i35_plantedclass_ac(j,ac2)))$(sum(ac2,i35_plantedclass_ac(j,ac2))>0); + i35_secdforest(j,ac)$(not sameas(ac,"ac0")) = pcm_land(j,"secdforest")*p35_poulter_dist(j,ac); +); + +*use residual approach to avoid rounding errors +i35_secdforest(j,"acx") = i35_secdforest(j,"acx") + (pcm_land(j,"secdforest") - sum(ac, i35_secdforest(j,ac))); + +*initialize parameter +p35_other(t,j,ac) = 0; +p35_secdforest(t,j,ac) = 0; + +* initialize forest disturbance losses +p35_disturbance_loss_secdf(t,j,ac) = 0; +p35_disturbance_loss_primf(t,j) = 0; + +* ----------------------------------------- +* Land conservation for climate mitigation +* ----------------------------------------- + +p35_min_forest(t,j) = f35_min_land_stock(t,j,"%c35_ad_policy%","forest"); +p35_min_other(t,j) = f35_min_land_stock(t,j,"%c35_ad_policy%","other"); + + +* ---------------------------------------- +* Calibrate Natural vegetation yields +* ---------------------------------------- + +** Initialize with 0 cvalues +p35_land_start_ac(j,ac,land_natveg) = 0; +** Capture natural forest values (primary forest + secondary forest) +p35_land_start_ac(j,"acx","primforest") = pcm_land(j,"primforest"); +p35_land_start_ac(j,ac,"secdforest") = i35_secdforest(j,ac); + + +* ----------------------------- +* Set forest damage trajectory +* ----------------------------- +m_sigmoid_time_interpol(p35_damage_fader,sm_fix_SSP2,s35_forest_damage_end,0,1); diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms new file mode 100644 index 0000000000..b9146a9aea --- /dev/null +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -0,0 +1,185 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +if((ord(t) = 1), + pc35_secdforest(j,ac) = i35_secdforest(j,ac); + pc35_other(j,ac) = i35_other(j,ac); +else + pc35_secdforest(j,ac) = p35_secdforest(t-1,j,ac); + pc35_other(j,ac) = p35_other(t-1,j,ac); +); + +* ---------------------------------------------------- +* Shift ageclasses due to shifting agriculture fires +* ---------------------------------------------------- + +* first calculate damages +if(s35_forest_damage=1, + p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry; + p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry; + ); + +* shifting cultivation is faded out +if(s35_forest_damage=2, + p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry*(1 - p35_damage_fader(t)); + p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry*(1 - p35_damage_fader(t)); + ); + +if(s35_forest_damage=3, + p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * sum((cell(i,j),combined_loss),f35_forest_lost_share(i,combined_loss))*m_timestep_length_forestry; + p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * sum((cell(i,j),combined_loss),f35_forest_lost_share(i,combined_loss))*m_timestep_length_forestry; + ); + +* generic disturbance scenarios +if(s35_forest_damage=4, + p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * f35_forest_shock(t,"%c35_shock_scenario%") * m_timestep_length; + p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * f35_forest_shock(t,"%c35_shock_scenario%") * m_timestep_length; + ); + +* Distribution of damages correctly +pc35_secdforest(j,ac_est) = pc35_secdforest(j,ac_est) + sum(ac_sub,p35_disturbance_loss_secdf(t,j,ac_sub))/card(ac_est2) + p35_disturbance_loss_primf(t,j)/card(ac_est2); + +pc35_secdforest(j,ac_sub) = pc35_secdforest(j,ac_sub) - p35_disturbance_loss_secdf(t,j,ac_sub); +pcm_land(j,"primforest") = pcm_land(j,"primforest") - p35_disturbance_loss_primf(t,j); +vm_land.l(j,"primforest") = pcm_land(j,"primforest"); + +* Regrowth of natural vegetation (natural succession) is modelled by shifting age-classes according to time step length. +s35_shift = m_timestep_length_forestry/5; +* example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) + p35_other(t,j,ac)$(ord(ac) > s35_shift) = pc35_other(j,ac-s35_shift); +* account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation + p35_other(t,j,"acx") = p35_other(t,j,"acx") + + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_other(j,ac)); + +* Usual shift +* example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) + p35_secdforest(t,j,ac)$(ord(ac) > s35_shift) = pc35_secdforest(j,ac-s35_shift); +* account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation + p35_secdforest(t,j,"acx") = p35_secdforest(t,j,"acx") + + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_secdforest(j,ac)); + +* -------------------------------------- +*Secondary forest recovery +* -------------------------------------- + +* Forest recovery is constrained by the potential forest area in each cluster +p35_max_forest_recovery(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; + +* ------------------------------------- +* Set bounds based on land conservation +* ------------------------------------- + +* Within the optimization, primary forests can only decrease +* (e.g. due to cropland expansion). +* In contrast, other natural land and secdforest can decrease and increase within the optimization. +* For instance, other natural land increases if agricultural land is abandoned. + +* Correct land conservation for damage +pm_land_conservation(t,j,land_natveg,"protect")$(pm_land_conservation(t,j,land_natveg,"protect") > pcm_land(j,land_natveg)) = pcm_land(j,land_natveg); + +** Setting bounds for only allowing s35_natveg_harvest_shr percentage of available forest to be harvested (highest age class) + +* Primary forest + +** Allowing selective logging only after historical period +if (sum(sameas(t_past,t),1) = 1, +vm_land.lo(j,"primforest") = 0; +else +vm_land.lo(j,"primforest") = (1-s35_natveg_harvest_shr) * pcm_land(j,"primforest"); +); +* Primary forest conservation +vm_land.lo(j,"primforest")$(vm_land.lo(j,"primforest") < pm_land_conservation(t,j,"primforest","protect")) = pm_land_conservation(t,j,"primforest","protect"); +vm_land.up(j,"primforest") = pcm_land(j,"primforest"); + +* Secondary forest + +*reset bound +v35_secdforest.lo(j,ac) = 0; +v35_secdforest.up(j,ac) = Inf; + +p35_protection_dist(j,ac_sub) = (pc35_secdforest(j,ac_sub)/sum(ac_sub2,pc35_secdforest(j,ac_sub2)))$(sum(ac_sub2,pc35_secdforest(j,ac_sub2))>0); +if (sum(sameas(t_past,t),1) = 1, +v35_secdforest.lo(j,ac_sub) = pm_land_conservation(t,j,"secdforest","protect") * p35_protection_dist(j,ac_sub); +else +v35_secdforest.lo(j,ac_sub) = max((1-s35_natveg_harvest_shr) * pc35_secdforest(j,ac_sub), pm_land_conservation(t,j,"secdforest","protect") * p35_protection_dist(j,ac_sub)); +); +* upper bound +v35_secdforest.up(j,ac_sub) = pc35_secdforest(j,ac_sub); +m_boundfix(v35_secdforest,(j,ac_sub),l,10e-5); + +* Secondary forest conservation +* protection bound fix +pm_land_conservation(t,j,"secdforest","protect")$(abs(pm_land_conservation(t,j,"secdforest","protect") - sum(ac_sub, pc35_secdforest(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_secdforest(j,ac_sub)); +* set restoration target +p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","restore"); +* Do not restore secdforest in areas where total natural +* land area meets the total natural land conservation target +p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; +* set conservation bound +vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); + +** Other land + +*reset bounds +v35_other.lo(j,ac) = 0; +v35_other.up(j,ac) = Inf; +*set upper bound +v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); +m_boundfix(v35_other,(j,ac_sub),l,10e-5); + +* Other land conservation +* protection bound fix +pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_other(j,ac_sub)); +* set restoration target +p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); +* Do not restore other land in areas where total natural +* land area meets the total natural land conservation target +p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; +* set conservation bound +vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); + +* ------------------------------ +* Calculate carbon density +* ------------------------------ + +* highest carbon density 1st time step to account for reshuffling +p35_carbon_density_secdforest(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); +p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); + +* ------------------ +* NPI/NDC policy +* ------------------ + +p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); +p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); + +** Display +p35_land(t,j,land_natveg,ac) = 0; +p35_land(t,j,"primforest","acx") = pcm_land(j,"primforest"); +p35_land(t,j,"secdforest",ac) = p35_secdforest(t,j,ac); +*p35_land(t,j,"other",ac) = p35_other(t,j,ac): +p35_updated_gs_natfor(t,i) = 0; +p35_updated_gs_natfor(t,i)$(sum((cell(i,j),ac,land_natveg), p35_land(t,j,land_natveg,ac))>0) = (sum((cell(i,j),ac,land_natveg),(pm_timber_yield(t,j,ac,land_natveg) / sm_wood_density) * p35_land(t,j,land_natveg,ac))/ sum((cell(i,j),ac,land_natveg), p35_land(t,j,land_natveg,ac))); + +** Youngest age classes are not allowed to be harvested +v35_hvarea_secdforest.fx(j,ac_est) = 0; +v35_hvarea_other.fx(j,ac_est) = 0; +v35_secdforest_reduction.fx(j,ac_est) = 0; +v35_other_reduction.fx(j,ac_est) = 0; + +vm_prod_natveg.fx(j,"other","wood") = 0; + +if(s35_hvarea = 0, + v35_hvarea_secdforest.fx(j,ac_sub) = 0; + v35_hvarea_primforest.fx(j) = 0; + v35_hvarea_other.fx(j,ac_sub) = 0; +elseif s35_hvarea = 1, + v35_hvarea_secdforest.fx(j,ac_sub) = (v35_secdforest.l(j,ac_sub) - v35_secdforest.lo(j,ac_sub))*s35_hvarea_secdforest*m_timestep_length_forestry; + v35_hvarea_primforest.fx(j) = (vm_land.l(j,"primforest") - vm_land.lo(j,"primforest"))*s35_hvarea_primforest*m_timestep_length_forestry; + v35_hvarea_other.fx(j,ac_sub) = (v35_other.l(j,ac_sub) - v35_other.lo(j,ac_sub))*s35_hvarea_other*m_timestep_length_forestry; +); diff --git a/modules/35_natveg/dynamic_may24/realization.gms b/modules/35_natveg/dynamic_may24/realization.gms new file mode 100644 index 0000000000..af25d81fa5 --- /dev/null +++ b/modules/35_natveg/dynamic_may24/realization.gms @@ -0,0 +1,44 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +*' @description In the dynamic_may24 realization, land and carbon stock dynamics +*' of natural vegetation are modeled endogenously. +*' The initial spatial distribution of the sub-land-types primary forest, +*' secondary forest and other natural land is based on the +*' LUH2 data set [@hurtt2018luh2]. +*' This realization also includes national policies implemented (NPI) and nationally +*' determined contributions to the Paris agreement (NDC) with regard to forest and other +*' land protection. The NPI/NDC polices ramp up until 2030 and are assumed constant +*' thereafter. NPI/NDC land conservation polices are applied on forest and other land, +*' depending on individual country reports. The NPI/NDC policies are treated as minimum +*' constraints and therefore are non-additive, if the land protection targets as provided by +*' the module `22_land_conservation` and the interface `pm_land_conservation` are larger. +*' Additionally, this module includes forest damage and provides the ability to +*' harvest natural vegetation for timber. Both wood and woodfuel can be produceed +*' from primary and secondary forest but other land is only allowed to be harvested +*' for woodfuel. +*' @stop + +*' +*' @limitations Initialization of both primary and secondary forest in highest +*' age class or equal distrivution of such areas in all age classes. Data exists +*' on a more emperically obtained distribution in different age classes based +*' on satellite data but this results is highly negative land-use change emissions. +*' Inclusion of this data in MAgPIE remains work in progess and is not available for release yet. +*' Additionally, in this module realization, harvested secondary forest stays +*' secondary forest and harvested primary forest is reclassified as secondary forest. + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "sets" $include "./modules/35_natveg/dynamic_may24/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/35_natveg/dynamic_may24/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/35_natveg/dynamic_may24/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/35_natveg/dynamic_may24/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/35_natveg/dynamic_may24/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/35_natveg/dynamic_may24/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/35_natveg/dynamic_may24/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/35_natveg/dynamic_may24/postsolve.gms" +*######################## R SECTION END (PHASES) ############################### diff --git a/modules/35_natveg/dynamic_may24/scaling.gms b/modules/35_natveg/dynamic_may24/scaling.gms new file mode 100644 index 0000000000..c4a52d9d82 --- /dev/null +++ b/modules/35_natveg/dynamic_may24/scaling.gms @@ -0,0 +1,8 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +vm_cost_hvarea_natveg.scale(i)$(s35_hvarea = 1 OR s35_hvarea = 2) = 10e4; diff --git a/modules/35_natveg/dynamic_may24/sets.gms b/modules/35_natveg/dynamic_may24/sets.gms new file mode 100644 index 0000000000..0ad78e215c --- /dev/null +++ b/modules/35_natveg/dynamic_may24/sets.gms @@ -0,0 +1,28 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +sets + + driver_source Source of deforestation drivers + / overall, deforestation, shifting_agriculture, + forestry, wildfire, urbanization / + + combined_loss(driver_source) Combined loss from fire plus agriculture + / shifting_agriculture,wildfire / + + pol35 Land protection policy + / none, npi, ndc / + + pol_stock35 Land types for land protection policies + / forest, other / + + + shock_scen Scenario name of forest carbon shock + / none, 002lin2030,004lin2030,008lin2030,016lin2030 + / + +; diff --git a/modules/35_natveg/module.gms b/modules/35_natveg/module.gms index 9fec0983aa..6ebab7afad 100644 --- a/modules/35_natveg/module.gms +++ b/modules/35_natveg/module.gms @@ -18,4 +18,5 @@ *###################### R SECTION START (MODULETYPES) ########################## $Ifi "%natveg%" == "dynamic_feb21" $include "./modules/35_natveg/dynamic_feb21/realization.gms" +$Ifi "%natveg%" == "dynamic_may24" $include "./modules/35_natveg/dynamic_may24/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ From 3d69a6b153d1a6b9b527bba915ddc4ca0e995a62 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 25 Apr 2024 16:48:48 +0200 Subject: [PATCH 115/259] new forest recovery based on potential forest area --- modules/35_natveg/dynamic_feb21/not_used.txt | 2 ++ modules/35_natveg/dynamic_may24/input.gms | 2 +- modules/35_natveg/dynamic_may24/presolve.gms | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 modules/35_natveg/dynamic_feb21/not_used.txt diff --git a/modules/35_natveg/dynamic_feb21/not_used.txt b/modules/35_natveg/dynamic_feb21/not_used.txt new file mode 100644 index 0000000000..810653acf1 --- /dev/null +++ b/modules/35_natveg/dynamic_feb21/not_used.txt @@ -0,0 +1,2 @@ +name,type,reason +vm_landexpansion_forestry, input, not needed diff --git a/modules/35_natveg/dynamic_may24/input.gms b/modules/35_natveg/dynamic_may24/input.gms index de5bef3564..0567f0ed39 100644 --- a/modules/35_natveg/dynamic_may24/input.gms +++ b/modules/35_natveg/dynamic_may24/input.gms @@ -55,7 +55,7 @@ $include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" $offdelim /; -parameter fm_pot_forest_area(j) Potential forest area (mio. ha) +parameter f35_pot_forest_area(j) Potential forest area (mio. ha) / $ondelim $include "./modules/35_natveg/input/pot_forest_area.cs3" diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms index b9146a9aea..d501c93da8 100644 --- a/modules/35_natveg/dynamic_may24/presolve.gms +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -67,7 +67,7 @@ s35_shift = m_timestep_length_forestry/5; * -------------------------------------- * Forest recovery is constrained by the potential forest area in each cluster -p35_max_forest_recovery(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +p35_max_forest_recovery(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; * ------------------------------------- From 02d5cf53a06cf6daaa881ef931cfe29d59feeb1f Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 25 Apr 2024 21:24:42 +0200 Subject: [PATCH 116/259] adjusted p35_forest_min --- modules/35_natveg/dynamic_may24/presolve.gms | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms index d501c93da8..f3b813ec94 100644 --- a/modules/35_natveg/dynamic_may24/presolve.gms +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -63,7 +63,7 @@ s35_shift = m_timestep_length_forestry/5; + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_secdforest(j,ac)); * -------------------------------------- -*Secondary forest recovery +* Secondary forest recovery * -------------------------------------- * Forest recovery is constrained by the potential forest area in each cluster @@ -156,6 +156,7 @@ p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools * ------------------ p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); +p35_min_forest(t,j)$(p35_min_forest(t,j) > f35_pot_forest_area(j)) = f35_pot_forest_area(j); p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); ** Display From 664d69a999f5dfb791765cc0eb67f55e46d8fc69 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 26 Apr 2024 09:37:18 +0200 Subject: [PATCH 117/259] set input vector to same version as Patricks PR --- config/default.cfg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index da7c361c64..6daba02e79 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "rev4.107_h12_magpie.tgz", - cellular = "rev4.107_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.107_h12_validation.tgz", +cfg$input <- c(regional = "rev4.106_h12_magpie.tgz", + cellular = "rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.106_h12_validation.tgz", additional = "additional_data_rev4.48.tgz", calibration = "calibration_H12_26Mar24.tgz") From b4dcbb758dbfa29a199df4dc6c06b03c6098df06 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 26 Apr 2024 18:01:58 +0200 Subject: [PATCH 118/259] bugfixes in EAT project start scripts --- scripts/start/projects/project_EAT2p0.R | 73 +++++++++++++------ .../start/projects/project_EAT2p0_DeepDive.R | 46 ++++++------ 2 files changed, 75 insertions(+), 44 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0.R b/scripts/start/projects/project_EAT2p0.R index 901aaa42d3..674b1c3c57 100644 --- a/scripts/start/projects/project_EAT2p0.R +++ b/scripts/start/projects/project_EAT2p0.R @@ -129,9 +129,6 @@ waste <- function(cfg) { # where miti is active. # Reference: Humpenöder, F., Popp, A., Merfort, L., Luderer, G., Weindl, I., Bodirsky, B., Stevanović, M., Klein, D., Rodrigues, R., Bauer, N., Dietrich, J., Lotze-Campen, H., & Rockström, J. (2023). Data repository - Dietary shifts increase the feasibility of 1.5°C pathways (Version 1) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.8328217 miti <- function(cfg) { - # NDCs - cfg <- setScenario(cfg, c("SSP2", "NDC")) - # Mitigation: consistent with 1.5C considering diet change cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive/remind/output/C_SSP2EU-DSPkB500-noDS-rem-5/REMIND_generic_C_SSP2EU-DSPkB500-noDS-rem-5.mif" cfg$gms$c56_pollutant_prices <- "coupling" @@ -141,15 +138,6 @@ miti <- function(cfg) { return(cfg) } -### NoCC component ## -# No climate change impacts -noCC <- function(cfg) { - # deactivate climate change impacts - cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI")) - - return(cfg) -} - ### RCP 2.6 ### # Decomposition Scenario. Apply lower climate impacts based on RCP 2.6 to BAU using GFDL climate model. rcp26 <- function(cfg) { @@ -165,6 +153,9 @@ rcp26 <- function(cfg) { # Business as usual scenario based on SSP2 # with a higher climate impact reflected by RCP 7.0 cfg$title <- "BAU" +# standard setting +cfg <- setScenario(cfg, c("cc", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -172,6 +163,9 @@ start_run(cfg, codeCheck = FALSE) # Decomposition scenario. Adds EL2.0 Diet to BAU: # Globally achieves EL2 diet by 2050 # To Do: Check implemention! cfg$title <- "BAU_DIET" +# standard setting +cfg <- setScenario(cfg, c("cc", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -179,6 +173,9 @@ start_run(cfg, codeCheck = FALSE) # BAU_PROD # # Decomposition scenario adds high productivity to BAU cfg$title <- "BAU_PROD" +# standard setting +cfg <- setScenario(cfg, c("cc", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) cfg <- prod(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -186,6 +183,9 @@ start_run(cfg, codeCheck = FALSE) # BAU_WAST # # Decomposition scenario. Adds a reduction (halving) of food loss and waste cfg$title <- "BAU_WAST" +# standard setting +cfg <- setScenario(cfg, c("cc", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -193,6 +193,9 @@ start_run(cfg, codeCheck = FALSE) # BAU_RCP26 # # Decomposition Scenario. Apply lower climate impacts based on RCP 2.6 to BAU cfg$title <- "BAU_RCP26" +# standard setting +cfg <- setScenario(cfg, c("cc", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) cfg <- rcp26(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -200,20 +203,28 @@ start_run(cfg, codeCheck = FALSE) # BAU_NoCC # # Decomposition scenario. Remove climate impacts (NoCC) from BAU to isolate climate effects cfg$title <- "BAU_NoCC" +# standard setting, but without CC +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) -cfg <- noCC(cfg = cfg) start_run(cfg, codeCheck = FALSE) # BAU_MITI # # Decomposition Scenario. Adds mitigation and land-use policies consistent with 1.5C by 2050 to BAU cfg$title <- "BAU_MITI" -cfg <- bau(cfg = cfg) +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings cfg <- miti(cfg = cfg) +cfg <- bau(cfg = cfg) start_run(cfg, codeCheck = FALSE) # EL2 # # Full EAT-Lancet Scenario (diet, productivity, FLW) without mitigation and higher climate impacts based on RCP 7.0 cfg$title <- "EL2" +# standard setting +cfg <- setScenario(cfg, c("cc", "SSP2", "NPI")) +# scenario settings cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) @@ -223,68 +234,88 @@ start_run(cfg, codeCheck = FALSE) # ELM # # Full EAT-Lancet scenario (diet, productivity, FLW) with mitigation policies consistent with 1.5C. Climate based on a lower climate impacts with RCP 2.6 cfg$title <- "ELM" +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings +cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) -cfg <- miti(cfg = cfg) cfg <- rcp26(cfg = cfg) start_run(cfg, codeCheck = FALSE) # ELM_Diet # # Decomposition Scenario. Removes Diet from ELM cfg$title <- "ELM_DIET" +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings +cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) -cfg <- miti(cfg = cfg) cfg <- rcp26(cfg = cfg) start_run(cfg, codeCheck = FALSE) # ELM_PROD # # Decomposition Scenario. Removed productivity trend from ELM cfg$title <- "ELM_PROD" +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings +cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- waste(cfg = cfg) -cfg <- miti(cfg = cfg) cfg <- rcp26(cfg = cfg) start_run(cfg, codeCheck = FALSE) # ELM_WAST # # Decomposition Scenario. Removes FLW from ELM cfg$title <- "ELM_WAST" +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings +cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) -cfg <- miti(cfg = cfg) cfg <- rcp26(cfg = cfg) start_run(cfg, codeCheck = FALSE) # ELM_RCP70 # # Decomposition Scenario. Applies RCP 7.0 climate impacts to ELM cfg$title <- "ELM_RCP70" +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings +cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) -cfg <- miti(cfg = cfg) start_run(cfg, codeCheck = FALSE) # ELM_NoCC # # Decomposition Scenario. Removes climate impacts (NoCC) from ELM cfg$title <- "ELM_NoCC" +# standard setting, but with NDC activated (for miti) and without CC +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC")) +# scenario settings +cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) -cfg <- miti(cfg = cfg) -cfg <- noCC(cfg = cfg) start_run(cfg, codeCheck = FALSE) # ELM_MITI # # Decomposition Scenario. Removes climate mitigation and LUC policies from ELM cfg$title <- "ELM_MITI" +# standard setting, but with NDC activated (for miti) +cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) +# scenario settings cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index bebf4dae73..0905c38a40 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -125,24 +125,19 @@ waste <- function(cfg) { # We use a GHG pricing pathway based on a peak budget of 500 with overshoot # starting from 2020 and diet shift. miti <- function(cfg) { - # NDCs - cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC")) # Mitigation: consistent with 1.5C considering Diet change cfg$gms$c56_pollutant_prices <- "coupling" cfg$gms$c60_2ndgen_biodem <- "coupling" - cfg$gms$c56_emis_policy <- "ecoSysProtAll" + cfg$gms$c56_emis_policy <- "ecoSysProtAll" return(cfg) } # Bioenergy demand only. No carbon price on land included. bioenergy <- function(cfg) { - # NDCs - cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC")) - # No ghg pricing in land system - # Bioenergy demand from coupled REMIND-MAgPIE run where 1.5 is reached with ghg prices on land and considering diet shift + # Mitigation: only Bioenergy demand from coupled REMIND-MAgPIE run where 1.5 is reached with ghg prices on land and considering diet shift cfg$gms$c60_2ndgen_biodem <- "coupling" return(cfg) @@ -150,24 +145,20 @@ bioenergy <- function(cfg) { # CO2 from land use change is priced. priceCO2 <- function(cfg) { - # NDCs - cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC")) - # Mitigation: consistent with 1.5C considering Diet change + # Mitigation: only price land CO2 cfg$gms$c56_pollutant_prices <- "coupling" - cfg$gms$c56_emis_policy <- "ecoSysProtAll" + cfg$gms$c56_emis_policy <- "ecoSysProtAll" return(cfg) } # Pricing of all CH4 and N2O emissions except for peatland priceNonCO2 <- function(cfg) { - # NDCs - cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC")) - # Mitigation: consistent with 1.5C considering Diet change + # Mitigation: only CH4 and N2O price cfg$gms$c56_pollutant_prices <- "coupling" - cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" + cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" return(cfg) } @@ -204,7 +195,7 @@ start_run(cfg, codeCheck = FALSE) cfg$title <- "BAU_Bioenergy" cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- bioenergy(cfg = cfg) +cfg <- bioenergy(cfg = cfg) # NDC or not? start_run(cfg, codeCheck = FALSE) # BAU + pricing of CO2 in land sector # @@ -226,18 +217,22 @@ start_run(cfg, codeCheck = FALSE) # MITI_Diet (mitigation - PHD) # # All production-side land-based mitigation measures, but no demand-side mitigation (diet change) cfg$title <- "MITI_Diet" +# standard setting, but with NDC for miti cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings cfg <- bau(cfg = cfg) -# Mititgation +# Mitigation cfg <- miti(cfg = cfg) start_run(cfg, codeCheck = FALSE) # MITI_Bioenergy (mitigation - bioenergy) # # CO2 and non-CO2 pricing and demand-side mitigation (diet change), but no bioenergy demand from REMIND cfg$title <- "MITI_Bioenergy" +# standard setting, but with NDC for miti cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings cfg <- bau(cfg = cfg) -# Mititgation +# Mitigation cfg <- miti(cfg = cfg) cfg$gms$c60_2ndgen_biodem <- "none" # PHD @@ -249,9 +244,11 @@ start_run(cfg, codeCheck = FALSE) # MITI_CO2 (mitigation - CO2) # # non-CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no CO2 pricing in land-system cfg$title <- "MITI_CO2" +# standard setting, but with NDC for miti cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings cfg <- bau(cfg = cfg) -# Mititgation +# Mitigation cfg <- miti(cfg = cfg) cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" # PHD @@ -263,9 +260,11 @@ start_run(cfg, codeCheck = FALSE) # MITI_nonCO2 (mitigation - non-CO2) # # CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no non-CO2 pricing in land-system cfg$title <- "MITI_nonCO2" +# standard setting, but with NDC for miti cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings cfg <- bau(cfg = cfg) -# Mititgation +# Mitigation cfg <- miti(cfg = cfg) cfg$gms$c56_emis_policy <- "ecoSysProtAll" # PHD @@ -274,15 +273,16 @@ cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) - # MITI_Full # # All production-side land-based mitigation measures and demand-side mitigation (diet change) cfg$title <- "MITI_Full" +# standard setting, but with NDC for miti cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings cfg <- bau(cfg = cfg) -# Mititgation +# Mitigation (CO2, non-CO2, bioenergy) cfg <- miti(cfg = cfg) -# PHD +# PHD (diet, prod, waste) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) From a4c48c4d3ff2cf9286b8be6d5ad1cbe392582543 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 26 Apr 2024 18:03:25 +0200 Subject: [PATCH 119/259] remove unneeded comment from start script --- scripts/start/projects/project_EAT2p0_DeepDive.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 0905c38a40..26129cfaea 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -195,7 +195,7 @@ start_run(cfg, codeCheck = FALSE) cfg$title <- "BAU_Bioenergy" cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- bioenergy(cfg = cfg) # NDC or not? +cfg <- bioenergy(cfg = cfg) start_run(cfg, codeCheck = FALSE) # BAU + pricing of CO2 in land sector # From e8fd179962927f1b804f8cf1fa35ff6ceba1c40f Mon Sep 17 00:00:00 2001 From: Felicitas Date: Mon, 29 Apr 2024 15:23:23 +0200 Subject: [PATCH 120/259] bugfixes in EL2 start script for Deep Dive --- .../start/projects/project_EAT2p0_DeepDive.R | 113 ++++++++++-------- 1 file changed, 62 insertions(+), 51 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 26129cfaea..9346c4af5d 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -28,15 +28,17 @@ cfg$force_download <- TRUE # Special outputs required for Deep Dive cfg$qos <- "standby_maxMem_dayMax" -cfg$output <- c("output_check", - "extra/highres", - "extra/disaggregation", - "projects/FSEC_nitrogenPollution", - "projects/FSEC_water", - "agmip_report", - "runBlackmagicc", - # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) - "rds_report") +cfg$output <- c( + "output_check", + "extra/highres", + "extra/disaggregation", + "projects/FSEC_nitrogenPollution", + "projects/FSEC_water", + "agmip_report", + "runBlackmagicc", + # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) + "rds_report" +) ####################### # SCENARIO DEFINITION # @@ -56,26 +58,25 @@ cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # RCP/GCM: 7p0 shocks on crops, livestock, labor # Trade: BAU bau <- function(cfg) { - ### Components for Decomposition ### # Diets: exogenous EATLancet diet - cfg$gms$s15_exo_diet <- 0 # default + cfg$gms$s15_exo_diet <- 0 # default cfg$gms$c15_kcal_scen <- "healthy_BMI" # default (but not active b/c of s15_exo_diet = 0) - cfg$gms$c15_EAT_scen <- "FLX" # default (but not active b/c of s15_exo_diet = 0) + cfg$gms$c15_EAT_scen <- "FLX" # default (but not active b/c of s15_exo_diet = 0) # Waste: half food waste - cfg$gms$s15_exo_waste <- 0 # default - cfg$gms$s15_waste_scen <- 1.2 # default (but not active b/c of s15_exo_waste = 0) + cfg$gms$s15_exo_waste <- 0 # default + cfg$gms$s15_waste_scen <- 1.2 # default (but not active b/c of s15_exo_waste = 0) # Default interest rate (for default productivity) - cfg$gms$s12_interest_lic <- 0.1 # default - cfg$gms$s12_interest_hic <- 0.04 # default + cfg$gms$s12_interest_lic <- 0.1 # default + cfg$gms$s12_interest_hic <- 0.04 # default # Default livestock productivity - cfg$gms$c70_feed_scen <- "ssp2" # default - # Mitigation: no mitigation beyond NDC (NDC set in setScenario) - cfg$gms$c56_emis_policy <- "none" - cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive/remind/output/C_SSP2EU-DSPkB500-noDS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB500-noDS_betax-rem-5.mif" - cfg$gms$c56_pollutant_prices <- "none" - cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive/remind/output/C_SSP2EU-DSPkB500-noDS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB500-noDS_betax-rem-5.mif" - cfg$gms$c60_2ndgen_biodem <- "none" + cfg$gms$c70_feed_scen <- "ssp2" # default + # Mitigation: no mitigation beyond NPi + cfg$gms$c56_emis_policy <- "none" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi_nonSus-rem-5/REMIND_generic_C_SSP2EU-Npi_nonSus-rem-5.mif" + cfg$gms$c56_pollutant_prices <- "coupling" + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi_nonSus-rem-5/REMIND_generic_C_SSP2EU-Npi_nonSus-rem-5.mif" + cfg$gms$c60_2ndgen_biodem <- "coupling" ### Deactivate certain sustainability standard settings # bioenergy plantations can be irrigated @@ -84,16 +85,16 @@ bau <- function(cfg) { cfg$gms$s32_aff_plantation <- 1 # Setting REMIND scenario for blackmagicc - cfg$magicc_emis_scen <- "SSP2EU-DSPkB500-DS_betax" - + cfg$magicc_emis_scen <- "SSP2EU-DSPkB650-DS_betax" + return(cfg) } ### Diet component ## # Globally achieves EL2 diet by 2050 diet <- function(cfg) { - cfg$gms$s15_exo_diet <- 3 - + cfg$gms$s15_exo_diet <- 3 + return(cfg) } @@ -114,7 +115,7 @@ prod <- function(cfg) { # Reduction (halving) of food loss and waste waste <- function(cfg) { # Waste: half food waste - cfg$gms$s15_exo_waste <- 1 + cfg$gms$s15_exo_waste <- 1 cfg$gms$s15_waste_scen <- 1.2 return(cfg) } @@ -125,40 +126,42 @@ waste <- function(cfg) { # We use a GHG pricing pathway based on a peak budget of 500 with overshoot # starting from 2020 and diet shift. miti <- function(cfg) { - # Mitigation: consistent with 1.5C considering Diet change + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" cfg$gms$c56_pollutant_prices <- "coupling" - cfg$gms$c60_2ndgen_biodem <- "coupling" - cfg$gms$c56_emis_policy <- "ecoSysProtAll" + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$gms$c60_2ndgen_biodem <- "coupling" + # ecoSysProtAll: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 and N2O emis), + cfg$gms$c56_emis_policy <- "ecoSysProtAll" return(cfg) } # Bioenergy demand only. No carbon price on land included. bioenergy <- function(cfg) { - # Mitigation: only Bioenergy demand from coupled REMIND-MAgPIE run where 1.5 is reached with ghg prices on land and considering diet shift - cfg$gms$c60_2ndgen_biodem <- "coupling" + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$gms$c60_2ndgen_biodem <- "coupling" return(cfg) } # CO2 from land use change is priced. priceCO2 <- function(cfg) { - # Mitigation: only price land CO2 cfg$gms$c56_pollutant_prices <- "coupling" - cfg$gms$c56_emis_policy <- "ecoSysProtAll" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" #### double-check Florian return(cfg) } # Pricing of all CH4 and N2O emissions except for peatland priceNonCO2 <- function(cfg) { - # Mitigation: only CH4 and N2O price cfg$gms$c56_pollutant_prices <- "coupling" - cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$gms$c56_emis_policy <- "ecoSysProtOff" ### double-check Florian return(cfg) } @@ -170,20 +173,25 @@ priceNonCO2 <- function(cfg) { # BAU # # Business as usual scenario based on SSP2 cfg$title <- "BAU_NPi" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) cfg <- bau(cfg = cfg) start_run(cfg, codeCheck = FALSE) cfg$title <- "BAU_NDC" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) cfg <- bau(cfg = cfg) +# set path to bioenergy and prices to NDC run +cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC_nonSus-rem-5/REMIND_generic_C_SSP2EU-NDC_nonSus-rem-5.mif" +cfg$gms$c56_pollutant_prices <- "coupling" +cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC_nonSus-rem-5/REMIND_generic_C_SSP2EU-NDC_nonSus-rem-5.mif" +cfg$gms$c60_2ndgen_biodem <- "coupling" start_run(cfg, codeCheck = FALSE) # BAU + EL2-Diet # # Decomposition scenario. # Globally achieves EL2 (Diet+Waste+Prod) by 2050 cfg$title <- "BAU_Diet" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) @@ -193,7 +201,7 @@ start_run(cfg, codeCheck = FALSE) # BAU + Bioenergy # # Decomposition Scenario. Adds bioenergy demand from coupled run with land-use policies consistent with 1.5C by 2050 to BAU cfg$title <- "BAU_Bioenergy" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) cfg <- bau(cfg = cfg) cfg <- bioenergy(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -201,7 +209,7 @@ start_run(cfg, codeCheck = FALSE) # BAU + pricing of CO2 in land sector # # Decomposition Scenario. Adds CO2 pricing on land-use change emissions with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU cfg$title <- "BAU_CO2" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) cfg <- bau(cfg = cfg) cfg <- priceCO2(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -209,7 +217,7 @@ start_run(cfg, codeCheck = FALSE) # BAU + NonCO2 pricing in land sector # # Decomposition Scenario. Adds non-CO2 pricing with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU cfg$title <- "BAU_NonCO2" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) cfg <- bau(cfg = cfg) cfg <- priceNonCO2(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -218,7 +226,7 @@ start_run(cfg, codeCheck = FALSE) # All production-side land-based mitigation measures, but no demand-side mitigation (diet change) cfg$title <- "MITI_Diet" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation @@ -229,12 +237,13 @@ start_run(cfg, codeCheck = FALSE) # CO2 and non-CO2 pricing and demand-side mitigation (diet change), but no bioenergy demand from REMIND cfg$title <- "MITI_Bioenergy" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation cfg <- miti(cfg = cfg) -cfg$gms$c60_2ndgen_biodem <- "none" +cfg$gms$c60_2ndgen_biodem <- "coupling" +cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi_nonSus-rem-5/REMIND_generic_C_SSP2EU-Npi_nonSus-rem-5.mif" # PHD cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) @@ -245,12 +254,13 @@ start_run(cfg, codeCheck = FALSE) # non-CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no CO2 pricing in land-system cfg$title <- "MITI_CO2" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation cfg <- miti(cfg = cfg) -cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" +# ecoSysProtOff: (All CH4 and N2O emis except peatland), +cfg$gms$c56_emis_policy <- "ecoSysProtOff" # PHD cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) @@ -261,12 +271,13 @@ start_run(cfg, codeCheck = FALSE) # CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no non-CO2 pricing in land-system cfg$title <- "MITI_nonCO2" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation cfg <- miti(cfg = cfg) -cfg$gms$c56_emis_policy <- "ecoSysProtAll" +# ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) +cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" # PHD cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) @@ -277,7 +288,7 @@ start_run(cfg, codeCheck = FALSE) # All production-side land-based mitigation measures and demand-side mitigation (diet change) cfg$title <- "MITI_Full" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) From dc127ed8e5c8e2ef1ba304683f148104656aed2a Mon Sep 17 00:00:00 2001 From: Felicitas Date: Mon, 29 Apr 2024 16:05:41 +0200 Subject: [PATCH 121/259] bugfix in project_EAT2p0 start script related to ordering of decomposition scenarios --- scripts/start/projects/project_EAT2p0.R | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0.R b/scripts/start/projects/project_EAT2p0.R index 674b1c3c57..60b4b4e015 100644 --- a/scripts/start/projects/project_EAT2p0.R +++ b/scripts/start/projects/project_EAT2p0.R @@ -215,8 +215,8 @@ cfg$title <- "BAU_MITI" # standard setting, but with NDC activated (for miti) cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) start_run(cfg, codeCheck = FALSE) # EL2 # @@ -237,8 +237,8 @@ cfg$title <- "ELM" # standard setting, but with NDC activated (for miti) cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) @@ -251,8 +251,8 @@ cfg$title <- "ELM_DIET" # standard setting, but with NDC activated (for miti) cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) cfg <- rcp26(cfg = cfg) @@ -264,8 +264,8 @@ cfg$title <- "ELM_PROD" # standard setting, but with NDC activated (for miti) cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- waste(cfg = cfg) cfg <- rcp26(cfg = cfg) @@ -277,8 +277,8 @@ cfg$title <- "ELM_WAST" # standard setting, but with NDC activated (for miti) cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- rcp26(cfg = cfg) @@ -290,8 +290,8 @@ cfg$title <- "ELM_RCP70" # standard setting, but with NDC activated (for miti) cfg <- setScenario(cfg, c("cc", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) @@ -303,8 +303,8 @@ cfg$title <- "ELM_NoCC" # standard setting, but with NDC activated (for miti) and without CC cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC")) # scenario settings -cfg <- miti(cfg = cfg) cfg <- bau(cfg = cfg) +cfg <- miti(cfg = cfg) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) From 364f7abafbe960b58eca3165eee391e1d2ae5a42 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 29 Apr 2024 20:04:25 +0200 Subject: [PATCH 122/259] max forest restoration fixes --- modules/35_natveg/dynamic_may24/declarations.gms | 5 +++-- modules/35_natveg/dynamic_may24/equations.gms | 6 ++++-- modules/35_natveg/dynamic_may24/presolve.gms | 10 ++++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/modules/35_natveg/dynamic_may24/declarations.gms b/modules/35_natveg/dynamic_may24/declarations.gms index ec3dad2e85..3966e4db63 100644 --- a/modules/35_natveg/dynamic_may24/declarations.gms +++ b/modules/35_natveg/dynamic_may24/declarations.gms @@ -19,7 +19,7 @@ parameters p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) - p35_max_forest_recovery(j) Forest recovery potential (mio. ha) + p35_max_forest_recovery(j) Forest recovery potential (mio. ha) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) @@ -31,6 +31,7 @@ parameters p35_land_start_ac(j,ac,land_natveg) Initial Natural vegetation area (mio. ha) p35_protection_dist(j,ac) Distribution of secondary forest protection (1) p35_land_restoration(j,land_natveg) Actual secondary forest and other land restoration area (mio. ha) + p35_restoration_shift(j) Restoration of other land instead of secdforest (mio. ha) ; equations @@ -48,7 +49,7 @@ equations q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) q35_secdforest_regeneration(j) Secondary forest remains secondary forest (mio. ha) - q35_max_secdforest_regeneration(j) Secondary (mio. ha) + q35_max_secdforest_regeneration(j) Maximum forest regeneration (mio. ha) q35_other_regeneration(j) Other land remains other land (mio. ha) q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) diff --git a/modules/35_natveg/dynamic_may24/equations.gms b/modules/35_natveg/dynamic_may24/equations.gms index 72c3c71047..a863a9c36c 100644 --- a/modules/35_natveg/dynamic_may24/equations.gms +++ b/modules/35_natveg/dynamic_may24/equations.gms @@ -185,9 +185,11 @@ q35_secdforest_regeneration(j2).. q35_max_secdforest_regeneration(j2).. sum(ac_est, v35_secdforest(j2,ac_est)) - + sum(type32, vm_landexpansion_forestry(j2,type32)) + + sum(type32, vm_landexpansion_forestry(j2,type32)) =l= - p35_max_forest_recovery(j2) + + sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + + v35_hvarea_primforest(j2) + + p35_max_forest_recovery(j2) ; *' Harvested other land is still considered other land diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms index f3b813ec94..3d63213dee 100644 --- a/modules/35_natveg/dynamic_may24/presolve.gms +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -120,6 +120,13 @@ p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","re * Do not restore secdforest in areas where total natural * land area meets the total natural land conservation target p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; + + +p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); +p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0 +p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); + + * set conservation bound vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); @@ -136,7 +143,7 @@ m_boundfix(v35_other,(j,ac_sub),l,10e-5); * protection bound fix pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_other(j,ac_sub)); * set restoration target -p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); +p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); * Do not restore other land in areas where total natural * land area meets the total natural land conservation target p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; @@ -156,7 +163,6 @@ p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools * ------------------ p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); -p35_min_forest(t,j)$(p35_min_forest(t,j) > f35_pot_forest_area(j)) = f35_pot_forest_area(j); p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); ** Display From 952c15cd2462ad733153d54c7ab225e22e329cb1 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 29 Apr 2024 20:25:05 +0200 Subject: [PATCH 123/259] bugfix --- modules/35_natveg/dynamic_may24/presolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms index 3d63213dee..c91b0f057c 100644 --- a/modules/35_natveg/dynamic_may24/presolve.gms +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -123,7 +123,7 @@ p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); -p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0 +p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); From 3514353fc80436f772c06fd78378c61e8672d5b7 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Tue, 30 Apr 2024 16:02:12 +0200 Subject: [PATCH 124/259] bugfix in scneario_config related to EL2 settings --- config/scenario_config.csv | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 4c1657a7d8..81b7126f6c 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -54,15 +54,15 @@ gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max6 gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;none;none;;;;;;;;;;;;;;;;;;;;;;;; +gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;; gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;;;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;; gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;; gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 77cba2806f85535d01dfff12cb6c4d37a89bd3f8 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 30 Apr 2024 18:01:16 +0200 Subject: [PATCH 125/259] fixes for forest damage and regeneration --- .../35_natveg/dynamic_may24/declarations.gms | 3 ++- modules/35_natveg/dynamic_may24/equations.gms | 15 ++++++++++-- modules/35_natveg/dynamic_may24/presolve.gms | 23 +++++++++++++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/modules/35_natveg/dynamic_may24/declarations.gms b/modules/35_natveg/dynamic_may24/declarations.gms index 3966e4db63..d34e40abed 100644 --- a/modules/35_natveg/dynamic_may24/declarations.gms +++ b/modules/35_natveg/dynamic_may24/declarations.gms @@ -49,7 +49,8 @@ equations q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) q35_secdforest_regeneration(j) Secondary forest remains secondary forest (mio. ha) - q35_max_secdforest_regeneration(j) Maximum forest regeneration (mio. ha) + q35_max_secdforest_regeneration(j) Maximum secdforest regeneration (mio. ha) + q35_max_foresty_expansion(j) Maximum forestry regeneration based on potential forest area (mio. ha) q35_other_regeneration(j) Other land remains other land (mio. ha) q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) diff --git a/modules/35_natveg/dynamic_may24/equations.gms b/modules/35_natveg/dynamic_may24/equations.gms index a863a9c36c..a2560d0121 100644 --- a/modules/35_natveg/dynamic_may24/equations.gms +++ b/modules/35_natveg/dynamic_may24/equations.gms @@ -82,7 +82,7 @@ q35_other_expansion(j2) .. v35_other_expansion(j2) =e= - sum(ac_est, v35_other(j2,ac_est) + v35_secdforest(j2,ac_est)); + sum(ac_est, v35_other(j2,ac_est)); q35_other_reduction(j2,ac_sub) .. v35_other_reduction(j2,ac_sub) =e= @@ -183,15 +183,26 @@ q35_secdforest_regeneration(j2).. + p35_land_restoration(j2,"secdforest") ; +*' The upper bound for the new establishment of forested areas is given +*' by the harvested area plus the remaining potential forest area, which is derived +*' from the potential natural forest area in each cluster. + q35_max_secdforest_regeneration(j2).. sum(ac_est, v35_secdforest(j2,ac_est)) - + sum(type32, vm_landexpansion_forestry(j2,type32)) =l= + sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + v35_hvarea_primforest(j2) + p35_max_forest_recovery(j2) ; +*' Forestry establishment is also constrained by the remaining potential forest area. +q35_max_foresty_expansion(j2).. + sum(type32, vm_landexpansion_forestry(j2,type32)) + =l= + p35_max_forest_recovery(j2) + ; + + *' Harvested other land is still considered other land q35_other_regeneration(j2).. diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms index c91b0f057c..c3e81e18c1 100644 --- a/modules/35_natveg/dynamic_may24/presolve.gms +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -62,11 +62,24 @@ s35_shift = m_timestep_length_forestry/5; p35_secdforest(t,j,"acx") = p35_secdforest(t,j,"acx") + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_secdforest(j,ac)); + +pc35_secdforest(j,ac) = p35_secdforest(t,j,ac); +v35_secdforest.l(j,ac) = pc35_secdforest(j,ac); +vm_land.l(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); +pcm_land(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); + +pc35_other(j,ac) = p35_other(t,j,ac); +v35_other.l(j,ac) = pc35_other(j,ac); +vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)); +pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); + * -------------------------------------- -* Secondary forest recovery +* Secondary forest recovery bound * -------------------------------------- -* Forest recovery is constrained by the potential forest area in each cluster +* Forest recovery is constrained by the potential forest area in each cluster. +* Hence, the potential area for forest recovery is given by the potential forest +* area minus all forest areas in the previous time step. p35_max_forest_recovery(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; @@ -122,10 +135,12 @@ p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","re p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; +* Since forest restoration cannot be bigger than the maximum area for forest recovery, +* any remaining restoration area is substracted and shifted to other land restoration. p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); - +pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); * set conservation bound vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); @@ -143,7 +158,7 @@ m_boundfix(v35_other,(j,ac_sub),l,10e-5); * protection bound fix pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_other(j,ac_sub)); * set restoration target -p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); +p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * Do not restore other land in areas where total natural * land area meets the total natural land conservation target p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; From 55a812592a970af811460239fcfcad6a95bf6df0 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 2 May 2024 11:50:24 +0200 Subject: [PATCH 126/259] removed ndc forestry conflict --- core/sets.gms | 2 +- modules/32_forestry/dynamic_feb21/presolve.gms | 8 ++++++-- modules/35_natveg/dynamic_feb21/input.gms | 8 ++++++++ modules/35_natveg/dynamic_feb21/preloop.gms | 3 +++ modules/35_natveg/dynamic_may24/input.gms | 2 +- modules/35_natveg/dynamic_may24/presolve.gms | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/core/sets.gms b/core/sets.gms index e506848e8b..5ee0ef2fe4 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -248,7 +248,7 @@ sets / crop, past / land_timber(land) land from which timber can be taken away - / forestry, primforest, secdforest,other / + / forestry, primforest, secdforest, other / land_forest(land) Forested land pools / forestry, primforest, secdforest / diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 819189ae54..78db4d62ff 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -21,7 +21,11 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; p32_aff_pol_timestep("y1995",j) = 0; p32_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation - p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); + p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + + (vm_land.l(j,"past") - vm_land.lo(j,"past")) + - pm_land_conservation(t,j,"other","restore"); + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > (fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)))) + = (fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest))); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available @@ -143,7 +147,7 @@ if(s32_aff_prot = 0, v32_land.fx(j,"aff",ac)$(ac.off <= s32_planing_horizon/5) = pc32_land(j,"aff",ac); v32_land.up(j,"aff",ac)$(ac.off > s32_planing_horizon/5) = pc32_land(j,"aff",ac); elseif s32_aff_prot = 1, - v32_land.fx(j,"aff",ac) = pc32_land(j,"aff",ac); + v32_land.fx(j,"aff",ac) = pc32_land(j,"aff",ac); ); v32_land.lo(j,"aff",ac_est) = 0; v32_land.up(j,"aff",ac_est) = Inf; diff --git a/modules/35_natveg/dynamic_feb21/input.gms b/modules/35_natveg/dynamic_feb21/input.gms index 89828c827e..0510a69d3f 100644 --- a/modules/35_natveg/dynamic_feb21/input.gms +++ b/modules/35_natveg/dynamic_feb21/input.gms @@ -54,3 +54,11 @@ $ondelim $include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" $offdelim /; + +parameter fm_pot_forest_area(j) Potential forest area (mio. ha) +/ +$ondelim +$include "./modules/35_natveg/input/pot_forest_area.cs3" +$offdelim +/; + diff --git a/modules/35_natveg/dynamic_feb21/preloop.gms b/modules/35_natveg/dynamic_feb21/preloop.gms index 85a49664f4..5b357bedc7 100644 --- a/modules/35_natveg/dynamic_feb21/preloop.gms +++ b/modules/35_natveg/dynamic_feb21/preloop.gms @@ -43,6 +43,9 @@ p35_secdforest(t,j,ac) = 0; p35_disturbance_loss_secdf(t,j,ac) = 0; p35_disturbance_loss_primf(t,j) = 0; +* In this realisation, the potential forest area is not applied +fm_pot_forest_area(j) = Inf; + * ----------------------------------------- * Land conservation for climate mitigation * ----------------------------------------- diff --git a/modules/35_natveg/dynamic_may24/input.gms b/modules/35_natveg/dynamic_may24/input.gms index 0567f0ed39..de5bef3564 100644 --- a/modules/35_natveg/dynamic_may24/input.gms +++ b/modules/35_natveg/dynamic_may24/input.gms @@ -55,7 +55,7 @@ $include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" $offdelim /; -parameter f35_pot_forest_area(j) Potential forest area (mio. ha) +parameter fm_pot_forest_area(j) Potential forest area (mio. ha) / $ondelim $include "./modules/35_natveg/input/pot_forest_area.cs3" diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/dynamic_may24/presolve.gms index c3e81e18c1..68c9aff345 100644 --- a/modules/35_natveg/dynamic_may24/presolve.gms +++ b/modules/35_natveg/dynamic_may24/presolve.gms @@ -80,7 +80,7 @@ pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); * Forest recovery is constrained by the potential forest area in each cluster. * Hence, the potential area for forest recovery is given by the potential forest * area minus all forest areas in the previous time step. -p35_max_forest_recovery(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +p35_max_forest_recovery(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; * ------------------------------------- From 3389360ecfb05758659859343ea8d58cde8118cd Mon Sep 17 00:00:00 2001 From: Felicitas Date: Thu, 2 May 2024 15:23:44 +0200 Subject: [PATCH 127/259] adjustments in output scripts --- scripts/output/projects/inms_reporting_reg.R | 30 ++++++++++--------- scripts/start/projects/project_EAT2p0.R | 4 +-- .../start/projects/project_EAT2p0_DeepDive.R | 4 +-- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/scripts/output/projects/inms_reporting_reg.R b/scripts/output/projects/inms_reporting_reg.R index bcc2abd4ce..b4cd9aac27 100644 --- a/scripts/output/projects/inms_reporting_reg.R +++ b/scripts/output/projects/inms_reporting_reg.R @@ -24,15 +24,15 @@ print("Start inms reporting reg runscript") if(!exists("source_include")) { - title <- "inms_SSP2_RCP4p5_PolicyLow_v4" - outputdir <- "output/inms_SSP2_RCP4p5_PolicyLow_v4_2020-07-13_15.37.07" + title <- "inms_SSP2_RCP4p5_PolicyLow_v4" + outputdir <- "output/inms_SSP2_RCP4p5_PolicyLow_v4_2020-07-13_15.37.07" ###Define arguments that can be read from command line - readArgs("outputdir","title") + readArgs("outputdir", "title") } ######################################################################################### -print(paste0("script started for output directory",outputdir)) +print(paste0("script started for output directory", outputdir)) withr::local_dir(outputdir) @@ -41,24 +41,26 @@ title <- cfg$title print("generating INMS output for the run: ") print(title) -filename=paste0("report_",title,".mif") -gdx=paste0("fulldata.gdx") -a=getReportINMS(gdx,file=filename,scenario = title,dir=".") +filename <- paste0("report_", title, ".mif") +gdx <- paste0("fulldata.gdx") +a <- getReportINMS(gdx, file = filename, scenario = title, dir = ".") print(filename) -mif=read.report(filename) +mif <- read.report(filename) -missingyears=function(x){ - history=paste0("y",1965+((0:5)*5)) - x[[1]][[1]] <- time_interpolate(x[[1]][[1]],interpolated_year = c(history,paste0("y",2005+((0:9)*10))),integrate_interpolated_years = TRUE) - x[[1]][[1]][,history,] = 0 +missingyears <- function(x) { + history <- paste0("y", 1965 + ((0:5) * 5)) + x[[1]][[1]] <- time_interpolate(x[[1]][[1]], + interpolated_year = c(history,paste0("y",2005+((0:9)*10))), + integrate_interpolated_years = TRUE) + x[[1]][[1]][, history, ] <- 0 return(x) } #a=c(missingyears(ssp1),missingyears(ssp2)) -a=missingyears(mif) +a <- missingyears(mif) -write.reportProject(a,mapping=paste0(wdbefore,"/mapping_inms.csv"),file="report_inms.mif") +write.reportProject(a, mapping = paste0(wdbefore, "/mapping_inms.csv"), file = "report_inms.mif") #write.report(a,file="magpie_results_nov2019.mif") warnings() diff --git a/scripts/start/projects/project_EAT2p0.R b/scripts/start/projects/project_EAT2p0.R index 60b4b4e015..434b8a0d85 100644 --- a/scripts/start/projects/project_EAT2p0.R +++ b/scripts/start/projects/project_EAT2p0.R @@ -33,9 +33,9 @@ cfg$output <- c("output_check", "extra/disaggregation", # "projects/FSEC_nitrogenPollution", # do manually on last (high-res) magpie run # "projects/FSEC_water", # do manually on last (high-res) magpie run - "agmip_report", # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) - "rds_report") + "rds_report", + "agmip_report") ####################### # SCENARIO DEFINITION # diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 9346c4af5d..246c1a8d72 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -35,9 +35,9 @@ cfg$output <- c( "projects/FSEC_nitrogenPollution", "projects/FSEC_water", "agmip_report", - "runBlackmagicc", # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) - "rds_report" + "rds_report", + "runBlackmagicc" ) ####################### From fcc0f4a61b24e09504c4bf306cea9e2a47cf7ca1 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 2 May 2024 16:38:13 +0200 Subject: [PATCH 128/259] use carbon density of other land where forest potential is zero --- modules/52_carbon/normal_dec17/input.gms | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/52_carbon/normal_dec17/input.gms b/modules/52_carbon/normal_dec17/input.gms index a7f8de3df7..7aa7a75499 100644 --- a/modules/52_carbon/normal_dec17/input.gms +++ b/modules/52_carbon/normal_dec17/input.gms @@ -23,7 +23,14 @@ $if "%c52_carbon_scenario%" == "nocc" fm_carbon_density(t_all,j,land,c_pools) = $if "%c52_carbon_scenario%" == "nocc_hist" fm_carbon_density(t_all,j,land,c_pools)$(m_year(t_all) > sm_fix_cc) = fm_carbon_density(t_all,j,land,c_pools)$(m_year(t_all) = sm_fix_cc); m_fillmissingyears(fm_carbon_density,"j,land,c_pools"); -* Fix urban area soilc to natural land soilc as long as preprocessed +* Where no forest carbon density is reported, because the potential +* forest area is zero, use the carbon density of other land instead. +* This affects areas, where the land use intialisation reports some +* forest, although the forest potential is zero. Forest expansion in +* these cells is constrained by fm_pot_forest_area. +fm_carbon_density(t_all,j,land_forest,c_pools)$(fm_carbon_density(t_all,j,land_forest,c_pools) = 0) = fm_carbon_density(t_all,j,"other",c_pools); + +* Fix urban area soilc to natural land soilc as long as preprocessed * fm_carbon_density does not provide meaningful numbers for urban. fm_carbon_density(t_all,j,"urban","soilc") = fm_carbon_density(t_all,j,"other","soilc") @@ -37,7 +44,7 @@ $offdelim * Note: Land carbon sink adjustment factors from Grassie et al 2021 (DOI 10.1038/s41558-021-01033-6) * are needed in the post-processing in https://github.com/pik-piam/magpie4/blob/master/R/reportEmissions.R -* To facilitate the choice of the corresponding RCP, the adjustment factors are read-in here and +* To facilitate the choice of the corresponding RCP, the adjustment factors are read-in here and * stored in i52_land_carbon_sink for use in the R post-processing. * Land carbon sink adjustment factors are NOT used within MAgPIE. $onEmpty @@ -50,10 +57,10 @@ $offEmpty $ifthen "%c52_land_carbon_sink_rcp%" == "nocc" i52_land_carbon_sink(t_all,i) = f52_land_carbon_sink("y1995",i,"RCPBU"); -$elseif "%c52_land_carbon_sink_rcp%" == "nocc_hist" +$elseif "%c52_land_carbon_sink_rcp%" == "nocc_hist" i52_land_carbon_sink(t_all,i) = f52_land_carbon_sink(t_all,i,"RCPBU"); i52_land_carbon_sink(t_all,i)$(m_year(t_all) > sm_fix_cc) = f52_land_carbon_sink(t_all,i,"RCPBU")$(m_year(t_all) = sm_fix_cc); -$else +$else i52_land_carbon_sink(t_all,i) = f52_land_carbon_sink(t_all,i,"%c52_land_carbon_sink_rcp%"); i52_land_carbon_sink(t_all,i)$(m_year(t_all) <= sm_fix_cc) = f52_land_carbon_sink(t_all,i,"RCPBU")$(m_year(t_all) <= sm_fix_cc); $endif From 21fedf2d12ae628596acd4e718655eb624f597a2 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 2 May 2024 17:07:36 +0200 Subject: [PATCH 129/259] new realisation name --- modules/35_natveg/input/files | 2 ++ modules/35_natveg/module.gms | 2 +- .../declarations.gms | 0 .../equations.gms | 0 .../input.gms | 0 .../postsolve.gms | 0 .../preloop.gms | 0 .../presolve.gms | 0 .../realization.gms | 18 +++++++++--------- .../scaling.gms | 0 .../sets.gms | 0 11 files changed, 12 insertions(+), 10 deletions(-) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/declarations.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/equations.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/input.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/postsolve.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/preloop.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/presolve.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/realization.gms (73%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/scaling.gms (100%) rename modules/35_natveg/{dynamic_may24 => pot_forest_may24}/sets.gms (100%) diff --git a/modules/35_natveg/input/files b/modules/35_natveg/input/files index f1603f4a64..8b65a1fd46 100644 --- a/modules/35_natveg/input/files +++ b/modules/35_natveg/input/files @@ -4,3 +4,5 @@ f35_forest_disturbance_share.cs4 f35_forest_lost_share.cs3 f35_gs_relativetarget.cs4 f35_forest_shock.csv +pot_forest_area.cs3 +pot_forest_area_0.5.mz diff --git a/modules/35_natveg/module.gms b/modules/35_natveg/module.gms index 6ebab7afad..ad5f60d91d 100644 --- a/modules/35_natveg/module.gms +++ b/modules/35_natveg/module.gms @@ -18,5 +18,5 @@ *###################### R SECTION START (MODULETYPES) ########################## $Ifi "%natveg%" == "dynamic_feb21" $include "./modules/35_natveg/dynamic_feb21/realization.gms" -$Ifi "%natveg%" == "dynamic_may24" $include "./modules/35_natveg/dynamic_may24/realization.gms" +$Ifi "%natveg%" == "pot_forest_may24" $include "./modules/35_natveg/pot_forest_may24/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ diff --git a/modules/35_natveg/dynamic_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/declarations.gms rename to modules/35_natveg/pot_forest_may24/declarations.gms diff --git a/modules/35_natveg/dynamic_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/equations.gms rename to modules/35_natveg/pot_forest_may24/equations.gms diff --git a/modules/35_natveg/dynamic_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/input.gms rename to modules/35_natveg/pot_forest_may24/input.gms diff --git a/modules/35_natveg/dynamic_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/postsolve.gms rename to modules/35_natveg/pot_forest_may24/postsolve.gms diff --git a/modules/35_natveg/dynamic_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/preloop.gms rename to modules/35_natveg/pot_forest_may24/preloop.gms diff --git a/modules/35_natveg/dynamic_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/presolve.gms rename to modules/35_natveg/pot_forest_may24/presolve.gms diff --git a/modules/35_natveg/dynamic_may24/realization.gms b/modules/35_natveg/pot_forest_may24/realization.gms similarity index 73% rename from modules/35_natveg/dynamic_may24/realization.gms rename to modules/35_natveg/pot_forest_may24/realization.gms index af25d81fa5..a726d8d650 100644 --- a/modules/35_natveg/dynamic_may24/realization.gms +++ b/modules/35_natveg/pot_forest_may24/realization.gms @@ -5,7 +5,7 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -*' @description In the dynamic_may24 realization, land and carbon stock dynamics +*' @description In the pot_forest_may24 realization, land and carbon stock dynamics *' of natural vegetation are modeled endogenously. *' The initial spatial distribution of the sub-land-types primary forest, *' secondary forest and other natural land is based on the @@ -33,12 +33,12 @@ *' secondary forest and harvested primary forest is reclassified as secondary forest. *####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/35_natveg/dynamic_may24/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/35_natveg/dynamic_may24/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/35_natveg/dynamic_may24/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/35_natveg/dynamic_may24/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/35_natveg/dynamic_may24/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/35_natveg/dynamic_may24/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/35_natveg/dynamic_may24/presolve.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/35_natveg/dynamic_may24/postsolve.gms" +$Ifi "%phase%" == "sets" $include "./modules/35_natveg/pot_forest_may24/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/35_natveg/pot_forest_may24/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/35_natveg/pot_forest_may24/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/35_natveg/pot_forest_may24/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/35_natveg/pot_forest_may24/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/35_natveg/pot_forest_may24/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/35_natveg/pot_forest_may24/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/35_natveg/pot_forest_may24/postsolve.gms" *######################## R SECTION END (PHASES) ############################### diff --git a/modules/35_natveg/dynamic_may24/scaling.gms b/modules/35_natveg/pot_forest_may24/scaling.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/scaling.gms rename to modules/35_natveg/pot_forest_may24/scaling.gms diff --git a/modules/35_natveg/dynamic_may24/sets.gms b/modules/35_natveg/pot_forest_may24/sets.gms similarity index 100% rename from modules/35_natveg/dynamic_may24/sets.gms rename to modules/35_natveg/pot_forest_may24/sets.gms From 6365decee4ab7f5f5d7c70070c31908b2dd1ff0e Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 3 May 2024 12:53:45 +0200 Subject: [PATCH 130/259] changed settings in scenario config --- config/scenario_config.csv | 2 +- scripts/start/projects/project_EAT2p0_DeepDive.R | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 81b7126f6c..25d7930f35 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -87,4 +87,4 @@ gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;; gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;; -magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;SSP2EU-DSPkB500-DS_betax.mif;SSP2EU-DSPkB500-DS_betax.mif;SSP2EU-DSPkB500-DS_betax.mif;;;;;;;;;;;;;;;;;;;;;;;; +magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 246c1a8d72..1ae5541373 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -35,15 +35,16 @@ cfg$output <- c( "projects/FSEC_nitrogenPollution", "projects/FSEC_water", "agmip_report", - # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) "rds_report", "runBlackmagicc" + # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) + ) ####################### # SCENARIO DEFINITION # ####################### -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) # To Do: Choose whether EL2_default or EL2_lessSus should be used! # Note: The climate change impacts setting differs from the global AgMIP model comparision set-up. # We do not include climate change impacts in the coupled REMIND-MAgPIE runs for the PB Deep Dive # because we focus exclusively on the mitigation aspect without climate change impacts. From fd50ef4642a6609b044fb17503f40703069d18be Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 3 May 2024 17:09:28 +0200 Subject: [PATCH 131/259] reworked forest regeneration --- core/sets.gms | 3 + modules/10_land/landmatrix_dec18/presolve.gms | 3 + .../35_natveg/dynamic_feb21/declarations.gms | 128 ----------- modules/35_natveg/dynamic_feb21/equations.gms | 202 ------------------ modules/35_natveg/dynamic_feb21/input.gms | 64 ------ modules/35_natveg/dynamic_feb21/not_used.txt | 2 - modules/35_natveg/dynamic_feb21/postsolve.gms | 179 ---------------- modules/35_natveg/dynamic_feb21/preloop.gms | 71 ------ modules/35_natveg/dynamic_feb21/presolve.gms | 200 ----------------- .../35_natveg/dynamic_feb21/realization.gms | 44 ---- modules/35_natveg/dynamic_feb21/scaling.gms | 8 - modules/35_natveg/dynamic_feb21/sets.gms | 28 --- .../pot_forest_may24/declarations.gms | 1 + .../35_natveg/pot_forest_may24/equations.gms | 23 +- .../35_natveg/pot_forest_may24/presolve.gms | 5 + 15 files changed, 20 insertions(+), 941 deletions(-) delete mode 100644 modules/35_natveg/dynamic_feb21/declarations.gms delete mode 100644 modules/35_natveg/dynamic_feb21/equations.gms delete mode 100644 modules/35_natveg/dynamic_feb21/input.gms delete mode 100644 modules/35_natveg/dynamic_feb21/not_used.txt delete mode 100644 modules/35_natveg/dynamic_feb21/postsolve.gms delete mode 100644 modules/35_natveg/dynamic_feb21/preloop.gms delete mode 100644 modules/35_natveg/dynamic_feb21/presolve.gms delete mode 100644 modules/35_natveg/dynamic_feb21/realization.gms delete mode 100644 modules/35_natveg/dynamic_feb21/scaling.gms delete mode 100644 modules/35_natveg/dynamic_feb21/sets.gms diff --git a/core/sets.gms b/core/sets.gms index 5ee0ef2fe4..041abb63b3 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -247,6 +247,9 @@ sets land_ag(land) Agricultural land pools / crop, past / + land_agfo(land) Agricultural and forestry land + / crop, past, forestry / + land_timber(land) land from which timber can be taken away / forestry, primforest, secdforest, other / diff --git a/modules/10_land/landmatrix_dec18/presolve.gms b/modules/10_land/landmatrix_dec18/presolve.gms index edee5163dc..b3bd374f4c 100644 --- a/modules/10_land/landmatrix_dec18/presolve.gms +++ b/modules/10_land/landmatrix_dec18/presolve.gms @@ -20,6 +20,9 @@ vm_lu_transitions.fx(j,"secdforest","other") = 0; vm_lu_transitions.fx(j,land_from,"primforest") = 0; vm_lu_transitions.up(j,"primforest","primforest") = Inf; +*' Forestry can only be converted into secdforest but not other +vm_lu_transitions.fx(j,"forestry","other") = 0; + *' @stop m_boundfix(vm_land,(j,land),up,10e-5); diff --git a/modules/35_natveg/dynamic_feb21/declarations.gms b/modules/35_natveg/dynamic_feb21/declarations.gms deleted file mode 100644 index e949a349a4..0000000000 --- a/modules/35_natveg/dynamic_feb21/declarations.gms +++ /dev/null @@ -1,128 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -scalars - s35_shift number of 5-year age-classes corresponding to current time step length (1) -; - -parameters - i35_secdforest(j,ac) Initial secdforest (mio. ha) - i35_other(j,ac) Initial other land (mio. ha) - p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) - p35_other(t,j,ac) Other land per age class (mio. ha) - pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) - pc35_other(j,ac) Other land per age class in current time step (mio. ha) - p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) - p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) - p35_damage_fader(t_all) Fader for forest damage (1) - p35_recovered_forest(t,j,ac) Recovered forest (mio. ha) - p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) - p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) - p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) - p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) - i35_plantedclass_ac(j,ac) Area of age-classes in secondary forest (1) - p35_poulter_dist(j,ac) Share of age-classes in secondary forest (1) - p35_land(t,j,land_natveg,ac) Natural vegetation area (mio. ha) - p35_updated_gs_natfor(t,i) Updated growing stock in natural forests after calibration (m3 per ha) - p35_land_start_ac(j,ac,land_natveg) Initial Natural vegetation area (mio. ha) - p35_protection_dist(j,ac) Distribution of secondary forest protection (1) - p35_land_restoration(j,land_natveg) Actual secondary forest and other land restoration area (mio. ha) -; - -equations - q35_land_secdforest(j) Secdforest land pool calculation (mio. ha) - q35_land_other(j) Other land pool calculation (mio. ha) - q35_carbon_primforest(j,ag_pools,stockType) Primforest carbon stock calculation (mio tC) - q35_carbon_secdforest(j,ag_pools,stockType) Secdforest carbon stock calculation (mio tC) - q35_carbon_other(j,ag_pools,stockType) Other land carbon stock calculation (mio tC) - q35_min_forest(j) Minimum forest land constraint (mio. ha) - q35_min_other(j) Minimum other land constraint (mio. ha) - q35_landdiff Difference in natveg land (mio. ha) - q35_other_expansion(j) Other land expansion (mio. ha) - q35_other_reduction(j,ac) Other land reduction (mio. ha) - q35_secdforest_expansion(j) Secdforest reduction (mio. ha) - q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) - q35_primforest_reduction(j) Primforest reduction (mio. ha) - q35_secdforest_regeneration(j) Secondary forest remains secondary forest (mio. ha) - q35_other_regeneration(j) Other land remains other land (mio. ha) - q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) - q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) - q35_hvarea_other(j,ac) Harvested area other land (mio. ha) - q35_hvarea_secdforest(j,ac) Harvested area secdforest (mio. ha) - q35_hvarea_primforest(j) Harvested area primforest (mio. ha) - q35_prod_secdforest(j) Production of woody biomass from secondary forests (mio. tDM per yr) - q35_prod_primforest(j) Production of woody biomass from primary forests (mio. tDM per yr) - q35_prod_other(j) Production of woody biomass from other land (mio. tDM per yr) - q35_cost_hvarea(i) Cost of harvesting natural vegetation (mio. USD) - q35_bv_primforest(j,potnatveg) Biodiversity value of primary forest (mio. ha) - q35_bv_secdforest(j,potnatveg) Biodiversity value of secondary forest (mio. ha) - q35_bv_other(j,potnatveg) Biodiversity value of other land (mio. ha) - q35_natveg_conservation(j) Total natural vegetation conservation constraint (mio. ha) -; - -positive variables - v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) - v35_other(j,ac) Detailed stock of other land (mio. ha) - vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) - v35_other_expansion(j) Other land expansion compared to previous timestep (mio. ha) - v35_other_reduction(j,ac) Other land reduction compared to previous timestep (mio. ha) - v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) - v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) - v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) - v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) - v35_hvarea_other(j,ac) Harvested area from other land (mio. ha) - v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) - vm_prod_natveg(j,land_natveg,kforestry) Production of woody biomass from natural vegetation (mio. tDM per yr) - vm_cost_hvarea_natveg(i) Cost of harvesting natural vegetation (mio. USD) -; - - -*#################### R SECTION START (OUTPUT DECLARATIONS) #################### -parameters - ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (mio. ha) - ov35_other(t,j,ac,type) Detailed stock of other land (mio. ha) - ov_landdiff_natveg(t,type) Aggregated difference in natveg land compared to previous timestep (mio. ha) - ov35_other_expansion(t,j,type) Other land expansion compared to previous timestep (mio. ha) - ov35_other_reduction(t,j,ac,type) Other land reduction compared to previous timestep (mio. ha) - ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha) - ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha) - ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha) - ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha) - ov35_hvarea_other(t,j,ac,type) Harvested area from other land (mio. ha) - ov35_hvarea_primforest(t,j,type) Harvested area from primary forest (mio. ha) - ov_prod_natveg(t,j,land_natveg,kforestry,type) Production of woody biomass from natural vegetation (mio. tDM per yr) - ov_cost_hvarea_natveg(t,i,type) Cost of harvesting natural vegetation (mio. USD) - oq35_land_secdforest(t,j,type) Secdforest land pool calculation (mio. ha) - oq35_land_other(t,j,type) Other land pool calculation (mio. ha) - oq35_carbon_primforest(t,j,ag_pools,stockType,type) Primforest carbon stock calculation (mio tC) - oq35_carbon_secdforest(t,j,ag_pools,stockType,type) Secdforest carbon stock calculation (mio tC) - oq35_carbon_other(t,j,ag_pools,stockType,type) Other land carbon stock calculation (mio tC) - oq35_min_forest(t,j,type) Minimum forest land constraint (mio. ha) - oq35_min_other(t,j,type) Minimum other land constraint (mio. ha) - oq35_landdiff(t,type) Difference in natveg land (mio. ha) - oq35_other_expansion(t,j,type) Other land expansion (mio. ha) - oq35_other_reduction(t,j,ac,type) Other land reduction (mio. ha) - oq35_secdforest_expansion(t,j,type) Secdforest reduction (mio. ha) - oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) - oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) - oq35_secdforest_regeneration(t,j,type) Secondary forest remains secondary forest (mio. ha) - oq35_other_regeneration(t,j,type) Other land remains other land (mio. ha) - oq35_other_est(t,j,ac,type) Distribution of other land additions over ac_est (mio. ha) - oq35_secdforest_est(t,j,ac,type) Distribution of secdforest additions over ac_est (mio. ha) - oq35_hvarea_other(t,j,ac,type) Harvested area other land (mio. ha) - oq35_hvarea_secdforest(t,j,ac,type) Harvested area secdforest (mio. ha) - oq35_hvarea_primforest(t,j,type) Harvested area primforest (mio. ha) - oq35_prod_secdforest(t,j,type) Production of woody biomass from secondary forests (mio. tDM per yr) - oq35_prod_primforest(t,j,type) Production of woody biomass from primary forests (mio. tDM per yr) - oq35_prod_other(t,j,type) Production of woody biomass from other land (mio. tDM per yr) - oq35_cost_hvarea(t,i,type) Cost of harvesting natural vegetation (mio. USD) - oq35_bv_primforest(t,j,potnatveg,type) Biodiversity value of primary forest (mio. ha) - oq35_bv_secdforest(t,j,potnatveg,type) Biodiversity value of secondary forest (mio. ha) - oq35_bv_other(t,j,potnatveg,type) Biodiversity value of other land (mio. ha) - oq35_natveg_conservation(t,j,type) Total natural vegetation conservation constraint (mio. ha) -; -*##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/35_natveg/dynamic_feb21/equations.gms b/modules/35_natveg/dynamic_feb21/equations.gms deleted file mode 100644 index 9b3f100c5b..0000000000 --- a/modules/35_natveg/dynamic_feb21/equations.gms +++ /dev/null @@ -1,202 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*' @equations -*' The interface `vm_land` provides aggregated natveg land pools (`ac`) to other modules. - - q35_land_secdforest(j2) .. vm_land(j2,"secdforest") =e= sum(ac, v35_secdforest(j2,ac)); - - q35_land_other(j2) .. vm_land(j2,"other") =e= sum(ac, v35_other(j2,ac)); - -*' The total natural land area cannot be smaller than the total natural land conservation target. -*' Area requirements for natural land conservation are derived from WDPA and formulated based on -*' conservation priority areas during future time steps. - - q35_natveg_conservation(j2) .. - sum(land_natveg, vm_land(j2,land_natveg)) - =g= - sum((ct,land_natveg,consv_type), pm_land_conservation(ct,j2,land_natveg,consv_type)); - -*' Carbon stocks for primary forest, secondary forest or other natural land are calculated -*' as the product of respective area and carbon density. -*' Carbon stocks decline if the area decreases -*' (e.g. due to cropland expansion into forests). -*' In case of abandoned agricultural land (increase of other natural land), -*' natural succession, represented by age-class growth, results in increasing carbon stocks. - - q35_carbon_primforest(j2,ag_pools,stockType) .. - vm_carbon_stock(j2,"primforest",ag_pools,stockType) =e= - m_carbon_stock(vm_land,fm_carbon_density,"primforest"); - - q35_carbon_secdforest(j2,ag_pools,stockType) .. - vm_carbon_stock(j2,"secdforest",ag_pools,stockType) =e= - m_carbon_stock_ac(v35_secdforest,pm_carbon_density_ac,"ac","ac_sub"); - - q35_carbon_other(j2,ag_pools,stockType) .. - vm_carbon_stock(j2,"other",ag_pools,stockType) =e= - m_carbon_stock_ac(v35_other,pm_carbon_density_ac,"ac","ac_sub"); - -*' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). - - q35_bv_primforest(j2,potnatveg) .. vm_bv(j2,"primforest",potnatveg) - =e= - vm_land(j2,"primforest") * fm_bii_coeff("primary",potnatveg) * fm_luh2_side_layers(j2,potnatveg); - - q35_bv_secdforest(j2,potnatveg) .. vm_bv(j2,"secdforest",potnatveg) - =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v35_secdforest(j2,ac)) * - fm_bii_coeff(bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); - - q35_bv_other(j2,potnatveg) .. vm_bv(j2,"other",potnatveg) - =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v35_other(j2,ac)) * - fm_bii_coeff(bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); - -*' NPI/NDC land protection policies based on country reports are implemented as -*' minium forest and other land stocks. They are not interchangeable (as compared to -*' the natural land conservation constraint) and specifically formulated for forest and -*' other land stocks. - - q35_min_forest(j2) .. vm_land(j2,"primforest") + vm_land(j2,"secdforest") - =g= - sum(ct, p35_min_forest(ct,j2)); - - q35_min_other(j2) .. vm_land(j2,"other") =g= sum(ct, p35_min_other(ct,j2)); - -*' The following technical calculations are needed for reducing differences in land-use patterns between time steps. -*' The gross change in natural vegetation is calculated based on land expansion and -*' land contraction of other land, and land reduction of primary and secondary forest. -*' This information is then passed to the land module ([10_land]): - - q35_landdiff .. vm_landdiff_natveg =e= - sum(j2, - v35_other_expansion(j2) - + sum(ac_sub, v35_other_reduction(j2,ac_sub)) - + v35_secdforest_expansion(j2) - + sum(ac_sub, v35_secdforest_reduction(j2,ac_sub)) - + v35_primforest_reduction(j2)); - - q35_other_expansion(j2) .. - v35_other_expansion(j2) =e= - sum(ac_est, v35_other(j2,ac_est)); - - q35_other_reduction(j2,ac_sub) .. - v35_other_reduction(j2,ac_sub) =e= - pc35_other(j2,ac_sub) - v35_other(j2,ac_sub); - - q35_secdforest_expansion(j2) .. - v35_secdforest_expansion(j2) =e= - sum(ac_est, v35_secdforest(j2,ac_est)); - - q35_secdforest_reduction(j2,ac_sub) .. - v35_secdforest_reduction(j2,ac_sub) =e= - pc35_secdforest(j2,ac_sub) - v35_secdforest(j2,ac_sub); - - q35_primforest_reduction(j2) .. - v35_primforest_reduction(j2) =e= - pcm_land(j2,"primforest") - vm_land(j2,"primforest"); - -******************************************************************* -**** Timber production related equations in natural vegetation **** -******************************************************************* - -*' For natural forest, per-hectare harvesting costs are positive to make sure that older -*' forest with higher growing stock is preferred over younger forest. -*' To mimic the difficulties in accessing primary forest, per-hectare harvesting -*' costs for primary forest are higher than for secondary forest. Harvesting costs -*' are paid everytime natural vegetation is harvested. The "real" harvested area -*' are received from the timber module [73_timber]. - -q35_cost_hvarea(i2).. - vm_cost_hvarea_natveg(i2) - =e= - sum((ct,cell(i2,j2),ac_sub), v35_hvarea_secdforest(j2,ac_sub)) * s35_timber_harvest_cost_secdforest - + sum((ct,cell(i2,j2),ac_sub), v35_hvarea_other(j2, ac_sub)) * s35_timber_harvest_cost_other - + sum((ct,cell(i2,j2)), v35_hvarea_primforest(j2)) * s35_timber_harvest_cost_primforest - ; - -** Secondary forest -*' Woody biomass production from secondary forests is calculated by multiplying the -*' area under production with corresponding yields of secondary forests, divided by the timestep length. - -q35_prod_secdforest(j2).. - sum(kforestry, vm_prod_natveg(j2,"secdforest",kforestry)) - =e= - sum(ac_sub, v35_hvarea_secdforest(j2,ac_sub) * sum(ct,pm_timber_yield(ct,j2,ac_sub,"secdforest"))) / m_timestep_length_forestry; - -** Primary forest -*' Woody biomass production from primary forests is calculated by multiplying the -*' area under production with corresponding yields of primary forests, divided by the timestep length. - -q35_prod_primforest(j2).. - sum(kforestry, vm_prod_natveg(j2,"primforest",kforestry)) - =e= - v35_hvarea_primforest(j2) * sum(ct, pm_timber_yield(ct,j2,"acx","primforest")) / m_timestep_length_forestry; - -** Other land -*' Wood-fuel production from other land is calculated by multiplying the area under -*' production with corresponding yields of other land, divided by the timestep length. -*' Wood production from other landis not allowed. - -q35_prod_other(j2).. - vm_prod_natveg(j2,"other","woodfuel") - =e= - sum(ac_sub, v35_hvarea_other(j2,ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"other"))) / m_timestep_length_forestry - ; - -*' Following equations show the harvested area from natural vegetation i.e. primary -*' forests, secondary forests and other land. Important to note here that no wood -*' production should be realized from other land. Harvested area for production -*' purposes can be lower oe equal than land reduction in natural vegetation as -*' not all lost area is (or should be) used for production. - -q35_hvarea_secdforest(j2,ac_sub).. - v35_hvarea_secdforest(j2,ac_sub) - =l= - v35_secdforest_reduction(j2,ac_sub); - -q35_hvarea_primforest(j2).. - v35_hvarea_primforest(j2) - =l= - v35_primforest_reduction(j2); - -q35_hvarea_other(j2,ac_sub).. - v35_hvarea_other(j2,ac_sub) - =l= - v35_other_reduction(j2,ac_sub); - - -*' Harvested secondary forest is still considered secondary forests due to -*' restrictive NPI definitions. Also primary forest harvested will be considered -*' to be secondary forest i.e., harvested primary forest gets reclassified as -*' secondary forest and ends up in the youngest age-class (and follows regrowth) - -q35_secdforest_regeneration(j2).. - sum(ac_est, v35_secdforest(j2,ac_est)) - =e= - sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) - + v35_hvarea_primforest(j2) - + p35_land_restoration(j2,"secdforest") - ; - -*' Harvested other land is still considered other land - -q35_other_regeneration(j2).. - sum(ac_est, v35_other(j2,ac_est)) - =g= - sum(ac_sub,v35_hvarea_other(j2,ac_sub)) - ; - -*' The following two constraints distribute additions to secdforest and other land -*' over ac_est, which depends on the time step length (e.g. ac0 and ac5 for a 10 year time step). - -q35_secdforest_est(j2,ac_est) .. -v35_secdforest(j2,ac_est) =e= sum(ac_est2, v35_secdforest(j2,ac_est2))/card(ac_est2); - -q35_other_est(j2,ac_est) .. -v35_other(j2,ac_est) =e= sum(ac_est2, v35_other(j2,ac_est2))/card(ac_est2); - diff --git a/modules/35_natveg/dynamic_feb21/input.gms b/modules/35_natveg/dynamic_feb21/input.gms deleted file mode 100644 index 0510a69d3f..0000000000 --- a/modules/35_natveg/dynamic_feb21/input.gms +++ /dev/null @@ -1,64 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -$setglobal c35_ad_policy npi -$setglobal c35_aolc_policy npi -$setglobal c35_shock_scenario none - -scalars -s35_hvarea Flag for harvested area (0=zero 1=exognous 2=endogneous) / 0 / -s35_hvarea_secdforest annual secdforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / -s35_hvarea_primforest annual primforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / -s35_hvarea_other annual other land harvest rate for s35_hvarea equals 1 (percent per year) / 0 / -s35_timber_harvest_cost_secdforest Cost for harvesting from secondary forest (USD per ha) / 2000/ -s35_timber_harvest_cost_other Cost for harvesting from other land (USD per ha) / 1500 / -s35_timber_harvest_cost_primforest Cost for harvesting from primary forest (USD per ha) / 3000/ -s35_natveg_harvest_shr Constrains the allowed wood harvest from natural vegetation (1=unconstrained) (1) /1/ -s35_secdf_distribution Flag for secdf initialization (0=all secondary forest in highest age class 1=Equal distribution among all age classes 2=Poulter distribution from MODIS satellite data) (1) / 0 / -s35_forest_damage Damage simulation in forests (0=none 1=shifting agriculture 2= Damage from shifting agriculture is faded out by c35_forest_damage_end 4= f35_forest_shock scenario) / 2 / -s35_forest_damage_end Year of forest damage end (1) / 2050 / -; - -table f35_forest_lost_share(i,driver_source) Share of area damanged by forest fires (1) -$ondelim -$include "./modules/35_natveg/input/f35_forest_lost_share.cs3" -$offdelim -; - -table f35_min_land_stock(t_all,j,pol35,pol_stock35) Avoided deforestation and land protection policies [minimum land stock] (Mha) -$ondelim -$include "./modules/35_natveg/input/npi_ndc_ad_aolc_pol.cs3" -$offdelim -; - -table f35_forest_shock(t_all, shock_scen) Forest carbon shock scenarios (area share affected per year) -$ondelim -$include "./modules/35_natveg/input/f35_forest_shock.csv" -$offdelim -; - -parameter f35_forest_disturbance_share(i) Share of area damanged by forest disturbances (1) -/ -$ondelim -$include "./modules/35_natveg/input/f35_forest_disturbance_share.cs4" -$offdelim -/; - -parameter f35_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) -/ -$ondelim -$include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" -$offdelim -/; - -parameter fm_pot_forest_area(j) Potential forest area (mio. ha) -/ -$ondelim -$include "./modules/35_natveg/input/pot_forest_area.cs3" -$offdelim -/; - diff --git a/modules/35_natveg/dynamic_feb21/not_used.txt b/modules/35_natveg/dynamic_feb21/not_used.txt deleted file mode 100644 index 810653acf1..0000000000 --- a/modules/35_natveg/dynamic_feb21/not_used.txt +++ /dev/null @@ -1,2 +0,0 @@ -name,type,reason -vm_landexpansion_forestry, input, not needed diff --git a/modules/35_natveg/dynamic_feb21/postsolve.gms b/modules/35_natveg/dynamic_feb21/postsolve.gms deleted file mode 100644 index 41f427750b..0000000000 --- a/modules/35_natveg/dynamic_feb21/postsolve.gms +++ /dev/null @@ -1,179 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*secdforest age class calculation -p35_secdforest(t,j,ac) = v35_secdforest.l(j,ac); - -*other land age class calculation -p35_other(t,j,ac) = v35_other.l(j,ac); - -*#################### R SECTION START (OUTPUT DEFINITIONS) ##################### - ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); - ov35_other(t,j,ac,"marginal") = v35_other.m(j,ac); - ov_landdiff_natveg(t,"marginal") = vm_landdiff_natveg.m; - ov35_other_expansion(t,j,"marginal") = v35_other_expansion.m(j); - ov35_other_reduction(t,j,ac,"marginal") = v35_other_reduction.m(j,ac); - ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j); - ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac); - ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j); - ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac); - ov35_hvarea_other(t,j,ac,"marginal") = v35_hvarea_other.m(j,ac); - ov35_hvarea_primforest(t,j,"marginal") = v35_hvarea_primforest.m(j); - ov_prod_natveg(t,j,land_natveg,kforestry,"marginal") = vm_prod_natveg.m(j,land_natveg,kforestry); - ov_cost_hvarea_natveg(t,i,"marginal") = vm_cost_hvarea_natveg.m(i); - oq35_land_secdforest(t,j,"marginal") = q35_land_secdforest.m(j); - oq35_land_other(t,j,"marginal") = q35_land_other.m(j); - oq35_carbon_primforest(t,j,ag_pools,stockType,"marginal") = q35_carbon_primforest.m(j,ag_pools,stockType); - oq35_carbon_secdforest(t,j,ag_pools,stockType,"marginal") = q35_carbon_secdforest.m(j,ag_pools,stockType); - oq35_carbon_other(t,j,ag_pools,stockType,"marginal") = q35_carbon_other.m(j,ag_pools,stockType); - oq35_min_forest(t,j,"marginal") = q35_min_forest.m(j); - oq35_min_other(t,j,"marginal") = q35_min_other.m(j); - oq35_landdiff(t,"marginal") = q35_landdiff.m; - oq35_other_expansion(t,j,"marginal") = q35_other_expansion.m(j); - oq35_other_reduction(t,j,ac,"marginal") = q35_other_reduction.m(j,ac); - oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j); - oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); - oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); - oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.m(j); - oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); - oq35_other_est(t,j,ac,"marginal") = q35_other_est.m(j,ac); - oq35_secdforest_est(t,j,ac,"marginal") = q35_secdforest_est.m(j,ac); - oq35_hvarea_other(t,j,ac,"marginal") = q35_hvarea_other.m(j,ac); - oq35_hvarea_secdforest(t,j,ac,"marginal") = q35_hvarea_secdforest.m(j,ac); - oq35_hvarea_primforest(t,j,"marginal") = q35_hvarea_primforest.m(j); - oq35_prod_secdforest(t,j,"marginal") = q35_prod_secdforest.m(j); - oq35_prod_primforest(t,j,"marginal") = q35_prod_primforest.m(j); - oq35_prod_other(t,j,"marginal") = q35_prod_other.m(j); - oq35_cost_hvarea(t,i,"marginal") = q35_cost_hvarea.m(i); - oq35_bv_primforest(t,j,potnatveg,"marginal") = q35_bv_primforest.m(j,potnatveg); - oq35_bv_secdforest(t,j,potnatveg,"marginal") = q35_bv_secdforest.m(j,potnatveg); - oq35_bv_other(t,j,potnatveg,"marginal") = q35_bv_other.m(j,potnatveg); - oq35_natveg_conservation(t,j,"marginal") = q35_natveg_conservation.m(j); - ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac); - ov35_other(t,j,ac,"level") = v35_other.l(j,ac); - ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l; - ov35_other_expansion(t,j,"level") = v35_other_expansion.l(j); - ov35_other_reduction(t,j,ac,"level") = v35_other_reduction.l(j,ac); - ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j); - ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac); - ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j); - ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac); - ov35_hvarea_other(t,j,ac,"level") = v35_hvarea_other.l(j,ac); - ov35_hvarea_primforest(t,j,"level") = v35_hvarea_primforest.l(j); - ov_prod_natveg(t,j,land_natveg,kforestry,"level") = vm_prod_natveg.l(j,land_natveg,kforestry); - ov_cost_hvarea_natveg(t,i,"level") = vm_cost_hvarea_natveg.l(i); - oq35_land_secdforest(t,j,"level") = q35_land_secdforest.l(j); - oq35_land_other(t,j,"level") = q35_land_other.l(j); - oq35_carbon_primforest(t,j,ag_pools,stockType,"level") = q35_carbon_primforest.l(j,ag_pools,stockType); - oq35_carbon_secdforest(t,j,ag_pools,stockType,"level") = q35_carbon_secdforest.l(j,ag_pools,stockType); - oq35_carbon_other(t,j,ag_pools,stockType,"level") = q35_carbon_other.l(j,ag_pools,stockType); - oq35_min_forest(t,j,"level") = q35_min_forest.l(j); - oq35_min_other(t,j,"level") = q35_min_other.l(j); - oq35_landdiff(t,"level") = q35_landdiff.l; - oq35_other_expansion(t,j,"level") = q35_other_expansion.l(j); - oq35_other_reduction(t,j,ac,"level") = q35_other_reduction.l(j,ac); - oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j); - oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); - oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); - oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.l(j); - oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); - oq35_other_est(t,j,ac,"level") = q35_other_est.l(j,ac); - oq35_secdforest_est(t,j,ac,"level") = q35_secdforest_est.l(j,ac); - oq35_hvarea_other(t,j,ac,"level") = q35_hvarea_other.l(j,ac); - oq35_hvarea_secdforest(t,j,ac,"level") = q35_hvarea_secdforest.l(j,ac); - oq35_hvarea_primforest(t,j,"level") = q35_hvarea_primforest.l(j); - oq35_prod_secdforest(t,j,"level") = q35_prod_secdforest.l(j); - oq35_prod_primforest(t,j,"level") = q35_prod_primforest.l(j); - oq35_prod_other(t,j,"level") = q35_prod_other.l(j); - oq35_cost_hvarea(t,i,"level") = q35_cost_hvarea.l(i); - oq35_bv_primforest(t,j,potnatveg,"level") = q35_bv_primforest.l(j,potnatveg); - oq35_bv_secdforest(t,j,potnatveg,"level") = q35_bv_secdforest.l(j,potnatveg); - oq35_bv_other(t,j,potnatveg,"level") = q35_bv_other.l(j,potnatveg); - oq35_natveg_conservation(t,j,"level") = q35_natveg_conservation.l(j); - ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac); - ov35_other(t,j,ac,"upper") = v35_other.up(j,ac); - ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up; - ov35_other_expansion(t,j,"upper") = v35_other_expansion.up(j); - ov35_other_reduction(t,j,ac,"upper") = v35_other_reduction.up(j,ac); - ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j); - ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac); - ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j); - ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac); - ov35_hvarea_other(t,j,ac,"upper") = v35_hvarea_other.up(j,ac); - ov35_hvarea_primforest(t,j,"upper") = v35_hvarea_primforest.up(j); - ov_prod_natveg(t,j,land_natveg,kforestry,"upper") = vm_prod_natveg.up(j,land_natveg,kforestry); - ov_cost_hvarea_natveg(t,i,"upper") = vm_cost_hvarea_natveg.up(i); - oq35_land_secdforest(t,j,"upper") = q35_land_secdforest.up(j); - oq35_land_other(t,j,"upper") = q35_land_other.up(j); - oq35_carbon_primforest(t,j,ag_pools,stockType,"upper") = q35_carbon_primforest.up(j,ag_pools,stockType); - oq35_carbon_secdforest(t,j,ag_pools,stockType,"upper") = q35_carbon_secdforest.up(j,ag_pools,stockType); - oq35_carbon_other(t,j,ag_pools,stockType,"upper") = q35_carbon_other.up(j,ag_pools,stockType); - oq35_min_forest(t,j,"upper") = q35_min_forest.up(j); - oq35_min_other(t,j,"upper") = q35_min_other.up(j); - oq35_landdiff(t,"upper") = q35_landdiff.up; - oq35_other_expansion(t,j,"upper") = q35_other_expansion.up(j); - oq35_other_reduction(t,j,ac,"upper") = q35_other_reduction.up(j,ac); - oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j); - oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); - oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); - oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.up(j); - oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); - oq35_other_est(t,j,ac,"upper") = q35_other_est.up(j,ac); - oq35_secdforest_est(t,j,ac,"upper") = q35_secdforest_est.up(j,ac); - oq35_hvarea_other(t,j,ac,"upper") = q35_hvarea_other.up(j,ac); - oq35_hvarea_secdforest(t,j,ac,"upper") = q35_hvarea_secdforest.up(j,ac); - oq35_hvarea_primforest(t,j,"upper") = q35_hvarea_primforest.up(j); - oq35_prod_secdforest(t,j,"upper") = q35_prod_secdforest.up(j); - oq35_prod_primforest(t,j,"upper") = q35_prod_primforest.up(j); - oq35_prod_other(t,j,"upper") = q35_prod_other.up(j); - oq35_cost_hvarea(t,i,"upper") = q35_cost_hvarea.up(i); - oq35_bv_primforest(t,j,potnatveg,"upper") = q35_bv_primforest.up(j,potnatveg); - oq35_bv_secdforest(t,j,potnatveg,"upper") = q35_bv_secdforest.up(j,potnatveg); - oq35_bv_other(t,j,potnatveg,"upper") = q35_bv_other.up(j,potnatveg); - oq35_natveg_conservation(t,j,"upper") = q35_natveg_conservation.up(j); - ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac); - ov35_other(t,j,ac,"lower") = v35_other.lo(j,ac); - ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo; - ov35_other_expansion(t,j,"lower") = v35_other_expansion.lo(j); - ov35_other_reduction(t,j,ac,"lower") = v35_other_reduction.lo(j,ac); - ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j); - ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac); - ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j); - ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac); - ov35_hvarea_other(t,j,ac,"lower") = v35_hvarea_other.lo(j,ac); - ov35_hvarea_primforest(t,j,"lower") = v35_hvarea_primforest.lo(j); - ov_prod_natveg(t,j,land_natveg,kforestry,"lower") = vm_prod_natveg.lo(j,land_natveg,kforestry); - ov_cost_hvarea_natveg(t,i,"lower") = vm_cost_hvarea_natveg.lo(i); - oq35_land_secdforest(t,j,"lower") = q35_land_secdforest.lo(j); - oq35_land_other(t,j,"lower") = q35_land_other.lo(j); - oq35_carbon_primforest(t,j,ag_pools,stockType,"lower") = q35_carbon_primforest.lo(j,ag_pools,stockType); - oq35_carbon_secdforest(t,j,ag_pools,stockType,"lower") = q35_carbon_secdforest.lo(j,ag_pools,stockType); - oq35_carbon_other(t,j,ag_pools,stockType,"lower") = q35_carbon_other.lo(j,ag_pools,stockType); - oq35_min_forest(t,j,"lower") = q35_min_forest.lo(j); - oq35_min_other(t,j,"lower") = q35_min_other.lo(j); - oq35_landdiff(t,"lower") = q35_landdiff.lo; - oq35_other_expansion(t,j,"lower") = q35_other_expansion.lo(j); - oq35_other_reduction(t,j,ac,"lower") = q35_other_reduction.lo(j,ac); - oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j); - oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); - oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); - oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.lo(j); - oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); - oq35_other_est(t,j,ac,"lower") = q35_other_est.lo(j,ac); - oq35_secdforest_est(t,j,ac,"lower") = q35_secdforest_est.lo(j,ac); - oq35_hvarea_other(t,j,ac,"lower") = q35_hvarea_other.lo(j,ac); - oq35_hvarea_secdforest(t,j,ac,"lower") = q35_hvarea_secdforest.lo(j,ac); - oq35_hvarea_primforest(t,j,"lower") = q35_hvarea_primforest.lo(j); - oq35_prod_secdforest(t,j,"lower") = q35_prod_secdforest.lo(j); - oq35_prod_primforest(t,j,"lower") = q35_prod_primforest.lo(j); - oq35_prod_other(t,j,"lower") = q35_prod_other.lo(j); - oq35_cost_hvarea(t,i,"lower") = q35_cost_hvarea.lo(i); - oq35_bv_primforest(t,j,potnatveg,"lower") = q35_bv_primforest.lo(j,potnatveg); - oq35_bv_secdforest(t,j,potnatveg,"lower") = q35_bv_secdforest.lo(j,potnatveg); - oq35_bv_other(t,j,potnatveg,"lower") = q35_bv_other.lo(j,potnatveg); - oq35_natveg_conservation(t,j,"lower") = q35_natveg_conservation.lo(j); -*##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/35_natveg/dynamic_feb21/preloop.gms b/modules/35_natveg/dynamic_feb21/preloop.gms deleted file mode 100644 index 5b357bedc7..0000000000 --- a/modules/35_natveg/dynamic_feb21/preloop.gms +++ /dev/null @@ -1,71 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -** initialize other land -i35_other(j,ac) = 0; -i35_other(j,"acx") = pcm_land(j,"other"); - -** initialize secdforest area depending on switch. -if(s35_secdf_distribution = 0, - i35_secdforest(j,"acx") = pcm_land(j,"secdforest"); -elseif s35_secdf_distribution = 1, -* ac0 is excluded here. Therefore no initial shifting is needed. - i35_secdforest(j,ac)$(not sameas(ac,"ac0")) = pcm_land(j,"secdforest")/(card(ac)-1); -elseif s35_secdf_distribution = 2, -*classes 1, 2, 3 include plantation and are therefore excluded -*As disturbance history (fire) would affect the age structure -*We use the sahre from class 4 to be in class 1,2,3 -*class 15 is primary forest and is therefore excluded - i35_plantedclass_ac(j,ac) = im_plantedclass_ac(j,ac); - i35_plantedclass_ac(j,ac_planted)$(i35_plantedclass_ac(j,ac_planted) > im_plantedclass_ac(j,"ac35")) = im_plantedclass_ac(j,"ac35"); - -* Distribute this area correctly - p35_poulter_dist(j,ac) = 0; - p35_poulter_dist(j,ac) = (i35_plantedclass_ac(j,ac)/sum(ac2,i35_plantedclass_ac(j,ac2)))$(sum(ac2,i35_plantedclass_ac(j,ac2))>0); - i35_secdforest(j,ac)$(not sameas(ac,"ac0")) = pcm_land(j,"secdforest")*p35_poulter_dist(j,ac); -); - -*use residual approach to avoid rounding errors -i35_secdforest(j,"acx") = i35_secdforest(j,"acx") + (pcm_land(j,"secdforest") - sum(ac, i35_secdforest(j,ac))); - -** Initialize values to be used in presolve -p35_recovered_forest(t,j,ac) = 0; - -*initialize parameter -p35_other(t,j,ac) = 0; -p35_secdforest(t,j,ac) = 0; - -* initialize forest disturbance losses -p35_disturbance_loss_secdf(t,j,ac) = 0; -p35_disturbance_loss_primf(t,j) = 0; - -* In this realisation, the potential forest area is not applied -fm_pot_forest_area(j) = Inf; - -* ----------------------------------------- -* Land conservation for climate mitigation -* ----------------------------------------- - -p35_min_forest(t,j) = f35_min_land_stock(t,j,"%c35_ad_policy%","forest"); -p35_min_other(t,j) = f35_min_land_stock(t,j,"%c35_ad_policy%","other"); - - -* ---------------------------------------- -* Calibrate Natural vegetation yields -* ---------------------------------------- - -** Initialize with 0 cvalues -p35_land_start_ac(j,ac,land_natveg) = 0; -** Capture natural forest values (primary forest + secondary forest) -p35_land_start_ac(j,"acx","primforest") = pcm_land(j,"primforest"); -p35_land_start_ac(j,ac,"secdforest") = i35_secdforest(j,ac); - - -* ----------------------------- -* Set forest damage trajectory -* ----------------------------- -m_sigmoid_time_interpol(p35_damage_fader,sm_fix_SSP2,s35_forest_damage_end,0,1); diff --git a/modules/35_natveg/dynamic_feb21/presolve.gms b/modules/35_natveg/dynamic_feb21/presolve.gms deleted file mode 100644 index 97a6f33b35..0000000000 --- a/modules/35_natveg/dynamic_feb21/presolve.gms +++ /dev/null @@ -1,200 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -if((ord(t) = 1), - pc35_secdforest(j,ac) = i35_secdforest(j,ac); - pc35_other(j,ac) = i35_other(j,ac); -else - pc35_secdforest(j,ac) = p35_secdforest(t-1,j,ac); - pc35_other(j,ac) = p35_other(t-1,j,ac); -); - -* ---------------------------------------------------- -* Shift ageclasses due to shifting agriculture fires -* ---------------------------------------------------- - -* first calculate damages -if(s35_forest_damage=1, - p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry; - p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry; - ); - -* shifting cultivation is faded out -if(s35_forest_damage=2, - p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry*(1 - p35_damage_fader(t)); - p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * sum(cell(i,j),f35_forest_lost_share(i,"shifting_agriculture"))*m_timestep_length_forestry*(1 - p35_damage_fader(t)); - ); - -if(s35_forest_damage=3, - p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * sum((cell(i,j),combined_loss),f35_forest_lost_share(i,combined_loss))*m_timestep_length_forestry; - p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * sum((cell(i,j),combined_loss),f35_forest_lost_share(i,combined_loss))*m_timestep_length_forestry; - ); - -* generic disturbance scenarios -if(s35_forest_damage=4, - p35_disturbance_loss_secdf(t,j,ac_sub) = pc35_secdforest(j,ac_sub) * f35_forest_shock(t,"%c35_shock_scenario%") * m_timestep_length; - p35_disturbance_loss_primf(t,j) = pcm_land(j,"primforest") * f35_forest_shock(t,"%c35_shock_scenario%") * m_timestep_length; - ); - -* Distribution of damages correctly -pc35_secdforest(j,ac_est) = pc35_secdforest(j,ac_est) + sum(ac_sub,p35_disturbance_loss_secdf(t,j,ac_sub))/card(ac_est2) + p35_disturbance_loss_primf(t,j)/card(ac_est2); - -pc35_secdforest(j,ac_sub) = pc35_secdforest(j,ac_sub) - p35_disturbance_loss_secdf(t,j,ac_sub); -pcm_land(j,"primforest") = pcm_land(j,"primforest") - p35_disturbance_loss_primf(t,j); -vm_land.l(j,"primforest") = pcm_land(j,"primforest"); - -* Regrowth of natural vegetation (natural succession) is modelled by shifting age-classes according to time step length. -s35_shift = m_timestep_length_forestry/5; -* example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) - p35_other(t,j,ac)$(ord(ac) > s35_shift) = pc35_other(j,ac-s35_shift); -* account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation - p35_other(t,j,"acx") = p35_other(t,j,"acx") - + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_other(j,ac)); - -* Usual shift -* example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) - p35_secdforest(t,j,ac)$(ord(ac) > s35_shift) = pc35_secdforest(j,ac-s35_shift); -* account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation - p35_secdforest(t,j,"acx") = p35_secdforest(t,j,"acx") - + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_secdforest(j,ac)); - -* -------------------------------------- -* Carbon threshold for secondary forest -* -------------------------------------- - -*' @code -*' If the vegetation carbon density in a simulation unit due to regrowth -*' exceeds a threshold of 20 tC/ha the respective area is shifted from other natural land to secondary forest. -p35_recovered_forest(t,j,ac)$(not sameas(ac,"acx")) = - p35_other(t,j,ac)$(pm_carbon_density_ac(t,j,ac,"vegc") > 20); -p35_other(t,j,ac) = p35_other(t,j,ac) - p35_recovered_forest(t,j,ac); -p35_secdforest(t,j,ac) = p35_secdforest(t,j,ac) + p35_recovered_forest(t,j,ac); -*' @stop - -pc35_secdforest(j,ac) = p35_secdforest(t,j,ac); -v35_secdforest.l(j,ac) = pc35_secdforest(j,ac); -vm_land.l(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); -pcm_land(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); - -pc35_other(j,ac) = p35_other(t,j,ac); -v35_other.l(j,ac) = pc35_other(j,ac); -vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)); -pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); - -* Correct land conservation for damage -pm_land_conservation(t,j,land_natveg,"protect")$(pm_land_conservation(t,j,land_natveg,"protect") > pcm_land(j,land_natveg)) = pcm_land(j,land_natveg); - -* ------------------------------------- -* Set bounds based on land conservation -* ------------------------------------- - -* Within the optimization, primary and secondary forests can only decrease -* (e.g. for cropland expansion). -* In contrast, other natural land can decrease and increase within the optimization. -* For instance, other natural land increases if agricultural land is abandoned. - -** Setting bounds for only allowing s35_natveg_harvest_shr percentage of available forest to be harvested (highest age class) - -* Primary forest - -** Allowing selective logging only after historical period -if (sum(sameas(t_past,t),1) = 1, -vm_land.lo(j,"primforest") = 0; -else -vm_land.lo(j,"primforest") = (1-s35_natveg_harvest_shr) * pcm_land(j,"primforest"); -); -* Primary forest conservation -vm_land.lo(j,"primforest")$(vm_land.lo(j,"primforest") < pm_land_conservation(t,j,"primforest","protect")) = pm_land_conservation(t,j,"primforest","protect"); -vm_land.up(j,"primforest") = pcm_land(j,"primforest"); - -* Secondary forest - -*reset bound -v35_secdforest.lo(j,ac) = 0; -v35_secdforest.up(j,ac) = Inf; - -p35_protection_dist(j,ac_sub) = (pc35_secdforest(j,ac_sub)/sum(ac_sub2,pc35_secdforest(j,ac_sub2)))$(sum(ac_sub2,pc35_secdforest(j,ac_sub2))>0); -if (sum(sameas(t_past,t),1) = 1, -v35_secdforest.lo(j,ac_sub) = pm_land_conservation(t,j,"secdforest","protect") * p35_protection_dist(j,ac_sub); -else -v35_secdforest.lo(j,ac_sub) = max((1-s35_natveg_harvest_shr) * pc35_secdforest(j,ac_sub), pm_land_conservation(t,j,"secdforest","protect") * p35_protection_dist(j,ac_sub)); -); -* upper bound -v35_secdforest.up(j,ac_sub) = pc35_secdforest(j,ac_sub); -m_boundfix(v35_secdforest,(j,ac_sub),l,10e-5); - -* Secondary forest conservation -* protection bound fix -pm_land_conservation(t,j,"secdforest","protect")$(abs(pm_land_conservation(t,j,"secdforest","protect") - sum(ac_sub, pc35_secdforest(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_secdforest(j,ac_sub)); -* set restoration target -p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","restore"); -* Do not restore secdforest in areas where total natural -* land area meets the total natural land conservation target -p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; -* set conservation bound -vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); - -** Other land - -*reset bounds -v35_other.lo(j,ac) = 0; -v35_other.up(j,ac) = Inf; -*set upper bound -v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); -m_boundfix(v35_other,(j,ac_sub),l,10e-5); - -* Other land conservation -* protection bound fix -pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_other(j,ac_sub)); -* set restoration target -p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); -* Do not restore other land in areas where total natural -* land area meets the total natural land conservation target -p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; -* set conservation bound -vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); - -* ------------------------------ -* Calculate carbon density -* ------------------------------ - -* highest carbon density 1st time step to account for reshuffling -p35_carbon_density_secdforest(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); -p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); - -* ------------------ -* NPI/NDC policy -* ------------------ - -p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); -p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); - -** Display -p35_land(t,j,land_natveg,ac) = 0; -p35_land(t,j,"primforest","acx") = pcm_land(j,"primforest"); -p35_land(t,j,"secdforest",ac) = p35_secdforest(t,j,ac); -*p35_land(t,j,"other",ac) = p35_other(t,j,ac): -p35_updated_gs_natfor(t,i) = 0; -p35_updated_gs_natfor(t,i)$(sum((cell(i,j),ac,land_natveg), p35_land(t,j,land_natveg,ac))>0) = (sum((cell(i,j),ac,land_natveg),(pm_timber_yield(t,j,ac,land_natveg) / sm_wood_density) * p35_land(t,j,land_natveg,ac))/ sum((cell(i,j),ac,land_natveg), p35_land(t,j,land_natveg,ac))); - -** Youngest age classes are not allowed to be harvested -v35_hvarea_secdforest.fx(j,ac_est) = 0; -v35_hvarea_other.fx(j,ac_est) = 0; -v35_secdforest_reduction.fx(j,ac_est) = 0; -v35_other_reduction.fx(j,ac_est) = 0; - -vm_prod_natveg.fx(j,"other","wood") = 0; - -if(s35_hvarea = 0, - v35_hvarea_secdforest.fx(j,ac_sub) = 0; - v35_hvarea_primforest.fx(j) = 0; - v35_hvarea_other.fx(j,ac_sub) = 0; -elseif s35_hvarea = 1, - v35_hvarea_secdforest.fx(j,ac_sub) = (v35_secdforest.l(j,ac_sub) - v35_secdforest.lo(j,ac_sub))*s35_hvarea_secdforest*m_timestep_length_forestry; - v35_hvarea_primforest.fx(j) = (vm_land.l(j,"primforest") - vm_land.lo(j,"primforest"))*s35_hvarea_primforest*m_timestep_length_forestry; - v35_hvarea_other.fx(j,ac_sub) = (v35_other.l(j,ac_sub) - v35_other.lo(j,ac_sub))*s35_hvarea_other*m_timestep_length_forestry; -); diff --git a/modules/35_natveg/dynamic_feb21/realization.gms b/modules/35_natveg/dynamic_feb21/realization.gms deleted file mode 100644 index 8f357c35db..0000000000 --- a/modules/35_natveg/dynamic_feb21/realization.gms +++ /dev/null @@ -1,44 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -*' @description In the dynamic_feb21 realization, land and carbon stock dynamics -*' of natural vegetation are modeled endogenously. -*' The initial spatial distribution of the sub-land-types primary forest, -*' secondary forest and other natural land is based on the -*' LUH2 data set [@hurtt2018luh2]. -*' This realization also includes national policies implemented (NPI) and nationally -*' determined contributions to the Paris agreement (NDC) with regard to forest and other -*' land protection. The NPI/NDC polices ramp up until 2030 and are assumed constant -*' thereafter. NPI/NDC land conservation polices are applied on forest and other land, -*' depending on individual country reports. The NPI/NDC policies are treated as minimum -*' constraints and therefore are non-additive, if the land protection targets as provided by -*' the module `22_land_conservation` and the interface `pm_land_conservation` are larger. -*' Additionally, this module includes forest damage and provides the ability to -*' harvest natural vegetation for timber. Both wood and woodfuel can be produceed -*' from primary and secondary forest but other land is only allowed to be harvested -*' for woodfuel. -*' @stop - -*' -*' @limitations Initialization of both primary and secondary forest in highest -*' age class or equal distrivution of such areas in all age classes. Data exists -*' on a more emperically obtained distribution in different age classes based -*' on satellite data but this results is highly negative land-use change emissions. -*' Inclusion of this data in MAgPIE remains work in progess and is not available for release yet. -*' Additionally, in this module realization, harvested secondary forest stays -*' secondary forest and harvested primary forest is reclassified as secondary forest. - -*####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/35_natveg/dynamic_feb21/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/35_natveg/dynamic_feb21/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/35_natveg/dynamic_feb21/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/35_natveg/dynamic_feb21/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/35_natveg/dynamic_feb21/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/35_natveg/dynamic_feb21/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/35_natveg/dynamic_feb21/presolve.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/35_natveg/dynamic_feb21/postsolve.gms" -*######################## R SECTION END (PHASES) ############################### diff --git a/modules/35_natveg/dynamic_feb21/scaling.gms b/modules/35_natveg/dynamic_feb21/scaling.gms deleted file mode 100644 index c4a52d9d82..0000000000 --- a/modules/35_natveg/dynamic_feb21/scaling.gms +++ /dev/null @@ -1,8 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -vm_cost_hvarea_natveg.scale(i)$(s35_hvarea = 1 OR s35_hvarea = 2) = 10e4; diff --git a/modules/35_natveg/dynamic_feb21/sets.gms b/modules/35_natveg/dynamic_feb21/sets.gms deleted file mode 100644 index 0ad78e215c..0000000000 --- a/modules/35_natveg/dynamic_feb21/sets.gms +++ /dev/null @@ -1,28 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - -sets - - driver_source Source of deforestation drivers - / overall, deforestation, shifting_agriculture, - forestry, wildfire, urbanization / - - combined_loss(driver_source) Combined loss from fire plus agriculture - / shifting_agriculture,wildfire / - - pol35 Land protection policy - / none, npi, ndc / - - pol_stock35 Land types for land protection policies - / forest, other / - - - shock_scen Scenario name of forest carbon shock - / none, 002lin2030,004lin2030,008lin2030,016lin2030 - / - -; diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index d34e40abed..632fd26e8b 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -20,6 +20,7 @@ parameters p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) p35_max_forest_recovery(j) Forest recovery potential (mio. ha) + p35_forest_recovery_shr(j) Forest share in the regeneration of natural vegetation (1) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index a2560d0121..4ea85ba88e 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -177,38 +177,31 @@ q35_hvarea_other(j2,ac_sub).. q35_secdforest_regeneration(j2).. sum(ac_est, v35_secdforest(j2,ac_est)) - =g= + =e= sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + v35_hvarea_primforest(j2) + p35_land_restoration(j2,"secdforest") + + sum(land_ag, vm_lu_transitions(j2,land_ag,"other")) * p35_forest_recovery_shr(j2) + + vm_lu_transitions(j2,"forestry","secdforest") ; -*' The upper bound for the new establishment of forested areas is given -*' by the harvested area plus the remaining potential forest area, which is derived -*' from the potential natural forest area in each cluster. - -q35_max_secdforest_regeneration(j2).. - sum(ac_est, v35_secdforest(j2,ac_est)) - =l= - + sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) - + v35_hvarea_primforest(j2) - + p35_max_forest_recovery(j2) - ; +*' The constraint for forest establishment is given by the +*' remaining potential forest area, which was calculated based +*' on the potential natural forest area in each cluster. -*' Forestry establishment is also constrained by the remaining potential forest area. q35_max_foresty_expansion(j2).. - sum(type32, vm_landexpansion_forestry(j2,type32)) + sum(land_forest, vm_landexpansion(j2,land_forest)) =l= p35_max_forest_recovery(j2) ; - *' Harvested other land is still considered other land q35_other_regeneration(j2).. sum(ac_est, v35_other(j2,ac_est)) =g= sum(ac_sub,v35_hvarea_other(j2,ac_sub)) + + sum(land_ag, vm_lu_transitions(j2,land_ag,"other")) * (1 - p35_forest_recovery_shr(j2)) ; *' The following two constraints distribute additions to secdforest and other land diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 68c9aff345..5346fb9187 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -83,6 +83,11 @@ pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); p35_max_forest_recovery(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; +* The forest recovery share is given by the relation between the forest recovery potential +* and the agricultural land area of the previous time step. +p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / sum(land_ag, pcm_land(j,land_ag)); +p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; + * ------------------------------------- * Set bounds based on land conservation * ------------------------------------- From ff4ec9a6b33d4b31910b810dfab331b599759490 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 3 May 2024 17:25:47 +0200 Subject: [PATCH 132/259] fixes --- config/default.cfg | 4 ++-- main.gms | 2 +- modules/35_natveg/module.gms | 1 - modules/35_natveg/pot_forest_may24/declarations.gms | 12 ++++++------ modules/35_natveg/pot_forest_may24/equations.gms | 2 +- modules/35_natveg/pot_forest_may24/postsolve.gms | 4 ++++ 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index f9e8df050c..38a31515cf 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -935,8 +935,8 @@ cfg$gms$c34_urban_scenario <- "SSP2" # def = SSP2 # ***--------------------- 35_natveg -------------------------------------- # * 35_natveg includes primforest, secdforest and other land -# * (dynamic_feb21): Dynamic natural vegetation land with detailed age-classes -cfg$gms$natveg <- "dynamic_feb21" # def = dynamic_feb21 +# * (pot_forest_may24): Dynamic natural vegetation land with detailed age-classes +cfg$gms$natveg <- "pot_forest_may24" # def = pot_forest_may24 # Avoided Deforestation policy # * ("none"): no avoided deforestation diff --git a/main.gms b/main.gms index 413135031c..92a3122af6 100644 --- a/main.gms +++ b/main.gms @@ -255,7 +255,7 @@ $setglobal past endo_jun13 $setglobal forestry dynamic_feb21 $setglobal urban exo_nov21 -$setglobal natveg dynamic_feb21 +$setglobal natveg pot_forest_may24 $setglobal employment exo_may22 $setglobal labor_prod off diff --git a/modules/35_natveg/module.gms b/modules/35_natveg/module.gms index ad5f60d91d..8a39eecaa9 100644 --- a/modules/35_natveg/module.gms +++ b/modules/35_natveg/module.gms @@ -17,6 +17,5 @@ *' @authors Florian Humpenöder, Abhijeet Mishra, Patrick v. Jeetze *###################### R SECTION START (MODULETYPES) ########################## -$Ifi "%natveg%" == "dynamic_feb21" $include "./modules/35_natveg/dynamic_feb21/realization.gms" $Ifi "%natveg%" == "pot_forest_may24" $include "./modules/35_natveg/pot_forest_may24/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 632fd26e8b..5e08255b8e 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -49,10 +49,9 @@ equations q35_secdforest_expansion(j) Secdforest reduction (mio. ha) q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) - q35_secdforest_regeneration(j) Secondary forest remains secondary forest (mio. ha) - q35_max_secdforest_regeneration(j) Maximum secdforest regeneration (mio. ha) - q35_max_foresty_expansion(j) Maximum forestry regeneration based on potential forest area (mio. ha) - q35_other_regeneration(j) Other land remains other land (mio. ha) + q35_secdforest_regeneration(j) Secondary forest regeneration (mio. ha) + q35_max_forest_expansion(j) Maximum forestry regeneration based on potential forest area (mio. ha) + q35_other_regeneration(j) Other land regeneration (mio. ha) q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) q35_hvarea_other(j,ac) Harvested area other land (mio. ha) @@ -113,8 +112,9 @@ parameters oq35_secdforest_expansion(t,j,type) Secdforest reduction (mio. ha) oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) - oq35_secdforest_regeneration(t,j,type) Secondary forest remains secondary forest (mio. ha) - oq35_other_regeneration(t,j,type) Other land remains other land (mio. ha) + oq35_secdforest_regeneration(t,j,type) Secondary forest regeneration (mio. ha) + oq35_max_forest_expansion(t,j,type) Maximum forestry regeneration based on potential forest area (mio. ha) + oq35_other_regeneration(t,j,type) Other land regeneration (mio. ha) oq35_other_est(t,j,ac,type) Distribution of other land additions over ac_est (mio. ha) oq35_secdforest_est(t,j,ac,type) Distribution of secdforest additions over ac_est (mio. ha) oq35_hvarea_other(t,j,ac,type) Harvested area other land (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 4ea85ba88e..6657d8e7f9 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -189,7 +189,7 @@ q35_secdforest_regeneration(j2).. *' remaining potential forest area, which was calculated based *' on the potential natural forest area in each cluster. -q35_max_foresty_expansion(j2).. +q35_max_forest_expansion(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= p35_max_forest_recovery(j2) diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index 41f427750b..859c858748 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -39,6 +39,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.m(j); + oq35_max_forest_expansion(t,j,"marginal") = q35_max_forest_expansion.m(j); oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); oq35_other_est(t,j,ac,"marginal") = q35_other_est.m(j,ac); oq35_secdforest_est(t,j,ac,"marginal") = q35_secdforest_est.m(j,ac); @@ -80,6 +81,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.l(j); + oq35_max_forest_expansion(t,j,"level") = q35_max_forest_expansion.l(j); oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); oq35_other_est(t,j,ac,"level") = q35_other_est.l(j,ac); oq35_secdforest_est(t,j,ac,"level") = q35_secdforest_est.l(j,ac); @@ -121,6 +123,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.up(j); + oq35_max_forest_expansion(t,j,"upper") = q35_max_forest_expansion.up(j); oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); oq35_other_est(t,j,ac,"upper") = q35_other_est.up(j,ac); oq35_secdforest_est(t,j,ac,"upper") = q35_secdforest_est.up(j,ac); @@ -162,6 +165,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.lo(j); + oq35_max_forest_expansion(t,j,"lower") = q35_max_forest_expansion.lo(j); oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); oq35_other_est(t,j,ac,"lower") = q35_other_est.lo(j,ac); oq35_secdforest_est(t,j,ac,"lower") = q35_secdforest_est.lo(j,ac); From ab85d32c09631d58e4aecdc27e39c81898fd7a4a Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 3 May 2024 17:43:18 +0200 Subject: [PATCH 133/259] land_agfo set not needed --- core/sets.gms | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/sets.gms b/core/sets.gms index 041abb63b3..5ee0ef2fe4 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -247,9 +247,6 @@ sets land_ag(land) Agricultural land pools / crop, past / - land_agfo(land) Agricultural and forestry land - / crop, past, forestry / - land_timber(land) land from which timber can be taken away / forestry, primforest, secdforest, other / From 6f70949254069713bdcdc7ea2a9148d58de36999 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Wed, 8 May 2024 13:44:25 +0200 Subject: [PATCH 134/259] added decomposition of diet scenarios for BAU to Deep Dive script --- .../start/projects/project_EAT2p0_DeepDive.R | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 1ae5541373..13c3a25c51 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -191,14 +191,33 @@ start_run(cfg, codeCheck = FALSE) # BAU + EL2-Diet # # Decomposition scenario. # Globally achieves EL2 (Diet+Waste+Prod) by 2050 +cfg$title <- "BAU_PHD" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +cfg <- bau(cfg = cfg) +cfg <- diet(cfg = cfg) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + cfg$title <- "BAU_Diet" cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +cfg$title <- "BAU_Prod" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +cfg <- bau(cfg = cfg) cfg <- prod(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +cfg$title <- "BAU_Waste" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +cfg <- bau(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) + # BAU + Bioenergy # # Decomposition Scenario. Adds bioenergy demand from coupled run with land-use policies consistent with 1.5C by 2050 to BAU cfg$title <- "BAU_Bioenergy" From 2267a4425a4172f93019e77236e04f77b7467f02 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Wed, 8 May 2024 18:48:40 +0200 Subject: [PATCH 135/259] new fader implementation in 15_food module --- config/default.cfg | 35 +++++--- main.gms | 36 ++++----- .../15_food/anthro_iso_jun22/declarations.gms | 22 +++-- modules/15_food/anthro_iso_jun22/input.gms | 80 +++++++++---------- modules/15_food/anthro_iso_jun22/preloop.gms | 67 +++++++++++++--- .../anthropometrics_jan18/declarations.gms | 22 +++-- .../15_food/anthropometrics_jan18/input.gms | 73 +++++++---------- .../15_food/anthropometrics_jan18/preloop.gms | 68 ++++++++++++---- 8 files changed, 246 insertions(+), 157 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 8cb29833e9..16fb199815 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -98,7 +98,7 @@ cfg$calib_accuracy_landconversion_cost <- 0.05 # def = 0.05 cfg$calib_maxiter_landconversion_cost <- 40 # def = 40 # Restart from existing calibration factors (TRUE or FALSE) cfg$restart_landconversion_cost <- FALSE # def = FALSE -# Number of lowpass filter iterations applied on calibration factors +# Number of lowpass filter iterations applied on calibration factors # for time steps 1995-2015 cfg$lowpass_filter_landconversion_cost <- 1 # def= 1 # Set upper limit for cropland calibration factor @@ -386,12 +386,17 @@ cfg$gms$s15_milk_share_fadeout_india <- 1 # def = 1 # * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, # * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, # * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 -cfg$gms$c15_rumscen <- "constant" # def = constant -cfg$gms$c15_fishscen <- "constant" # def = constant -cfg$gms$c15_alcscen <- "constant" # def = constant -cfg$gms$c15_livescen <- "constant" # def = constant -cfg$gms$c15_rumdairy_scp_scen <- "constant" # def = constant -cfg$gms$c15_rumdairyscen <- "constant" # def = constant +cfg$gms$s15_ruminant_substitution <- 0 # def = 0 +cfg$gms$s15_fish_substitution <- 0 # def = 0 +cfg$gms$s15_alcohol_substitution <- 0 # def = 0 +cfg$gms$s15_livestock_substitution <- 0 # def = 0 +cfg$gms$s15_rumdairy_scp_substitution <- 0 # def = 0 +cfg$gms$s15_rumdairy_substitution <- 0 # def = 0 + +cfg$gms$s15_subst_functional_form <- 1 # def = 1 + +cfg$gms$s15_food_substitution_start <- 2025 # def = 2025 +cfg$gms$s15_food_substitution_target <- 2050 # def = 2050 # * Set items of kfo_rd. This option allows for sensitivity scenarios. # * kfo_rd is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen (see above) @@ -403,7 +408,7 @@ cfg$gms$kfo_rd <- "livst_rum" #def = livst_rum cfg$gms$s15_kcal_pc_livestock_intake_target <- "430" # def = 430 # * choice temporal fade-out towards s15_kcal_pc_livestock_intake_target # * options: constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70 -cfg$gms$c15_livescen_target <- "constant" # def = constant +cfg$gms$s15_livescen_target <- 0 # def = constant # * fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) # * options: 0 (=fade-out), 1 (=substitution) cfg$gms$s15_livescen_target_subst <- 1 # def = 1 @@ -499,10 +504,9 @@ cfg$gms$s15_alc_scen <- 0 # def = 0 # * Default: all iso countries cfg$gms$scen_countries15 <- all_iso_countries # -# * Transition to exogenous food intake and waste scenarios including functional forms, targets -# * and transition periods (applied after the food demand model is executed). The resulting scenario -# * parametrisation is a linear combination of the default MAgPIE parametrisation and the exogenous -# * scenario data input. +# * Transition to exogenous food intake and waste scenarios (applied after the food demand model is executed). +# * The resulting scenario parametrisation is a linear combination of the default MAgPIE parametrisation and +# * the exogenous scenario data input. # * Options consist of 3 parts: functional form (lin, sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc; # * pc: percent) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050). # * The target defines the relative contribution of the default MAgPIE parametrisation, e.g. zero @@ -513,7 +517,12 @@ cfg$gms$scen_countries15 <- all_iso_countries # * For the full list of available options, see information on food substitution scenarios above. # * Only active if at least one of the exogenous food intake and waste scenario # * switches (s15_exo_diet and s15_exo_waste) is set to 1. -cfg$gms$c15_exo_foodscen <- "lin_zero_20_50" # def = lin_zero_20_50 +cfg$gms$s15_exo_foodscen_convergence <- 1 # def = 1 + +cfg$gms$s15_exo_foodscen_functional_form <- 1 # def = 1 + +cfg$gms$s15_exo_foodscen_start <- 2025 # def = 2025 +cfg$gms$s15_exo_foodscen_target <- 2050 # def = 2050 # ***** End configuration of exogenous food intake and waste scenarios ***** diff --git a/main.gms b/main.gms index 413135031c..ad9fed999d 100644 --- a/main.gms +++ b/main.gms @@ -148,25 +148,25 @@ $title magpie *##################### R SECTION START (VERSION INFO) ########################## * -* Used data set: rev4.99_h12_magpie.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* Used data set: rev4.104_h12_magpie.tgz +* md5sum: 533c0a589c7f5d5cf40bab6ec2297640 +* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public * -* Used data set: rev4.99_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz +* md5sum: c2036af336688758ffd4cb03c2d1a05c +* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public * -* Used data set: rev4.99_h12_validation.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* Used data set: rev4.104_h12_validation.tgz +* md5sum: 4b222cbca5f2134ce378e3838f7cd0d5 +* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public * -* Used data set: additional_data_rev4.47.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive +* Used data set: additional_data_rev4.48.tgz +* md5sum: 0788a1d39cab12f89a9411c2636bffc7 +* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public * -* Used data set: calibration_H12_per_ton_fao_may22_glo_08Aug23.tgz -* md5sum: NA -* Repository: https://rse.pik-potsdam.de/data/magpie/public +* Used data set: calibration_H12_26Mar24.tgz +* md5sum: d295e7ff0c65d97c1e0b84c440d0056b +* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public * * Low resolution: c200 * High resolution: 0.5 @@ -179,11 +179,11 @@ $title magpie * * Regionscode: 62eff8f7 * -* Regions data revision: 4.99 +* Regions data revision: 4.104 * * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 -* * Revision: 4.99 +* * Revision: 4.104 * * aggregation settings: * * Input resolution: 0.5 @@ -195,7 +195,7 @@ $title magpie * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) * * -* Last modification (input data): Wed Feb 7 15:35:14 2024 +* Last modification (input data): Wed May 8 14:54:42 2024 * *###################### R SECTION END (VERSION INFO) ########################### diff --git a/modules/15_food/anthro_iso_jun22/declarations.gms b/modules/15_food/anthro_iso_jun22/declarations.gms index ee0b45cf4e..b5ced7926f 100644 --- a/modules/15_food/anthro_iso_jun22/declarations.gms +++ b/modules/15_food/anthro_iso_jun22/declarations.gms @@ -63,13 +63,21 @@ scalars parameters * technical - p15_modelstat(t) Model solver status (1) - p15_iteration_counter(t) Number of iterations required for reaching an equilibrium between food demand model and magpie (1) - p15_convergence_measure(t,iter15) Convergence measure to decide for continuation or stop of food_demand - magpie iteration (1) - i15_dem_intercept(iso,regr15) Food regression parameters intercept in kcal or as share (X) - i15_dem_saturation(iso,regr15) Food regression parameters saturation in kcal or as share (X) - i15_dem_halfsat(iso,regr15) Food regression parameters halfsaturation (USD05PPP per cap) - i15_dem_nonsat(iso,regr15) Food regression parameters nonsaturation (1) + p15_modelstat(t) Model solver status (1) + p15_iteration_counter(t) Number of iterations required for reaching an equilibrium between food demand model and magpie (1) + p15_convergence_measure(t,iter15) Convergence measure to decide for continuation or stop of food_demand - magpie iteration (1) + i15_dem_intercept(iso,regr15) Food regression parameters intercept in kcal or as share (X) + i15_dem_saturation(iso,regr15) Food regression parameters saturation in kcal or as share (X) + i15_dem_halfsat(iso,regr15) Food regression parameters halfsaturation (USD05PPP per cap) + i15_dem_nonsat(iso,regr15) Food regression parameters nonsaturation (1) + p15_ruminant_subst_fader(t_all) Ruminant meat substitution fader (1) + p15_fish_subst_fader(t_all) Fish substitution fader (1) + p15_alcohol_subst_fader(t_all) Alcohol substitution fader (1) + p15_livestock_subst_fader(t_all) Livestock substitution fader (1) + p15_rumdairy_subst_fader(t_all) Ruminant and dairy substitution fader (1) + p15_rumdairy_scp_subst_fader(t_all) Ruminant and dairy substitution with SCP fader (1) + p15_livestock_threshold_subst_fader(t_all) Fader for livestock threshold target (1) + p15_exo_food_scenario_fader(t_all) Exogenous diet scenario fader (1) *prices p15_prices_kcal(t,iso,kfo,iter15) Prices from MAgPIE after optimization (USD05PPP per kcal) diff --git a/modules/15_food/anthro_iso_jun22/input.gms b/modules/15_food/anthro_iso_jun22/input.gms index fd6287bb48..a1a59d53cd 100644 --- a/modules/15_food/anthro_iso_jun22/input.gms +++ b/modules/15_food/anthro_iso_jun22/input.gms @@ -77,48 +77,54 @@ $onMultiR set kfo_rd(kfo) Ruminant meat and dairy food products / livst_rum /; $offMulti -scalar s15_elastic_demand Elastic demand switch (1=elastic 0=exogenous) (1) / 0 /; - -scalar s15_calibrate Calibration switch (1=calibrated 0=pure regression outcomes) (1) / 1 /; +scalars +s15_elastic_demand Elastic demand switch (1=elastic 0=exogenous) (1) / 0 / +s15_calibrate Calibration switch (1=calibrated 0=pure regression outcomes) (1) / 1 / * only for per-capita calories, not for e.g. calibration of transformation parameters between per-capita calories in dm - -scalar s15_maxiter Scalar defining maximum number of iterations (1) / 5 /; - -scalar s15_convergence Convergence criterion (1) / 0.005 /; +s15_maxiter Scalar defining maximum number of iterations (1) / 5 / +s15_convergence Convergence criterion (1) / 0.005 / * maximum relative per-capita gdp difference within a region between two iteratios - -scalar s15_exo_waste Switch for transition towards exogenous food waste scenario (1) / 0 /; - -scalar s15_waste_scen Scenario target for the ratio between food demand and intake (1) / 1.2 /; - -scalar s15_exo_diet Switch for transition towards exogenous diet scenario (1) / 0 /; +s15_exo_waste Switch for transition towards exogenous food waste scenario (1) / 0 / +s15_waste_scen Scenario target for the ratio between food demand and intake (1) / 1.2 / +s15_exo_diet Switch for transition towards exogenous diet scenario (1) / 0 / * The following switches only become active when s15_exo_diet is active * They define which components of the diet should become active * If the switch is set to 1,the exogenous diets are activated. * For all other settings (!=1), the endogenous estimate is used. * When activating a target, total calories are always preserved via scaling of staples -scalar s15_exo_monogastric Exogenous EAT Lancet animal product target on (1) / 1 /; -scalar s15_exo_ruminant Exogenous EAT Lancet animal product target on (1) / 1 /; -scalar s15_exo_fish Exogenous EAT Lancet animal product target on (1) / 1 /; -scalar s15_exo_fruitvegnut Exogenous EAT Lancet fruit vegetable nut seeds target on (1) / 1 /; -scalar s15_exo_roots Exogenous EAT Lancet root target on (1) / 1 /; -scalar s15_exo_pulses Exogenous pulses target on (1) / 1 /; -scalar s15_exo_sugar Exogenous sugar target on (1) / 1 /; -scalar s15_exo_oils Exogenous oils (1) / 1 /; -scalar s15_exo_brans Exogenous brans (1) / 0 /; -scalar s15_exo_scp Exogenous microbial protein target on (1) / 1 /; +s15_exo_monogastric Exogenous EAT Lancet animal product target on (1) / 1 / +s15_exo_ruminant Exogenous EAT Lancet animal product target on (1) / 1 / +s15_exo_fish Exogenous EAT Lancet animal product target on (1) / 1 / +s15_exo_fruitvegnut Exogenous EAT Lancet fruit vegetable nut seeds target on (1) / 1 / +s15_exo_roots Exogenous EAT Lancet root target on (1) / 1 / +s15_exo_pulses Exogenous pulses target on (1) / 1 / +s15_exo_sugar Exogenous sugar target on (1) / 1 / +s15_exo_oils Exogenous oils (1) / 1 / +s15_exo_brans Exogenous brans (1) / 0 / +s15_exo_scp Exogenous microbial protein target on (1) / 1 / * The EAT-Lancet diet only allows for added sugars, but does not include processed food or * alcohol. Via 's15_alc_scen' a maximum target for alcohol consumption can be defined. -scalar s15_exo_alcohol Exogenous alcohol target on (1) / 1 /; -scalar s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 /; - -scalar s15_rum_share_fadeout_india_strong switch for stronger ruminant fadeout in India (binary) / 1 /; - -scalar s15_milk_share_fadeout_india switch for milk fadeout in India (binary) / 1 /; - -scalar s15_kcal_pc_livestock_intake_target target for livestock intake (kcal per cap per day) / 430 /; - -scalar s15_livescen_target_subst fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 /; +s15_exo_alcohol Exogenous alcohol target on (1) / 1 / +s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 / +s15_rum_share_fadeout_india_strong Switch for stronger ruminant fadeout in India (binary) / 1 / +s15_milk_share_fadeout_india Switch for milk fadeout in India (binary) / 1 / +s15_kcal_pc_livestock_intake_target Target for livestock intake (kcal per cap per day) / 430 / +s15_livescen_target_subst Fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 / +s15_subst_functional_form Switch for functional form of substitution fader (1) / 1 / +s15_food_substitution_start Food substitution start year / 2025 / +s15_food_substitution_target Food substitution target year / 2050 / +s15_ruminant_substitution Ruminant substitution share (1) / 0 / +s15_fish_substitution Fish substitution share (1) / 0 / +s15_alcohol_substitution Alcohol substitution share (1) / 0 / +s15_livestock_substitution Livestock substitution share (1) / 0 / +s15_rumdairy_substitution Ruminant meat and dairy substitution share (1) / 0 / +s15_rumdairy_scp_substitution Ruminant meat and dairy substitution with SCP share (1) / 0 / +s15_livescen_target Switch for livestock intake target (1) / 0 / +s15_exo_foodscen_functional_form Switch for functional form of exogenous food scenario fader (1) / 1 / +s15_exo_food_scenario_start Food substitution start year / 2025 / +s15_exo_food_scenario_target Food substitution target year / 2050 / +s15_exo_foodscen_convergence Convergence to exogenous food scenario (1) / 1 / +; table f15_household_balanceflow(t_all,i,kall,dm_ge_nr) Balance flow to take account of heterogeneous products and processes (mio. tDM) $ondelim @@ -231,14 +237,6 @@ $include "./modules/15_food/input/f15_schofield_parameters.cs3" $offdelim ; -*** Food substitution scenarios - -table f15_food_substitution_fader(t_all,fadeoutscen15) Fader for food substitution scenarios (1) -$ondelim -$include "./modules/15_food/input/f15_food_substitution_fader.csv" -$offdelim; - - *** Exogenous food demand scenarios table f15_intake_EATLancet(t_scen15,iso,kcal_scen15,EAT_scen15,kfo) EAT Lancet scenarios for food specific intake (kcal per capita per day) diff --git a/modules/15_food/anthro_iso_jun22/preloop.gms b/modules/15_food/anthro_iso_jun22/preloop.gms index dffa33f8be..873fe5f7c5 100644 --- a/modules/15_food/anthro_iso_jun22/preloop.gms +++ b/modules/15_food/anthro_iso_jun22/preloop.gms @@ -61,34 +61,79 @@ Elseif s15_milk_share_fadeout_india = 1, p15_country_dummy(iso) = 0; p15_country_dummy(scen_countries15) = 1; +** The following lines define scenario faders for substituting different food groups +* If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. +* If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. +if (s15_subst_functional_form = 1, + + m_linear_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); + m_linear_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); + m_linear_time_interpol(p15_alcohol_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_alcohol_substitution); + m_linear_time_interpol(p15_livestock_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_livestock_substitution); + m_linear_time_interpol(p15_rumdairy_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_rumdairy_substitution); + m_linear_time_interpol(p15_rumdairy_scp_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0, s15_rumdairy_scp_substitution); + if(s15_livescen_target = 1, + m_linear_time_interpol(p15_livestock_threshold_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,1); + else + p15_livestock_threshold_subst_fader(t) = 0; + ); + +elseif s15_subst_functional_form = 2, + + m_sigmoid_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); + m_sigmoid_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); + m_sigmoid_time_interpol(p15_alcohol_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_alcohol_substitution); + m_sigmoid_time_interpol(p15_livestock_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_livestock_substitution); + m_sigmoid_time_interpol(p15_rumdairy_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_rumdairy_substitution); + m_sigmoid_time_interpol(p15_rumdairy_scp_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0, s15_rumdairy_scp_substitution); + if(s15_livescen_target = 1, + m_sigmoid_time_interpol(p15_livestock_threshold_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,1); + else + p15_livestock_threshold_subst_fader(t) = 0; + ); + +); + + * Food substitution scenarios including functional forms, targets and transition periods -i15_ruminant_fadeout(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_rumscen%")); -i15_fish_fadeout(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_fishscen%")); -i15_alcohol_fadeout(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_alcscen%")); -i15_livestock_fadeout(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_livescen%")); -i15_rumdairy_fadeout(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_rumdairyscen%")); -i15_rumdairy_scp_fadeout(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_rumdairy_scp_scen%")); -i15_livestock_fadeout_threshold(t,iso) = 1 - p15_country_dummy(iso)*(1-f15_food_substitution_fader(t,"%c15_livescen_target%")); +i15_ruminant_fadeout(t,iso) = 1 - p15_country_dummy(iso)*p15_ruminant_subst_fader(t); +i15_fish_fadeout(t,iso) = 1 - p15_country_dummy(iso)*p15_fish_subst_fader(t); +i15_alcohol_fadeout(t,iso) = 1 - p15_country_dummy(iso)*p15_alcohol_subst_fader(t); +i15_livestock_fadeout(t,iso) = 1 - p15_country_dummy(iso)*p15_livestock_subst_fader(t); +i15_rumdairy_fadeout(t,iso) = 1 - p15_country_dummy(iso)*p15_rumdairy_subst_fader(t); +i15_rumdairy_scp_fadeout(t,iso) = 1 - p15_country_dummy(iso)*p15_rumdairy_scp_subst_fader(t); +i15_livestock_fadeout_threshold(t,iso) = 1 - p15_country_dummy(iso)*p15_livestock_threshold_subst_fader(t); +** The following lines define the scenario fader for the exogeneous food scenario +* If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. +* If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. +if (s15_exo_foodscen_functional_form = 1, + m_linear_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + +elseif s15_exo_foodscen_functional_form = 2, + m_sigmoid_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + +); + * Exogenous food intake and waste scenarios including functional forms, targets and transition periods -i15_exo_foodscen_fader(t,iso) = (1-f15_food_substitution_fader(t,"%c15_exo_foodscen%")) * p15_country_dummy(iso); +i15_exo_foodscen_fader(t,iso) = p15_exo_food_scenario_fader(t) * p15_country_dummy(iso); * Select from the data set of EAT Lancet scenarios the target years that are * consistent with the target year of the fader: -$ifthen "%c15_exo_foodscen%" == "lin_zero_20_30" +if(s15_exo_food_scenario_target = 2030, i15_intake_EATLancet_all(iso,kcal_scen15,EAT_scen15,kfo) = f15_intake_EATLancet("y2030",iso,kcal_scen15,EAT_scen15,kfo); *extra condition to see if India diet scenario has been selected if (s15_exo_diet = 2, i15_intake_EATLancet_all(iso,kcal_scen15,EAT_scen15,kfo) = f15_intake_NIN("y2030",iso,kcal_scen15,EAT_scen15,kfo); ); -$else +else i15_intake_EATLancet_all(iso,kcal_scen15,EAT_scen15,kfo) = f15_intake_EATLancet("y2050",iso,kcal_scen15,EAT_scen15,kfo); if (s15_exo_diet = 2, i15_intake_EATLancet_all(iso,kcal_scen15,EAT_scen15,kfo) = f15_intake_NIN("y2050",iso,kcal_scen15,EAT_scen15,kfo); ); -$endif +); * initial prices in $US per Kcal i15_prices_initial_kcal(iso,kfo)$(fm_nutrition_attributes("y1995",kfo,"kcal")>0) = f15_prices_initial(kfo) diff --git a/modules/15_food/anthropometrics_jan18/declarations.gms b/modules/15_food/anthropometrics_jan18/declarations.gms index 36498d14f3..9e9b66bacf 100644 --- a/modules/15_food/anthropometrics_jan18/declarations.gms +++ b/modules/15_food/anthropometrics_jan18/declarations.gms @@ -66,13 +66,21 @@ scalars parameters * technical - p15_modelstat(t) Model solver status (1) - p15_iteration_counter(t) Number of iterations required for reaching an equilibrium between food demand model and magpie (1) - p15_convergence_measure(t,iter15) Convergence measure to decide for continuation or stop of food_demand - magpie iteration (1) - i15_dem_intercept(iso,regr15) Food regression parameters intercept in kcal or as share (X) - i15_dem_saturation(iso,regr15) Food regression parameters saturation in kcal or as share (X) - i15_dem_halfsat(iso,regr15) Food regression parameters halfsaturation (USD05PPP per cap) - i15_dem_nonsat(iso,regr15) Food regression parameters nonsaturation (1) + p15_modelstat(t) Model solver status (1) + p15_iteration_counter(t) Number of iterations required for reaching an equilibrium between food demand model and magpie (1) + p15_convergence_measure(t,iter15) Convergence measure to decide for continuation or stop of food_demand - magpie iteration (1) + i15_dem_intercept(iso,regr15) Food regression parameters intercept in kcal or as share (X) + i15_dem_saturation(iso,regr15) Food regression parameters saturation in kcal or as share (X) + i15_dem_halfsat(iso,regr15) Food regression parameters halfsaturation (USD05PPP per cap) + i15_dem_nonsat(iso,regr15) Food regression parameters nonsaturation (1) + p15_ruminant_subst_fader(t_all) Ruminant meat substitution fader (1) + p15_fish_subst_fader(t_all) Fish substitution fader (1) + p15_alcohol_subst_fader(t_all) Alcohol substitution fader (1) + p15_livestock_subst_fader(t_all) Livestock substitution fader (1) + p15_rumdairy_subst_fader(t_all) Ruminant and dairy substitution fader (1) + p15_rumdairy_scp_subst_fader(t_all) Ruminant and dairy substitution with SCP fader (1) + p15_livestock_threshold_subst_fader(t_all) Fader for livestock threshold target (1) + p15_exo_food_scenario_fader(t_all) Exogenous diet scenario fader (1) *prices p15_prices_kcal(t,iso,kfo,iter15) Prices from MAgPIE after optimization (USD05PPP per kcal) diff --git a/modules/15_food/anthropometrics_jan18/input.gms b/modules/15_food/anthropometrics_jan18/input.gms index b8484fdf27..86f87ae375 100644 --- a/modules/15_food/anthropometrics_jan18/input.gms +++ b/modules/15_food/anthropometrics_jan18/input.gms @@ -18,21 +18,6 @@ $setglobal c15_calibscen constant $setglobal c15_rum_share mixed * options: constant, halving2050, mixed -* Fader for food substitution scenarios and exogenous food intake and waste -* scenarios including functional forms, targets and transition periods -* options: constant, -* lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, -* lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, -* lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 -$setglobal c15_rumscen constant -$setglobal c15_fishscen constant -$setglobal c15_alcscen constant -$setglobal c15_livescen constant -$setglobal c15_rumdairyscen constant -$setglobal c15_rumdairy_scp_scen constant -$setglobal c15_livescen_target constant -$setglobal c15_exo_foodscen lin_zero_20_50 - $setglobal c15_kcal_scen healthy_BMI * options: healthy_BMI, 2100kcal, 2500kcal @@ -74,31 +59,36 @@ $onMultiR set kfo_rd(kfo) Ruminant meat and dairy food products / livst_rum /; $offMulti -scalar s15_elastic_demand Elastic demand switch (1=elastic 0=exogenous) (1) / 0 /; - -scalar s15_calibrate Calibration switch (1=calibrated 0=pure regression outcomes) (1) / 1 /; +scalars +s15_elastic_demand Elastic demand switch (1=elastic 0=exogenous) (1) / 0 / +s15_calibrate Calibration switch (1=calibrated 0=pure regression outcomes) (1) / 1 / * only for per-capita calories, not for e.g. calibration of transformation parameters between per-capita calories in dm - -scalar s15_maxiter Scalar defining maximum number of iterations (1) / 5 /; - -scalar s15_convergence Convergence criterion (1) / 0.005 /; +s15_maxiter Scalar defining maximum number of iterations (1) / 5 / +s15_convergence Convergence criterion (1) / 0.005 / * maximum relative per-capita gdp difference within a region between two iteratios - -scalar s15_exo_waste Switch for transition towards exogenous food waste scenario (1) / 0 /; - -scalar s15_waste_scen Scenario target for the ratio between food demand and intake (1) / 1.2 /; - -scalar s15_exo_diet Switch for transition towards exogenous diet scenario (1) / 0 /; - -scalar s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 /; - -scalar s15_rum_share_fadeout_india_strong switch for stronger ruminant fadeout in India (binary) / 1 /; - -scalar s15_milk_share_fadeout_india switch for milk fadeout in India (binary) / 1 /; - -scalar s15_kcal_pc_livestock_intake_target target for livestock intake (kcal per cap per day) / 430 /; - -scalar s15_livescen_target_subst fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 /; +s15_exo_waste Switch for transition towards exogenous food waste scenario (1) / 0 / +s15_waste_scen Scenario target for the ratio between food demand and intake (1) / 1.2 / +s15_exo_diet Switch for transition towards exogenous diet scenario (1) / 0 / +s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 / +s15_rum_share_fadeout_india_strong Switch for stronger ruminant fadeout in India (binary) / 1 / +s15_milk_share_fadeout_india Switch for milk fadeout in India (binary) / 1 / +s15_kcal_pc_livestock_intake_target Target for livestock intake (kcal per cap per day) / 430 / +s15_livescen_target_subst Fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 / +s15_subst_functional_form Switch for functional form of substitution fader (1) / 1 / +s15_food_substitution_start Food substitution start year / 2025 / +s15_food_substitution_target Food substitution target year / 2050 / +s15_ruminant_substitution Ruminant substitution share (1) / 0 / +s15_fish_substitution Fish substitution share (1) / 0 / +s15_alcohol_substitution Alcohol substitution share (1) / 0 / +s15_livestock_substitution Livestock substitution share (1) / 0 / +s15_rumdairy_substitution Ruminant meat and dairy substitution share (1) / 0 / +s15_rumdairy_scp_substitution Ruminant meat and dairy substitution with SCP share (1) / 0 / +s15_livescen_target Switch for livestock intake target (1) / 0 / +s15_exo_foodscen_functional_form Switch for functional form of exogenous food scenario fader (1) / 1 / +s15_exo_food_scenario_start Food substitution start year / 2025 / +s15_exo_food_scenario_target Food substitution target year / 2050 / +s15_exo_foodscen_convergence Convergence to exogenous food scenario (1) / 1 / +; table f15_household_balanceflow(t_all,i,kall,dm_ge_nr) Balance flow to take account of heterogeneous products and processes (mio. tDM) $ondelim @@ -211,13 +201,6 @@ $include "./modules/15_food/input/f15_schofield_parameters.cs3" $offdelim ; -*** Food substitution scenarios - -table f15_food_substitution_fader(t_all,fadeoutscen15) Fader for food substitution scenarios (1) -$ondelim -$include "./modules/15_food/input/f15_food_substitution_fader.csv" -$offdelim; - *** Exogenous food demand scenarios diff --git a/modules/15_food/anthropometrics_jan18/preloop.gms b/modules/15_food/anthropometrics_jan18/preloop.gms index 9c3d5ec6be..397fc67770 100644 --- a/modules/15_food/anthropometrics_jan18/preloop.gms +++ b/modules/15_food/anthropometrics_jan18/preloop.gms @@ -61,35 +61,73 @@ Elseif s15_milk_share_fadeout_india = 1, * historical reference period: p15_demand2intake_ratio_ref(i) = 0; - - * Switch to determine countries for which exogenous food scenarios (EAT Lancet diet and * food waste scenarios), and food substitution scenarios shall be applied. * In the default case, the food scenario affects all countries when activated. p15_country_dummy(iso) = 0; p15_country_dummy(scen_countries15) = 1; - * Because MAgPIE is not run at country-level, but at region level, a region * share is calculated that translates the countries' influence to regional level. * Countries are weighted by their population size. p15_foodscen_region_shr(t_all,i) = sum(i_to_iso(i,iso), p15_country_dummy(iso) * im_pop_iso(t_all,iso)) / sum(i_to_iso(i,iso), im_pop_iso(t_all,iso)); -* Food substitution scenarios including functional forms, targets and transition periods -* Note: p15_foodscen_region_shr(t,i) is 1 in the default case) -i15_ruminant_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_rumscen%")); -i15_fish_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_fishscen%")); -i15_alcohol_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_alcscen%")); -i15_livestock_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_livescen%")); -i15_rumdairy_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_rumdairyscen%")); -i15_rumdairy_scp_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_rumdairy_scp_scen%")); -i15_livestock_fadeout_threshold(t,i) = 1 - p15_foodscen_region_shr(t,i)*(1-f15_food_substitution_fader(t,"%c15_livescen_target%")); +** The following lines define scenario faders for substituting different food groups +* If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. +* If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. +if (s15_subst_functional_form = 1, + + m_linear_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); + m_linear_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); + m_linear_time_interpol(p15_alcohol_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_alcohol_substitution); + m_linear_time_interpol(p15_livestock_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_livestock_substitution); + m_linear_time_interpol(p15_rumdairy_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_rumdairy_substitution); + m_linear_time_interpol(p15_rumdairy_scp_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0, s15_rumdairy_scp_substitution); + if(s15_livescen_target = 1, + m_linear_time_interpol(p15_livestock_threshold_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,1); + else + p15_livestock_threshold_subst_fader(t) = 0; + ); + +elseif s15_subst_functional_form = 2, + + m_sigmoid_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); + m_sigmoid_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); + m_sigmoid_time_interpol(p15_alcohol_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_alcohol_substitution); + m_sigmoid_time_interpol(p15_livestock_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_livestock_substitution); + m_sigmoid_time_interpol(p15_rumdairy_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_rumdairy_substitution); + m_sigmoid_time_interpol(p15_rumdairy_scp_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0, s15_rumdairy_scp_substitution); + if(s15_livescen_target = 1, + m_sigmoid_time_interpol(p15_livestock_threshold_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,1); + else + p15_livestock_threshold_subst_fader(t) = 0; + ); + +); +* Food substitution scenarios based on scenario faders +i15_ruminant_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_ruminant_subst_fader(t); +i15_fish_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_fish_subst_fader(t); +i15_alcohol_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_alcohol_subst_fader(t); +i15_livestock_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_livestock_subst_fader(t); +i15_rumdairy_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_rumdairy_subst_fader(t); +i15_rumdairy_scp_fadeout(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_rumdairy_scp_subst_fader(t); +i15_livestock_fadeout_threshold(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_livestock_threshold_subst_fader(t); + +** The following lines define the scenario fader for the exogeneous food scenario +* If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. +* If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. +if (s15_exo_foodscen_functional_form = 1, + m_linear_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + +elseif s15_exo_foodscen_functional_form = 2, + m_sigmoid_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + +); -* Exogenous food intake and waste scenarios including functional forms, targets and transition periods -* Note: p15_foodscen_region_shr(t,i) is 1 in the default case) -i15_exo_foodscen_fader(t,i) = (1-f15_food_substitution_fader(t,"%c15_exo_foodscen%")) * p15_foodscen_region_shr(t,i); +* Multiply regional share of countries (see above) with the scenario fader +i15_exo_foodscen_fader(t,i) = p15_exo_food_scenario_fader(t) * p15_foodscen_region_shr(t,i); * initial prices in $US per Kcal From 0a3ffb6eeae6e48ba1affc033f1cd984e3e049b9 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 9 May 2024 16:49:36 +0200 Subject: [PATCH 136/259] forestryMay24 --- modules/16_demand/sector_may15/sets.gms | 1 + modules/21_trade/selfsuff_reduced/input.gms | 1 + modules/21_trade/selfsuff_reduced/preloop.gms | 3 + .../declarations.gms | 27 +++-- .../equations.gms | 59 +++++----- .../input.gms | 32 ++---- .../postsolve.gms | 28 +++-- .../preloop.gms | 107 ++---------------- .../presolve.gms | 34 +++--- .../realization.gms | 16 +-- .../scaling.gms | 0 .../{dynamic_feb21 => dynamic_may24}/sets.gms | 0 modules/32_forestry/input/files | 3 - modules/32_forestry/module.gms | 2 +- modules/73_timber/default/declarations.gms | 3 +- modules/73_timber/default/preloop.gms | 8 ++ modules/73_timber/default/presolve.gms | 15 ++- 17 files changed, 139 insertions(+), 200 deletions(-) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/declarations.gms (86%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/equations.gms (80%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/input.gms (84%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/postsolve.gms (89%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/preloop.gms (62%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/presolve.gms (83%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/realization.gms (94%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/scaling.gms (100%) rename modules/32_forestry/{dynamic_feb21 => dynamic_may24}/sets.gms (100%) diff --git a/modules/16_demand/sector_may15/sets.gms b/modules/16_demand/sector_may15/sets.gms index bca7e9f565..1e31617a36 100644 --- a/modules/16_demand/sector_may15/sets.gms +++ b/modules/16_demand/sector_may15/sets.gms @@ -30,3 +30,4 @@ sets ; alias(kap,kap4); +alias(kforestry,kforestry2); diff --git a/modules/21_trade/selfsuff_reduced/input.gms b/modules/21_trade/selfsuff_reduced/input.gms index e8e98ff152..19a8d28d00 100644 --- a/modules/21_trade/selfsuff_reduced/input.gms +++ b/modules/21_trade/selfsuff_reduced/input.gms @@ -16,6 +16,7 @@ sets scalars s21_trade_tariff Trade tariff switch (1=on 0=off) (1) / 1 / s21_cost_import Cost for additional imports to maintain feasibility (USD05MER per tDM) / 10000 / + s21_min_trade_margin_forestry Minimum trade margin for forestry products (USD05MER per tDM) / 50 / ; table f21_trade_bal_reduction(t_all,trade_groups21,trade_regime21) Share of inelastic trade pool (1) diff --git a/modules/21_trade/selfsuff_reduced/preloop.gms b/modules/21_trade/selfsuff_reduced/preloop.gms index 9a91265c27..ff5c35c5a2 100644 --- a/modules/21_trade/selfsuff_reduced/preloop.gms +++ b/modules/21_trade/selfsuff_reduced/preloop.gms @@ -16,6 +16,9 @@ elseif (s21_trade_tariff=0), i21_trade_tariff(h,k_trade) = 0; ); +i21_trade_margin(h,"wood")$(i21_trade_margin(h,"wood") < s21_min_trade_margin_forestry) = s21_min_trade_margin_forestry; +i21_trade_margin(h,"woodfuel")$(i21_trade_margin(h,"woodfuel") < s21_min_trade_margin_forestry) = s21_min_trade_margin_forestry; + pm_selfsuff_ext(t_ext,h,kforestry) = f21_self_suff("y2150",h,kforestry); pm_selfsuff_ext(t_all,h,kforestry) = f21_self_suff(t_all,h,kforestry); *Implausible jumps in selfsuff for wood in some regions. diff --git a/modules/32_forestry/dynamic_feb21/declarations.gms b/modules/32_forestry/dynamic_may24/declarations.gms similarity index 86% rename from modules/32_forestry/dynamic_feb21/declarations.gms rename to modules/32_forestry/dynamic_may24/declarations.gms index 199e78df99..be974ad32d 100644 --- a/modules/32_forestry/dynamic_feb21/declarations.gms +++ b/modules/32_forestry/dynamic_may24/declarations.gms @@ -57,16 +57,22 @@ parameters p32_ac_dist(j,ac) Actual share of age-class distribution (1) p32_avg_increment(t_all,j,ac) Mean annual increment (tC per ha per year) p32_bii_coeff(type32,bii_class_secd,potnatveg) bii coeff (1) - p32_c_density_ac_fast_forestry(t_all,j,ac) Carbon densities in plantations based on Braakhekke et al (tC per ha) p32_disturbance_loss_ftype32(t,j,type32,ac) Loss due to disturbances in all plantation type forests (mio. ha) pcm_land_forestry(j,type32) Forestry land pools (mio. ha) + pc32_prod_forestry_ini(i) Initial procution from timber plantations (mio. tDM per yr) + pc32_plant_contr_ini(i) Inital share of roundwood production coming from timber plantations (percent) + i32_plant_contr_growth_fader(t_all) Fader for growth rate of timber plantation share (percent) + p32_plant_contr(t,i) Share of roundwood production coming from timber plantations (percent) + p32_forestry_product_dist(t,i,kforestry) Distribution of wood products (1) + p32_future_to_current_demand_ratio(t,i) Ratio of future and current timber demand (1) ; positive variables vm_cost_fore(i) Forestry costs (Mio USD) v32_cost_hvarea(i) Cost of harvesting timber from forests (mio. USD per yr) v32_land(j,type32,ac) Forestry land pools (mio. ha) - v32_land_missing(j) Forestry land which can be used at extrmemly high costs in case not enough area is available for new establishment (mio. ha) + v32_land_missing(j) Technical area balance term for timber plantation establishment (mio. ha) + v32_land_missing_ndc(j) Technical area balance term for NPI NDC reforestation (mio. ha) vm_landdiff_forestry Aggregated difference in forestry land compared to previous timestep (mio. ha) v32_cost_recur(i) Recurring forest management costs (USD per ha) v32_land_expansion(j,type32) Forestry land expansion (mio. ha) @@ -77,6 +83,7 @@ positive variables vm_landexpansion_forestry(j,type32) Forestry land expansion (mio. ha) vm_landreduction_forestry(j,type32) Forestry land reduction (mio. ha) vm_land_forestry(j,type32) Forestry land pools (mio. ha) + v32_prod_forestry_future(i) Future expected production of woody biomass from commercial plantations (mio. tDM per yr) ; variables @@ -86,7 +93,7 @@ variables equations q32_cost_total(i) Total forestry costs constraint (mio. USD) q32_land(j) Land constraint (mio. ha) - q32_land_type32(j,type32) Land constraint (mio. ha) + q32_land_type32(j,type32) Land constraint (mio. ha) q32_cdr_aff(j,ac) Calculation of CDR from afforestation (mio. tC) q32_carbon(j,ag_pools,stockType) Forestry carbon stock calculation (mio. tC) q32_land_diff Aggregated difference in forestry land compared to previous timestep (mio. ha) @@ -96,8 +103,9 @@ equations q32_aff_est(j) Afforestation constraint for establishment age classes (mio. ha) q32_hvarea_forestry(j,ac) Plantations area harvest (mio. ha) q32_cost_recur(i) Recurruing costs (mio. USD) - q32_establishment_dynamic(i) Establishment in current time step for future demand (mio. ha) - q32_establishment_dynamic_yield(i) Regional timber yield (tDM per ha) + q32_prod_forestry_future(i) Future expected production of woody biomass from commercial plantations (mio. tDM per yr) + q32_establishment_demand(i) Future expected production of woody biomass from commercial plantations (mio. tDM per yr) + q32_establishment_hvarea(j) Establishment in current time step for future demand (mio. ha) q32_establishment_fixed(j) Establishment in current time step for future demand (mio. ha) q32_land_expansion(j,type32) Land expansion (mio. ha) q32_land_reduction(j,type32,ac) Land contraction (mio. ha) @@ -119,7 +127,8 @@ parameters ov_cost_fore(t,i,type) Forestry costs (Mio USD) ov32_cost_hvarea(t,i,type) Cost of harvesting timber from forests (mio. USD per yr) ov32_land(t,j,type32,ac,type) Forestry land pools (mio. ha) - ov32_land_missing(t,j,type) Forestry land which can be used at extrmemly high costs in case not enough area is available for new establishment (mio. ha) + ov32_land_missing(t,j,type) Technical area balance term for timber plantation establishment (mio. ha) + ov32_land_missing_ndc(t,j,type) Technical area balance term for NPI NDC reforestation (mio. ha) ov_landdiff_forestry(t,type) Aggregated difference in forestry land compared to previous timestep (mio. ha) ov32_cost_recur(t,i,type) Recurring forest management costs (USD per ha) ov32_land_expansion(t,j,type32,type) Forestry land expansion (mio. ha) @@ -130,6 +139,7 @@ parameters ov_landexpansion_forestry(t,j,type32,type) Forestry land expansion (mio. ha) ov_landreduction_forestry(t,j,type32,type) Forestry land reduction (mio. ha) ov_land_forestry(t,j,type32,type) Forestry land pools (mio. ha) + ov32_prod_forestry_future(t,i,type) Future expected production of woody biomass from commercial plantations (mio. tDM per yr) ov_cdr_aff(t,j,ac,aff_effect,type) Expected bgc (CDR) and local bph effects of afforestation depending on planning horizon (mio. tC) oq32_cost_total(t,i,type) Total forestry costs constraint (mio. USD) oq32_land(t,j,type) Land constraint (mio. ha) @@ -143,8 +153,9 @@ parameters oq32_aff_est(t,j,type) Afforestation constraint for establishment age classes (mio. ha) oq32_hvarea_forestry(t,j,ac,type) Plantations area harvest (mio. ha) oq32_cost_recur(t,i,type) Recurruing costs (mio. USD) - oq32_establishment_dynamic(t,i,type) Establishment in current time step for future demand (mio. ha) - oq32_establishment_dynamic_yield(t,i,type) Regional timber yield (tDM per ha) + oq32_prod_forestry_future(t,i,type) Future expected production of woody biomass from commercial plantations (mio. tDM per yr) + oq32_establishment_demand(t,i,type) Future expected production of woody biomass from commercial plantations (mio. tDM per yr) + oq32_establishment_hvarea(t,j,type) Establishment in current time step for future demand (mio. ha) oq32_establishment_fixed(t,j,type) Establishment in current time step for future demand (mio. ha) oq32_land_expansion(t,j,type32,type) Land expansion (mio. ha) oq32_land_reduction(t,j,type32,ac,type) Land contraction (mio. ha) diff --git a/modules/32_forestry/dynamic_feb21/equations.gms b/modules/32_forestry/dynamic_may24/equations.gms similarity index 80% rename from modules/32_forestry/dynamic_feb21/equations.gms rename to modules/32_forestry/dynamic_may24/equations.gms index 259fdc7206..5143936da3 100644 --- a/modules/32_forestry/dynamic_feb21/equations.gms +++ b/modules/32_forestry/dynamic_may24/equations.gms @@ -24,7 +24,7 @@ q32_cost_total(i2) .. vm_cost_fore(i2) =e= v32_cost_recur(i2) + v32_cost_establishment(i2) + v32_cost_hvarea(i2) - + sum(cell(i2,j2), v32_land_missing(j2)) * s32_free_land_cost + + sum(cell(i2,j2), v32_land_missing(j2) + v32_land_missing_ndc(j2)) * s32_free_land_cost ; *----------------------------------------------- @@ -68,7 +68,7 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( *' The constraint `q32_aff_pol` accounts for the exogenous afforestation prescribed by NPI/NDC policies. q32_aff_pol(j2) .. - sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, p32_aff_pol_timestep(ct,j2)); + sum(ac_est, v32_land(j2,"ndc",ac_est)) + v32_land_missing_ndc(j2) =e= sum(ct, p32_aff_pol_timestep(ct,j2)); *' The constraint `q32_max_aff` accounts for the allowed maximum global endogenous *' afforestation defined in `i32_max_aff_area_glo`. @@ -141,11 +141,12 @@ q32_bv_plant(j2,potnatveg) .. vm_bv(j2,"plant",potnatveg) *' investment over time. q32_cost_establishment(i2).. - v32_cost_establishment(i2) - =e= - (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * s32_reESTBcost) - ) - * sum(ct,pm_interest(ct,i2)/(1+pm_interest(ct,i2))); + v32_cost_establishment(i2) + =e= + (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * s32_reESTBcost)) + * sum(ct,pm_interest(ct,i2)/(1+pm_interest(ct,i2))) + + sum((ct,kforestry), v32_prod_forestry_future(i2) * p32_forestry_product_dist(ct,i2,kforestry) * im_timber_prod_cost(kforestry)) + / ((1+sum(ct,pm_interest(ct,i2))**sum(ct, pm_representative_rotation(ct,i2)*5))); *' Recurring costs are paid for plantations where the trees have to be regularly monitored @@ -159,33 +160,39 @@ q32_cost_recur(i2) .. v32_cost_recur(i2) =e= **** New establishment decision *------------------------------ -*' New plantations are already established in the optimization step based on a certain -*' percentage (`p32_plantation_contribution`) of current demand (`pm_demand_forestry_future`). -*' Its called `pm_demand_forestry_future` because the model also has a foresight switch which -*' give the model an ability to account for future changes in demand. By default `pm_demand_forestry_future` -*' is set to existing roundwood demand. As plantation establishment decisions should +*' New plantations are established in the optimization step based on a certain +*' percentage (`p32_plant_contr`) of expected future demand (`pm_demand_forestry_future`). +*' As plantation establishment decisions should *' also know some indication of expected future yields, we calculate how much yield *' newly established plantation can realize based on rotation lengths. This is defined as -*' the expected future yield (`pc32_yield_forestry_future`) at harvest (year in time -*' step are accounted for). +*' the expected future yield (`pc32_yield_forestry_future`) at harvest. -*' Area constraint for plantation establishment based on expected average regional timber yield at rotation age -*' (`pc32_yield_forestry_future_reg`) to ovoid overspecialization of plantation establishment towards highly productive cells. +*' Future expected production is calculated for the establishment decision below and the costs above +*' based on newly established areas and expected future yields. -q32_establishment_dynamic(i2)$s32_establishment_dynamic .. - sum(cell(i2,j2), ((sum(ac_est, v32_land(j2,"plant",ac_est)) + v32_land_missing(j2)) / m_timestep_length_forestry) * pc32_yield_forestry_future_reg(i2)) +q32_prod_forestry_future(i2) .. + v32_prod_forestry_future(i2) =e= - sum((ct,kforestry), pm_demand_forestry_future(i2,kforestry) * min(s32_max_self_suff, sum(supreg(h2,i2),pm_selfsuff_ext(ct,h2,kforestry))) * p32_plantation_contribution(ct,i2) * f32_estb_calib(i2)) + sum(cell(i2,j2), (sum(ac_est, v32_land(j2,"plant",ac_est)) + v32_land_missing(j2)) * pc32_yield_forestry_future(j2)) / m_timestep_length_forestry ; -*' Constraint to maintain the average regional timber yield at rotation age, accounting for the cellular timber yield (`pc32_yield_forestry_future`). +*' Future expected production has to be equal or larger than future demand multiplied with the plantation contribution factor. -q32_establishment_dynamic_yield(i2)$s32_establishment_dynamic .. - sum(cell(i2,j2), (sum(ac_est, v32_land(j2,"plant",ac_est))+v32_land_missing(j2)) * pc32_yield_forestry_future(j2)) - =e= - pc32_yield_forestry_future_reg(i2) * (sum(cell(i2,j2), sum(ac_est, v32_land(j2,"plant",ac_est))+v32_land_missing(j2))); +q32_establishment_demand(i2)$s32_establishment_dynamic .. + v32_prod_forestry_future(i2) + =g= + sum((ct,kforestry), pm_demand_forestry_future(ct,i2,kforestry)) * sum(ct, p32_plant_contr(ct,i2)) + ; + +*' Harvested areas are fully re-established at cell level, unless the ratio of future and current demand drops below 1. + +q32_establishment_hvarea(j2)$s32_establishment_dynamic .. + sum(ac_est, v32_land(j2,"plant",ac_est)) + =g= + sum(ac_sub, v32_hvarea_forestry(j2,ac_sub)) * sum(cell(i2,j2), min(1, sum(ct, p32_future_to_current_demand_ratio(ct,i2)))) + ; -*' If plantations have to be static (defined by `s32_establishment_static`) then +*' If plantations should be static (defined by `s32_establishment_static`) then *' the model simply establishes the amount of plantations which are harvested. *' this keeps the plantation area static but accounts for age-class changes and *' regrowth during every time step. @@ -205,7 +212,7 @@ v32_land(j2,type32,ac_est) =e= sum(ac_est2, v32_land(j2,type32,ac_est2))/card(ac q32_hvarea_forestry(j2,ac_sub) .. v32_hvarea_forestry(j2,ac_sub) - =l= + =e= v32_land_reduction(j2,"plant",ac_sub); ** Timber plantation diff --git a/modules/32_forestry/dynamic_feb21/input.gms b/modules/32_forestry/dynamic_may24/input.gms similarity index 84% rename from modules/32_forestry/dynamic_feb21/input.gms rename to modules/32_forestry/dynamic_may24/input.gms index 961bb68cb5..d072426e61 100644 --- a/modules/32_forestry/dynamic_feb21/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -29,16 +29,16 @@ $setglobal c32_shock_scenario none scalars - s32_hvarea Flag for harvested area and establishemt (0=zero 1=exognous 2=endogneous) / 0 / + s32_hvarea Flag for harvested area and establishemt (0=zero 1=exognous 2=endogneous) / 2 / s32_reESTBcost Re establishment cost (USD per ha) / 2000 / s32_recurring_cost Recurring costs (USD per ha) / 500 / s32_harvesting_cost Harvesting cost (USD per ha) / 1000 / s32_planing_horizon Afforestation planing horizon (years) / 50 / s32_rotation_extension Rotation extension factor 1=original rotations 2=100 percent increase in rotations etc (1) / 1 / s32_faustmann_rotation Switch to activate faustmann rotations (1=on 0=off) / 0 / - s32_initial_distribution Switch to Activate ageclass distribution in plantations 0=off 1=equal distribution 2=FAO distribution 3=Poulter distribution 4=Manual distribution (1) / 0 / + s32_initial_distribution Switch to Activate ageclass distribution in plantations 1=equal distribution (1) / 1 / s32_price Price for timber (USD) / 45 / - s32_free_land_cost Very high cost for using non existing land for plantation establishment (USD per ha) /1000000/ + s32_free_land_cost Penalty for technial area balance term (USD per ha) / 1e+06 / s32_max_aff_area Maximum total global afforestation (mio. ha) / Inf / s32_aff_plantation Switch for using growth curves for afforestation 0=natveg 1=plantations (1) / 0 / s32_tcre_local Switch for local (1) or global (0) TRCE factors (1) / 1 / @@ -47,6 +47,11 @@ scalars s32_aff_bii_coeff BII coefficent to be used for CO2 price driven afforestation 0=natural vegetation 1=plantation (1) / 0 / s32_max_aff_area_glo Switch for global or regional afforestation constraint (1) / 1 / s32_aff_prot Switch for protection of afforested areas (0=until end of planning horizon 1=forever) / 1 / + s32_plant_contr_growth_startyear Start year for plantation contribution growth fader (year) / 2020 / + s32_plant_contr_growth_endyear End year for plantation contribution growth fader (year) / 2050 / + s32_plant_contr_growth_startvalue Start value for plantation contribution growth fader (percent per year) / 0.05 / + s32_plant_contr_growth_endvalue End value for plantation contribution growth fader (percent per year) / 0 / + s32_plant_contr_max Maximum plantation contribution for establishment decision (percent) / 0.5 / ; parameter f32_aff_mask(j) afforestation mask (binary) @@ -73,14 +78,6 @@ $include "./modules/32_forestry/input/npi_ndc_aff_pol.cs3" $offdelim ; -parameter f32_plant_prod_share(t_all) Share of overall production coming from plantations (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_plant_prod_share.csv" -$offdelim -/ -; - table f32_aff_bgp(j,bgp32) Biogeophysical temperature change of afforestation (degree C) $ondelim $include "./modules/32_forestry/input/f32_bph_effect_noTCRE.cs3" @@ -107,12 +104,6 @@ $include "./modules/32_forestry/input/f32_gs_relativetarget.cs4" $offdelim /; -table f32_plantation_contribution(t_ext,i,inter32,scen32) Share of roundwood production coming from timber plantations (percent) -$ondelim -$include "./modules/32_forestry/input/f32_plantation_contribution.cs3" -$ondelim -; - parameter f32_plantedforest(i) Share of plantation forest in planted forest (1) / $ondelim @@ -120,13 +111,6 @@ $include "./modules/32_forestry/input/f32_plantedforest.cs4" $offdelim /; -parameter f32_estb_calib(i) Calibration factor for plantation forest establishment (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_estb_calib.cs4" -$offdelim -/; - table f32_forest_shock(t_all, shock_scen32) Forest carbon shock scenarios (area share affected per year) $ondelim $include "./modules/32_forestry/input/f32_forest_shock.csv" diff --git a/modules/32_forestry/dynamic_feb21/postsolve.gms b/modules/32_forestry/dynamic_may24/postsolve.gms similarity index 89% rename from modules/32_forestry/dynamic_feb21/postsolve.gms rename to modules/32_forestry/dynamic_may24/postsolve.gms index 69a4b4e0de..1ec319b88b 100644 --- a/modules/32_forestry/dynamic_feb21/postsolve.gms +++ b/modules/32_forestry/dynamic_may24/postsolve.gms @@ -14,6 +14,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov32_cost_hvarea(t,i,"marginal") = v32_cost_hvarea.m(i); ov32_land(t,j,type32,ac,"marginal") = v32_land.m(j,type32,ac); ov32_land_missing(t,j,"marginal") = v32_land_missing.m(j); + ov32_land_missing_ndc(t,j,"marginal") = v32_land_missing_ndc.m(j); ov_landdiff_forestry(t,"marginal") = vm_landdiff_forestry.m; ov32_cost_recur(t,i,"marginal") = v32_cost_recur.m(i); ov32_land_expansion(t,j,type32,"marginal") = v32_land_expansion.m(j,type32); @@ -24,6 +25,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov_landexpansion_forestry(t,j,type32,"marginal") = vm_landexpansion_forestry.m(j,type32); ov_landreduction_forestry(t,j,type32,"marginal") = vm_landreduction_forestry.m(j,type32); ov_land_forestry(t,j,type32,"marginal") = vm_land_forestry.m(j,type32); + ov32_prod_forestry_future(t,i,"marginal") = v32_prod_forestry_future.m(i); ov_cdr_aff(t,j,ac,aff_effect,"marginal") = vm_cdr_aff.m(j,ac,aff_effect); oq32_cost_total(t,i,"marginal") = q32_cost_total.m(i); oq32_land(t,j,"marginal") = q32_land.m(j); @@ -37,8 +39,9 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); oq32_aff_est(t,j,"marginal") = q32_aff_est.m(j); oq32_hvarea_forestry(t,j,ac,"marginal") = q32_hvarea_forestry.m(j,ac); oq32_cost_recur(t,i,"marginal") = q32_cost_recur.m(i); - oq32_establishment_dynamic(t,i,"marginal") = q32_establishment_dynamic.m(i); - oq32_establishment_dynamic_yield(t,i,"marginal") = q32_establishment_dynamic_yield.m(i); + oq32_prod_forestry_future(t,i,"marginal") = q32_prod_forestry_future.m(i); + oq32_establishment_demand(t,i,"marginal") = q32_establishment_demand.m(i); + oq32_establishment_hvarea(t,j,"marginal") = q32_establishment_hvarea.m(j); oq32_establishment_fixed(t,j,"marginal") = q32_establishment_fixed.m(j); oq32_land_expansion(t,j,type32,"marginal") = q32_land_expansion.m(j,type32); oq32_land_reduction(t,j,type32,ac,"marginal") = q32_land_reduction.m(j,type32,ac); @@ -56,6 +59,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov32_cost_hvarea(t,i,"level") = v32_cost_hvarea.l(i); ov32_land(t,j,type32,ac,"level") = v32_land.l(j,type32,ac); ov32_land_missing(t,j,"level") = v32_land_missing.l(j); + ov32_land_missing_ndc(t,j,"level") = v32_land_missing_ndc.l(j); ov_landdiff_forestry(t,"level") = vm_landdiff_forestry.l; ov32_cost_recur(t,i,"level") = v32_cost_recur.l(i); ov32_land_expansion(t,j,type32,"level") = v32_land_expansion.l(j,type32); @@ -66,6 +70,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov_landexpansion_forestry(t,j,type32,"level") = vm_landexpansion_forestry.l(j,type32); ov_landreduction_forestry(t,j,type32,"level") = vm_landreduction_forestry.l(j,type32); ov_land_forestry(t,j,type32,"level") = vm_land_forestry.l(j,type32); + ov32_prod_forestry_future(t,i,"level") = v32_prod_forestry_future.l(i); ov_cdr_aff(t,j,ac,aff_effect,"level") = vm_cdr_aff.l(j,ac,aff_effect); oq32_cost_total(t,i,"level") = q32_cost_total.l(i); oq32_land(t,j,"level") = q32_land.l(j); @@ -79,8 +84,9 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); oq32_aff_est(t,j,"level") = q32_aff_est.l(j); oq32_hvarea_forestry(t,j,ac,"level") = q32_hvarea_forestry.l(j,ac); oq32_cost_recur(t,i,"level") = q32_cost_recur.l(i); - oq32_establishment_dynamic(t,i,"level") = q32_establishment_dynamic.l(i); - oq32_establishment_dynamic_yield(t,i,"level") = q32_establishment_dynamic_yield.l(i); + oq32_prod_forestry_future(t,i,"level") = q32_prod_forestry_future.l(i); + oq32_establishment_demand(t,i,"level") = q32_establishment_demand.l(i); + oq32_establishment_hvarea(t,j,"level") = q32_establishment_hvarea.l(j); oq32_establishment_fixed(t,j,"level") = q32_establishment_fixed.l(j); oq32_land_expansion(t,j,type32,"level") = q32_land_expansion.l(j,type32); oq32_land_reduction(t,j,type32,ac,"level") = q32_land_reduction.l(j,type32,ac); @@ -98,6 +104,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov32_cost_hvarea(t,i,"upper") = v32_cost_hvarea.up(i); ov32_land(t,j,type32,ac,"upper") = v32_land.up(j,type32,ac); ov32_land_missing(t,j,"upper") = v32_land_missing.up(j); + ov32_land_missing_ndc(t,j,"upper") = v32_land_missing_ndc.up(j); ov_landdiff_forestry(t,"upper") = vm_landdiff_forestry.up; ov32_cost_recur(t,i,"upper") = v32_cost_recur.up(i); ov32_land_expansion(t,j,type32,"upper") = v32_land_expansion.up(j,type32); @@ -108,6 +115,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov_landexpansion_forestry(t,j,type32,"upper") = vm_landexpansion_forestry.up(j,type32); ov_landreduction_forestry(t,j,type32,"upper") = vm_landreduction_forestry.up(j,type32); ov_land_forestry(t,j,type32,"upper") = vm_land_forestry.up(j,type32); + ov32_prod_forestry_future(t,i,"upper") = v32_prod_forestry_future.up(i); ov_cdr_aff(t,j,ac,aff_effect,"upper") = vm_cdr_aff.up(j,ac,aff_effect); oq32_cost_total(t,i,"upper") = q32_cost_total.up(i); oq32_land(t,j,"upper") = q32_land.up(j); @@ -121,8 +129,9 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); oq32_aff_est(t,j,"upper") = q32_aff_est.up(j); oq32_hvarea_forestry(t,j,ac,"upper") = q32_hvarea_forestry.up(j,ac); oq32_cost_recur(t,i,"upper") = q32_cost_recur.up(i); - oq32_establishment_dynamic(t,i,"upper") = q32_establishment_dynamic.up(i); - oq32_establishment_dynamic_yield(t,i,"upper") = q32_establishment_dynamic_yield.up(i); + oq32_prod_forestry_future(t,i,"upper") = q32_prod_forestry_future.up(i); + oq32_establishment_demand(t,i,"upper") = q32_establishment_demand.up(i); + oq32_establishment_hvarea(t,j,"upper") = q32_establishment_hvarea.up(j); oq32_establishment_fixed(t,j,"upper") = q32_establishment_fixed.up(j); oq32_land_expansion(t,j,type32,"upper") = q32_land_expansion.up(j,type32); oq32_land_reduction(t,j,type32,ac,"upper") = q32_land_reduction.up(j,type32,ac); @@ -140,6 +149,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov32_cost_hvarea(t,i,"lower") = v32_cost_hvarea.lo(i); ov32_land(t,j,type32,ac,"lower") = v32_land.lo(j,type32,ac); ov32_land_missing(t,j,"lower") = v32_land_missing.lo(j); + ov32_land_missing_ndc(t,j,"lower") = v32_land_missing_ndc.lo(j); ov_landdiff_forestry(t,"lower") = vm_landdiff_forestry.lo; ov32_cost_recur(t,i,"lower") = v32_cost_recur.lo(i); ov32_land_expansion(t,j,type32,"lower") = v32_land_expansion.lo(j,type32); @@ -150,6 +160,7 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); ov_landexpansion_forestry(t,j,type32,"lower") = vm_landexpansion_forestry.lo(j,type32); ov_landreduction_forestry(t,j,type32,"lower") = vm_landreduction_forestry.lo(j,type32); ov_land_forestry(t,j,type32,"lower") = vm_land_forestry.lo(j,type32); + ov32_prod_forestry_future(t,i,"lower") = v32_prod_forestry_future.lo(i); ov_cdr_aff(t,j,ac,aff_effect,"lower") = vm_cdr_aff.lo(j,ac,aff_effect); oq32_cost_total(t,i,"lower") = q32_cost_total.lo(i); oq32_land(t,j,"lower") = q32_land.lo(j); @@ -163,8 +174,9 @@ p32_land(t,j,type32,ac) = v32_land.l(j,type32,ac); oq32_aff_est(t,j,"lower") = q32_aff_est.lo(j); oq32_hvarea_forestry(t,j,ac,"lower") = q32_hvarea_forestry.lo(j,ac); oq32_cost_recur(t,i,"lower") = q32_cost_recur.lo(i); - oq32_establishment_dynamic(t,i,"lower") = q32_establishment_dynamic.lo(i); - oq32_establishment_dynamic_yield(t,i,"lower") = q32_establishment_dynamic_yield.lo(i); + oq32_prod_forestry_future(t,i,"lower") = q32_prod_forestry_future.lo(i); + oq32_establishment_demand(t,i,"lower") = q32_establishment_demand.lo(i); + oq32_establishment_hvarea(t,j,"lower") = q32_establishment_hvarea.lo(j); oq32_establishment_fixed(t,j,"lower") = q32_establishment_fixed.lo(j); oq32_land_expansion(t,j,type32,"lower") = q32_land_expansion.lo(j,type32); oq32_land_reduction(t,j,type32,ac,"lower") = q32_land_reduction.lo(j,type32,ac); diff --git a/modules/32_forestry/dynamic_feb21/preloop.gms b/modules/32_forestry/dynamic_may24/preloop.gms similarity index 62% rename from modules/32_forestry/dynamic_feb21/preloop.gms rename to modules/32_forestry/dynamic_may24/preloop.gms index fae349543f..4d4ede2052 100644 --- a/modules/32_forestry/dynamic_feb21/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -4,6 +4,10 @@ *** | AGPL-3.0, you are granted additional permissions described in the *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de + +*m_sigmoid_time_interpol(i32_plant_contr_fader,2020,2050,0.05,0); +m_sigmoid_time_interpol(i32_plant_contr_growth_fader,s32_plant_contr_growth_startyear,s32_plant_contr_growth_endyear,s32_plant_contr_growth_startvalue,s32_plant_contr_growth_endvalue); + ** Calculation of Single rotation model rotation lengths ** Using forestry carbon densitiy here via carbon density data exchange from carbon module. p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); @@ -96,7 +100,8 @@ p32_ncells(i) = sum(cell(i,j),1); **** Representative regional rotation loop(t_all, p32_rotation_regional(t_all,i) = ceil(sum(cell(i,j), p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); - pm_representative_rotation(t_all,i) = ord(t_all) + ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); +* pm_representative_rotation(t_all,i) = ord(t_all) + ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); + pm_representative_rotation(t_all,i) = ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); ); ** Earlier we converted rotation lengths to absolute numbers, now we make the Conversion @@ -141,73 +146,14 @@ ini32(j,ac) = no; ini32(j,ac) = yes$(ord(ac) >= 1 AND ac.off < p32_rotation_cellular_harvesting("y1995",j)); ** divide initial forestry area by number of age classes within ini32 -if(s32_initial_distribution = 0, -** Initialize with highest age class - p32_land_start_ac(j,"plant","acx") = pcm_land(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_land_start_ac(j,"ndc","acx") = pcm_land(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)); - -elseif s32_initial_distribution = 1, +if(s32_initial_distribution = 1, ** Initialize with equal distribution among rotation age classes ** Plantated forest area is divided into ndcs (other planted forest) and plantations p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j); p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1- f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - -elseif s32_initial_distribution = 2, -** Initialize with distribution based on FAO data (but this distribution is applied to all cells globally) -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * f32_ac_dist(ac); - p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * f32_ac_dist(ac); - -elseif s32_initial_distribution = 3, -** Initialize with Poulter distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_rotation_dist(j,ac) = (im_plantedclass_ac(j,ac)$(ini32(j,ac))/sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2))))$(sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2)))); - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j) * p32_rotation_dist(j,ac); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_rotation_dist(j,ac); - -*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell - loop (j, - if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - ); - ); - -elseif s32_initial_distribution = 4, -** Initialize with Manual distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - loop(j, -** Set all acs to 0 - p32_ac_dist_flag(j,ac) = 0; -** Calculate reverse of age-classes, if rotation is 11acs, then ac0 should get a value of 11, 11th ac should get value of 1 - p32_ac_dist_flag(j,ac) = (10*p32_rotation_cellular_harvesting("y1995",j)-((ord(ac)-1))*5)$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); -** Calculate the weights, youngest age-class will have highest weight - p32_ac_dist(j,ac) = (p32_ac_dist_flag(j,ac) / (sum(ac2,p32_ac_dist_flag(j,ac2)) + ord(ac)))$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); -** there can be isntances where this distribution is not summing up to 1, in that case we take the excess and remove it evenly from all age-classes -** In case the sum of distribution is > 1 : Remove the excess from ac0 - p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))>1) = p32_ac_dist(j,"ac0") - (sum(ac2, p32_ac_dist(j,ac2))-1); -** In case the sum of distribution is < 1 : Add the shortage to ac0 - p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))<1) = p32_ac_dist(j,"ac0") + (1-sum(ac2, p32_ac_dist(j,ac2))); - ); -** Isolate plantations from planted forest (forestry) - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); -** Divide plantations according to distribution - p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * p32_ac_dist(j,ac); -** Divide NDCs according to same distribution - p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_ac_dist(j,ac); - -*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell - loop (j, - if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - ); - ); - ); + ** Redistribute to youngest age class in case the distribution to plantations and ** ndcs does not match fully with LUH initialized data loop(j, @@ -252,43 +198,10 @@ if(s32_tcre_local = 1, p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/f32_tcre(j,"%c32_tcre_ctrl%")/card(ac_bph); else *m_weightedmean returns a global value, which is then used assigned to all j. We use land area as weight. - p32_tcre_glo(j2) = m_weightedmean(f32_tcre(j,"%c32_tcre_ctrl%"),sum(land, pcm_land(j,land)),j) - p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/p32_tcre_glo(j)/card(ac_bph) + p32_tcre_glo(j2) = m_weightedmean(f32_tcre(j,"%c32_tcre_ctrl%"),sum(land, pcm_land(j,land)),j); + p32_aff_bgp(j,ac_bph) = f32_aff_bgp(j,"%c32_aff_bgp%")/p32_tcre_glo(j)/card(ac_bph); ); -** Calculate plantation contribution scaled to Growing stock in plantations -** Initialize with low values -p32_plantation_contribution(t_ext,i) = 0.001; -** Fill parameter with input file based on scenario settings -p32_plantation_contribution(t_ext,i)$(f32_gs_relativetarget(i)>0) = f32_plantation_contribution(t_ext,i,"%c32_dev_scen%","%c32_incr_rate%"); - -************************************************************************** -******************************************************************************* -** Calibrate plantations yields -******************************************************************************* -** Initialize with 1 m3 per ha - to avoid dvision by 0 -p32_observed_gs_reg(i) = 1; -** Wherever FAO reports >0 growing stock, we calculate how much growing stock MAGPIE -** sees even before optimization starts -p32_observed_gs_reg(i)$(f32_gs_relativetarget(i)>0 AND sum((cell(i,j),ac),p32_land_start_ac(j,"plant",ac))>0) = (sum((cell(i,j),ac),(pm_timber_yield_initial(j,ac,"forestry") / sm_wood_density) * p32_land_start_ac(j,"plant",ac))/ sum((cell(i,j),ac),p32_land_start_ac(j,"plant",ac))); - -** Initialze calibration factor for growing stocks as 1 -** we dont set it to 0 as we don't want to modify carbon densities by multiplication with 0 later -p32_gs_scaling_reg(i) = 1; -** Calculate the ratio between target growing stock (reported by FAO) and observed growing stock (value at initialization in MAgPIE) -p32_gs_scaling_reg(i)$(f32_gs_relativetarget(i)>0 AND f32_plantedforest(i)>0) = f32_gs_relativetarget(i) / p32_observed_gs_reg(i); -** Calibration factors lower than 1 are set to 1 -p32_gs_scaling_reg(i)$(p32_gs_scaling_reg(i) < 1) = 1; - -** Save pm_carbon_density_ac_forestry in a parameter before upscaling to FAO growing stocks. -** This allows to use plantation growth curves for CO2 price driven afforestation. -p32_c_density_ac_fast_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); - -** Update c-density for timber plantations based on calibration factor to match FAO growing stocks -pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") * sum(cell(i,j),p32_gs_scaling_reg(i)); -** keep c-density for timber plantations constant after rotation length to avoid unrealistic carbon sequestration in unharvested timber plantations -pm_carbon_density_ac_forestry(t_all,j,ac,"vegc")$(ac.off >= p32_rotation_cellular_harvesting(t_all,j)) = sum(ac2$(ac2.off = p32_rotation_cellular_harvesting(t_all,j)), pm_carbon_density_ac_forestry(t_all,j,ac2,"vegc")); - ** set bii coefficients p32_bii_coeff(type32,bii_class_secd,potnatveg) = 0; if(s32_aff_bii_coeff = 0, diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms similarity index 83% rename from modules/32_forestry/dynamic_feb21/presolve.gms rename to modules/32_forestry/dynamic_may24/presolve.gms index 819189ae54..354e033617 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -21,7 +21,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; p32_aff_pol_timestep("y1995",j) = 0; p32_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation - p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); + p32_aff_pot(t,j) = sum((kcr,w),vm_area.l(j,kcr,w) - vm_area.lo(j,kcr,w)) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available @@ -36,7 +36,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; if(s32_aff_plantation = 0, p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); elseif s32_aff_plantation = 1, - p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = p32_c_density_ac_fast_forestry(t,j,ac); + p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_ac_forestry(t,j,ac,"vegc"); ); *' Timber plantations carbon densities: @@ -82,10 +82,6 @@ p32_land(t,j,type32,"acx") = p32_land(t,j,type32,"acx") + sum(ac$(ord(ac) > card p32_land(t,j,type32,ac_est) = 0; *' @stop - - - - ** Calculate v32_land.l v32_land.l(j,type32,ac) = p32_land(t,j,type32,ac); pc32_land(j,type32,ac) = v32_land.l(j,type32,ac); @@ -123,7 +119,7 @@ elseif s32_hvarea = 2, ** The offset is needed because the first element of ac is ac0, which is not included in p32_rotation_cellular_harvesting. v32_land.fx(j,"plant",ac)$(ac.off < p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); ** After the rotation period, plantations are free for harvesting - v32_land.up(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); + v32_land.fx(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = 0; s32_establishment_static = 0; s32_establishment_dynamic = 1; ); @@ -160,19 +156,25 @@ else *' No afforestation is allowed if carbon density <= 20 tc/ha v32_land.fx(j,"aff",ac_est)$(fm_carbon_density(t,j,"forestry","vegc") <= 20) = 0; -m_boundfix(v32_land,(j,type32,ac_sub),up,10e-5); +m_boundfix(v32_land,(j,type32,ac_sub),up,1e-6); ** Calculate future yield based on rotation length -if((ord(t)=1), -pc32_yield_forestry_future(j) = sum(ac$(ord(ac) = p32_rotation_cellular_estb(t,j)-1), pm_timber_yield(t,j,ac,"forestry")); -pc32_area_rotation(j) = sum(ac$(ord(ac) = p32_rotation_cellular_estb(t,j)-1), p32_land(t,j,"plant",ac)); +pc32_yield_forestry_future(j) = sum(ac$(ac.off = p32_rotation_cellular_estb(t,j)), pm_timber_yield(t,j,ac,"forestry")); + +* Fader for plantation share in establishment decision +if(ord(t) = 1, + pc32_prod_forestry_ini(i) = sum(cell(i,j), sum(ac$(ac.off = p32_rotation_cellular_harvesting(t,j)), pm_timber_yield(t,j,ac,"forestry") * p32_land(t,j,"plant",ac))) / m_timestep_length_forestry; + pc32_plant_contr_ini(i) = pc32_prod_forestry_ini(i) / sum(kforestry, pm_demand_ext(t,i,kforestry)); + p32_plant_contr(t,i) = pc32_plant_contr_ini(i); +else + p32_plant_contr(t,i) = p32_plant_contr(t-1,i) * (1+i32_plant_contr_growth_fader(t))**m_timestep_length_forestry; ); -pc32_yield_forestry_future_reg(i) = m_weightedmean(pc32_yield_forestry_future(j),pc32_area_rotation(j),(cell(i,j))); -pc32_yield_forestry_future_reg(i)$(pc32_yield_forestry_future_reg(i) = 0) = smax(cell(i,j),pc32_yield_forestry_future(j)); +p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_contr_max; + +p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) > 0) = pm_demand_forestry_future(t,i,kforestry) / sum(kforestry2, pm_demand_forestry_future(t,i,kforestry2)); +p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) = 0) = 1/card(kforestry); -** Display -p32_updated_gs_reg(t,i) = 1; -p32_updated_gs_reg(t,i)$(sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))>0) = (sum((cell(i,j),ac_sub),(pm_timber_yield(t,j,ac_sub,"forestry") / sm_wood_density) * p32_land(t,j,"plant",ac_sub))/ sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))); +p32_future_to_current_demand_ratio(t,i) = sum(kforestry, pm_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_ext(t,i,kforestry)); * Avoid conflict between afforestation for carbon uptake on land and secdforest restoration pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) diff --git a/modules/32_forestry/dynamic_feb21/realization.gms b/modules/32_forestry/dynamic_may24/realization.gms similarity index 94% rename from modules/32_forestry/dynamic_feb21/realization.gms rename to modules/32_forestry/dynamic_may24/realization.gms index 6e839fd3e8..233c1f8ee4 100644 --- a/modules/32_forestry/dynamic_feb21/realization.gms +++ b/modules/32_forestry/dynamic_may24/realization.gms @@ -34,12 +34,12 @@ *' @limitations Rotation lengths for timber plantations are not endogenous. *####################### R SECTION START (PHASES) ############################## -$Ifi "%phase%" == "sets" $include "./modules/32_forestry/dynamic_feb21/sets.gms" -$Ifi "%phase%" == "declarations" $include "./modules/32_forestry/dynamic_feb21/declarations.gms" -$Ifi "%phase%" == "input" $include "./modules/32_forestry/dynamic_feb21/input.gms" -$Ifi "%phase%" == "equations" $include "./modules/32_forestry/dynamic_feb21/equations.gms" -$Ifi "%phase%" == "scaling" $include "./modules/32_forestry/dynamic_feb21/scaling.gms" -$Ifi "%phase%" == "preloop" $include "./modules/32_forestry/dynamic_feb21/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/32_forestry/dynamic_feb21/presolve.gms" -$Ifi "%phase%" == "postsolve" $include "./modules/32_forestry/dynamic_feb21/postsolve.gms" +$Ifi "%phase%" == "sets" $include "./modules/32_forestry/dynamic_may24/sets.gms" +$Ifi "%phase%" == "declarations" $include "./modules/32_forestry/dynamic_may24/declarations.gms" +$Ifi "%phase%" == "input" $include "./modules/32_forestry/dynamic_may24/input.gms" +$Ifi "%phase%" == "equations" $include "./modules/32_forestry/dynamic_may24/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/32_forestry/dynamic_may24/scaling.gms" +$Ifi "%phase%" == "preloop" $include "./modules/32_forestry/dynamic_may24/preloop.gms" +$Ifi "%phase%" == "presolve" $include "./modules/32_forestry/dynamic_may24/presolve.gms" +$Ifi "%phase%" == "postsolve" $include "./modules/32_forestry/dynamic_may24/postsolve.gms" *######################## R SECTION END (PHASES) ############################### diff --git a/modules/32_forestry/dynamic_feb21/scaling.gms b/modules/32_forestry/dynamic_may24/scaling.gms similarity index 100% rename from modules/32_forestry/dynamic_feb21/scaling.gms rename to modules/32_forestry/dynamic_may24/scaling.gms diff --git a/modules/32_forestry/dynamic_feb21/sets.gms b/modules/32_forestry/dynamic_may24/sets.gms similarity index 100% rename from modules/32_forestry/dynamic_feb21/sets.gms rename to modules/32_forestry/dynamic_may24/sets.gms diff --git a/modules/32_forestry/input/files b/modules/32_forestry/input/files index 97cfd1ed3d..64bb96e008 100644 --- a/modules/32_forestry/input/files +++ b/modules/32_forestry/input/files @@ -7,8 +7,5 @@ f32_plant_prod_share.csv f32_bph_effect_noTCRE.cs3 f32_localTCRE.cs3 f32_ac_dist.csv -f32_gs_relativetarget.cs4 -f32_plantation_contribution.cs3 f32_plantedforest.cs4 -f32_estb_calib.cs4 f32_forest_shock.csv diff --git a/modules/32_forestry/module.gms b/modules/32_forestry/module.gms index 61a7880e7b..54f13c6e06 100644 --- a/modules/32_forestry/module.gms +++ b/modules/32_forestry/module.gms @@ -22,5 +22,5 @@ *' @authors Florian Humpenöder, Abhijeet Mishra *###################### R SECTION START (MODULETYPES) ########################## -$Ifi "%forestry%" == "dynamic_feb21" $include "./modules/32_forestry/dynamic_feb21/realization.gms" +$Ifi "%forestry%" == "dynamic_may24" $include "./modules/32_forestry/dynamic_may24/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ diff --git a/modules/73_timber/default/declarations.gms b/modules/73_timber/default/declarations.gms index fc431387df..9ad6a0ba9f 100644 --- a/modules/73_timber/default/declarations.gms +++ b/modules/73_timber/default/declarations.gms @@ -8,7 +8,7 @@ parameters p73_timber_demand_gdp_pop(t_all,i,kforestry) Timber demand based on lauri et al 2019 (mio. m3 per yr) p73_forestry_demand_prod_specific(t_all,iso,total_wood_products) End product specific timber demand (mio. m3 per yr) -pm_demand_forestry_future(i,kforestry) Future forestry demand in current time step (tDM per yr) +pm_demand_forestry_future(t,i,kforestry) Future forestry demand in current time step (tDM per yr) pm_demand_ext(t_ext,i,kforestry) Extended demand for timber beyound simulation (mio. tDM per yr) p73_demand_calib(t_all,i,kforestry) Additive calibration for timber demand (mio. m3 per yr) p73_glo_wood(t_all,kforestry) Global wood demand (mio. tDM per yr) @@ -16,6 +16,7 @@ p73_demand_modifier(t_all) Simp p73_fraction(t_all) Fraction over which construction wood demand is spread out (1) p73_demand_constr_wood(t_all,i) Demand for construction wood (mio. tDM per yr) p73_fraction_sm_fix Modifier fraction at sm_fix_SSP2 time step (1) +im_timber_prod_cost(kforestry) Cost for producing one unit of wood and woodfuel (USD per tDM) ; positive variables diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index 1d1af6183c..bdd76ca93d 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -90,3 +90,11 @@ pm_demand_ext(t_all,i,"wood") = pm_demand_ext(t_all,i,"wood") + p73_demand_const pm_demand_ext(t_all,i,kforestry)$(m_year(t_all)>2100) = pm_demand_ext("y2100",i,kforestry); ** Calculate global demand p73_glo_wood(t_all,kforestry) = sum(i,pm_demand_ext(t_all,i,kforestry)); + +vm_prod_forestry.l(j,"wood") = 0; +vm_prod.l(j,"wood") = 0; + +im_timber_prod_cost("wood") = s73_timber_prod_cost_wood; +im_timber_prod_cost("woodfuel") = s73_timber_prod_cost_woodfuel; + +pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * 1.2; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index 0637bd7719..8c78d44eec 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -9,13 +9,12 @@ ** s73_foresight=1 forward looking (establishment based on future demand), ** s73_foresight=0 myopic (establishment based on current demand) -if(m_year(t) <= sm_fix_SSP2, -* pm_demand_forestry_future(i,kforestry) = pm_demand_ext("y2010",i,kforestry)*1.5; - pm_demand_forestry_future(i,kforestry) = pm_demand_ext(t,i,kforestry); +if(s73_foresight=1, + if(m_year(t) <= sm_fix_SSP2, + pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * 1.2; + else + pm_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_ext(t_ext,i,kforestry)); + ); else - if(s73_foresight=1, - pm_demand_forestry_future(i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_ext(t_ext,i,kforestry)); - else - pm_demand_forestry_future(i,kforestry) = pm_demand_ext(t,i,kforestry); + pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry); ); -); From 466cc4134a5b7d90083f7d1a3a44c5c23261b938 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 9 May 2024 18:22:52 +0200 Subject: [PATCH 137/259] bugfix --- modules/32_forestry/dynamic_may24/presolve.gms | 6 ++++-- modules/35_natveg/dynamic_feb21/input.gms | 2 +- modules/73_timber/default/input.gms | 2 +- modules/73_timber/default/preloop.gms | 4 +--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 354e033617..6e86299c3f 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -164,7 +164,8 @@ pc32_yield_forestry_future(j) = sum(ac$(ac.off = p32_rotation_cellular_estb(t,j) * Fader for plantation share in establishment decision if(ord(t) = 1, pc32_prod_forestry_ini(i) = sum(cell(i,j), sum(ac$(ac.off = p32_rotation_cellular_harvesting(t,j)), pm_timber_yield(t,j,ac,"forestry") * p32_land(t,j,"plant",ac))) / m_timestep_length_forestry; - pc32_plant_contr_ini(i) = pc32_prod_forestry_ini(i) / sum(kforestry, pm_demand_ext(t,i,kforestry)); + pc32_plant_contr_ini(i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) > 0) = pc32_prod_forestry_ini(i) / sum(kforestry, pm_demand_ext(t,i,kforestry)); + pc32_plant_contr_ini(i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) = 0) = 0; p32_plant_contr(t,i) = pc32_plant_contr_ini(i); else p32_plant_contr(t,i) = p32_plant_contr(t-1,i) * (1+i32_plant_contr_growth_fader(t))**m_timestep_length_forestry; @@ -174,7 +175,8 @@ p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_co p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) > 0) = pm_demand_forestry_future(t,i,kforestry) / sum(kforestry2, pm_demand_forestry_future(t,i,kforestry2)); p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) = 0) = 1/card(kforestry); -p32_future_to_current_demand_ratio(t,i) = sum(kforestry, pm_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_ext(t,i,kforestry)); +p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) > 0) = sum(kforestry, pm_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_ext(t,i,kforestry)); +p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) = 0) = 0; * Avoid conflict between afforestation for carbon uptake on land and secdforest restoration pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) diff --git a/modules/35_natveg/dynamic_feb21/input.gms b/modules/35_natveg/dynamic_feb21/input.gms index 89828c827e..cfe1752b0c 100644 --- a/modules/35_natveg/dynamic_feb21/input.gms +++ b/modules/35_natveg/dynamic_feb21/input.gms @@ -10,7 +10,7 @@ $setglobal c35_aolc_policy npi $setglobal c35_shock_scenario none scalars -s35_hvarea Flag for harvested area (0=zero 1=exognous 2=endogneous) / 0 / +s35_hvarea Flag for harvested area (0=zero 1=exognous 2=endogneous) / 2 / s35_hvarea_secdforest annual secdforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / s35_hvarea_primforest annual primforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / s35_hvarea_other annual other land harvest rate for s35_hvarea equals 1 (percent per year) / 0 / diff --git a/modules/73_timber/default/input.gms b/modules/73_timber/default/input.gms index c046fdfa64..797d4bbbba 100644 --- a/modules/73_timber/default/input.gms +++ b/modules/73_timber/default/input.gms @@ -19,7 +19,7 @@ scalars s73_timber_prod_cost_woodfuel Cost for prodcing one unit of woodfuel (USD per tDM) / 60 / s73_free_prod_cost Very high cost for settling demand without production (USD per tDM) /20000/ s73_timber_demand_switch Logical switch to turn on or off timber demand 1=on 0=off (1) / 0 / - s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 0 / + s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 1 / s73_increase_ceiling Limiter for not allowing a demand jump between time steps beyond a certain limit (1) /1.025/ s73_residue_ratio Proportion of overall industrial roundwood production which ends up as residue during harvest (1) / 0.15/ sm_wood_density Representative wood density based on IPCC (tDM per m3) /0.6/ diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index bdd76ca93d..f871c7cede 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -91,10 +91,8 @@ pm_demand_ext(t_all,i,kforestry)$(m_year(t_all)>2100) = pm_demand_ext("y2100",i, ** Calculate global demand p73_glo_wood(t_all,kforestry) = sum(i,pm_demand_ext(t_all,i,kforestry)); -vm_prod_forestry.l(j,"wood") = 0; -vm_prod.l(j,"wood") = 0; - im_timber_prod_cost("wood") = s73_timber_prod_cost_wood; im_timber_prod_cost("woodfuel") = s73_timber_prod_cost_woodfuel; +* initialize values for presolve of other modules pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * 1.2; From 8bf84920afccee57edb190e07ec759195e1a697c Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 9 May 2024 21:51:25 +0200 Subject: [PATCH 138/259] update --- config/scenario_config.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 4c1657a7d8..96f7b9d7c7 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -74,7 +74,7 @@ gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;; gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;; gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;; gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;; gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;; From 1942a8f10b033f5dbea9e3a561cd21594fd6a1ce Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 10 May 2024 00:14:11 +0200 Subject: [PATCH 139/259] reworked forest recovery equations --- core/sets.gms | 15 ++++++++----- modules/10_land/landmatrix_dec18/presolve.gms | 3 --- .../pot_forest_may24/declarations.gms | 13 ++++++++--- .../35_natveg/pot_forest_may24/equations.gms | 22 ++++++++++++++++--- modules/35_natveg/pot_forest_may24/input.gms | 4 ++-- .../35_natveg/pot_forest_may24/postsolve.gms | 16 ++++++++++++++ .../35_natveg/pot_forest_may24/presolve.gms | 6 ----- modules/80_optimization/nlp_apr17/solve.gms | 5 ++++- 8 files changed, 60 insertions(+), 24 deletions(-) diff --git a/core/sets.gms b/core/sets.gms index 5ee0ef2fe4..407cc57255 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -245,19 +245,22 @@ sets / crop, past, forestry, primforest, secdforest, urban, other / land_ag(land) Agricultural land pools - / crop, past / - - land_timber(land) land from which timber can be taken away - / forestry, primforest, secdforest, other / + / crop, past / land_forest(land) Forested land pools - / forestry, primforest, secdforest / + / forestry, primforest, secdforest / + + land_noforest(land) Non-forest land pools + / crop, past, urban, other / + + land_timber(land) land from which timber can be taken away + / forestry, primforest, secdforest, other / land_natveg(land_timber) Natural vegetation land pools / primforest, secdforest, other / forest_type forest type - / plantations, natveg / + / plantations, natveg / ***Forestry** ac Age classes / ac0,ac5,ac10,ac15,ac20,ac25,ac30,ac35,ac40,ac45,ac50, diff --git a/modules/10_land/landmatrix_dec18/presolve.gms b/modules/10_land/landmatrix_dec18/presolve.gms index b3bd374f4c..edee5163dc 100644 --- a/modules/10_land/landmatrix_dec18/presolve.gms +++ b/modules/10_land/landmatrix_dec18/presolve.gms @@ -20,9 +20,6 @@ vm_lu_transitions.fx(j,"secdforest","other") = 0; vm_lu_transitions.fx(j,land_from,"primforest") = 0; vm_lu_transitions.up(j,"primforest","primforest") = Inf; -*' Forestry can only be converted into secdforest but not other -vm_lu_transitions.fx(j,"forestry","other") = 0; - *' @stop m_boundfix(vm_land,(j,land),up,10e-5); diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 5e08255b8e..b027d86da0 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -20,7 +20,6 @@ parameters p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) p35_max_forest_recovery(j) Forest recovery potential (mio. ha) - p35_forest_recovery_shr(j) Forest share in the regeneration of natural vegetation (1) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) @@ -46,9 +45,10 @@ equations q35_landdiff Difference in natveg land (mio. ha) q35_other_expansion(j) Other land expansion (mio. ha) q35_other_reduction(j,ac) Other land reduction (mio. ha) - q35_secdforest_expansion(j) Secdforest reduction (mio. ha) + q35_secdforest_expansion(j) Secdforest expansion (mio. ha) q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) + q35_secdforest_recovery_area(j) Forest recovery constraint after land abandonment (mio. ha) q35_secdforest_regeneration(j) Secondary forest regeneration (mio. ha) q35_max_forest_expansion(j) Maximum forestry regeneration based on potential forest area (mio. ha) q35_other_regeneration(j) Other land regeneration (mio. ha) @@ -65,6 +65,8 @@ equations q35_bv_secdforest(j,potnatveg) Biodiversity value of secondary forest (mio. ha) q35_bv_other(j,potnatveg) Biodiversity value of other land (mio. ha) q35_natveg_conservation(j) Total natural vegetation conservation constraint (mio. ha) + q35_secdforest_restoration(j) Secondary forest restoration constraint (mio. ha) + q35_other_restoration(j) Other land restoration constraint (mio. ha) ; positive variables @@ -76,6 +78,7 @@ positive variables v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) + v35_secdforest_recovery_area(j) Forest recovery area after land abandonment (mio. ha) v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) v35_hvarea_other(j,ac) Harvested area from other land (mio. ha) v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) @@ -94,6 +97,7 @@ parameters ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha) + ov35_secdforest_recovery_area(t,j,type) Forest recovery area after land abandonment (mio. ha) ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha) ov35_hvarea_other(t,j,ac,type) Harvested area from other land (mio. ha) ov35_hvarea_primforest(t,j,type) Harvested area from primary forest (mio. ha) @@ -109,9 +113,10 @@ parameters oq35_landdiff(t,type) Difference in natveg land (mio. ha) oq35_other_expansion(t,j,type) Other land expansion (mio. ha) oq35_other_reduction(t,j,ac,type) Other land reduction (mio. ha) - oq35_secdforest_expansion(t,j,type) Secdforest reduction (mio. ha) + oq35_secdforest_expansion(t,j,type) Secdforest expansion (mio. ha) oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) + oq35_secdforest_recovery_area(t,j,type) Forest recovery constraint after land abandonment (mio. ha) oq35_secdforest_regeneration(t,j,type) Secondary forest regeneration (mio. ha) oq35_max_forest_expansion(t,j,type) Maximum forestry regeneration based on potential forest area (mio. ha) oq35_other_regeneration(t,j,type) Other land regeneration (mio. ha) @@ -128,5 +133,7 @@ parameters oq35_bv_secdforest(t,j,potnatveg,type) Biodiversity value of secondary forest (mio. ha) oq35_bv_other(t,j,potnatveg,type) Biodiversity value of other land (mio. ha) oq35_natveg_conservation(t,j,type) Total natural vegetation conservation constraint (mio. ha) + oq35_secdforest_restoration(t,j,type) Secondary forest restoration constraint (mio. ha) + oq35_other_restoration(t,j,type) Other land restoration constraint (mio. ha) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 6657d8e7f9..815ccdad9b 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -21,6 +21,17 @@ =g= sum((ct,land_natveg,consv_type), pm_land_conservation(ct,j2,land_natveg,consv_type)); + q35_secdforest_restoration(j2) .. + sum(land_ag, vm_lu_transitions(j2,land_ag,"secdforest")) + + vm_lu_transitions(j2,"forestry","secdforest") + =g= + p35_land_restoration(j2,"secdforest"); + + q35_other_restoration(j2) .. + sum(land_ag, vm_lu_transitions(j2,land_ag,"other")) + =g= + p35_land_restoration(j2,"other"); + *' Carbon stocks for primary forest, secondary forest or other natural land are calculated *' as the product of respective area and carbon density. *' Carbon stocks decline if the area decreases @@ -181,10 +192,16 @@ q35_secdforest_regeneration(j2).. sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + v35_hvarea_primforest(j2) + p35_land_restoration(j2,"secdforest") - + sum(land_ag, vm_lu_transitions(j2,land_ag,"other")) * p35_forest_recovery_shr(j2) - + vm_lu_transitions(j2,"forestry","secdforest") + + v35_secdforest_recovery_area(j2) ; +q35_secdforest_recovery_area(j2).. + v35_secdforest_recovery_area(j2) + =e= + + (p35_max_forest_recovery(j2) - p35_land_restoration(j2,"secdforest")) + * (sum(land_noforest,vm_landreduction(j2,land_noforest))/(sum(land_noforest,vm_land(j2,land_noforest))+1e-10)) + + vm_landreduction(j2,"forestry"); + *' The constraint for forest establishment is given by the *' remaining potential forest area, which was calculated based *' on the potential natural forest area in each cluster. @@ -201,7 +218,6 @@ q35_other_regeneration(j2).. sum(ac_est, v35_other(j2,ac_est)) =g= sum(ac_sub,v35_hvarea_other(j2,ac_sub)) - + sum(land_ag, vm_lu_transitions(j2,land_ag,"other")) * (1 - p35_forest_recovery_shr(j2)) ; *' The following two constraints distribute additions to secdforest and other land diff --git a/modules/35_natveg/pot_forest_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms index de5bef3564..276c47c2f8 100644 --- a/modules/35_natveg/pot_forest_may24/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -5,8 +5,8 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -$setglobal c35_ad_policy npi -$setglobal c35_aolc_policy npi +$setglobal c35_ad_policy ndc +$setglobal c35_aolc_policy ndc $setglobal c35_shock_scenario none scalars diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index 859c858748..656abd9d7e 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -20,6 +20,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j); ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac); ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j); + ov35_secdforest_recovery_area(t,j,"marginal") = v35_secdforest_recovery_area.m(j); ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac); ov35_hvarea_other(t,j,ac,"marginal") = v35_hvarea_other.m(j,ac); ov35_hvarea_primforest(t,j,"marginal") = v35_hvarea_primforest.m(j); @@ -38,6 +39,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j); oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); + oq35_secdforest_recovery_area(t,j,"marginal") = q35_secdforest_recovery_area.m(j); oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.m(j); oq35_max_forest_expansion(t,j,"marginal") = q35_max_forest_expansion.m(j); oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); @@ -54,6 +56,8 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_bv_secdforest(t,j,potnatveg,"marginal") = q35_bv_secdforest.m(j,potnatveg); oq35_bv_other(t,j,potnatveg,"marginal") = q35_bv_other.m(j,potnatveg); oq35_natveg_conservation(t,j,"marginal") = q35_natveg_conservation.m(j); + oq35_secdforest_restoration(t,j,"marginal") = q35_secdforest_restoration.m(j); + oq35_other_restoration(t,j,"marginal") = q35_other_restoration.m(j); ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac); ov35_other(t,j,ac,"level") = v35_other.l(j,ac); ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l; @@ -62,6 +66,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j); ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac); ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j); + ov35_secdforest_recovery_area(t,j,"level") = v35_secdforest_recovery_area.l(j); ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac); ov35_hvarea_other(t,j,ac,"level") = v35_hvarea_other.l(j,ac); ov35_hvarea_primforest(t,j,"level") = v35_hvarea_primforest.l(j); @@ -80,6 +85,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j); oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); + oq35_secdforest_recovery_area(t,j,"level") = q35_secdforest_recovery_area.l(j); oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.l(j); oq35_max_forest_expansion(t,j,"level") = q35_max_forest_expansion.l(j); oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); @@ -96,6 +102,8 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_bv_secdforest(t,j,potnatveg,"level") = q35_bv_secdforest.l(j,potnatveg); oq35_bv_other(t,j,potnatveg,"level") = q35_bv_other.l(j,potnatveg); oq35_natveg_conservation(t,j,"level") = q35_natveg_conservation.l(j); + oq35_secdforest_restoration(t,j,"level") = q35_secdforest_restoration.l(j); + oq35_other_restoration(t,j,"level") = q35_other_restoration.l(j); ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac); ov35_other(t,j,ac,"upper") = v35_other.up(j,ac); ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up; @@ -104,6 +112,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j); ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac); ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j); + ov35_secdforest_recovery_area(t,j,"upper") = v35_secdforest_recovery_area.up(j); ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac); ov35_hvarea_other(t,j,ac,"upper") = v35_hvarea_other.up(j,ac); ov35_hvarea_primforest(t,j,"upper") = v35_hvarea_primforest.up(j); @@ -122,6 +131,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j); oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); + oq35_secdforest_recovery_area(t,j,"upper") = q35_secdforest_recovery_area.up(j); oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.up(j); oq35_max_forest_expansion(t,j,"upper") = q35_max_forest_expansion.up(j); oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); @@ -138,6 +148,8 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_bv_secdforest(t,j,potnatveg,"upper") = q35_bv_secdforest.up(j,potnatveg); oq35_bv_other(t,j,potnatveg,"upper") = q35_bv_other.up(j,potnatveg); oq35_natveg_conservation(t,j,"upper") = q35_natveg_conservation.up(j); + oq35_secdforest_restoration(t,j,"upper") = q35_secdforest_restoration.up(j); + oq35_other_restoration(t,j,"upper") = q35_other_restoration.up(j); ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac); ov35_other(t,j,ac,"lower") = v35_other.lo(j,ac); ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo; @@ -146,6 +158,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j); ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac); ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j); + ov35_secdforest_recovery_area(t,j,"lower") = v35_secdforest_recovery_area.lo(j); ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac); ov35_hvarea_other(t,j,ac,"lower") = v35_hvarea_other.lo(j,ac); ov35_hvarea_primforest(t,j,"lower") = v35_hvarea_primforest.lo(j); @@ -164,6 +177,7 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j); oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); + oq35_secdforest_recovery_area(t,j,"lower") = q35_secdforest_recovery_area.lo(j); oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.lo(j); oq35_max_forest_expansion(t,j,"lower") = q35_max_forest_expansion.lo(j); oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); @@ -180,4 +194,6 @@ p35_other(t,j,ac) = v35_other.l(j,ac); oq35_bv_secdforest(t,j,potnatveg,"lower") = q35_bv_secdforest.lo(j,potnatveg); oq35_bv_other(t,j,potnatveg,"lower") = q35_bv_other.lo(j,potnatveg); oq35_natveg_conservation(t,j,"lower") = q35_natveg_conservation.lo(j); + oq35_secdforest_restoration(t,j,"lower") = q35_secdforest_restoration.lo(j); + oq35_other_restoration(t,j,"lower") = q35_other_restoration.lo(j); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 5346fb9187..ce39680935 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -83,11 +83,6 @@ pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); p35_max_forest_recovery(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; -* The forest recovery share is given by the relation between the forest recovery potential -* and the agricultural land area of the previous time step. -p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / sum(land_ag, pcm_land(j,land_ag)); -p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; - * ------------------------------------- * Set bounds based on land conservation * ------------------------------------- @@ -139,7 +134,6 @@ p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","re * land area meets the total natural land conservation target p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; - * Since forest restoration cannot be bigger than the maximum area for forest recovery, * any remaining restoration area is substracted and shifted to other land restoration. p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index bae758fec1..f06dfcb779 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -30,7 +30,7 @@ Flg_Prep = FALSE $offecho *' @code -*' Solve statement is put twice for improved model results, +*' Solve statement is put twice for improved model results, *' in particular for matching LHS and RHS of equations. solve magpie USING nlp MINIMIZING vm_cost_glo; solve magpie USING nlp MINIMIZING vm_cost_glo; @@ -40,6 +40,9 @@ display "vm_cost_glo.l"; display vm_cost_glo.l; display magpie.modelstat; +* set modelstat to 13 in case of NA for continuation +magpie.modelStat$(magpie.modelStat=NA) = 13; + * in case of problems try different solvers and optfile settings if (magpie.modelstat > 2, repeat( From 42ff0ba95f77fb1f6ebec8c12fef2e1e71663898 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 10 May 2024 09:40:48 +0200 Subject: [PATCH 140/259] defaults --- config/scenario_config.csv | 2 +- modules/32_forestry/dynamic_may24/input.gms | 2 +- modules/32_forestry/dynamic_may24/preloop.gms | 63 ++++++++++++++++++- modules/73_timber/default/input.gms | 2 +- 4 files changed, 65 insertions(+), 4 deletions(-) mode change 100755 => 100644 config/scenario_config.csv diff --git a/config/scenario_config.csv b/config/scenario_config.csv old mode 100755 new mode 100644 index 96f7b9d7c7..4c1657a7d8 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -74,7 +74,7 @@ gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;; gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;; gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;; gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;; gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;; diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index d072426e61..89ac88ac42 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -36,7 +36,7 @@ scalars s32_planing_horizon Afforestation planing horizon (years) / 50 / s32_rotation_extension Rotation extension factor 1=original rotations 2=100 percent increase in rotations etc (1) / 1 / s32_faustmann_rotation Switch to activate faustmann rotations (1=on 0=off) / 0 / - s32_initial_distribution Switch to Activate ageclass distribution in plantations 1=equal distribution (1) / 1 / + s32_initial_distribution Switch to Activate ageclass distribution in plantations 0=off 1=equal distribution 2=FAO distribution 3=Poulter distribution 4=Manual distribution (1) / 0 / s32_price Price for timber (USD) / 45 / s32_free_land_cost Penalty for technial area balance term (USD per ha) / 1e+06 / s32_max_aff_area Maximum total global afforestation (mio. ha) / Inf / diff --git a/modules/32_forestry/dynamic_may24/preloop.gms b/modules/32_forestry/dynamic_may24/preloop.gms index 4d4ede2052..2f944fb313 100644 --- a/modules/32_forestry/dynamic_may24/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -146,12 +146,73 @@ ini32(j,ac) = no; ini32(j,ac) = yes$(ord(ac) >= 1 AND ac.off < p32_rotation_cellular_harvesting("y1995",j)); ** divide initial forestry area by number of age classes within ini32 -if(s32_initial_distribution = 1, +** divide initial forestry area by number of age classes within ini32 +if(s32_initial_distribution = 0, +** Initialize with highest age class + p32_land_start_ac(j,"plant","acx") = pcm_land(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); + p32_land_start_ac(j,"ndc","acx") = pcm_land(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)); + +elseif s32_initial_distribution = 1, ** Initialize with equal distribution among rotation age classes ** Plantated forest area is divided into ndcs (other planted forest) and plantations p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j); p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1- f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + +elseif s32_initial_distribution = 2, +** Initialize with distribution based on FAO data (but this distribution is applied to all cells globally) +** Plantated forest area is divided into ndcs (other planted forest) and plantations + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); + p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * f32_ac_dist(ac); + p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * f32_ac_dist(ac); + +elseif s32_initial_distribution = 3, +** Initialize with Poulter distribution among rotation age classes +** Plantated forest area is divided into ndcs (other planted forest) and plantations + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); + p32_rotation_dist(j,ac) = (im_plantedclass_ac(j,ac)$(ini32(j,ac))/sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2))))$(sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2)))); + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j) * p32_rotation_dist(j,ac); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_rotation_dist(j,ac); + +*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell + loop (j, + if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + ); + ); + +elseif s32_initial_distribution = 4, +** Initialize with Manual distribution among rotation age classes +** Plantated forest area is divided into ndcs (other planted forest) and plantations + loop(j, +** Set all acs to 0 + p32_ac_dist_flag(j,ac) = 0; +** Calculate reverse of age-classes, if rotation is 11acs, then ac0 should get a value of 11, 11th ac should get value of 1 + p32_ac_dist_flag(j,ac) = (10*p32_rotation_cellular_harvesting("y1995",j)-((ord(ac)-1))*5)$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); +** Calculate the weights, youngest age-class will have highest weight + p32_ac_dist(j,ac) = (p32_ac_dist_flag(j,ac) / (sum(ac2,p32_ac_dist_flag(j,ac2)) + ord(ac)))$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); +** there can be isntances where this distribution is not summing up to 1, in that case we take the excess and remove it evenly from all age-classes +** In case the sum of distribution is > 1 : Remove the excess from ac0 + p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))>1) = p32_ac_dist(j,"ac0") - (sum(ac2, p32_ac_dist(j,ac2))-1); +** In case the sum of distribution is < 1 : Add the shortage to ac0 + p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))<1) = p32_ac_dist(j,"ac0") + (1-sum(ac2, p32_ac_dist(j,ac2))); + ); +** Isolate plantations from planted forest (forestry) + p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); +** Divide plantations according to distribution + p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * p32_ac_dist(j,ac); +** Divide NDCs according to same distribution + p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_ac_dist(j,ac); + +*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell + loop (j, + if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); + ); + ); + ); ** Redistribute to youngest age class in case the distribution to plantations and diff --git a/modules/73_timber/default/input.gms b/modules/73_timber/default/input.gms index 797d4bbbba..c046fdfa64 100644 --- a/modules/73_timber/default/input.gms +++ b/modules/73_timber/default/input.gms @@ -19,7 +19,7 @@ scalars s73_timber_prod_cost_woodfuel Cost for prodcing one unit of woodfuel (USD per tDM) / 60 / s73_free_prod_cost Very high cost for settling demand without production (USD per tDM) /20000/ s73_timber_demand_switch Logical switch to turn on or off timber demand 1=on 0=off (1) / 0 / - s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 1 / + s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 0 / s73_increase_ceiling Limiter for not allowing a demand jump between time steps beyond a certain limit (1) /1.025/ s73_residue_ratio Proportion of overall industrial roundwood production which ends up as residue during harvest (1) / 0.15/ sm_wood_density Representative wood density based on IPCC (tDM per m3) /0.6/ From 1af10978c85503a279dc8a418e23d6fb894bbd45 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 10 May 2024 15:28:03 +0200 Subject: [PATCH 141/259] update --- modules/73_timber/default/input.gms | 5 +++-- modules/73_timber/default/preloop.gms | 2 +- modules/73_timber/default/presolve.gms | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/73_timber/default/input.gms b/modules/73_timber/default/input.gms index c046fdfa64..b975c80f8a 100644 --- a/modules/73_timber/default/input.gms +++ b/modules/73_timber/default/input.gms @@ -18,8 +18,9 @@ scalars s73_timber_prod_cost_wood Cost for producing one unit of wood (USD per tDM) / 120 / s73_timber_prod_cost_woodfuel Cost for prodcing one unit of woodfuel (USD per tDM) / 60 / s73_free_prod_cost Very high cost for settling demand without production (USD per tDM) /20000/ - s73_timber_demand_switch Logical switch to turn on or off timber demand 1=on 0=off (1) / 0 / - s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 0 / + s73_timber_demand_switch Logical switch to turn on or off timber demand 1=on 0=off (1) / 1 / + s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 1 / + s73_demand_multiplier_hist Multiplier used in historic period to obtain the same future demand in all scenarios / 1.2 / s73_increase_ceiling Limiter for not allowing a demand jump between time steps beyond a certain limit (1) /1.025/ s73_residue_ratio Proportion of overall industrial roundwood production which ends up as residue during harvest (1) / 0.15/ sm_wood_density Representative wood density based on IPCC (tDM per m3) /0.6/ diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index f871c7cede..4b1e5b8157 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -95,4 +95,4 @@ im_timber_prod_cost("wood") = s73_timber_prod_cost_wood; im_timber_prod_cost("woodfuel") = s73_timber_prod_cost_woodfuel; * initialize values for presolve of other modules -pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * 1.2; +pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_foresight_multiplier_hist; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index 8c78d44eec..c5709043ea 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -11,7 +11,7 @@ if(s73_foresight=1, if(m_year(t) <= sm_fix_SSP2, - pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * 1.2; + pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_foresight_multiplier_hist; else pm_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_ext(t_ext,i,kforestry)); ); From 7eb17fe9534a0284adf8161fa56f42ecc10b26d2 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 10 May 2024 16:06:07 +0200 Subject: [PATCH 142/259] added combination of non-food mitigation mesaures scenario --- scripts/start/projects/project_EAT2p0_DeepDive.R | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 13c3a25c51..4a4a749201 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -242,6 +242,19 @@ cfg <- bau(cfg = cfg) cfg <- priceNonCO2(cfg = cfg) start_run(cfg, codeCheck = FALSE) + +# BAU_MIT # +# All production-side land-based mitigation measures +cfg$title <- "BAU_MIT" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + + # MITI_Diet (mitigation - PHD) # # All production-side land-based mitigation measures, but no demand-side mitigation (diet change) cfg$title <- "MITI_Diet" From 50e1d73e1c416e6a7a0301158673b4c356cab11b Mon Sep 17 00:00:00 2001 From: Jan Steinhauser Date: Mon, 13 May 2024 10:55:27 +0200 Subject: [PATCH 143/259] Clarify BE setting description --- config/default.cfg | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index d1c4982d98..0dd90a2d52 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1751,9 +1751,6 @@ cfg$gms$c60_biodem_level <- 1 # def = 1 # * Therefore, the minimum demand is of particular importance for the coupling with REMIND. cfg$gms$s60_2ndgen_bioenergy_dem_min <- 1 # def = 1 -# * Minimum demand (mio. GJ per yr) can be set to 0 for price-driven runs past the SSP2_fix (1st2ndgen_priced_feb24 only) -cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 - # * t DM-based first generation bioenergy subsidy (USD05MER per ton) # * (1stgen_priced_dec18): c60_bioenergy_subsidy is applied constant over historic and model horizon, c60_bioenergy_subsidy_fix_SSP2 has no effect # * (1st2ndgen_priced_feb24): c60_bioenergy_subsidy_fix_SSP2 is applied constant to historic time steps (up until sm_fix_SSP2). @@ -1762,6 +1759,13 @@ cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 cfg$gms$c60_bioenergy_subsidy <- 300 # def = 300 cfg$gms$c60_bioenergy_subsidy_fix_SSP2 <- 300 # def = 300 +# ** Options for realization `1st2ndgen_priced_feb24` + +# * Minimum demand (mio. GJ per yr) for the model horizon past sm_fix_SSP2. +# * s60_2ndgen_bioenergy_dem_min is used for the historic time steps (up until sm_fix_SSP2 only). +# * This can be used to set model horizon minimum demand to 0 for price-driven runs +cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix <- 1 # def = 1 + # * GJ-based bioenergy subsidy (USD05MER per GJ), only used in 1st2ndgen_priced_feb24 # * Target prices for 1st and 2nd gen bioenergy cfg$gms$s60_bioenergy_gj_price_1st <- 0 # def = 0 From 62c248df704086b51507bac6f86e78dc6f89e18d Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 12:17:09 +0200 Subject: [PATCH 144/259] updated configs --- config/default.cfg | 94 +++++++++---------- config/scenario_config.csv | 5 +- main.gms | 20 ++-- modules/15_food/anthro_iso_jun22/preloop.gms | 2 +- .../70_livestock/fbask_jan16/declarations.gms | 2 + modules/70_livestock/fbask_jan16/input.gms | 16 ++-- modules/70_livestock/fbask_jan16/preloop.gms | 17 +++- 7 files changed, 86 insertions(+), 70 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 16fb199815..0e27c7482e 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -375,17 +375,11 @@ cfg$gms$s15_rum_share_fadeout_india_strong <- 1 # def = 1 # * options: 0 (=off), 1 (=on) cfg$gms$s15_milk_share_fadeout_india <- 1 # def = 1 -# * Food substitution scenarios including functional forms, targets -# * and transition periods (applied after food demand model is executed) -# * options consist of 3 parts: functional form (lin,sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050) -# * Example for sigmoid_50pc_20_50: -# * Functional form: sigmoid (S-shaped) -# * Target: 50percent reduction at end of transition period (2050 in this case) -# * Transition period: start in 2020, end in 2050 -# * options: constant, -# * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, -# * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, -# * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 +# * Food substitution scenarios (applied after food demand model is executed) +# * Values between 0 and 1 are allowed, where 0 means no food is substituted, +# * while 1 corresponds to a full substitution of food items with alternatives. +# * The functional form and the start and target years of the food substitution +# * can be specified below cfg$gms$s15_ruminant_substitution <- 0 # def = 0 cfg$gms$s15_fish_substitution <- 0 # def = 0 cfg$gms$s15_alcohol_substitution <- 0 # def = 0 @@ -393,26 +387,28 @@ cfg$gms$s15_livestock_substitution <- 0 # def = 0 cfg$gms$s15_rumdairy_scp_substitution <- 0 # def = 0 cfg$gms$s15_rumdairy_substitution <- 0 # def = 0 -cfg$gms$s15_subst_functional_form <- 1 # def = 1 - -cfg$gms$s15_food_substitution_start <- 2025 # def = 2025 -cfg$gms$s15_food_substitution_target <- 2050 # def = 2050 - # * Set items of kfo_rd. This option allows for sensitivity scenarios. # * kfo_rd is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen (see above) # * options: "livst_rum,livst_milk", "livst_rum" or "livst_milk" cfg$gms$kfo_rd <- "livst_rum" #def = livst_rum -# * Reduction of livestock products towards a kcal/cap/day intake target with or w/o substitution +# * Convergence of livestock food intake towards a kcal/cap/day target with or w/o substitution. +# * The functional form and the start and target years of the food substitution can be specified below. +# * options: 0 = no converge, 1 = convergence to target +cfg$gms$s15_livescen_target <- 0 # def = 0 # * maximum kcal/cap/day intake target used for downwards convergence of livestock products cfg$gms$s15_kcal_pc_livestock_intake_target <- "430" # def = 430 -# * choice temporal fade-out towards s15_kcal_pc_livestock_intake_target -# * options: constant, lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70 -cfg$gms$s15_livescen_target <- 0 # def = constant # * fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) # * options: 0 (=fade-out), 1 (=substitution) cfg$gms$s15_livescen_target_subst <- 1 # def = 1 +# * Functional form of the substitution/convergence over time +# * options: 1 = linear substitution, 2 = sigmoid substitution +cfg$gms$s15_subst_functional_form <- 1 # def = 1 +# * Start year of food subsitution +cfg$gms$s15_food_substitution_start <- 2025 # def = 2025 +# * Target year (year when target substitution is reached) +cfg$gms$s15_food_substitution_target <- 2050 # def = 2050 # ***** Start configuration of exogenous food intake and waste scenarios ***** # @@ -504,25 +500,25 @@ cfg$gms$s15_alc_scen <- 0 # def = 0 # * Default: all iso countries cfg$gms$scen_countries15 <- all_iso_countries # -# * Transition to exogenous food intake and waste scenarios (applied after the food demand model is executed). -# * The resulting scenario parametrisation is a linear combination of the default MAgPIE parametrisation and -# * the exogenous scenario data input. -# * Options consist of 3 parts: functional form (lin, sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc; -# * pc: percent) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050). -# * The target defines the relative contribution of the default MAgPIE parametrisation, e.g. zero -# * defines a full transition to the exogenous scenario data input. -# * Examples with target year y2030: lin_zero_20_30 -# * Examples with target year y2050: lin_zero_20_50 -# * Examples with target year y2070: lin_zero_20_70 -# * For the full list of available options, see information on food substitution scenarios above. +# * Transition to exogenous food intake and waste scenarios (applied after the +# * food demand model is executed). The resulting scenario parametrisation is +# * a linear combination of the default MAgPIE parametrisation and the exogenous +# * scenario data input. # * Only active if at least one of the exogenous food intake and waste scenario # * switches (s15_exo_diet and s15_exo_waste) is set to 1. +# * Values between 0 and 1 are allowed, where 0 means no convergence to exogenous +# * food intake scenario, while 1 corresponds to a full convergence to exogenous +# * food intake scenario. +# * The functional form and the start and target years of the food substitution +# * can be specified below cfg$gms$s15_exo_foodscen_convergence <- 1 # def = 1 - -cfg$gms$s15_exo_foodscen_functional_form <- 1 # def = 1 - -cfg$gms$s15_exo_foodscen_start <- 2025 # def = 2025 -cfg$gms$s15_exo_foodscen_target <- 2050 # def = 2050 +# * Functional form of the convergence to the exogeneous food intake scenario over time +# * options: 1 = linear convergence, 2 = sigmoid convergence +cfg$gms$s15_exo_foodscen_functional_form <- 1 # def = 1 +# * Start year of convergence to exogeneous food intakte scenario +cfg$gms$s15_exo_foodscen_start <- 2025 # def = 2025 +# * Target year (year when s15_exo_foodscen_convergence is reached) +cfg$gms$s15_exo_foodscen_target <- 2050 # def = 2050 # ***** End configuration of exogenous food intake and waste scenarios ***** @@ -1787,19 +1783,23 @@ cfg$gms$s70_past_mngmnt_factor_fix <- "2005" # def = 2005 cfg$gms$c70_feed_scen <- "ssp2" # def = ssp2 # * Feed substitution scenarios. -# * options consist of 3 parts: functional form (lin,sigmoid), target (zero, 20pc, 50pc, 80pc, 90pc) and transition period (10_50: from 2010 to 2050, 20_50: from 2020 to 2050) -# * Example for sigmoid_50pc_20_50: -# * Functional form: sigmoid (S-shaped) -# * Target: 50percent reduction at end of transition period (2050 in this case) -# * Transition period: start in 2020, end in 2050 -# * options: constant, -# * lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_zero_20_70, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, -# * lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, -# * lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 +# * Feed substitution scenarios. +# * Values between 0 and 1 are allowed, where 0 means no feed is substituted, +# * while 1 corresponds to a full substitution of feed items with SCP. +# * The functional form and the start and target years of the feed substitution +# * can be specified below # * Cereal feed substituted by SCP -cfg$gms$c70_cereal_scp_scen <- "constant" # def = constant +cfg$gms$s70_cereal_scp_substitution <- 0 # def = 0 # * Fodder feed substituted by SCP -cfg$gms$c70_foddr_scp_scen <- "constant" # def = constant +cfg$gms$s70_foddr_scp_substitution <- 0 # def = 0 + +# * Functional form of the feed substitution over time +# * options: 1 = linear substitution, 2 = sigmoid substitution +cfg$gms$s70_subst_functional_form <- 1 # def = 1 +# * Start year of feed subsitution +cfg$gms$s70_feed_substitution_start <- 2025 # def = 2025 +# * Target year (year when target feed substitution is reached) +cfg$gms$s70_feed_substitution_target <- 2050 # def = 2050 # * Regional (reg) or global (glo) regression for livestock factor requirements. # * Typically, the same version (glo or reg) should be chosen for c38_fac_req diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 4c1657a7d8..81424a2d5a 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -9,7 +9,10 @@ gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1; gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;; gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c15_exo_foodscen;;;;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;lin_zero_20_70;;;;;;;lin_zero_20_50;lin_zero_20_50;lin_zero_20_50;;;;lin_zero_20_50;;;lin_zero_20_50;;;;;;;;;;;;;;;;;;;lin_zero_20_50 +gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 +"gms$s15_exo_foodscen_functional_form ";;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 +gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2020;2020;;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020 +gms$s15_exo_foodscen_target;;;;;;;;;;2050;2050;2050;2070;;;;;;;2050;2050;2050;;;;2050;;;2050;;;;;;;;;;;;;;;;;;;2050 gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1 gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;;;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2 gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;3;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1 diff --git a/main.gms b/main.gms index ad9fed999d..c9af9052a4 100644 --- a/main.gms +++ b/main.gms @@ -149,24 +149,24 @@ $title magpie *##################### R SECTION START (VERSION INFO) ########################## * * Used data set: rev4.104_h12_magpie.tgz -* md5sum: 533c0a589c7f5d5cf40bab6ec2297640 -* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output * * Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: c2036af336688758ffd4cb03c2d1a05c -* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output * * Used data set: rev4.104_h12_validation.tgz -* md5sum: 4b222cbca5f2134ce378e3838f7cd0d5 -* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output * * Used data set: additional_data_rev4.48.tgz -* md5sum: 0788a1d39cab12f89a9411c2636bffc7 -* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive * * Used data set: calibration_H12_26Mar24.tgz -* md5sum: d295e7ff0c65d97c1e0b84c440d0056b -* Repository: /p/projects/rd3mod/mirror/rse.pik-potsdam.de/data/magpie/public +* md5sum: NA +* Repository: https://rse.pik-potsdam.de/data/magpie/public * * Low resolution: c200 * High resolution: 0.5 diff --git a/modules/15_food/anthro_iso_jun22/preloop.gms b/modules/15_food/anthro_iso_jun22/preloop.gms index 873fe5f7c5..8560fa7c96 100644 --- a/modules/15_food/anthro_iso_jun22/preloop.gms +++ b/modules/15_food/anthro_iso_jun22/preloop.gms @@ -116,7 +116,7 @@ elseif s15_exo_foodscen_functional_form = 2, ); -* Exogenous food intake and waste scenarios including functional forms, targets and transition periods +* Fade in scenarios at country level i15_exo_foodscen_fader(t,iso) = p15_exo_food_scenario_fader(t) * p15_country_dummy(iso); * Select from the data set of EAT Lancet scenarios the target years that are diff --git a/modules/70_livestock/fbask_jan16/declarations.gms b/modules/70_livestock/fbask_jan16/declarations.gms index e9892ff8b2..c824516eb4 100644 --- a/modules/70_livestock/fbask_jan16/declarations.gms +++ b/modules/70_livestock/fbask_jan16/declarations.gms @@ -36,6 +36,8 @@ parameters p70_cost_share_calibration(i) Summation factor used to calibrate calculated capital shares with historical values (1) i70_cost_regr(i,kap,cost_regr) Regression coefficients for livestock factor requirements (1) i70_fac_req_livst(t_all,i,kli) Factor requirements (USD05MER per tDM) + p70_cereal_subst_fader(t_all) Cereal feed substitution with SCP fader (1) + p70_foddr_subst_fader(t_all) Foddr substitution with SCP fader (1) ; diff --git a/modules/70_livestock/fbask_jan16/input.gms b/modules/70_livestock/fbask_jan16/input.gms index 993055b2a0..a3acdbac2f 100644 --- a/modules/70_livestock/fbask_jan16/input.gms +++ b/modules/70_livestock/fbask_jan16/input.gms @@ -23,7 +23,12 @@ $setglobal c70_fac_req_regr glo scalars s70_pyld_intercept Intercept of linear relationship determining pasture intensification (1) / 0.24 / - s70_past_mngmnt_factor_fix Year until the pasture management factor is fixed to 1 / 2005 / + s70_past_mngmnt_factor_fix Year until the pasture management factor is fixed to 1 / 2005 / + s70_subst_functional_form Switch for functional form of feed substitution scenario fader (1) / 1 / + s70_feed_substitution_start Feed substitution start year / 2025 / + s70_feed_substitution_target Feed substitution target year / 2050 / + s70_cereal_scp_substitution Cereal feed substitution with SCP share (1) / 0 / + s70_foddr_scp_substitution Fodder substitution with SCP share (1) / 0 / ; table f70_feed_baskets(t_all,i,kap,kall,feed_scen70) Feed baskets in tDM per tDM livestock product (1) @@ -91,7 +96,7 @@ $offdelim * Set-switch for countries affected by country-specific exogenous diet scenario * Default: all iso countries selected sets - scen_countries70(iso) countries to be affected by selected feed sceanrio / + scen_countries70(iso) countries to be affected by selected feed sceanrio / ABW,AFG,AGO,AIA,ALA,ALB,AND,ARE,ARG,ARM, ASM,ATA,ATF,ATG,AUS,AUT,AZE,BDI,BEL,BEN, BES,BFA,BGD,BGR,BHR,BHS,BIH,BLM,BLR,BLZ, @@ -118,10 +123,3 @@ sets UGA,UKR,UMI,URY,USA,UZB,VAT,VCT,VEN,VGB, VIR,VNM,VUT,WLF,WSM,YEM,ZAF,ZMB,ZWE / ; - -*** Feed substitution scenarios - -table f70_feed_substitution_fader(t_all,fadeoutscen70) Fader for feed substitution scenarios (1) -$ondelim -$include "./modules/70_livestock/fbask_jan16/input/f70_feed_substitution_fader.csv" -$offdelim; diff --git a/modules/70_livestock/fbask_jan16/preloop.gms b/modules/70_livestock/fbask_jan16/preloop.gms index ee9bbe6a0f..4564602ff2 100644 --- a/modules/70_livestock/fbask_jan16/preloop.gms +++ b/modules/70_livestock/fbask_jan16/preloop.gms @@ -30,10 +30,23 @@ p70_country_dummy(scen_countries70) = 1; * Countries are weighted by their population size. p70_feedscen_region_shr(t_all,i) = sum(i_to_iso(i,iso), p70_country_dummy(iso) * im_pop_iso(t_all,iso)) / sum(i_to_iso(i,iso), im_pop_iso(t_all,iso)); + +if (s70_subst_functional_form = 1, + + m_linear_time_interpol(p70_cereal_subst_fader,s70_feed_substitution_start,s70_feed_substitution_target,0,s70_cereal_scp_substitution); + m_linear_time_interpol(p70_foddr_subst_fader,s70_feed_substitution_start,s70_feed_substitution_target,0,s70_foddr_scp_substitution); + +elseif s70_subst_functional_form = 2, + + m_sigmoid_time_interpol(p70_cereal_subst_fader,s70_feed_substitution_start,s70_feed_substitution_target,0,s70_cereal_scp_substitution); + m_sigmoid_time_interpol(p70_foddr_subst_fader,s70_feed_substitution_start,s70_feed_substitution_target,0,s70_foddr_scp_substitution); + +); + * Feed substitution scenarios including functional forms, targets and transition periods * Note: p70_feedscen_region_shr(t,i) is 1 in the default case) -i70_cereal_scp_fadeout(t_all,i) = 1 - p70_feedscen_region_shr(t_all,i)*(1-f70_feed_substitution_fader(t_all,"%c70_cereal_scp_scen%")); -i70_foddr_scp_fadeout(t_all,i) = 1 - p70_feedscen_region_shr(t_all,i)*(1-f70_feed_substitution_fader(t_all,"%c70_foddr_scp_scen%")); +i70_cereal_scp_fadeout(t_all,i) = 1 - p70_feedscen_region_shr(t_all,i)*p70_cereal_subst_fader(t_all); +i70_foddr_scp_fadeout(t_all,i) = 1 - p70_feedscen_region_shr(t_all,i)*p70_foddr_subst_fader(t_all); *** Substitution of cereal feed (kcer70) with single-cell protein (SCP) based on Nr From 9a6265b1d2a278c608c0fef1e3aa91792d6c7072 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 12:26:30 +0200 Subject: [PATCH 145/259] changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e79c68937e..f1a28ac1cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- +- **15_food, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying food substitution scenarios and exogeneous food intake scenarios +- **70_livestock, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios ### added - From 4a20fb427be6d7dc23af063af00794befba83a5c Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 12:31:36 +0200 Subject: [PATCH 146/259] duplication fix --- config/default.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index 0e27c7482e..fcfc48b936 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1782,7 +1782,6 @@ cfg$gms$s70_past_mngmnt_factor_fix <- "2005" # def = 2005 # * other: constant cfg$gms$c70_feed_scen <- "ssp2" # def = ssp2 -# * Feed substitution scenarios. # * Feed substitution scenarios. # * Values between 0 and 1 are allowed, where 0 means no feed is substituted, # * while 1 corresponds to a full substitution of feed items with SCP. From ddeea95ea234c7aa41952caff3da4a3e938d86b6 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 14:42:59 +0200 Subject: [PATCH 147/259] scenario config bugfix --- config/scenario_config.csv | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 81424a2d5a..5d407929e1 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -7,7 +7,10 @@ gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;; -gms$c15_rumdairy_scp_scen;;;;constant;constant;constant;constant;constant;constant;constant;sigmoid_50pc_20_50;constant;constant;;;;;;;constant;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_rumdairy_scp_substitution;;;;0;0;0;0;0;0;0;0.5;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +"gms$s15_food_substitution_start ";;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 "gms$s15_exo_foodscen_functional_form ";;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 From 79d9e72c60564667e0e39d3f85ead0aba2365cc9 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 17:32:14 +0200 Subject: [PATCH 148/259] separated forest establishment and secondary forest recovery equations --- core/sets.gms | 3 -- .../pot_forest_may24/declarations.gms | 3 +- .../35_natveg/pot_forest_may24/equations.gms | 35 ++++++++++--------- .../35_natveg/pot_forest_may24/presolve.gms | 22 ++++++++---- modules/35_natveg/pot_forest_may24/sets.gms | 2 ++ 5 files changed, 37 insertions(+), 28 deletions(-) diff --git a/core/sets.gms b/core/sets.gms index 407cc57255..9646116aa8 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -250,9 +250,6 @@ sets land_forest(land) Forested land pools / forestry, primforest, secdforest / - land_noforest(land) Non-forest land pools - / crop, past, urban, other / - land_timber(land) land from which timber can be taken away / forestry, primforest, secdforest, other / diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index b027d86da0..5660c08646 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -19,7 +19,8 @@ parameters p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) - p35_max_forest_recovery(j) Forest recovery potential (mio. ha) + p35_max_secdforest_recovery(j) Secondary forest recovery potential (mio. ha) + p35_max_forest_establishment(j) Overall forest establishment potential (mio. ha) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 815ccdad9b..4206ec790d 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -181,11 +181,29 @@ q35_hvarea_other(j2,ac_sub).. v35_other_reduction(j2,ac_sub); +*' The constraint for overall forest establishment is given by the +*' remaining potential forest area, which is derived from +*' the potential natural forest area in each cluster. + +q35_max_forest_expansion(j2).. + sum(land_forest, vm_landexpansion(j2,land_forest)) + =l= + p35_max_forest_establishment(j2) + ; + *' Harvested secondary forest is still considered secondary forests due to *' restrictive NPI definitions. Also primary forest harvested will be considered *' to be secondary forest i.e., harvested primary forest gets reclassified as *' secondary forest and ends up in the youngest age-class (and follows regrowth) +q35_secdforest_recovery_area(j2).. + v35_secdforest_recovery_area(j2) + =e= + + p35_max_secdforest_recovery(j2) + * (sum(land_recovery35,vm_landreduction(j2,land_recovery35))/ + (sum(land_recovery35,pcm_land(j2,land_recovery35))+1e-10)) + ; + q35_secdforest_regeneration(j2).. sum(ac_est, v35_secdforest(j2,ac_est)) =e= @@ -195,23 +213,6 @@ q35_secdforest_regeneration(j2).. + v35_secdforest_recovery_area(j2) ; -q35_secdforest_recovery_area(j2).. - v35_secdforest_recovery_area(j2) - =e= - + (p35_max_forest_recovery(j2) - p35_land_restoration(j2,"secdforest")) - * (sum(land_noforest,vm_landreduction(j2,land_noforest))/(sum(land_noforest,vm_land(j2,land_noforest))+1e-10)) - + vm_landreduction(j2,"forestry"); - -*' The constraint for forest establishment is given by the -*' remaining potential forest area, which was calculated based -*' on the potential natural forest area in each cluster. - -q35_max_forest_expansion(j2).. - sum(land_forest, vm_landexpansion(j2,land_forest)) - =l= - p35_max_forest_recovery(j2) - ; - *' Harvested other land is still considered other land q35_other_regeneration(j2).. diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index ce39680935..e3fc9c3c4d 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -74,14 +74,19 @@ vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)); pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); * -------------------------------------- -* Secondary forest recovery bound +* Secondary forest establishment bound * -------------------------------------- -* Forest recovery is constrained by the potential forest area in each cluster. -* Hence, the potential area for forest recovery is given by the potential forest +* Overall forest establishment is constrained by the potential forest area in each cluster. +* Hence, the potential area for any forest expansion is given by the potential forest * area minus all forest areas in the previous time step. -p35_max_forest_recovery(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; +p35_max_forest_establishment(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +p35_max_forest_establishment(j)$(p35_max_forest_establishment(j) < 0) = 0; + +* The secondary forest recovery potential also includes forestry areas. +* Therefore they are not substracted. +p35_max_secdforest_recovery(j) = fm_pot_forest_area(j)-pcm_land(j,"primforest")-pcm_land(j,"secdforest"); +p35_max_secdforest_recovery(j)$(p35_max_secdforest_recovery(j) < 0) = 0; * ------------------------------------- * Set bounds based on land conservation @@ -134,12 +139,15 @@ p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","re * land area meets the total natural land conservation target p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; -* Since forest restoration cannot be bigger than the maximum area for forest recovery, +* Since forest restoration cannot be bigger than the potential area for secdforest recovery, * any remaining restoration area is substracted and shifted to other land restoration. -p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); +p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_secdforest_recovery(j); p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); +* Substract forest restoration area from secondary forest recovery potential +p35_max_secdforest_recovery(j) = p35_max_secdforest_recovery(j) - p35_land_restoration(j,"secdforest"); + * set conservation bound vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); diff --git a/modules/35_natveg/pot_forest_may24/sets.gms b/modules/35_natveg/pot_forest_may24/sets.gms index 0ad78e215c..45ae03f81d 100644 --- a/modules/35_natveg/pot_forest_may24/sets.gms +++ b/modules/35_natveg/pot_forest_may24/sets.gms @@ -20,6 +20,8 @@ sets pol_stock35 Land types for land protection policies / forest, other / + land_recovery35(land) Natveg recovery land + / crop, past, forestry, urban / shock_scen Scenario name of forest carbon shock / none, 002lin2030,004lin2030,008lin2030,016lin2030 From d69aa50751ded369996080809c78ae8455282132 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 17:50:47 +0200 Subject: [PATCH 149/259] minor adjustment --- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 4206ec790d..273be6fce4 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -200,7 +200,7 @@ q35_secdforest_recovery_area(j2).. v35_secdforest_recovery_area(j2) =e= + p35_max_secdforest_recovery(j2) - * (sum(land_recovery35,vm_landreduction(j2,land_recovery35))/ + * (sum((land_recovery35,land_natveg),vm_lu_transitions(j2,land_recovery35,land_natveg))/ (sum(land_recovery35,pcm_land(j2,land_recovery35))+1e-10)) ; From 0eeddcb79552c81a9799fd08ce5572d288b27a51 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 13 May 2024 18:21:01 +0200 Subject: [PATCH 150/259] further adjustments --- modules/35_natveg/pot_forest_may24/equations.gms | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 273be6fce4..069cb8b0bb 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -200,8 +200,9 @@ q35_secdforest_recovery_area(j2).. v35_secdforest_recovery_area(j2) =e= + p35_max_secdforest_recovery(j2) - * (sum((land_recovery35,land_natveg),vm_lu_transitions(j2,land_recovery35,land_natveg))/ - (sum(land_recovery35,pcm_land(j2,land_recovery35))+1e-10)) + * (sum(land_natveg,vm_landexpansion(j2,land_natveg)) + -sum(land_natveg,p35_land_restoration(j2,land_natveg)))/ + (sum(land_recovery35,pcm_land(j2,land_recovery35))+1e-10) ; q35_secdforest_regeneration(j2).. From b1bc69bb07ac47e7313aea8332ddf1e97a4b6778 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 13 May 2024 18:24:35 +0200 Subject: [PATCH 151/259] update start scripts #1 --- scripts/start/projects/paper_scp.R | 16 +++++++--------- scripts/start/projects/project_agmip.R | 15 +++++++++++---- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/scripts/start/projects/paper_scp.R b/scripts/start/projects/paper_scp.R index c2415067dd..3e65e0ed51 100644 --- a/scripts/start/projects/paper_scp.R +++ b/scripts/start/projects/paper_scp.R @@ -31,10 +31,6 @@ cfg$results_folder <- "output/:title:" # output scripts cfg$output <- c("rds_report","extra/disaggregation") -#GAMS OptFile -cfg$gms$s80_optfile <- 1 -cfg$gms$s80_maxiter <- 30 - ### Scenario setup # SSP2 as basis cfg <- setScenario(cfg,c("SSP2","NPI")) @@ -47,14 +43,16 @@ cfg$gms$kfo_rd <- "livst_rum" for (MP in c(0,20,50,80)) { cfg$title <- paste(prefix,paste0("SSP2-Ref-MP",MP),sep="_") if (MP == 0) { - scp_scen <- "constant" + cfg$gms$s15_rumdairy_scp_substitution <- 0 } else if (MP == 20) { - scp_scen <- "sigmoid_80pc_20_50" + cfg$gms$s15_rumdairy_scp_substitution <- 0.2 } else if (MP == 50) { - scp_scen <- "sigmoid_50pc_20_50" + cfg$gms$s15_rumdairy_scp_substitution <- 0.5 }else if (MP == 80) { - scp_scen <- "sigmoid_20pc_20_50" + cfg$gms$s15_rumdairy_scp_substitution <- 0.8 } - cfg$gms$c15_rumdairy_scp_scen <- scp_scen + cfg$gms$s15_food_substitution_start <- 2020 + cfg$gms$s15_food_substitution_target <- 2050 + cfg$gms$s15_subst_functional_form <- 2 start_run(cfg,codeCheck=FALSE) } diff --git a/scripts/start/projects/project_agmip.R b/scripts/start/projects/project_agmip.R index 4ab9bc299b..01732e006a 100644 --- a/scripts/start/projects/project_agmip.R +++ b/scripts/start/projects/project_agmip.R @@ -143,7 +143,11 @@ cfg <- setScenario(cfg,c("SSP2","NPI")) cfg$title <- "SSP2_NoMt_NoCC_HalfRDoM_DEV" cfg <- setScenario(cfg,c("SSP2","NPI")) -cfg$gms$c15_livescen <- "lin_50pc_20_50" +cfg$gms$s15_livestock_substitution <- 0.5 +cfg$gms$s15_food_substitution_start <- 2020 +cfg$gms$s15_food_substitution_target <- 2050 +cfg$gms$s15_subst_functional_form <- 1 + #region: CAZ, EUR, NEU, USA cfg$gms$scen_countries15 <- "AUS,CAN,HMD,NZL,SPM, ALA,AUT,BEL,BGR,CYP,CZE,DEU,DNK,ESP,EST, @@ -155,12 +159,15 @@ cfg$gms$scen_countries15 <- "AUS,CAN,HMD,NZL,SPM, USA" start_run(cfg,codeCheck=FALSE) #reset: -cfg$gms$c15_livescen <- "constant" +cfg$gms$s15_livestock_substitution <- 0 cfg$title <- "SSP2_NoMt_NoCC_HalfRD_DEV" cfg <- setScenario(cfg,c("SSP2","NPI")) -cfg$gms$c15_rumdairyscen <- "lin_50pc_20_50" +cfg$gms$s15_rumdairy_substitution <- 0.5 +cfg$gms$s15_food_substitution_start <- 2020 +cfg$gms$s15_food_substitution_target <- 2050 +cfg$gms$s15_subst_functional_form <- 1 #region: CAZ, EUR, NEU, USA cfg$gms$scen_countries15 <- "AUS,CAN,HMD,NZL,SPM, ALA,AUT,BEL,BGR,CYP,CZE,DEU,DNK,ESP,EST, @@ -172,7 +179,7 @@ cfg$gms$scen_countries15 <- "AUS,CAN,HMD,NZL,SPM, USA" start_run(cfg,codeCheck=FALSE) #reset: -cfg$gms$c15_rumdairyscen <- "constant" +cfg$gms$s15_livestock_substitution <- 0 From 391fd8537596f0d719960092793fe56e6fe5aeb6 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Tue, 14 May 2024 15:26:21 +0200 Subject: [PATCH 152/259] corrected typo --- modules/37_labor_prod/exo/sets.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/37_labor_prod/exo/sets.gms b/modules/37_labor_prod/exo/sets.gms index c289793d1a..1a76082620 100644 --- a/modules/37_labor_prod/exo/sets.gms +++ b/modules/37_labor_prod/exo/sets.gms @@ -6,7 +6,7 @@ *** | Contact: magpie@pik-potsdam.de sets - rcp37 climate change impact sceanrios + rcp37 climate change impact scenarios / rcp119, rcp585 / metric37 labor productivity impact metric From acef64e912a71a31967e3e230daf4f3dbcb76255 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Tue, 14 May 2024 15:26:45 +0200 Subject: [PATCH 153/259] updated Deep Dive scenarios: additional stacked decomposition scenarios --- config/scenario_config.csv | 2 +- .../start/projects/project_EAT2p0_DeepDive.R | 305 +++++++++++++----- 2 files changed, 221 insertions(+), 86 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 25d7930f35..f19bc99231 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -87,4 +87,4 @@ gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;; gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;; -magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif;;;;;;;;;;;;;;;;;;;;;;;; +magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 4a4a749201..2766a21253 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -44,7 +44,7 @@ cfg$output <- c( ####################### # SCENARIO DEFINITION # ####################### -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) # To Do: Choose whether EL2_default or EL2_lessSus should be used! +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # Note: The climate change impacts setting differs from the global AgMIP model comparision set-up. # We do not include climate change impacts in the coupled REMIND-MAgPIE runs for the PB Deep Dive # because we focus exclusively on the mitigation aspect without climate change impacts. @@ -61,11 +61,11 @@ cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) # To Do: C bau <- function(cfg) { ### Components for Decomposition ### # Diets: exogenous EATLancet diet - cfg$gms$s15_exo_diet <- 0 # default + cfg$gms$s15_exo_diet <- 0 # default cfg$gms$c15_kcal_scen <- "healthy_BMI" # default (but not active b/c of s15_exo_diet = 0) - cfg$gms$c15_EAT_scen <- "FLX" # default (but not active b/c of s15_exo_diet = 0) + cfg$gms$c15_EAT_scen <- "FLX" # default (but not active b/c of s15_exo_diet = 0) # Waste: half food waste - cfg$gms$s15_exo_waste <- 0 # default + cfg$gms$s15_exo_waste <- 0 # default cfg$gms$s15_waste_scen <- 1.2 # default (but not active b/c of s15_exo_waste = 0) # Default interest rate (for default productivity) cfg$gms$s12_interest_lic <- 0.1 # default @@ -73,20 +73,14 @@ bau <- function(cfg) { # Default livestock productivity cfg$gms$c70_feed_scen <- "ssp2" # default # Mitigation: no mitigation beyond NPi - cfg$gms$c56_emis_policy <- "none" - cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi_nonSus-rem-5/REMIND_generic_C_SSP2EU-Npi_nonSus-rem-5.mif" + cfg$gms$c56_emis_policy <- "none" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi-rem-5/REMIND_generic_C_SSP2EU-Npi-rem-5.mif" cfg$gms$c56_pollutant_prices <- "coupling" - cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi_nonSus-rem-5/REMIND_generic_C_SSP2EU-Npi_nonSus-rem-5.mif" - cfg$gms$c60_2ndgen_biodem <- "coupling" - - ### Deactivate certain sustainability standard settings - # bioenergy plantations can be irrigated - cfg$gms$c30_bioen_water <- "all" - # forest plantations allowed for afforestation under ghg price - cfg$gms$s32_aff_plantation <- 1 + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi-rem-5/REMIND_generic_C_SSP2EU-Npi-rem-5.mif" + cfg$gms$c60_2ndgen_biodem <- "coupling" # Setting REMIND scenario for blackmagicc - cfg$magicc_emis_scen <- "SSP2EU-DSPkB650-DS_betax" + cfg$magicc_emis_scen <- "REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" return(cfg) } @@ -128,9 +122,9 @@ waste <- function(cfg) { # starting from 2020 and diet shift. miti <- function(cfg) { # Mitigation: consistent with 1.5C considering Diet change - cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" cfg$gms$c56_pollutant_prices <- "coupling" - cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" cfg$gms$c60_2ndgen_biodem <- "coupling" # ecoSysProtAll: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; All CH4 and N2O emis), cfg$gms$c56_emis_policy <- "ecoSysProtAll" @@ -141,7 +135,7 @@ miti <- function(cfg) { # Bioenergy demand only. No carbon price on land included. bioenergy <- function(cfg) { # Mitigation: only Bioenergy demand from coupled REMIND-MAgPIE run where 1.5 is reached with ghg prices on land and considering diet shift - cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" cfg$gms$c60_2ndgen_biodem <- "coupling" return(cfg) @@ -151,7 +145,7 @@ bioenergy <- function(cfg) { priceCO2 <- function(cfg) { # Mitigation: only price land CO2 cfg$gms$c56_pollutant_prices <- "coupling" - cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" #### double-check Florian return(cfg) @@ -161,7 +155,7 @@ priceCO2 <- function(cfg) { priceNonCO2 <- function(cfg) { # Mitigation: only CH4 and N2O price cfg$gms$c56_pollutant_prices <- "coupling" - cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax_nonSus-rem-5.mif" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" cfg$gms$c56_emis_policy <- "ecoSysProtOff" ### double-check Florian return(cfg) @@ -172,111 +166,137 @@ priceNonCO2 <- function(cfg) { # SCENARIO RUNS # ################# # BAU # -# Business as usual scenario based on SSP2 +# Business as usual scenario based on SSP2 (NPis) cfg$title <- "BAU_NPi" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) start_run(cfg, codeCheck = FALSE) +### Composition ### +# Mitigation components: +# (1a) Nationally Determined Contributions (NDCs) cfg$title <- "BAU_NDC" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) cfg <- bau(cfg = cfg) # set path to bioenergy and prices to NDC run -cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC_nonSus-rem-5/REMIND_generic_C_SSP2EU-NDC_nonSus-rem-5.mif" +cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC-rem-5/REMIND_generic_C_SSP2EU-NDC-rem-5.mif" cfg$gms$c56_pollutant_prices <- "coupling" -cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC_nonSus-rem-5/REMIND_generic_C_SSP2EU-NDC_nonSus-rem-5.mif" +cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC-rem-5/REMIND_generic_C_SSP2EU-NDC-rem-5.mif" cfg$gms$c60_2ndgen_biodem <- "coupling" start_run(cfg, codeCheck = FALSE) -# BAU + EL2-Diet # -# Decomposition scenario. -# Globally achieves EL2 (Diet+Waste+Prod) by 2050 -cfg$title <- "BAU_PHD" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1b) BAU + Bioenergy # +# Decomposition Scenario. Adds bioenergy demand from coupled run with land-use policies consistent with 1.5C by 2050 to BAU +cfg$title <- "BAU_Bioenergy" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) -cfg <- waste(cfg = cfg) +cfg <- bioenergy(cfg = cfg) start_run(cfg, codeCheck = FALSE) -cfg$title <- "BAU_Diet" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1c) BAU + NonCO2 pricing in land sector # +# Decomposition Scenario. Adds non-CO2 pricing with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU +cfg$title <- "BAU_NonCO2" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- diet(cfg = cfg) +cfg <- priceNonCO2(cfg = cfg) start_run(cfg, codeCheck = FALSE) -cfg$title <- "BAU_Prod" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1d) BAU + pricing of CO2 in land sector # +# Decomposition Scenario. Adds CO2 pricing on land-use change emissions with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU +cfg$title <- "BAU_CO2" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- prod(cfg = cfg) +cfg <- priceCO2(cfg = cfg) start_run(cfg, codeCheck = FALSE) -cfg$title <- "BAU_Waste" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1a,b,c,d) BAU_MIT # +# All production-side land-based mitigation measures +cfg$title <- "BAU_Miti" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings cfg <- bau(cfg = cfg) -cfg <- waste(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) start_run(cfg, codeCheck = FALSE) +# BAU + EL2-Diet # +# PHD components: +# (1e) Productivity +cfg$title <- "BAU_Prod" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +cfg <- bau(cfg = cfg) +cfg <- prod(cfg = cfg) +start_run(cfg, codeCheck = FALSE) -# BAU + Bioenergy # -# Decomposition Scenario. Adds bioenergy demand from coupled run with land-use policies consistent with 1.5C by 2050 to BAU -cfg$title <- "BAU_Bioenergy" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1f) Waste +cfg$title <- "BAU_Waste" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- bioenergy(cfg = cfg) +cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# BAU + pricing of CO2 in land sector # -# Decomposition Scenario. Adds CO2 pricing on land-use change emissions with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU -cfg$title <- "BAU_CO2" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1g) Diet change +cfg$title <- "BAU_Diet" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- priceCO2(cfg = cfg) +cfg <- diet(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# BAU + NonCO2 pricing in land sector # -# Decomposition Scenario. Adds non-CO2 pricing with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU -cfg$title <- "BAU_NonCO2" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_lessSus")) +# (1e,f,g) All Globally achieves EL2 (Diet+Waste+Prod) by 2050 +cfg$title <- "BAU_PHD" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -cfg <- priceNonCO2(cfg = cfg) +cfg <- diet(cfg = cfg) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# BAU_MIT # -# All production-side land-based mitigation measures -cfg$title <- "BAU_MIT" +### Single measure Decomposition ### +# (2a) MITI_NDC # +# All production-side land-based mitigation measures and demand-side mitigation (diet change), but no NDCs +cfg$title <- "MITI_NDC" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) cfg <- miti(cfg = cfg) +# PHD (diet, prod, waste) +cfg <- diet(cfg = cfg) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) - -# MITI_Diet (mitigation - PHD) # -# All production-side land-based mitigation measures, but no demand-side mitigation (diet change) -cfg$title <- "MITI_Diet" +# MITI_Bioenergy (mitigation - bioenergy) # +# (2b) CO2 and non-CO2 pricing and demand-side mitigation (diet change), but no bioenergy demand from REMIND +cfg$title <- "MITI_Bioenergy" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation cfg <- miti(cfg = cfg) +cfg$gms$c60_2ndgen_biodem <- "coupling" +cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi-rem-5/REMIND_generic_C_SSP2EU-Npi-rem-5.mif" +# PHD +cfg <- diet(cfg = cfg) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# MITI_Bioenergy (mitigation - bioenergy) # -# CO2 and non-CO2 pricing and demand-side mitigation (diet change), but no bioenergy demand from REMIND -cfg$title <- "MITI_Bioenergy" +# MITI_nonCO2 (mitigation - non-CO2) # +# (2c) CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no non-CO2 pricing in land-system +cfg$title <- "MITI_nonCO2" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation cfg <- miti(cfg = cfg) -cfg$gms$c60_2ndgen_biodem <- "coupling" -cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi_nonSus-rem-5/REMIND_generic_C_SSP2EU-Npi_nonSus-rem-5.mif" +# ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) +cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" # PHD cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) @@ -284,10 +304,10 @@ cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) # MITI_CO2 (mitigation - CO2) # -# non-CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no CO2 pricing in land-system +# (2d) non-CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no CO2 pricing in land-system cfg$title <- "MITI_CO2" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation @@ -300,28 +320,143 @@ cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# MITI_nonCO2 (mitigation - non-CO2) # -# CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no non-CO2 pricing in land-system -cfg$title <- "MITI_nonCO2" +# MITI_MITI # +# (2a,b,c,d) All demand-side mitigation (PHD, but no other miti measures) +cfg$title <- "MITI_Miti" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) -# Mitigation +# PHD (diet, prod, waste) +cfg <- diet(cfg = cfg) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + + +# MITI_Prod # +# (2e) All production-side land-based mitigation measures and demand-side mitigation without Prod +cfg$title <- "MITI_Prod" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) cfg <- miti(cfg = cfg) -# ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) -cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" -# PHD +# PHD (diet, prod, waste) +cfg <- diet(cfg = cfg) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# MITI_Waste # +# (2f) All production-side land-based mitigation measures and demand-side mitigation without Waste +cfg$title <- "MITI_Waste" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) +# PHD (diet, prod, waste) cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# MITI_Diet # +# (2g) All production-side land-based mitigation measures and demand-side mitigation without Diet +cfg$title <- "MITI_Diet" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) +# PHD (diet, prod, waste) +cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# MITI_Full # +# MITI_PHD (mitigation - PHD) # +# (2e,f,g) All production-side land-based mitigation measures, but no demand-side mitigation (PHD) +cfg$title <- "MITI_PHD" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation +cfg <- miti(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +### Stacked Decomposition ### +# (3a) Stacked 0: BAU_NPi (see above) + +# (3b) Stacked 1: BAU_NDC (see above) + +# (3c) Stacked 2: BAU_NDC_Bioenergy +cfg$title <- "Stacked2" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (bioenergy) +cfg <- bioenergy(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# (3d) Stacked 3: BAU_NDC_Bioenergy_nCO2 +cfg$title <- "Stacked3" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (non-CO2, bioenergy) +cfg <- bioenergy(cfg = cfg) +cfg <- priceNonCO2(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# (3e) Stacked 4: BAU_NDC_Bioenergy_nCO2_CO2 +cfg$title <- "Stacked4" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# (3f) Stacked 5: BAU_NDC_Bioenergy_nCO2_CO2_prod +cfg$title <- "Stacked5" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) +# PHD (diet, prod, waste) +cfg <- prod(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# (3g) Stacked 6: BAU_NDC_Bioenergy_nCO2_CO2_prod_waste +cfg$title <- "Stacked6" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation (CO2, non-CO2, bioenergy) +cfg <- miti(cfg = cfg) +# PHD (diet, prod, waste) +cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) +start_run(cfg, codeCheck = FALSE) + +# (3h) Stacked 7: BAU_NDC_Bioenergy_nCO2_CO2_prod_waste_diet (same as MITI_All, see below) + +### All measures ### +# MITI_All # # All production-side land-based mitigation measures and demand-side mitigation (diet change) -cfg$title <- "MITI_Full" +cfg$title <- "MITI_All" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_lessSus")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) From f37813281befd1fd13ca073cfdd85c0609803ed5 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Tue, 14 May 2024 16:11:45 +0200 Subject: [PATCH 154/259] corrected spelling mistake in path to NPi run --- scripts/start/projects/project_EAT2p0_DeepDive.R | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 2766a21253..e3a99db043 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -74,9 +74,9 @@ bau <- function(cfg) { cfg$gms$c70_feed_scen <- "ssp2" # default # Mitigation: no mitigation beyond NPi cfg$gms$c56_emis_policy <- "none" - cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi-rem-5/REMIND_generic_C_SSP2EU-Npi-rem-5.mif" + cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NPi-rem-5/REMIND_generic_C_SSP2EU-NPi-rem-5.mif" cfg$gms$c56_pollutant_prices <- "coupling" - cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi-rem-5/REMIND_generic_C_SSP2EU-Npi-rem-5.mif" + cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NPi-rem-5/REMIND_generic_C_SSP2EU-NPi-rem-5.mif" cfg$gms$c60_2ndgen_biodem <- "coupling" # Setting REMIND scenario for blackmagicc @@ -279,7 +279,7 @@ cfg <- bau(cfg = cfg) # Mitigation cfg <- miti(cfg = cfg) cfg$gms$c60_2ndgen_biodem <- "coupling" -cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-Npi-rem-5/REMIND_generic_C_SSP2EU-Npi-rem-5.mif" +cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NPi-rem-5/REMIND_generic_C_SSP2EU-NPi-rem-5.mif" # PHD cfg <- diet(cfg = cfg) cfg <- prod(cfg = cfg) From 8eceb0d5b68ec3a00ab3db6656ced1cebd005272 Mon Sep 17 00:00:00 2001 From: pvjeetze <50408549+pvjeetze@users.noreply.github.com> Date: Tue, 14 May 2024 17:54:31 +0200 Subject: [PATCH 155/259] Update config/scenario_config.csv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Florian Humpenöder --- config/scenario_config.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 5d407929e1..03a624df2e 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -13,7 +13,7 @@ gms$s15_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 -"gms$s15_exo_foodscen_functional_form ";;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 +gms$s15_exo_foodscen_functional_form;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2020;2020;;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020 gms$s15_exo_foodscen_target;;;;;;;;;;2050;2050;2050;2070;;;;;;;2050;2050;2050;;;;2050;;;2050;;;;;;;;;;;;;;;;;;;2050 gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1 From a12cfd1bb25f94f1c4e429a3926c518da7dea067 Mon Sep 17 00:00:00 2001 From: pvjeetze <50408549+pvjeetze@users.noreply.github.com> Date: Tue, 14 May 2024 17:55:57 +0200 Subject: [PATCH 156/259] Update config/scenario_config.csv MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Florian Humpenöder --- config/scenario_config.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 03a624df2e..9e348d3aa1 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -9,7 +9,7 @@ gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1; gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;; gms$s15_rumdairy_scp_substitution;;;;0;0;0;0;0;0;0;0.5;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -"gms$s15_food_substitution_start ";;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_food_substitution_start;;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1 From 5bb8f54f67c041306d7654fc4703104a4235193d Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 14 May 2024 18:06:29 +0200 Subject: [PATCH 157/259] addressed review comments --- config/default.cfg | 22 +++++++++--------- config/scenario_config.csv | 2 +- .../15_food/anthro_iso_jun22/exodietmacro.gms | 4 ++-- modules/15_food/anthro_iso_jun22/input.gms | 23 ++++--------------- modules/15_food/anthro_iso_jun22/preloop.gms | 10 ++++---- modules/15_food/anthro_iso_jun22/sets.gms | 2 +- .../15_food/anthropometrics_jan18/input.gms | 8 +++---- .../anthropometrics_jan18/intersolve.gms | 4 ++-- .../15_food/anthropometrics_jan18/preloop.gms | 8 +++---- .../anthropometrics_jan18/presolve.gms | 4 ++-- .../15_food/anthropometrics_jan18/sets.gms | 4 ++-- modules/15_food/input/files | 1 - modules/70_livestock/fbask_jan16/input/files | 3 +-- 13 files changed, 39 insertions(+), 56 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index fcfc48b936..e1c66d40cb 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -388,23 +388,23 @@ cfg$gms$s15_rumdairy_scp_substitution <- 0 # def = 0 cfg$gms$s15_rumdairy_substitution <- 0 # def = 0 # * Set items of kfo_rd. This option allows for sensitivity scenarios. -# * kfo_rd is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen (see above) +# * kfo_rd is used in the food substitution scenarios s15_rumdairy_scp_substitution and c15_rumdairyscen (see above) # * options: "livst_rum,livst_milk", "livst_rum" or "livst_milk" cfg$gms$kfo_rd <- "livst_rum" #def = livst_rum -# * Convergence of livestock food intake towards a kcal/cap/day target with or w/o substitution. +# * Convergence of livestock food calorie supply towards a kcal/cap/day target with or w/o substitution. # * The functional form and the start and target years of the food substitution can be specified below. # * options: 0 = no converge, 1 = convergence to target cfg$gms$s15_livescen_target <- 0 # def = 0 -# * maximum kcal/cap/day intake target used for downwards convergence of livestock products -cfg$gms$s15_kcal_pc_livestock_intake_target <- "430" # def = 430 +# * maximum kcal/cap/day supply target used for downwards convergence of livestock products +cfg$gms$s15_kcal_pc_livestock_supply_target <- "430" # def = 430 # * fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) # * options: 0 (=fade-out), 1 (=substitution) cfg$gms$s15_livescen_target_subst <- 1 # def = 1 # * Functional form of the substitution/convergence over time # * options: 1 = linear substitution, 2 = sigmoid substitution -cfg$gms$s15_subst_functional_form <- 1 # def = 1 +cfg$gms$s15_food_subst_functional_form <- 1 # def = 1 # * Start year of food subsitution cfg$gms$s15_food_substitution_start <- 2025 # def = 2025 # * Target year (year when target substitution is reached) @@ -502,20 +502,20 @@ cfg$gms$scen_countries15 <- all_iso_countries # # * Transition to exogenous food intake and waste scenarios (applied after the # * food demand model is executed). The resulting scenario parametrisation is -# * a linear combination of the default MAgPIE parametrisation and the exogenous -# * scenario data input. +# * a linear or sigmoid combination of the default MAgPIE parametrisation and the +# * exogenous scenario data input. +# * The functional form (linear or sigmoid) and the start and target years of +# * the exogeneous food intake scenario can be specified below. # * Only active if at least one of the exogenous food intake and waste scenario # * switches (s15_exo_diet and s15_exo_waste) is set to 1. # * Values between 0 and 1 are allowed, where 0 means no convergence to exogenous # * food intake scenario, while 1 corresponds to a full convergence to exogenous # * food intake scenario. -# * The functional form and the start and target years of the food substitution -# * can be specified below cfg$gms$s15_exo_foodscen_convergence <- 1 # def = 1 # * Functional form of the convergence to the exogeneous food intake scenario over time # * options: 1 = linear convergence, 2 = sigmoid convergence cfg$gms$s15_exo_foodscen_functional_form <- 1 # def = 1 -# * Start year of convergence to exogeneous food intakte scenario +# * Start year of convergence to exogeneous food intake scenario cfg$gms$s15_exo_foodscen_start <- 2025 # def = 2025 # * Target year (year when s15_exo_foodscen_convergence is reached) cfg$gms$s15_exo_foodscen_target <- 2050 # def = 2050 @@ -1794,7 +1794,7 @@ cfg$gms$s70_foddr_scp_substitution <- 0 # def = 0 # * Functional form of the feed substitution over time # * options: 1 = linear substitution, 2 = sigmoid substitution -cfg$gms$s70_subst_functional_form <- 1 # def = 1 +cfg$gms$s70_feed_subst_functional_form <- 1 # def = 1 # * Start year of feed subsitution cfg$gms$s70_feed_substitution_start <- 2025 # def = 2025 # * Target year (year when target feed substitution is reached) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 5d407929e1..b4098ff702 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -8,7 +8,7 @@ gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;; gms$s15_rumdairy_scp_substitution;;;;0;0;0;0;0;0;0;0.5;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s15_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_food_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; "gms$s15_food_substitution_start ";;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/modules/15_food/anthro_iso_jun22/exodietmacro.gms b/modules/15_food/anthro_iso_jun22/exodietmacro.gms index 38fba29f7a..afe911c6ef 100644 --- a/modules/15_food/anthro_iso_jun22/exodietmacro.gms +++ b/modules/15_food/anthro_iso_jun22/exodietmacro.gms @@ -117,7 +117,7 @@ if (s15_run_diet_postprocessing = 1, p15_kcal_pc_iso(t,iso,kfo_rd) = p15_kcal_pc_iso(t,iso,kfo_rd) * i15_rumdairy_scp_fadeout(t,iso); -* Conditional reduction of livestock products (without fish) depending on s15_kcal_pc_livestock_intake_target. +* Conditional reduction of livestock products (without fish) depending on s15_kcal_pc_livestock_supply_target. * Optional substitution with plant-based products depending on s15_livescen_target_subst. p15_kcal_pc_iso_orig(t,iso,kfo) = p15_kcal_pc_iso(t,iso,kfo); p15_kcal_pc_iso_livestock_orig(t,iso) = sum(kfo_lp,p15_kcal_pc_iso(t,iso,kfo_lp)); @@ -131,7 +131,7 @@ if (s15_run_diet_postprocessing = 1, p15_kcal_pc_iso(t,iso,kfo_pp) /p15_kcal_pc_iso_plant_orig(t,iso); - p15_kcal_pc_livestock_supply_target(iso) = s15_kcal_pc_livestock_intake_target * f15_overcons_FAOwaste(iso,"livst_rum"); + p15_kcal_pc_livestock_supply_target(iso) = s15_kcal_pc_livestock_supply_target * f15_overcons_FAOwaste(iso,"livst_rum"); loop(iso$(p15_kcal_pc_iso_livestock_orig(t,iso) > p15_kcal_pc_livestock_supply_target(iso)), p15_kcal_pc_iso(t,iso,kfo_lp) = p15_livestock_kcal_structure_orig(t,iso,kfo_lp) diff --git a/modules/15_food/anthro_iso_jun22/input.gms b/modules/15_food/anthro_iso_jun22/input.gms index a1a59d53cd..3e69a11af5 100644 --- a/modules/15_food/anthro_iso_jun22/input.gms +++ b/modules/15_food/anthro_iso_jun22/input.gms @@ -18,21 +18,6 @@ $setglobal c15_calibscen constant $setglobal c15_rum_share mixed * options: constant, halving2050, mixed -* Fader for food substitution scenarios and exogenous food intake and waste -* scenarios including functional forms, targets and transition periods -* options: constant, -* lin_zero_10_50, lin_zero_20_50, lin_zero_20_30, lin_50pc_20_50, lin_50pc_20_50_extend65, lin_50pc_20_50_extend80, -* lin_50pc_10_50_extend90, lin_75pc_10_50_extend90, lin_80pc_20_50, lin_80pc_20_50_extend95, lin_90pc_20_50_extend95, -* lin_99-98-90pc_20_50-60-100, sigmoid_20pc_20_50, sigmoid_50pc_20_50, sigmoid_80pc_20_50 -$setglobal c15_rumscen constant -$setglobal c15_fishscen constant -$setglobal c15_alcscen constant -$setglobal c15_livescen constant -$setglobal c15_rumdairyscen constant -$setglobal c15_rumdairy_scp_scen constant -$setglobal c15_livescen_target constant -$setglobal c15_exo_foodscen lin_zero_20_50 - $setglobal c15_kcal_scen healthy_BMI * options: healthy_BMI, 2100kcal, 2500kcal, * endo, no_underweight, no_overweight @@ -108,9 +93,9 @@ s15_exo_alcohol Exogenous alcohol target on (1) / 1 / s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 / s15_rum_share_fadeout_india_strong Switch for stronger ruminant fadeout in India (binary) / 1 / s15_milk_share_fadeout_india Switch for milk fadeout in India (binary) / 1 / -s15_kcal_pc_livestock_intake_target Target for livestock intake (kcal per cap per day) / 430 / +s15_kcal_pc_livestock_supply_target Target for livestock calorie supply (kcal per cap per day) / 430 / s15_livescen_target_subst Fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 / -s15_subst_functional_form Switch for functional form of substitution fader (1) / 1 / +s15_food_subst_functional_form Switch for functional form of substitution fader (1) / 1 / s15_food_substitution_start Food substitution start year / 2025 / s15_food_substitution_target Food substitution target year / 2050 / s15_ruminant_substitution Ruminant substitution share (1) / 0 / @@ -121,8 +106,8 @@ s15_rumdairy_substitution Ruminant meat and dairy substitution share ( s15_rumdairy_scp_substitution Ruminant meat and dairy substitution with SCP share (1) / 0 / s15_livescen_target Switch for livestock intake target (1) / 0 / s15_exo_foodscen_functional_form Switch for functional form of exogenous food scenario fader (1) / 1 / -s15_exo_food_scenario_start Food substitution start year / 2025 / -s15_exo_food_scenario_target Food substitution target year / 2050 / +s15_exo_foodscen_start Food substitution start year / 2025 / +s15_exo_foodscen_target Food substitution target year / 2050 / s15_exo_foodscen_convergence Convergence to exogenous food scenario (1) / 1 / ; diff --git a/modules/15_food/anthro_iso_jun22/preloop.gms b/modules/15_food/anthro_iso_jun22/preloop.gms index 8560fa7c96..77b11ab436 100644 --- a/modules/15_food/anthro_iso_jun22/preloop.gms +++ b/modules/15_food/anthro_iso_jun22/preloop.gms @@ -64,7 +64,7 @@ p15_country_dummy(scen_countries15) = 1; ** The following lines define scenario faders for substituting different food groups * If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. * If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. -if (s15_subst_functional_form = 1, +if (s15_food_subst_functional_form = 1, m_linear_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); m_linear_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); @@ -78,7 +78,7 @@ if (s15_subst_functional_form = 1, p15_livestock_threshold_subst_fader(t) = 0; ); -elseif s15_subst_functional_form = 2, +elseif s15_food_subst_functional_form = 2, m_sigmoid_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); m_sigmoid_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); @@ -109,10 +109,10 @@ i15_livestock_fadeout_threshold(t,iso) = 1 - p15_country_dummy(iso)*p15_livestoc * If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. * If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. if (s15_exo_foodscen_functional_form = 1, - m_linear_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + m_linear_time_interpol(p15_exo_food_scenario_fader,s15_exo_foodscen_start,s15_exo_foodscen_target,0,s15_exo_foodscen_convergence); elseif s15_exo_foodscen_functional_form = 2, - m_sigmoid_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + m_sigmoid_time_interpol(p15_exo_food_scenario_fader,s15_exo_foodscen_start,s15_exo_foodscen_target,0,s15_exo_foodscen_convergence); ); @@ -122,7 +122,7 @@ i15_exo_foodscen_fader(t,iso) = p15_exo_food_scenario_fader(t) * p15_country_dum * Select from the data set of EAT Lancet scenarios the target years that are * consistent with the target year of the fader: -if(s15_exo_food_scenario_target = 2030, +if(s15_exo_foodscen_target = 2030, i15_intake_EATLancet_all(iso,kcal_scen15,EAT_scen15,kfo) = f15_intake_EATLancet("y2030",iso,kcal_scen15,EAT_scen15,kfo); *extra condition to see if India diet scenario has been selected if (s15_exo_diet = 2, diff --git a/modules/15_food/anthro_iso_jun22/sets.gms b/modules/15_food/anthro_iso_jun22/sets.gms index 269ae4f7ad..96f93663f7 100644 --- a/modules/15_food/anthro_iso_jun22/sets.gms +++ b/modules/15_food/anthro_iso_jun22/sets.gms @@ -151,7 +151,7 @@ sets livst_fadeoutscen15 Scenarios for changed composition of livestock products / halving2050, constant / -* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen +* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios s15_rumdairy_scp_substitution and c15_rumdairyscen kfo_rd(kfo) Ruminant meat and dairy food products / livst_rum,livst_milk / diff --git a/modules/15_food/anthropometrics_jan18/input.gms b/modules/15_food/anthropometrics_jan18/input.gms index 86f87ae375..a2039a3c44 100644 --- a/modules/15_food/anthropometrics_jan18/input.gms +++ b/modules/15_food/anthropometrics_jan18/input.gms @@ -72,9 +72,9 @@ s15_exo_diet Switch for transition towards exogeno s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 / s15_rum_share_fadeout_india_strong Switch for stronger ruminant fadeout in India (binary) / 1 / s15_milk_share_fadeout_india Switch for milk fadeout in India (binary) / 1 / -s15_kcal_pc_livestock_intake_target Target for livestock intake (kcal per cap per day) / 430 / +s15_kcal_pc_livestock_supply_target Target for livestock intake (kcal per cap per day) / 430 / s15_livescen_target_subst Fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 / -s15_subst_functional_form Switch for functional form of substitution fader (1) / 1 / +s15_food_subst_functional_form Switch for functional form of substitution fader (1) / 1 / s15_food_substitution_start Food substitution start year / 2025 / s15_food_substitution_target Food substitution target year / 2050 / s15_ruminant_substitution Ruminant substitution share (1) / 0 / @@ -85,8 +85,8 @@ s15_rumdairy_substitution Ruminant meat and dairy substitution s15_rumdairy_scp_substitution Ruminant meat and dairy substitution with SCP share (1) / 0 / s15_livescen_target Switch for livestock intake target (1) / 0 / s15_exo_foodscen_functional_form Switch for functional form of exogenous food scenario fader (1) / 1 / -s15_exo_food_scenario_start Food substitution start year / 2025 / -s15_exo_food_scenario_target Food substitution target year / 2050 / +s15_exo_foodscen_start Food substitution start year / 2025 / +s15_exo_foodscen_target Food substitution target year / 2050 / s15_exo_foodscen_convergence Convergence to exogenous food scenario (1) / 1 / ; diff --git a/modules/15_food/anthropometrics_jan18/intersolve.gms b/modules/15_food/anthropometrics_jan18/intersolve.gms index f82b22b098..7f4376c9f5 100644 --- a/modules/15_food/anthropometrics_jan18/intersolve.gms +++ b/modules/15_food/anthropometrics_jan18/intersolve.gms @@ -233,7 +233,7 @@ p15_kcal_pc_calibrated(t,i,"scp") = p15_kcal_pc_calibrated(t,i,"scp") + p15_kcal_pc_calibrated(t,i,kfo_rd) = p15_kcal_pc_calibrated(t,i,kfo_rd) * i15_rumdairy_scp_fadeout(t,i); -* Conditional reduction of livestock products (without fish) depending on s15_kcal_pc_livestock_intake_target. +* Conditional reduction of livestock products (without fish) depending on s15_kcal_pc_livestock_supply_target. * Optional substitution with plant-based products depending on s15_livescen_target_subst. p15_kcal_pc_calibrated_orig(t,i,kfo) = p15_kcal_pc_calibrated(t,i,kfo); p15_kcal_pc_calibrated_livestock_orig(t,i) = sum(kfo_lp,p15_kcal_pc_calibrated(t,i,kfo_lp)); @@ -247,7 +247,7 @@ p15_plant_kcal_structure_orig(t,i,kfo_pp)$(p15_kcal_pc_calibrated_plant_orig(t,i p15_kcal_pc_calibrated(t,i,kfo_pp) /p15_kcal_pc_calibrated_plant_orig(t,i); -p15_kcal_pc_livestock_supply_target(i) = s15_kcal_pc_livestock_intake_target * f15_overcons_FAOwaste(i,"livst_rum"); +p15_kcal_pc_livestock_supply_target(i) = s15_kcal_pc_livestock_supply_target * f15_overcons_FAOwaste(i,"livst_rum"); loop(i$(p15_kcal_pc_calibrated_livestock_orig(t,i) > p15_kcal_pc_livestock_supply_target(i)), p15_kcal_pc_calibrated(t,i,kfo_lp) = p15_livestock_kcal_structure_orig(t,i,kfo_lp) diff --git a/modules/15_food/anthropometrics_jan18/preloop.gms b/modules/15_food/anthropometrics_jan18/preloop.gms index 397fc67770..6e4bae5792 100644 --- a/modules/15_food/anthropometrics_jan18/preloop.gms +++ b/modules/15_food/anthropometrics_jan18/preloop.gms @@ -76,7 +76,7 @@ p15_foodscen_region_shr(t_all,i) = sum(i_to_iso(i,iso), p15_country_dummy(iso) * ** The following lines define scenario faders for substituting different food groups * If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. * If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. -if (s15_subst_functional_form = 1, +if (s15_food_subst_functional_form = 1, m_linear_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); m_linear_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); @@ -90,7 +90,7 @@ if (s15_subst_functional_form = 1, p15_livestock_threshold_subst_fader(t) = 0; ); -elseif s15_subst_functional_form = 2, +elseif s15_food_subst_functional_form = 2, m_sigmoid_time_interpol(p15_ruminant_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_ruminant_substitution); m_sigmoid_time_interpol(p15_fish_subst_fader,s15_food_substitution_start,s15_food_substitution_target,0,s15_fish_substitution); @@ -119,10 +119,10 @@ i15_livestock_fadeout_threshold(t,i) = 1 - p15_foodscen_region_shr(t,i)*p15_live * If s15_exo_foodscen_functional_form = 1, the exogenous food scenario is faded in linearly. * If s15_exo_foodscen_functional_form = 2, the exogenous food scenario is faded in applying a sigmoid trajectory. if (s15_exo_foodscen_functional_form = 1, - m_linear_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + m_linear_time_interpol(p15_exo_food_scenario_fader,s15_exo_foodscen_start,s15_exo_foodscen_target,0,s15_exo_foodscen_convergence); elseif s15_exo_foodscen_functional_form = 2, - m_sigmoid_time_interpol(p15_exo_food_scenario_fader,s15_exo_food_scenario_start,s15_exo_food_scenario_target,0,s15_exo_foodscen_convergence); + m_sigmoid_time_interpol(p15_exo_food_scenario_fader,s15_exo_foodscen_start,s15_exo_foodscen_target,0,s15_exo_foodscen_convergence); ); diff --git a/modules/15_food/anthropometrics_jan18/presolve.gms b/modules/15_food/anthropometrics_jan18/presolve.gms index 19eacb4d56..9e2c7bab32 100644 --- a/modules/15_food/anthropometrics_jan18/presolve.gms +++ b/modules/15_food/anthropometrics_jan18/presolve.gms @@ -440,7 +440,7 @@ p15_kcal_pc_calibrated(t,i,"scp") = p15_kcal_pc_calibrated(t,i,"scp") + p15_kcal_pc_calibrated(t,i,kfo_rd) = p15_kcal_pc_calibrated(t,i,kfo_rd) * i15_rumdairy_scp_fadeout(t,i); -* Conditional reduction of livestock products (without fish) depending on s15_kcal_pc_livestock_intake_target. +* Conditional reduction of livestock products (without fish) depending on s15_kcal_pc_livestock_supply_target. * Optional substitution with plant-based products depending on s15_livescen_target_subst. p15_kcal_pc_calibrated_orig(t,i,kfo) = p15_kcal_pc_calibrated(t,i,kfo); p15_kcal_pc_calibrated_livestock_orig(t,i) = sum(kfo_lp,p15_kcal_pc_calibrated(t,i,kfo_lp)); @@ -454,7 +454,7 @@ p15_plant_kcal_structure_orig(t,i,kfo_pp)$(p15_kcal_pc_calibrated_plant_orig(t,i p15_kcal_pc_calibrated(t,i,kfo_pp) /p15_kcal_pc_calibrated_plant_orig(t,i); -p15_kcal_pc_livestock_supply_target(i) = s15_kcal_pc_livestock_intake_target * f15_overcons_FAOwaste(i,"livst_rum"); +p15_kcal_pc_livestock_supply_target(i) = s15_kcal_pc_livestock_supply_target * f15_overcons_FAOwaste(i,"livst_rum"); loop(i$(p15_kcal_pc_calibrated_livestock_orig(t,i) > p15_kcal_pc_livestock_supply_target(i)), p15_kcal_pc_calibrated(t,i,kfo_lp) = p15_livestock_kcal_structure_orig(t,i,kfo_lp) diff --git a/modules/15_food/anthropometrics_jan18/sets.gms b/modules/15_food/anthropometrics_jan18/sets.gms index 86a7bbe4a9..679048ae44 100644 --- a/modules/15_food/anthropometrics_jan18/sets.gms +++ b/modules/15_food/anthropometrics_jan18/sets.gms @@ -8,7 +8,7 @@ sets iter15 iterations between food demand model and magpie - /iter1*iter10/ + /iter1*iter10/ curr_iter15(iter15) currently active iteration prev_iter15(iter15) last active iteration @@ -145,7 +145,7 @@ sets livst_fadeoutscen15 Scenarios for changed composition of livestock products / halving2050, constant / -* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios c15_rumdairy_scp_scen and c15_rumdairyscen +* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios s15_rumdairy_scp_substitution and c15_rumdairyscen kfo_rd(kfo) Ruminant meat and dairy food products / livst_rum,livst_milk / diff --git a/modules/15_food/input/files b/modules/15_food/input/files index 3a2b8735ad..168edc3425 100644 --- a/modules/15_food/input/files +++ b/modules/15_food/input/files @@ -22,7 +22,6 @@ f15_intake_EATLancet.cs3 f15_intake_EATLancet_iso.cs3 f15_targets_EATLancet_iso.cs3 f15_fruitveg2others_kcal_ratio_iso.cs3 -f15_food_substitution_fader.csv f15_ruminant_fadeout_india.csv f15_milk_fadeout_india.csv f15_bodyheight_regr_paras.cs3 diff --git a/modules/70_livestock/fbask_jan16/input/files b/modules/70_livestock/fbask_jan16/input/files index 8c6602152b..ca00704e44 100644 --- a/modules/70_livestock/fbask_jan16/input/files +++ b/modules/70_livestock/fbask_jan16/input/files @@ -5,8 +5,7 @@ f70_livestock_productivity.cs3 f70_capit_liv_regr.csv f70_slaughter_feed_share.cs4 f70_pyld_slope_reg.cs4 -f70_feed_substitution_fader.csv f70_cap_share_reg.csv f70_hist_cap_share.csv f70_hist_factor_costs_livst.cs3 -f70_hist_prod_livst.cs3 \ No newline at end of file +f70_hist_prod_livst.cs3 From 1cba59b55d79bb6f26da61f5b22db7cbcb22177a Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 14 May 2024 18:08:05 +0200 Subject: [PATCH 158/259] additional minor fix --- config/default.cfg | 2 +- modules/15_food/anthro_iso_jun22/sets.gms | 2 +- modules/15_food/anthropometrics_jan18/sets.gms | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index e1c66d40cb..633aa64e42 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -388,7 +388,7 @@ cfg$gms$s15_rumdairy_scp_substitution <- 0 # def = 0 cfg$gms$s15_rumdairy_substitution <- 0 # def = 0 # * Set items of kfo_rd. This option allows for sensitivity scenarios. -# * kfo_rd is used in the food substitution scenarios s15_rumdairy_scp_substitution and c15_rumdairyscen (see above) +# * kfo_rd is used in the food substitution scenarios s15_rumdairy_scp_substitution and s15_rumdairy_substitution (see above) # * options: "livst_rum,livst_milk", "livst_rum" or "livst_milk" cfg$gms$kfo_rd <- "livst_rum" #def = livst_rum diff --git a/modules/15_food/anthro_iso_jun22/sets.gms b/modules/15_food/anthro_iso_jun22/sets.gms index 96f93663f7..80ebffdd75 100644 --- a/modules/15_food/anthro_iso_jun22/sets.gms +++ b/modules/15_food/anthro_iso_jun22/sets.gms @@ -151,7 +151,7 @@ sets livst_fadeoutscen15 Scenarios for changed composition of livestock products / halving2050, constant / -* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios s15_rumdairy_scp_substitution and c15_rumdairyscen +* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios s15_rumdairy_scp_substitution and s15_rumdairy_substitution kfo_rd(kfo) Ruminant meat and dairy food products / livst_rum,livst_milk / diff --git a/modules/15_food/anthropometrics_jan18/sets.gms b/modules/15_food/anthropometrics_jan18/sets.gms index 679048ae44..51f72c1a91 100644 --- a/modules/15_food/anthropometrics_jan18/sets.gms +++ b/modules/15_food/anthropometrics_jan18/sets.gms @@ -145,7 +145,7 @@ sets livst_fadeoutscen15 Scenarios for changed composition of livestock products / halving2050, constant / -* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios s15_rumdairy_scp_substitution and c15_rumdairyscen +* The set kfo_rd can be defined in default.cfg and is used in the food substitution scenarios s15_rumdairy_scp_substitution and s15_rumdairy_substitution kfo_rd(kfo) Ruminant meat and dairy food products / livst_rum,livst_milk / From c59eb6bb6c8aae8307079391acff2baecf9b05e0 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Tue, 14 May 2024 18:19:10 +0200 Subject: [PATCH 159/259] another small fix --- config/scenario_config.csv | 2 +- scripts/start/projects/paper_scp.R | 2 +- scripts/start/projects/project_agmip.R | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 9e348d3aa1..3d622133e9 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -8,7 +8,7 @@ gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;; gms$s15_rumdairy_scp_substitution;;;;0;0;0;0;0;0;0;0.5;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$s15_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_food_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_start;;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/scripts/start/projects/paper_scp.R b/scripts/start/projects/paper_scp.R index 3e65e0ed51..3da09e1144 100644 --- a/scripts/start/projects/paper_scp.R +++ b/scripts/start/projects/paper_scp.R @@ -53,6 +53,6 @@ for (MP in c(0,20,50,80)) { } cfg$gms$s15_food_substitution_start <- 2020 cfg$gms$s15_food_substitution_target <- 2050 - cfg$gms$s15_subst_functional_form <- 2 + cfg$gms$s15_food_subst_functional_form <- 2 start_run(cfg,codeCheck=FALSE) } diff --git a/scripts/start/projects/project_agmip.R b/scripts/start/projects/project_agmip.R index 01732e006a..e60c19a6b4 100644 --- a/scripts/start/projects/project_agmip.R +++ b/scripts/start/projects/project_agmip.R @@ -146,7 +146,7 @@ cfg <- setScenario(cfg,c("SSP2","NPI")) cfg$gms$s15_livestock_substitution <- 0.5 cfg$gms$s15_food_substitution_start <- 2020 cfg$gms$s15_food_substitution_target <- 2050 -cfg$gms$s15_subst_functional_form <- 1 +cfg$gms$s15_food_subst_functional_form <- 1 #region: CAZ, EUR, NEU, USA cfg$gms$scen_countries15 <- "AUS,CAN,HMD,NZL,SPM, @@ -167,7 +167,7 @@ cfg <- setScenario(cfg,c("SSP2","NPI")) cfg$gms$s15_rumdairy_substitution <- 0.5 cfg$gms$s15_food_substitution_start <- 2020 cfg$gms$s15_food_substitution_target <- 2050 -cfg$gms$s15_subst_functional_form <- 1 +cfg$gms$s15_food_subst_functional_form <- 1 #region: CAZ, EUR, NEU, USA cfg$gms$scen_countries15 <- "AUS,CAN,HMD,NZL,SPM, ALA,AUT,BEL,BGR,CYP,CZE,DEU,DNK,ESP,EST, From cb53c56c6ec8b164a9fd5537ee0a0437b02bee91 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Wed, 15 May 2024 14:51:00 +0200 Subject: [PATCH 160/259] updated physical activity level in EL2 diet settings --- config/scenario_config.csv | 2 +- scripts/start/projects/project_EAT2p0.R | 5 ++++- scripts/start/projects/project_EAT2p0_DeepDive.R | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index f19bc99231..ed59c7ac38 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,7 +1,7 @@ ;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;EL2_default;EL2_lessSus;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; -gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; +gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SDP;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;; gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2 diff --git a/scripts/start/projects/project_EAT2p0.R b/scripts/start/projects/project_EAT2p0.R index 434b8a0d85..a676bcc4c8 100644 --- a/scripts/start/projects/project_EAT2p0.R +++ b/scripts/start/projects/project_EAT2p0.R @@ -90,8 +90,11 @@ bau <- function(cfg) { ### Diet component ## # Globally achieves EL2 diet by 2050 diet <- function(cfg) { + # Transition towards EL2 food intake recommendations until 2050 cfg$gms$s15_exo_diet <- 3 - + # Physical inactivity levels are reduced to 0 from 2020 to 2050 + cfg$gms$c09_pal_scenario <- "SDP" + return(cfg) } diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index e3a99db043..8f7649b8c7 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -88,8 +88,10 @@ bau <- function(cfg) { ### Diet component ## # Globally achieves EL2 diet by 2050 diet <- function(cfg) { + # Transition towards EL2 food intake recommendations until 2050 cfg$gms$s15_exo_diet <- 3 - + # Physical inactivity levels are reduced to 0 from 2020 to 2050 + cfg$gms$c09_pal_scenario <- "SDP" return(cfg) } From 82fa097349310fc07af36090da2aff65daa6a018 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 16 May 2024 08:52:45 +0200 Subject: [PATCH 161/259] update 80_optimization --- CHANGELOG.md | 2 + config/default.cfg | 2 + .../80_optimization/lp_nlp_apr17/input.gms | 3 +- .../80_optimization/lp_nlp_apr17/solve.gms | 37 +++--- .../nlp_apr17/declarations.gms | 5 +- modules/80_optimization/nlp_apr17/input.gms | 1 + modules/80_optimization/nlp_apr17/solve.gms | 69 ++++++----- .../80_optimization/nlp_par/declarations.gms | 7 +- modules/80_optimization/nlp_par/input.gms | 1 + modules/80_optimization/nlp_par/solve.gms | 110 ++++++++++-------- scripts/start/test_runs.R | 24 ++-- 11 files changed, 150 insertions(+), 111 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34fe029837..b90d79d323 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### changed - **default.cfg** update additional data to rev4.50 - **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` +- **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` @@ -23,6 +24,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scripts** added automatic set writer for new bioenergy realization to `start_functions` - **scripts** added start scripts for the GENIE project - **scenario_config.csv** added preset for GENIE project +- **default.cfg** cfg$gms$s80_secondsolve option for second solve statement with 0=off as default ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions diff --git a/config/default.cfg b/config/default.cfg index 591753320e..f8a14db294 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -1930,6 +1930,8 @@ cfg$gms$c80_nlp_solver <- "conopt4" # def = conopt4 # * 0: default settings (optfile will be ignored) cfg$gms$s80_optfile <- 0 # def = 0 +# * Optional second solve statement (0=off, 1=on) +cfg$gms$s80_secondsolve <- 0 # def = 0 #*******************************END MODULE SETUP******************************** diff --git a/modules/80_optimization/lp_nlp_apr17/input.gms b/modules/80_optimization/lp_nlp_apr17/input.gms index 3dd0e0a426..3e8b6bcfd0 100644 --- a/modules/80_optimization/lp_nlp_apr17/input.gms +++ b/modules/80_optimization/lp_nlp_apr17/input.gms @@ -6,10 +6,11 @@ *** | Contact: magpie@pik-potsdam.de scalars - s80_maxiter maximal solve iterations if modelstat is > 2 (1) / 30 / + s80_maxiter maximal solve iterations if modelstat is > 2 (1) / 30 / s80_optfile switch to use specfied solver settings (1) / 0 / s80_add_cplex add cplex optimization after conopt4 (1) / 0 / s80_add_conopt3 add conopt3 optimization after conopt4 (1) / 0 / + s80_secondsolve second solve statement (binary) / 0 / ; diff --git a/modules/80_optimization/lp_nlp_apr17/solve.gms b/modules/80_optimization/lp_nlp_apr17/solve.gms index 881dca8768..7252140a62 100644 --- a/modules/80_optimization/lp_nlp_apr17/solve.gms +++ b/modules/80_optimization/lp_nlp_apr17/solve.gms @@ -34,10 +34,7 @@ $elseif "%c80_nlp_solver%" == "conopt4+conopt3" $endif $onecho > conopt4.opt -Tol_Obj_Change = 3.0e-6 -Tol_Feas_Min = 4.0e-10 -Tol_Feas_Max = 4.0e-6 -Tol_Feas_Tria = 4.0e-6 +Lim_Variable = 1.e25 $offecho $onecho > conopt4.op2 @@ -65,7 +62,7 @@ $batinclude "./modules/include.gms" nl_fix *' in particular for matching LHS and RHS of equations. solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); *' A second optimization makes sure that in case of a flat optimum that solution *' is chosen for which the difference in land changes compared to the previous @@ -76,7 +73,7 @@ $batinclude "./modules/include.gms" nl_fix if ((magpie.modelstat=1 or magpie.modelstat = 7), vm_cost_glo.up = vm_cost_glo.l; solve magpie USING nlp MINIMIZING vm_landdiff; - solve magpie USING nlp MINIMIZING vm_landdiff; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_landdiff; ); vm_cost_glo.up = Inf; ); @@ -130,7 +127,7 @@ $batinclude "./modules/include.gms" nl_relax *' the nonlinear optimization of the model in its full complexity. solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); *' @stop @@ -139,27 +136,28 @@ $batinclude "./modules/include.gms" nl_relax display "Additional solve with CONOPT3!"; option nlp = conopt; solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); option nlp = conopt4; ); -* if solve stopped with an error, try it again without pre-processing +* if solve stopped with an error, try it again with CONOPT4 and OPTFILE if((magpie.modelstat = 13), display "WARNING: Modelstat 13 | retry without Conopt4 pre-processing"; - magpie.optfile = 2 - solve magpie USING nlp MINIMIZING vm_cost_glo; + option nlp = conopt4; + magpie.optfile = 2 solve magpie USING nlp MINIMIZING vm_cost_glo; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); magpie.optfile = s80_optfile ; ); * if solve stopped with an error, try it again with conopt3 - if ((magpie.modelstat = 13), - display "WARNING: Modelstat 13 | retry with CONOPT3!"; - option nlp = conopt; - solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; - option nlp = conopt4; - ); + if ((magpie.modelstat = 13), + display "WARNING: Modelstat 13 | retry with CONOPT3!"; + option nlp = conopt; + solve magpie USING nlp MINIMIZING vm_cost_glo; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); + option nlp = conopt4; + ); p80_modelstat(t) = magpie.modelstat; p80_num_nonopt(t) = magpie.numNOpt; @@ -188,13 +186,14 @@ magpie.trylinear = 1; $batinclude "./modules/include.gms" nl_fix solve magpie USING nlp MINIMIZING vm_cost_glo; -solve magpie USING nlp MINIMIZING vm_cost_glo; +if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); $batinclude "./modules/include.gms" nl_release if((magpie.modelstat=1 or magpie.modelstat = 7), vm_cost_glo.up = vm_cost_glo.l; solve magpie USING nlp MINIMIZING vm_landdiff; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_landdiff; ); vm_cost_glo.up = Inf; ); diff --git a/modules/80_optimization/nlp_apr17/declarations.gms b/modules/80_optimization/nlp_apr17/declarations.gms index be5b332fc0..df685b2608 100644 --- a/modules/80_optimization/nlp_apr17/declarations.gms +++ b/modules/80_optimization/nlp_apr17/declarations.gms @@ -11,7 +11,6 @@ parameters ; scalars - s80_counter counter (1) - s80_modelstat_previter modelstat of previous iteration (1) - s80_optfile_previter optfile used in previous iteration (1) + s80_counter counter (1) + s80_resolve_option option for resolve (1) ; diff --git a/modules/80_optimization/nlp_apr17/input.gms b/modules/80_optimization/nlp_apr17/input.gms index 8fbcc4271a..5c645af1c2 100644 --- a/modules/80_optimization/nlp_apr17/input.gms +++ b/modules/80_optimization/nlp_apr17/input.gms @@ -8,4 +8,5 @@ scalars s80_maxiter maximal solve iterations if modelstat is > 2 (1) / 30 / s80_optfile switch to use specfied solver settings (1) / 0 / + s80_secondsolve second solve statement (binary) / 0 / ; diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index bae758fec1..42984f030b 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -8,8 +8,7 @@ s80_counter = 0; p80_modelstat(t) = 14; -s80_modelstat_previter = 14; -s80_optfile_previter = s80_optfile; +s80_resolve_option = 0; *** solver settings option nlp = conopt4; @@ -19,10 +18,7 @@ magpie.solprint = 0 ; magpie.holdfixed = 1 ; $onecho > conopt4.opt -Tol_Obj_Change = 3.0e-6 -Tol_Feas_Min = 4.0e-10 -Tol_Feas_Max = 4.0e-6 -Tol_Feas_Tria = 4.0e-6 +Lim_Variable = 1.e25 $offecho $onecho > conopt4.op2 @@ -30,55 +26,62 @@ Flg_Prep = FALSE $offecho *' @code -*' Solve statement is put twice for improved model results, -*' in particular for matching LHS and RHS of equations. -solve magpie USING nlp MINIMIZING vm_cost_glo; solve magpie USING nlp MINIMIZING vm_cost_glo; +*' Optional second solve statement +if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); *' @stop display "vm_cost_glo.l"; display vm_cost_glo.l; display magpie.modelstat; +* set modelstat to 13 in case of NA for continuation +magpie.modelStat$(magpie.modelStat=NA) = 13; + * in case of problems try different solvers and optfile settings if (magpie.modelstat > 2, repeat( s80_counter = s80_counter + 1 ; + s80_resolve_option = s80_resolve_option + 1; - if (magpie.modelstat ne s80_modelstat_previter, + if(s80_resolve_option = 1, display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; - solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; - elseif magpie.modelstat = s80_modelstat_previter, - if (magpie.optfile = s80_optfile_previter, - display "Modelstat > 2 | Retry solve without CONOPT4 pre-processing"; - magpie.optfile = 2; - solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; - else - display "Modelstat > 2 | Retry solve with CONOPT3"; - option nlp = conopt; - solve magpie USING nlp MINIMIZING vm_cost_glo; - solve magpie USING nlp MINIMIZING vm_cost_glo; - option nlp = conopt4; - ); - ); - - s80_modelstat_previter = magpie.modelstat; - s80_optfile_previter = magpie.optfile; -* reset `magpie.optfile` to default after saving value to `s80_optfile_previter` - magpie.optfile = s80_optfile; + option nlp = conopt4; + magpie.optfile = 0; + elseif s80_resolve_option = 2, + display "Modelstat > 2 | Retry solve with CONOPT4 OPTFILE"; + option nlp = conopt4; + magpie.optfile = 1; + elseif s80_resolve_option = 3, + display "Modelstat > 2 | Retry solve with CONOPT4 w/o preprocessing"; + option nlp = conopt4; + magpie.optfile = 2; + elseif s80_resolve_option = 4, + display "Modelstat > 2 | Retry solve with CONOPT3"; + option nlp = conopt; + magpie.optfile = 0; + ); + + solve magpie USING nlp MINIMIZING vm_cost_glo; + if(s80_secondsolve = 1, solve magpie USING nlp MINIMIZING vm_cost_glo; ); + option nlp = conopt4; + magpie.optfile = s80_optfile; display "vm_cost_glo.l"; display vm_cost_glo.l; -* write extended run information in list file in the case that the final solution is infeasible +* write extended run information in list file in the case that the final solution is infeasible if ((s80_counter >= (s80_maxiter-1) and magpie.modelstat > 2), magpie.solprint = 1 ); display s80_counter; display magpie.modelstat; +* Set modelstat to 13 in case of NA for the `until` check of the repeat loop. +* Otherwise, the repeat loop will never end. + magpie.modelStat$(magpie.modelStat=NA) = 13; + + s80_resolve_option$(s80_resolve_option >= 4) = 0; until (magpie.modelstat <= 2 or s80_counter >= s80_maxiter) ); @@ -92,6 +95,8 @@ if ((p80_modelstat(t) <= 2), ); if ((p80_modelstat(t) > 2 and p80_modelstat(t) ne 7), + execute 'gmszip -r magpie_problem.zip "%gams.scrdir%"' + put_utility 'shell' / 'mv -f magpie_problem.zip magpie_problem_' t.tl:0'.zip'; Execute_Unload "fulldata.gdx"; abort "no feasible solution found!"; ); diff --git a/modules/80_optimization/nlp_par/declarations.gms b/modules/80_optimization/nlp_par/declarations.gms index 7a8f5e5b71..f64f323589 100644 --- a/modules/80_optimization/nlp_par/declarations.gms +++ b/modules/80_optimization/nlp_par/declarations.gms @@ -9,11 +9,12 @@ parameters p80_modelstat(t,h) modelstat indicator (1) p80_counter(h) counter (1) p80_handle(h) parallel mode handle parameter (1) + p80_extra_solve(h) indicator for extra solve (1) + p80_counter_modelstat(h) counter for modelstat <= 2 (1) + p80_resolve_option(h) option for resolve (1) ; scalars s80_counter counter (1) - s80_modelstat_previter modelstat of previous iteration (1) - s80_optfile_previter optfile used in previous iteration (1) - s80_resolve indicator for restarting solve (1) + s80_resolve_option option for resolve (1) ; diff --git a/modules/80_optimization/nlp_par/input.gms b/modules/80_optimization/nlp_par/input.gms index 77e8e9f487..1004040b7e 100644 --- a/modules/80_optimization/nlp_par/input.gms +++ b/modules/80_optimization/nlp_par/input.gms @@ -8,4 +8,5 @@ scalars s80_maxiter maximal solve iterations if modelstat is > 2 (1) / 30 / s80_optfile switch to use specfied solver settings (1) / 0 / + s80_secondsolve second solve statement (binary) / 0 / ; diff --git a/modules/80_optimization/nlp_par/solve.gms b/modules/80_optimization/nlp_par/solve.gms index d550c5e4ae..e4478be1e6 100644 --- a/modules/80_optimization/nlp_par/solve.gms +++ b/modules/80_optimization/nlp_par/solve.gms @@ -8,21 +8,20 @@ p80_counter(h) = 0; p80_modelstat(t,h) = 14; +p80_counter_modelstat(h) = 0; +p80_resolve_option(h) = 0; *** solver settings - option nlp = conopt4; magpie.solvelink = 3; magpie.optfile = s80_optfile ; magpie.scaleopt = 1 ; magpie.solprint = 0 ; magpie.holdfixed = 1 ; +magpie.savepoint = 0; $onecho > conopt4.opt -Tol_Obj_Change = 3.0e-6 -Tol_Feas_Min = 4.0e-10 -Tol_Feas_Max = 4.0e-6 -Tol_Feas_Tria = 4.0e-6 +Lim_Variable = 1.e25 $offecho $onecho > conopt4.op2 @@ -50,16 +49,10 @@ repeat loop(h$p80_handle(h), if(handleStatus(p80_handle(h)) = 2, p80_counter(h) = p80_counter(h) + 1; - s80_resolve = 1; + p80_extra_solve(h) = 1; magpie.handle = p80_handle(h); execute_loadhandle magpie; - magpie.modelStat$(magpie.modelStat=NA) = 13; - - s80_modelstat_previter = p80_modelstat(t,h); - p80_modelstat(t,h) = magpie.modelStat; - s80_optfile_previter = magpie.optfile; - magpie.optfile = s80_optfile; h2(h) = yes; i2(i)$supreg(h,i) = yes; @@ -68,52 +61,77 @@ repeat s80_counter = sum(h2,p80_counter(h2)); display s80_counter; display magpie.modelStat; + display vm_cost_glo.l; + magpie.modelStat$(magpie.modelStat=NA) = 13; + + p80_modelstat(t,h) = magpie.modelStat; - if ((p80_counter(h) >= s80_maxiter AND p80_modelstat(t,h) > 2), + if(p80_counter(h) >= s80_maxiter AND p80_modelstat(t,h) > 2, + execute 'gmszip -r magpie_problem.zip "%gams.scrdir%"' + put_utility 'shell' / 'mv -f magpie_problem.zip magpie_problem_' h.tl:0'_' t.tl:0'.zip'; display "No feasible solution found. Writing LST file."; option AsyncSolLst=1; display$handlecollect(p80_handle(h)) 're-collect'; option AsyncSolLst=0; - s80_resolve = 0; - ); + p80_extra_solve(h) = 0; + ); display$handledelete(p80_handle(h)) 'trouble deleting handles' ; - if (p80_modelstat(t,h) <= 2, - display "Model status <= 2. Handle cleared."; - s80_resolve = 0; - p80_handle(h) = 0; - ); - - if (s80_resolve = 1, - display "Resolve" - if (p80_modelstat(t,h) ne s80_modelstat_previter, - display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; + if(p80_modelstat(t,h) <= 2, + p80_counter_modelstat(h) = p80_counter_modelstat(h) + 1; + if(p80_counter_modelstat(h) < 2 AND s80_secondsolve = 1, + display "Model status <= 2. Starting second solve"; solve magpie USING nlp MINIMIZING vm_cost_glo; - elseif p80_modelstat(t,h) = s80_modelstat_previter, - if(magpie.optfile = s80_optfile_previter, - display "Modelstat > 2 | Retry solve without CONOPT4 pre-processing"; - magpie.optfile = 2; - solve magpie USING nlp MINIMIZING vm_cost_glo; - else - display "Modelstat > 2 | Retry solve with CONOPT3"; - option nlp = conopt; - solve magpie USING nlp MINIMIZING vm_cost_glo; - option nlp = conopt4; - ); - ); - execerror = 0; - if (magpie.handle = 0, - display "Problem. Handle is zero despite resolve. Setting handle to 1 for continuation."; - magpie.handle = 1; - ); + p80_handle(h) = magpie.handle; + p80_extra_solve(h) = 0; + else + display "Model status <= 2. Handle cleared."; + p80_extra_solve(h) = 0; + p80_handle(h) = 0; + ); + ); + + if(p80_extra_solve(h) = 1, + display "Resolve"; + p80_resolve_option(h) = p80_resolve_option(h) + 1; + display "Load solution from last time step as starting point"; + execute_loadpoint 'fulldata.gdx'; + s80_resolve_option = sum(h2,p80_resolve_option(h2)); + display s80_resolve_option; + if(p80_resolve_option(h) = 1, + display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; + option nlp = conopt4; + magpie.optfile = 0; + elseif p80_resolve_option(h) = 2, + display "Modelstat > 2 | Retry solve with CONOPT4 OPTFILE"; + option nlp = conopt4; + magpie.optfile = 1; + elseif p80_resolve_option(h) = 3, + display "Modelstat > 2 | Retry solve with CONOPT4 w/o preprocessing"; + option nlp = conopt4; + magpie.optfile = 2; + elseif p80_resolve_option(h) = 4, + display "Modelstat > 2 | Retry solve with CONOPT3"; + option nlp = conopt; + magpie.optfile = 0; + ); + if(execerror > 0, execerror = 0); + + solve magpie USING nlp MINIMIZING vm_cost_glo; + magpie.handle$(magpie.handle = 0) = 1; p80_handle(h) = magpie.handle; - ); + option nlp = conopt4; + magpie.optfile = s80_optfile; + + p80_resolve_option(h)$(p80_resolve_option(h) >= 4) = 0; + ); h2(h) = no; i2(i) = no; j2(j) = no; - ); - ); + ); + ); +display$sleep(card(p80_handle)*0.2) 'sleep some time'; display$readyCollect(p80_handle,INF) 'Problem waiting for next instance to complete'; until card(p80_handle) = 0 OR smax(h, p80_counter(h)) >= s80_maxiter; @@ -122,7 +140,7 @@ if (smax(h,p80_modelstat(t,h)) > 2 and smax(h,p80_modelstat(t,h)) ne 7, abort "No feasible solution found!"; ); -* handleSubmit does not work as expected. Does not restart from saved state. +* handleSubmit does not work because it requires the script `gmsrerun.cmd` or `gmsrerun.run` in the grid directory. * Therefore, solve statements are used. * display$handleSubmit(p80_handle(h)) 'trouble resubmitting handles' ; diff --git a/scripts/start/test_runs.R b/scripts/start/test_runs.R index 93cfc01d17..8118f9b927 100644 --- a/scripts/start/test_runs.R +++ b/scripts/start/test_runs.R @@ -42,27 +42,27 @@ cfg$gms$c_timesteps <- timeSteps # Reference and Policy run for SSP1, SSP2 and SSP5 -for(ssp in c("SSP1","SSP2EU","SSP5")) { +for(ssp in c("SSP1","SSP2","SSP5")) { cfg$title <- .title(cfg, paste(ssp,"Ref",sep="-")) cfg <- setScenario(cfg,c(ssp,"NPI","rcp7p0")) cfg$gms$c56_mute_ghgprices_until <- "y2150" - cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ssp,"-NPi") - cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ssp,"-NPi") + cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NPi") + cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NPi") start_run(cfg, codeCheck = FALSE) cfg$title <- .title(cfg, paste(ssp,"NDC",sep="-")) cfg <- setScenario(cfg,c(ssp,"NDC","rcp4p5")) cfg$gms$c56_mute_ghgprices_until <- "y2150" - cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ssp,"-NDC") - cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ssp,"-NDC") + cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NDC") + cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NDC") start_run(cfg, codeCheck = FALSE) cfg$title <- .title(cfg, paste(ssp,"PkBudg650",sep="-")) cfg <- setScenario(cfg,c(ssp,"NDC","rcp1p9")) cfg$gms$c56_mute_ghgprices_until <- "y2030" - cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ssp,"-PkBudg650") - cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ssp,"-PkBudg650") + cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-PkBudg650") + cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-PkBudg650") start_run(cfg, codeCheck = FALSE) } @@ -79,6 +79,16 @@ cfg <- fsecScenario(scenario = "c_BAU") cfg$results_folder_highres <- "output" start_run(cfg = cfg, codeCheck = codeCheck) +### NatureSparing +cfg <- fsecScenario(scenario = "b_NatureSparing") +cfg$results_folder_highres <- "output" +start_run(cfg = cfg, codeCheck = codeCheck) + +### LandscapeElements +cfg <- fsecScenario(scenario = "a_LandscapeElements") +cfg$results_folder_highres <- "output" +start_run(cfg = cfg, codeCheck = codeCheck) + ### FSDP Scenario cfg <- fsecScenario(scenario = "e_FSDP") cfg$results_folder_highres <- "output" From 1daa6c0f96512c5b9f5b9a4c24b34fbc79688a34 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 16 May 2024 08:54:15 +0200 Subject: [PATCH 162/259] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b90d79d323..e3f50dccbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **default.cfg** update additional data to rev4.50 - **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` - **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. +- **scripts** start/test_runs.R added 2 more test runs from FSEC ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` From 7ff33c06a82041f80a4c9ea05dde9927dd013b43 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 16 May 2024 09:43:25 +0200 Subject: [PATCH 163/259] resovled merge conflicts --- .../pot_forest_may24/declarations.gms | 6 +- .../35_natveg/pot_forest_may24/equations.gms | 15 +---- .../35_natveg/pot_forest_may24/postsolve.gms | 1 + .../35_natveg/pot_forest_may24/preloop.gms | 2 + .../35_natveg/pot_forest_may24/presolve.gms | 63 +++++++++++++++---- modules/35_natveg/pot_forest_may24/sets.gms | 4 +- 6 files changed, 62 insertions(+), 29 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 5660c08646..064dd19f39 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -11,10 +11,13 @@ scalars parameters i35_secdforest(j,ac) Initial secdforest (mio. ha) + i35_youngsecdf(t,j,ac) Initial secdforest (mio. ha) i35_other(j,ac) Initial other land (mio. ha) p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) + p35_youngsecdf(t,j,ac) Young secdforest per age class (mio. ha) p35_other(t,j,ac) Other land per age class (mio. ha) pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) + pc35_youngsecdf(t,j,ac) Young secdforest per age class in current time step (mio. ha) pc35_other(j,ac) Other land per age class in current time step (mio. ha) p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) @@ -49,7 +52,6 @@ equations q35_secdforest_expansion(j) Secdforest expansion (mio. ha) q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) - q35_secdforest_recovery_area(j) Forest recovery constraint after land abandonment (mio. ha) q35_secdforest_regeneration(j) Secondary forest regeneration (mio. ha) q35_max_forest_expansion(j) Maximum forestry regeneration based on potential forest area (mio. ha) q35_other_regeneration(j) Other land regeneration (mio. ha) @@ -72,6 +74,7 @@ equations positive variables v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) + v35_youngsecdf(j,ac) Detailed stock of young secdforest (<20 tC/ha) (mio. ha) v35_other(j,ac) Detailed stock of other land (mio. ha) vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) v35_other_expansion(j) Other land expansion compared to previous timestep (mio. ha) @@ -79,7 +82,6 @@ positive variables v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) - v35_secdforest_recovery_area(j) Forest recovery area after land abandonment (mio. ha) v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) v35_hvarea_other(j,ac) Harvested area from other land (mio. ha) v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 069cb8b0bb..801e0ad9f4 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -10,7 +10,7 @@ q35_land_secdforest(j2) .. vm_land(j2,"secdforest") =e= sum(ac, v35_secdforest(j2,ac)); - q35_land_other(j2) .. vm_land(j2,"other") =e= sum(ac, v35_other(j2,ac)); + q35_land_other(j2) .. vm_land(j2,"other") =e= sum(ac, v35_other(j2,ac)) + sum(ac, v35_youngsecdf(j2,ac)); *' The total natural land area cannot be smaller than the total natural land conservation target. *' Area requirements for natural land conservation are derived from WDPA and formulated based on @@ -49,7 +49,8 @@ q35_carbon_other(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"other",ag_pools,stockType) =e= - m_carbon_stock_ac(v35_other,pm_carbon_density_ac,"ac","ac_sub"); + m_carbon_stock_ac(v35_other,pm_carbon_density_ac,"ac","ac_sub") + + m_carbon_stock_ac(v35_younsecdf,pm_carbon_density_ac,"ac","ac_sub") ; *' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). @@ -196,22 +197,12 @@ q35_max_forest_expansion(j2).. *' to be secondary forest i.e., harvested primary forest gets reclassified as *' secondary forest and ends up in the youngest age-class (and follows regrowth) -q35_secdforest_recovery_area(j2).. - v35_secdforest_recovery_area(j2) - =e= - + p35_max_secdforest_recovery(j2) - * (sum(land_natveg,vm_landexpansion(j2,land_natveg)) - -sum(land_natveg,p35_land_restoration(j2,land_natveg)))/ - (sum(land_recovery35,pcm_land(j2,land_recovery35))+1e-10) - ; - q35_secdforest_regeneration(j2).. sum(ac_est, v35_secdforest(j2,ac_est)) =e= sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + v35_hvarea_primforest(j2) + p35_land_restoration(j2,"secdforest") - + v35_secdforest_recovery_area(j2) ; *' Harvested other land is still considered other land diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index 656abd9d7e..07a03ba7df 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -10,6 +10,7 @@ p35_secdforest(t,j,ac) = v35_secdforest.l(j,ac); *other land age class calculation p35_other(t,j,ac) = v35_other.l(j,ac); +p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 3d897377d7..4f85a2fe15 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -7,6 +7,7 @@ ** initialize other land i35_other(j,ac) = 0; +i35_youngsecdf(j,ac) = 0; i35_other(j,"acx") = pcm_land(j,"other"); ** initialize secdforest area depending on switch. @@ -34,6 +35,7 @@ i35_secdforest(j,"acx") = i35_secdforest(j,"acx") + (pcm_land(j,"secdforest") - *initialize parameter p35_other(t,j,ac) = 0; +p35_youngsecdf(t,j,ac) = 0; p35_secdforest(t,j,ac) = 0; * initialize forest disturbance losses diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index e3fc9c3c4d..cba882dfc3 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -7,9 +7,11 @@ if((ord(t) = 1), pc35_secdforest(j,ac) = i35_secdforest(j,ac); + pc35_youngsecdf(j,ac) = i35_youngsecdf(j,ac); pc35_other(j,ac) = i35_other(j,ac); else pc35_secdforest(j,ac) = p35_secdforest(t-1,j,ac); + pc35_youngsecdf(j,ac) = p35_youngsecdf(j,ac); pc35_other(j,ac) = p35_other(t-1,j,ac); ); @@ -47,6 +49,38 @@ pc35_secdforest(j,ac_sub) = pc35_secdforest(j,ac_sub) - p35_disturbance_loss_sec pcm_land(j,"primforest") = pcm_land(j,"primforest") - p35_disturbance_loss_primf(t,j); vm_land.l(j,"primforest") = pcm_land(j,"primforest"); + +* -------------------------------------- +* Secondary forest recovery bound +* -------------------------------------- + +* Forest recovery is constrained by the potential forest area in each cluster. +* Hence, the potential area for forest recovery is given by the potential forest +* area minus all forest areas in the previous time step. +p35_max_forest_recovery(j) = fm_pot_forest_area(j) + - sum(land_forest, pcm_land(j,land_forest)) + - sum(ac, pc35_youngsecdf(j,ac)); +p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; + +p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / sum(land_ag, pcm_land(j,land_ag)); +p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; + +* -------------------------------------- +* Secondary forest regeneration +* -------------------------------------- + +*' @code +*' Forest recovery is distributed proportionally based on the remaining +*' potential forest share in each cluster. +p35_recovered_forest(t,j,ac_est) = pc35_other(t,j,ac_est) * p35_forest_recovery_shr(j); +p35_recovered_forest(t,j,ac_est)$(p35_recovered_forest(t,j,ac_est) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j); +pc35_other(t,j,ac_est) = pc35_other(t,j,ac_est) - pc35_recovered_forest(t,j,ac_est); +pc35_secdforest(t,j,ac_est) = pc35_secdforest(t,j,ac_est) + pc35_recovered_forest(t,j,ac_est); + +*' Substract recovered forest area from the forest recovery potential. +p35_max_forest_recovery(j) = p35_max_forest_recovery(j) - p35_recovered_forest(t,j,ac_est); +*' @stop + * Regrowth of natural vegetation (natural succession) is modelled by shifting age-classes according to time step length. s35_shift = m_timestep_length_forestry/5; * example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) @@ -73,20 +107,20 @@ v35_other.l(j,ac) = pc35_other(j,ac); vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)); pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); -* -------------------------------------- -* Secondary forest establishment bound -* -------------------------------------- +* * -------------------------------------- +* * Secondary forest establishment bound +* * -------------------------------------- -* Overall forest establishment is constrained by the potential forest area in each cluster. -* Hence, the potential area for any forest expansion is given by the potential forest -* area minus all forest areas in the previous time step. -p35_max_forest_establishment(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -p35_max_forest_establishment(j)$(p35_max_forest_establishment(j) < 0) = 0; +* * Overall forest establishment is constrained by the potential forest area in each cluster. +* * Hence, the potential area for any forest expansion is given by the potential forest +* * area minus all forest areas in the previous time step. +* p35_max_forest_establishment(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +* p35_max_forest_establishment(j)$(p35_max_forest_establishment(j) < 0) = 0; -* The secondary forest recovery potential also includes forestry areas. -* Therefore they are not substracted. -p35_max_secdforest_recovery(j) = fm_pot_forest_area(j)-pcm_land(j,"primforest")-pcm_land(j,"secdforest"); -p35_max_secdforest_recovery(j)$(p35_max_secdforest_recovery(j) < 0) = 0; +* * The secondary forest recovery potential also includes forestry areas. +* * Therefore they are not substracted. +* p35_max_secdforest_recovery(j) = fm_pot_forest_area(j)-pcm_land(j,"primforest")-pcm_land(j,"secdforest"); +* p35_max_secdforest_recovery(j)$(p35_max_secdforest_recovery(j) < 0) = 0; * ------------------------------------- * Set bounds based on land conservation @@ -153,12 +187,15 @@ p35_max_secdforest_recovery(j) = p35_max_secdforest_recovery(j) - p35_land_resto vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); ** Other land +***************** vm_lu_transitions.l(j,"forestry","other") *reset bounds v35_other.lo(j,ac) = 0; v35_other.up(j,ac) = Inf; *set upper bound -v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); +v35_other.up(j,ac_sub) = pc35_other(j,ac_sub) +v35_youngsecdf.up(j,ac_sub) = pc35_youngsecdf.up(j,ac_sub); +v35_youngsecdf.fx(j,ac_est) = 0; m_boundfix(v35_other,(j,ac_sub),l,10e-5); * Other land conservation diff --git a/modules/35_natveg/pot_forest_may24/sets.gms b/modules/35_natveg/pot_forest_may24/sets.gms index 45ae03f81d..560dba40cd 100644 --- a/modules/35_natveg/pot_forest_may24/sets.gms +++ b/modules/35_natveg/pot_forest_may24/sets.gms @@ -20,8 +20,8 @@ sets pol_stock35 Land types for land protection policies / forest, other / - land_recovery35(land) Natveg recovery land - / crop, past, forestry, urban / + land_recov35(land) Natveg recovery land + / crop, past, other, urban / shock_scen Scenario name of forest carbon shock / none, 002lin2030,004lin2030,008lin2030,016lin2030 From 9ad2404adb2a01cd97027c8038737ad7d11b31e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Humpen=C3=B6der?= Date: Thu, 16 May 2024 11:37:40 +0200 Subject: [PATCH 164/259] Update scripts/start/test_runs.R Co-authored-by: Pascal Sauer <156898545+pascal-sauer@users.noreply.github.com> --- scripts/start/test_runs.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/start/test_runs.R b/scripts/start/test_runs.R index 8118f9b927..9e466b2134 100644 --- a/scripts/start/test_runs.R +++ b/scripts/start/test_runs.R @@ -47,7 +47,7 @@ for(ssp in c("SSP1","SSP2","SSP5")) { cfg$title <- .title(cfg, paste(ssp,"Ref",sep="-")) cfg <- setScenario(cfg,c(ssp,"NPI","rcp7p0")) cfg$gms$c56_mute_ghgprices_until <- "y2150" - cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NPi") + cfg$gms$c56_pollutant_prices <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-NPi") cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NPi") start_run(cfg, codeCheck = FALSE) From baec1323f43a99ad539a9809531a70806bb5b259 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Humpen=C3=B6der?= Date: Thu, 16 May 2024 11:38:41 +0200 Subject: [PATCH 165/259] Update modules/80_optimization/nlp_apr17/solve.gms Co-authored-by: Pascal Sauer <156898545+pascal-sauer@users.noreply.github.com> --- modules/80_optimization/nlp_apr17/solve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index 42984f030b..0c1382295b 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -70,7 +70,7 @@ if (magpie.modelstat > 2, display "vm_cost_glo.l"; display vm_cost_glo.l; -* write extended run information in list file in the case that the final solution is infeasible + * write extended run information in list file in the case that the final solution is infeasible if ((s80_counter >= (s80_maxiter-1) and magpie.modelstat > 2), magpie.solprint = 1 ); From 9aa44656e66cf311a45816fde70c0c9ff680a417 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 16 May 2024 11:54:18 +0200 Subject: [PATCH 166/259] reverting back --- modules/80_optimization/nlp_apr17/solve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index 0c1382295b..6cfe7692af 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -70,7 +70,7 @@ if (magpie.modelstat > 2, display "vm_cost_glo.l"; display vm_cost_glo.l; - * write extended run information in list file in the case that the final solution is infeasible +* write extended run information in list file in the case that the final solution is infeasible if ((s80_counter >= (s80_maxiter-1) and magpie.modelstat > 2), magpie.solprint = 1 ); From 90d1761c049a2b8ecca08b3f4cbe31c4c33e39d0 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 16 May 2024 11:55:46 +0200 Subject: [PATCH 167/259] automatic update of sets --- .../1st2ndgen_priced_feb24/sets.gms | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms index 82080a2dba..5a2d265a28 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms @@ -20,18 +20,22 @@ sets PIK_LIN, PIK_NPI, PIK_OPT, + R21M42-SDP-NDC, R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, + R21M42-SSP1-NDC, R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, + R21M42-SSP2-NDC, R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, + R21M42-SSP5-NDC, R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, @@ -41,6 +45,21 @@ sets R2M41-SSP2-Budg950, R2M41-SSP2-NDC, R2M41-SSP2-NPi, + R32M46-SDP_MC-NDC, + R32M46-SDP_MC-NPi, + R32M46-SDP_MC-PkBudg650, + R32M46-SSP1-NDC, + R32M46-SSP1-NPi, + R32M46-SSP1-PkBudg1050, + R32M46-SSP1-PkBudg650, + R32M46-SSP2EU-NDC, + R32M46-SSP2EU-NPi, + R32M46-SSP2EU-PkBudg1050, + R32M46-SSP2EU-PkBudg650, + R32M46-SSP5-NDC, + R32M46-SSP5-NPi, + R32M46-SSP5-PkBudg1050, + R32M46-SSP5-PkBudg650, SSPDB-SSP1-19-IMAGE, SSPDB-SSP1-19-REMIND-MAGPIE, SSPDB-SSP1-26-IMAGE, @@ -62,8 +81,7 @@ sets SSPDB-SSP5-34-REMIND-MAGPIE, SSPDB-SSP5-45-REMIND-MAGPIE, SSPDB-SSP5-60-REMIND-MAGPIE, - SSPDB-SSP5-Ref-REMIND-MAGPIE, - R21M42-SSP2-Npi-PhaseOut20 / + SSPDB-SSP5-Ref-REMIND-MAGPIE / ; *######################### R SECTION END (SETS) ################################ From 382839ab99060e3c596b013bbbe702f77b791795 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 16 May 2024 11:58:02 +0200 Subject: [PATCH 168/259] indent --- modules/80_optimization/nlp_apr17/solve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index 6cfe7692af..42984f030b 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -70,7 +70,7 @@ if (magpie.modelstat > 2, display "vm_cost_glo.l"; display vm_cost_glo.l; -* write extended run information in list file in the case that the final solution is infeasible +* write extended run information in list file in the case that the final solution is infeasible if ((s80_counter >= (s80_maxiter-1) and magpie.modelstat > 2), magpie.solprint = 1 ); From 0e696570ac39db62f7d8ce385f9c42768c0d3f33 Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 16 May 2024 12:00:45 +0200 Subject: [PATCH 169/259] ifelse --- scripts/start/test_runs.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/start/test_runs.R b/scripts/start/test_runs.R index 9e466b2134..e30a77ab08 100644 --- a/scripts/start/test_runs.R +++ b/scripts/start/test_runs.R @@ -48,21 +48,21 @@ for(ssp in c("SSP1","SSP2","SSP5")) { cfg <- setScenario(cfg,c(ssp,"NPI","rcp7p0")) cfg$gms$c56_mute_ghgprices_until <- "y2150" cfg$gms$c56_pollutant_prices <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-NPi") - cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NPi") + cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-NPi") start_run(cfg, codeCheck = FALSE) cfg$title <- .title(cfg, paste(ssp,"NDC",sep="-")) cfg <- setScenario(cfg,c(ssp,"NDC","rcp4p5")) cfg$gms$c56_mute_ghgprices_until <- "y2150" - cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NDC") - cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-NDC") + cfg$gms$c56_pollutant_prices <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-NDC") + cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-NDC") start_run(cfg, codeCheck = FALSE) cfg$title <- .title(cfg, paste(ssp,"PkBudg650",sep="-")) cfg <- setScenario(cfg,c(ssp,"NDC","rcp1p9")) cfg$gms$c56_mute_ghgprices_until <- "y2030" - cfg$gms$c56_pollutant_prices <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-PkBudg650") - cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-",ifelse(ssp=="SSP2",paste0(ssp,"EU"),ssp),"-PkBudg650") + cfg$gms$c56_pollutant_prices <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-PkBudg650") + cfg$gms$c60_2ndgen_biodem <- paste0("R32M46-", if (ssp=="SSP2") "SSP2EU" else ssp,"-PkBudg650") start_run(cfg, codeCheck = FALSE) } From 1e79ca8cfe4fc1b8191d26823d69ffc8274d021b Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 16 May 2024 12:25:35 +0200 Subject: [PATCH 170/259] reworked 35_natveg presolve regarding potential forest area --- config/default.cfg | 2 +- core/macros.gms | 4 +- .../pot_forest_may24/declarations.gms | 19 ++-- .../35_natveg/pot_forest_may24/equations.gms | 6 +- .../35_natveg/pot_forest_may24/postsolve.gms | 20 ++-- .../35_natveg/pot_forest_may24/presolve.gms | 103 ++++++++++-------- modules/35_natveg/pot_forest_may24/sets.gms | 3 - .../1st2ndgen_priced_feb24/sets.gms | 22 +++- 8 files changed, 102 insertions(+), 77 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 4e1e4027c8..d950d52a27 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -25,7 +25,7 @@ cfg$model <- "main.gms" #def = "main.gms" cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.105_h12_validation.tgz", - additional = "additional_data_rev4.48.tgz", + additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") # NOTE: It is recommended to recalibrate the model when changing cellular input data diff --git a/core/macros.gms b/core/macros.gms index 0103e94c73..2fb013af99 100644 --- a/core/macros.gms +++ b/core/macros.gms @@ -97,12 +97,12 @@ $macro m_linear_cell_data_interpol(output,x,input_x1,input_x2,input_y1,input_y2) * macro for simple carbon stocks $macro m_carbon_stock(land,carbon_density,item) \ (land(j2,item) * sum(ct,carbon_density(ct,j2,item,ag_pools)))$(sameas(stockType,"actual")) + \ - (land(j2,item) * sum(ct,carbon_density(ct,j2,item,ag_pools)))$(sameas(stockType,"actualNoAcEst")); + (land(j2,item) * sum(ct,carbon_density(ct,j2,item,ag_pools)))$(sameas(stockType,"actualNoAcEst")) * macro for carbon stocks with age classes $macro m_carbon_stock_ac(land,carbon_density,sets,sets_sub) \ sum((&&sets), land(j2,&&sets) * sum(ct, carbon_density(ct,j2,&&sets,ag_pools)))$(sameas(stockType,"actual")) + \ - sum((&&sets_sub), land(j2,&&sets_sub) * sum(ct, carbon_density(ct,j2,&&sets_sub,ag_pools)))$(sameas(stockType,"actualNoAcEst")); + sum((&&sets_sub), land(j2,&&sets_sub) * sum(ct, carbon_density(ct,j2,&&sets_sub,ag_pools)))$(sameas(stockType,"actualNoAcEst")) * macros for peatland module $macro m58_LandMerge(land,landForestry,set) \ diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 064dd19f39..fe4433f782 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -11,19 +11,21 @@ scalars parameters i35_secdforest(j,ac) Initial secdforest (mio. ha) - i35_youngsecdf(t,j,ac) Initial secdforest (mio. ha) + i35_youngsecdf(j,ac) Initial young secdforest (mio. ha) i35_other(j,ac) Initial other land (mio. ha) p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) p35_youngsecdf(t,j,ac) Young secdforest per age class (mio. ha) p35_other(t,j,ac) Other land per age class (mio. ha) pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) - pc35_youngsecdf(t,j,ac) Young secdforest per age class in current time step (mio. ha) + pc35_youngsecdf(j,ac) Young secdforest per age class in current time step (mio. ha) pc35_other(j,ac) Other land per age class in current time step (mio. ha) p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) - p35_max_secdforest_recovery(j) Secondary forest recovery potential (mio. ha) - p35_max_forest_establishment(j) Overall forest establishment potential (mio. ha) + p35_forest_recovery_shr(j) Forest share in natveg recovery (1) + p35_recovered_forest(t,j,ac) Recovered forest (mio. ha) + p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) + p35_max_forest_est(j) Overall forest establishment potential (mio. ha) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) @@ -53,7 +55,7 @@ equations q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) q35_secdforest_regeneration(j) Secondary forest regeneration (mio. ha) - q35_max_forest_expansion(j) Maximum forestry regeneration based on potential forest area (mio. ha) + q35_max_forest_establishment(j) Maximum forestry regeneration based on potential forest area (mio. ha) q35_other_regeneration(j) Other land regeneration (mio. ha) q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) @@ -74,7 +76,7 @@ equations positive variables v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) - v35_youngsecdf(j,ac) Detailed stock of young secdforest (<20 tC/ha) (mio. ha) + v35_youngsecdf(j,ac) Detailed stock of young secdforest (mio. ha) v35_other(j,ac) Detailed stock of other land (mio. ha) vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) v35_other_expansion(j) Other land expansion compared to previous timestep (mio. ha) @@ -93,6 +95,7 @@ positive variables *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (mio. ha) + ov35_youngsecdf(t,j,ac,type) Detailed stock of young secdforest (mio. ha) ov35_other(t,j,ac,type) Detailed stock of other land (mio. ha) ov_landdiff_natveg(t,type) Aggregated difference in natveg land compared to previous timestep (mio. ha) ov35_other_expansion(t,j,type) Other land expansion compared to previous timestep (mio. ha) @@ -100,7 +103,6 @@ parameters ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha) - ov35_secdforest_recovery_area(t,j,type) Forest recovery area after land abandonment (mio. ha) ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha) ov35_hvarea_other(t,j,ac,type) Harvested area from other land (mio. ha) ov35_hvarea_primforest(t,j,type) Harvested area from primary forest (mio. ha) @@ -119,9 +121,8 @@ parameters oq35_secdforest_expansion(t,j,type) Secdforest expansion (mio. ha) oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) - oq35_secdforest_recovery_area(t,j,type) Forest recovery constraint after land abandonment (mio. ha) oq35_secdforest_regeneration(t,j,type) Secondary forest regeneration (mio. ha) - oq35_max_forest_expansion(t,j,type) Maximum forestry regeneration based on potential forest area (mio. ha) + oq35_max_forest_establishment(t,j,type) Maximum forestry regeneration based on potential forest area (mio. ha) oq35_other_regeneration(t,j,type) Other land regeneration (mio. ha) oq35_other_est(t,j,ac,type) Distribution of other land additions over ac_est (mio. ha) oq35_secdforest_est(t,j,ac,type) Distribution of secdforest additions over ac_est (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 801e0ad9f4..f6acc90adb 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -50,7 +50,7 @@ q35_carbon_other(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"other",ag_pools,stockType) =e= m_carbon_stock_ac(v35_other,pm_carbon_density_ac,"ac","ac_sub") - + m_carbon_stock_ac(v35_younsecdf,pm_carbon_density_ac,"ac","ac_sub") ; + + m_carbon_stock_ac(v35_youngsecdf,pm_carbon_density_ac,"ac","ac_sub"); *' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). @@ -186,10 +186,10 @@ q35_hvarea_other(j2,ac_sub).. *' remaining potential forest area, which is derived from *' the potential natural forest area in each cluster. -q35_max_forest_expansion(j2).. +q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - p35_max_forest_establishment(j2) + p35_max_forest_est(j2) ; *' Harvested secondary forest is still considered secondary forests due to diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index 07a03ba7df..ebe6ddce81 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -14,6 +14,7 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); + ov35_youngsecdf(t,j,ac,"marginal") = v35_youngsecdf.m(j,ac); ov35_other(t,j,ac,"marginal") = v35_other.m(j,ac); ov_landdiff_natveg(t,"marginal") = vm_landdiff_natveg.m; ov35_other_expansion(t,j,"marginal") = v35_other_expansion.m(j); @@ -21,7 +22,6 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j); ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac); ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j); - ov35_secdforest_recovery_area(t,j,"marginal") = v35_secdforest_recovery_area.m(j); ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac); ov35_hvarea_other(t,j,ac,"marginal") = v35_hvarea_other.m(j,ac); ov35_hvarea_primforest(t,j,"marginal") = v35_hvarea_primforest.m(j); @@ -40,9 +40,8 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j); oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); - oq35_secdforest_recovery_area(t,j,"marginal") = q35_secdforest_recovery_area.m(j); oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.m(j); - oq35_max_forest_expansion(t,j,"marginal") = q35_max_forest_expansion.m(j); + oq35_max_forest_establishment(t,j,"marginal") = q35_max_forest_establishment.m(j); oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); oq35_other_est(t,j,ac,"marginal") = q35_other_est.m(j,ac); oq35_secdforest_est(t,j,ac,"marginal") = q35_secdforest_est.m(j,ac); @@ -60,6 +59,7 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_restoration(t,j,"marginal") = q35_secdforest_restoration.m(j); oq35_other_restoration(t,j,"marginal") = q35_other_restoration.m(j); ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac); + ov35_youngsecdf(t,j,ac,"level") = v35_youngsecdf.l(j,ac); ov35_other(t,j,ac,"level") = v35_other.l(j,ac); ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l; ov35_other_expansion(t,j,"level") = v35_other_expansion.l(j); @@ -67,7 +67,6 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j); ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac); ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j); - ov35_secdforest_recovery_area(t,j,"level") = v35_secdforest_recovery_area.l(j); ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac); ov35_hvarea_other(t,j,ac,"level") = v35_hvarea_other.l(j,ac); ov35_hvarea_primforest(t,j,"level") = v35_hvarea_primforest.l(j); @@ -86,9 +85,8 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j); oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); - oq35_secdforest_recovery_area(t,j,"level") = q35_secdforest_recovery_area.l(j); oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.l(j); - oq35_max_forest_expansion(t,j,"level") = q35_max_forest_expansion.l(j); + oq35_max_forest_establishment(t,j,"level") = q35_max_forest_establishment.l(j); oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); oq35_other_est(t,j,ac,"level") = q35_other_est.l(j,ac); oq35_secdforest_est(t,j,ac,"level") = q35_secdforest_est.l(j,ac); @@ -106,6 +104,7 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_restoration(t,j,"level") = q35_secdforest_restoration.l(j); oq35_other_restoration(t,j,"level") = q35_other_restoration.l(j); ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac); + ov35_youngsecdf(t,j,ac,"upper") = v35_youngsecdf.up(j,ac); ov35_other(t,j,ac,"upper") = v35_other.up(j,ac); ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up; ov35_other_expansion(t,j,"upper") = v35_other_expansion.up(j); @@ -113,7 +112,6 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j); ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac); ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j); - ov35_secdforest_recovery_area(t,j,"upper") = v35_secdforest_recovery_area.up(j); ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac); ov35_hvarea_other(t,j,ac,"upper") = v35_hvarea_other.up(j,ac); ov35_hvarea_primforest(t,j,"upper") = v35_hvarea_primforest.up(j); @@ -132,9 +130,8 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j); oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); - oq35_secdforest_recovery_area(t,j,"upper") = q35_secdforest_recovery_area.up(j); oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.up(j); - oq35_max_forest_expansion(t,j,"upper") = q35_max_forest_expansion.up(j); + oq35_max_forest_establishment(t,j,"upper") = q35_max_forest_establishment.up(j); oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); oq35_other_est(t,j,ac,"upper") = q35_other_est.up(j,ac); oq35_secdforest_est(t,j,ac,"upper") = q35_secdforest_est.up(j,ac); @@ -152,6 +149,7 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_restoration(t,j,"upper") = q35_secdforest_restoration.up(j); oq35_other_restoration(t,j,"upper") = q35_other_restoration.up(j); ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac); + ov35_youngsecdf(t,j,ac,"lower") = v35_youngsecdf.lo(j,ac); ov35_other(t,j,ac,"lower") = v35_other.lo(j,ac); ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo; ov35_other_expansion(t,j,"lower") = v35_other_expansion.lo(j); @@ -159,7 +157,6 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j); ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac); ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j); - ov35_secdforest_recovery_area(t,j,"lower") = v35_secdforest_recovery_area.lo(j); ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac); ov35_hvarea_other(t,j,ac,"lower") = v35_hvarea_other.lo(j,ac); ov35_hvarea_primforest(t,j,"lower") = v35_hvarea_primforest.lo(j); @@ -178,9 +175,8 @@ p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j); oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); - oq35_secdforest_recovery_area(t,j,"lower") = q35_secdforest_recovery_area.lo(j); oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.lo(j); - oq35_max_forest_expansion(t,j,"lower") = q35_max_forest_expansion.lo(j); + oq35_max_forest_establishment(t,j,"lower") = q35_max_forest_establishment.lo(j); oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); oq35_other_est(t,j,ac,"lower") = q35_other_est.lo(j,ac); oq35_secdforest_est(t,j,ac,"lower") = q35_secdforest_est.lo(j,ac); diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index cba882dfc3..db7069b2a9 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -11,7 +11,7 @@ if((ord(t) = 1), pc35_other(j,ac) = i35_other(j,ac); else pc35_secdforest(j,ac) = p35_secdforest(t-1,j,ac); - pc35_youngsecdf(j,ac) = p35_youngsecdf(j,ac); + pc35_youngsecdf(j,ac) = p35_youngsecdf(t-1,j,ac); pc35_other(j,ac) = p35_other(t-1,j,ac); ); @@ -51,35 +51,42 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * -------------------------------------- -* Secondary forest recovery bound +* Forest establishment bound * -------------------------------------- -* Forest recovery is constrained by the potential forest area in each cluster. -* Hence, the potential area for forest recovery is given by the potential forest +* Forest establishment is constrained by the potential forest area in each cluster. +* Hence, the area for potential forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -p35_max_forest_recovery(j) = fm_pot_forest_area(j) - - sum(land_forest, pcm_land(j,land_forest)) - - sum(ac, pc35_youngsecdf(j,ac)); -p35_max_forest_recovery(j)$(p35_max_forest_recovery(j) < 0) = 0; - -p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / sum(land_ag, pcm_land(j,land_ag)); -p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; +p35_max_forest_est(j) = fm_pot_forest_area(j) + - sum(land_forest, pcm_land(j,land_forest)) + - sum(ac_sub, pc35_youngsecdf(j,ac_sub)); +p35_max_forest_est(j)$(p35_max_forest_est(j) < 0) = 0; * -------------------------------------- -* Secondary forest regeneration +* Secondary forest recovery * -------------------------------------- -*' @code -*' Forest recovery is distributed proportionally based on the remaining -*' potential forest share in each cluster. -p35_recovered_forest(t,j,ac_est) = pc35_other(t,j,ac_est) * p35_forest_recovery_shr(j); -p35_recovered_forest(t,j,ac_est)$(p35_recovered_forest(t,j,ac_est) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j); -pc35_other(t,j,ac_est) = pc35_other(t,j,ac_est) - pc35_recovered_forest(t,j,ac_est); -pc35_secdforest(t,j,ac_est) = pc35_secdforest(t,j,ac_est) + pc35_recovered_forest(t,j,ac_est); - -*' Substract recovered forest area from the forest recovery potential. -p35_max_forest_recovery(j) = p35_max_forest_recovery(j) - p35_recovered_forest(t,j,ac_est); -*' @stop +* Distribute forestry abandonement +pc35_youngsecdf(j,ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); +pc35_youngsecdf(j,ac_est)$(p35_max_forest_est(j) 1) = 1; +* Abandoned land pc35_other(j,ac_est) is then distributed propotionally using the forest recovery share. +p35_recovered_forest(t,j,ac_est) = pc35_other(j,ac_est) * p35_forest_recovery_shr(j); +p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est)) > p35_max_forest_est(j)) = p35_max_forest_est(j)/card(ac_est2); +pc35_other(j,ac_est) = pc35_other(j,ac_est) - p35_recovered_forest(t,j,ac_est); +pc35_youngsecdf(j,ac_est) = pc35_youngsecdf(j,ac_est) + p35_recovered_forest(t,j,ac_est); + +* Substract the actual recovered forest area from the forest recovery potential. +p35_max_forest_est(j) = p35_max_forest_est(j) - sum(ac_est,p35_recovered_forest(t,j,ac_est)); + +* ------------------------------------------------ +* Natural vegetation growth (age-class shift) +* ------------------------------------------------ * Regrowth of natural vegetation (natural succession) is modelled by shifting age-classes according to time step length. s35_shift = m_timestep_length_forestry/5; @@ -89,6 +96,12 @@ s35_shift = m_timestep_length_forestry/5; p35_other(t,j,"acx") = p35_other(t,j,"acx") + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_other(j,ac)); +* example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) + p35_youngsecdf(t,j,ac)$(ord(ac) > s35_shift) = pc35_youngsecdf(j,ac-s35_shift); +* account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation + p35_youngsecdf(t,j,"acx") = p35_youngsecdf(t,j,"acx") + + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_youngsecdf(j,ac)); + * Usual shift * example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) p35_secdforest(t,j,ac)$(ord(ac) > s35_shift) = pc35_secdforest(j,ac-s35_shift); @@ -97,6 +110,20 @@ s35_shift = m_timestep_length_forestry/5; + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_secdforest(j,ac)); +* ------------------------------------------------------- +* Carbon threshold for secondary forest maturation +* ------------------------------------------------------- + +*' @code +*' If the vegetation carbon density in a simulation unit due to regrowth +*' exceeds a threshold of 20 tC/ha the respective area is shifted from young secondary +*' forest, which is still considered other land, to secondary forest land. +p35_maturesecdf(t,j,ac)$(not sameas(ac,"acx")) = + p35_youngsecdf(t,j,ac)$(pm_carbon_density_ac(t,j,ac,"vegc") > 20); +p35_youngsecdf(t,j,ac) = p35_youngsecdf(t,j,ac) - p35_maturesecdf(t,j,ac); +p35_secdforest(t,j,ac) = p35_secdforest(t,j,ac) + p35_maturesecdf(t,j,ac); +*' @stop + pc35_secdforest(j,ac) = p35_secdforest(t,j,ac); v35_secdforest.l(j,ac) = pc35_secdforest(j,ac); vm_land.l(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); @@ -104,23 +131,10 @@ pcm_land(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); pc35_other(j,ac) = p35_other(t,j,ac); v35_other.l(j,ac) = pc35_other(j,ac); -vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)); -pcm_land(j,"other") = sum(ac, pc35_other(j,ac)); - -* * -------------------------------------- -* * Secondary forest establishment bound -* * -------------------------------------- - -* * Overall forest establishment is constrained by the potential forest area in each cluster. -* * Hence, the potential area for any forest expansion is given by the potential forest -* * area minus all forest areas in the previous time step. -* p35_max_forest_establishment(j) = fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -* p35_max_forest_establishment(j)$(p35_max_forest_establishment(j) < 0) = 0; - -* * The secondary forest recovery potential also includes forestry areas. -* * Therefore they are not substracted. -* p35_max_secdforest_recovery(j) = fm_pot_forest_area(j)-pcm_land(j,"primforest")-pcm_land(j,"secdforest"); -* p35_max_secdforest_recovery(j)$(p35_max_secdforest_recovery(j) < 0) = 0; +pc35_youngsecdf(j,ac) = p35_youngsecdf(t,j,ac); +v35_youngsecdf.l(j,ac) = pc35_youngsecdf(j,ac); +vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)) + sum(ac, pc35_youngsecdf(j,ac)); +pcm_land(j,"other") = sum(ac, pc35_other(j,ac)) + sum(ac, pc35_youngsecdf(j,ac)); * ------------------------------------- * Set bounds based on land conservation @@ -175,26 +189,25 @@ p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) * Since forest restoration cannot be bigger than the potential area for secdforest recovery, * any remaining restoration area is substracted and shifted to other land restoration. -p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_secdforest_recovery(j); +p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_est(j); p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); * Substract forest restoration area from secondary forest recovery potential -p35_max_secdforest_recovery(j) = p35_max_secdforest_recovery(j) - p35_land_restoration(j,"secdforest"); +p35_max_forest_est(j) = p35_max_forest_est(j) - p35_land_restoration(j,"secdforest"); * set conservation bound vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); ** Other land -***************** vm_lu_transitions.l(j,"forestry","other") *reset bounds v35_other.lo(j,ac) = 0; v35_other.up(j,ac) = Inf; *set upper bound -v35_other.up(j,ac_sub) = pc35_other(j,ac_sub) -v35_youngsecdf.up(j,ac_sub) = pc35_youngsecdf.up(j,ac_sub); +v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); +v35_youngsecdf.up(j,ac_sub) = pc35_youngsecdf(j,ac_sub); v35_youngsecdf.fx(j,ac_est) = 0; m_boundfix(v35_other,(j,ac_sub),l,10e-5); diff --git a/modules/35_natveg/pot_forest_may24/sets.gms b/modules/35_natveg/pot_forest_may24/sets.gms index 560dba40cd..c2c49b83d8 100644 --- a/modules/35_natveg/pot_forest_may24/sets.gms +++ b/modules/35_natveg/pot_forest_may24/sets.gms @@ -20,9 +20,6 @@ sets pol_stock35 Land types for land protection policies / forest, other / - land_recov35(land) Natveg recovery land - / crop, past, other, urban / - shock_scen Scenario name of forest carbon shock / none, 002lin2030,004lin2030,008lin2030,016lin2030 / diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms index 82080a2dba..5a2d265a28 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/sets.gms @@ -20,18 +20,22 @@ sets PIK_LIN, PIK_NPI, PIK_OPT, + R21M42-SDP-NDC, R21M42-SDP-NPi, R21M42-SDP-PkBudg1000, R21M42-SDP-PkBudg1100, R21M42-SDP-PkBudg900, + R21M42-SSP1-NDC, R21M42-SSP1-NPi, R21M42-SSP1-PkBudg1100, R21M42-SSP1-PkBudg1300, R21M42-SSP1-PkBudg900, + R21M42-SSP2-NDC, R21M42-SSP2-NPi, R21M42-SSP2-PkBudg1100, R21M42-SSP2-PkBudg1300, R21M42-SSP2-PkBudg900, + R21M42-SSP5-NDC, R21M42-SSP5-NPi, R21M42-SSP5-PkBudg1100, R21M42-SSP5-PkBudg1300, @@ -41,6 +45,21 @@ sets R2M41-SSP2-Budg950, R2M41-SSP2-NDC, R2M41-SSP2-NPi, + R32M46-SDP_MC-NDC, + R32M46-SDP_MC-NPi, + R32M46-SDP_MC-PkBudg650, + R32M46-SSP1-NDC, + R32M46-SSP1-NPi, + R32M46-SSP1-PkBudg1050, + R32M46-SSP1-PkBudg650, + R32M46-SSP2EU-NDC, + R32M46-SSP2EU-NPi, + R32M46-SSP2EU-PkBudg1050, + R32M46-SSP2EU-PkBudg650, + R32M46-SSP5-NDC, + R32M46-SSP5-NPi, + R32M46-SSP5-PkBudg1050, + R32M46-SSP5-PkBudg650, SSPDB-SSP1-19-IMAGE, SSPDB-SSP1-19-REMIND-MAGPIE, SSPDB-SSP1-26-IMAGE, @@ -62,8 +81,7 @@ sets SSPDB-SSP5-34-REMIND-MAGPIE, SSPDB-SSP5-45-REMIND-MAGPIE, SSPDB-SSP5-60-REMIND-MAGPIE, - SSPDB-SSP5-Ref-REMIND-MAGPIE, - R21M42-SSP2-Npi-PhaseOut20 / + SSPDB-SSP5-Ref-REMIND-MAGPIE / ; *######################### R SECTION END (SETS) ################################ From 6913e0f86daadd26a4fa0f0474dd5a87df6d7291 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 16 May 2024 14:28:35 +0200 Subject: [PATCH 171/259] separate carbon densities for forest and other land --- core/sets.gms | 7 +++--- .../managementcalib_aug19/preloop.gms | 25 +++++++++++++------ .../managementcalib_aug19/presolve.gms | 19 ++++++++++---- modules/32_forestry/dynamic_feb21/preloop.gms | 12 ++++----- .../32_forestry/dynamic_feb21/presolve.gms | 6 ++--- .../35_natveg/pot_forest_may24/equations.gms | 6 ++--- .../35_natveg/pot_forest_may24/presolve.gms | 10 +------- .../52_carbon/normal_dec17/declarations.gms | 5 ++-- modules/52_carbon/normal_dec17/start.gms | 23 ++++++++++++----- 9 files changed, 69 insertions(+), 44 deletions(-) diff --git a/core/sets.gms b/core/sets.gms index 667a888604..8279e27607 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -248,15 +248,16 @@ sets land_ag(land) Agricultural land pools / crop, past / - land_forest(land) Forested land pools - / forestry, primforest, secdforest / - land_timber(land) land from which timber can be taken away / forestry, primforest, secdforest, other / + land_forest(land_timber) Forested land pools + / forestry, primforest, secdforest / + land_natveg(land_timber) Natural vegetation land pools / primforest, secdforest, other / + forest_type forest type / plantations, natveg / diff --git a/modules/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index a23737fd6e..ced0a92e8a 100644 --- a/modules/14_yields/managementcalib_aug19/preloop.gms +++ b/modules/14_yields/managementcalib_aug19/preloop.gms @@ -146,11 +146,11 @@ if ((s14_calib_ir2rf = 1), *' @code *' Calibrated yields can additionally be adjusted by calibration factors 'f14_yld_calib' *' determined in a calibration run. As MAgPIE optimizes yield patterns and FAO regional -*' yields are outlier corrected, historical production and croparea can in some cases +*' yields are outlier corrected, historical production and croparea can in some cases *' be better represented with this additional correction: -* set yield calib factors to 1 in case of no use of yield calibration factors (s14_use_yield_calib = 0) -* or missing input file +* set yield calib factors to 1 in case of no use of yield calibration factors (s14_use_yield_calib = 0) +* or missing input file if(s14_use_yield_calib = 0 OR sum((i,ltype14),f14_yld_calib(i,ltype14)) = 0, f14_yld_calib(i,ltype14) = 1; ); @@ -189,23 +189,34 @@ if ((s14_degradation = 1), **** **** **** + p14_growing_stock_initial(j,ac,"forestry","plantations") = ( - pm_carbon_density_ac_forestry("y1995",j,ac,"vegc") + pm_carbon_density_ac_plantation("y1995",j,ac,"vegc") / s14_carbon_fraction * f14_aboveground_fraction("forestry") / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"plantations")) ) ; -p14_growing_stock_initial(j,ac,land_natveg,"natveg") = +p14_growing_stock_initial(j,ac,land_forest,"natveg") = + ( + pm_carbon_density_secdforest_ac("y1995",j,ac,"vegc") + / s14_carbon_fraction + * f14_aboveground_fraction(land_forest) + / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) + ) + ; + +p14_growing_stock_initial(j,ac,"other","natveg") = ( - pm_carbon_density_ac("y1995",j,ac,"vegc") + pm_carbon_density_other_ac("y1995",j,ac,"vegc") / s14_carbon_fraction - * f14_aboveground_fraction(land_natveg) + * f14_aboveground_fraction("other") / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) ) ; + **** Hard constraint to always have a positive number in p14_growing_stock p14_growing_stock_initial(j,ac,land_natveg,"natveg") = p14_growing_stock_initial(j,ac,land_natveg,"natveg")$(p14_growing_stock_initial(j,ac,land_natveg,"natveg")>0)+0.0001$(p14_growing_stock_initial(j,ac,land_natveg,"natveg")=0); p14_growing_stock_initial(j,ac,"forestry","plantations") = p14_growing_stock_initial(j,ac,"forestry","plantations")$(p14_growing_stock_initial(j,ac,"forestry","plantations")>0)+0.0001$(p14_growing_stock_initial(j,ac,"forestry","plantations")=0); diff --git a/modules/14_yields/managementcalib_aug19/presolve.gms b/modules/14_yields/managementcalib_aug19/presolve.gms index e9b652f06c..a564085171 100644 --- a/modules/14_yields/managementcalib_aug19/presolve.gms +++ b/modules/14_yields/managementcalib_aug19/presolve.gms @@ -11,7 +11,7 @@ *** YIELDS -*` `pm_carbon_density_ac_forestry` for vegetation Carbon is above- and belowground +*` `pm_carbon_density_ac_plantation` for vegetation Carbon is above- and belowground *' carbon density. We convert Carbon density in tC/ha to tDM/ha by using carbon *' fraction of `s14_carbon_fraction` in tC/tDM. For assessing wood harvesting *' we need only aboveground biomass information, therefore we multiply with @@ -22,18 +22,27 @@ *` @code p14_growing_stock(t,j,ac,"forestry","plantations") = ( - pm_carbon_density_ac_forestry(t,j,ac,"vegc") + pm_carbon_density_ac_plantation(t,j,ac,"vegc") / s14_carbon_fraction * f14_aboveground_fraction("forestry") / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"plantations")) ) ; -p14_growing_stock(t,j,ac,land_natveg,"natveg") = +p14_growing_stock(t,j,ac,land_forest,"natveg") = ( - pm_carbon_density_ac(t,j,ac,"vegc") + pm_carbon_density_secdforest_ac(t,j,ac,"vegc") / s14_carbon_fraction - * f14_aboveground_fraction(land_natveg) + * f14_aboveground_fraction(land_forest) + / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) + ) + ; + +p14_growing_stock(t,j,ac,"other","natveg") = + ( + pm_carbon_density_other_ac(t,j,ac,"vegc") + / s14_carbon_fraction + * f14_aboveground_fraction("other") / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) ) ; diff --git a/modules/32_forestry/dynamic_feb21/preloop.gms b/modules/32_forestry/dynamic_feb21/preloop.gms index fae349543f..f0be43077a 100644 --- a/modules/32_forestry/dynamic_feb21/preloop.gms +++ b/modules/32_forestry/dynamic_feb21/preloop.gms @@ -6,7 +6,7 @@ *** | Contact: magpie@pik-potsdam.de ** Calculation of Single rotation model rotation lengths ** Using forestry carbon densitiy here via carbon density data exchange from carbon module. -p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); +p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_ac_plantation(t_all,j,ac,"vegc"); ** Calculating the marginal of carbon density i.e. change in carbon density over two time steps ** The carbon densities are tC/ha/year so we don't have to divide by timestep length. @@ -44,7 +44,7 @@ $ifthen "%c32_rot_calc_type%" == "current_annual_increment" $endif $ifthen "%c32_rot_calc_type%" == "mean_annual_increment" - p32_avg_increment(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") / ((ord(ac)+1)*5); + p32_avg_increment(t_all,j,ac) = pm_carbon_density_ac_plantation(t_all,j,ac,"vegc") / ((ord(ac)+1)*5); p32_rot_flg(t_all,j,ac) = 1$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_avg_increment(t_all,j,ac) > 0) + 0$(p32_carbon_density_ac_marg(t_all,j,ac) - p32_avg_increment(t_all,j,ac) <= 0); display "Rotation lengths are calculated based on maximizing mean annual increment in this run."; @@ -280,14 +280,14 @@ p32_gs_scaling_reg(i)$(f32_gs_relativetarget(i)>0 AND f32_plantedforest(i)>0) = ** Calibration factors lower than 1 are set to 1 p32_gs_scaling_reg(i)$(p32_gs_scaling_reg(i) < 1) = 1; -** Save pm_carbon_density_ac_forestry in a parameter before upscaling to FAO growing stocks. +** Save pm_carbon_density_ac_plantation in a parameter before upscaling to FAO growing stocks. ** This allows to use plantation growth curves for CO2 price driven afforestation. -p32_c_density_ac_fast_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); +p32_c_density_ac_fast_forestry(t_all,j,ac) = pm_carbon_density_ac_plantation(t_all,j,ac,"vegc"); ** Update c-density for timber plantations based on calibration factor to match FAO growing stocks -pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") * sum(cell(i,j),p32_gs_scaling_reg(i)); +pm_carbon_density_ac_plantation(t_all,j,ac,"vegc") = pm_carbon_density_ac_plantation(t_all,j,ac,"vegc") * sum(cell(i,j),p32_gs_scaling_reg(i)); ** keep c-density for timber plantations constant after rotation length to avoid unrealistic carbon sequestration in unharvested timber plantations -pm_carbon_density_ac_forestry(t_all,j,ac,"vegc")$(ac.off >= p32_rotation_cellular_harvesting(t_all,j)) = sum(ac2$(ac2.off = p32_rotation_cellular_harvesting(t_all,j)), pm_carbon_density_ac_forestry(t_all,j,ac2,"vegc")); +pm_carbon_density_ac_plantation(t_all,j,ac,"vegc")$(ac.off >= p32_rotation_cellular_harvesting(t_all,j)) = sum(ac2$(ac2.off = p32_rotation_cellular_harvesting(t_all,j)), pm_carbon_density_ac_plantation(t_all,j,ac2,"vegc")); ** set bii coefficients p32_bii_coeff(type32,bii_class_secd,potnatveg) = 0; diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 36d4f68049..95eb43a470 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -38,16 +38,16 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; *' 0 = Use natveg growth curve towards LPJmL natural vegetation *' 1 = Use plantation growth curve (faster than natveg) towards LPJmL natural vegetation if(s32_aff_plantation = 0, - p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); + p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_secdforest_ac(t,j,ac,ag_pools); elseif s32_aff_plantation = 1, p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = p32_c_density_ac_fast_forestry(t,j,ac); ); *' Timber plantations carbon densities: -p32_carbon_density_ac(t,j,"plant",ac,ag_pools) = pm_carbon_density_ac_forestry(t,j,ac,ag_pools); +p32_carbon_density_ac(t,j,"plant",ac,ag_pools) = pm_carbon_density_ac_plantation(t,j,ac,ag_pools); *' NDC carbon densities are natveg carbon densities. -p32_carbon_density_ac(t,j,"ndc",ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); +p32_carbon_density_ac(t,j,"ndc",ac,ag_pools) = pm_carbon_density_secdforest_ac(t,j,ac,ag_pools); *' CDR from afforestation for each age-class, depending on planning horizon. p32_cdr_ac(t,j,ac)$(ord(ac) > 1 AND (ord(ac)-1) <= s32_planing_horizon/5) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index f6acc90adb..85b04e3ae2 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -45,12 +45,12 @@ q35_carbon_secdforest(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"secdforest",ag_pools,stockType) =e= - m_carbon_stock_ac(v35_secdforest,pm_carbon_density_ac,"ac","ac_sub"); + m_carbon_stock_ac(v35_secdforest,pm_carbon_density_secdforest_ac,"ac","ac_sub"); q35_carbon_other(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"other",ag_pools,stockType) =e= - m_carbon_stock_ac(v35_other,pm_carbon_density_ac,"ac","ac_sub") - + m_carbon_stock_ac(v35_youngsecdf,pm_carbon_density_ac,"ac","ac_sub"); + m_carbon_stock_ac(v35_other,pm_carbon_density_other_ac,"ac","ac_sub") + + m_carbon_stock_ac(v35_youngsecdf,pm_carbon_density_secdforest_ac,"ac","ac_sub"); *' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index db7069b2a9..1241264a18 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -119,7 +119,7 @@ s35_shift = m_timestep_length_forestry/5; *' exceeds a threshold of 20 tC/ha the respective area is shifted from young secondary *' forest, which is still considered other land, to secondary forest land. p35_maturesecdf(t,j,ac)$(not sameas(ac,"acx")) = - p35_youngsecdf(t,j,ac)$(pm_carbon_density_ac(t,j,ac,"vegc") > 20); + p35_youngsecdf(t,j,ac)$(pm_carbon_density_secdforest_ac(t,j,ac,"vegc") > 20); p35_youngsecdf(t,j,ac) = p35_youngsecdf(t,j,ac) - p35_maturesecdf(t,j,ac); p35_secdforest(t,j,ac) = p35_secdforest(t,j,ac) + p35_maturesecdf(t,j,ac); *' @stop @@ -222,14 +222,6 @@ p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= su * set conservation bound vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); -* ------------------------------ -* Calculate carbon density -* ------------------------------ - -* highest carbon density 1st time step to account for reshuffling -p35_carbon_density_secdforest(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); -p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools); - * ------------------ * NPI/NDC policy * ------------------ diff --git a/modules/52_carbon/normal_dec17/declarations.gms b/modules/52_carbon/normal_dec17/declarations.gms index f102773491..706f9a49e3 100644 --- a/modules/52_carbon/normal_dec17/declarations.gms +++ b/modules/52_carbon/normal_dec17/declarations.gms @@ -6,8 +6,9 @@ *** | Contact: magpie@pik-potsdam.de parameters - pm_carbon_density_ac(t_all,j,ac,ag_pools) Above ground natveg carbon density for age classes and carbon pools (tC per ha) - pm_carbon_density_ac_forestry(t_all,j,ac,ag_pools) Above ground plantation carbon density for age classes and carbon pools (tC per ha) + pm_carbon_density_secdforest_ac(t_all,j,ac,ag_pools) Above ground secondary forest carbon density for age classes and carbon pools (tC per ha) + pm_carbon_density_other_ac(t_all,j,ac,ag_pools) Above ground other land carbon density for age classes and carbon pools (tC per ha) + pm_carbon_density_ac_plantation(t_all,j,ac,ag_pools) Above ground plantation carbon density for age classes and carbon pools (tC per ha) pc52_carbon_density_start(t_all,j,ag_pools) Above ground carbon density for new land in other land pool (tC per ha) i52_land_carbon_sink(t_all,i) Land carbon sink adjustment factors from Grassi et al 2021 (GtCO2 per year) ; diff --git a/modules/52_carbon/normal_dec17/start.gms b/modules/52_carbon/normal_dec17/start.gms index 1668e36251..f724c19d47 100644 --- a/modules/52_carbon/normal_dec17/start.gms +++ b/modules/52_carbon/normal_dec17/start.gms @@ -9,19 +9,30 @@ pc52_carbon_density_start(t_all,j,"vegc") = 0; pc52_carbon_density_start(t_all,j,"litc") = fm_carbon_density(t_all,j,"past","litc"); -*** Forestry +* ---------------------------- +* Forestry +* ---------------------------- *calculate vegetation age-class carbon density in current time step with chapman richards equation -pm_carbon_density_ac_forestry(t_all,j,ac,"vegc") = m_growth_vegc(pc52_carbon_density_start(t_all,j,"vegc"),fm_carbon_density(t_all,j,"other","vegc"),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"k","plantations")),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"m","plantations")),(ord(ac)-1)); +pm_carbon_density_ac_plantation(t_all,j,ac,"vegc") = m_growth_vegc(pc52_carbon_density_start(t_all,j,"vegc"),fm_carbon_density(t_all,j,"secdforest","vegc"),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"k","plantations")),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"m","plantations")),(ord(ac)-1)); *calculate litter carbon density based on linear growth funktion: carbon_density(ac) = intercept + slope*ac (20 year time horizon taken from IPCC) -pm_carbon_density_ac_forestry(t_all,j,ac,"litc") = m_growth_litc_soilc(pc52_carbon_density_start(t_all,j,"litc"),fm_carbon_density(t_all,j,"other","litc"),(ord(ac)-1)); +pm_carbon_density_ac_plantation(t_all,j,ac,"litc") = m_growth_litc_soilc(pc52_carbon_density_start(t_all,j,"litc"),fm_carbon_density(t_all,j,"secdforest","litc"),(ord(ac)-1)); +* ----------------------------- +* Natveg +* ----------------------------- -*** Natveg +*** Secondary forest +*calculate vegetation age-class carbon density in current time step with chapman richards equation +pm_carbon_density_secdforest_ac(t_all,j,ac,"vegc") = m_growth_vegc(pc52_carbon_density_start(t_all,j,"vegc"),fm_carbon_density(t_all,j,"secdforest","vegc"),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"k","natveg")),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"m","natveg")),(ord(ac)-1)); + +*calculate litter carbon density based on linear growth funktion: carbon_density(ac) = intercept + slope*ac (20 year time horizon taken from IPCC) +pm_carbon_density_secdforest_ac(t_all,j,ac,"litc") = m_growth_litc_soilc(pc52_carbon_density_start(t_all,j,"litc"),fm_carbon_density(t_all,j,"secdforest","litc"),(ord(ac)-1)); +*** Other land *calculate vegetation age-class carbon density in current time step with chapman richards equation -pm_carbon_density_ac(t_all,j,ac,"vegc") = m_growth_vegc(pc52_carbon_density_start(t_all,j,"vegc"),fm_carbon_density(t_all,j,"other","vegc"),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"k","natveg")),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"m","natveg")),(ord(ac)-1)); +pm_carbon_density_other_ac(t_all,j,ac,"vegc") = m_growth_vegc(pc52_carbon_density_start(t_all,j,"vegc"),fm_carbon_density(t_all,j,"other","vegc"),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"k","natveg")),sum(clcl,pm_climate_class(j,clcl)*f52_growth_par(clcl,"m","natveg")),(ord(ac)-1)); *calculate litter carbon density based on linear growth funktion: carbon_density(ac) = intercept + slope*ac (20 year time horizon taken from IPCC) -pm_carbon_density_ac(t_all,j,ac,"litc") = m_growth_litc_soilc(pc52_carbon_density_start(t_all,j,"litc"),fm_carbon_density(t_all,j,"other","litc"),(ord(ac)-1)); +pm_carbon_density_other_ac(t_all,j,ac,"litc") = m_growth_litc_soilc(pc52_carbon_density_start(t_all,j,"litc"),fm_carbon_density(t_all,j,"other","litc"),(ord(ac)-1)); From 934ac394f502500d4e4126ef894e17931110432a Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 17 May 2024 10:31:05 +0200 Subject: [PATCH 172/259] food calorie supply innstead of iinstead of intake --- modules/15_food/anthro_iso_jun22/input.gms | 6 +++--- modules/15_food/anthropometrics_jan18/input.gms | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/15_food/anthro_iso_jun22/input.gms b/modules/15_food/anthro_iso_jun22/input.gms index 3e69a11af5..4aeb29ddcb 100644 --- a/modules/15_food/anthro_iso_jun22/input.gms +++ b/modules/15_food/anthro_iso_jun22/input.gms @@ -93,7 +93,7 @@ s15_exo_alcohol Exogenous alcohol target on (1) / 1 / s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 / s15_rum_share_fadeout_india_strong Switch for stronger ruminant fadeout in India (binary) / 1 / s15_milk_share_fadeout_india Switch for milk fadeout in India (binary) / 1 / -s15_kcal_pc_livestock_supply_target Target for livestock calorie supply (kcal per cap per day) / 430 / +s15_kcal_pc_livestock_supply_target Target for livestock food calorie supply (kcal per cap per day) / 430 / s15_livescen_target_subst Fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 / s15_food_subst_functional_form Switch for functional form of substitution fader (1) / 1 / s15_food_substitution_start Food substitution start year / 2025 / @@ -104,10 +104,10 @@ s15_alcohol_substitution Alcohol substitution share (1) / 0 / s15_livestock_substitution Livestock substitution share (1) / 0 / s15_rumdairy_substitution Ruminant meat and dairy substitution share (1) / 0 / s15_rumdairy_scp_substitution Ruminant meat and dairy substitution with SCP share (1) / 0 / -s15_livescen_target Switch for livestock intake target (1) / 0 / +s15_livescen_target Switch for livestock food calorie supply target (1) / 0 / s15_exo_foodscen_functional_form Switch for functional form of exogenous food scenario fader (1) / 1 / s15_exo_foodscen_start Food substitution start year / 2025 / -s15_exo_foodscen_target Food substitution target year / 2050 / +s15_exo_foodscen_target Food substitution target year / 2050 / s15_exo_foodscen_convergence Convergence to exogenous food scenario (1) / 1 / ; diff --git a/modules/15_food/anthropometrics_jan18/input.gms b/modules/15_food/anthropometrics_jan18/input.gms index a2039a3c44..0ad27443bc 100644 --- a/modules/15_food/anthropometrics_jan18/input.gms +++ b/modules/15_food/anthropometrics_jan18/input.gms @@ -72,9 +72,9 @@ s15_exo_diet Switch for transition towards exogeno s15_alc_scen Scenario target for the inclusion of alcohol in the EAT-Lancet diet (1) / 0 / s15_rum_share_fadeout_india_strong Switch for stronger ruminant fadeout in India (binary) / 1 / s15_milk_share_fadeout_india Switch for milk fadeout in India (binary) / 1 / -s15_kcal_pc_livestock_supply_target Target for livestock intake (kcal per cap per day) / 430 / +s15_kcal_pc_livestock_supply_target Target for livestock food calorie supply (kcal per cap per day) / 430 / s15_livescen_target_subst Fade-out of livestock products (0) or substitution of livestock products with plant-based products (1) / 1 / -s15_food_subst_functional_form Switch for functional form of substitution fader (1) / 1 / +s15_food_subst_functional_form Switch for functional form of substitution fader (1) / 1 / s15_food_substitution_start Food substitution start year / 2025 / s15_food_substitution_target Food substitution target year / 2050 / s15_ruminant_substitution Ruminant substitution share (1) / 0 / @@ -83,10 +83,10 @@ s15_alcohol_substitution Alcohol substitution share (1) / 0 / s15_livestock_substitution Livestock substitution share (1) / 0 / s15_rumdairy_substitution Ruminant meat and dairy substitution share (1) / 0 / s15_rumdairy_scp_substitution Ruminant meat and dairy substitution with SCP share (1) / 0 / -s15_livescen_target Switch for livestock intake target (1) / 0 / +s15_livescen_target Switch for livestock food calorie supply target (1) / 0 / s15_exo_foodscen_functional_form Switch for functional form of exogenous food scenario fader (1) / 1 / -s15_exo_foodscen_start Food substitution start year / 2025 / -s15_exo_foodscen_target Food substitution target year / 2050 / +s15_exo_foodscen_start Food substitution start year / 2025 / +s15_exo_foodscen_target Food substitution target year / 2050 / s15_exo_foodscen_convergence Convergence to exogenous food scenario (1) / 1 / ; From 5e68555e0c78d8cd57014947e3086c9eb4bccc9a Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 17 May 2024 11:25:30 +0200 Subject: [PATCH 173/259] fix --- config/scenario_config.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 2dabf54967..6b479b899a 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -11,7 +11,7 @@ gms$s15_rumdairy_scp_substitution;;;;0;0;0;0;0;0;0;0.5;0;0;;;;;;;0;;;;;;;;;;;;;; gms$s15_food_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_start;;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1; gms$s15_exo_foodscen_functional_form;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1; gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2020;2020;;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020; From 6f073dcbdbab1378b8cb05a969ae18812060bc71 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 17 May 2024 11:33:41 +0200 Subject: [PATCH 174/259] bugfix --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index 071c380685..f4ec0404f4 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -25,7 +25,7 @@ cfg$model <- "main.gms" #def = "main.gms" cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.105_h12_validation.tgz", - additional = "additional_data_rev4.48.tgz", + additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") # NOTE: It is recommended to recalibrate the model when changing cellular input data From 0bce4fbd8c7abd29f3eba0a1313651154b8b4b6a Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 13:09:55 +0200 Subject: [PATCH 175/259] Forestry Endo default for MAgPIE --- config/default.cfg | 28 ++++----- config/scenario_config.csv | 4 +- main.gms | 2 +- .../dynamic_may24/declarations.gms | 10 ---- modules/32_forestry/dynamic_may24/input.gms | 7 --- modules/32_forestry/dynamic_may24/preloop.gms | 57 +------------------ .../32_forestry/dynamic_may24/presolve.gms | 2 +- modules/32_forestry/input/files | 1 - modules/73_timber/default/preloop.gms | 2 +- modules/73_timber/default/presolve.gms | 2 +- 10 files changed, 19 insertions(+), 96 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index f4ec0404f4..0dd4b9ba3e 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -784,8 +784,8 @@ cfg$gms$c31_grassl_yld_scenario <- "cc" # def = "cc" cfg$gms$s31_limit_calib <- 1 # def = 1 # ***--------------------- 32_forestry ----------------------------------- -# * (dynamic_feb21): Dynamic forestry sector including afforestation with detailed age-classes -cfg$gms$forestry <- "dynamic_feb21" # def = dynamic_feb21 +# * (dynamic_may24): Dynamic forestry sector including afforestation with detailed age-classes +cfg$gms$forestry <- "dynamic_may24" # def = dynamic_may24 # * afforestation planing horizon (years) cfg$gms$s32_planing_horizon <- 50 # def = 50 @@ -866,16 +866,9 @@ cfg$gms$c32_tcre_ctrl <- "ann_TCREmean" # In addition, timber plantations are fixed to 1995 levels in the "off" case. # In other cases, age-classes in timber plantations are initialized based on # rotation length and can change dynamically over time. -# Note that this switch has no effect in the "static_sep16" realization, -# in which forestry area is assumed static. # * 0= off -# * 1= Equal distribution -# * 2= FAO distribution based on planted forest estimates 2006 -# * 3= Poulter distribution -# * 4= Manual distribution - Similar to equal distribution but higher weight on -# * younger age-classes as plantation areas increase strongly -# * in recent history (ca. >1990). -cfg$gms$s32_initial_distribution <- 0 # def = 0 +# * 1= Area is distributed equally to all age-classes within the rotation period +cfg$gms$s32_initial_distribution <- 1 # def = 1 # Switch fore regional or global interest rate for rotation length calculations. # Using the global setting would mean that the timber plantation decisions are @@ -915,7 +908,7 @@ cfg$gms$c32_incr_rate <- "h5s2l1" # def = "h5s2l1" # * such that the total plantation area remains constant. # * 2 = "Endogenous" scenario. Harvest from plantations including age-class shifting # * All plantations are harvested at rotation age. Plantation establishment is endogenous. -cfg$gms$s32_hvarea = 0 # def = 0 +cfg$gms$s32_hvarea = 2 # def = 2 # Type of rotation length selection criteria # * ("mean_annual_increment") = Harvesting when the average annual increment is maximum @@ -963,7 +956,7 @@ cfg$gms$c35_aolc_policy <- "npi" # def = "npi" # * (0): All secondary forest belongs to highest age class # * (1): Equal distribution of secondary forest in all age-classes # * (2): Distribution of secondary forest according to Poulter et al 2018 based on MODIS satellite data -cfg$gms$s35_secdf_distribution <- 0 # def = 0 +cfg$gms$s35_secdf_distribution <- 2 # def = 2 # Damages in natural forests # * (0): No damage simulated @@ -978,7 +971,7 @@ cfg$gms$s35_forest_damage_end <- 2050 #def = 2050 # * 0 = No timber production from natveg, no age-class shifting # * 1 = No timber production from natveg but with age-class shifting # * 2 = Timber production from natveg including age-class shifting -cfg$gms$s35_hvarea <- 0 # def = 0 +cfg$gms$s35_hvarea <- 2 # def = 2 # Generic forest shock scenarios. Disturbance sets percentage of all age classes back to 0 # * ("none") No disturbance applied @@ -1872,7 +1865,7 @@ cfg$gms$timber <- "default" # def = default # (implicitly assuming the same rate for plantation harvest and establishment). # * 1=on # * 0=off -cfg$gms$s73_timber_demand_switch <- 0 # def = 0 +cfg$gms$s73_timber_demand_switch <- 1 # def = 1 # Setting to define if the model should be forward looking or not in terms of # seeing the future demand for current timestep establishment of new plantations @@ -1882,7 +1875,10 @@ cfg$gms$s73_timber_demand_switch <- 0 # def = 0 # timber demand for establishment decisions. # * 1 = forward looking. Model sees future demand for establishment in current step # * 0 = myopic. Model sees current demand for establishment in current step -cfg$gms$s73_foresight <- 0 # def = 0 +cfg$gms$s73_foresight <- 1 # def = 1 + +# * Multiplier for timber demand used in historic period to obtain the same future demand in all scenarios +cfg$gms$s73_demand_multiplier_hist <- 1.2 # def = 1.2 # harvesting cost per ton of dry matter produced (USD/tDM) s73_timber_prod_cost <- 2000 # def = 2000 diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 8f86e20357..985d29edef 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -80,9 +80,9 @@ gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;; gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; +gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; diff --git a/main.gms b/main.gms index e4c5470725..bc8150e6bb 100644 --- a/main.gms +++ b/main.gms @@ -252,7 +252,7 @@ $setglobal ageclass feb21 $setglobal crop endo_apr21 $setglobal past endo_jun13 -$setglobal forestry dynamic_feb21 +$setglobal forestry dynamic_may24 $setglobal urban exo_nov21 $setglobal natveg dynamic_feb21 diff --git a/modules/32_forestry/dynamic_may24/declarations.gms b/modules/32_forestry/dynamic_may24/declarations.gms index be974ad32d..27cdb53d6d 100644 --- a/modules/32_forestry/dynamic_may24/declarations.gms +++ b/modules/32_forestry/dynamic_may24/declarations.gms @@ -20,12 +20,9 @@ parameters p32_carbon_density_ac(t,j,type32,ac,ag_pools) Carbon density for ac and ag_pools (tC per ha) p32_carbon_density_ac_forestry(t_all,j,ac) Above ground carbon density for age classes and carbon pools (tC per ha) p32_carbon_density_ac_marg(t_all,j,ac) Marginal above ground carbon density for age classes and carbon pools (tC per ha) - pc32_area_rotation(j) Forestry area at rotation length end used as weight for regional aggregation (mio. ha) p32_land(t,j,type32,ac) Forestry land for each cell wood type and age class before and after optimization (mio. ha) pc32_land(j,type32,ac) Forestry land per forestry land type initialization of the optimization (mio. ha) pc32_yield_forestry_future(j) Cellular timber yield expected in the future (m3 per ha per year) - pc32_yield_forestry_future_reg(i) Regional timber yield expected in the future (m3 per ha per year) - p32_plant_ini_ac(j) Initialization of plantation area (mio. ha) p32_IGR(t_all,j,ac) Instantaneous growth rate or periodic annual increment of forest growth (1) p32_rot_flg(t_all,j,ac) Identifier flag when calculating rotation length (1) p32_rotation_regional(t_all,i) Regional average rotation length of plantations translated to age class equivalent for future (1) @@ -48,13 +45,6 @@ parameters pm_representative_rotation(t_all,i) Representative regional rotation (1) p32_aff_bgp(j,ac) Biophysical impact of afforestation (tCeq per ha) p32_tcre_glo(j) Global mean Transient Climate Response to cumulative Emissions (degree C per tC per ha) - p32_observed_gs_reg(i) Observed growing stock (m3 per ha) - p32_gs_scaling_reg(i) Calibration factor for scaling up the relative growing stock (1) - p32_rotation_dist(j,ac) Poulter distribution within celular rotation lengths (1) - p32_updated_gs_reg(t,i) Updated growing stock information after calibration (m3 per ha) - p32_plantation_contribution(t_ext,i) Share of roundwood production coming from timber plantations (percent) - p32_ac_dist_flag(j,ac) Distribution flag with inverse weights according to age-classes (1) - p32_ac_dist(j,ac) Actual share of age-class distribution (1) p32_avg_increment(t_all,j,ac) Mean annual increment (tC per ha per year) p32_bii_coeff(type32,bii_class_secd,potnatveg) bii coeff (1) p32_disturbance_loss_ftype32(t,j,type32,ac) Loss due to disturbances in all plantation type forests (mio. ha) diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index 89ac88ac42..bce4187eb0 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -90,13 +90,6 @@ $include "./modules/32_forestry/input/f32_localTCRE.cs3" $ondelim ; -parameter f32_ac_dist(ac) Age class distribution share (1) -/ -$ondelim -$include "./modules/32_forestry/input/f32_ac_dist.csv" -$offdelim -/; - parameter f32_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) / $ondelim diff --git a/modules/32_forestry/dynamic_may24/preloop.gms b/modules/32_forestry/dynamic_may24/preloop.gms index 2f944fb313..db516cf8af 100644 --- a/modules/32_forestry/dynamic_may24/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -155,64 +155,9 @@ if(s32_initial_distribution = 0, elseif s32_initial_distribution = 1, ** Initialize with equal distribution among rotation age classes ** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j); + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1- f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); -elseif s32_initial_distribution = 2, -** Initialize with distribution based on FAO data (but this distribution is applied to all cells globally) -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * f32_ac_dist(ac); - p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * f32_ac_dist(ac); - -elseif s32_initial_distribution = 3, -** Initialize with Poulter distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); - p32_rotation_dist(j,ac) = (im_plantedclass_ac(j,ac)$(ini32(j,ac))/sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2))))$(sum(ac2,im_plantedclass_ac(j,ac2)$(ini32(j,ac2)))); - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = p32_plant_ini_ac(j) * p32_rotation_dist(j,ac); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_rotation_dist(j,ac); - -*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell - loop (j, - if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - ); - ); - -elseif s32_initial_distribution = 4, -** Initialize with Manual distribution among rotation age classes -** Plantated forest area is divided into ndcs (other planted forest) and plantations - loop(j, -** Set all acs to 0 - p32_ac_dist_flag(j,ac) = 0; -** Calculate reverse of age-classes, if rotation is 11acs, then ac0 should get a value of 11, 11th ac should get value of 1 - p32_ac_dist_flag(j,ac) = (10*p32_rotation_cellular_harvesting("y1995",j)-((ord(ac)-1))*5)$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); -** Calculate the weights, youngest age-class will have highest weight - p32_ac_dist(j,ac) = (p32_ac_dist_flag(j,ac) / (sum(ac2,p32_ac_dist_flag(j,ac2)) + ord(ac)))$(ord(ac) <= p32_rotation_cellular_harvesting("y1995",j)); -** there can be isntances where this distribution is not summing up to 1, in that case we take the excess and remove it evenly from all age-classes -** In case the sum of distribution is > 1 : Remove the excess from ac0 - p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))>1) = p32_ac_dist(j,"ac0") - (sum(ac2, p32_ac_dist(j,ac2))-1); -** In case the sum of distribution is < 1 : Add the shortage to ac0 - p32_ac_dist(j,"ac0")$(sum(ac2, p32_ac_dist(j,ac2))<1) = p32_ac_dist(j,"ac0") + (1-sum(ac2, p32_ac_dist(j,ac2))); - ); -** Isolate plantations from planted forest (forestry) - p32_plant_ini_ac(j) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i)); -** Divide plantations according to distribution - p32_land_start_ac(j,"plant",ac) = p32_plant_ini_ac(j) * p32_ac_dist(j,ac); -** Divide NDCs according to same distribution - p32_land_start_ac(j,"ndc",ac) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i)) * p32_ac_dist(j,ac); - -*use residual approach to avoid distributional errors i.e., poulter set with no plantations but luh reporting plantations in a cell - loop (j, - if(sum(ac,p32_land_start_ac(j,"plant",ac)$(ini32(j,ac))) = 0, - p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - p32_land_start_ac(j,"ndc",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),1-f32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); - ); - ); - ); ** Redistribute to youngest age class in case the distribution to plantations and diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 4e650e90ac..d7a92d6327 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -118,7 +118,7 @@ elseif s32_hvarea = 2, ** Fix timber plantations until the end of the rotation. "ac.off" identical to "ord(ac)-1". ** The offset is needed because the first element of ac is ac0, which is not included in p32_rotation_cellular_harvesting. v32_land.fx(j,"plant",ac)$(ac.off < p32_rotation_cellular_harvesting(t,j)) = pc32_land(j,"plant",ac); -** After the rotation period, plantations are free for harvesting +** After the rotation period, all plantations are harvested. v32_land.fx(j,"plant",ac)$(ac.off >= p32_rotation_cellular_harvesting(t,j)) = 0; s32_establishment_static = 0; s32_establishment_dynamic = 1; diff --git a/modules/32_forestry/input/files b/modules/32_forestry/input/files index 64bb96e008..1a0959d8ae 100644 --- a/modules/32_forestry/input/files +++ b/modules/32_forestry/input/files @@ -6,6 +6,5 @@ npi_ndc_aff_pol.cs3 f32_plant_prod_share.csv f32_bph_effect_noTCRE.cs3 f32_localTCRE.cs3 -f32_ac_dist.csv f32_plantedforest.cs4 f32_forest_shock.csv diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index 4b1e5b8157..f9d5c41e16 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -95,4 +95,4 @@ im_timber_prod_cost("wood") = s73_timber_prod_cost_wood; im_timber_prod_cost("woodfuel") = s73_timber_prod_cost_woodfuel; * initialize values for presolve of other modules -pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_foresight_multiplier_hist; +pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_demand_multiplier_hist; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index c5709043ea..4cca5213d3 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -11,7 +11,7 @@ if(s73_foresight=1, if(m_year(t) <= sm_fix_SSP2, - pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_foresight_multiplier_hist; + pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_demand_multiplier_hist; else pm_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_ext(t_ext,i,kforestry)); ); From 700e2d3c2922bd2b38523a053f1e06a9554b3ea7 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 17 May 2024 13:26:20 +0200 Subject: [PATCH 176/259] sorted the scenario_config by module number once again --- config/scenario_config.csv | 40 +++++++++++++++++++------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 8f86e20357..b55fd5ab04 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,9 +1,11 @@ ;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;EL2_default;EL2_lessSus;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SDP;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high +gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; @@ -33,6 +35,7 @@ gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;0;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$s15_alc_scen;0.014;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;;;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; @@ -40,7 +43,11 @@ gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;a gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;;;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; +gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;0;1;;;;;;;;;;;;;;;;;;;;;;;;; gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;;;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; @@ -51,11 +58,17 @@ gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;; gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; +gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; +gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; +gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; +gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; +gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;;;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;;;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;;;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; @@ -67,6 +80,7 @@ gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;; gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;none;none;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;;;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 @@ -79,26 +93,12 @@ gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;; gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; -gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; -gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; -gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; -gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.105_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; +gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; -magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;SSP2EU-DSPkB500-DS_betax.mif;SSP2EU-DSPkB500-DS_betax.mif;SSP2EU-DSPkB500-DS_betax.mif;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high -gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 -gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen -gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 -gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 -gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 -gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 -gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 +gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.105_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;;;;;;;;;;;;;;;;;;;;;;;;; From e590de838ba26ec0491569909fb19a16a440759d Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 17 May 2024 13:55:36 +0200 Subject: [PATCH 177/259] reverted renaming of forestry and natveg module --- .../dynamic_feb21/declarations.gms | 2 +- .../32_forestry/dynamic_feb21/equations.gms | 22 +++++------ .../32_forestry/dynamic_feb21/presolve.gms | 16 ++++---- modules/35_natveg/pot_forest_may24/input.gms | 2 +- .../35_natveg/pot_forest_may24/presolve.gms | 38 ++++++++++--------- modules/52_carbon/normal_dec17/input.gms | 2 +- 6 files changed, 42 insertions(+), 40 deletions(-) diff --git a/modules/32_forestry/dynamic_feb21/declarations.gms b/modules/32_forestry/dynamic_feb21/declarations.gms index 199e78df99..4b70b2d3ce 100644 --- a/modules/32_forestry/dynamic_feb21/declarations.gms +++ b/modules/32_forestry/dynamic_feb21/declarations.gms @@ -14,7 +14,7 @@ parameters i32_max_aff_area_glo(t) Maximum global endogenous afforestation area (mio. ha) i32_max_aff_area_reg(t,i) Maximum regional endogenous afforestation area (mio. ha) p32_aff_pol(t,j) NDC forest stock (mio. ha) - p32_aff_pol_timestep(t,j) NDC afforestation per time step (mio. ha) + pm_aff_pol_timestep(t,j) NDC afforestation per time step (mio. ha) p32_aff_pot(t,j) Potential afforestation area (mio. ha) p32_aff_togo(t,i) Remaining exogenous afforestation wrt to the maximum exogenous target over time (mio. ha) p32_carbon_density_ac(t,j,type32,ac,ag_pools) Carbon density for ac and ag_pools (tC per ha) diff --git a/modules/32_forestry/dynamic_feb21/equations.gms b/modules/32_forestry/dynamic_feb21/equations.gms index 259fdc7206..3a1cbee0a6 100644 --- a/modules/32_forestry/dynamic_feb21/equations.gms +++ b/modules/32_forestry/dynamic_feb21/equations.gms @@ -68,19 +68,19 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( *' The constraint `q32_aff_pol` accounts for the exogenous afforestation prescribed by NPI/NDC policies. q32_aff_pol(j2) .. - sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, p32_aff_pol_timestep(ct,j2)); + sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, pm_aff_pol_timestep(ct,j2)); -*' The constraint `q32_max_aff` accounts for the allowed maximum global endogenous -*' afforestation defined in `i32_max_aff_area_glo`. -*' The constraint `q32_max_aff_reg` accounts for the allowed maximum regional endogenous -*' afforestation defined in `i32_max_aff_area_reg`. +*' The constraint `q32_max_aff` accounts for the allowed maximum global endogenous +*' afforestation defined in `i32_max_aff_area_glo`. +*' The constraint `q32_max_aff_reg` accounts for the allowed maximum regional endogenous +*' afforestation defined in `i32_max_aff_area_reg`. *' Only one of the two constraints is active, depending on `s32_max_aff_area_glo`. - q32_max_aff$(s32_max_aff_area_glo=1) .. + q32_max_aff$(s32_max_aff_area_glo=1) .. sum((j2,ac), v32_land(j2,"aff",ac)) =l= sum(ct, i32_max_aff_area_glo(ct)); - q32_max_aff_reg(i2)$(s32_max_aff_area_glo=0) .. + q32_max_aff_reg(i2)$(s32_max_aff_area_glo=0) .. sum((cell(i2,j2),ac), v32_land(j2,"aff",ac)) =l= sum(ct, i32_max_aff_area_reg(ct,i2)); @@ -100,7 +100,7 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( + sum(ac_sub, v32_land_reduction(j2,type32,ac_sub))); q32_land_expansion(j2,type32) .. - v32_land_expansion(j2,type32) =e= + v32_land_expansion(j2,type32) =e= sum(ac_est, v32_land(j2,type32,ac_est)); q32_land_reduction(j2,type32,ac_sub) .. @@ -112,17 +112,17 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( q32_bv_aff(j2,potnatveg) .. vm_bv(j2,"aff_co2p",potnatveg) =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"aff",ac)) * + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"aff",ac)) * p32_bii_coeff("aff",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); q32_bv_ndc(j2,potnatveg) .. vm_bv(j2,"aff_ndc",potnatveg) =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"ndc",ac)) * + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"ndc",ac)) * p32_bii_coeff("ndc",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); q32_bv_plant(j2,potnatveg) .. vm_bv(j2,"plant",potnatveg) =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"plant",ac)) * + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v32_land(j2,"plant",ac)) * p32_bii_coeff("plant",bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 95eb43a470..90442e4c4a 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -18,18 +18,16 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; ** START ndc ** * calc NPI/NDC afforestation per time step based on forest stock change - p32_aff_pol_timestep("y1995",j) = 0; - p32_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); + pm_aff_pol_timestep("y1995",j) = 0; + pm_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); - p32_aff_pot(t,j)$(p32_aff_pot(t,j) > (fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)))) - = (fm_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest))); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; -* Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available - p32_aff_pol_timestep(t,j)$(p32_aff_pol_timestep(t,j) > p32_aff_pot(t,j)) = p32_aff_pot(t,j); +* Limit prescribed NPI/NDC afforestation in `pm_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available + pm_aff_pol_timestep(t,j)$(pm_aff_pol_timestep(t,j) > p32_aff_pot(t,j)) = p32_aff_pot(t,j); ** END ndc ** *' @code @@ -180,8 +178,8 @@ p32_updated_gs_reg(t,i) = 1; p32_updated_gs_reg(t,i)$(sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))>0) = (sum((cell(i,j),ac_sub),(pm_timber_yield(t,j,ac_sub,"forestry") / sm_wood_density) * p32_land(t,j,"plant",ac_sub))/ sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))); * Avoid conflict between afforestation for carbon uptake on land and secdforest restoration -pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) - = pm_land_conservation(t,j,"secdforest","restore") - (sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)); -pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") <= sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)) = 0; +pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ pm_aff_pol_timestep(t,j)) + = pm_land_conservation(t,j,"secdforest","restore") - (sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + pm_aff_pol_timestep(t,j)); +pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") <= sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + pm_aff_pol_timestep(t,j)) = 0; *** EOF presolve.gms *** diff --git a/modules/35_natveg/pot_forest_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms index 276c47c2f8..c87fba9da7 100644 --- a/modules/35_natveg/pot_forest_may24/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -55,7 +55,7 @@ $include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" $offdelim /; -parameter fm_pot_forest_area(j) Potential forest area (mio. ha) +parameter f35_pot_forest_area(j) Potential forest area (mio. ha) / $ondelim $include "./modules/35_natveg/input/pot_forest_area.cs3" diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 1241264a18..e842a6b944 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -57,27 +57,31 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for potential forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -p35_max_forest_est(j) = fm_pot_forest_area(j) +p35_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)) - sum(ac_sub, pc35_youngsecdf(j,ac_sub)); p35_max_forest_est(j)$(p35_max_forest_est(j) < 0) = 0; -* -------------------------------------- -* Secondary forest recovery -* -------------------------------------- +* ------------------------------------------------- +* Calculate area of secondary forest recovery +* ------------------------------------------------- * Distribute forestry abandonement pc35_youngsecdf(j,ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); -pc35_youngsecdf(j,ac_est)$(p35_max_forest_est(j) p35_max_forest_est(j)) = p35_max_forest_est(j)/card(ac_est2); p35_max_forest_est(j) = p35_max_forest_est(j) - sum(ac_est, pc35_youngsecdf(j,ac_est)); -* Forest recovery is distributed proportionally based on the remaining -* potential forest share in each cluster. -p35_forest_recovery_shr(j) = p35_max_forest_est(j) / (sum(land_ag, pcm_land(j,land_ag)) + pcm_land(j,"urban")); +* Consider NDC/NPI re/afforesation in current time step +pm_aff_pol_timestep(t,j)$(pm_aff_pol_timestep(t,j) > p35_max_forest_est(j)) = p35_max_forest_est(j); +p35_max_forest_est(j) = p35_max_forest_est(j) - pm_aff_pol_timestep(t,j); + +* The proportion of secondary forest recovery in total natveg recovery is derived +* from the remaining potential area for forest establishment +p35_forest_recovery_shr(j) = p35_max_forest_est(j) / (sum(land_ag, pcm_land(j,land_ag)) + pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; * Abandoned land pc35_other(j,ac_est) is then distributed propotionally using the forest recovery share. p35_recovered_forest(t,j,ac_est) = pc35_other(j,ac_est) * p35_forest_recovery_shr(j); -p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est)) > p35_max_forest_est(j)) = p35_max_forest_est(j)/card(ac_est2); +p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est2)) > p35_max_forest_est(j)) = p35_max_forest_est(j)/card(ac_est2); pc35_other(j,ac_est) = pc35_other(j,ac_est) - p35_recovered_forest(t,j,ac_est); pc35_youngsecdf(j,ac_est) = pc35_youngsecdf(j,ac_est) + p35_recovered_forest(t,j,ac_est); @@ -176,11 +180,11 @@ v35_secdforest.lo(j,ac_sub) = max((1-s35_natveg_harvest_shr) * pc35_secdforest(j ); * upper bound v35_secdforest.up(j,ac_sub) = pc35_secdforest(j,ac_sub); -m_boundfix(v35_secdforest,(j,ac_sub),l,10e-5); +m_boundfix(v35_secdforest,(j,ac_sub),l,1e-6); * Secondary forest conservation * protection bound fix -pm_land_conservation(t,j,"secdforest","protect")$(abs(pm_land_conservation(t,j,"secdforest","protect") - sum(ac_sub, pc35_secdforest(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_secdforest(j,ac_sub)); +pm_land_conservation(t,j,"secdforest","protect")$(abs(pm_land_conservation(t,j,"secdforest","protect") - sum(ac_sub, pc35_secdforest(j,ac_sub))) < 1e-6) = sum(ac_sub, pc35_secdforest(j,ac_sub)); * set restoration target p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","restore"); * Do not restore secdforest in areas where total natural @@ -196,7 +200,6 @@ pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other"," * Substract forest restoration area from secondary forest recovery potential p35_max_forest_est(j) = p35_max_forest_est(j) - p35_land_restoration(j,"secdforest"); - * set conservation bound vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); @@ -207,13 +210,14 @@ v35_other.lo(j,ac) = 0; v35_other.up(j,ac) = Inf; *set upper bound v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); +m_boundfix(v35_other,(j,ac_sub),l,1e-6); v35_youngsecdf.up(j,ac_sub) = pc35_youngsecdf(j,ac_sub); +m_boundfix(v35_youngsecdf,(j,ac_sub),l,1e-6); v35_youngsecdf.fx(j,ac_est) = 0; -m_boundfix(v35_other,(j,ac_sub),l,10e-5); * Other land conservation * protection bound fix -pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 10e-5) = sum(ac_sub, pc35_other(j,ac_sub)); +pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 1e-6) = sum(ac_sub, pc35_other(j,ac_sub)); * set restoration target p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * Do not restore other land in areas where total natural @@ -222,9 +226,9 @@ p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= su * set conservation bound vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); -* ------------------ -* NPI/NDC policy -* ------------------ +* ---------------------------- +* NPI/NDC protection policy +* ---------------------------- p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); diff --git a/modules/52_carbon/normal_dec17/input.gms b/modules/52_carbon/normal_dec17/input.gms index 7aa7a75499..16cb94a19e 100644 --- a/modules/52_carbon/normal_dec17/input.gms +++ b/modules/52_carbon/normal_dec17/input.gms @@ -27,7 +27,7 @@ m_fillmissingyears(fm_carbon_density,"j,land,c_pools"); * forest area is zero, use the carbon density of other land instead. * This affects areas, where the land use intialisation reports some * forest, although the forest potential is zero. Forest expansion in -* these cells is constrained by fm_pot_forest_area. +* these cells is constrained by f35_pot_forest_area. fm_carbon_density(t_all,j,land_forest,c_pools)$(fm_carbon_density(t_all,j,land_forest,c_pools) = 0) = fm_carbon_density(t_all,j,"other",c_pools); * Fix urban area soilc to natural land soilc as long as preprocessed From c54730264a86e004478bc84312f9f26f2ac5047f Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 13:58:11 +0200 Subject: [PATCH 178/259] clean-up --- CHANGELOG.md | 4 +++- .../managementcalib_aug19/declarations.gms | 1 - .../managementcalib_aug19/preloop.gms | 9 ------- modules/21_trade/exo/declarations.gms | 11 ++------- modules/21_trade/exo/equations.gms | 9 +------ modules/21_trade/exo/input.gms | 4 ---- modules/21_trade/exo/postsolve.gms | 24 +++++++------------ modules/21_trade/exo/preloop.gms | 7 +----- modules/21_trade/free_apr16/declarations.gms | 1 - modules/21_trade/free_apr16/preloop.gms | 5 ---- modules/21_trade/off/declarations.gms | 4 ---- modules/21_trade/off/preloop.gms | 4 ---- .../selfsuff_reduced/declarations.gms | 1 - modules/21_trade/selfsuff_reduced/preloop.gms | 5 ---- .../declarations.gms | 1 - .../selfsuff_reduced_bilateral22/preloop.gms | 5 ---- modules/73_timber/default/presolve.gms | 3 +++ 17 files changed, 18 insertions(+), 80 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dcc35db1a..4f9b236685 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,11 +9,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### changed - **22_land_conservation and default.cfg** Added options for baseline protection - **15_food, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying food substitution scenarios and exogeneous food intake scenarios -- **70_livestock, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios +- **70_livestock** default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios - **default.cfg** update additional data to rev4.50 - **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` - **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. - **scripts** start/test_runs.R added 2 more test runs from FSEC +- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24` +- **default.cfg** ForestryEndo as default setting ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` diff --git a/modules/14_yields/managementcalib_aug19/declarations.gms b/modules/14_yields/managementcalib_aug19/declarations.gms index 68eaecbcaf..cb84ddfbbd 100644 --- a/modules/14_yields/managementcalib_aug19/declarations.gms +++ b/modules/14_yields/managementcalib_aug19/declarations.gms @@ -17,7 +17,6 @@ parameters p14_growing_stock(t,j,ac,forest_land,forest_type) Forest growing stock (tDM per ha per yr) pm_timber_yield(t,j,ac,forest_land) Forest growing stock (tDM per ha per yr) p14_growing_stock_initial(j,ac,forest_land,forest_type) Initial Forest growing stock (tDM per ha per yr) - pm_timber_yield_initial(j,ac,forest_land) Initial Forest yield (tDM per ha per yr) pm_yields_semi_calib(j,kve,w) Potential yields calibrated to FAO regional levels (tDM per ha per yr) i14_calib_yields_hist(i,w) Calibrated yields average over region and crop type at the historical reference year (tDM per ha per yr) i14_calib_yields_ratio(i) Irrigated to rainfed yield ratio for calibrated yields (1) diff --git a/modules/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index a23737fd6e..9cac1c64cf 100644 --- a/modules/14_yields/managementcalib_aug19/preloop.gms +++ b/modules/14_yields/managementcalib_aug19/preloop.gms @@ -209,12 +209,3 @@ p14_growing_stock_initial(j,ac,land_natveg,"natveg") = **** Hard constraint to always have a positive number in p14_growing_stock p14_growing_stock_initial(j,ac,land_natveg,"natveg") = p14_growing_stock_initial(j,ac,land_natveg,"natveg")$(p14_growing_stock_initial(j,ac,land_natveg,"natveg")>0)+0.0001$(p14_growing_stock_initial(j,ac,land_natveg,"natveg")=0); p14_growing_stock_initial(j,ac,"forestry","plantations") = p14_growing_stock_initial(j,ac,"forestry","plantations")$(p14_growing_stock_initial(j,ac,"forestry","plantations")>0)+0.0001$(p14_growing_stock_initial(j,ac,"forestry","plantations")=0); - -** Used in equations -*************************************************************** -** If the plantation yield switch is on, forestry yields are treated as plantation yields -pm_timber_yield_initial(j,ac,"forestry")$(s14_timber_plantation_yield = 1) = p14_growing_stock_initial(j,ac,"forestry","plantations") ; -** If the plantation yield switch is off, then the forestry yields are given the same values as secdforest yields, -pm_timber_yield_initial(j,ac,"forestry")$(s14_timber_plantation_yield = 0) = pm_timber_yield_initial(j,ac,"secdforest"); -** Natveg yields are unchanged and do not depend on plantation yield switch -pm_timber_yield_initial(j,ac,land_natveg) = p14_growing_stock_initial(j,ac,land_natveg,"natveg"); diff --git a/modules/21_trade/exo/declarations.gms b/modules/21_trade/exo/declarations.gms index 43eec6aa8c..67b0151950 100644 --- a/modules/21_trade/exo/declarations.gms +++ b/modules/21_trade/exo/declarations.gms @@ -5,24 +5,17 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -parameters -pm_selfsuff_ext(t_ext,h,kforestry) Self sufficiency for timber products in extended time frame (1) -; positive variables vm_cost_trade(i) Regional trade costs (mio. USD05MER per yr) - v21_manna_from_heaven(h,kall) Last resort resource for otherwise infeasible trade balance constraints (mio. tDM per yr) ; equations q21_notrade(h,kall) Superregional production constraint of non-tradable commodities (mio. tDM per yr) - q21_cost_trade(h) Superregional trade costs (mio. USD05MER per yr) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters - ov_cost_trade(t,i,type) Regional trade costs (mio. USD05MER per yr) - ov21_manna_from_heaven(t,h,kall,type) Last resort resource for otherwise infeasible trade balance constraints (mio. tDM per yr) - oq21_notrade(t,h,kall,type) Superregional production constraint of non-tradable commodities (mio. tDM per yr) - oq21_cost_trade(t,h,type) Superregional trade costs (mio. USD05MER per yr) + ov_cost_trade(t,i,type) Regional trade costs (mio. USD05MER per yr) + oq21_notrade(t,h,kall,type) Superregional production constraint of non-tradable commodities (mio. tDM per yr) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/21_trade/exo/equations.gms b/modules/21_trade/exo/equations.gms index 22a59aeb61..c463ace64c 100644 --- a/modules/21_trade/exo/equations.gms +++ b/modules/21_trade/exo/equations.gms @@ -7,7 +7,7 @@ q21_notrade(h2,kall).. sum(supreg(h2,i2),vm_prod_reg(i2,kall)) =g= sum(supreg(h2,i2), vm_supply(i2,kall)) - + sum(ct,f21_trade_balance(ct,h2,kall)) - v21_manna_from_heaven(h2,kall); + + sum(ct,f21_trade_balance(ct,h2,kall)); *' The regional production must be bigger than the regional demand plus exports @@ -17,10 +17,3 @@ q21_notrade(h2,kall).. *' trade balance conditions `v21_manna_from_heaven` is introduced. It is an *' unlimited, but heavily expensive resource which can be used as last resort, *' if in any other case the model would become infeasible. - -q21_cost_trade(h2).. sum(supreg(h2,i2),vm_cost_trade(i2)) =e= - 10**6 * sum(kall,v21_manna_from_heaven(h2,kall)); - -*' After each run trade costs `vm_cost_trade` as well as `v21_manna_from_heaven` -*' should be checked for non-zero values as these will indicate inconsistencies -*' between model simulation and exogenously provided trade balances. diff --git a/modules/21_trade/exo/input.gms b/modules/21_trade/exo/input.gms index d79312c2cf..70be889924 100644 --- a/modules/21_trade/exo/input.gms +++ b/modules/21_trade/exo/input.gms @@ -5,10 +5,6 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -scalars - s21_manna_from_heaven v21_manna_from_heaven fixed to zero (0) or available at high cost (1) (binary) / 0 / -; - table f21_trade_balance(t_all,h,kall) trade balance of positive exports and negative imports (mio. tDM per yr) $ondelim $include "./modules/21_trade/input/f21_trade_balance.cs3" diff --git a/modules/21_trade/exo/postsolve.gms b/modules/21_trade/exo/postsolve.gms index 38495b7f8e..78358260dc 100644 --- a/modules/21_trade/exo/postsolve.gms +++ b/modules/21_trade/exo/postsolve.gms @@ -7,20 +7,12 @@ *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### - ov_cost_trade(t,i,"marginal") = vm_cost_trade.m(i); - ov21_manna_from_heaven(t,h,kall,"marginal") = v21_manna_from_heaven.m(h,kall); - oq21_notrade(t,h,kall,"marginal") = q21_notrade.m(h,kall); - oq21_cost_trade(t,h,"marginal") = q21_cost_trade.m(h); - ov_cost_trade(t,i,"level") = vm_cost_trade.l(i); - ov21_manna_from_heaven(t,h,kall,"level") = v21_manna_from_heaven.l(h,kall); - oq21_notrade(t,h,kall,"level") = q21_notrade.l(h,kall); - oq21_cost_trade(t,h,"level") = q21_cost_trade.l(h); - ov_cost_trade(t,i,"upper") = vm_cost_trade.up(i); - ov21_manna_from_heaven(t,h,kall,"upper") = v21_manna_from_heaven.up(h,kall); - oq21_notrade(t,h,kall,"upper") = q21_notrade.up(h,kall); - oq21_cost_trade(t,h,"upper") = q21_cost_trade.up(h); - ov_cost_trade(t,i,"lower") = vm_cost_trade.lo(i); - ov21_manna_from_heaven(t,h,kall,"lower") = v21_manna_from_heaven.lo(h,kall); - oq21_notrade(t,h,kall,"lower") = q21_notrade.lo(h,kall); - oq21_cost_trade(t,h,"lower") = q21_cost_trade.lo(h); + ov_cost_trade(t,i,"marginal") = vm_cost_trade.m(i); + oq21_notrade(t,h,kall,"marginal") = q21_notrade.m(h,kall); + ov_cost_trade(t,i,"level") = vm_cost_trade.l(i); + oq21_notrade(t,h,kall,"level") = q21_notrade.l(h,kall); + ov_cost_trade(t,i,"upper") = vm_cost_trade.up(i); + oq21_notrade(t,h,kall,"upper") = q21_notrade.up(h,kall); + ov_cost_trade(t,i,"lower") = vm_cost_trade.lo(i); + oq21_notrade(t,h,kall,"lower") = q21_notrade.lo(h,kall); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/21_trade/exo/preloop.gms b/modules/21_trade/exo/preloop.gms index 81d5fcb68e..88e0dbf793 100644 --- a/modules/21_trade/exo/preloop.gms +++ b/modules/21_trade/exo/preloop.gms @@ -5,9 +5,4 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -** Save self sufficiency values as a interface parameter needed in forestry module -pm_selfsuff_ext(t_ext,h,kforestry) = f21_self_suff("y2150",h,kforestry); -pm_selfsuff_ext(t_all,h,kforestry) = f21_self_suff(t_all,h,kforestry); - -** fix to zero by default -v21_manna_from_heaven.fx(h,kall)$(s21_manna_from_heaven = 0) = 0; +vm_cost_trade.fx(i) = 0; diff --git a/modules/21_trade/free_apr16/declarations.gms b/modules/21_trade/free_apr16/declarations.gms index f93d7f3b8b..811b4f5676 100644 --- a/modules/21_trade/free_apr16/declarations.gms +++ b/modules/21_trade/free_apr16/declarations.gms @@ -9,7 +9,6 @@ parameters i21_trade_bal_reduction(t_all,k_trade) Trade balance reduction (1) i21_trade_margin(h,k_trade) Trade margins (USD05MER per tDM) i21_trade_tariff(h,k_trade) Trade tariffs (USD05MER per tDM) - pm_selfsuff_ext(t_ext,h,kforestry) Self sufficiency for timber products in extended time frame (1) ; positive variables diff --git a/modules/21_trade/free_apr16/preloop.gms b/modules/21_trade/free_apr16/preloop.gms index bfc429a3eb..11b775455d 100644 --- a/modules/21_trade/free_apr16/preloop.gms +++ b/modules/21_trade/free_apr16/preloop.gms @@ -5,10 +5,5 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de - - *set vm_cost_trade zero in order to avoid a free variable vm_cost_trade.fx(i) = 0; - -pm_selfsuff_ext(t_ext,h,kforestry) = f21_self_suff("y2150",h,kforestry); -pm_selfsuff_ext(t_all,h,kforestry) = f21_self_suff(t_all,h,kforestry); diff --git a/modules/21_trade/off/declarations.gms b/modules/21_trade/off/declarations.gms index f4eb5cb097..5488673ee2 100644 --- a/modules/21_trade/off/declarations.gms +++ b/modules/21_trade/off/declarations.gms @@ -5,10 +5,6 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -parameters -pm_selfsuff_ext(t_ext,h,kforestry) Self sufficiency for timber products in extended time frame (1) -; - positive variables vm_cost_trade(i) Regional trade costs (mio. USD05MER per yr) ; diff --git a/modules/21_trade/off/preloop.gms b/modules/21_trade/off/preloop.gms index 0441d70f3d..11b775455d 100644 --- a/modules/21_trade/off/preloop.gms +++ b/modules/21_trade/off/preloop.gms @@ -5,9 +5,5 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -** Save self sufficiency values as a interface parameter needed in forestry module -pm_selfsuff_ext(t_ext,h,kforestry) = f21_self_suff("y2150",h,kforestry); -pm_selfsuff_ext(t_all,h,kforestry) = f21_self_suff(t_all,h,kforestry); - *set vm_cost_trade zero in order to avoid a free variable vm_cost_trade.fx(i) = 0; diff --git a/modules/21_trade/selfsuff_reduced/declarations.gms b/modules/21_trade/selfsuff_reduced/declarations.gms index f6ccffef43..59bc20b4d9 100644 --- a/modules/21_trade/selfsuff_reduced/declarations.gms +++ b/modules/21_trade/selfsuff_reduced/declarations.gms @@ -9,7 +9,6 @@ parameters i21_trade_bal_reduction(t_all,k_trade) Trade balance reduction (1) i21_trade_margin(h,k_trade) Trade margins (USD05MER per tDM) i21_trade_tariff(h,k_trade) Trade tariffs (USD05MER per tDM) - pm_selfsuff_ext(t_ext,h,kforestry) Self sufficiency for timber products in extended time frame (1) ; positive variables diff --git a/modules/21_trade/selfsuff_reduced/preloop.gms b/modules/21_trade/selfsuff_reduced/preloop.gms index ff5c35c5a2..7a04513e1b 100644 --- a/modules/21_trade/selfsuff_reduced/preloop.gms +++ b/modules/21_trade/selfsuff_reduced/preloop.gms @@ -19,11 +19,6 @@ elseif (s21_trade_tariff=0), i21_trade_margin(h,"wood")$(i21_trade_margin(h,"wood") < s21_min_trade_margin_forestry) = s21_min_trade_margin_forestry; i21_trade_margin(h,"woodfuel")$(i21_trade_margin(h,"woodfuel") < s21_min_trade_margin_forestry) = s21_min_trade_margin_forestry; -pm_selfsuff_ext(t_ext,h,kforestry) = f21_self_suff("y2150",h,kforestry); -pm_selfsuff_ext(t_all,h,kforestry) = f21_self_suff(t_all,h,kforestry); -*Implausible jumps in selfsuff for wood in some regions. -pm_selfsuff_ext(tstart21,h,kforestry) = f21_self_suff("y2010",h,kforestry); - v21_import_for_feasibility.fx(h,k_trade) = 0; v21_import_for_feasibility.lo(h,k_import21) = 0; v21_import_for_feasibility.up(h,k_import21) = Inf; diff --git a/modules/21_trade/selfsuff_reduced_bilateral22/declarations.gms b/modules/21_trade/selfsuff_reduced_bilateral22/declarations.gms index 02c0278f0c..52bfeefb13 100644 --- a/modules/21_trade/selfsuff_reduced_bilateral22/declarations.gms +++ b/modules/21_trade/selfsuff_reduced_bilateral22/declarations.gms @@ -9,7 +9,6 @@ parameters i21_trade_bal_reduction(t_all,k_trade) Trade balance reduction (1) i21_trade_margin(i_ex,i_im,k_trade) Trade transport and admin costs (USD05MER per tDM) i21_trade_tariff(t_all, i_ex,i_im,k_trade) Trade tariffs (USD05MER per tDM) - pm_selfsuff_ext(t_ext,h,kforestry) Self sufficiency for timber products in extended time frame (1) ; positive variables diff --git a/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms b/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms index 7a27f3c715..5d60440200 100644 --- a/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms +++ b/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms @@ -26,11 +26,6 @@ i21_trade_tariff(t_all,i_ex,i_im,k_trade)$(m_year(t_all) >= s21_trade_tariff_tar ); ); -pm_selfsuff_ext(t_ext,h,kforestry) = f21_self_suff("y2150",h,kforestry); -pm_selfsuff_ext(t_all,h,kforestry) = f21_self_suff(t_all,h,kforestry); -*Implausible jumps in selfsuff for wood in some regions. -pm_selfsuff_ext(tstart21,h,kforestry) = f21_self_suff("y2010",h,kforestry); - v21_import_for_feasibility.fx(h,k_trade) = 0; v21_import_for_feasibility.lo(h,k_import21) = 0; v21_import_for_feasibility.up(h,k_import21) = Inf; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index 4cca5213d3..205a9693bd 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -18,3 +18,6 @@ if(s73_foresight=1, else pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry); ); + +* tbd: remove after successful testing? +v73_prod_heaven_timber.fx(j,kforestry) = 0; From 30654ebc195e99b4911ed941843730011561c291 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 14:01:03 +0200 Subject: [PATCH 179/259] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4f9b236685..878a6aef49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions - **scripts** removed support for spam files in start_functions +- *14_yields* removed interface `pm_timber_yield_initial`, no longer needed +- *21_trade_* removed interface `pm_selfsuff_ext`, no longer needed ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs From 2e6cea0b44e878f52ee442ad22752233f2e9e450 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Fri, 17 May 2024 14:35:23 +0200 Subject: [PATCH 180/259] updated input vector and scenario_config --- config/default.cfg | 6 ++-- config/scenario_config.csv | 62 +++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 796a299b40..572be18f70 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", - cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.105_h12_validation.tgz", +cfg$input <- c(regional = "WARNINGS66_rev4.107Mehta_h12_magpie.tgz", + cellular = "WARNINGS26_rev4.107Mehta_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "WARNINGS79_rev4.107Mehta_h12_validation.tgz", additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") diff --git a/config/scenario_config.csv b/config/scenario_config.csv index b55fd5ab04..3c90074de9 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,45 +1,45 @@ -;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_Diet;EL2_default;EL2_lessSus;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP +;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_PHD;EL2_Demand;EL2_default;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; -gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SDP;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; +gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SDP;SDP;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; -gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;;;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; +gms$s15_elastic_demand;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;0;0;0;;0;0;0;0;0;;;;;;;;;;;;;;;;;;;; gms$s15_rumdairy_scp_substitution;;;;0;0;0;0;0;0;0;0.5;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_subst_functional_form;;;;;;;;;;;2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_start;;;;;;;;;;;2020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk -gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1; -gms$s15_exo_foodscen_functional_form;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;;;;1;;;1;;;;;;;;;;;;;;;;;;;1; -gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2020;2020;;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020; -gms$s15_exo_foodscen_target;;;;;;;;;;2050;2050;2050;2070;;;;;;;2050;2050;2050;;;;2050;;;2050;;;;;;;;;;;;;;;;;;;2050; -gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; -gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;;;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; -gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;3;;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; -gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;healthy_BMI;;;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; -gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;FLX;;;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_roots;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;0;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; -gms$s15_alc_scen;0.014;;;;;;;;;;;;;;;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;1;;;1;;;1;;;;;;;;;;;;;;;;;;;1; +gms$s15_exo_foodscen_functional_form;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;1;;;1;;;1;;;;;;;;;;;;;;;;;;;1; +gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2020;2020;2020;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020; +gms$s15_exo_foodscen_target;;;;;;;;;;2050;2050;2050;2070;;;;;;;2050;2050;2050;2050;;;2050;;;2050;;;;;;;;;;;;;;;;;;;2050; +gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;1;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;1.2;;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; +gms$s15_exo_diet;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;1;3;3;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; +gms$c15_kcal_scen;;;;;;;;;;healthy_BMI;no_underweight;healthy_BMI;healthy_BMI;;;;;;;healthy_BMI;healthy_BMI;healthy_BMI;healthy_BMI;;;healthy_BMI;;;healthy_BMI;;;;;;;;;;;;;;;;;;;healthy_BMI; +gms$c15_EAT_scen;;;;;;;;;;FLX;;FLX;FLX;;;;;;;FLX;FLX;FLX;FLX;;;FLX;;;FLX;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_monogastric;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_ruminant;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fish;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_fruitvegnut;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_roots;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_pulses;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_sugar;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_oils;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_brans;;;;;;;;;;1;0;1;1;;;;;;;1;1;0;0;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_scp;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_exo_alcohol;;;;;;;;;;1;0;1;1;;;;;;;1;1;1;1;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; +gms$s15_alc_scen;0.014;;;;;;;;;;;;;;;;;;;;;0;0;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c20_scp_type;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;hydrogen gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;;;;;;;;;;;;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;; gms$c22_protect_scenario;;;;none;none;none;none;none;none;BH;none;BH_IFL;BH;;;;;;;BH;;;;;BH_IFL;BH_IFL;BH_IFL;BH_IFL;BH_IFL;;;;;;;;;;;;;;;;;;;; gms$c22_protect_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;none;none;BH_IFL;none;BH_IFL;;;;;;;;;;;;;;;;;;;; -gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;rainfed;all;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c30_bioen_water;;;;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;rainfed;all;rainfed;rainfed;;;;;;;rainfed;;;;rainfed;;;;;;;;;;;;;;;;;;;;;;;;; gms$s30_snv_shr;;;;0;0;0;0;0;0;0;0;0;0.2;;;;;;;0;;;;;0.2;0.2;0.2;0.2;0.2;;;;;;;;;;;;;;;;;;;; gms$s30_snv_shr_noselect;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0.2;0;0.2;;;;;;;;;;;;;;;;;;;; gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; @@ -48,7 +48,7 @@ gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; -gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;0;1;;;;;;;;;;;;;;;;;;;;;;;;; +gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s32_max_aff_area;;;;Inf;Inf;Inf;Inf;Inf;Inf;500;350;0;700;;;;;;;500;;;;;Inf;Inf;Inf;500;500;;;;;;;;;;;;;;;;;;;; gms$c32_aff_mask;;;;noboreal;noboreal;noboreal;noboreal;noboreal;noboreal;onlytropical;onlytropical;onlytropical;onlytropical;;;;;;;onlytropical;;;;;noboreal;noboreal;noboreal;noboreal;noboreal;;;;;;;;;;;;;;;;;;;; @@ -73,16 +73,16 @@ gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max6 gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c56_pollutant_prices_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;none;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-NPi;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;none;none;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;none;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 -gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi -gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;none;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi +gms$c60_2ndgen_biodem_noselect;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi gms$c60_1stgen_biodem;;;;phaseout2020;const2020;const2020;const2030;const2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;phaseout2020;;;;;phaseout2020;phaseout2020;phaseout2020;phaseout2020;phaseout2020;;;;;;;;;;;;;;;;;;;;phaseout2020 gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; From 932b49b8f15a5fa7dd12578778850c0886bb56c8 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 17:06:51 +0200 Subject: [PATCH 181/259] update --- modules/32_forestry/dynamic_may24/input.gms | 2 +- modules/32_forestry/dynamic_may24/scaling.gms | 6 +++--- modules/34_urban/exo_nov21/realization.gms | 1 + modules/34_urban/exo_nov21/scaling.gms | 8 ++++++++ modules/35_natveg/dynamic_feb21/input.gms | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 modules/34_urban/exo_nov21/scaling.gms diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index bce4187eb0..038b9b8b33 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -36,7 +36,7 @@ scalars s32_planing_horizon Afforestation planing horizon (years) / 50 / s32_rotation_extension Rotation extension factor 1=original rotations 2=100 percent increase in rotations etc (1) / 1 / s32_faustmann_rotation Switch to activate faustmann rotations (1=on 0=off) / 0 / - s32_initial_distribution Switch to Activate ageclass distribution in plantations 0=off 1=equal distribution 2=FAO distribution 3=Poulter distribution 4=Manual distribution (1) / 0 / + s32_initial_distribution Switch to Activate ageclass distribution in plantations 0=off 1=equal distribution / 1 / s32_price Price for timber (USD) / 45 / s32_free_land_cost Penalty for technial area balance term (USD per ha) / 1e+06 / s32_max_aff_area Maximum total global afforestation (mio. ha) / Inf / diff --git a/modules/32_forestry/dynamic_may24/scaling.gms b/modules/32_forestry/dynamic_may24/scaling.gms index 284349ec52..029d892a2e 100644 --- a/modules/32_forestry/dynamic_may24/scaling.gms +++ b/modules/32_forestry/dynamic_may24/scaling.gms @@ -5,8 +5,8 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -v32_cost_establishment.scale(i) = 10e3; +v32_cost_establishment.scale(i) = 10e4; v32_cost_recur.scale(i) = 10e4; -vm_cost_fore.scale(i) = 10e4; -v32_cost_hvarea.scale(i)$(s32_hvarea = 1 OR s32_hvarea = 2) = 10e3; +vm_cost_fore.scale(i) = 10e5; +v32_cost_hvarea.scale(i)$(s32_hvarea = 1 OR s32_hvarea = 2) = 10e4; vm_cdr_aff.scale(j,ac,aff_effect) = 10e-4; diff --git a/modules/34_urban/exo_nov21/realization.gms b/modules/34_urban/exo_nov21/realization.gms index a1e3dee0bd..bf154011f1 100644 --- a/modules/34_urban/exo_nov21/realization.gms +++ b/modules/34_urban/exo_nov21/realization.gms @@ -17,6 +17,7 @@ $Ifi "%phase%" == "sets" $include "./modules/34_urban/exo_nov21/sets.gms" $Ifi "%phase%" == "declarations" $include "./modules/34_urban/exo_nov21/declarations.gms" $Ifi "%phase%" == "input" $include "./modules/34_urban/exo_nov21/input.gms" $Ifi "%phase%" == "equations" $include "./modules/34_urban/exo_nov21/equations.gms" +$Ifi "%phase%" == "scaling" $include "./modules/34_urban/exo_nov21/scaling.gms" $Ifi "%phase%" == "preloop" $include "./modules/34_urban/exo_nov21/preloop.gms" $Ifi "%phase%" == "presolve" $include "./modules/34_urban/exo_nov21/presolve.gms" $Ifi "%phase%" == "postsolve" $include "./modules/34_urban/exo_nov21/postsolve.gms" diff --git a/modules/34_urban/exo_nov21/scaling.gms b/modules/34_urban/exo_nov21/scaling.gms new file mode 100644 index 0000000000..dec0009dd7 --- /dev/null +++ b/modules/34_urban/exo_nov21/scaling.gms @@ -0,0 +1,8 @@ +*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | MAgPIE License Exception, version 1.0 (see LICENSE file). +*** | Contact: magpie@pik-potsdam.de + +vm_cost_urban.scale(j) = 10e4; diff --git a/modules/35_natveg/dynamic_feb21/input.gms b/modules/35_natveg/dynamic_feb21/input.gms index cfe1752b0c..4704e30dd2 100644 --- a/modules/35_natveg/dynamic_feb21/input.gms +++ b/modules/35_natveg/dynamic_feb21/input.gms @@ -18,7 +18,7 @@ s35_timber_harvest_cost_secdforest Cost for harvesting from secondary forest ( s35_timber_harvest_cost_other Cost for harvesting from other land (USD per ha) / 1500 / s35_timber_harvest_cost_primforest Cost for harvesting from primary forest (USD per ha) / 3000/ s35_natveg_harvest_shr Constrains the allowed wood harvest from natural vegetation (1=unconstrained) (1) /1/ -s35_secdf_distribution Flag for secdf initialization (0=all secondary forest in highest age class 1=Equal distribution among all age classes 2=Poulter distribution from MODIS satellite data) (1) / 0 / +s35_secdf_distribution Flag for secdf initialization (0=all secondary forest in highest age class 1=Equal distribution among all age classes 2=Poulter distribution from MODIS satellite data) (1) / 2 / s35_forest_damage Damage simulation in forests (0=none 1=shifting agriculture 2= Damage from shifting agriculture is faded out by c35_forest_damage_end 4= f35_forest_shock scenario) / 2 / s35_forest_damage_end Year of forest damage end (1) / 2050 / ; From 6fbbb512456b9f1a48d857ad7544b690f5af66ce Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 17:32:47 +0200 Subject: [PATCH 182/259] bugfixes --- config/default.cfg | 2 +- config/scenario_fsec.csv | 2 +- modules/56_ghg_policy/price_aug22/sets.gms | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 0dd4b9ba3e..ac84e0731c 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -25,7 +25,7 @@ cfg$model <- "main.gms" #def = "main.gms" cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.105_h12_validation.tgz", - additional = "additional_data_rev4.50.tgz", + additional = "additional_data_rev4.51.tgz", calibration = "calibration_H12_26Mar24.tgz") # NOTE: It is recommended to recalibrate the model when changing cellular input data diff --git a/config/scenario_fsec.csv b/config/scenario_fsec.csv index 1ef7d7cb66..40f85c1978 100644 --- a/config/scenario_fsec.csv +++ b/config/scenario_fsec.csv @@ -77,6 +77,6 @@ gms$c73_build_demand;;;;;;;;;;;;;;;;;;;;;;;;50pc;;;;;;;;;;;;;;;;;;;;;;;;;;; input['cellular'];rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.105_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; input['regional'];rev4.105_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['validation'];rev4.105_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['additional'];additional_data_rev4.48.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['additional'];additional_data_rev4.51.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['calibration'];calibration_FSEC_26Mar24.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_RemSDP-900-MagSSP1.mif;; diff --git a/modules/56_ghg_policy/price_aug22/sets.gms b/modules/56_ghg_policy/price_aug22/sets.gms index 7bb8f6bde9..014de3106f 100644 --- a/modules/56_ghg_policy/price_aug22/sets.gms +++ b/modules/56_ghg_policy/price_aug22/sets.gms @@ -102,15 +102,19 @@ sets all, all_nosoil, redd_nosoil, + redd_nosoil_CH4GWP20, redd_nosoil_nopeat, redd_nosoil_peatCO2only, reddnatveg_nosoil, + reddnatveg_nosoil_CH4GWP20, reddnatveg_nosoil_nopeat, reddnatveg_nosoil_peatCO2only, redd+_nosoil, + redd+_nosoil_CH4GWP20, redd+_nosoil_nopeat, redd+_nosoil_peatCO2only, redd+natveg_nosoil, + redd+natveg_nosoil_CH4GWP20, redd+natveg_nosoil_nopeat, redd+natveg_nosoil_peatCO2only, all_vegc, From 9b0df5f3595a323e5ffb16c1840cdff80a64b69f Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 17 May 2024 17:56:19 +0200 Subject: [PATCH 183/259] rework of forest establishment potential --- .../dynamic_feb21/declarations.gms | 2 +- .../32_forestry/dynamic_feb21/equations.gms | 2 +- .../32_forestry/dynamic_feb21/presolve.gms | 17 ++++++----- .../pot_forest_may24/declarations.gms | 3 +- .../35_natveg/pot_forest_may24/equations.gms | 6 ++-- .../35_natveg/pot_forest_may24/preloop.gms | 4 +++ .../35_natveg/pot_forest_may24/presolve.gms | 30 +++++++------------ 7 files changed, 31 insertions(+), 33 deletions(-) diff --git a/modules/32_forestry/dynamic_feb21/declarations.gms b/modules/32_forestry/dynamic_feb21/declarations.gms index 4b70b2d3ce..199e78df99 100644 --- a/modules/32_forestry/dynamic_feb21/declarations.gms +++ b/modules/32_forestry/dynamic_feb21/declarations.gms @@ -14,7 +14,7 @@ parameters i32_max_aff_area_glo(t) Maximum global endogenous afforestation area (mio. ha) i32_max_aff_area_reg(t,i) Maximum regional endogenous afforestation area (mio. ha) p32_aff_pol(t,j) NDC forest stock (mio. ha) - pm_aff_pol_timestep(t,j) NDC afforestation per time step (mio. ha) + p32_aff_pol_timestep(t,j) NDC afforestation per time step (mio. ha) p32_aff_pot(t,j) Potential afforestation area (mio. ha) p32_aff_togo(t,i) Remaining exogenous afforestation wrt to the maximum exogenous target over time (mio. ha) p32_carbon_density_ac(t,j,type32,ac,ag_pools) Carbon density for ac and ag_pools (tC per ha) diff --git a/modules/32_forestry/dynamic_feb21/equations.gms b/modules/32_forestry/dynamic_feb21/equations.gms index 3a1cbee0a6..84df7e8a6c 100644 --- a/modules/32_forestry/dynamic_feb21/equations.gms +++ b/modules/32_forestry/dynamic_feb21/equations.gms @@ -68,7 +68,7 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( *' The constraint `q32_aff_pol` accounts for the exogenous afforestation prescribed by NPI/NDC policies. q32_aff_pol(j2) .. - sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, pm_aff_pol_timestep(ct,j2)); + sum(ac_est, v32_land(j2,"ndc",ac_est)) =e= sum(ct, p32_aff_pol_timestep(ct,j2)); *' The constraint `q32_max_aff` accounts for the allowed maximum global endogenous *' afforestation defined in `i32_max_aff_area_glo`. diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 90442e4c4a..9b79285dd7 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -18,20 +18,21 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; ** START ndc ** * calc NPI/NDC afforestation per time step based on forest stock change - pm_aff_pol_timestep("y1995",j) = 0; - pm_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); + p32_aff_pol_timestep("y1995",j) = 0; + p32_aff_pol_timestep(t,j)$(ord(t)>1) = p32_aff_pol(t,j) - p32_aff_pol(t-1,j); * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation p32_aff_pot(t,j) = (vm_land.l(j,"crop") - vm_land.lo(j,"crop")) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); +*** NDC/NPI re/afforesation is further constrained by the remaining forest establishment potential + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pm_max_forest_est(j)) = pm_max_forest_est(j); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; -* Limit prescribed NPI/NDC afforestation in `pm_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available - pm_aff_pol_timestep(t,j)$(pm_aff_pol_timestep(t,j) > p32_aff_pot(t,j)) = p32_aff_pot(t,j); +* Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available + p32_aff_pol_timestep(t,j)$(p32_aff_pol_timestep(t,j) > p32_aff_pot(t,j)) = p32_aff_pot(t,j); ** END ndc ** *' @code - *' Afforestation switch: *' 0 = Use natveg growth curve towards LPJmL natural vegetation *' 1 = Use plantation growth curve (faster than natveg) towards LPJmL natural vegetation @@ -178,8 +179,8 @@ p32_updated_gs_reg(t,i) = 1; p32_updated_gs_reg(t,i)$(sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))>0) = (sum((cell(i,j),ac_sub),(pm_timber_yield(t,j,ac_sub,"forestry") / sm_wood_density) * p32_land(t,j,"plant",ac_sub))/ sum((cell(i,j),ac_sub),p32_land(t,j,"plant",ac_sub))); * Avoid conflict between afforestation for carbon uptake on land and secdforest restoration -pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ pm_aff_pol_timestep(t,j)) - = pm_land_conservation(t,j,"secdforest","restore") - (sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + pm_aff_pol_timestep(t,j)); -pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") <= sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + pm_aff_pol_timestep(t,j)) = 0; +pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) + = pm_land_conservation(t,j,"secdforest","restore") - (sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)); +pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") <= sum(ac, p32_land(t,j,"ndc",ac) + p32_land(t,j,"aff",ac) + v32_land.lo(j,"plant",ac)) + p32_aff_pol_timestep(t,j)) = 0; *** EOF presolve.gms *** diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index fe4433f782..8bb3c5b948 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -25,7 +25,8 @@ parameters p35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_recovered_forest(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - p35_max_forest_est(j) Overall forest establishment potential (mio. ha) + pm_max_forest_est(j) Overall forest establishment potential (mio. ha) + p35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 85b04e3ae2..4cae033500 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -184,12 +184,14 @@ q35_hvarea_other(j2,ac_sub).. *' The constraint for overall forest establishment is given by the *' remaining potential forest area, which is derived from -*' the potential natural forest area in each cluster. +*' the potential natural forest area minus the recovering secondary +*' forest area. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - p35_max_forest_est(j2) + pm_max_forest_est(j2) + - sum(ac, v35_youngsecdf(j2,ac)) ; *' Harvested secondary forest is still considered secondary forests due to diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 4f85a2fe15..0ad313bfbb 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -42,6 +42,10 @@ p35_secdforest(t,j,ac) = 0; p35_disturbance_loss_secdf(t,j,ac) = 0; p35_disturbance_loss_primf(t,j) = 0; +* initialize remaining potential forest establishment area +pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; + * ----------------------------------------- * Land conservation for climate mitigation * ----------------------------------------- diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index e842a6b944..67a41d9469 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -57,37 +57,28 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for potential forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -p35_max_forest_est(j) = f35_pot_forest_area(j) - - sum(land_forest, pcm_land(j,land_forest)) - - sum(ac_sub, pc35_youngsecdf(j,ac_sub)); -p35_max_forest_est(j)$(p35_max_forest_est(j) < 0) = 0; +pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; * ------------------------------------------------- * Calculate area of secondary forest recovery * ------------------------------------------------- -* Distribute forestry abandonement +*** Distribute forestry abandonement pc35_youngsecdf(j,ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); -pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > p35_max_forest_est(j)) = p35_max_forest_est(j)/card(ac_est2); -p35_max_forest_est(j) = p35_max_forest_est(j) - sum(ac_est, pc35_youngsecdf(j,ac_est)); - -* Consider NDC/NPI re/afforesation in current time step -pm_aff_pol_timestep(t,j)$(pm_aff_pol_timestep(t,j) > p35_max_forest_est(j)) = p35_max_forest_est(j); -p35_max_forest_est(j) = p35_max_forest_est(j) - pm_aff_pol_timestep(t,j); +pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > pm_max_forest_est(j)) = pm_max_forest_est(j)/card(ac_est2); * The proportion of secondary forest recovery in total natveg recovery is derived -* from the remaining potential area for forest establishment -p35_forest_recovery_shr(j) = p35_max_forest_est(j) / (sum(land_ag, pcm_land(j,land_ag)) + pcm_land(j,"urban")+1e-10); +* from the remaining forest recovery area +p35_max_forest_recovery(j) = pm_max_forest_est(j) - sum(ac pc35_youngsecdf(j,ac)); +p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; * Abandoned land pc35_other(j,ac_est) is then distributed propotionally using the forest recovery share. p35_recovered_forest(t,j,ac_est) = pc35_other(j,ac_est) * p35_forest_recovery_shr(j); -p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est2)) > p35_max_forest_est(j)) = p35_max_forest_est(j)/card(ac_est2); +p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est2)) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j)/card(ac_est2); pc35_other(j,ac_est) = pc35_other(j,ac_est) - p35_recovered_forest(t,j,ac_est); pc35_youngsecdf(j,ac_est) = pc35_youngsecdf(j,ac_est) + p35_recovered_forest(t,j,ac_est); -* Substract the actual recovered forest area from the forest recovery potential. -p35_max_forest_est(j) = p35_max_forest_est(j) - sum(ac_est,p35_recovered_forest(t,j,ac_est)); - * ------------------------------------------------ * Natural vegetation growth (age-class shift) * ------------------------------------------------ @@ -193,12 +184,10 @@ p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) * Since forest restoration cannot be bigger than the potential area for secdforest recovery, * any remaining restoration area is substracted and shifted to other land restoration. -p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_est(j); +p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); -* Substract forest restoration area from secondary forest recovery potential -p35_max_forest_est(j) = p35_max_forest_est(j) - p35_land_restoration(j,"secdforest"); * set conservation bound vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + p35_land_restoration(j,"secdforest"); @@ -211,6 +200,7 @@ v35_other.up(j,ac) = Inf; *set upper bound v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); m_boundfix(v35_other,(j,ac_sub),l,1e-6); +v35_youngsecdf.lo(j,ac_sub) = 0; v35_youngsecdf.up(j,ac_sub) = pc35_youngsecdf(j,ac_sub); m_boundfix(v35_youngsecdf,(j,ac_sub),l,1e-6); v35_youngsecdf.fx(j,ac_est) = 0; From 7395c9a5346359f1733fd61795f780b5bc3ce651 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 17 May 2024 18:08:52 +0200 Subject: [PATCH 184/259] bugfix --- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 67a41d9469..5879055464 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -70,7 +70,7 @@ pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > pm_max_fore * The proportion of secondary forest recovery in total natveg recovery is derived * from the remaining forest recovery area -p35_max_forest_recovery(j) = pm_max_forest_est(j) - sum(ac pc35_youngsecdf(j,ac)); +p35_max_forest_recovery(j) = pm_max_forest_est(j) - sum(ac, pc35_youngsecdf(j,ac)); p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; * Abandoned land pc35_other(j,ac_est) is then distributed propotionally using the forest recovery share. From 0c8311f692c2e4331e7c173384e6b3d137680371 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 18:35:53 +0200 Subject: [PATCH 185/259] bugfix changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 878a6aef49..cc4959ce48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,8 +35,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions - **scripts** removed support for spam files in start_functions -- *14_yields* removed interface `pm_timber_yield_initial`, no longer needed -- *21_trade_* removed interface `pm_selfsuff_ext`, no longer needed +- **14_yields** removed interface `pm_timber_yield_initial`, no longer needed +- **21_trade** removed interface `pm_selfsuff_ext`, no longer needed ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs From cae41c4e6b1ecaf5095e3e8df0fab107fa6b9bec Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 20:21:15 +0200 Subject: [PATCH 186/259] defaults --- config/default.cfg | 2 +- config/scenario_fsec.csv | 2 +- modules/44_biodiversity/bii_target/input.gms | 2 +- modules/44_biodiversity/bii_target_apr24/input.gms | 2 +- modules/56_ghg_policy/price_aug22/sets.gms | 4 ---- modules/58_peatland/v2/input.gms | 2 +- modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms | 6 +++--- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index ac84e0731c..0dd4b9ba3e 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -25,7 +25,7 @@ cfg$model <- "main.gms" #def = "main.gms" cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", validation = "rev4.105_h12_validation.tgz", - additional = "additional_data_rev4.51.tgz", + additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") # NOTE: It is recommended to recalibrate the model when changing cellular input data diff --git a/config/scenario_fsec.csv b/config/scenario_fsec.csv index 40f85c1978..53c95b210c 100644 --- a/config/scenario_fsec.csv +++ b/config/scenario_fsec.csv @@ -77,6 +77,6 @@ gms$c73_build_demand;;;;;;;;;;;;;;;;;;;;;;;;50pc;;;;;;;;;;;;;;;;;;;;;;;;;;; input['cellular'];rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.105_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; input['regional'];rev4.105_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['validation'];rev4.105_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['additional'];additional_data_rev4.51.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['additional'];additional_data_rev4.50.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['calibration'];calibration_FSEC_26Mar24.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_RemSDP-900-MagSSP1.mif;; diff --git a/modules/44_biodiversity/bii_target/input.gms b/modules/44_biodiversity/bii_target/input.gms index 3840e6c4ed..26deafacfd 100644 --- a/modules/44_biodiversity/bii_target/input.gms +++ b/modules/44_biodiversity/bii_target/input.gms @@ -10,7 +10,7 @@ scalars c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / s44_target_year Year in which the BII lower bound is reached (1) / 2100 / s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / - s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1e+06 / ; diff --git a/modules/44_biodiversity/bii_target_apr24/input.gms b/modules/44_biodiversity/bii_target_apr24/input.gms index fc6d28b687..f5d19800c5 100644 --- a/modules/44_biodiversity/bii_target_apr24/input.gms +++ b/modules/44_biodiversity/bii_target_apr24/input.gms @@ -10,7 +10,7 @@ scalars c44_bii_decrease Implementation of lower bound for BII (binary) / 1 / s44_target_year Year in which the BII lower bound is reached (1) / 2100 / s44_start_year Start year for interpolation towards BII lower bound (1) / 2025 / - s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1000000 / + s44_cost_bii_missing Technical costs for missing BII increase (USD per unit of BII) / 1e+06 / ; diff --git a/modules/56_ghg_policy/price_aug22/sets.gms b/modules/56_ghg_policy/price_aug22/sets.gms index 014de3106f..7bb8f6bde9 100644 --- a/modules/56_ghg_policy/price_aug22/sets.gms +++ b/modules/56_ghg_policy/price_aug22/sets.gms @@ -102,19 +102,15 @@ sets all, all_nosoil, redd_nosoil, - redd_nosoil_CH4GWP20, redd_nosoil_nopeat, redd_nosoil_peatCO2only, reddnatveg_nosoil, - reddnatveg_nosoil_CH4GWP20, reddnatveg_nosoil_nopeat, reddnatveg_nosoil_peatCO2only, redd+_nosoil, - redd+_nosoil_CH4GWP20, redd+_nosoil_nopeat, redd+_nosoil_peatCO2only, redd+natveg_nosoil, - redd+natveg_nosoil_CH4GWP20, redd+natveg_nosoil_nopeat, redd+natveg_nosoil_peatCO2only, all_vegc, diff --git a/modules/58_peatland/v2/input.gms b/modules/58_peatland/v2/input.gms index 0508ea5c3f..12007a7e7c 100644 --- a/modules/58_peatland/v2/input.gms +++ b/modules/58_peatland/v2/input.gms @@ -13,7 +13,7 @@ scalars s58_cost_drain_rewet_onetime One-time costs for drainage of rewetted peatland (USD05MER per ha) / 0 / s58_rewetting_switch Peatland rewetting on (Inf) or off (0) / Inf / s58_fix_peatland Year indicating until when peatland area should be fixed (year) / 2020 / - s58_balance_penalty Penalty for technical peatland balance term (USD05MER) / 1000000 / + s58_balance_penalty Penalty for technical peatland balance term (USD05MER) / 1e+06 / ; *Peatland area based on Global Peatland Map 2.0 and Global Peatland Database diff --git a/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms index 5f8da47522..da938046e9 100644 --- a/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms +++ b/modules/60_bioenergy/1st2ndgen_priced_feb24/input.gms @@ -43,9 +43,9 @@ scalars s60_2ndgen_bioenergy_dem_min_post_fix Minimum dedicated 2nd generation bioenergy demand assumed in each region after SSP2-fix (mio. GJ per yr) / 1 / ; -$setglobal c60_price_implementation exp -$setglobal c60_2ndgen_biodem R21M42-SSP2-Npi-PhaseOut50 -$setglobal c60_2ndgen_biodem_noselect R21M42-SSP2-NPi +$setglobal c60_price_implementation lin +$setglobal c60_2ndgen_biodem R32M46-SSP2EU-NPi +$setglobal c60_2ndgen_biodem_noselect R32M46-SSP2EU-NPi $if "%c60_2ndgen_biodem%" == "coupling" table f60_bioenergy_dem_coupling(t_all,i) Bioenergy demand (regional) (mio. GJ per yr) From b7647f2998feb3baa0e3f3f1758c9b8cf3dc2ccb Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 20:37:02 +0200 Subject: [PATCH 187/259] bugfix --- modules/32_forestry/dynamic_may24/input.gms | 7 ------- modules/32_forestry/input/files | 1 - 2 files changed, 8 deletions(-) diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index 038b9b8b33..354a7eefe3 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -90,13 +90,6 @@ $include "./modules/32_forestry/input/f32_localTCRE.cs3" $ondelim ; -parameter f32_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) -/ -$ondelim -$include "./modules/32_forestry/input/f32_gs_relativetarget.cs4" -$offdelim -/; - parameter f32_plantedforest(i) Share of plantation forest in planted forest (1) / $ondelim diff --git a/modules/32_forestry/input/files b/modules/32_forestry/input/files index 1a0959d8ae..b4ae3f22af 100644 --- a/modules/32_forestry/input/files +++ b/modules/32_forestry/input/files @@ -3,7 +3,6 @@ aff_unrestricted.cs2 aff_noboreal.cs2 aff_onlytropical.cs2 npi_ndc_aff_pol.cs3 -f32_plant_prod_share.csv f32_bph_effect_noTCRE.cs3 f32_localTCRE.cs3 f32_plantedforest.cs4 From 9627d1c3982af0c9f9be73e4c46cc5da8d29e68b Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 17 May 2024 20:57:45 +0200 Subject: [PATCH 188/259] update highres --- scripts/output/extra/highres.R | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/scripts/output/extra/highres.R b/scripts/output/extra/highres.R index 3d250abb7a..809868fef6 100644 --- a/scripts/output/extra/highres.R +++ b/scripts/output/extra/highres.R @@ -100,9 +100,8 @@ highres <- function(cfg) { #copy gdx file for 1st time step from low resolution run for better starting point #note: using gdx files for more than the 1st time step sometimes pushes the model into corner solutions, which might result in infeasibilites. cfg$files2export$start <- c(cfg$files2export$start, - paste0(cfg$results_folder, "/", "magpie_y1995.gdx")) - cfg$gms$s_use_gdx <- 1 - cfg$gms$s80_optfile <- 1 + paste0(cfg$results_folder, "/", "magpie_y*.gdx")) + cfg$gms$s_use_gdx <- 2 #max resources for parallel runs cfg$qos <- "standby_maxMem_dayMax" From 41250ca450068abd52789149f0fb8e45b7140774 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Sat, 18 May 2024 00:32:27 +0200 Subject: [PATCH 189/259] forest establishment bound fix --- modules/35_natveg/pot_forest_may24/postsolve.gms | 4 ++++ modules/35_natveg/pot_forest_may24/preloop.gms | 8 +++++++- modules/35_natveg/pot_forest_may24/presolve.gms | 10 ---------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index ebe6ddce81..404670eb0c 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -12,6 +12,10 @@ p35_secdforest(t,j,ac) = v35_secdforest.l(j,ac); p35_other(t,j,ac) = v35_other.l(j,ac); p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); +* Forest establishment bound +pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); +pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; + *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); ov35_youngsecdf(t,j,ac,"marginal") = v35_youngsecdf.m(j,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 0ad313bfbb..4b1cba4f6c 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -42,7 +42,13 @@ p35_secdforest(t,j,ac) = 0; p35_disturbance_loss_secdf(t,j,ac) = 0; p35_disturbance_loss_primf(t,j) = 0; -* initialize remaining potential forest establishment area +* ------------------------------------------------------------- +* Initialize remaining potential forest establishment area +* ------------------------------------------------------------- + +* Forest establishment is constrained by the potential forest area in each cluster. +* Hence, the area for potential forest establishments is given by the potential forest +* area minus all forest areas in the previous time step. pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 5879055464..be45026c6b 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -50,16 +50,6 @@ pcm_land(j,"primforest") = pcm_land(j,"primforest") - p35_disturbance_loss_primf vm_land.l(j,"primforest") = pcm_land(j,"primforest"); -* -------------------------------------- -* Forest establishment bound -* -------------------------------------- - -* Forest establishment is constrained by the potential forest area in each cluster. -* Hence, the area for potential forest establishments is given by the potential forest -* area minus all forest areas in the previous time step. -pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; - * ------------------------------------------------- * Calculate area of secondary forest recovery * ------------------------------------------------- From aa8c9a9c6ab50a6976d94f3f5cd2b7ae42fe0810 Mon Sep 17 00:00:00 2001 From: florianh Date: Sat, 18 May 2024 08:12:26 +0200 Subject: [PATCH 190/259] bugfix --- modules/21_trade/exo/input.gms | 5 ----- .../selfsuff_reduced_bilateral22/equations.gms | 5 +++-- scripts/output/extra/highres.R | 11 ++++++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/modules/21_trade/exo/input.gms b/modules/21_trade/exo/input.gms index 70be889924..3ae07b84d6 100644 --- a/modules/21_trade/exo/input.gms +++ b/modules/21_trade/exo/input.gms @@ -9,8 +9,3 @@ table f21_trade_balance(t_all,h,kall) trade balance of positive exports and nega $ondelim $include "./modules/21_trade/input/f21_trade_balance.cs3" $offdelim; - -table f21_self_suff(t_all,h,kall) Superregional self-sufficiency rates (1) -$ondelim -$include "./modules/21_trade/input/f21_trade_self_suff.cs3" -$offdelim; diff --git a/modules/21_trade/selfsuff_reduced_bilateral22/equations.gms b/modules/21_trade/selfsuff_reduced_bilateral22/equations.gms index 09bc08180c..4e25b7c5ce 100644 --- a/modules/21_trade/selfsuff_reduced_bilateral22/equations.gms +++ b/modules/21_trade/selfsuff_reduced_bilateral22/equations.gms @@ -37,8 +37,9 @@ q21_trade_bilat(h2,k_trade).. *sum(ct,i21_trade_bal_reduction(ct,k_trade))) $(sum(ct,f21_self_suff(ct,h2,k_trade) >= 1)) + (sum(supreg(h2,i2),vm_supply(i2,k_trade))*sum(ct,f21_self_suff(ct,h2,k_trade)) - *sum(ct,i21_trade_bal_reduction(ct,k_trade)) - v21_import_for_feasibility(h2,k_trade)) - $(sum(ct,f21_self_suff(ct,h2,k_trade) < 1)); + *sum(ct,i21_trade_bal_reduction(ct,k_trade))) + $(sum(ct,f21_self_suff(ct,h2,k_trade) < 1)) + - v21_import_for_feasibility(h2,k_trade); *' Upper bound for production. diff --git a/scripts/output/extra/highres.R b/scripts/output/extra/highres.R index 809868fef6..bde43b4419 100644 --- a/scripts/output/extra/highres.R +++ b/scripts/output/extra/highres.R @@ -128,10 +128,15 @@ highres <- function(cfg) { cfg$recalc_npi_ndc <- TRUE #get trade pattern from low resolution run with c200 - ov_prod_reg <- readGDX(gdx, "ov_prod_reg", select = list(type = "level")) - ov_supply <- readGDX(gdx, "ov_supply", select = list(type = "level")) + k_trade <- readGDX(gdx, "k_trade") + ov_prod_reg <- readGDX(gdx, "ov_prod_reg", select = list(type = "level"))[,,k_trade] + ov_supply <- readGDX(gdx, "ov_supply", select = list(type = "level"))[,,k_trade] + import_for_feasibility <- readGDX(gdx, "ov21_import_for_feasibility", select = list(type = "level"), react = "silent") + if(is.null(import_for_feasibility)) { + import_for_feasibility <- new.magpie(getCells(ov_supply),getYears(ov_supply),getNames(ov_supply),fill = 0) + } supreg <- readGDX(gdx, "supreg") - f21_trade_balance <- toolAggregate(ov_prod_reg - ov_supply, supreg) + f21_trade_balance <- toolAggregate(ov_prod_reg - (ov_supply + import_for_feasibility), supreg) write.magpie(f21_trade_balance, paste0("modules/21_trade/input/f21_trade_balance.cs3")) #get tau from low resolution run with c200 From 0e0e5276ece6f81cd8f8bfb6b24ca1e5840ca4f7 Mon Sep 17 00:00:00 2001 From: florianh Date: Sat, 18 May 2024 09:35:37 +0200 Subject: [PATCH 191/259] reverting back --- modules/73_timber/default/presolve.gms | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index 205a9693bd..4cca5213d3 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -18,6 +18,3 @@ if(s73_foresight=1, else pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry); ); - -* tbd: remove after successful testing? -v73_prod_heaven_timber.fx(j,kforestry) = 0; From 2e28b4ad4aa5d6c4d009958696196d4ba95f3832 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Sat, 18 May 2024 10:06:38 +0200 Subject: [PATCH 192/259] slight renaming --- modules/35_natveg/pot_forest_may24/declarations.gms | 2 +- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- modules/35_natveg/pot_forest_may24/postsolve.gms | 6 +++--- modules/35_natveg/pot_forest_may24/preloop.gms | 4 ++-- modules/35_natveg/pot_forest_may24/presolve.gms | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 8bb3c5b948..28c382ce43 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -25,7 +25,7 @@ parameters p35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_recovered_forest(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - pm_max_forest_est(j) Overall forest establishment potential (mio. ha) + pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) p35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 4cae033500..6175c5b31e 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -190,7 +190,7 @@ q35_hvarea_other(j2,ac_sub).. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - pm_max_forest_est(j2) + pcm_max_forest_est(j2) - sum(ac, v35_youngsecdf(j2,ac)) ; diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index 404670eb0c..c503ff69ad 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -12,9 +12,9 @@ p35_secdforest(t,j,ac) = v35_secdforest.l(j,ac); p35_other(t,j,ac) = v35_other.l(j,ac); p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); -* Forest establishment bound -pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); -pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; +* Reset forest establishment bound +pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); +pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 4b1cba4f6c..0f6ec6dd21 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -49,8 +49,8 @@ p35_disturbance_loss_primf(t,j) = 0; * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for potential forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -pm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -pm_max_forest_est(j)$(pm_max_forest_est(j) < 0) = 0; +pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; * ----------------------------------------- * Land conservation for climate mitigation diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index be45026c6b..6a6e08fb29 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -56,11 +56,11 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); *** Distribute forestry abandonement pc35_youngsecdf(j,ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); -pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > pm_max_forest_est(j)) = pm_max_forest_est(j)/card(ac_est2); +pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > pcm_max_forest_est(j)) = pcm_max_forest_est(j)/card(ac_est2); * The proportion of secondary forest recovery in total natveg recovery is derived * from the remaining forest recovery area -p35_max_forest_recovery(j) = pm_max_forest_est(j) - sum(ac, pc35_youngsecdf(j,ac)); +p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_youngsecdf(j,ac)); p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; * Abandoned land pc35_other(j,ac_est) is then distributed propotionally using the forest recovery share. From 26acf5acad0d430ead02abe5b319f80907b3856d Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Sat, 18 May 2024 10:08:18 +0200 Subject: [PATCH 193/259] slight renaming --- modules/32_forestry/dynamic_feb21/presolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/32_forestry/dynamic_feb21/presolve.gms b/modules/32_forestry/dynamic_feb21/presolve.gms index 9b79285dd7..380d05d2f4 100644 --- a/modules/32_forestry/dynamic_feb21/presolve.gms +++ b/modules/32_forestry/dynamic_feb21/presolve.gms @@ -25,7 +25,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); *** NDC/NPI re/afforesation is further constrained by the remaining forest establishment potential - p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pm_max_forest_est(j)) = pm_max_forest_est(j); + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(j)) = pcm_max_forest_est(j); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available From a2fe7f64ad8f5727962c9a3ed841047f3c1b8eba Mon Sep 17 00:00:00 2001 From: florianh Date: Sun, 19 May 2024 10:33:34 +0200 Subject: [PATCH 194/259] model run time --- scripts/output/extra/runtimePR.R | 128 +++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 scripts/output/extra/runtimePR.R diff --git a/scripts/output/extra/runtimePR.R b/scripts/output/extra/runtimePR.R new file mode 100644 index 0000000000..219d4a8c77 --- /dev/null +++ b/scripts/output/extra/runtimePR.R @@ -0,0 +1,128 @@ +# | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# -------------------------------------------------------------- +# description: Compiles model run time for PR +# comparison script: TRUE +# --------------------------------------------------------------- + +############################# LOAD LIBRARIES ############################# +library(lucode2, quietly = TRUE, warn.conflicts =FALSE) + +if(!exists("source_include")) { + outputdir <- file.path("output",list.dirs("output", full.names = FALSE, recursive = FALSE)) + lucode2::readArgs("outputdir") +} + +runtime <- NULL +maindir <- getwd() + +# ---- Read runtime data ---- + +cat("\nReading runtime for", length(outputdir), "runs\n") +for (d in outputdir) { + splittedpath <- strsplit(d, "/")[[1]] + runfolder <- splittedpath[length(splittedpath)] + datafile <- paste0(d, "/runstatistics.rda") + + # try to read runtime data from runstatistics.rda + tmp <- NULL + start <- NULL + end <- NULL + timePrepareStart <- NULL + timePrepareEnd <- NULL + timeGAMSStart <- NULL + timeGAMSEnd <- NULL + timeOutputStart <- NULL + timeOutputEnd <- NULL + + if (!file.exists(datafile)) { + cat("No file found ", datafile, "\n") + } else if (file.info(datafile)$size == 0) { + cat("Empty file ", datafile, "\n") + } else { + # if file exists and it's file size is >0: load it + stats <- NULL + load(datafile) + # try to load detailed runtime information + if (!is.null(stats) && !is.null(stats$timePrepareStart)) { + timePrepareStart <- stats$timePrepareStart + timePrepareEnd <- stats$timePrepareEnd + timeGAMSStart <- stats$timeGAMSStart + timeGAMSEnd <- stats$timeGAMSEnd + timeOutputStart <- stats$timeOutputStart + timeOutputEnd <- stats$timeOutputEnd + } else if (!is.null(stats) && !is.null(stats$starttime)) { + # if no detailed information is available load the old one (it's only the gams runtime) + start <- stats$starttime + end <- stats$endtime + } + } + + # if no start and end was extractable from runstatistics.rda + # conclude it from timestamps of the files in the results folder + if (is.null(end) && is.null(timePrepareEnd) && is.null(timeGAMSEnd) && is.null(timeOutputEnd)) { + local_dir(d) + # find all files + info <- file.info(dir()) + # sort files in info by mtime + info <- info[order(info$mtime), ] + # save time of first file in the list (oldest) + start <- info[1, ]$mtime + # save time if last file in the list (newest) + + if ("report.rds" %in% rownames(info)) { + # if run has finished normally the report.rds file should exist. In this case take the newest file + cat("Using the newest file in", runfolder, "as end\n") + end <- tail(info$mtime, n = 1) + } else { + # if report.rds does not exist, this indicates that the run did not finish properly and the mif file has been + # generated manually later without also producing the report.rds + # In this case do not take the newest file (which is the manually and belated produced mif file) but take the + # full.lst which is the newest file before the mif file + cat("Using", runfolder, "full.lst as end\n") + end <- info["full.lst", ]$mtime + } + local_dir(maindir) + } + + # if (total) runtime data was found + if (all(c(!is.null(start), !is.null(end)))) { + # need to be transformed to NA otherwise rbind would not work if one of them is NULL + tmp <- end - start + units(tmp) <- "hours" + if (is.null(start)) start <- NA + if (is.null(end)) end <- NA + new <- data.frame(section = "total", run = runfolder, mins = round(tmp,1), stringsAsFactors = FALSE) + runtime <- rbind(runtime, new) + } + + # if detailed runtime data was found append it + if (!is.null(timePrepareEnd)) { + tmp <- timePrepareEnd - timePrepareStart + units(tmp) <- "mins" + new <- data.frame(section = "prep", run = runfolder, mins = round(tmp,1), stringsAsFactors = FALSE) + runtime <- rbind(runtime, new) + } + + if (!is.null(timeGAMSEnd)) { + tmp <- timeGAMSEnd - timeGAMSStart + units(tmp) <- "mins" + new <- data.frame(section = "GAMS", run = runfolder, mins = round(tmp,1), stringsAsFactors = FALSE) + runtime <- rbind(runtime, new) + } + + if (!is.null(timeOutputEnd)) { + tmp <- timeOutputEnd - timeOutputStart + units(tmp) <- "mins" + new <- data.frame(section = "output", run = runfolder, mins = round(tmp,1), stringsAsFactors = FALSE) + runtime <- rbind(runtime, new) + } +} + +runtime <- runtime[order(runtime$section,runtime$run),] +write.csv(runtime, file = "output/runtimePR.csv", quote = FALSE,row.names = FALSE) From cdd804bad3b53083f11248ea7411c25b4fc41123 Mon Sep 17 00:00:00 2001 From: florianh Date: Sun, 19 May 2024 12:45:18 +0200 Subject: [PATCH 195/259] update --- CHANGELOG.md | 2 +- modules/16_demand/sector_may15/equations.gms | 2 +- .../32_forestry/dynamic_may24/presolve.gms | 8 ++++---- .../exo_flexreg_apr16/declarations.gms | 8 +++++--- .../exo_flexreg_apr16/equations.gms | 18 +++++++++++------ .../exo_flexreg_apr16/postsolve.gms | 20 +++++++++++-------- .../62_material/exo_flexreg_apr16/sets.gms | 10 ++++++++++ modules/73_timber/default/declarations.gms | 2 +- modules/73_timber/default/preloop.gms | 16 +++++++-------- modules/73_timber/default/presolve.gms | 6 +++--- 10 files changed, 57 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc4959ce48..1495dad620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,7 +46,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **start/projects/fsec.R** scenario settings - **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working - **58_peatland** Added balance variable to avoid random infeasibilites - +- **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` ## [4.7.3] - 2024-04-12 diff --git a/modules/16_demand/sector_may15/equations.gms b/modules/16_demand/sector_may15/equations.gms index 7ae902205a..b5bab81189 100644 --- a/modules/16_demand/sector_may15/equations.gms +++ b/modules/16_demand/sector_may15/equations.gms @@ -84,5 +84,5 @@ q16_seed_demand(i2,kcr) .. q16_supply_forestry(i2,kforestry) .. vm_supply(i2,kforestry) =e= - sum(ct,pm_demand_ext(ct,i2,kforestry)) + vm_dem_material(i2,kforestry) ; diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index d7a92d6327..bcbb5c8b3a 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -165,8 +165,8 @@ pc32_yield_forestry_future(j) = sum(ac$(ac.off = p32_rotation_cellular_estb(t,j) * Fader for plantation share in establishment decision if(ord(t) = 1, pc32_prod_forestry_ini(i) = sum(cell(i,j), sum(ac$(ac.off = p32_rotation_cellular_harvesting(t,j)), pm_timber_yield(t,j,ac,"forestry") * p32_land(t,j,"plant",ac))) / m_timestep_length_forestry; - pc32_plant_contr_ini(i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) > 0) = pc32_prod_forestry_ini(i) / sum(kforestry, pm_demand_ext(t,i,kforestry)); - pc32_plant_contr_ini(i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) = 0) = 0; + pc32_plant_contr_ini(i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) > 0) = pc32_prod_forestry_ini(i) / sum(kforestry, pm_demand_forestry(t,i,kforestry)); + pc32_plant_contr_ini(i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) = 0) = 0; p32_plant_contr(t,i) = pc32_plant_contr_ini(i); else p32_plant_contr(t,i) = p32_plant_contr(t-1,i) * (1+i32_plant_contr_growth_fader(t))**m_timestep_length_forestry; @@ -176,8 +176,8 @@ p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_co p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) > 0) = pm_demand_forestry_future(t,i,kforestry) / sum(kforestry2, pm_demand_forestry_future(t,i,kforestry2)); p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) = 0) = 1/card(kforestry); -p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) > 0) = sum(kforestry, pm_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_ext(t,i,kforestry)); -p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_ext(t,i,kforestry)) = 0) = 0; +p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) > 0) = sum(kforestry, pm_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_forestry(t,i,kforestry)); +p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) = 0) = 0; * Avoid conflict between afforestation for carbon uptake on land and secdforest restoration pm_land_conservation(t,j,"secdforest","restore")$(pm_land_conservation(t,j,"secdforest","restore") > sum(ac, p32_land(t,j,"ndc",ac) + v32_land.lo(j,"plant",ac) + p32_land(t,j,"aff",ac))+ p32_aff_pol_timestep(t,j)) diff --git a/modules/62_material/exo_flexreg_apr16/declarations.gms b/modules/62_material/exo_flexreg_apr16/declarations.gms index f123033e91..ffb6234084 100644 --- a/modules/62_material/exo_flexreg_apr16/declarations.gms +++ b/modules/62_material/exo_flexreg_apr16/declarations.gms @@ -26,12 +26,14 @@ positive variables ; equations - q62_dem_material(i,kall) Estimating material demand (mio. tDM per yr) + q62_dem_material(i,kall_excl_kforestry) Estimating material demand (mio. tDM per yr) + q62_dem_material_forestry(i,kforestry) Demand for forestry products (mio. tDM per yr) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters - ov_dem_material(t,i,kall,type) Demand for material usage (mio. tDM per yr) - oq62_dem_material(t,i,kall,type) Estimating material demand (mio. tDM per yr) + ov_dem_material(t,i,kall,type) Demand for material usage (mio. tDM per yr) + oq62_dem_material(t,i,kall_excl_kforestry,type) Estimating material demand (mio. tDM per yr) + oq62_dem_material_forestry(t,i,kforestry,type) Demand for forestry products (mio. tDM per yr) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/62_material/exo_flexreg_apr16/equations.gms b/modules/62_material/exo_flexreg_apr16/equations.gms index 1f6221a307..1d588cb992 100644 --- a/modules/62_material/exo_flexreg_apr16/equations.gms +++ b/modules/62_material/exo_flexreg_apr16/equations.gms @@ -19,14 +19,20 @@ *' For historic years it is assumed that this demand is already part of the *' general material demand, therefore the double-counted demand is subtracted. - q62_dem_material(i2,kall) .. - vm_dem_material(i2,kall) + q62_dem_material(i2,kall_excl_kforestry) .. + vm_dem_material(i2,kall_excl_kforestry) =e= - sum(ct,f62_dem_material(ct,i2,kall))*s62_historical + sum(ct,f62_dem_material(ct,i2,kall_excl_kforestry))*s62_historical + - (p62_dem_material_lastcalibyear(i2,kall) * p62_scaling_factor(i2)) - *(1-s62_historical) + sum(ct, p62_bioplastic_substrate(ct, i2, kall)) - - sum(ct, p62_bioplastic_substrate_double_counted(ct,i2,kall)) + (p62_dem_material_lastcalibyear(i2,kall_excl_kforestry) * p62_scaling_factor(i2)) + *(1-s62_historical) + sum(ct, p62_bioplastic_substrate(ct, i2, kall_excl_kforestry)) - + sum(ct, p62_bioplastic_substrate_double_counted(ct,i2,kall_excl_kforestry)) ; +*' Demand for forestry products (wood and woodfuel) is provided by the timber module. + q62_dem_material_forestry(i2,kforestry) .. + vm_dem_material(i2,kforestry) + =e= + sum(ct, pm_demand_forestry(ct,i2,kforestry)); + ; diff --git a/modules/62_material/exo_flexreg_apr16/postsolve.gms b/modules/62_material/exo_flexreg_apr16/postsolve.gms index 6151fa40de..979193f976 100644 --- a/modules/62_material/exo_flexreg_apr16/postsolve.gms +++ b/modules/62_material/exo_flexreg_apr16/postsolve.gms @@ -18,12 +18,16 @@ if (sum(sameas(t_past,t),1) = 1, *' @stop *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### - ov_dem_material(t,i,kall,"marginal") = vm_dem_material.m(i,kall); - oq62_dem_material(t,i,kall,"marginal") = q62_dem_material.m(i,kall); - ov_dem_material(t,i,kall,"level") = vm_dem_material.l(i,kall); - oq62_dem_material(t,i,kall,"level") = q62_dem_material.l(i,kall); - ov_dem_material(t,i,kall,"upper") = vm_dem_material.up(i,kall); - oq62_dem_material(t,i,kall,"upper") = q62_dem_material.up(i,kall); - ov_dem_material(t,i,kall,"lower") = vm_dem_material.lo(i,kall); - oq62_dem_material(t,i,kall,"lower") = q62_dem_material.lo(i,kall); + ov_dem_material(t,i,kall,"marginal") = vm_dem_material.m(i,kall); + oq62_dem_material(t,i,kall_excl_kforestry,"marginal") = q62_dem_material.m(i,kall_excl_kforestry); + oq62_dem_material_forestry(t,i,kforestry,"marginal") = q62_dem_material_forestry.m(i,kforestry); + ov_dem_material(t,i,kall,"level") = vm_dem_material.l(i,kall); + oq62_dem_material(t,i,kall_excl_kforestry,"level") = q62_dem_material.l(i,kall_excl_kforestry); + oq62_dem_material_forestry(t,i,kforestry,"level") = q62_dem_material_forestry.l(i,kforestry); + ov_dem_material(t,i,kall,"upper") = vm_dem_material.up(i,kall); + oq62_dem_material(t,i,kall_excl_kforestry,"upper") = q62_dem_material.up(i,kall_excl_kforestry); + oq62_dem_material_forestry(t,i,kforestry,"upper") = q62_dem_material_forestry.up(i,kforestry); + ov_dem_material(t,i,kall,"lower") = vm_dem_material.lo(i,kall); + oq62_dem_material(t,i,kall_excl_kforestry,"lower") = q62_dem_material.lo(i,kall_excl_kforestry); + oq62_dem_material_forestry(t,i,kforestry,"lower") = q62_dem_material_forestry.lo(i,kforestry); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/62_material/exo_flexreg_apr16/sets.gms b/modules/62_material/exo_flexreg_apr16/sets.gms index 253c23cbfd..e89607d1a0 100644 --- a/modules/62_material/exo_flexreg_apr16/sets.gms +++ b/modules/62_material/exo_flexreg_apr16/sets.gms @@ -13,4 +13,14 @@ sets a1,a2,b1,b2, history, SSP2_lowls,SSP2_lowcal / + + kall_excl_kforestry(kall) All products in the sectoral version excluding wood and woodfuel + / + tece,maiz,trce,rice_pro,soybean,rapeseed,groundnut,sunflower,oilpalm,puls_pro, + potato,cassav_sp,sugr_cane,sugr_beet,others,cottn_pro,foddr, pasture, begr, betr, + oils,oilcakes,sugar,molasses,alcohol,ethanol,distillers_grain,brans,scp,fibres, + livst_rum, livst_pig,livst_chick, livst_egg, livst_milk, fish, + res_cereals, res_fibrous, res_nonfibrous + / + ; diff --git a/modules/73_timber/default/declarations.gms b/modules/73_timber/default/declarations.gms index 9ad6a0ba9f..cc335849c3 100644 --- a/modules/73_timber/default/declarations.gms +++ b/modules/73_timber/default/declarations.gms @@ -9,7 +9,7 @@ parameters p73_timber_demand_gdp_pop(t_all,i,kforestry) Timber demand based on lauri et al 2019 (mio. m3 per yr) p73_forestry_demand_prod_specific(t_all,iso,total_wood_products) End product specific timber demand (mio. m3 per yr) pm_demand_forestry_future(t,i,kforestry) Future forestry demand in current time step (tDM per yr) -pm_demand_ext(t_ext,i,kforestry) Extended demand for timber beyound simulation (mio. tDM per yr) +pm_demand_forestry(t_ext,i,kforestry) Extended demand for timber beyound simulation (mio. tDM per yr) p73_demand_calib(t_all,i,kforestry) Additive calibration for timber demand (mio. m3 per yr) p73_glo_wood(t_all,kforestry) Global wood demand (mio. tDM per yr) p73_demand_modifier(t_all) Simple demand modifier for construction wood (mio. tDM per yr) diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index f9d5c41e16..e21e29a812 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -48,12 +48,12 @@ $endif ** Convert to tDM from mio m3 ** p73_timber_demand_gdp_pop is in mio m^3 -** pm_demand_ext in mio ton DM +** pm_demand_forestry in mio ton DM ** Hold constraint beyond 2150 - First every time step gets 2150 values **** Extend for Churkina et al 2020 demand scenarios -pm_demand_ext(t_ext,i,kforestry) = round(p73_timber_demand_gdp_pop("y2150",i,kforestry) * f73_volumetric_conversion(kforestry),3); +pm_demand_forestry(t_ext,i,kforestry) = round(p73_timber_demand_gdp_pop("y2150",i,kforestry) * f73_volumetric_conversion(kforestry),3); ** overwrite timesteps below 2150 with actual values -pm_demand_ext(t_all,i,kforestry) = round(p73_timber_demand_gdp_pop(t_all,i,kforestry) * f73_volumetric_conversion(kforestry),3); +pm_demand_forestry(t_all,i,kforestry) = round(p73_timber_demand_gdp_pop(t_all,i,kforestry) * f73_volumetric_conversion(kforestry),3); ** Initialize fraction p73_fraction(t_all) = s73_expansion/(m_year("y2100") - sm_fix_SSP2); @@ -81,18 +81,18 @@ if(s73_expansion = 0, ** In case using simple assumption for construction wood demand (based on industrial_roundwood demand) if(s73_expansion > 0, - p73_demand_constr_wood(t_all,i) = pm_demand_ext(t_all,i,"wood") * p73_fraction(t_all); + p73_demand_constr_wood(t_all,i) = pm_demand_forestry(t_all,i,"wood") * p73_fraction(t_all); ); ** Adjust industrial roundwood demand (construction wood demand is added on top) -pm_demand_ext(t_all,i,"wood") = pm_demand_ext(t_all,i,"wood") + p73_demand_constr_wood(t_all,i); +pm_demand_forestry(t_all,i,"wood") = pm_demand_forestry(t_all,i,"wood") + p73_demand_constr_wood(t_all,i); ** Keep demand after 2100 constant -pm_demand_ext(t_all,i,kforestry)$(m_year(t_all)>2100) = pm_demand_ext("y2100",i,kforestry); +pm_demand_forestry(t_all,i,kforestry)$(m_year(t_all)>2100) = pm_demand_forestry("y2100",i,kforestry); ** Calculate global demand -p73_glo_wood(t_all,kforestry) = sum(i,pm_demand_ext(t_all,i,kforestry)); +p73_glo_wood(t_all,kforestry) = sum(i,pm_demand_forestry(t_all,i,kforestry)); im_timber_prod_cost("wood") = s73_timber_prod_cost_wood; im_timber_prod_cost("woodfuel") = s73_timber_prod_cost_woodfuel; * initialize values for presolve of other modules -pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_demand_multiplier_hist; +pm_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry) * s73_demand_multiplier_hist; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index 4cca5213d3..58453706f5 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -11,10 +11,10 @@ if(s73_foresight=1, if(m_year(t) <= sm_fix_SSP2, - pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry) * s73_demand_multiplier_hist; + pm_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry) * s73_demand_multiplier_hist; else - pm_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_ext(t_ext,i,kforestry)); + pm_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_forestry(t_ext,i,kforestry)); ); else - pm_demand_forestry_future(t,i,kforestry) = pm_demand_ext(t,i,kforestry); + pm_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry); ); From b4f172bee20433c61b9068927ebbb3c7e14632f2 Mon Sep 17 00:00:00 2001 From: florianh Date: Sun, 19 May 2024 12:59:42 +0200 Subject: [PATCH 196/259] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1495dad620..95bb367324 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` - **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. - **scripts** start/test_runs.R added 2 more test runs from FSEC -- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24` +- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. Renamed `pm_demand_ext` to `pm_demand_forestry` - **default.cfg** ForestryEndo as default setting ### added From d53c8f2e18e908714485fd913e20bb5f06e23641 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 20 May 2024 12:00:51 +0200 Subject: [PATCH 197/259] updates --- CHANGELOG.md | 3 ++ config/default.cfg | 35 +++---------------- .../dynamic_may24/declarations.gms | 2 +- .../32_forestry/dynamic_may24/equations.gms | 6 ++-- modules/32_forestry/dynamic_may24/input.gms | 1 + modules/32_forestry/dynamic_may24/preloop.gms | 2 -- .../32_forestry/dynamic_may24/presolve.gms | 19 ++++++++-- modules/73_timber/default/declarations.gms | 3 +- modules/73_timber/default/input.gms | 2 -- modules/73_timber/default/preloop.gms | 3 -- modules/73_timber/default/presolve.gms | 13 ------- 11 files changed, 30 insertions(+), 59 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95bb367324..3379648a17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. - **scripts** start/test_runs.R added 2 more test runs from FSEC - **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. Renamed `pm_demand_ext` to `pm_demand_forestry` +- **32_forestry** renamed interface `pm_demand_ext` to `pm_demand_forestry` - **default.cfg** ForestryEndo as default setting ### added @@ -37,6 +38,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scripts** removed support for spam files in start_functions - **14_yields** removed interface `pm_timber_yield_initial`, no longer needed - **21_trade** removed interface `pm_selfsuff_ext`, no longer needed +- **32_forestry** removed interface `pm_representative_rotation`, no longer needed +- **73_timber** removed interface `pm_demand_forestry_future`, no longer needed ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs diff --git a/config/default.cfg b/config/default.cfg index 0dd4b9ba3e..3d98bfe386 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -882,23 +882,11 @@ cfg$gms$c32_interest_rate <- "regional" # def = "regional" # Accepted values between 0 and 1. cfg$gms$s32_forestry_int_rate <- 0.05 # def = 0.05 -# Scenarios for using FAO scenarios of future proportion of production coming from -# Timber plantations used for deciding how much establishment should be made in -# simulation time step. This setting is only used when s32_hvarea is set to 2 ("Endogenous") -# * ("abare") = Global outlook for plantations. Australian Bureau of Agriculture and Resource Economics (ABARE) and Jaakko Pöyry Consulting 1999 -# * ("brown") = The global outlook for future wood supply from forest plantations. Working paper GFPOS/WP/03 prepared for the 1999 Global Forest Products Outlook Study 1999 -cfg$gms$c32_dev_scen <- "abare" # def = "abare" - -# Scenarios for future development of timber production contribution to roundwood demand -# based on the settings from c32_dev_scen. -# * ("constant") = Constant share over time (1995-2250) -# * ("h5s5l5") = In every time step 5% increase from 1995 till 2020, 5% increase from 2025 till 2050, 5% increase from 2055 till 2250 -# * ("h5s2l2") = In every time step 5% increase from 1995 till 2020, 2% increase from 2025 till 2050, 2% increase from 2055 till 2250 -# * ("h5s2l1") = In every time step 5% increase from 1995 till 2020, 2% increase from 2025 till 2050, 1% increase from 2055 till 2250 -# * ("h5s1l1") = In every time step 5% increase from 1995 till 2020, 1% increase from 2025 till 2050, 1% increase from 2055 till 2250 -# * ("h5s1l05") = In every time step 5% increase from 1995 till 2020, 1% increase from 2025 till 2050, 0.5% increase from 2055 till 2250 -# * ("h2s1l05") = In every time step 2% increase from 1995 till 2020, 1% increase from 2025 till 2050, 0.5% increase from 2055 till 2250 -cfg$gms$c32_incr_rate <- "h5s2l1" # def = "h5s2l1" +# Setting to define if the model should be forward looking or not in terms of +# seeing the future demand for current timestep establishment of new plantations. +# * 0 = static (establishment based on current demand) +# * 1 = forward looking (establishment based on future demand according to rotation length) +cfg$gms$s32_demand_establishment <- 1 # def = 1 # Harvesting switch for timber production # * 0 = No harvested area from plantations, no age-class shifting (area held constant at 1995 levels) @@ -1867,19 +1855,6 @@ cfg$gms$timber <- "default" # def = default # * 0=off cfg$gms$s73_timber_demand_switch <- 1 # def = 1 -# Setting to define if the model should be forward looking or not in terms of -# seeing the future demand for current timestep establishment of new plantations -# in the forward setting, the model sees only current demand for establishment -# decisions in the historical time period but then sees future demand for non -# historic time periods. In myopic setting, the model sees always the current -# timber demand for establishment decisions. -# * 1 = forward looking. Model sees future demand for establishment in current step -# * 0 = myopic. Model sees current demand for establishment in current step -cfg$gms$s73_foresight <- 1 # def = 1 - -# * Multiplier for timber demand used in historic period to obtain the same future demand in all scenarios -cfg$gms$s73_demand_multiplier_hist <- 1.2 # def = 1.2 - # harvesting cost per ton of dry matter produced (USD/tDM) s73_timber_prod_cost <- 2000 # def = 2000 diff --git a/modules/32_forestry/dynamic_may24/declarations.gms b/modules/32_forestry/dynamic_may24/declarations.gms index 27cdb53d6d..4dc31991dc 100644 --- a/modules/32_forestry/dynamic_may24/declarations.gms +++ b/modules/32_forestry/dynamic_may24/declarations.gms @@ -42,7 +42,6 @@ parameters p32_rot_flg_faustmann(t_all,j,ac) Identifier flag when calculating faustmann rotation length (1) p32_rot_length_faustmann(t_all,j) Cellular Faustmann rotation length of plantations translated to age class equivalent (1) p32_ncells(i) Number of cells in each region (1) - pm_representative_rotation(t_all,i) Representative regional rotation (1) p32_aff_bgp(j,ac) Biophysical impact of afforestation (tCeq per ha) p32_tcre_glo(j) Global mean Transient Climate Response to cumulative Emissions (degree C per tC per ha) p32_avg_increment(t_all,j,ac) Mean annual increment (tC per ha per year) @@ -55,6 +54,7 @@ parameters p32_plant_contr(t,i) Share of roundwood production coming from timber plantations (percent) p32_forestry_product_dist(t,i,kforestry) Distribution of wood products (1) p32_future_to_current_demand_ratio(t,i) Ratio of future and current timber demand (1) + p32_demand_forestry_future(t,i,kforestry) Future forestry demand in current time step (tDM per yr) ; positive variables diff --git a/modules/32_forestry/dynamic_may24/equations.gms b/modules/32_forestry/dynamic_may24/equations.gms index 5143936da3..b658162cef 100644 --- a/modules/32_forestry/dynamic_may24/equations.gms +++ b/modules/32_forestry/dynamic_may24/equations.gms @@ -146,7 +146,7 @@ q32_cost_establishment(i2).. (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * s32_reESTBcost)) * sum(ct,pm_interest(ct,i2)/(1+pm_interest(ct,i2))) + sum((ct,kforestry), v32_prod_forestry_future(i2) * p32_forestry_product_dist(ct,i2,kforestry) * im_timber_prod_cost(kforestry)) - / ((1+sum(ct,pm_interest(ct,i2))**sum(ct, pm_representative_rotation(ct,i2)*5))); + / ((1+sum(ct,pm_interest(ct,i2))**sum(ct, p32_rotation_regional(ct,i2)*5))); *' Recurring costs are paid for plantations where the trees have to be regularly monitored @@ -161,7 +161,7 @@ q32_cost_recur(i2) .. v32_cost_recur(i2) =e= **** New establishment decision *------------------------------ *' New plantations are established in the optimization step based on a certain -*' percentage (`p32_plant_contr`) of expected future demand (`pm_demand_forestry_future`). +*' percentage (`p32_plant_contr`) of expected future demand (`p32_demand_forestry_future`). *' As plantation establishment decisions should *' also know some indication of expected future yields, we calculate how much yield *' newly established plantation can realize based on rotation lengths. This is defined as @@ -181,7 +181,7 @@ q32_prod_forestry_future(i2) .. q32_establishment_demand(i2)$s32_establishment_dynamic .. v32_prod_forestry_future(i2) =g= - sum((ct,kforestry), pm_demand_forestry_future(ct,i2,kforestry)) * sum(ct, p32_plant_contr(ct,i2)) + sum((ct,kforestry), p32_demand_forestry_future(ct,i2,kforestry)) * sum(ct, p32_plant_contr(ct,i2)) ; *' Harvested areas are fully re-established at cell level, unless the ratio of future and current demand drops below 1. diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index 354a7eefe3..2c6e29045a 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -52,6 +52,7 @@ scalars s32_plant_contr_growth_startvalue Start value for plantation contribution growth fader (percent per year) / 0.05 / s32_plant_contr_growth_endvalue End value for plantation contribution growth fader (percent per year) / 0 / s32_plant_contr_max Maximum plantation contribution for establishment decision (percent) / 0.5 / + s32_demand_establishment Boolean switch for establishment demand assumption 1=forward looking 0=static (1) / 1 / ; parameter f32_aff_mask(j) afforestation mask (binary) diff --git a/modules/32_forestry/dynamic_may24/preloop.gms b/modules/32_forestry/dynamic_may24/preloop.gms index db516cf8af..fceaa4d7b0 100644 --- a/modules/32_forestry/dynamic_may24/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -100,8 +100,6 @@ p32_ncells(i) = sum(cell(i,j),1); **** Representative regional rotation loop(t_all, p32_rotation_regional(t_all,i) = ceil(sum(cell(i,j), p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); -* pm_representative_rotation(t_all,i) = ord(t_all) + ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); - pm_representative_rotation(t_all,i) = ceil(sum(cell(i,j),p32_rot_length_ac_eqivalent(t_all,j))/p32_ncells(i)); ); ** Earlier we converted rotation lengths to absolute numbers, now we make the Conversion diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index bcbb5c8b3a..378f2ae164 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -173,10 +173,23 @@ else ); p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_contr_max; -p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) > 0) = pm_demand_forestry_future(t,i,kforestry) / sum(kforestry2, pm_demand_forestry_future(t,i,kforestry2)); -p32_forestry_product_dist(t,i,kforestry)$(pm_demand_forestry_future(t,i,kforestry) = 0) = 1/card(kforestry); +** demand for establishment decision depends on s32_demand_establishment: +** s32_demand_establishment = 0 static (establishment based on current demand) +** s32_demand_establishment = 1 forward looking (establishment based on future demand according to rotation length) +if(s32_demand_establishment = 1, + if(m_year(t) <= sm_fix_SSP2, + p32_demand_forestry_future(t,i,kforestry) = sum(t2$(m_year(t2) = sm_fix_SSP2), pm_demand_forestry(t2,i,kforestry)); + else + p32_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + p32_rotation_regional(t,i)),pm_demand_forestry(t_ext,i,kforestry)); + ); +else + p32_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry); + ); + +p32_forestry_product_dist(t,i,kforestry)$(p32_demand_forestry_future(t,i,kforestry) > 0) = p32_demand_forestry_future(t,i,kforestry) / sum(kforestry2, p32_demand_forestry_future(t,i,kforestry2)); +p32_forestry_product_dist(t,i,kforestry)$(p32_demand_forestry_future(t,i,kforestry) = 0) = 1/card(kforestry); -p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) > 0) = sum(kforestry, pm_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_forestry(t,i,kforestry)); +p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) > 0) = sum(kforestry, p32_demand_forestry_future(t,i,kforestry)) / sum(kforestry, pm_demand_forestry(t,i,kforestry)); p32_future_to_current_demand_ratio(t,i)$(sum(kforestry, pm_demand_forestry(t,i,kforestry)) = 0) = 0; * Avoid conflict between afforestation for carbon uptake on land and secdforest restoration diff --git a/modules/73_timber/default/declarations.gms b/modules/73_timber/default/declarations.gms index cc335849c3..67ced42c84 100644 --- a/modules/73_timber/default/declarations.gms +++ b/modules/73_timber/default/declarations.gms @@ -8,8 +8,7 @@ parameters p73_timber_demand_gdp_pop(t_all,i,kforestry) Timber demand based on lauri et al 2019 (mio. m3 per yr) p73_forestry_demand_prod_specific(t_all,iso,total_wood_products) End product specific timber demand (mio. m3 per yr) -pm_demand_forestry_future(t,i,kforestry) Future forestry demand in current time step (tDM per yr) -pm_demand_forestry(t_ext,i,kforestry) Extended demand for timber beyound simulation (mio. tDM per yr) +pm_demand_forestry(t_ext,i,kforestry) Extended demand for timber beyound simulation (mio. tDM per yr) p73_demand_calib(t_all,i,kforestry) Additive calibration for timber demand (mio. m3 per yr) p73_glo_wood(t_all,kforestry) Global wood demand (mio. tDM per yr) p73_demand_modifier(t_all) Simple demand modifier for construction wood (mio. tDM per yr) diff --git a/modules/73_timber/default/input.gms b/modules/73_timber/default/input.gms index b975c80f8a..a6b2c54eef 100644 --- a/modules/73_timber/default/input.gms +++ b/modules/73_timber/default/input.gms @@ -19,8 +19,6 @@ scalars s73_timber_prod_cost_woodfuel Cost for prodcing one unit of woodfuel (USD per tDM) / 60 / s73_free_prod_cost Very high cost for settling demand without production (USD per tDM) /20000/ s73_timber_demand_switch Logical switch to turn on or off timber demand 1=on 0=off (1) / 1 / - s73_foresight Boolean switch for establishment demand assumption 1=forward looking 0=myopic (1) / 1 / - s73_demand_multiplier_hist Multiplier used in historic period to obtain the same future demand in all scenarios / 1.2 / s73_increase_ceiling Limiter for not allowing a demand jump between time steps beyond a certain limit (1) /1.025/ s73_residue_ratio Proportion of overall industrial roundwood production which ends up as residue during harvest (1) / 0.15/ sm_wood_density Representative wood density based on IPCC (tDM per m3) /0.6/ diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index e21e29a812..8eed23dbf4 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -93,6 +93,3 @@ p73_glo_wood(t_all,kforestry) = sum(i,pm_demand_forestry(t_all,i,kforestry)); im_timber_prod_cost("wood") = s73_timber_prod_cost_wood; im_timber_prod_cost("woodfuel") = s73_timber_prod_cost_woodfuel; - -* initialize values for presolve of other modules -pm_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry) * s73_demand_multiplier_hist; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms index 58453706f5..f9600b871f 100644 --- a/modules/73_timber/default/presolve.gms +++ b/modules/73_timber/default/presolve.gms @@ -5,16 +5,3 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -** Current demand for establishment until 2020, after 2020 depending on s73_foresight -** s73_foresight=1 forward looking (establishment based on future demand), -** s73_foresight=0 myopic (establishment based on current demand) - -if(s73_foresight=1, - if(m_year(t) <= sm_fix_SSP2, - pm_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry) * s73_demand_multiplier_hist; - else - pm_demand_forestry_future(t,i,kforestry) = sum(t_ext$(t_ext.pos = t.pos + pm_representative_rotation(t,i)),pm_demand_forestry(t_ext,i,kforestry)); - ); -else - pm_demand_forestry_future(t,i,kforestry) = pm_demand_forestry(t,i,kforestry); - ); From 927413a3e4bad5ac724abcb6b624b3b71dab20bf Mon Sep 17 00:00:00 2001 From: Felicitas Date: Mon, 20 May 2024 12:43:49 +0200 Subject: [PATCH 198/259] updated Deep Dive script (temporary version) --- .../start/projects/project_EAT2p0_DeepDive.R | 161 ++++++++---------- 1 file changed, 68 insertions(+), 93 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 8f7649b8c7..eac1f29d16 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -177,15 +177,16 @@ start_run(cfg, codeCheck = FALSE) ### Composition ### # Mitigation components: # (1a) Nationally Determined Contributions (NDCs) -cfg$title <- "BAU_NDC" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -cfg <- bau(cfg = cfg) +#cfg$title <- "BAU_NDC" +#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +#cfg <- bau(cfg = cfg) # set path to bioenergy and prices to NDC run -cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC-rem-5/REMIND_generic_C_SSP2EU-NDC-rem-5.mif" -cfg$gms$c56_pollutant_prices <- "coupling" -cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC-rem-5/REMIND_generic_C_SSP2EU-NDC-rem-5.mif" -cfg$gms$c60_2ndgen_biodem <- "coupling" -start_run(cfg, codeCheck = FALSE) +#cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC-rem-5/REMIND_generic_C_SSP2EU-NDC-rem-5.mif" +#cfg$gms$c56_pollutant_prices <- "coupling" +#cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NDC-rem-5/REMIND_generic_C_SSP2EU-NDC-rem-5.mif" +#cfg$gms$c60_2ndgen_biodem <- "coupling" +#start_run(cfg, codeCheck = FALSE) +# Note: Exclude NDC run for now. Starting point is NPi and we do not look at policies, but only mitigation measures (demand side vs. supply side) # (1b) BAU + Bioenergy # # Decomposition Scenario. Adds bioenergy demand from coupled run with land-use policies consistent with 1.5C by 2050 to BAU @@ -224,12 +225,12 @@ start_run(cfg, codeCheck = FALSE) # BAU + EL2-Diet # # PHD components: -# (1e) Productivity -cfg$title <- "BAU_Prod" -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) -cfg <- bau(cfg = cfg) -cfg <- prod(cfg = cfg) -start_run(cfg, codeCheck = FALSE) +# (1e) Productivity +#cfg$title <- "BAU_Prod" +#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +#cfg <- bau(cfg = cfg) +#cfg <- prod(cfg = cfg) +#start_run(cfg, codeCheck = FALSE) # (1f) Waste cfg$title <- "BAU_Waste" @@ -245,12 +246,12 @@ cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# (1e,f,g) All Globally achieves EL2 (Diet+Waste+Prod) by 2050 -cfg$title <- "BAU_PHD" +# (1e,f,g) Demand-side options (Diet+Waste) by 2050 +cfg$title <- "BAU_Dem" cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -258,18 +259,18 @@ start_run(cfg, codeCheck = FALSE) ### Single measure Decomposition ### # (2a) MITI_NDC # # All production-side land-based mitigation measures and demand-side mitigation (diet change), but no NDCs -cfg$title <- "MITI_NDC" +#cfg$title <- "MITI_NDC" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings -cfg <- bau(cfg = cfg) +#cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) -cfg <- miti(cfg = cfg) +#cfg <- miti(cfg = cfg) # PHD (diet, prod, waste) -cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) -cfg <- waste(cfg = cfg) -start_run(cfg, codeCheck = FALSE) +#cfg <- diet(cfg = cfg) +#cfg <- prod(cfg = cfg) +#cfg <- waste(cfg = cfg) +#start_run(cfg, codeCheck = FALSE) # MITI_Bioenergy (mitigation - bioenergy) # # (2b) CO2 and non-CO2 pricing and demand-side mitigation (diet change), but no bioenergy demand from REMIND @@ -284,7 +285,7 @@ cfg$gms$c60_2ndgen_biodem <- "coupling" cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NPi-rem-5/REMIND_generic_C_SSP2EU-NPi-rem-5.mif" # PHD cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -301,7 +302,7 @@ cfg <- miti(cfg = cfg) cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" # PHD cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -318,7 +319,7 @@ cfg <- miti(cfg = cfg) cfg$gms$c56_emis_policy <- "ecoSysProtOff" # PHD cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) @@ -331,25 +332,25 @@ cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) # PHD (diet, prod, waste) cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) # MITI_Prod # # (2e) All production-side land-based mitigation measures and demand-side mitigation without Prod -cfg$title <- "MITI_Prod" +#cfg$title <- "MITI_Prod" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings -cfg <- bau(cfg = cfg) +#cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) -cfg <- miti(cfg = cfg) +#cfg <- miti(cfg = cfg) # PHD (diet, prod, waste) -cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) -cfg <- waste(cfg = cfg) -start_run(cfg, codeCheck = FALSE) +#cfg <- diet(cfg = cfg) +#cfg <- prod(cfg = cfg) +#cfg <- waste(cfg = cfg) +#start_run(cfg, codeCheck = FALSE) # MITI_Waste # # (2f) All production-side land-based mitigation measures and demand-side mitigation without Waste @@ -362,7 +363,7 @@ cfg <- bau(cfg = cfg) cfg <- miti(cfg = cfg) # PHD (diet, prod, waste) cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) start_run(cfg, codeCheck = FALSE) # MITI_Diet # @@ -375,13 +376,13 @@ cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) cfg <- miti(cfg = cfg) # PHD (diet, prod, waste) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) # MITI_PHD (mitigation - PHD) # -# (2e,f,g) All production-side land-based mitigation measures, but no demand-side mitigation (PHD) -cfg$title <- "MITI_PHD" +# (2e,f,g) All production-side land-based mitigation measures, but no demand-side mitigation +cfg$title <- "MITI_Dem" # standard setting, but with NDC for miti cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings @@ -390,69 +391,43 @@ cfg <- bau(cfg = cfg) cfg <- miti(cfg = cfg) start_run(cfg, codeCheck = FALSE) -### Stacked Decomposition ### -# (3a) Stacked 0: BAU_NPi (see above) - -# (3b) Stacked 1: BAU_NDC (see above) - -# (3c) Stacked 2: BAU_NDC_Bioenergy -cfg$title <- "Stacked2" -# standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -# BAU settings +### Combining demand-side changes with single mitigation measures ### +# (3b) Demand-side change + Bioenergy # +# Decomposition Scenario with demand-side changes. Adds bioenergy demand from coupled run with land-use policies consistent with 1.5C by 2050 to BAU +cfg$title <- "DEM_Bioenergy" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -# Mitigation (bioenergy) cfg <- bioenergy(cfg = cfg) +# Demand-side change (diet, waste) +cfg <- diet(cfg = cfg) +# cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# (3d) Stacked 3: BAU_NDC_Bioenergy_nCO2 -cfg$title <- "Stacked3" -# standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -# BAU settings +# (3c) Demand-side + NonCO2 pricing in land sector # +# Decomposition Scenario with demand-side changes. Adds non-CO2 pricing with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU +cfg$title <- "DEM_NonCO2" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -# Mitigation (non-CO2, bioenergy) -cfg <- bioenergy(cfg = cfg) cfg <- priceNonCO2(cfg = cfg) +# Demand-side change (diet, waste) +cfg <- diet(cfg = cfg) +# cfg <- prod(cfg = cfg) +cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# (3e) Stacked 4: BAU_NDC_Bioenergy_nCO2_CO2 -cfg$title <- "Stacked4" -# standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -# BAU settings -cfg <- bau(cfg = cfg) -# Mitigation (CO2, non-CO2, bioenergy) -cfg <- miti(cfg = cfg) -start_run(cfg, codeCheck = FALSE) - -# (3f) Stacked 5: BAU_NDC_Bioenergy_nCO2_CO2_prod -cfg$title <- "Stacked5" -# standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -# BAU settings -cfg <- bau(cfg = cfg) -# Mitigation (CO2, non-CO2, bioenergy) -cfg <- miti(cfg = cfg) -# PHD (diet, prod, waste) -cfg <- prod(cfg = cfg) -start_run(cfg, codeCheck = FALSE) - -# (3g) Stacked 6: BAU_NDC_Bioenergy_nCO2_CO2_prod_waste -cfg$title <- "Stacked6" -# standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -# BAU settings +# (3d) Demand-side + pricing of CO2 in land sector # +# Decomposition Scenario with demand-side changes. Adds CO2 pricing on land-use change emissions with ghg price from coupled run with land-use policies consistent with 1.5C by 2050 to BAU +cfg$title <- "DEM_CO2" +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) cfg <- bau(cfg = cfg) -# Mitigation (CO2, non-CO2, bioenergy) -cfg <- miti(cfg = cfg) -# PHD (diet, prod, waste) -cfg <- prod(cfg = cfg) +cfg <- priceCO2(cfg = cfg) +# Demand-side change (diet, waste) +cfg <- diet(cfg = cfg) +# cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) -# (3h) Stacked 7: BAU_NDC_Bioenergy_nCO2_CO2_prod_waste_diet (same as MITI_All, see below) - ### All measures ### # MITI_All # # All production-side land-based mitigation measures and demand-side mitigation (diet change) @@ -465,6 +440,6 @@ cfg <- bau(cfg = cfg) cfg <- miti(cfg = cfg) # PHD (diet, prod, waste) cfg <- diet(cfg = cfg) -cfg <- prod(cfg = cfg) +#cfg <- prod(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) From 03e7b255790884ae7e6bc568719b5f74c5fe7230 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 20 May 2024 18:28:34 +0200 Subject: [PATCH 199/259] update --- config/default.cfg | 9 +++++- .../managementcalib_aug19/declarations.gms | 2 -- .../14_yields/managementcalib_aug19/input.gms | 3 +- .../managementcalib_aug19/preloop.gms | 25 ---------------- .../managementcalib_aug19/presolve.gms | 30 +++++++------------ .../dynamic_may24/declarations.gms | 3 +- .../32_forestry/dynamic_may24/equations.gms | 6 ++-- modules/32_forestry/dynamic_may24/input.gms | 11 ++----- modules/32_forestry/dynamic_may24/preloop.gms | 4 +++ .../32_forestry/dynamic_may24/presolve.gms | 2 +- 10 files changed, 33 insertions(+), 62 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 3d98bfe386..68cb741fd5 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -332,7 +332,7 @@ cfg$gms$s14_use_yield_calib <- 0 # def = 0 # Include a minimum yield for wood harvest in secondary vegetation (tDM per ha per yr). # Age classes with wood yields below this threshold have a production of zero. -cfg$gms$s14_minimum_wood_yield <- 20 #def = 20 +cfg$gms$s14_minimum_wood_yield <- 10 #def = 10 # ***--------------------- 15_food --------------------------------------- # * (anthropometrics_jan18): estimates food using scenario dependent regression @@ -888,6 +888,13 @@ cfg$gms$s32_forestry_int_rate <- 0.05 # def = 0.05 # * 1 = forward looking (establishment based on future demand according to rotation length) cfg$gms$s32_demand_establishment <- 1 # def = 1 +# Establishment cost for plantations (USD per ha) +cfg$gms$s32_est_cost_plant <- 10000 # def = 10000 + +# Establishment cost for natural vegetation (USD per ha) +cfg$gms$s32_est_cost_natveg <- 2000 # def = 2000 + + # Harvesting switch for timber production # * 0 = No harvested area from plantations, no age-class shifting (area held constant at 1995 levels) # * This also means that no harvesting or establishment of new plantations takes place. diff --git a/modules/14_yields/managementcalib_aug19/declarations.gms b/modules/14_yields/managementcalib_aug19/declarations.gms index cb84ddfbbd..04d259f841 100644 --- a/modules/14_yields/managementcalib_aug19/declarations.gms +++ b/modules/14_yields/managementcalib_aug19/declarations.gms @@ -14,9 +14,7 @@ parameters i14_fao_yields_hist(t,i,kcr) FAO yields per region at the historical referende year (tDM per ha per yr) i14_lambda_yields(t,i,kcr) Scaling factor for non-linear management calibration (1) i14_managementcalib(t,j,kcr,w) Regional management calibration factor accounting for FAO yield levels (1) - p14_growing_stock(t,j,ac,forest_land,forest_type) Forest growing stock (tDM per ha per yr) pm_timber_yield(t,j,ac,forest_land) Forest growing stock (tDM per ha per yr) - p14_growing_stock_initial(j,ac,forest_land,forest_type) Initial Forest growing stock (tDM per ha per yr) pm_yields_semi_calib(j,kve,w) Potential yields calibrated to FAO regional levels (tDM per ha per yr) i14_calib_yields_hist(i,w) Calibrated yields average over region and crop type at the historical reference year (tDM per ha per yr) i14_calib_yields_ratio(i) Irrigated to rainfed yield ratio for calibrated yields (1) diff --git a/modules/14_yields/managementcalib_aug19/input.gms b/modules/14_yields/managementcalib_aug19/input.gms index 4677381139..8b3451220c 100644 --- a/modules/14_yields/managementcalib_aug19/input.gms +++ b/modules/14_yields/managementcalib_aug19/input.gms @@ -18,7 +18,7 @@ scalar s14_degradation Switch to include yield impacts of land degradation(0=n scalar s14_use_yield_calib Switch for using or not using yield calibration factors from the preprocessing (1=use facs 0=not use facs) / 0 /; -scalar s14_minimum_wood_yield Minimum wood yield for timber harvest in natural vegetation (tDM per ha per yr) / 20 /; +scalar s14_minimum_wood_yield Minimum wood yield for timber harvest in natural vegetation (tDM per ha per yr) / 10 /; scalars s14_yld_past_switch Spillover parameter for translating technological change in the crop sector into pasture yield increases (1) / 0.25 / @@ -26,7 +26,6 @@ scalars ; scalars - s14_timber_plantation_yield Plantation yield switch (0=natveg yields 1=plantation yields) (1) / 1 / s14_carbon_fraction Carbon fraction for conversion of biomass to dry matter (1) / 0.5/ ; diff --git a/modules/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index 9cac1c64cf..eaed90f248 100644 --- a/modules/14_yields/managementcalib_aug19/preloop.gms +++ b/modules/14_yields/managementcalib_aug19/preloop.gms @@ -184,28 +184,3 @@ if ((s14_degradation = 1), ); *' @stop - - -**** -**** -**** -p14_growing_stock_initial(j,ac,"forestry","plantations") = - ( - pm_carbon_density_ac_forestry("y1995",j,ac,"vegc") - / s14_carbon_fraction - * f14_aboveground_fraction("forestry") - / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"plantations")) - ) - ; - -p14_growing_stock_initial(j,ac,land_natveg,"natveg") = - ( - pm_carbon_density_ac("y1995",j,ac,"vegc") - / s14_carbon_fraction - * f14_aboveground_fraction(land_natveg) - / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) - ) - ; -**** Hard constraint to always have a positive number in p14_growing_stock -p14_growing_stock_initial(j,ac,land_natveg,"natveg") = p14_growing_stock_initial(j,ac,land_natveg,"natveg")$(p14_growing_stock_initial(j,ac,land_natveg,"natveg")>0)+0.0001$(p14_growing_stock_initial(j,ac,land_natveg,"natveg")=0); -p14_growing_stock_initial(j,ac,"forestry","plantations") = p14_growing_stock_initial(j,ac,"forestry","plantations")$(p14_growing_stock_initial(j,ac,"forestry","plantations")>0)+0.0001$(p14_growing_stock_initial(j,ac,"forestry","plantations")=0); diff --git a/modules/14_yields/managementcalib_aug19/presolve.gms b/modules/14_yields/managementcalib_aug19/presolve.gms index e9b652f06c..e1b795fa46 100644 --- a/modules/14_yields/managementcalib_aug19/presolve.gms +++ b/modules/14_yields/managementcalib_aug19/presolve.gms @@ -20,16 +20,17 @@ *' biomass in tDM/ha. *` @code -p14_growing_stock(t,j,ac,"forestry","plantations") = + +pm_timber_yield(t,j,ac,"forestry") = ( - pm_carbon_density_ac_forestry(t,j,ac,"vegc") - / s14_carbon_fraction - * f14_aboveground_fraction("forestry") - / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"plantations")) - ) + pm_carbon_density_ac_forestry(t,j,ac,"vegc") + / s14_carbon_fraction + * f14_aboveground_fraction("forestry") + / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"plantations")) + ) ; -p14_growing_stock(t,j,ac,land_natveg,"natveg") = +pm_timber_yield(t,j,ac,land_natveg) = ( pm_carbon_density_ac(t,j,ac,"vegc") / s14_carbon_fraction @@ -37,19 +38,10 @@ p14_growing_stock(t,j,ac,land_natveg,"natveg") = / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) ) ; -*` @stop -**** Hard constraint to always have a positive number in p14_growing_stock -p14_growing_stock(t,j,ac,land_natveg,"natveg") = p14_growing_stock(t,j,ac,land_natveg,"natveg")$(p14_growing_stock(t,j,ac,land_natveg,"natveg")>0)+0.0001$(p14_growing_stock(t,j,ac,land_natveg,"natveg")=0); -p14_growing_stock(t,j,ac,"forestry","plantations") = p14_growing_stock(t,j,ac,"forestry","plantations")$(p14_growing_stock(t,j,ac,"forestry","plantations")>0)+0.0001$(p14_growing_stock(t,j,ac,"forestry","plantations")=0); +*` @stop -** Used in equations -- Annual value hence division by timestep -*************************************************************** -** If the plantation yield switch is on, forestry yields are treated as plantation yields -pm_timber_yield(t,j,ac,"forestry")$(s14_timber_plantation_yield = 1) = p14_growing_stock(t,j,ac,"forestry","plantations") ; -** Natveg yields are unchanged and doesn't depend on plantation yield switch -pm_timber_yield(t,j,ac,land_natveg) = p14_growing_stock(t,j,ac,land_natveg,"natveg"); +** Hard constraint to always have a positive number in pm_timber_yield +pm_timber_yield(t,j,ac,forest_land) = pm_timber_yield(t,j,ac,forest_land)$(pm_timber_yield(t,j,ac,forest_land) > 0) + 0.0001$(pm_timber_yield(t,j,ac,forest_land) = 0); ** Put yields to 0 where they dont exceed a minimum yield for harvest pm_timber_yield(t,j,ac,land_natveg)$(pm_timber_yield(t,j,ac,land_natveg) < s14_minimum_wood_yield) = 0; -** If the plantation yield switch is off, then the forestry yields are given the same values as secdforest yields, -pm_timber_yield(t,j,ac,"forestry")$(s14_timber_plantation_yield = 0) = pm_timber_yield(t,j,ac,"secdforest"); diff --git a/modules/32_forestry/dynamic_may24/declarations.gms b/modules/32_forestry/dynamic_may24/declarations.gms index 4dc31991dc..6b679b0a4d 100644 --- a/modules/32_forestry/dynamic_may24/declarations.gms +++ b/modules/32_forestry/dynamic_may24/declarations.gms @@ -22,7 +22,7 @@ parameters p32_carbon_density_ac_marg(t_all,j,ac) Marginal above ground carbon density for age classes and carbon pools (tC per ha) p32_land(t,j,type32,ac) Forestry land for each cell wood type and age class before and after optimization (mio. ha) pc32_land(j,type32,ac) Forestry land per forestry land type initialization of the optimization (mio. ha) - pc32_yield_forestry_future(j) Cellular timber yield expected in the future (m3 per ha per year) + p32_yield_forestry_future(t,j) Cellular timber yield expected in the future (m3 per ha per year) p32_IGR(t_all,j,ac) Instantaneous growth rate or periodic annual increment of forest growth (1) p32_rot_flg(t_all,j,ac) Identifier flag when calculating rotation length (1) p32_rotation_regional(t_all,i) Regional average rotation length of plantations translated to age class equivalent for future (1) @@ -55,6 +55,7 @@ parameters p32_forestry_product_dist(t,i,kforestry) Distribution of wood products (1) p32_future_to_current_demand_ratio(t,i) Ratio of future and current timber demand (1) p32_demand_forestry_future(t,i,kforestry) Future forestry demand in current time step (tDM per yr) + p32_est_cost(type32) Establishment cost (USD per ha) ; positive variables diff --git a/modules/32_forestry/dynamic_may24/equations.gms b/modules/32_forestry/dynamic_may24/equations.gms index b658162cef..b3041e536a 100644 --- a/modules/32_forestry/dynamic_may24/equations.gms +++ b/modules/32_forestry/dynamic_may24/equations.gms @@ -143,7 +143,7 @@ q32_bv_plant(j2,potnatveg) .. vm_bv(j2,"plant",potnatveg) q32_cost_establishment(i2).. v32_cost_establishment(i2) =e= - (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * s32_reESTBcost)) + (sum((cell(i2,j2),type32,ac_est), v32_land(j2,type32,ac_est) * p32_est_cost(type32))) * sum(ct,pm_interest(ct,i2)/(1+pm_interest(ct,i2))) + sum((ct,kforestry), v32_prod_forestry_future(i2) * p32_forestry_product_dist(ct,i2,kforestry) * im_timber_prod_cost(kforestry)) / ((1+sum(ct,pm_interest(ct,i2))**sum(ct, p32_rotation_regional(ct,i2)*5))); @@ -165,7 +165,7 @@ q32_cost_recur(i2) .. v32_cost_recur(i2) =e= *' As plantation establishment decisions should *' also know some indication of expected future yields, we calculate how much yield *' newly established plantation can realize based on rotation lengths. This is defined as -*' the expected future yield (`pc32_yield_forestry_future`) at harvest. +*' the expected future yield (`p32_yield_forestry_future`) at harvest. *' Future expected production is calculated for the establishment decision below and the costs above *' based on newly established areas and expected future yields. @@ -173,7 +173,7 @@ q32_cost_recur(i2) .. v32_cost_recur(i2) =e= q32_prod_forestry_future(i2) .. v32_prod_forestry_future(i2) =e= - sum(cell(i2,j2), (sum(ac_est, v32_land(j2,"plant",ac_est)) + v32_land_missing(j2)) * pc32_yield_forestry_future(j2)) / m_timestep_length_forestry + sum(cell(i2,j2), (sum(ac_est, v32_land(j2,"plant",ac_est)) + v32_land_missing(j2)) * sum(ct, p32_yield_forestry_future(ct,j2))) / m_timestep_length_forestry ; *' Future expected production has to be equal or larger than future demand multiplied with the plantation contribution factor. diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index 2c6e29045a..cf93880505 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -4,8 +4,6 @@ *** | AGPL-3.0, you are granted additional permissions described in the *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -$setglobal c32_timber_plantations plantations -* option: natveg, plantations $setglobal c32_aff_mask noboreal * options: unrestricted, noboreal, onlytropical $setglobal c32_aff_policy npi @@ -16,10 +14,6 @@ $setglobal c32_tcre_ctrl ann_TCREmean * options: ann_TCREmean, ann_TCREhigh, ann_TCRElow $setglobal c32_interest_rate regional * options regional, global -$setglobal c32_dev_scen abare -* options abare, brown -$setglobal c32_incr_rate h5s2l1 -* options constant,h5s5l5,h5s2l2,h5s2l1,h5s1l1,h5s1l05,h2s1l05 $setglobal c32_rot_calc_type current_annual_increment * option max_increment, max_npv $setglobal c32_rot_calc_type current_annual_increment @@ -30,9 +24,10 @@ $setglobal c32_shock_scenario none scalars s32_hvarea Flag for harvested area and establishemt (0=zero 1=exognous 2=endogneous) / 2 / - s32_reESTBcost Re establishment cost (USD per ha) / 2000 / + s32_est_cost_plant Establishment cost for plantations (USD per ha) / 10000 / + s32_est_cost_natveg Establishment cost for natural vegetation (USD per ha) / 2000 / s32_recurring_cost Recurring costs (USD per ha) / 500 / - s32_harvesting_cost Harvesting cost (USD per ha) / 1000 / + s32_harvesting_cost Harvesting cost (USD per ha) / 2000 / s32_planing_horizon Afforestation planing horizon (years) / 50 / s32_rotation_extension Rotation extension factor 1=original rotations 2=100 percent increase in rotations etc (1) / 1 / s32_faustmann_rotation Switch to activate faustmann rotations (1=on 0=off) / 0 / diff --git a/modules/32_forestry/dynamic_may24/preloop.gms b/modules/32_forestry/dynamic_may24/preloop.gms index fceaa4d7b0..0b08ad4822 100644 --- a/modules/32_forestry/dynamic_may24/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -8,6 +8,10 @@ *m_sigmoid_time_interpol(i32_plant_contr_fader,2020,2050,0.05,0); m_sigmoid_time_interpol(i32_plant_contr_growth_fader,s32_plant_contr_growth_startyear,s32_plant_contr_growth_endyear,s32_plant_contr_growth_startvalue,s32_plant_contr_growth_endvalue); +p32_est_cost("plant") = s32_est_cost_plant; +p32_est_cost("ndc") = s32_est_cost_natveg; +p32_est_cost("aff") = s32_est_cost_natveg$(s32_aff_plantation = 0) + s32_est_cost_plant$(s32_aff_plantation = 1); + ** Calculation of Single rotation model rotation lengths ** Using forestry carbon densitiy here via carbon density data exchange from carbon module. p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_ac_forestry(t_all,j,ac,"vegc"); diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 378f2ae164..b8585fe52f 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -160,7 +160,7 @@ v32_land.fx(j,"aff",ac_est)$(fm_carbon_density(t,j,"forestry","vegc") <= 20) = 0 m_boundfix(v32_land,(j,type32,ac_sub),up,1e-6); ** Calculate future yield based on rotation length -pc32_yield_forestry_future(j) = sum(ac$(ac.off = p32_rotation_cellular_estb(t,j)), pm_timber_yield(t,j,ac,"forestry")); +p32_yield_forestry_future(t,j) = sum(ac$(ac.off = p32_rotation_cellular_estb(t,j)), pm_timber_yield(t,j,ac,"forestry")); * Fader for plantation share in establishment decision if(ord(t) = 1, From ebb9bb4331ff9f59833583c6c470b7371eda1b34 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 20 May 2024 22:12:16 +0200 Subject: [PATCH 200/259] update --- CHANGELOG.md | 1 + config/default.cfg | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3379648a17..2bd2494082 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. Renamed `pm_demand_ext` to `pm_demand_forestry` - **32_forestry** renamed interface `pm_demand_ext` to `pm_demand_forestry` - **default.cfg** ForestryEndo as default setting +- **14_yields** revised timber yield calculations ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` diff --git a/config/default.cfg b/config/default.cfg index 68cb741fd5..e0a187b8d4 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -894,7 +894,6 @@ cfg$gms$s32_est_cost_plant <- 10000 # def = 10000 # Establishment cost for natural vegetation (USD per ha) cfg$gms$s32_est_cost_natveg <- 2000 # def = 2000 - # Harvesting switch for timber production # * 0 = No harvested area from plantations, no age-class shifting (area held constant at 1995 levels) # * This also means that no harvesting or establishment of new plantations takes place. From 23866378797d25ad3fdec3d95f3059d38f57bae5 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 20 May 2024 22:23:19 +0200 Subject: [PATCH 201/259] updates --- CHANGELOG.md | 9 +++++---- config/default.cfg | 9 ++++----- modules/21_trade/exo/equations.gms | 12 +++--------- .../21_trade/selfsuff_reduced_bilateral22/input.gms | 1 + .../selfsuff_reduced_bilateral22/preloop.gms | 3 +++ 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bd2494082..cc6220373a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,14 +33,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scripts** added start scripts for the GENIE project - **scenario_config.csv** added preset for GENIE project - **default.cfg** cfg$gms$s80_secondsolve option for second solve statement with 0=off as default +- **21_trade** Minimum trade margin for forestry products `s21_min_trade_margin_forestry` ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions - **scripts** removed support for spam files in start_functions -- **14_yields** removed interface `pm_timber_yield_initial`, no longer needed -- **21_trade** removed interface `pm_selfsuff_ext`, no longer needed -- **32_forestry** removed interface `pm_representative_rotation`, no longer needed -- **73_timber** removed interface `pm_demand_forestry_future`, no longer needed +- **14_yields** removed interface `pm_timber_yield_initial` +- **21_trade** removed interface `pm_selfsuff_ext`, removed `v21_manna_from_heaven` +- **32_forestry** removed interface `pm_representative_rotation` +- **73_timber** removed interface `pm_demand_forestry_future` ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs diff --git a/config/default.cfg b/config/default.cfg index e0a187b8d4..750d8ba722 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -573,11 +573,6 @@ cfg$gms$c20_scp_type <- "sugar" # def = sugar # * (selfsuff_reduced_bilateral22): same as `selfsuff_reduced` but with bilateral trade flows cfg$gms$trade <- "selfsuff_reduced" # def = selfsuff_reduced -# * option for `exo` realization only: -# * fix `v21_manna_from_heaven` to zero (0) or not (1) -# Note: Without fixing to zero, v21_manna_from_heaven might be used unnecessarily in runs started with highres.R -cfg$gms$s21_manna_from_heaven <- 0 - # * options for `selfsuff_reduced` and `selfsuff_reduced_bilateral22` realizations: # * Commodities that can have additional imports to maintain feasibility cfg$gms$k_import21 <- "wood, woodfuel" @@ -615,6 +610,10 @@ cfg$gms$s21_trade_tariff_startyear <- 2020 # * end year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2050 cfg$gms$s21_trade_tariff_targetyear <- 2050 +# * Minimum trade margin for forestry products (USD05MER per tDM) +cfg$gms$s21_min_trade_margin_forestry <- 50 # def = 50 + + # ***--------------------- 22_land_conservation -------------------------------------- # * (area_based_apr22): Area-based conservation (baseline and future) # * based on WDPA and conservation priority areas diff --git a/modules/21_trade/exo/equations.gms b/modules/21_trade/exo/equations.gms index c463ace64c..d84819634e 100644 --- a/modules/21_trade/exo/equations.gms +++ b/modules/21_trade/exo/equations.gms @@ -5,15 +5,9 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de +*' The regional production must be larger than the regional demand plus exports +*' from that region (or minus imports in case of a negative trade balance). + q21_notrade(h2,kall).. sum(supreg(h2,i2),vm_prod_reg(i2,kall)) =g= sum(supreg(h2,i2), vm_supply(i2,kall)) + sum(ct,f21_trade_balance(ct,h2,kall)); - - -*' The regional production must be bigger than the regional demand plus exports -*' from that region (or minus imports in case of a negative trade balance). As -*' the trade balance in this realization is exogenously defined there is the -*' imminent risk of infeasibilities. To get results even in case of infeasble -*' trade balance conditions `v21_manna_from_heaven` is introduced. It is an -*' unlimited, but heavily expensive resource which can be used as last resort, -*' if in any other case the model would become infeasible. diff --git a/modules/21_trade/selfsuff_reduced_bilateral22/input.gms b/modules/21_trade/selfsuff_reduced_bilateral22/input.gms index 75dc72a26f..52055626c4 100644 --- a/modules/21_trade/selfsuff_reduced_bilateral22/input.gms +++ b/modules/21_trade/selfsuff_reduced_bilateral22/input.gms @@ -19,6 +19,7 @@ scalars s21_trade_tariff_startyear year to start fading out trade tariffs / 2020 / s21_trade_tariff_targetyear year to finish fading out trade tariffs / 2050 / s21_cost_import Cost for additional imports to maintain feasibility (USD05MER per tDM) / 10000 / + s21_min_trade_margin_forestry Minimum trade margin for forestry products (USD05MER per tDM) / 50 / ; table f21_trade_bal_reduction(t_all,trade_groups21,trade_regime21) Share of inelastic trade pool (1) diff --git a/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms b/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms index 5d60440200..9f56067666 100644 --- a/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms +++ b/modules/21_trade/selfsuff_reduced_bilateral22/preloop.gms @@ -26,6 +26,9 @@ i21_trade_tariff(t_all,i_ex,i_im,k_trade)$(m_year(t_all) >= s21_trade_tariff_tar ); ); +i21_trade_margin(h,"wood")$(i21_trade_margin(h,"wood") < s21_min_trade_margin_forestry) = s21_min_trade_margin_forestry; +i21_trade_margin(h,"woodfuel")$(i21_trade_margin(h,"woodfuel") < s21_min_trade_margin_forestry) = s21_min_trade_margin_forestry; + v21_import_for_feasibility.fx(h,k_trade) = 0; v21_import_for_feasibility.lo(h,k_import21) = 0; v21_import_for_feasibility.up(h,k_import21) = Inf; From ddc4b9063cd8998e9d22d7e4af946bc33b0046ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Humpen=C3=B6der?= Date: Tue, 21 May 2024 09:15:54 +0200 Subject: [PATCH 202/259] Update CHANGELOG.md Co-authored-by: Jan Dietrich --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc6220373a..b8962e24a0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` - **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. - **scripts** start/test_runs.R added 2 more test runs from FSEC -- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. Renamed `pm_demand_ext` to `pm_demand_forestry` +- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. - **32_forestry** renamed interface `pm_demand_ext` to `pm_demand_forestry` - **default.cfg** ForestryEndo as default setting - **14_yields** revised timber yield calculations From ee2ceac7ce36b808825c87761eebaeb0c15b9b50 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 21 May 2024 09:25:06 +0200 Subject: [PATCH 203/259] update changelog --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8962e24a0..0e7a315cc0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scripts** start/test_runs.R added 2 more test runs from FSEC - **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. - **32_forestry** renamed interface `pm_demand_ext` to `pm_demand_forestry` -- **default.cfg** ForestryEndo as default setting +- **default.cfg** Forestry sector included by default by using the `ForestryEndo` settings from `scenario_config.csv`: `s32_initial_distribution = 1`, `s32_demand_establishment = 1`, `s32_hvarea = 2`, `s35_secdf_distribution = 2`, `s35_hvarea = 2`, `s73_timber_demand_switch = 1` - **14_yields** revised timber yield calculations ### added @@ -42,6 +42,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **21_trade** removed interface `pm_selfsuff_ext`, removed `v21_manna_from_heaven` - **32_forestry** removed interface `pm_representative_rotation` - **73_timber** removed interface `pm_demand_forestry_future` +- **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs @@ -51,7 +52,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **start/projects/fsec.R** scenario settings - **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working - **58_peatland** Added balance variable to avoid random infeasibilites -- **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` ## [4.7.3] - 2024-04-12 From 2e4d1b19110546c1a5da751d61b2bf35b4c7b895 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 21 May 2024 10:14:34 +0200 Subject: [PATCH 204/259] doc and clean-up --- CHANGELOG.md | 3 ++- modules/21_trade/module.gms | 2 +- modules/32_forestry/dynamic_may24/equations.gms | 6 +++--- modules/32_forestry/dynamic_may24/realization.gms | 12 ++++++------ modules/35_natveg/dynamic_feb21/declarations.gms | 2 -- modules/35_natveg/dynamic_feb21/input.gms | 7 ------- modules/35_natveg/dynamic_feb21/presolve.gms | 8 -------- modules/35_natveg/input/files | 1 - modules/73_timber/default/equations.gms | 15 +++++++-------- modules/73_timber/default/input.gms | 7 +++---- modules/73_timber/default/presolve.gms | 7 ------- modules/73_timber/default/realization.gms | 11 ++++------- modules/73_timber/module.gms | 9 ++++----- 13 files changed, 30 insertions(+), 60 deletions(-) delete mode 100644 modules/73_timber/default/presolve.gms diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e7a315cc0..b96eaaa4c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scenario_config.csv** added preset for GENIE project - **default.cfg** cfg$gms$s80_secondsolve option for second solve statement with 0=off as default - **21_trade** Minimum trade margin for forestry products `s21_min_trade_margin_forestry` +- **73_timber** added interface `im_timber_prod_cost` ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions @@ -41,7 +42,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **14_yields** removed interface `pm_timber_yield_initial` - **21_trade** removed interface `pm_selfsuff_ext`, removed `v21_manna_from_heaven` - **32_forestry** removed interface `pm_representative_rotation` -- **73_timber** removed interface `pm_demand_forestry_future` +- **73_timber** removed interfaces `pm_demand_forestry_future` and `sm_wood_density` - **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` ### fixed diff --git a/modules/21_trade/module.gms b/modules/21_trade/module.gms index f50e59d819..c38f8d8d64 100644 --- a/modules/21_trade/module.gms +++ b/modules/21_trade/module.gms @@ -7,7 +7,7 @@ *' @title Agricultural trade *' -*' @description This module represents agricutlural trade among world regions. +*' @description This module represents agricultural trade among world regions. *' It ensures that the regional demand is met by domestic production and imports from other regions. *' The global trade balance dictates that global production must be larger than or equal to global demand. *' For non-traded goods, the regional production must be larger than or equal to regional demand. diff --git a/modules/32_forestry/dynamic_may24/equations.gms b/modules/32_forestry/dynamic_may24/equations.gms index b3041e536a..e3ad87cf1a 100644 --- a/modules/32_forestry/dynamic_may24/equations.gms +++ b/modules/32_forestry/dynamic_may24/equations.gms @@ -150,15 +150,15 @@ q32_cost_establishment(i2).. *' Recurring costs are paid for plantations where the trees have to be regularly monitored -*' and maintained. These costs are only calculated becuase we see active human intervention +*' and maintained. These costs are only calculated because we see active human intervention *' in commercial plantations. These costs are paid for trees used for timber production or -*' trees established for afforestation purposes. +*' trees established for re/afforestation purposes. q32_cost_recur(i2) .. v32_cost_recur(i2) =e= sum((cell(i2,j2),type32,ac_sub), v32_land(j2,type32,ac_sub)) * s32_recurring_cost; -**** New establishment decision +**** Plantation establishment decision *------------------------------ *' New plantations are established in the optimization step based on a certain *' percentage (`p32_plant_contr`) of expected future demand (`p32_demand_forestry_future`). diff --git a/modules/32_forestry/dynamic_may24/realization.gms b/modules/32_forestry/dynamic_may24/realization.gms index 233c1f8ee4..dd607eee92 100644 --- a/modules/32_forestry/dynamic_may24/realization.gms +++ b/modules/32_forestry/dynamic_may24/realization.gms @@ -5,15 +5,15 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -*' @description The main feature of the this realization is afforestation for CDR -*' and timber production. Afforestation can be modelled exogenously (prescribed +*' @description The main features of the this realization are re/afforestation for CDR +*' and timber production. Re/afforestation can be modelled exogenously (prescribed *' by NPI/NDC policies) and/or endogenously (incentivized by a reward for CDR). *' National policies implemented (NPI) and nationally determined contributions to -*' the Paris agreement (NDC) for afforestation are based on country reports. The +*' the Paris agreement (NDC) for re/afforestation are based on country reports. The *' interface `vm_cdr_aff` includes the expected CDR and local bph effects from -*' afforestation depending on the planning horizon `s32_planing_horizon`. The -*' reward for CDR and local bph effects from afforestation is calculated in the -*' [56_ghg_policy] module. In this realization, afforestation is modeled by default +*' re/afforestation depending on the planning horizon `s32_planing_horizon`. The +*' reward for CDR and local bph effects from re/afforestation is calculated in the +*' [56_ghg_policy] module. In this realization, re/afforestation is modeled by default *' as regrowth of natural vegetation (see @humpenoder_investigating_2014 for details on the implemenation). *' The regrowth of natural vegetation follows S-shaped growth curves, which are *' parametrized based on @braakhekke_modelling_2019. Additionally this module diff --git a/modules/35_natveg/dynamic_feb21/declarations.gms b/modules/35_natveg/dynamic_feb21/declarations.gms index e949a349a4..e56a8dde9a 100644 --- a/modules/35_natveg/dynamic_feb21/declarations.gms +++ b/modules/35_natveg/dynamic_feb21/declarations.gms @@ -26,8 +26,6 @@ parameters p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) i35_plantedclass_ac(j,ac) Area of age-classes in secondary forest (1) p35_poulter_dist(j,ac) Share of age-classes in secondary forest (1) - p35_land(t,j,land_natveg,ac) Natural vegetation area (mio. ha) - p35_updated_gs_natfor(t,i) Updated growing stock in natural forests after calibration (m3 per ha) p35_land_start_ac(j,ac,land_natveg) Initial Natural vegetation area (mio. ha) p35_protection_dist(j,ac) Distribution of secondary forest protection (1) p35_land_restoration(j,land_natveg) Actual secondary forest and other land restoration area (mio. ha) diff --git a/modules/35_natveg/dynamic_feb21/input.gms b/modules/35_natveg/dynamic_feb21/input.gms index 4704e30dd2..2e8ff828cc 100644 --- a/modules/35_natveg/dynamic_feb21/input.gms +++ b/modules/35_natveg/dynamic_feb21/input.gms @@ -47,10 +47,3 @@ $ondelim $include "./modules/35_natveg/input/f35_forest_disturbance_share.cs4" $offdelim /; - -parameter f35_gs_relativetarget(i) Relative growing stock target in each region (m3 per ha) -/ -$ondelim -$include "./modules/35_natveg/input/f35_gs_relativetarget.cs4" -$offdelim -/; diff --git a/modules/35_natveg/dynamic_feb21/presolve.gms b/modules/35_natveg/dynamic_feb21/presolve.gms index 97a6f33b35..dd9c94c7cc 100644 --- a/modules/35_natveg/dynamic_feb21/presolve.gms +++ b/modules/35_natveg/dynamic_feb21/presolve.gms @@ -173,14 +173,6 @@ p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); -** Display -p35_land(t,j,land_natveg,ac) = 0; -p35_land(t,j,"primforest","acx") = pcm_land(j,"primforest"); -p35_land(t,j,"secdforest",ac) = p35_secdforest(t,j,ac); -*p35_land(t,j,"other",ac) = p35_other(t,j,ac): -p35_updated_gs_natfor(t,i) = 0; -p35_updated_gs_natfor(t,i)$(sum((cell(i,j),ac,land_natveg), p35_land(t,j,land_natveg,ac))>0) = (sum((cell(i,j),ac,land_natveg),(pm_timber_yield(t,j,ac,land_natveg) / sm_wood_density) * p35_land(t,j,land_natveg,ac))/ sum((cell(i,j),ac,land_natveg), p35_land(t,j,land_natveg,ac))); - ** Youngest age classes are not allowed to be harvested v35_hvarea_secdforest.fx(j,ac_est) = 0; v35_hvarea_other.fx(j,ac_est) = 0; diff --git a/modules/35_natveg/input/files b/modules/35_natveg/input/files index f1603f4a64..994bc46a69 100644 --- a/modules/35_natveg/input/files +++ b/modules/35_natveg/input/files @@ -2,5 +2,4 @@ npi_ndc_ad_aolc_pol.cs3 f35_forest_disturbance_share.cs4 f35_forest_lost_share.cs3 -f35_gs_relativetarget.cs4 f35_forest_shock.csv diff --git a/modules/73_timber/default/equations.gms b/modules/73_timber/default/equations.gms index d78bdb9177..0b062cc877 100644 --- a/modules/73_timber/default/equations.gms +++ b/modules/73_timber/default/equations.gms @@ -8,8 +8,8 @@ *' @equations *' Timber production cost include the cost for producing wood, woodfuel and residues, -*' as well as additional costs for harvesting (see below) and technical costs for -*' a slack variable ('v73_prod_heaven_timber'). The slack variable (high costs) +*' and technical costs for a slack variable ('v73_prod_heaven_timber'). +*' The slack variable (high costs) *' is only used as a last resort when there is no other way to meet the timber *' demand. The purpose of the slack variable is to assure technically feasibility *' of the model under all conditions and to indicate shortage of wood supply, if any. @@ -17,15 +17,14 @@ q73_cost_timber(i2).. vm_cost_timber(i2) =e= - sum(cell(i2,j2), vm_prod(j2,"wood")) * s73_timber_prod_cost_wood - + sum(cell(i2,j2), vm_prod(j2,"woodfuel")) * s73_timber_prod_cost_woodfuel - + sum(cell(i2,j2), v73_prod_residues(j2)) * s73_reisdue_removal_cost + sum((cell(i2,j2),kforestry), vm_prod(j2,kforestry) * im_timber_prod_cost(kforestry)) + + sum(cell(i2,j2), v73_prod_residues(j2)) * s73_reisdue_removal_cost + sum((cell(i2,j2),kforestry), v73_prod_heaven_timber(j2,kforestry) * s73_free_prod_cost) ; *' The following equations describes cellular level production (in dry matter) of -*' woody biomass `vm_prod_reg` as the sum of the cluster level production of -*' timber coming from 'v73_prod_forestry' and 'v73_prod_natveg'. When production +*' woody biomass `vm_prod` as the sum of the cluster level production of +*' timber coming from 'vm_prod_forestry' and 'vm_prod_natveg'. When production *' capabilities are exhausted, the model can produce roundwood without using any *' land resources but by paying a very high cost ('s73_free_prod_cost'). *' Timber production equation is split in two parts, one each for industrial roundwood @@ -57,7 +56,7 @@ q73_prod_woodfuel(j2).. *' of industrial roundwood production is assumed to be lost during harvesting processes. *' USDA reports that ca. 30% of roundwood harvested are residues (@oswalt2019forest). *' Not all of this residue is recoverwed from forest and we assume 50% of residue -*' removal based on @pokharel2017factors. These numebrs (residue levels and residude +*' removal based on @pokharel2017factors. These numbers (residue levels and residude *' removals vary strongly among different studies, the numbers used here are from *' a USDA report on state of forests in USA which has consistent reporting over years) diff --git a/modules/73_timber/default/input.gms b/modules/73_timber/default/input.gms index a6b2c54eef..91d789b5a2 100644 --- a/modules/73_timber/default/input.gms +++ b/modules/73_timber/default/input.gms @@ -17,11 +17,10 @@ scalars * https://unece.org/forests/prices s73_timber_prod_cost_wood Cost for producing one unit of wood (USD per tDM) / 120 / s73_timber_prod_cost_woodfuel Cost for prodcing one unit of woodfuel (USD per tDM) / 60 / - s73_free_prod_cost Very high cost for settling demand without production (USD per tDM) /20000/ + s73_free_prod_cost Very high cost for settling demand without production (USD per tDM) / 20000 / s73_timber_demand_switch Logical switch to turn on or off timber demand 1=on 0=off (1) / 1 / - s73_increase_ceiling Limiter for not allowing a demand jump between time steps beyond a certain limit (1) /1.025/ - s73_residue_ratio Proportion of overall industrial roundwood production which ends up as residue during harvest (1) / 0.15/ - sm_wood_density Representative wood density based on IPCC (tDM per m3) /0.6/ + s73_increase_ceiling Limiter for not allowing a demand jump between time steps beyond a certain limit (1) / 1.025 / + s73_residue_ratio Proportion of overall industrial roundwood production which ends up as residue during harvest (1) / 0.15 / s73_reisdue_removal_cost Cost of removing residues left after industrial roundwood harvest (USD per tDM) / 2 / s73_expansion Construction wood demand expansion factor by end of century based on industrial roundwood demand as base (1=100 percent increase) / 0 / ; diff --git a/modules/73_timber/default/presolve.gms b/modules/73_timber/default/presolve.gms deleted file mode 100644 index f9600b871f..0000000000 --- a/modules/73_timber/default/presolve.gms +++ /dev/null @@ -1,7 +0,0 @@ -*** | (C) 2008-2024 Potsdam Institute for Climate Impact Research (PIK) -*** | authors, and contributors see CITATION.cff file. This file is part -*** | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of -*** | AGPL-3.0, you are granted additional permissions described in the -*** | MAgPIE License Exception, version 1.0 (see LICENSE file). -*** | Contact: magpie@pik-potsdam.de - diff --git a/modules/73_timber/default/realization.gms b/modules/73_timber/default/realization.gms index 3e091e309d..571cb987fb 100644 --- a/modules/73_timber/default/realization.gms +++ b/modules/73_timber/default/realization.gms @@ -5,15 +5,13 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -*' @description biomass_mar20 realization acts as a common tunnel for land related -*' decisions in forestry [32_forestry] and natveg [35_natveg] modules and corresponding -*' production of woody biomass realized. This realization harvests timber from -*' available plantations to meet a portion of overall timber demand. Rest of the timber -*' production comes by harvesting natural vegetation. Aggregated timber demand for -*' wood and woodfuel is calculated based on demand equation from @lauri_timber_demand +*' @description In this realization, aggregated timber demand for wood and woodfuel +*' `pm_demand_forestry` is calculated based on demand equation from @lauri_timber_demand *' and income elasticities from @morland2018supply. See @mishra_forestry_2021 for more details. *' This realization can also account for construction wood demand based on *' @churkina2020buildings which is added on top of industrial roundwood demand (see @mishra_timbercities_2022). +*' Timber can be produced from both timber plantations `vm_prod_forestry` provided by [32_forestry] +*' and natural vegetation `vm_prod_natveg` provided by [35_natveg]. *' @limitations Timber demand cannot be determined endogenously @@ -24,6 +22,5 @@ $Ifi "%phase%" == "input" $include "./modules/73_timber/default/input.gms" $Ifi "%phase%" == "equations" $include "./modules/73_timber/default/equations.gms" $Ifi "%phase%" == "scaling" $include "./modules/73_timber/default/scaling.gms" $Ifi "%phase%" == "preloop" $include "./modules/73_timber/default/preloop.gms" -$Ifi "%phase%" == "presolve" $include "./modules/73_timber/default/presolve.gms" $Ifi "%phase%" == "postsolve" $include "./modules/73_timber/default/postsolve.gms" *######################## R SECTION END (PHASES) ############################### diff --git a/modules/73_timber/module.gms b/modules/73_timber/module.gms index 6da09b4853..cbaad3d3fb 100644 --- a/modules/73_timber/module.gms +++ b/modules/73_timber/module.gms @@ -7,11 +7,10 @@ *' @title Timber *' -*' @description This module handles the production of timber using plantations [32_forestry] -*' and natural vegetation [35_natveg]. Timber can be produced from both commercial plantations -*' and natural forests. The module feeds `vm_prod` at cluster level to [17_production] and -*' [21_trade] modules. This module also calculates the "real" harvested area in natural -*' forests i.e. `v35_hvarea_primforest`,`v35_hvarea_secdforest` and `v73_hvarea_other`. +*' @description This module provides demand for forestry products via the interface `pm_demand_forestry` +*' to the modules [32_forestry] and [62_material], and merges production of timber from +*' different sources into the interface `vm_prod`, which is used in the [17_production] and +*' [21_trade] modules. *' *' @authors Abhijeet Mishra, Florian Humpenöder From 28d94ae43ad5495c5156d4e81e10d290fcd85e89 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 21 May 2024 10:17:14 +0200 Subject: [PATCH 205/259] changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b96eaaa4c4..cbf3b8ac99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **32_forestry** removed interface `pm_representative_rotation` - **73_timber** removed interfaces `pm_demand_forestry_future` and `sm_wood_density` - **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` +- **35_natveg** removed growing stock calculation and calibration, which is no longer needed. ### fixed - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs From 7cd8aac9c2e1cac4671365434849904f0471053e Mon Sep 17 00:00:00 2001 From: Jan Philipp Dietrich Date: Tue, 21 May 2024 11:10:30 +0200 Subject: [PATCH 206/259] added scrip --- CHANGELOG.md | 2 ++ CITATION.cff | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dcc35db1a..f3b75a1cb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scripts** added start scripts for the GENIE project - **scenario_config.csv** added preset for GENIE project - **default.cfg** cfg$gms$s80_secondsolve option for second solve statement with 0=off as default +- **scripts** added "checkSummation" output script for consistency checking a report.mif +- **citation** added abstract ### removed - **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions diff --git a/CITATION.cff b/CITATION.cff index acedb5832d..8bde4ed824 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -137,6 +137,19 @@ authors: email: popp@pik-potsdam.de title: MAgPIE - An Open Source land-use modeling framework +abstract: The *Model of Agricultural Production and its Impact on the Environment* (MAgPIE) + is a modular open source framework for modeling global land-systems, which is + coupled to the grid-based dynamic vegetation model LPJmL, with a spatial resolution + of 0.5°x0.5°. It takes regional economic conditions such as demand for agricultural + commodities, technological development and production costs as well as spatially + explicit data on potential crop yields, land and water constraints (from LPJmL) into + account. Based on these, the model derives specific land use patterns, yields and + total costs of agricultural production for each grid cell. The objective function of + the land use model is to minimize total cost of production for a given amount of + regional food and bioenergy demand. Regional food energy demand is defined for an + exogenously given population in 10 food energy categories, based on regional diets. + Future trends in food demand are derived from a cross-country regression analysis, + based on future scenarios on GDP and population growth. version: 4.7.3dev date-released: 2024-04-12 repository-code: https://github.com/magpiemodel/magpie From f9ef8f21177a8b461b73f48d016b13e11e729162 Mon Sep 17 00:00:00 2001 From: Jan Philipp Dietrich Date: Tue, 21 May 2024 11:13:20 +0200 Subject: [PATCH 207/259] added output script --- scripts/output/extra/checkSummation.R | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 scripts/output/extra/checkSummation.R diff --git a/scripts/output/extra/checkSummation.R b/scripts/output/extra/checkSummation.R new file mode 100644 index 0000000000..12e524568b --- /dev/null +++ b/scripts/output/extra/checkSummation.R @@ -0,0 +1,31 @@ +# | (C) 2008-2023 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of MAgPIE and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | MAgPIE License Exception, version 1.0 (see LICENSE file). +# | Contact: magpie@pik-potsdam.de + +# -------------------------------------------------------------- +# description: check that summations add up in report.mif file +# comparison script: FALSE +# --------------------------------------------------------------- + +## Load necessary libraries +library(quitte) +library(piamInterfaces) +options(width = 180) + +## Check outputdir +if(!exists("source_include")) { + outputdir <- "." +} + +f <- file.path(outputdir, "report.mif") + +if(!file.exists(f)) { + warning("report.mif missing, cannot check anything. Please create report first!") +} else { + failvar <- checkSummations(f, outputDirectory = NULL, absDiff = 0.001, + summationsFile = "extractVariableGroups") + if(nrow(failvars) > 0) saveRDS(failvar, file.path(outputdir, "summationCheck.rds")) +} \ No newline at end of file From 0a8750848f57b9c9ad69e09b1cbe0a7907aacd8c Mon Sep 17 00:00:00 2001 From: Jan Philipp Dietrich Date: Tue, 21 May 2024 11:59:31 +0200 Subject: [PATCH 208/259] added missing cff info --- CITATION.cff | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CITATION.cff b/CITATION.cff index 8bde4ed824..dfdfa23a75 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,5 +1,6 @@ cff-version: 1.0.3 message: If you use this model, please cite it as below. +type: software authors: - family-names: Dietrich given-names: Jan Philipp @@ -156,6 +157,7 @@ repository-code: https://github.com/magpiemodel/magpie keywords: - landuse - modeling + - model - nlp - partial equilibrium doi: 10.5281/zenodo.1418752 From 27abd8f94c58312575d8dfbe51d37bf740e6ea56 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 21 May 2024 20:36:30 +0200 Subject: [PATCH 209/259] NPI update --- CHANGELOG.md | 1 + config/default.cfg | 2 +- modules/32_forestry/dynamic_may24/input.gms | 2 +- modules/35_natveg/dynamic_feb21/equations.gms | 2 +- modules/35_natveg/dynamic_feb21/presolve.gms | 3 ++- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cbf3b8ac99..dd93377f55 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **32_forestry** renamed interface `pm_demand_ext` to `pm_demand_forestry` - **default.cfg** Forestry sector included by default by using the `ForestryEndo` settings from `scenario_config.csv`: `s32_initial_distribution = 1`, `s32_demand_establishment = 1`, `s32_hvarea = 2`, `s35_secdf_distribution = 2`, `s35_hvarea = 2`, `s73_timber_demand_switch = 1` - **14_yields** revised timber yield calculations +- **35_natveg** `vm_land(j2,"forestry")` included in NPI/NDC constraint `q35_min_forest` ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` diff --git a/config/default.cfg b/config/default.cfg index 750d8ba722..b44c05755f 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -888,7 +888,7 @@ cfg$gms$s32_forestry_int_rate <- 0.05 # def = 0.05 cfg$gms$s32_demand_establishment <- 1 # def = 1 # Establishment cost for plantations (USD per ha) -cfg$gms$s32_est_cost_plant <- 10000 # def = 10000 +cfg$gms$s32_est_cost_plant <- 2000 # def = 2000 # Establishment cost for natural vegetation (USD per ha) cfg$gms$s32_est_cost_natveg <- 2000 # def = 2000 diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index cf93880505..4561adace6 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -24,7 +24,7 @@ $setglobal c32_shock_scenario none scalars s32_hvarea Flag for harvested area and establishemt (0=zero 1=exognous 2=endogneous) / 2 / - s32_est_cost_plant Establishment cost for plantations (USD per ha) / 10000 / + s32_est_cost_plant Establishment cost for plantations (USD per ha) / 2000 / s32_est_cost_natveg Establishment cost for natural vegetation (USD per ha) / 2000 / s32_recurring_cost Recurring costs (USD per ha) / 500 / s32_harvesting_cost Harvesting cost (USD per ha) / 2000 / diff --git a/modules/35_natveg/dynamic_feb21/equations.gms b/modules/35_natveg/dynamic_feb21/equations.gms index 9b3f100c5b..6a49b108c6 100644 --- a/modules/35_natveg/dynamic_feb21/equations.gms +++ b/modules/35_natveg/dynamic_feb21/equations.gms @@ -61,7 +61,7 @@ *' the natural land conservation constraint) and specifically formulated for forest and *' other land stocks. - q35_min_forest(j2) .. vm_land(j2,"primforest") + vm_land(j2,"secdforest") + q35_min_forest(j2) .. vm_land(j2,"primforest") + vm_land(j2,"secdforest") + vm_land(j2,"forestry") =g= sum(ct, p35_min_forest(ct,j2)); diff --git a/modules/35_natveg/dynamic_feb21/presolve.gms b/modules/35_natveg/dynamic_feb21/presolve.gms index dd9c94c7cc..f4c870b7e5 100644 --- a/modules/35_natveg/dynamic_feb21/presolve.gms +++ b/modules/35_natveg/dynamic_feb21/presolve.gms @@ -170,7 +170,8 @@ p35_carbon_density_other(t,j,ac,ag_pools) = pm_carbon_density_ac(t,j,ac,ag_pools * NPI/NDC policy * ------------------ -p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest")) = pcm_land(j,"primforest") + pcm_land(j,"secdforest"); +p35_min_forest(t,j)$(p35_min_forest(t,j) > pcm_land(j,"primforest") + pcm_land(j,"secdforest") + pcm_land(j,"forestry")) + = pcm_land(j,"primforest") + pcm_land(j,"secdforest") + pcm_land(j,"forestry"); p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"other"); ** Youngest age classes are not allowed to be harvested From de0ce461e36ff4f48f18bfa98d18a3edfcb69d33 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Wed, 22 May 2024 14:27:30 +0200 Subject: [PATCH 210/259] small bugfix in output scripts call in start scripts --- scripts/start/projects/project_EAT2p0.R | 4 ++-- scripts/start/projects/project_EAT2p0_DeepDive.R | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0.R b/scripts/start/projects/project_EAT2p0.R index a676bcc4c8..e941839731 100644 --- a/scripts/start/projects/project_EAT2p0.R +++ b/scripts/start/projects/project_EAT2p0.R @@ -35,7 +35,7 @@ cfg$output <- c("output_check", # "projects/FSEC_water", # do manually on last (high-res) magpie run # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) "rds_report", - "agmip_report") + "projects/agmip_report") ####################### # SCENARIO DEFINITION # @@ -83,7 +83,7 @@ bau <- function(cfg) { # Climate Change cfg$input['cellular'] <- "rev4.99_h12_c6a7458f_cellularmagpie_c200_IPSL-CM6A-LR-ssp370_lpjml-8e6c5eb1.tgz" - + return(cfg) } diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index eac1f29d16..979f7aad10 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -34,7 +34,7 @@ cfg$output <- c( "extra/disaggregation", "projects/FSEC_nitrogenPollution", "projects/FSEC_water", - "agmip_report", + "projects/agmip_report", "rds_report", "runBlackmagicc" # add output file: pb_report (magpie (special mif created by getReportPBindicators & remind mif (REMIND_generic_scenName.mif)) From 625a3692472a854953bf612f9f86199035bf7556 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Wed, 22 May 2024 15:00:53 +0200 Subject: [PATCH 211/259] changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a51b3c1631..157d858538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **default.cfg** Forestry sector included by default by using the `ForestryEndo` settings from `scenario_config.csv`: `s32_initial_distribution = 1`, `s32_demand_establishment = 1`, `s32_hvarea = 2`, `s35_secdf_distribution = 2`, `s35_hvarea = 2`, `s73_timber_demand_switch = 1` - **14_yields** revised timber yield calculations - **35_natveg** `vm_land(j2,"forestry")` included in NPI/NDC constraint `q35_min_forest` -- **35_natveg** replaced the realisation `dynamic_feb21` with realisation `pot_forest_may24`. The new realisation provides additional information on the potential forest area, which is now used to constrain forest and forestry expansion. The remaining area for forest establishment is provided to the forestry module via the new interface parameter `pcm_max_forest_est`. +- **35_natveg** replaced the realisation `dynamic_feb21` with realisation `pot_forest_may24`. The new realisation provides additional information on the potential forest area, which is now used to constrain forest and forestry expansion and recovery. The remaining area for forest establishment is provided to the forestry module via the new interface parameter `pcm_max_forest_est`. - **52_carbon** Separate carbon densities for forest and other land. Before there was only a single carbon density for natural vegetation land. ### added From f7efd460e1da2db1d1efb06aa099e584ec7275c2 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Wed, 22 May 2024 18:09:56 +0200 Subject: [PATCH 212/259] typos --- modules/35_natveg/pot_forest_may24/input.gms | 4 ++-- modules/35_natveg/pot_forest_may24/preloop.gms | 2 +- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms index aecafd5342..659aa2c69b 100644 --- a/modules/35_natveg/pot_forest_may24/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -5,8 +5,8 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -$setglobal c35_ad_policy ndc -$setglobal c35_aolc_policy ndc +$setglobal c35_ad_policy npi +$setglobal c35_aolc_policy npi $setglobal c35_shock_scenario none scalars diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 0f6ec6dd21..a874eb3fff 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -47,7 +47,7 @@ p35_disturbance_loss_primf(t,j) = 0; * ------------------------------------------------------------- * Forest establishment is constrained by the potential forest area in each cluster. -* Hence, the area for potential forest establishments is given by the potential forest +* Hence, the area for forest establishments is given by the potential forest * area minus all forest areas in the previous time step. pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 260ab20bad..55e4e2eee0 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -65,7 +65,7 @@ pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > pcm_max_for p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_youngsecdf(j,ac)); p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; -* Abandoned land pc35_other(j,ac_est) is then distributed propotionally using the forest recovery share. +* Abandoned land pc35_other(j,ac_est) is then distributed proportionally using the forest recovery share. p35_recovered_forest(t,j,ac_est) = pc35_other(j,ac_est) * p35_forest_recovery_shr(j); p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est2)) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j)/card(ac_est2); pc35_other(j,ac_est) = pc35_other(j,ac_est) - p35_recovered_forest(t,j,ac_est); From c4677ad149aa21e39805c5c5187883b64d874ba1 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Thu, 23 May 2024 10:29:56 +0200 Subject: [PATCH 213/259] changed Deep Dive start script: all are based on NPI now --- .../start/projects/project_EAT2p0_DeepDive.R | 78 ++++++++++++------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/scripts/start/projects/project_EAT2p0_DeepDive.R b/scripts/start/projects/project_EAT2p0_DeepDive.R index 979f7aad10..a9a21192e9 100644 --- a/scripts/start/projects/project_EAT2p0_DeepDive.R +++ b/scripts/start/projects/project_EAT2p0_DeepDive.R @@ -148,7 +148,7 @@ priceCO2 <- function(cfg) { # Mitigation: only price land CO2 cfg$gms$c56_pollutant_prices <- "coupling" cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" - cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" #### double-check Florian + cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" #### double-check Florian or Leon return(cfg) } @@ -158,7 +158,7 @@ priceNonCO2 <- function(cfg) { # Mitigation: only CH4 and N2O price cfg$gms$c56_pollutant_prices <- "coupling" cfg$path_to_report_ghgprices <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-DSPkB650-DS_betax-rem-5/REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif" - cfg$gms$c56_emis_policy <- "ecoSysProtOff" ### double-check Florian + cfg$gms$c56_emis_policy <- "ecoSysProtOff" ### double-check Florian or Leon return(cfg) } @@ -216,13 +216,53 @@ start_run(cfg, codeCheck = FALSE) # All production-side land-based mitigation measures cfg$title <- "BAU_Miti" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) cfg <- miti(cfg = cfg) start_run(cfg, codeCheck = FALSE) +# BAU_MITI - bioenergy # +# (1e) CO2 and non-CO2 pricing, but no bioenergy demand from REMIND +cfg$title <- "BAUMITI_Bioenergy" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation +cfg <- miti(cfg = cfg) +cfg$gms$c60_2ndgen_biodem <- "coupling" +cfg$path_to_report_bioenergy <- "/p/projects/magpie/users/beier/EL2_DeepDive_new/remind/output/C_SSP2EU-NPi-rem-5/REMIND_generic_C_SSP2EU-NPi-rem-5.mif" +start_run(cfg, codeCheck = FALSE) + +# BAU_MITI - non-CO2 # +# (1f) CO2 pricing and bioenergy demand from REMIND, but no non-CO2 pricing in land-system +cfg$title <- "BAUMITI_nonCO2" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation +cfg <- miti(cfg = cfg) +# ecoSysProtAll_agMgmtOff: (Above ground CO2 emis from LUC in forest, forestry, natveg; All types of emis from peatland; No further CH4/N2O/other emis related to ag. management) +cfg$gms$c56_emis_policy <- "ecoSysProtAll_agMgmtOff" +start_run(cfg, codeCheck = FALSE) + +# MITI_CO2 (mitigation - CO2) # +# (1g) non-CO2 pricing and bioenergy demand from REMIND, but no CO2 pricing in land-system +cfg$title <- "BAUMITI_CO2" +# standard setting, but with NDC for miti +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +# BAU settings +cfg <- bau(cfg = cfg) +# Mitigation +cfg <- miti(cfg = cfg) +# ecoSysProtOff: (All CH4 and N2O emis except peatland), +cfg$gms$c56_emis_policy <- "ecoSysProtOff" +start_run(cfg, codeCheck = FALSE) + + # BAU + EL2-Diet # # PHD components: # (1e) Productivity @@ -261,7 +301,7 @@ start_run(cfg, codeCheck = FALSE) # All production-side land-based mitigation measures and demand-side mitigation (diet change), but no NDCs #cfg$title <- "MITI_NDC" # standard setting, but with NDC for miti -#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) +#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) # BAU settings #cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) @@ -276,7 +316,7 @@ start_run(cfg, codeCheck = FALSE) # (2b) CO2 and non-CO2 pricing and demand-side mitigation (diet change), but no bioenergy demand from REMIND cfg$title <- "MITI_Bioenergy" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation @@ -293,7 +333,7 @@ start_run(cfg, codeCheck = FALSE) # (2c) CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no non-CO2 pricing in land-system cfg$title <- "MITI_nonCO2" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation @@ -310,7 +350,7 @@ start_run(cfg, codeCheck = FALSE) # (2d) non-CO2 pricing and bioenergy demand from REMIND and demand-side mitigation (diet change), but no CO2 pricing in land-system cfg$title <- "MITI_CO2" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation @@ -336,27 +376,11 @@ cfg <- diet(cfg = cfg) cfg <- waste(cfg = cfg) start_run(cfg, codeCheck = FALSE) - -# MITI_Prod # -# (2e) All production-side land-based mitigation measures and demand-side mitigation without Prod -#cfg$title <- "MITI_Prod" -# standard setting, but with NDC for miti -#cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) -# BAU settings -#cfg <- bau(cfg = cfg) -# Mitigation (CO2, non-CO2, bioenergy) -#cfg <- miti(cfg = cfg) -# PHD (diet, prod, waste) -#cfg <- diet(cfg = cfg) -#cfg <- prod(cfg = cfg) -#cfg <- waste(cfg = cfg) -#start_run(cfg, codeCheck = FALSE) - # MITI_Waste # # (2f) All production-side land-based mitigation measures and demand-side mitigation without Waste cfg$title <- "MITI_Waste" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) @@ -370,7 +394,7 @@ start_run(cfg, codeCheck = FALSE) # (2g) All production-side land-based mitigation measures and demand-side mitigation without Diet cfg$title <- "MITI_Diet" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) @@ -384,7 +408,7 @@ start_run(cfg, codeCheck = FALSE) # (2e,f,g) All production-side land-based mitigation measures, but no demand-side mitigation cfg$title <- "MITI_Dem" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation @@ -433,7 +457,7 @@ start_run(cfg, codeCheck = FALSE) # All production-side land-based mitigation measures and demand-side mitigation (diet change) cfg$title <- "MITI_All" # standard setting, but with NDC for miti -cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NDC", "EL2_default")) +cfg <- setScenario(cfg, c("nocc_hist", "SSP2", "NPI", "EL2_default")) # BAU settings cfg <- bau(cfg = cfg) # Mitigation (CO2, non-CO2, bioenergy) From 5210068e6c67f8f3e26ed92db8a3c6258e2dc209 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 23 May 2024 10:36:49 +0200 Subject: [PATCH 214/259] addressed review comments --- modules/35_natveg/pot_forest_may24/equations.gms | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 5c6aa02224..14a7db4a1f 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -73,7 +73,7 @@ *' the natural land conservation constraint) and specifically formulated for forest and *' other land stocks. - q35_min_forest(j2) .. vm_land(j2,"primforest") + vm_land(j2,"secdforest") + vm_land(j2,"forestry") + q35_min_forest(j2) .. sum(land_forest, vm_land(j2,land_forest)) =g= sum(ct, p35_min_forest(ct,j2)); @@ -182,10 +182,9 @@ q35_hvarea_other(j2,ac_sub).. v35_other_reduction(j2,ac_sub); -*' The constraint for overall forest establishment is given by the -*' remaining potential forest area, which is derived from -*' the potential natural forest area minus the recovering secondary -*' forest area. +*' The constraint for overall forest establishment, including forestry, is given +*' by the remaining potential forest area, which is derived from the potential +*' natural forestarea minus the recovering secondary forest area. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) From ac813f0042a3401be867e0b303f6eac1abbedda9 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Thu, 23 May 2024 11:28:41 +0200 Subject: [PATCH 215/259] updated FSEC water script --- scripts/output/projects/FSEC_water.R | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/output/projects/FSEC_water.R b/scripts/output/projects/FSEC_water.R index 016ccd2868..564f89ba33 100644 --- a/scripts/output/projects/FSEC_water.R +++ b/scripts/output/projects/FSEC_water.R @@ -59,3 +59,7 @@ watStressViolations <- watStress # mark violations in different color watStressViolations[efvViolation == 1] <- 100 write.magpie(watStressViolations, file_name = file.path(outputdir, "watStressViolations.mz")) + +# Water EFV ratio (EFV to EFR) +watEFVratio <- waterEFVratio(gdx, level = "grid", dir = outputdir) +write.magpie(watEFVratio, file_name = file.path(outputdir, "watEFVratio.mz")) From 390afbd2a82d40299e3dd0ea087263aa14d6e46b Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 23 May 2024 11:55:20 +0200 Subject: [PATCH 216/259] minor streamlining of code --- config/default.cfg | 8 +-- config/scenario_config.csv | 2 +- config/scenario_fsec.csv | 6 +- main.gms | 60 +++++++++---------- modules/35_natveg/input/files | 2 +- modules/35_natveg/pot_forest_may24/input.gms | 2 +- .../35_natveg/pot_forest_may24/postsolve.gms | 6 +- .../35_natveg/pot_forest_may24/preloop.gms | 8 +++ .../35_natveg/pot_forest_may24/presolve.gms | 10 ---- 9 files changed, 51 insertions(+), 53 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 4318c70842..693b579897 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "rev4.105_h12_magpie.tgz", - cellular = "rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.105_h12_validation.tgz", +cfg$input <- c(regional = "rev4.106_h12_magpie.tgz", + cellular = "rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.106_h12_validation.tgz", additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") @@ -882,7 +882,7 @@ cfg$gms$c32_interest_rate <- "regional" # def = "regional" cfg$gms$s32_forestry_int_rate <- 0.05 # def = 0.05 # Setting to define if the model should be forward looking or not in terms of -# seeing the future demand for current timestep establishment of new plantations. +# seeing the future demand for current timestep establishment of new plantations. # * 0 = static (establishment based on current demand) # * 1 = forward looking (establishment based on future demand according to rotation length) cfg$gms$s32_demand_establishment <- 1 # def = 1 diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 985d29edef..fd673c0b0e 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -88,7 +88,7 @@ gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;; gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.105_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.106_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.106_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.106_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.106_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.106_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; diff --git a/config/scenario_fsec.csv b/config/scenario_fsec.csv index 53c95b210c..dfb83a5046 100644 --- a/config/scenario_fsec.csv +++ b/config/scenario_fsec.csv @@ -74,9 +74,9 @@ gms$s62_max_dem_bioplastic;0;;;;400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_fac_req_regr;reg;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_feed_scen;;;;;;;;;;;;;;;;;;ssp1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c73_build_demand;;;;;;;;;;;;;;;;;;;;;;;;50pc;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['cellular'];rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.105_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; -input['regional'];rev4.105_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['validation'];rev4.105_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['cellular'];rev4.106_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.106_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.106_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; +input['regional'];rev4.106_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['validation'];rev4.106_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['additional'];additional_data_rev4.50.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['calibration'];calibration_FSEC_26Mar24.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_RemSDP-900-MagSSP1.mif;; diff --git a/main.gms b/main.gms index e77c4cbc72..c1fd3720e4 100644 --- a/main.gms +++ b/main.gms @@ -147,44 +147,44 @@ $title magpie *' * Always try to access model outputs through the corresponding magpie package instead of accessing them directly with readGDX. It cannot be guaranteed that your script will work in the future if you do otherwise (as only the corresponding magpie package will be continuously adapted to changes in the GAMS code). *##################### R SECTION START (VERSION INFO) ########################## -* -* Used data set: rev4.104_h12_magpie.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.104_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: rev4.104_h12_validation.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output -* -* Used data set: additional_data_rev4.48.tgz -* md5sum: NA -* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive -* +* +* Used data set: rev4.106_h12_magpie.tgz +* md5sum: e76c52a364c5028c8c8e9f427bbf788a +* Repository: /p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz +* md5sum: 21ae47f599f0526af325f43b2316978e +* Repository: /p/projects/rd3mod/inputdata/output +* +* Used data set: rev4.106_h12_validation.tgz +* md5sum: 9f7639ae2bef9f24fcae12d85300d4bd +* Repository: /p/projects/rd3mod/inputdata/output +* +* Used data set: additional_data_rev4.50.tgz +* md5sum: d29e253bd32fce7d3b9217642a5978d5 +* Repository: /p/projects/landuse/data/input/archive +* * Used data set: calibration_H12_26Mar24.tgz * md5sum: NA * Repository: https://rse.pik-potsdam.de/data/magpie/public -* +* * Low resolution: c200 * High resolution: 0.5 -* +* * Total number of cells: 200 -* +* * Number of cells per region: * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 -* +* * Regionscode: 62eff8f7 -* -* Regions data revision: 4.104 -* +* +* Regions data revision: 4.106 +* * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 -* * Revision: 4.104 -* +* * Revision: 4.106 +* * aggregation settings: * * Input resolution: 0.5 * * Output resolution: c200 @@ -193,10 +193,10 @@ $title magpie * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) -* -* -* Last modification (input data): Wed May 8 14:54:42 2024 -* +* +* +* Last modification (input data): Thu May 23 11:16:51 2024 +* *###################### R SECTION END (VERSION INFO) ########################### $offupper diff --git a/modules/35_natveg/input/files b/modules/35_natveg/input/files index 372c96f03c..dc39074a1e 100644 --- a/modules/35_natveg/input/files +++ b/modules/35_natveg/input/files @@ -3,5 +3,5 @@ npi_ndc_ad_aolc_pol.cs3 f35_forest_disturbance_share.cs4 f35_forest_lost_share.cs3 f35_forest_shock.csv -pot_forest_area.cs3 +pot_forest_area.cs2 pot_forest_area_0.5.mz diff --git a/modules/35_natveg/pot_forest_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms index 659aa2c69b..0ed373a22b 100644 --- a/modules/35_natveg/pot_forest_may24/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -51,6 +51,6 @@ $offdelim parameter f35_pot_forest_area(j) Potential forest area (mio. ha) / $ondelim -$include "./modules/35_natveg/input/pot_forest_area.cs3" +$include "./modules/35_natveg/input/pot_forest_area.cs2" $offdelim /; diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index c503ff69ad..d4be352bbe 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -6,11 +6,11 @@ *** | Contact: magpie@pik-potsdam.de *secdforest age class calculation -p35_secdforest(t,j,ac) = v35_secdforest.l(j,ac); +pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); *other land age class calculation -p35_other(t,j,ac) = v35_other.l(j,ac); -p35_youngsecdf(t,j,ac) = v35_youngsecdf.l(j,ac); +pc35_other(j,ac) = v35_other.l(j,ac); +pc35_youngsecdf(j,ac) = v35_youngsecdf.l(j,ac); * Reset forest establishment bound pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index a874eb3fff..cce3cf00ca 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -75,3 +75,11 @@ p35_land_start_ac(j,ac,"secdforest") = i35_secdforest(j,ac); * Set forest damage trajectory * ----------------------------- m_sigmoid_time_interpol(p35_damage_fader,sm_fix_SSP2,s35_forest_damage_end,0,1); + +* --------------------------------------- +* Initialise natveg in first time step +* --------------------------------------- + + pc35_secdforest(j,ac) = i35_secdforest(j,ac); + pc35_youngsecdf(j,ac) = i35_youngsecdf(j,ac); + pc35_other(j,ac) = i35_other(j,ac); diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 55e4e2eee0..b0eb4fdf77 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -5,16 +5,6 @@ *** | MAgPIE License Exception, version 1.0 (see LICENSE file). *** | Contact: magpie@pik-potsdam.de -if((ord(t) = 1), - pc35_secdforest(j,ac) = i35_secdforest(j,ac); - pc35_youngsecdf(j,ac) = i35_youngsecdf(j,ac); - pc35_other(j,ac) = i35_other(j,ac); -else - pc35_secdforest(j,ac) = p35_secdforest(t-1,j,ac); - pc35_youngsecdf(j,ac) = p35_youngsecdf(t-1,j,ac); - pc35_other(j,ac) = p35_other(t-1,j,ac); -); - * ---------------------------------------------------- * Shift ageclasses due to shifting agriculture fires * ---------------------------------------------------- From caa8ec0e7710f8da898610e5cca99870b80ce53b Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 23 May 2024 12:02:12 +0200 Subject: [PATCH 217/259] reverted main.gms download paths --- main.gms | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/main.gms b/main.gms index c1fd3720e4..5a585545d1 100644 --- a/main.gms +++ b/main.gms @@ -147,44 +147,44 @@ $title magpie *' * Always try to access model outputs through the corresponding magpie package instead of accessing them directly with readGDX. It cannot be guaranteed that your script will work in the future if you do otherwise (as only the corresponding magpie package will be continuously adapted to changes in the GAMS code). *##################### R SECTION START (VERSION INFO) ########################## -* +* * Used data set: rev4.106_h12_magpie.tgz -* md5sum: e76c52a364c5028c8c8e9f427bbf788a -* Repository: /p/projects/rd3mod/inputdata/output -* +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* * Used data set: rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz -* md5sum: 21ae47f599f0526af325f43b2316978e -* Repository: /p/projects/rd3mod/inputdata/output -* +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* * Used data set: rev4.106_h12_validation.tgz -* md5sum: 9f7639ae2bef9f24fcae12d85300d4bd -* Repository: /p/projects/rd3mod/inputdata/output -* +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output +* * Used data set: additional_data_rev4.50.tgz -* md5sum: d29e253bd32fce7d3b9217642a5978d5 -* Repository: /p/projects/landuse/data/input/archive -* +* md5sum: NA +* Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive +* * Used data set: calibration_H12_26Mar24.tgz * md5sum: NA * Repository: https://rse.pik-potsdam.de/data/magpie/public -* +* * Low resolution: c200 * High resolution: 0.5 -* +* * Total number of cells: 200 -* +* * Number of cells per region: * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 -* +* * Regionscode: 62eff8f7 -* +* * Regions data revision: 4.106 -* +* * lpj2magpie settings: * * LPJmL data: MRI-ESM2-0:ssp370 * * Revision: 4.106 -* +* * aggregation settings: * * Input resolution: 0.5 * * Output resolution: c200 @@ -193,10 +193,10 @@ $title magpie * CAZ CHA EUR IND JPN LAM MEA NEU OAS REF SSA USA * 14 23 10 7 4 26 21 9 16 23 32 15 * * Call: withCallingHandlers(expr, message = messageHandler, warning = warningHandler, error = errorHandler) -* -* +* +* * Last modification (input data): Thu May 23 11:16:51 2024 -* +* *###################### R SECTION END (VERSION INFO) ########################### $offupper From cfbdf80161a92552645eae315df39777a78ffb9e Mon Sep 17 00:00:00 2001 From: Felicitas Date: Thu, 23 May 2024 13:51:55 +0200 Subject: [PATCH 218/259] update realization description of 41_AEI module --- .../41_area_equipped_for_irrigation/endo_apr13/realization.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms b/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms index 07fb647508..f93521ee43 100644 --- a/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms +++ b/modules/41_area_equipped_for_irrigation/endo_apr13/realization.gms @@ -9,7 +9,7 @@ *' @description This realization allows the model to endogenously decide on investments to deploy additional *' irrigation infrastructure, i.e. to increase the area equipped for irrigation (AEI). *' Initial values for AEI are areas that are irrigated in the initial time step in LUH2v2. -*' Contraction of AEI is not possible. +*' Depreciation of AEI can be set via `s41_AEI_depreciation`. *' Irrigated crop production can only take place where irrigation infrastructure is present. *' *' Unit costs per hectare for AEI expansion are derived from a World Bank study (@worldbank_irrigation_1995) From b70d512f7490fe03c7567266a085e71fb23659b8 Mon Sep 17 00:00:00 2001 From: Felicitas Date: Thu, 23 May 2024 13:53:53 +0200 Subject: [PATCH 219/259] update input data --- config/default.cfg | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 572be18f70..828289cad7 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "WARNINGS66_rev4.107Mehta_h12_magpie.tgz", - cellular = "WARNINGS26_rev4.107Mehta_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "WARNINGS79_rev4.107Mehta_h12_validation.tgz", +cfg$input <- c(regional = "rev4.106_h12_magpie.tgz", + cellular = "rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.106_h12_validation.tgz", additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") From e2f3698080608782898a47a35ef46aa34553bb30 Mon Sep 17 00:00:00 2001 From: David Hoetten Date: Thu, 23 May 2024 15:10:45 +0200 Subject: [PATCH 220/259] fixed division by zero in preloop and updated changelog --- CHANGELOG.md | 1 + modules/14_yields/managementcalib_aug19/preloop.gms | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f3b75a1cb3..8e50855c08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed +- **14_yields** fix division by zero in preloop of managementcalib_aug19 - **22_land_conservation and default.cfg** Added options for baseline protection - **15_food, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying food substitution scenarios and exogeneous food intake scenarios - **70_livestock, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios diff --git a/modules/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index a23737fd6e..b513ffbd36 100644 --- a/modules/14_yields/managementcalib_aug19/preloop.gms +++ b/modules/14_yields/managementcalib_aug19/preloop.gms @@ -127,9 +127,9 @@ if ((s14_calib_ir2rf = 1), * Calibrate newly calibrated yields to FAO yields i14_modeled_yields_hist2(i,knbe14) = (sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14) * i14_yields_calib("y1995",j,knbe14,w)) / - sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))>0) + sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))>0.00001) + (sum((cell(i,j),w), i14_croparea_total("y1995",w,j) * f14_yields("y1995",j,knbe14,w)) / - sum((cell(i,j),w), i14_croparea_total("y1995",w,j)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))=0); + sum((cell(i,j),w), i14_croparea_total("y1995",w,j)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))<0.00001); i14_yields_calib(t,j,knbe14,w) = sum((cell(i,j)), i14_fao_yields_hist("y1995",i,knbe14) / i14_modeled_yields_hist2(i,knbe14)) * From 185fedceb3f7db6397239bc2275878036779cd53 Mon Sep 17 00:00:00 2001 From: David Hoetten Date: Thu, 23 May 2024 15:44:03 +0200 Subject: [PATCH 221/259] recovered original behaviour for <0 case --- modules/14_yields/managementcalib_aug19/preloop.gms | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index b513ffbd36..4a097775c5 100644 --- a/modules/14_yields/managementcalib_aug19/preloop.gms +++ b/modules/14_yields/managementcalib_aug19/preloop.gms @@ -129,7 +129,8 @@ if ((s14_calib_ir2rf = 1), = (sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14) * i14_yields_calib("y1995",j,knbe14,w)) / sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))>0.00001) + (sum((cell(i,j),w), i14_croparea_total("y1995",w,j) * f14_yields("y1995",j,knbe14,w)) / - sum((cell(i,j),w), i14_croparea_total("y1995",w,j)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))<0.00001); + sum((cell(i,j),w), i14_croparea_total("y1995",w,j))) + $(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))<0.00001 and sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))>=0); i14_yields_calib(t,j,knbe14,w) = sum((cell(i,j)), i14_fao_yields_hist("y1995",i,knbe14) / i14_modeled_yields_hist2(i,knbe14)) * From 9e5ffd1f6dd55bf0173ace46e40042b4215912ce Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Thu, 23 May 2024 16:35:34 +0200 Subject: [PATCH 222/259] carbon density fix --- .../14_yields/managementcalib_aug19/presolve.gms | 13 +++++++++++-- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/14_yields/managementcalib_aug19/presolve.gms b/modules/14_yields/managementcalib_aug19/presolve.gms index 7d77d33032..ca1189f665 100644 --- a/modules/14_yields/managementcalib_aug19/presolve.gms +++ b/modules/14_yields/managementcalib_aug19/presolve.gms @@ -30,11 +30,20 @@ pm_timber_yield(t,j,ac,"forestry") = ) ; -pm_timber_yield(t,j,ac,land_forest) = +pm_timber_yield(t,j,ac,"primforest") = + ( + fm_carbon_density(t,j,"primforest","vegc") + / s14_carbon_fraction + * f14_aboveground_fraction("primforest") + / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) + ) + ; + +pm_timber_yield(t,j,ac,"secdforest") = ( pm_carbon_density_secdforest_ac(t,j,ac,"vegc") / s14_carbon_fraction - * f14_aboveground_fraction(land_forest) + * f14_aboveground_fraction("secdforest") / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) ) ; diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index b0eb4fdf77..be972d342c 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -119,7 +119,7 @@ pcm_land(j,"other") = sum(ac, pc35_other(j,ac)) + sum(ac, pc35_youngsecdf(j,ac)) * Within the optimization, primary forests can only decrease * (e.g. due to cropland expansion). -* In contrast, other natural land and secdforest can decrease and increase within the optimization. +* In contrast, other natural land can decrease and increase within the optimization. * For instance, other natural land increases if agricultural land is abandoned. * Correct land conservation for damage From b9c2b1824aafb293b99512f4672cfbbd19934082 Mon Sep 17 00:00:00 2001 From: DavidhoPIK <101278418+DavidhoPIK@users.noreply.github.com> Date: Thu, 23 May 2024 19:41:37 +0200 Subject: [PATCH 223/259] Move CHANGELOG entry to fixed --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e50855c08..0480675e4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### changed -- **14_yields** fix division by zero in preloop of managementcalib_aug19 - **22_land_conservation and default.cfg** Added options for baseline protection - **15_food, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying food substitution scenarios and exogeneous food intake scenarios - **70_livestock, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios @@ -38,6 +37,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scripts** removed support for spam files in start_functions ### fixed +- **14_yields** fix division by zero in preloop of managementcalib_aug19 - **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs - **44_biodiversity** avoid division by zero - **scenario_config.csv** same revision for input files as in default.cfg From 301a4b711afc6e0eeb8f3e4adff8f6c67f1da96f Mon Sep 17 00:00:00 2001 From: David Hoetten Date: Fri, 24 May 2024 11:00:09 +0200 Subject: [PATCH 224/259] removed >= 0 check for better readability, added analogous change for first modeled_yields_historical def --- modules/14_yields/managementcalib_aug19/preloop.gms | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index 4a097775c5..a495c24376 100644 --- a/modules/14_yields/managementcalib_aug19/preloop.gms +++ b/modules/14_yields/managementcalib_aug19/preloop.gms @@ -59,9 +59,9 @@ i14_croparea_total(t_all,w,j) = sum(kcr, fm_croparea(t_all,j,w,kcr)); i14_modeled_yields_hist(t_past,i,knbe14) = (sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14) * f14_yields(t_past,j,knbe14,w)) / - sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14)))$(sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14))>0) + sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14)))$(sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14))>0.00001) + (sum((cell(i,j),w), i14_croparea_total(t_past,w,j) * f14_yields(t_past,j,knbe14,w)) / - sum((cell(i,j),w), i14_croparea_total(t_past,w,j)))$(sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14))=0); + sum((cell(i,j),w), i14_croparea_total(t_past,w,j)))$(sum((cell(i,j),w), fm_croparea(t_past,j,w,knbe14))<0.00001); *' The factor `i14_lambda_yields` is calculated for the initial time step depending @@ -129,8 +129,7 @@ if ((s14_calib_ir2rf = 1), = (sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14) * i14_yields_calib("y1995",j,knbe14,w)) / sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))>0.00001) + (sum((cell(i,j),w), i14_croparea_total("y1995",w,j) * f14_yields("y1995",j,knbe14,w)) / - sum((cell(i,j),w), i14_croparea_total("y1995",w,j))) - $(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))<0.00001 and sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))>=0); + sum((cell(i,j),w), i14_croparea_total("y1995",w,j)))$(sum((cell(i,j),w), fm_croparea("y1995",j,w,knbe14))<0.00001); i14_yields_calib(t,j,knbe14,w) = sum((cell(i,j)), i14_fao_yields_hist("y1995",i,knbe14) / i14_modeled_yields_hist2(i,knbe14)) * From 9580188a8d7f6183f296f2ae443ea7c379c9be02 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 24 May 2024 14:30:54 +0200 Subject: [PATCH 225/259] added interface vm_land_other to facilitate emissions calculations --- .../pot_forest_may24/declarations.gms | 154 +++++++++--------- .../35_natveg/pot_forest_may24/equations.gms | 101 ++++++------ .../35_natveg/pot_forest_may24/postsolve.gms | 63 ++++--- .../35_natveg/pot_forest_may24/preloop.gms | 11 +- .../35_natveg/pot_forest_may24/presolve.gms | 80 ++++----- modules/35_natveg/pot_forest_may24/sets.gms | 3 + modules/59_som/cellpool_aug16/equations.gms | 30 ++-- modules/59_som/cellpool_jan23/equations.gms | 30 ++-- modules/59_som/static_jan19/declarations.gms | 12 +- modules/59_som/static_jan19/equations.gms | 14 +- modules/59_som/static_jan19/postsolve.gms | 36 ++-- modules/59_som/static_jan19/sets.gms | 4 +- 12 files changed, 271 insertions(+), 267 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 6345f0ade8..43532f0540 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -10,100 +10,94 @@ scalars ; parameters - i35_secdforest(j,ac) Initial secdforest (mio. ha) - i35_youngsecdf(j,ac) Initial young secdforest (mio. ha) - i35_other(j,ac) Initial other land (mio. ha) - p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) - p35_youngsecdf(t,j,ac) Young secdforest per age class (mio. ha) - p35_other(t,j,ac) Other land per age class (mio. ha) - pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) - pc35_youngsecdf(j,ac) Young secdforest per age class in current time step (mio. ha) - pc35_other(j,ac) Other land per age class in current time step (mio. ha) - p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) - p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) - p35_damage_fader(t_all) Fader for forest damage (1) - p35_forest_recovery_shr(j) Forest share in natveg recovery (1) - p35_recovered_forest(t,j,ac) Recovered forest (mio. ha) - p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) - p35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) - p35_carbon_density_secdforest(t,j,ac,ag_pools) Carbon density secdforest (tC per ha) - p35_carbon_density_other(t,j,ac,ag_pools) Carbon density other land (tC per ha) - p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) - p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) - i35_plantedclass_ac(j,ac) Area of age-classes in secondary forest (1) - p35_poulter_dist(j,ac) Share of age-classes in secondary forest (1) - p35_land_start_ac(j,ac,land_natveg) Initial Natural vegetation area (mio. ha) - p35_protection_dist(j,ac) Distribution of secondary forest protection (1) - p35_land_restoration(j,land_natveg) Actual secondary forest and other land restoration area (mio. ha) - p35_restoration_shift(j) Restoration of other land instead of secdforest (mio. ha) + i35_secdforest(j,ac) Initial secdforest (mio. ha) + i35_land_other(j,ac,othertype35) Initial other land (mio. ha) + p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) + p35_land_other(t,j,ac,othertype35) Other land per age class (mio. ha) + pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) + pc35_land_other(j,ac,othertype35) Other land per age class in current time step (mio. ha) + p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) + p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) + p35_damage_fader(t_all) Fader for forest damage (1) + p35_forest_recovery_shr(j) Forest share in natveg recovery (1) + p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) + p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) + pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) + p35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) + p35_carbon_density_other(t,j,ac,othertype35,ag_pools) Carbon density other land (tC per ha) + p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) + p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) + i35_plantedclass_ac(j,ac) Area of age-classes in secondary forest (1) + p35_poulter_dist(j,ac) Share of age-classes in secondary forest (1) + p35_land_start_ac(j,ac,land_natveg) Initial Natural vegetation area (mio. ha) + p35_protection_dist(j,ac) Distribution of secondary forest protection (1) + p35_land_restoration(j,land_natveg) Actual secondary forest and other land restoration area (mio. ha) + p35_restoration_shift(j) Restoration of other land instead of secdforest (mio. ha) ; equations - q35_land_secdforest(j) Secdforest land pool calculation (mio. ha) - q35_land_other(j) Other land pool calculation (mio. ha) - q35_carbon_primforest(j,ag_pools,stockType) Primforest carbon stock calculation (mio tC) - q35_carbon_secdforest(j,ag_pools,stockType) Secdforest carbon stock calculation (mio tC) - q35_carbon_other(j,ag_pools,stockType) Other land carbon stock calculation (mio tC) - q35_min_forest(j) Minimum forest land constraint (mio. ha) - q35_min_other(j) Minimum other land constraint (mio. ha) - q35_landdiff Difference in natveg land (mio. ha) - q35_other_expansion(j) Other land expansion (mio. ha) - q35_other_reduction(j,ac) Other land reduction (mio. ha) - q35_secdforest_expansion(j) Secdforest expansion (mio. ha) - q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) - q35_primforest_reduction(j) Primforest reduction (mio. ha) - q35_secdforest_regeneration(j) Secondary forest regeneration (mio. ha) - q35_max_forest_establishment(j) Maximum forestry regeneration based on potential forest area (mio. ha) - q35_other_regeneration(j) Other land regeneration (mio. ha) - q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) - q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) - q35_hvarea_other(j,ac) Harvested area other land (mio. ha) - q35_hvarea_secdforest(j,ac) Harvested area secdforest (mio. ha) - q35_hvarea_primforest(j) Harvested area primforest (mio. ha) - q35_prod_secdforest(j) Production of woody biomass from secondary forests (mio. tDM per yr) - q35_prod_primforest(j) Production of woody biomass from primary forests (mio. tDM per yr) - q35_prod_other(j) Production of woody biomass from other land (mio. tDM per yr) - q35_cost_hvarea(i) Cost of harvesting natural vegetation (mio. USD) - q35_bv_primforest(j,potnatveg) Biodiversity value of primary forest (mio. ha) - q35_bv_secdforest(j,potnatveg) Biodiversity value of secondary forest (mio. ha) - q35_bv_other(j,potnatveg) Biodiversity value of other land (mio. ha) - q35_natveg_conservation(j) Total natural vegetation conservation constraint (mio. ha) - q35_secdforest_restoration(j) Secondary forest restoration constraint (mio. ha) - q35_other_restoration(j) Other land restoration constraint (mio. ha) + q35_land_secdforest(j) Secdforest land pool calculation (mio. ha) + q35_land_other(j) Other land pool calculation (mio. ha) + q35_carbon_primforest(j,ag_pools,stockType) Primforest carbon stock calculation (mio tC) + q35_carbon_secdforest(j,ag_pools,stockType) Secdforest carbon stock calculation (mio tC) + q35_carbon_other(j,ag_pools,stockType) Other land carbon stock calculation (mio tC) + q35_min_forest(j) Minimum forest land constraint (mio. ha) + q35_min_other(j) Minimum other land constraint (mio. ha) + q35_landdiff Difference in natveg land (mio. ha) + q35_other_expansion(j,othertype35) Other land expansion (mio. ha) + q35_other_reduction(j,ac,othertype35) Other land reduction (mio. ha) + q35_secdforest_expansion(j) Secdforest expansion (mio. ha) + q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) + q35_primforest_reduction(j) Primforest reduction (mio. ha) + q35_secdforest_regeneration(j) Secondary forest regeneration (mio. ha) + q35_max_forest_establishment(j) Maximum forestry regeneration based on potential forest area (mio. ha) + q35_other_regeneration(j) Other land regeneration (mio. ha) + q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) + q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) + q35_hvarea_other(j,ac,othertype35) Harvested area other land (mio. ha) + q35_hvarea_secdforest(j,ac) Harvested area secdforest (mio. ha) + q35_hvarea_primforest(j) Harvested area primforest (mio. ha) + q35_prod_secdforest(j) Production of woody biomass from secondary forests (mio. tDM per yr) + q35_prod_primforest(j) Production of woody biomass from primary forests (mio. tDM per yr) + q35_prod_other(j) Production of woody biomass from other land (mio. tDM per yr) + q35_cost_hvarea(i) Cost of harvesting natural vegetation (mio. USD) + q35_bv_primforest(j,potnatveg) Biodiversity value of primary forest (mio. ha) + q35_bv_secdforest(j,potnatveg) Biodiversity value of secondary forest (mio. ha) + q35_bv_other(j,potnatveg) Biodiversity value of other land (mio. ha) + q35_natveg_conservation(j) Total natural vegetation conservation constraint (mio. ha) + q35_secdforest_restoration(j) Secondary forest restoration constraint (mio. ha) + q35_other_restoration(j) Other land restoration constraint (mio. ha) ; positive variables - v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) - v35_youngsecdf(j,ac) Detailed stock of young secdforest (mio. ha) - v35_other(j,ac) Detailed stock of other land (mio. ha) - vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) - v35_other_expansion(j) Other land expansion compared to previous timestep (mio. ha) - v35_other_reduction(j,ac) Other land reduction compared to previous timestep (mio. ha) - v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) - v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) - v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) - v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) - v35_hvarea_other(j,ac) Harvested area from other land (mio. ha) - v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) - vm_prod_natveg(j,land_natveg,kforestry) Production of woody biomass from natural vegetation (mio. tDM per yr) - vm_cost_hvarea_natveg(i) Cost of harvesting natural vegetation (mio. USD) + v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) + vm_land_other(j,ac,othertype35) Detailed stock of other land (mio. ha) + vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) + v35_other_expansion(j,othertype35) Other land expansion compared to previous timestep (mio. ha) + v35_other_reduction(j,ac,othertype35) Other land reduction compared to previous timestep (mio. ha) + v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) + v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) + v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) + v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) + v35_hvarea_other(j,ac,othertype35) Harvested area from other land (mio. ha) + v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) + vm_prod_natveg(j,land_natveg,kforestry) Production of woody biomass from natural vegetation (mio. tDM per yr) + vm_cost_hvarea_natveg(i) Cost of harvesting natural vegetation (mio. USD) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (mio. ha) - ov35_youngsecdf(t,j,ac,type) Detailed stock of young secdforest (mio. ha) - ov35_other(t,j,ac,type) Detailed stock of other land (mio. ha) + ov_land_other(t,j,ac,othertype35,type) Detailed stock of other land (mio. ha) ov_landdiff_natveg(t,type) Aggregated difference in natveg land compared to previous timestep (mio. ha) - ov35_other_expansion(t,j,type) Other land expansion compared to previous timestep (mio. ha) - ov35_other_reduction(t,j,ac,type) Other land reduction compared to previous timestep (mio. ha) + ov35_other_expansion(t,j,othertype35,type) Other land expansion compared to previous timestep (mio. ha) + ov35_other_reduction(t,j,ac,othertype35,type) Other land reduction compared to previous timestep (mio. ha) ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha) ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha) - ov35_hvarea_other(t,j,ac,type) Harvested area from other land (mio. ha) + ov35_hvarea_other(t,j,ac,othertype35,type) Harvested area from other land (mio. ha) ov35_hvarea_primforest(t,j,type) Harvested area from primary forest (mio. ha) ov_prod_natveg(t,j,land_natveg,kforestry,type) Production of woody biomass from natural vegetation (mio. tDM per yr) ov_cost_hvarea_natveg(t,i,type) Cost of harvesting natural vegetation (mio. USD) @@ -115,8 +109,8 @@ parameters oq35_min_forest(t,j,type) Minimum forest land constraint (mio. ha) oq35_min_other(t,j,type) Minimum other land constraint (mio. ha) oq35_landdiff(t,type) Difference in natveg land (mio. ha) - oq35_other_expansion(t,j,type) Other land expansion (mio. ha) - oq35_other_reduction(t,j,ac,type) Other land reduction (mio. ha) + oq35_other_expansion(t,j,othertype35,type) Other land expansion (mio. ha) + oq35_other_reduction(t,j,ac,othertype35,type) Other land reduction (mio. ha) oq35_secdforest_expansion(t,j,type) Secdforest expansion (mio. ha) oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) @@ -125,7 +119,7 @@ parameters oq35_other_regeneration(t,j,type) Other land regeneration (mio. ha) oq35_other_est(t,j,ac,type) Distribution of other land additions over ac_est (mio. ha) oq35_secdforest_est(t,j,ac,type) Distribution of secdforest additions over ac_est (mio. ha) - oq35_hvarea_other(t,j,ac,type) Harvested area other land (mio. ha) + oq35_hvarea_other(t,j,ac,othertype35,type) Harvested area other land (mio. ha) oq35_hvarea_secdforest(t,j,ac,type) Harvested area secdforest (mio. ha) oq35_hvarea_primforest(t,j,type) Harvested area primforest (mio. ha) oq35_prod_secdforest(t,j,type) Production of woody biomass from secondary forests (mio. tDM per yr) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 14a7db4a1f..937693ac1c 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -10,7 +10,7 @@ q35_land_secdforest(j2) .. vm_land(j2,"secdforest") =e= sum(ac, v35_secdforest(j2,ac)); - q35_land_other(j2) .. vm_land(j2,"other") =e= sum(ac, v35_other(j2,ac)) + sum(ac, v35_youngsecdf(j2,ac)); + q35_land_other(j2) .. vm_land(j2,"other") =e= sum((ac,othertype35), vm_land_other(j2,ac,othertype35)); *' The total natural land area cannot be smaller than the total natural land conservation target. *' Area requirements for natural land conservation are derived from WDPA and formulated based on @@ -49,8 +49,7 @@ q35_carbon_other(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"other",ag_pools,stockType) =e= - m_carbon_stock_ac(v35_other,pm_carbon_density_other_ac,"ac","ac_sub") - + m_carbon_stock_ac(v35_youngsecdf,pm_carbon_density_secdforest_ac,"ac","ac_sub"); + m_carbon_stock_ac(vm_land_other,p35_carbon_density_other,"ac,othertype35","ac_sub,othertype35"); *' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). @@ -65,7 +64,7 @@ q35_bv_other(j2,potnatveg) .. vm_bv(j2,"other",potnatveg) =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), v35_other(j2,ac)) * + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), sum(othertype35, vm_land_other(j2,ac,othertype35))) * fm_bii_coeff(bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); *' NPI/NDC land protection policies based on country reports are implemented as @@ -86,19 +85,19 @@ q35_landdiff .. vm_landdiff_natveg =e= sum(j2, - v35_other_expansion(j2) - + sum(ac_sub, v35_other_reduction(j2,ac_sub)) + sum(othertype35,v35_other_expansion(j2,othertype35)) + + sum((ac_sub,othertype35), v35_other_reduction(j2,ac_sub,othertype35)) + v35_secdforest_expansion(j2) - + sum(ac_sub, v35_secdforest_reduction(j2,ac_sub)) + + sum((ac_sub), v35_secdforest_reduction(j2,ac_sub)) + v35_primforest_reduction(j2)); - q35_other_expansion(j2) .. - v35_other_expansion(j2) =e= - sum(ac_est, v35_other(j2,ac_est)); + q35_other_expansion(j2,othertype35) .. + v35_other_expansion(j2,othertype35) =e= + sum(ac_est, vm_land_other(j2,ac_est,othertype35)); - q35_other_reduction(j2,ac_sub) .. - v35_other_reduction(j2,ac_sub) =e= - pc35_other(j2,ac_sub) - v35_other(j2,ac_sub); + q35_other_reduction(j2,ac_sub,othertype35) .. + v35_other_reduction(j2,ac_sub,othertype35) =e= + pc35_land_other(j2,ac_sub,othertype35) - vm_land_other(j2,ac_sub,othertype35); q35_secdforest_expansion(j2) .. v35_secdforest_expansion(j2) =e= @@ -127,8 +126,8 @@ q35_cost_hvarea(i2).. vm_cost_hvarea_natveg(i2) =e= sum((ct,cell(i2,j2),ac_sub), v35_hvarea_secdforest(j2,ac_sub)) * s35_timber_harvest_cost_secdforest - + sum((ct,cell(i2,j2),ac_sub), v35_hvarea_other(j2, ac_sub)) * s35_timber_harvest_cost_other - + sum((ct,cell(i2,j2)), v35_hvarea_primforest(j2)) * s35_timber_harvest_cost_primforest + + sum((ct,cell(i2,j2),ac_sub,othertype35), v35_hvarea_other(j2,ac_sub,othertype35)) * s35_timber_harvest_cost_other + + sum((ct,cell(i2,j2)), v35_hvarea_primforest(j2)) * s35_timber_harvest_cost_primforest ; ** Secondary forest @@ -136,8 +135,8 @@ q35_cost_hvarea(i2).. *' area under production with corresponding yields of secondary forests, divided by the timestep length. q35_prod_secdforest(j2).. - sum(kforestry, vm_prod_natveg(j2,"secdforest",kforestry)) - =e= + sum(kforestry, vm_prod_natveg(j2,"secdforest",kforestry)) + =e= sum(ac_sub, v35_hvarea_secdforest(j2,ac_sub) * sum(ct,pm_timber_yield(ct,j2,ac_sub,"secdforest"))) / m_timestep_length_forestry; ** Primary forest @@ -145,9 +144,9 @@ q35_prod_secdforest(j2).. *' area under production with corresponding yields of primary forests, divided by the timestep length. q35_prod_primforest(j2).. - sum(kforestry, vm_prod_natveg(j2,"primforest",kforestry)) - =e= - v35_hvarea_primforest(j2) * sum(ct, pm_timber_yield(ct,j2,"acx","primforest")) / m_timestep_length_forestry; + sum(kforestry, vm_prod_natveg(j2,"primforest",kforestry)) + =e= + v35_hvarea_primforest(j2) * sum(ct, pm_timber_yield(ct,j2,"acx","primforest")) / m_timestep_length_forestry; ** Other land *' Wood-fuel production from other land is calculated by multiplying the area under @@ -155,10 +154,12 @@ q35_prod_primforest(j2).. *' Wood production from other landis not allowed. q35_prod_other(j2).. - vm_prod_natveg(j2,"other","woodfuel") - =e= - sum(ac_sub, v35_hvarea_other(j2,ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"other"))) / m_timestep_length_forestry - ; + vm_prod_natveg(j2,"other","woodfuel") + =e= + (sum(ac_sub, v35_hvarea_other(j2,ac_sub,"othernat") * sum(ct, pm_timber_yield(ct,j2,ac_sub,"other"))) + + sum(ac_sub, v35_hvarea_other(j2,ac_sub,"youngsecdf") * sum(ct, pm_timber_yield(ct,j2,ac_sub,"secdforest")))) + / m_timestep_length_forestry + ; *' Following equations show the harvested area from natural vegetation i.e. primary *' forests, secondary forests and other land. Important to note here that no wood @@ -167,19 +168,19 @@ q35_prod_other(j2).. *' not all lost area is (or should be) used for production. q35_hvarea_secdforest(j2,ac_sub).. - v35_hvarea_secdforest(j2,ac_sub) - =l= - v35_secdforest_reduction(j2,ac_sub); + v35_hvarea_secdforest(j2,ac_sub) + =l= + v35_secdforest_reduction(j2,ac_sub); q35_hvarea_primforest(j2).. - v35_hvarea_primforest(j2) - =l= - v35_primforest_reduction(j2); + v35_hvarea_primforest(j2) + =l= + v35_primforest_reduction(j2); -q35_hvarea_other(j2,ac_sub).. - v35_hvarea_other(j2,ac_sub) - =l= - v35_other_reduction(j2,ac_sub); +q35_hvarea_other(j2,ac_sub,othertype35).. + v35_hvarea_other(j2,ac_sub,othertype35) + =l= + v35_other_reduction(j2,ac_sub,othertype35); *' The constraint for overall forest establishment, including forestry, is given @@ -187,11 +188,11 @@ q35_hvarea_other(j2,ac_sub).. *' natural forestarea minus the recovering secondary forest area. q35_max_forest_establishment(j2).. - sum(land_forest, vm_landexpansion(j2,land_forest)) - =l= - pcm_max_forest_est(j2) - - sum(ac, v35_youngsecdf(j2,ac)) - ; + sum(land_forest, vm_landexpansion(j2,land_forest)) + =l= + pcm_max_forest_est(j2) + - sum(ac, vm_land_other(j2,ac,"youngsecdf")) + ; *' Harvested secondary forest is still considered secondary forests due to *' restrictive NPI definitions. Also primary forest harvested will be considered @@ -199,20 +200,20 @@ q35_max_forest_establishment(j2).. *' secondary forest and ends up in the youngest age-class (and follows regrowth) q35_secdforest_regeneration(j2).. - sum(ac_est, v35_secdforest(j2,ac_est)) - =e= - sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) - + v35_hvarea_primforest(j2) - + p35_land_restoration(j2,"secdforest") - ; + sum(ac_est, v35_secdforest(j2,ac_est)) + =e= + sum(ac_sub,v35_hvarea_secdforest(j2,ac_sub)) + + v35_hvarea_primforest(j2) + + p35_land_restoration(j2,"secdforest") + ; *' Harvested other land is still considered other land q35_other_regeneration(j2).. - sum(ac_est, v35_other(j2,ac_est)) - =g= - sum(ac_sub,v35_hvarea_other(j2,ac_sub)) - ; + sum(ac_est, vm_land_other(j2,ac_est,"othernat")) + =g= + sum((ac_sub,othertype35),v35_hvarea_other(j2,ac_sub,othertype35)) + ; *' The following two constraints distribute additions to secdforest and other land *' over ac_est, which depends on the time step length (e.g. ac0 and ac5 for a 10 year time step). @@ -221,5 +222,5 @@ q35_secdforest_est(j2,ac_est) .. v35_secdforest(j2,ac_est) =e= sum(ac_est2, v35_secdforest(j2,ac_est2))/card(ac_est2); q35_other_est(j2,ac_est) .. -v35_other(j2,ac_est) =e= sum(ac_est2, v35_other(j2,ac_est2))/card(ac_est2); +vm_land_other(j2,ac_est,"othernat") =e= sum(ac_est2, vm_land_other(j2,ac_est2,"othernat"))/card(ac_est2); diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index d4be352bbe..b528058e11 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -9,8 +9,7 @@ pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); *other land age class calculation -pc35_other(j,ac) = v35_other.l(j,ac); -pc35_youngsecdf(j,ac) = v35_youngsecdf.l(j,ac); +pc35_land_other(j,ac,othertype35) = vm_land_other.l(j,ac,othertype35); * Reset forest establishment bound pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); @@ -18,16 +17,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); - ov35_youngsecdf(t,j,ac,"marginal") = v35_youngsecdf.m(j,ac); - ov35_other(t,j,ac,"marginal") = v35_other.m(j,ac); + ov_land_other(t,j,ac,othertype35,"marginal") = vm_land_other.m(j,ac,othertype35); ov_landdiff_natveg(t,"marginal") = vm_landdiff_natveg.m; - ov35_other_expansion(t,j,"marginal") = v35_other_expansion.m(j); - ov35_other_reduction(t,j,ac,"marginal") = v35_other_reduction.m(j,ac); + ov35_other_expansion(t,j,othertype35,"marginal") = v35_other_expansion.m(j,othertype35); + ov35_other_reduction(t,j,ac,othertype35,"marginal") = v35_other_reduction.m(j,ac,othertype35); ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j); ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac); ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j); ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac); - ov35_hvarea_other(t,j,ac,"marginal") = v35_hvarea_other.m(j,ac); + ov35_hvarea_other(t,j,ac,othertype35,"marginal") = v35_hvarea_other.m(j,ac,othertype35); ov35_hvarea_primforest(t,j,"marginal") = v35_hvarea_primforest.m(j); ov_prod_natveg(t,j,land_natveg,kforestry,"marginal") = vm_prod_natveg.m(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"marginal") = vm_cost_hvarea_natveg.m(i); @@ -39,8 +37,8 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_forest(t,j,"marginal") = q35_min_forest.m(j); oq35_min_other(t,j,"marginal") = q35_min_other.m(j); oq35_landdiff(t,"marginal") = q35_landdiff.m; - oq35_other_expansion(t,j,"marginal") = q35_other_expansion.m(j); - oq35_other_reduction(t,j,ac,"marginal") = q35_other_reduction.m(j,ac); + oq35_other_expansion(t,j,othertype35,"marginal") = q35_other_expansion.m(j,othertype35); + oq35_other_reduction(t,j,ac,othertype35,"marginal") = q35_other_reduction.m(j,ac,othertype35); oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j); oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); @@ -49,7 +47,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); oq35_other_est(t,j,ac,"marginal") = q35_other_est.m(j,ac); oq35_secdforest_est(t,j,ac,"marginal") = q35_secdforest_est.m(j,ac); - oq35_hvarea_other(t,j,ac,"marginal") = q35_hvarea_other.m(j,ac); + oq35_hvarea_other(t,j,ac,othertype35,"marginal") = q35_hvarea_other.m(j,ac,othertype35); oq35_hvarea_secdforest(t,j,ac,"marginal") = q35_hvarea_secdforest.m(j,ac); oq35_hvarea_primforest(t,j,"marginal") = q35_hvarea_primforest.m(j); oq35_prod_secdforest(t,j,"marginal") = q35_prod_secdforest.m(j); @@ -63,16 +61,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_secdforest_restoration(t,j,"marginal") = q35_secdforest_restoration.m(j); oq35_other_restoration(t,j,"marginal") = q35_other_restoration.m(j); ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac); - ov35_youngsecdf(t,j,ac,"level") = v35_youngsecdf.l(j,ac); - ov35_other(t,j,ac,"level") = v35_other.l(j,ac); + ov_land_other(t,j,ac,othertype35,"level") = vm_land_other.l(j,ac,othertype35); ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l; - ov35_other_expansion(t,j,"level") = v35_other_expansion.l(j); - ov35_other_reduction(t,j,ac,"level") = v35_other_reduction.l(j,ac); + ov35_other_expansion(t,j,othertype35,"level") = v35_other_expansion.l(j,othertype35); + ov35_other_reduction(t,j,ac,othertype35,"level") = v35_other_reduction.l(j,ac,othertype35); ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j); ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac); ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j); ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac); - ov35_hvarea_other(t,j,ac,"level") = v35_hvarea_other.l(j,ac); + ov35_hvarea_other(t,j,ac,othertype35,"level") = v35_hvarea_other.l(j,ac,othertype35); ov35_hvarea_primforest(t,j,"level") = v35_hvarea_primforest.l(j); ov_prod_natveg(t,j,land_natveg,kforestry,"level") = vm_prod_natveg.l(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"level") = vm_cost_hvarea_natveg.l(i); @@ -84,8 +81,8 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_forest(t,j,"level") = q35_min_forest.l(j); oq35_min_other(t,j,"level") = q35_min_other.l(j); oq35_landdiff(t,"level") = q35_landdiff.l; - oq35_other_expansion(t,j,"level") = q35_other_expansion.l(j); - oq35_other_reduction(t,j,ac,"level") = q35_other_reduction.l(j,ac); + oq35_other_expansion(t,j,othertype35,"level") = q35_other_expansion.l(j,othertype35); + oq35_other_reduction(t,j,ac,othertype35,"level") = q35_other_reduction.l(j,ac,othertype35); oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j); oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); @@ -94,7 +91,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); oq35_other_est(t,j,ac,"level") = q35_other_est.l(j,ac); oq35_secdforest_est(t,j,ac,"level") = q35_secdforest_est.l(j,ac); - oq35_hvarea_other(t,j,ac,"level") = q35_hvarea_other.l(j,ac); + oq35_hvarea_other(t,j,ac,othertype35,"level") = q35_hvarea_other.l(j,ac,othertype35); oq35_hvarea_secdforest(t,j,ac,"level") = q35_hvarea_secdforest.l(j,ac); oq35_hvarea_primforest(t,j,"level") = q35_hvarea_primforest.l(j); oq35_prod_secdforest(t,j,"level") = q35_prod_secdforest.l(j); @@ -108,16 +105,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_secdforest_restoration(t,j,"level") = q35_secdforest_restoration.l(j); oq35_other_restoration(t,j,"level") = q35_other_restoration.l(j); ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac); - ov35_youngsecdf(t,j,ac,"upper") = v35_youngsecdf.up(j,ac); - ov35_other(t,j,ac,"upper") = v35_other.up(j,ac); + ov_land_other(t,j,ac,othertype35,"upper") = vm_land_other.up(j,ac,othertype35); ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up; - ov35_other_expansion(t,j,"upper") = v35_other_expansion.up(j); - ov35_other_reduction(t,j,ac,"upper") = v35_other_reduction.up(j,ac); + ov35_other_expansion(t,j,othertype35,"upper") = v35_other_expansion.up(j,othertype35); + ov35_other_reduction(t,j,ac,othertype35,"upper") = v35_other_reduction.up(j,ac,othertype35); ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j); ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac); ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j); ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac); - ov35_hvarea_other(t,j,ac,"upper") = v35_hvarea_other.up(j,ac); + ov35_hvarea_other(t,j,ac,othertype35,"upper") = v35_hvarea_other.up(j,ac,othertype35); ov35_hvarea_primforest(t,j,"upper") = v35_hvarea_primforest.up(j); ov_prod_natveg(t,j,land_natveg,kforestry,"upper") = vm_prod_natveg.up(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"upper") = vm_cost_hvarea_natveg.up(i); @@ -129,8 +125,8 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_forest(t,j,"upper") = q35_min_forest.up(j); oq35_min_other(t,j,"upper") = q35_min_other.up(j); oq35_landdiff(t,"upper") = q35_landdiff.up; - oq35_other_expansion(t,j,"upper") = q35_other_expansion.up(j); - oq35_other_reduction(t,j,ac,"upper") = q35_other_reduction.up(j,ac); + oq35_other_expansion(t,j,othertype35,"upper") = q35_other_expansion.up(j,othertype35); + oq35_other_reduction(t,j,ac,othertype35,"upper") = q35_other_reduction.up(j,ac,othertype35); oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j); oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); @@ -139,7 +135,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); oq35_other_est(t,j,ac,"upper") = q35_other_est.up(j,ac); oq35_secdforest_est(t,j,ac,"upper") = q35_secdforest_est.up(j,ac); - oq35_hvarea_other(t,j,ac,"upper") = q35_hvarea_other.up(j,ac); + oq35_hvarea_other(t,j,ac,othertype35,"upper") = q35_hvarea_other.up(j,ac,othertype35); oq35_hvarea_secdforest(t,j,ac,"upper") = q35_hvarea_secdforest.up(j,ac); oq35_hvarea_primforest(t,j,"upper") = q35_hvarea_primforest.up(j); oq35_prod_secdforest(t,j,"upper") = q35_prod_secdforest.up(j); @@ -153,16 +149,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_secdforest_restoration(t,j,"upper") = q35_secdforest_restoration.up(j); oq35_other_restoration(t,j,"upper") = q35_other_restoration.up(j); ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac); - ov35_youngsecdf(t,j,ac,"lower") = v35_youngsecdf.lo(j,ac); - ov35_other(t,j,ac,"lower") = v35_other.lo(j,ac); + ov_land_other(t,j,ac,othertype35,"lower") = vm_land_other.lo(j,ac,othertype35); ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo; - ov35_other_expansion(t,j,"lower") = v35_other_expansion.lo(j); - ov35_other_reduction(t,j,ac,"lower") = v35_other_reduction.lo(j,ac); + ov35_other_expansion(t,j,othertype35,"lower") = v35_other_expansion.lo(j,othertype35); + ov35_other_reduction(t,j,ac,othertype35,"lower") = v35_other_reduction.lo(j,ac,othertype35); ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j); ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac); ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j); ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac); - ov35_hvarea_other(t,j,ac,"lower") = v35_hvarea_other.lo(j,ac); + ov35_hvarea_other(t,j,ac,othertype35,"lower") = v35_hvarea_other.lo(j,ac,othertype35); ov35_hvarea_primforest(t,j,"lower") = v35_hvarea_primforest.lo(j); ov_prod_natveg(t,j,land_natveg,kforestry,"lower") = vm_prod_natveg.lo(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"lower") = vm_cost_hvarea_natveg.lo(i); @@ -174,8 +169,8 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_forest(t,j,"lower") = q35_min_forest.lo(j); oq35_min_other(t,j,"lower") = q35_min_other.lo(j); oq35_landdiff(t,"lower") = q35_landdiff.lo; - oq35_other_expansion(t,j,"lower") = q35_other_expansion.lo(j); - oq35_other_reduction(t,j,ac,"lower") = q35_other_reduction.lo(j,ac); + oq35_other_expansion(t,j,othertype35,"lower") = q35_other_expansion.lo(j,othertype35); + oq35_other_reduction(t,j,ac,othertype35,"lower") = q35_other_reduction.lo(j,ac,othertype35); oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j); oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); @@ -184,7 +179,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); oq35_other_est(t,j,ac,"lower") = q35_other_est.lo(j,ac); oq35_secdforest_est(t,j,ac,"lower") = q35_secdforest_est.lo(j,ac); - oq35_hvarea_other(t,j,ac,"lower") = q35_hvarea_other.lo(j,ac); + oq35_hvarea_other(t,j,ac,othertype35,"lower") = q35_hvarea_other.lo(j,ac,othertype35); oq35_hvarea_secdforest(t,j,ac,"lower") = q35_hvarea_secdforest.lo(j,ac); oq35_hvarea_primforest(t,j,"lower") = q35_hvarea_primforest.lo(j); oq35_prod_secdforest(t,j,"lower") = q35_prod_secdforest.lo(j); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index cce3cf00ca..773cc7587e 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -6,9 +6,8 @@ *** | Contact: magpie@pik-potsdam.de ** initialize other land -i35_other(j,ac) = 0; -i35_youngsecdf(j,ac) = 0; -i35_other(j,"acx") = pcm_land(j,"other"); +i35_land_other(j,ac,othertype35) = 0; +i35_land_other(j,"acx","othernat") = pcm_land(j,"other"); ** initialize secdforest area depending on switch. if(s35_secdf_distribution = 0, @@ -34,8 +33,7 @@ elseif s35_secdf_distribution = 2, i35_secdforest(j,"acx") = i35_secdforest(j,"acx") + (pcm_land(j,"secdforest") - sum(ac, i35_secdforest(j,ac))); *initialize parameter -p35_other(t,j,ac) = 0; -p35_youngsecdf(t,j,ac) = 0; +p35_land_other(t,j,ac,othertype35) = 0; p35_secdforest(t,j,ac) = 0; * initialize forest disturbance losses @@ -81,5 +79,4 @@ m_sigmoid_time_interpol(p35_damage_fader,sm_fix_SSP2,s35_forest_damage_end,0,1); * --------------------------------------- pc35_secdforest(j,ac) = i35_secdforest(j,ac); - pc35_youngsecdf(j,ac) = i35_youngsecdf(j,ac); - pc35_other(j,ac) = i35_other(j,ac); + pc35_land_other(j,ac,othertype35) = i35_land_other(j,ac,othertype35); diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index be972d342c..9d04ec6af1 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,21 +45,21 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Distribute forestry abandonement -* Abandoned forestry is directly shifted into pc35_youngsecdf because it is +* Abandoned forestry is directly shifted into pc35_land_other(j,ac_est,"youngsecdf") because it is * assumed that forestry was located in areas suitable to grow forests. -pc35_youngsecdf(j,ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); -pc35_youngsecdf(j,ac_est)$(sum(ac_est2,pc35_youngsecdf(j,ac_est2)) > pcm_max_forest_est(j)) = pcm_max_forest_est(j)/card(ac_est2); +pc35_land_other(j,ac_est,"youngsecdf") = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); +pc35_land_other(j,ac_est,"youngsecdf")$(sum(ac_est2,pc35_land_other(j,ac_est2,"youngsecdf")) > pcm_max_forest_est(j)) = pcm_max_forest_est(j)/card(ac_est2); * The proportion of secondary forest recovery in total natveg recovery is derived * from the remaining forest recovery area -p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_youngsecdf(j,ac)); +p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,ac,"youngsecdf")); p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; -* Abandoned land pc35_other(j,ac_est) is then distributed proportionally using the forest recovery share. -p35_recovered_forest(t,j,ac_est) = pc35_other(j,ac_est) * p35_forest_recovery_shr(j); -p35_recovered_forest(t,j,ac_est)$(sum(ac_est2,p35_recovered_forest(t,j,ac_est2)) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j)/card(ac_est2); -pc35_other(j,ac_est) = pc35_other(j,ac_est) - p35_recovered_forest(t,j,ac_est); -pc35_youngsecdf(j,ac_est) = pc35_youngsecdf(j,ac_est) + p35_recovered_forest(t,j,ac_est); +* Abandoned land pc35_land_other(j,ac_est,"othernat") is then distributed proportionally using the forest recovery share. +p35_forest_recovery_area(t,j,ac_est) = pc35_land_other(j,ac_est,"othernat") * p35_forest_recovery_shr(j); +p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2,p35_forest_recovery_area(t,j,ac_est2)) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j)/card(ac_est2); +pc35_land_other(j,ac_est,"othernat") = pc35_land_other(j,ac_est,"othernat") - p35_forest_recovery_area(t,j,ac_est); +pc35_land_other(j,ac_est,"youngsecdf") = pc35_land_other(j,ac_est,"youngsecdf") + p35_forest_recovery_area(t,j,ac_est); * ------------------------------------------------ * Natural vegetation growth (age-class shift) @@ -68,16 +68,10 @@ pc35_youngsecdf(j,ac_est) = pc35_youngsecdf(j,ac_est) + p35_recovered_forest(t,j * Regrowth of natural vegetation (natural succession) is modelled by shifting age-classes according to time step length. s35_shift = m_timestep_length_forestry/5; * example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) - p35_other(t,j,ac)$(ord(ac) > s35_shift) = pc35_other(j,ac-s35_shift); + p35_land_other(t,j,ac,othertype35)$(ord(ac) > s35_shift) = pc35_land_other(j,ac-s35_shift,othertype35); * account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation - p35_other(t,j,"acx") = p35_other(t,j,"acx") - + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_other(j,ac)); - -* example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) - p35_youngsecdf(t,j,ac)$(ord(ac) > s35_shift) = pc35_youngsecdf(j,ac-s35_shift); -* account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation - p35_youngsecdf(t,j,"acx") = p35_youngsecdf(t,j,"acx") - + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_youngsecdf(j,ac)); + p35_land_other(t,j,"acx",othertype35) = p35_land_other(t,j,"acx",othertype35) + + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_land_other(j,ac,othertype35)); * Usual shift * example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) @@ -96,8 +90,8 @@ s35_shift = m_timestep_length_forestry/5; *' exceeds a threshold of 20 tC/ha the respective area is shifted from young secondary *' forest, which is still considered other land, to secondary forest land. p35_maturesecdf(t,j,ac)$(not sameas(ac,"acx")) = - p35_youngsecdf(t,j,ac)$(pm_carbon_density_secdforest_ac(t,j,ac,"vegc") > 20); -p35_youngsecdf(t,j,ac) = p35_youngsecdf(t,j,ac) - p35_maturesecdf(t,j,ac); + p35_land_other(t,j,ac,"youngsecdf")$(pm_carbon_density_secdforest_ac(t,j,ac,"vegc") > 20); +p35_land_other(t,j,ac,"youngsecdf") = p35_land_other(t,j,ac,"youngsecdf") - p35_maturesecdf(t,j,ac); p35_secdforest(t,j,ac) = p35_secdforest(t,j,ac) + p35_maturesecdf(t,j,ac); *' @stop @@ -106,12 +100,11 @@ v35_secdforest.l(j,ac) = pc35_secdforest(j,ac); vm_land.l(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); pcm_land(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); -pc35_other(j,ac) = p35_other(t,j,ac); -v35_other.l(j,ac) = pc35_other(j,ac); -pc35_youngsecdf(j,ac) = p35_youngsecdf(t,j,ac); -v35_youngsecdf.l(j,ac) = pc35_youngsecdf(j,ac); -vm_land.l(j,"other") = sum(ac, pc35_other(j,ac)) + sum(ac, pc35_youngsecdf(j,ac)); -pcm_land(j,"other") = sum(ac, pc35_other(j,ac)) + sum(ac, pc35_youngsecdf(j,ac)); +pc35_land_other(j,ac,othertype35) = p35_land_other(t,j,ac,othertype35); +vm_land_other.l(j,ac,othertype35) = pc35_land_other(j,ac,othertype35); + +vm_land.l(j,"other") = sum((ac,othertype35), pc35_land_other(j,ac,othertype35)); +pcm_land(j,"other") = sum((ac,othertype35), pc35_land_other(j,ac,othertype35)); * ------------------------------------- * Set bounds based on land conservation @@ -177,26 +170,33 @@ vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + ** Other land *reset bounds -v35_other.lo(j,ac) = 0; -v35_other.up(j,ac) = Inf; +vm_land_other.lo(j,ac,"othernat") = 0; +vm_land_other.up(j,ac,"othernat") = Inf; +vm_land_other.lo(j,ac,"youngsecdf") = 0; *set upper bound -v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); -m_boundfix(v35_other,(j,ac_sub),l,1e-6); -v35_youngsecdf.lo(j,ac_sub) = 0; -v35_youngsecdf.up(j,ac_sub) = pc35_youngsecdf(j,ac_sub); -m_boundfix(v35_youngsecdf,(j,ac_sub),l,1e-6); -v35_youngsecdf.fx(j,ac_est) = 0; +vm_land_other.up(j,ac_sub,"othernat") = pc35_land_other(j,ac_sub,"othernat"); +vm_land_other.up(j,ac_sub,"youngsecdf") = pc35_land_other(j,ac_sub,"youngsecdf"); +vm_land_other.fx(j,ac_est,"youngsecdf") = 0; +m_boundfix(vm_land_other,(j,ac_sub,othertype35),l,1e-6); + * Other land conservation * protection bound fix -pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_other(j,ac_sub))) < 1e-6) = sum(ac_sub, pc35_other(j,ac_sub)); +pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_land_other(j,ac_sub,"othernat"))) < 1e-6) = sum(ac_sub, pc35_land_other(j,ac_sub,"othernat")); * set restoration target p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * Do not restore other land in areas where total natural * land area meets the total natural land conservation target p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; * set conservation bound -vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); +vm_land_other.lo(j,ac,"othernat") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); + +* ---------------------------- +* Calculate carbon density +* ------------------------------ + +p35_carbon_density_other(t,j,ac,"othernat",ag_pools) = pm_carbon_density_other_ac(t,j,ac,ag_pools); +p35_carbon_density_other(t,j,ac,"youngsecdf",ag_pools) = pm_carbon_density_secdforest_ac(t,j,ac,ag_pools); * ---------------------------- * NPI/NDC protection policy @@ -208,18 +208,18 @@ p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"othe ** Youngest age classes are not allowed to be harvested v35_hvarea_secdforest.fx(j,ac_est) = 0; -v35_hvarea_other.fx(j,ac_est) = 0; +v35_hvarea_other.fx(j,ac_est,othertype35) = 0; v35_secdforest_reduction.fx(j,ac_est) = 0; -v35_other_reduction.fx(j,ac_est) = 0; +v35_other_reduction.fx(j,ac_est,othertype35) = 0; vm_prod_natveg.fx(j,"other","wood") = 0; if(s35_hvarea = 0, v35_hvarea_secdforest.fx(j,ac_sub) = 0; v35_hvarea_primforest.fx(j) = 0; - v35_hvarea_other.fx(j,ac_sub) = 0; + v35_hvarea_other.fx(j,ac_sub,othertype35) = 0; elseif s35_hvarea = 1, v35_hvarea_secdforest.fx(j,ac_sub) = (v35_secdforest.l(j,ac_sub) - v35_secdforest.lo(j,ac_sub))*s35_hvarea_secdforest*m_timestep_length_forestry; v35_hvarea_primforest.fx(j) = (vm_land.l(j,"primforest") - vm_land.lo(j,"primforest"))*s35_hvarea_primforest*m_timestep_length_forestry; - v35_hvarea_other.fx(j,ac_sub) = (v35_other.l(j,ac_sub) - v35_other.lo(j,ac_sub))*s35_hvarea_other*m_timestep_length_forestry; + v35_hvarea_other.fx(j,ac_sub,othertype35) = (vm_land_other.l(j,ac_sub,othertype35) - vm_land_other.lo(j,ac_sub,othertype35))*s35_hvarea_other*m_timestep_length_forestry; ); diff --git a/modules/35_natveg/pot_forest_may24/sets.gms b/modules/35_natveg/pot_forest_may24/sets.gms index c2c49b83d8..517e5d564b 100644 --- a/modules/35_natveg/pot_forest_may24/sets.gms +++ b/modules/35_natveg/pot_forest_may24/sets.gms @@ -20,6 +20,9 @@ sets pol_stock35 Land types for land protection policies / forest, other / + othertype35 Other land types + / othernat, youngsecdf / + shock_scen Scenario name of forest carbon shock / none, 002lin2030,004lin2030,008lin2030,016lin2030 / diff --git a/modules/59_som/cellpool_aug16/equations.gms b/modules/59_som/cellpool_aug16/equations.gms index ddf8108683..b51979302e 100644 --- a/modules/59_som/cellpool_aug16/equations.gms +++ b/modules/59_som/cellpool_aug16/equations.gms @@ -7,13 +7,13 @@ *' @equations -*' For every cell a new equilibrium value for the soil organic carbon pool +*' For every cell a new equilibrium value for the soil organic carbon pool *' on cropland as the sum over all crop types and irrigation regimes is calculated q59_som_target_cropland(j2) .. v59_som_target(j2,"crop") - =e= (sum((kcr,w), vm_area(j2,kcr,w) * i59_cratio(j2,kcr,w)) - + vm_fallow(j2) * i59_cratio_fallow(j2)) * + =e= (sum((kcr,w), vm_area(j2,kcr,w) * i59_cratio(j2,kcr,w)) + + vm_fallow(j2) * i59_cratio_fallow(j2)) * sum(ct,f59_topsoilc_density(ct,j2)) ; *' as well as for all non cropland given by @@ -23,25 +23,25 @@ q59_som_target_noncropland(j2,noncropland59) .. =e= vm_land(j2,noncropland59) * sum(ct,f59_topsoilc_density(ct,j2)) ; -*' Depending on the setting of `c59_som_scenario `climate impacts (`cc`) +*' Depending on the setting of `c59_som_scenario `climate impacts (`cc`) *' are taken into account or not (`nocc` and `nocc_hist`). -*' For a static climate `f59_topsoilc_density` is set to the value of 1995 +*' For a static climate `f59_topsoilc_density` is set to the value of 1995 *' within the input of the module realization. -*' To get the current size of the soil organic carbon pool, the carbon -*' pool of the previous timestep is developing into the direction of the -*' above calculated target values taken the timestep depending lossrate +*' To get the current size of the soil organic carbon pool, the carbon +*' pool of the previous timestep is developing into the direction of the +*' above calculated target values taken the timestep depending lossrate *' into account by q59_som_pool(j2,land) .. v59_som_pool(j2,land) =e= sum(ct,i59_lossrate(ct)) * v59_som_target(j2,land) + (1 - sum(ct,i59_lossrate(ct))) * - sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * + sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * vm_lu_transitions(j2,land_from,land)) ; -*' Note that to account correctly for land-use transitions, carbon densities +*' Note that to account correctly for land-use transitions, carbon densities *' multiplied by the land-use transition matrix of the current timestep *' is used. @@ -49,23 +49,23 @@ q59_som_pool(j2,land) .. *' and the reference soil carbon pool of the subsoil q59_carbon_soil(j2,land,stockType) .. - vm_carbon_stock(j2, land,"soilc",stockType) - =e= v59_som_pool(j2, land) + vm_land(j2, land) * + vm_carbon_stock(j2, land,"soilc",stockType) + =e= v59_som_pool(j2, land) + vm_land(j2, land) * sum(ct,i59_subsoilc_density(ct,j2)); -*' The annual nitrogen release (or sink) for cropland soils is than +*' The annual nitrogen release (or sink) for cropland soils is than *' calculated by the loss of soil organic carbon given by q59_nr_som(j2) .. vm_nr_som(j2) =e= sum(ct,i59_lossrate(ct))/m_timestep_length*1/15 - * (sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * + * (sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * vm_lu_transitions(j2,land_from,"crop")) - v59_som_target(j2,"crop")) ; *' with the carbon to nitrogen ratio of soils assumed to be 15:1. -*' The amount of nitrogen that becomes available to cropland farming is +*' The amount of nitrogen that becomes available to cropland farming is *' limited by loss of soil organic matter by q59_nr_som_fertilizer(j2) .. diff --git a/modules/59_som/cellpool_jan23/equations.gms b/modules/59_som/cellpool_jan23/equations.gms index ddf8108683..b51979302e 100644 --- a/modules/59_som/cellpool_jan23/equations.gms +++ b/modules/59_som/cellpool_jan23/equations.gms @@ -7,13 +7,13 @@ *' @equations -*' For every cell a new equilibrium value for the soil organic carbon pool +*' For every cell a new equilibrium value for the soil organic carbon pool *' on cropland as the sum over all crop types and irrigation regimes is calculated q59_som_target_cropland(j2) .. v59_som_target(j2,"crop") - =e= (sum((kcr,w), vm_area(j2,kcr,w) * i59_cratio(j2,kcr,w)) - + vm_fallow(j2) * i59_cratio_fallow(j2)) * + =e= (sum((kcr,w), vm_area(j2,kcr,w) * i59_cratio(j2,kcr,w)) + + vm_fallow(j2) * i59_cratio_fallow(j2)) * sum(ct,f59_topsoilc_density(ct,j2)) ; *' as well as for all non cropland given by @@ -23,25 +23,25 @@ q59_som_target_noncropland(j2,noncropland59) .. =e= vm_land(j2,noncropland59) * sum(ct,f59_topsoilc_density(ct,j2)) ; -*' Depending on the setting of `c59_som_scenario `climate impacts (`cc`) +*' Depending on the setting of `c59_som_scenario `climate impacts (`cc`) *' are taken into account or not (`nocc` and `nocc_hist`). -*' For a static climate `f59_topsoilc_density` is set to the value of 1995 +*' For a static climate `f59_topsoilc_density` is set to the value of 1995 *' within the input of the module realization. -*' To get the current size of the soil organic carbon pool, the carbon -*' pool of the previous timestep is developing into the direction of the -*' above calculated target values taken the timestep depending lossrate +*' To get the current size of the soil organic carbon pool, the carbon +*' pool of the previous timestep is developing into the direction of the +*' above calculated target values taken the timestep depending lossrate *' into account by q59_som_pool(j2,land) .. v59_som_pool(j2,land) =e= sum(ct,i59_lossrate(ct)) * v59_som_target(j2,land) + (1 - sum(ct,i59_lossrate(ct))) * - sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * + sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * vm_lu_transitions(j2,land_from,land)) ; -*' Note that to account correctly for land-use transitions, carbon densities +*' Note that to account correctly for land-use transitions, carbon densities *' multiplied by the land-use transition matrix of the current timestep *' is used. @@ -49,23 +49,23 @@ q59_som_pool(j2,land) .. *' and the reference soil carbon pool of the subsoil q59_carbon_soil(j2,land,stockType) .. - vm_carbon_stock(j2, land,"soilc",stockType) - =e= v59_som_pool(j2, land) + vm_land(j2, land) * + vm_carbon_stock(j2, land,"soilc",stockType) + =e= v59_som_pool(j2, land) + vm_land(j2, land) * sum(ct,i59_subsoilc_density(ct,j2)); -*' The annual nitrogen release (or sink) for cropland soils is than +*' The annual nitrogen release (or sink) for cropland soils is than *' calculated by the loss of soil organic carbon given by q59_nr_som(j2) .. vm_nr_som(j2) =e= sum(ct,i59_lossrate(ct))/m_timestep_length*1/15 - * (sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * + * (sum((ct,land_from), p59_carbon_density(ct,j2,land_from) * vm_lu_transitions(j2,land_from,"crop")) - v59_som_target(j2,"crop")) ; *' with the carbon to nitrogen ratio of soils assumed to be 15:1. -*' The amount of nitrogen that becomes available to cropland farming is +*' The amount of nitrogen that becomes available to cropland farming is *' limited by loss of soil organic matter by q59_nr_som_fertilizer(j2) .. diff --git a/modules/59_som/static_jan19/declarations.gms b/modules/59_som/static_jan19/declarations.gms index e21b607893..85677def80 100644 --- a/modules/59_som/static_jan19/declarations.gms +++ b/modules/59_som/static_jan19/declarations.gms @@ -18,14 +18,16 @@ variables equations q59_soilcarbon_cropland(j,stockType) Cropland soil carbon content calculation (mio. tC) - q59_soilcarbon_noncropland(j,noncropland59,stockType) Non-cropland soil carbon content calculation (mio. tC) + q59_soilcarbon_regular(j,regularland59,stockType) Regular soil carbon content calculation (mio. tC) + q59_soilcarbon_other(j,stockType) Other land soil carbon content calculation (mio. tC) ; *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters - ov_nr_som(t,j,type) Release of soil organic matter (Mt N per yr) - ov_nr_som_fertilizer(t,j,type) Uptake of soil organic matter from plants (Mt N per yr) - oq59_soilcarbon_cropland(t,j,stockType,type) Cropland soil carbon content calculation (mio. tC) - oq59_soilcarbon_noncropland(t,j,noncropland59,stockType,type) Non-cropland soil carbon content calculation (mio. tC) + ov_nr_som(t,j,type) Release of soil organic matter (Mt N per yr) + ov_nr_som_fertilizer(t,j,type) Uptake of soil organic matter from plants (Mt N per yr) + oq59_soilcarbon_cropland(t,j,stockType,type) Cropland soil carbon content calculation (mio. tC) + oq59_soilcarbon_regular(t,j,regularland59,stockType,type) Regular soil carbon content calculation (mio. tC) + oq59_soilcarbon_other(t,j,stockType,type) Other land soil carbon content calculation (mio. tC) ; *##################### R SECTION END (OUTPUT DECLARATIONS) ##################### diff --git a/modules/59_som/static_jan19/equations.gms b/modules/59_som/static_jan19/equations.gms index ce63cccdb9..e2217bbe37 100644 --- a/modules/59_som/static_jan19/equations.gms +++ b/modules/59_som/static_jan19/equations.gms @@ -13,6 +13,14 @@ vm_land(j2,"crop") * sum(ct, i59_topsoilc_density(ct,j2) + i59_subsoilc_density(ct,j2)); *' The soil carbon content for all other land use types is calculated based on the full profile soil carbon density: - q59_soilcarbon_noncropland(j2,noncropland59,stockType) .. - vm_carbon_stock(j2,noncropland59,"soilc",stockType) =e= - sum(ct, vm_land(j2,noncropland59) * fm_carbon_density(ct,j2,noncropland59,"soilc")); + q59_soilcarbon_regular(j2,regularland59,stockType) .. + vm_carbon_stock(j2,regularland59,"soilc",stockType) =e= + sum(ct, vm_land(j2,regularland59) * fm_carbon_density(ct,j2,regularland59,"soilc")); + +q59_soilcarbon_other(j2,stockType) .. + vm_carbon_stock(j2,"other","soilc",stockType) =e= + sum((ct,ac), vm_land_other(j2,ac,"othernat") * fm_carbon_density(ct,j2,"other","soilc")) + + sum((ct,ac), vm_land_other(j2,ac,"youngsecdf") * fm_carbon_density(ct,j2,"secdforest","soilc")) ; + + + diff --git a/modules/59_som/static_jan19/postsolve.gms b/modules/59_som/static_jan19/postsolve.gms index 723fb9ba0a..36b8a66e20 100644 --- a/modules/59_som/static_jan19/postsolve.gms +++ b/modules/59_som/static_jan19/postsolve.gms @@ -8,21 +8,25 @@ *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### - ov_nr_som(t,j,"marginal") = vm_nr_som.m(j); - ov_nr_som_fertilizer(t,j,"marginal") = vm_nr_som_fertilizer.m(j); - oq59_soilcarbon_cropland(t,j,stockType,"marginal") = q59_soilcarbon_cropland.m(j,stockType); - oq59_soilcarbon_noncropland(t,j,noncropland59,stockType,"marginal") = q59_soilcarbon_noncropland.m(j,noncropland59,stockType); - ov_nr_som(t,j,"level") = vm_nr_som.l(j); - ov_nr_som_fertilizer(t,j,"level") = vm_nr_som_fertilizer.l(j); - oq59_soilcarbon_cropland(t,j,stockType,"level") = q59_soilcarbon_cropland.l(j,stockType); - oq59_soilcarbon_noncropland(t,j,noncropland59,stockType,"level") = q59_soilcarbon_noncropland.l(j,noncropland59,stockType); - ov_nr_som(t,j,"upper") = vm_nr_som.up(j); - ov_nr_som_fertilizer(t,j,"upper") = vm_nr_som_fertilizer.up(j); - oq59_soilcarbon_cropland(t,j,stockType,"upper") = q59_soilcarbon_cropland.up(j,stockType); - oq59_soilcarbon_noncropland(t,j,noncropland59,stockType,"upper") = q59_soilcarbon_noncropland.up(j,noncropland59,stockType); - ov_nr_som(t,j,"lower") = vm_nr_som.lo(j); - ov_nr_som_fertilizer(t,j,"lower") = vm_nr_som_fertilizer.lo(j); - oq59_soilcarbon_cropland(t,j,stockType,"lower") = q59_soilcarbon_cropland.lo(j,stockType); - oq59_soilcarbon_noncropland(t,j,noncropland59,stockType,"lower") = q59_soilcarbon_noncropland.lo(j,noncropland59,stockType); + ov_nr_som(t,j,"marginal") = vm_nr_som.m(j); + ov_nr_som_fertilizer(t,j,"marginal") = vm_nr_som_fertilizer.m(j); + oq59_soilcarbon_cropland(t,j,stockType,"marginal") = q59_soilcarbon_cropland.m(j,stockType); + oq59_soilcarbon_regular(t,j,regularland59,stockType,"marginal") = q59_soilcarbon_regular.m(j,regularland59,stockType); + oq59_soilcarbon_other(t,j,stockType,"marginal") = q59_soilcarbon_other.m(j,stockType); + ov_nr_som(t,j,"level") = vm_nr_som.l(j); + ov_nr_som_fertilizer(t,j,"level") = vm_nr_som_fertilizer.l(j); + oq59_soilcarbon_cropland(t,j,stockType,"level") = q59_soilcarbon_cropland.l(j,stockType); + oq59_soilcarbon_regular(t,j,regularland59,stockType,"level") = q59_soilcarbon_regular.l(j,regularland59,stockType); + oq59_soilcarbon_other(t,j,stockType,"level") = q59_soilcarbon_other.l(j,stockType); + ov_nr_som(t,j,"upper") = vm_nr_som.up(j); + ov_nr_som_fertilizer(t,j,"upper") = vm_nr_som_fertilizer.up(j); + oq59_soilcarbon_cropland(t,j,stockType,"upper") = q59_soilcarbon_cropland.up(j,stockType); + oq59_soilcarbon_regular(t,j,regularland59,stockType,"upper") = q59_soilcarbon_regular.up(j,regularland59,stockType); + oq59_soilcarbon_other(t,j,stockType,"upper") = q59_soilcarbon_other.up(j,stockType); + ov_nr_som(t,j,"lower") = vm_nr_som.lo(j); + ov_nr_som_fertilizer(t,j,"lower") = vm_nr_som_fertilizer.lo(j); + oq59_soilcarbon_cropland(t,j,stockType,"lower") = q59_soilcarbon_cropland.lo(j,stockType); + oq59_soilcarbon_regular(t,j,regularland59,stockType,"lower") = q59_soilcarbon_regular.lo(j,regularland59,stockType); + oq59_soilcarbon_other(t,j,stockType,"lower") = q59_soilcarbon_other.lo(j,stockType); *##################### R SECTION END (OUTPUT DEFINITIONS) ###################### diff --git a/modules/59_som/static_jan19/sets.gms b/modules/59_som/static_jan19/sets.gms index a55bf9518a..3a81f90c9c 100644 --- a/modules/59_som/static_jan19/sets.gms +++ b/modules/59_som/static_jan19/sets.gms @@ -6,8 +6,8 @@ *** | Contact: magpie@pik-potsdam.de sets -noncropland59(land) Soil carbon conserving landuse types -/past, forestry, primforest, secdforest, other, urban/ +regularland59(land) Soil carbon conserving landuse types +/ past, forestry, primforest, secdforest, urban / exo_scen59 exogenous scenarios for soil organic matter loss /constant, fadeout_2050/ From a48cf606acf03e0eaa5ca4aef6df885a08ec45e7 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 24 May 2024 15:02:58 +0200 Subject: [PATCH 226/259] not used fix --- modules/59_som/cellpool_aug16/not_used.txt | 2 ++ modules/59_som/cellpool_jan23/not_used.txt | 2 ++ 2 files changed, 4 insertions(+) create mode 100644 modules/59_som/cellpool_aug16/not_used.txt create mode 100644 modules/59_som/cellpool_jan23/not_used.txt diff --git a/modules/59_som/cellpool_aug16/not_used.txt b/modules/59_som/cellpool_aug16/not_used.txt new file mode 100644 index 0000000000..a62a4ec738 --- /dev/null +++ b/modules/59_som/cellpool_aug16/not_used.txt @@ -0,0 +1,2 @@ +name,type,reason +vm_land_other,input,not needed diff --git a/modules/59_som/cellpool_jan23/not_used.txt b/modules/59_som/cellpool_jan23/not_used.txt new file mode 100644 index 0000000000..a62a4ec738 --- /dev/null +++ b/modules/59_som/cellpool_jan23/not_used.txt @@ -0,0 +1,2 @@ +name,type,reason +vm_land_other,input,not needed From 8c8ee29e6b575b579e09b0b217a8966ccfdacac0 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Fri, 24 May 2024 15:44:10 +0200 Subject: [PATCH 227/259] other land bound fix --- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 9d04ec6af1..354e77c0f0 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -189,7 +189,7 @@ p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * land area meets the total natural land conservation target p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= sum((land_natveg, consv_type), pm_land_conservation(t,j,land_natveg,consv_type))) = 0; * set conservation bound -vm_land_other.lo(j,ac,"othernat") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); +vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); * ---------------------------- * Calculate carbon density From 1cfad9d872fbe0920bb25d8625c1f606e48e86b1 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 27 May 2024 10:26:40 +0200 Subject: [PATCH 228/259] reodered dimensions of new parameters and variables in line with module 32 to facilitate reporting --- .../pot_forest_may24/declarations.gms | 28 ++++----- .../35_natveg/pot_forest_may24/equations.gms | 36 +++++------ .../35_natveg/pot_forest_may24/postsolve.gms | 42 ++++++------- .../35_natveg/pot_forest_may24/preloop.gms | 8 +-- .../35_natveg/pot_forest_may24/presolve.gms | 62 +++++++++---------- modules/59_som/static_jan19/equations.gms | 4 +- 6 files changed, 90 insertions(+), 90 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 43532f0540..ff509557ed 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -11,11 +11,11 @@ scalars parameters i35_secdforest(j,ac) Initial secdforest (mio. ha) - i35_land_other(j,ac,othertype35) Initial other land (mio. ha) + i35_land_other(j,othertype35,ac) Initial other land (mio. ha) p35_secdforest(t,j,ac) Secdforest per age class (mio. ha) - p35_land_other(t,j,ac,othertype35) Other land per age class (mio. ha) + p35_land_other(t,j,othertype35,ac) Other land per age class (mio. ha) pc35_secdforest(j,ac) Secdforest per age class in current time step (mio. ha) - pc35_land_other(j,ac,othertype35) Other land per age class in current time step (mio. ha) + pc35_land_other(j,othertype35,ac) Other land per age class in current time step (mio. ha) p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) @@ -24,7 +24,7 @@ parameters p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) p35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) - p35_carbon_density_other(t,j,ac,othertype35,ag_pools) Carbon density other land (tC per ha) + p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) i35_plantedclass_ac(j,ac) Area of age-classes in secondary forest (1) @@ -45,7 +45,7 @@ equations q35_min_other(j) Minimum other land constraint (mio. ha) q35_landdiff Difference in natveg land (mio. ha) q35_other_expansion(j,othertype35) Other land expansion (mio. ha) - q35_other_reduction(j,ac,othertype35) Other land reduction (mio. ha) + q35_other_reduction(j,othertype35,ac) Other land reduction (mio. ha) q35_secdforest_expansion(j) Secdforest expansion (mio. ha) q35_secdforest_reduction(j,ac) Secdforest reduction (mio. ha) q35_primforest_reduction(j) Primforest reduction (mio. ha) @@ -54,7 +54,7 @@ equations q35_other_regeneration(j) Other land regeneration (mio. ha) q35_other_est(j,ac) Distribution of other land additions over ac_est (mio. ha) q35_secdforest_est(j,ac) Distribution of secdforest additions over ac_est (mio. ha) - q35_hvarea_other(j,ac,othertype35) Harvested area other land (mio. ha) + q35_hvarea_other(j,othertype35,ac) Harvested area other land (mio. ha) q35_hvarea_secdforest(j,ac) Harvested area secdforest (mio. ha) q35_hvarea_primforest(j) Harvested area primforest (mio. ha) q35_prod_secdforest(j) Production of woody biomass from secondary forests (mio. tDM per yr) @@ -71,15 +71,15 @@ equations positive variables v35_secdforest(j,ac) Detailed stock of secdforest (mio. ha) - vm_land_other(j,ac,othertype35) Detailed stock of other land (mio. ha) + vm_land_other(j,othertype35,ac) Detailed stock of other land (mio. ha) vm_landdiff_natveg Aggregated difference in natveg land compared to previous timestep (mio. ha) v35_other_expansion(j,othertype35) Other land expansion compared to previous timestep (mio. ha) - v35_other_reduction(j,ac,othertype35) Other land reduction compared to previous timestep (mio. ha) + v35_other_reduction(j,othertype35,ac) Other land reduction compared to previous timestep (mio. ha) v35_secdforest_expansion(j) Secdforest reduction compared to previous timestep (mio. ha) v35_secdforest_reduction(j,ac) Secdforest reduction compared to previous timestep (mio. ha) v35_primforest_reduction(j) Primforest reduction compared to previous timestep (mio. ha) v35_hvarea_secdforest(j,ac) Harvested area from secondary forest (mio. ha) - v35_hvarea_other(j,ac,othertype35) Harvested area from other land (mio. ha) + v35_hvarea_other(j,othertype35,ac) Harvested area from other land (mio. ha) v35_hvarea_primforest(j) Harvested area from primary forest (mio. ha) vm_prod_natveg(j,land_natveg,kforestry) Production of woody biomass from natural vegetation (mio. tDM per yr) vm_cost_hvarea_natveg(i) Cost of harvesting natural vegetation (mio. USD) @@ -89,15 +89,15 @@ positive variables *#################### R SECTION START (OUTPUT DECLARATIONS) #################### parameters ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (mio. ha) - ov_land_other(t,j,ac,othertype35,type) Detailed stock of other land (mio. ha) + ov_land_other(t,j,othertype35,ac,type) Detailed stock of other land (mio. ha) ov_landdiff_natveg(t,type) Aggregated difference in natveg land compared to previous timestep (mio. ha) ov35_other_expansion(t,j,othertype35,type) Other land expansion compared to previous timestep (mio. ha) - ov35_other_reduction(t,j,ac,othertype35,type) Other land reduction compared to previous timestep (mio. ha) + ov35_other_reduction(t,j,othertype35,ac,type) Other land reduction compared to previous timestep (mio. ha) ov35_secdforest_expansion(t,j,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_secdforest_reduction(t,j,ac,type) Secdforest reduction compared to previous timestep (mio. ha) ov35_primforest_reduction(t,j,type) Primforest reduction compared to previous timestep (mio. ha) ov35_hvarea_secdforest(t,j,ac,type) Harvested area from secondary forest (mio. ha) - ov35_hvarea_other(t,j,ac,othertype35,type) Harvested area from other land (mio. ha) + ov35_hvarea_other(t,j,othertype35,ac,type) Harvested area from other land (mio. ha) ov35_hvarea_primforest(t,j,type) Harvested area from primary forest (mio. ha) ov_prod_natveg(t,j,land_natveg,kforestry,type) Production of woody biomass from natural vegetation (mio. tDM per yr) ov_cost_hvarea_natveg(t,i,type) Cost of harvesting natural vegetation (mio. USD) @@ -110,7 +110,7 @@ parameters oq35_min_other(t,j,type) Minimum other land constraint (mio. ha) oq35_landdiff(t,type) Difference in natveg land (mio. ha) oq35_other_expansion(t,j,othertype35,type) Other land expansion (mio. ha) - oq35_other_reduction(t,j,ac,othertype35,type) Other land reduction (mio. ha) + oq35_other_reduction(t,j,othertype35,ac,type) Other land reduction (mio. ha) oq35_secdforest_expansion(t,j,type) Secdforest expansion (mio. ha) oq35_secdforest_reduction(t,j,ac,type) Secdforest reduction (mio. ha) oq35_primforest_reduction(t,j,type) Primforest reduction (mio. ha) @@ -119,7 +119,7 @@ parameters oq35_other_regeneration(t,j,type) Other land regeneration (mio. ha) oq35_other_est(t,j,ac,type) Distribution of other land additions over ac_est (mio. ha) oq35_secdforest_est(t,j,ac,type) Distribution of secdforest additions over ac_est (mio. ha) - oq35_hvarea_other(t,j,ac,othertype35,type) Harvested area other land (mio. ha) + oq35_hvarea_other(t,j,othertype35,ac,type) Harvested area other land (mio. ha) oq35_hvarea_secdforest(t,j,ac,type) Harvested area secdforest (mio. ha) oq35_hvarea_primforest(t,j,type) Harvested area primforest (mio. ha) oq35_prod_secdforest(t,j,type) Production of woody biomass from secondary forests (mio. tDM per yr) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 937693ac1c..eea810d8bc 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -10,7 +10,7 @@ q35_land_secdforest(j2) .. vm_land(j2,"secdforest") =e= sum(ac, v35_secdforest(j2,ac)); - q35_land_other(j2) .. vm_land(j2,"other") =e= sum((ac,othertype35), vm_land_other(j2,ac,othertype35)); + q35_land_other(j2) .. vm_land(j2,"other") =e= sum((othertype35,ac), vm_land_other(j2,othertype35,ac)); *' The total natural land area cannot be smaller than the total natural land conservation target. *' Area requirements for natural land conservation are derived from WDPA and formulated based on @@ -49,7 +49,7 @@ q35_carbon_other(j2,ag_pools,stockType) .. vm_carbon_stock(j2,"other",ag_pools,stockType) =e= - m_carbon_stock_ac(vm_land_other,p35_carbon_density_other,"ac,othertype35","ac_sub,othertype35"); + m_carbon_stock_ac(vm_land_other,p35_carbon_density_other,"othertype35,ac","othertype35,ac_sub"); *' The biodiversity value (BV) of primary forest, secondary forest and other land is computed by multiplying their respective land area with bii coefficients, which depend on the age class and whether the potential natural vegetation forest or non-forest (luh2 side layers). @@ -64,7 +64,7 @@ q35_bv_other(j2,potnatveg) .. vm_bv(j2,"other",potnatveg) =e= - sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), sum(othertype35, vm_land_other(j2,ac,othertype35))) * + sum(bii_class_secd, sum(ac_to_bii_class_secd(ac,bii_class_secd), sum(othertype35, vm_land_other(j2,othertype35,ac))) * fm_bii_coeff(bii_class_secd,potnatveg)) * fm_luh2_side_layers(j2,potnatveg); *' NPI/NDC land protection policies based on country reports are implemented as @@ -86,18 +86,18 @@ q35_landdiff .. vm_landdiff_natveg =e= sum(j2, sum(othertype35,v35_other_expansion(j2,othertype35)) - + sum((ac_sub,othertype35), v35_other_reduction(j2,ac_sub,othertype35)) + + sum((othertype35,ac_sub), v35_other_reduction(j2,othertype35,ac_sub)) + v35_secdforest_expansion(j2) + sum((ac_sub), v35_secdforest_reduction(j2,ac_sub)) + v35_primforest_reduction(j2)); q35_other_expansion(j2,othertype35) .. v35_other_expansion(j2,othertype35) =e= - sum(ac_est, vm_land_other(j2,ac_est,othertype35)); + sum(ac_est, vm_land_other(j2,othertype35,ac_est)); - q35_other_reduction(j2,ac_sub,othertype35) .. - v35_other_reduction(j2,ac_sub,othertype35) =e= - pc35_land_other(j2,ac_sub,othertype35) - vm_land_other(j2,ac_sub,othertype35); + q35_other_reduction(j2,othertype35,ac_sub) .. + v35_other_reduction(j2,othertype35,ac_sub) =e= + pc35_land_other(j2,othertype35,ac_sub) - vm_land_other(j2,othertype35,ac_sub); q35_secdforest_expansion(j2) .. v35_secdforest_expansion(j2) =e= @@ -126,7 +126,7 @@ q35_cost_hvarea(i2).. vm_cost_hvarea_natveg(i2) =e= sum((ct,cell(i2,j2),ac_sub), v35_hvarea_secdforest(j2,ac_sub)) * s35_timber_harvest_cost_secdforest - + sum((ct,cell(i2,j2),ac_sub,othertype35), v35_hvarea_other(j2,ac_sub,othertype35)) * s35_timber_harvest_cost_other + + sum((ct,cell(i2,j2),othertype35,ac_sub), v35_hvarea_other(j2,othertype35,ac_sub)) * s35_timber_harvest_cost_other + sum((ct,cell(i2,j2)), v35_hvarea_primforest(j2)) * s35_timber_harvest_cost_primforest ; @@ -156,8 +156,8 @@ q35_prod_primforest(j2).. q35_prod_other(j2).. vm_prod_natveg(j2,"other","woodfuel") =e= - (sum(ac_sub, v35_hvarea_other(j2,ac_sub,"othernat") * sum(ct, pm_timber_yield(ct,j2,ac_sub,"other"))) - + sum(ac_sub, v35_hvarea_other(j2,ac_sub,"youngsecdf") * sum(ct, pm_timber_yield(ct,j2,ac_sub,"secdforest")))) + (sum(ac_sub, v35_hvarea_other(j2,"othernat",ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"other"))) + + sum(ac_sub, v35_hvarea_other(j2,"youngsecdf",ac_sub) * sum(ct, pm_timber_yield(ct,j2,ac_sub,"secdforest")))) / m_timestep_length_forestry ; @@ -177,10 +177,10 @@ q35_hvarea_primforest(j2).. =l= v35_primforest_reduction(j2); -q35_hvarea_other(j2,ac_sub,othertype35).. - v35_hvarea_other(j2,ac_sub,othertype35) +q35_hvarea_other(j2,othertype35,ac_sub).. + v35_hvarea_other(j2,othertype35,ac_sub) =l= - v35_other_reduction(j2,ac_sub,othertype35); + v35_other_reduction(j2,othertype35,ac_sub); *' The constraint for overall forest establishment, including forestry, is given @@ -191,7 +191,7 @@ q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= pcm_max_forest_est(j2) - - sum(ac, vm_land_other(j2,ac,"youngsecdf")) + - sum(ac, vm_land_other(j2,"youngsecdf",ac) ) ; *' Harvested secondary forest is still considered secondary forests due to @@ -210,9 +210,9 @@ q35_secdforest_regeneration(j2).. *' Harvested other land is still considered other land q35_other_regeneration(j2).. - sum(ac_est, vm_land_other(j2,ac_est,"othernat")) + sum(ac_est, vm_land_other(j2,"othernat",ac_est)) =g= - sum((ac_sub,othertype35),v35_hvarea_other(j2,ac_sub,othertype35)) + sum((othertype35,ac_sub),v35_hvarea_other(j2,othertype35,ac_sub)) ; *' The following two constraints distribute additions to secdforest and other land @@ -222,5 +222,5 @@ q35_secdforest_est(j2,ac_est) .. v35_secdforest(j2,ac_est) =e= sum(ac_est2, v35_secdforest(j2,ac_est2))/card(ac_est2); q35_other_est(j2,ac_est) .. -vm_land_other(j2,ac_est,"othernat") =e= sum(ac_est2, vm_land_other(j2,ac_est2,"othernat"))/card(ac_est2); +vm_land_other(j2,"othernat",ac_est) =e= sum(ac_est2, vm_land_other(j2,"othernat",ac_est2))/card(ac_est2); diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index b528058e11..d92c17f222 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -9,7 +9,7 @@ pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); *other land age class calculation -pc35_land_other(j,ac,othertype35) = vm_land_other.l(j,ac,othertype35); +pc35_land_other(j,othertype35,ac) = vm_land_other.l(j,othertype35,ac); * Reset forest establishment bound pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); @@ -17,15 +17,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); - ov_land_other(t,j,ac,othertype35,"marginal") = vm_land_other.m(j,ac,othertype35); + ov_land_other(t,j,othertype35,ac,"marginal") = vm_land_other.m(j,othertype35,ac); ov_landdiff_natveg(t,"marginal") = vm_landdiff_natveg.m; ov35_other_expansion(t,j,othertype35,"marginal") = v35_other_expansion.m(j,othertype35); - ov35_other_reduction(t,j,ac,othertype35,"marginal") = v35_other_reduction.m(j,ac,othertype35); + ov35_other_reduction(t,j,othertype35,ac,"marginal") = v35_other_reduction.m(j,othertype35,ac); ov35_secdforest_expansion(t,j,"marginal") = v35_secdforest_expansion.m(j); ov35_secdforest_reduction(t,j,ac,"marginal") = v35_secdforest_reduction.m(j,ac); ov35_primforest_reduction(t,j,"marginal") = v35_primforest_reduction.m(j); ov35_hvarea_secdforest(t,j,ac,"marginal") = v35_hvarea_secdforest.m(j,ac); - ov35_hvarea_other(t,j,ac,othertype35,"marginal") = v35_hvarea_other.m(j,ac,othertype35); + ov35_hvarea_other(t,j,othertype35,ac,"marginal") = v35_hvarea_other.m(j,othertype35,ac); ov35_hvarea_primforest(t,j,"marginal") = v35_hvarea_primforest.m(j); ov_prod_natveg(t,j,land_natveg,kforestry,"marginal") = vm_prod_natveg.m(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"marginal") = vm_cost_hvarea_natveg.m(i); @@ -38,7 +38,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_other(t,j,"marginal") = q35_min_other.m(j); oq35_landdiff(t,"marginal") = q35_landdiff.m; oq35_other_expansion(t,j,othertype35,"marginal") = q35_other_expansion.m(j,othertype35); - oq35_other_reduction(t,j,ac,othertype35,"marginal") = q35_other_reduction.m(j,ac,othertype35); + oq35_other_reduction(t,j,othertype35,ac,"marginal") = q35_other_reduction.m(j,othertype35,ac); oq35_secdforest_expansion(t,j,"marginal") = q35_secdforest_expansion.m(j); oq35_secdforest_reduction(t,j,ac,"marginal") = q35_secdforest_reduction.m(j,ac); oq35_primforest_reduction(t,j,"marginal") = q35_primforest_reduction.m(j); @@ -47,7 +47,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"marginal") = q35_other_regeneration.m(j); oq35_other_est(t,j,ac,"marginal") = q35_other_est.m(j,ac); oq35_secdforest_est(t,j,ac,"marginal") = q35_secdforest_est.m(j,ac); - oq35_hvarea_other(t,j,ac,othertype35,"marginal") = q35_hvarea_other.m(j,ac,othertype35); + oq35_hvarea_other(t,j,othertype35,ac,"marginal") = q35_hvarea_other.m(j,othertype35,ac); oq35_hvarea_secdforest(t,j,ac,"marginal") = q35_hvarea_secdforest.m(j,ac); oq35_hvarea_primforest(t,j,"marginal") = q35_hvarea_primforest.m(j); oq35_prod_secdforest(t,j,"marginal") = q35_prod_secdforest.m(j); @@ -61,15 +61,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_secdforest_restoration(t,j,"marginal") = q35_secdforest_restoration.m(j); oq35_other_restoration(t,j,"marginal") = q35_other_restoration.m(j); ov35_secdforest(t,j,ac,"level") = v35_secdforest.l(j,ac); - ov_land_other(t,j,ac,othertype35,"level") = vm_land_other.l(j,ac,othertype35); + ov_land_other(t,j,othertype35,ac,"level") = vm_land_other.l(j,othertype35,ac); ov_landdiff_natveg(t,"level") = vm_landdiff_natveg.l; ov35_other_expansion(t,j,othertype35,"level") = v35_other_expansion.l(j,othertype35); - ov35_other_reduction(t,j,ac,othertype35,"level") = v35_other_reduction.l(j,ac,othertype35); + ov35_other_reduction(t,j,othertype35,ac,"level") = v35_other_reduction.l(j,othertype35,ac); ov35_secdforest_expansion(t,j,"level") = v35_secdforest_expansion.l(j); ov35_secdforest_reduction(t,j,ac,"level") = v35_secdforest_reduction.l(j,ac); ov35_primforest_reduction(t,j,"level") = v35_primforest_reduction.l(j); ov35_hvarea_secdforest(t,j,ac,"level") = v35_hvarea_secdforest.l(j,ac); - ov35_hvarea_other(t,j,ac,othertype35,"level") = v35_hvarea_other.l(j,ac,othertype35); + ov35_hvarea_other(t,j,othertype35,ac,"level") = v35_hvarea_other.l(j,othertype35,ac); ov35_hvarea_primforest(t,j,"level") = v35_hvarea_primforest.l(j); ov_prod_natveg(t,j,land_natveg,kforestry,"level") = vm_prod_natveg.l(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"level") = vm_cost_hvarea_natveg.l(i); @@ -82,7 +82,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_other(t,j,"level") = q35_min_other.l(j); oq35_landdiff(t,"level") = q35_landdiff.l; oq35_other_expansion(t,j,othertype35,"level") = q35_other_expansion.l(j,othertype35); - oq35_other_reduction(t,j,ac,othertype35,"level") = q35_other_reduction.l(j,ac,othertype35); + oq35_other_reduction(t,j,othertype35,ac,"level") = q35_other_reduction.l(j,othertype35,ac); oq35_secdforest_expansion(t,j,"level") = q35_secdforest_expansion.l(j); oq35_secdforest_reduction(t,j,ac,"level") = q35_secdforest_reduction.l(j,ac); oq35_primforest_reduction(t,j,"level") = q35_primforest_reduction.l(j); @@ -91,7 +91,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"level") = q35_other_regeneration.l(j); oq35_other_est(t,j,ac,"level") = q35_other_est.l(j,ac); oq35_secdforest_est(t,j,ac,"level") = q35_secdforest_est.l(j,ac); - oq35_hvarea_other(t,j,ac,othertype35,"level") = q35_hvarea_other.l(j,ac,othertype35); + oq35_hvarea_other(t,j,othertype35,ac,"level") = q35_hvarea_other.l(j,othertype35,ac); oq35_hvarea_secdforest(t,j,ac,"level") = q35_hvarea_secdforest.l(j,ac); oq35_hvarea_primforest(t,j,"level") = q35_hvarea_primforest.l(j); oq35_prod_secdforest(t,j,"level") = q35_prod_secdforest.l(j); @@ -105,15 +105,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_secdforest_restoration(t,j,"level") = q35_secdforest_restoration.l(j); oq35_other_restoration(t,j,"level") = q35_other_restoration.l(j); ov35_secdforest(t,j,ac,"upper") = v35_secdforest.up(j,ac); - ov_land_other(t,j,ac,othertype35,"upper") = vm_land_other.up(j,ac,othertype35); + ov_land_other(t,j,othertype35,ac,"upper") = vm_land_other.up(j,othertype35,ac); ov_landdiff_natveg(t,"upper") = vm_landdiff_natveg.up; ov35_other_expansion(t,j,othertype35,"upper") = v35_other_expansion.up(j,othertype35); - ov35_other_reduction(t,j,ac,othertype35,"upper") = v35_other_reduction.up(j,ac,othertype35); + ov35_other_reduction(t,j,othertype35,ac,"upper") = v35_other_reduction.up(j,othertype35,ac); ov35_secdforest_expansion(t,j,"upper") = v35_secdforest_expansion.up(j); ov35_secdforest_reduction(t,j,ac,"upper") = v35_secdforest_reduction.up(j,ac); ov35_primforest_reduction(t,j,"upper") = v35_primforest_reduction.up(j); ov35_hvarea_secdforest(t,j,ac,"upper") = v35_hvarea_secdforest.up(j,ac); - ov35_hvarea_other(t,j,ac,othertype35,"upper") = v35_hvarea_other.up(j,ac,othertype35); + ov35_hvarea_other(t,j,othertype35,ac,"upper") = v35_hvarea_other.up(j,othertype35,ac); ov35_hvarea_primforest(t,j,"upper") = v35_hvarea_primforest.up(j); ov_prod_natveg(t,j,land_natveg,kforestry,"upper") = vm_prod_natveg.up(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"upper") = vm_cost_hvarea_natveg.up(i); @@ -126,7 +126,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_other(t,j,"upper") = q35_min_other.up(j); oq35_landdiff(t,"upper") = q35_landdiff.up; oq35_other_expansion(t,j,othertype35,"upper") = q35_other_expansion.up(j,othertype35); - oq35_other_reduction(t,j,ac,othertype35,"upper") = q35_other_reduction.up(j,ac,othertype35); + oq35_other_reduction(t,j,othertype35,ac,"upper") = q35_other_reduction.up(j,othertype35,ac); oq35_secdforest_expansion(t,j,"upper") = q35_secdforest_expansion.up(j); oq35_secdforest_reduction(t,j,ac,"upper") = q35_secdforest_reduction.up(j,ac); oq35_primforest_reduction(t,j,"upper") = q35_primforest_reduction.up(j); @@ -135,7 +135,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"upper") = q35_other_regeneration.up(j); oq35_other_est(t,j,ac,"upper") = q35_other_est.up(j,ac); oq35_secdforest_est(t,j,ac,"upper") = q35_secdforest_est.up(j,ac); - oq35_hvarea_other(t,j,ac,othertype35,"upper") = q35_hvarea_other.up(j,ac,othertype35); + oq35_hvarea_other(t,j,othertype35,ac,"upper") = q35_hvarea_other.up(j,othertype35,ac); oq35_hvarea_secdforest(t,j,ac,"upper") = q35_hvarea_secdforest.up(j,ac); oq35_hvarea_primforest(t,j,"upper") = q35_hvarea_primforest.up(j); oq35_prod_secdforest(t,j,"upper") = q35_prod_secdforest.up(j); @@ -149,15 +149,15 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_secdforest_restoration(t,j,"upper") = q35_secdforest_restoration.up(j); oq35_other_restoration(t,j,"upper") = q35_other_restoration.up(j); ov35_secdforest(t,j,ac,"lower") = v35_secdforest.lo(j,ac); - ov_land_other(t,j,ac,othertype35,"lower") = vm_land_other.lo(j,ac,othertype35); + ov_land_other(t,j,othertype35,ac,"lower") = vm_land_other.lo(j,othertype35,ac); ov_landdiff_natveg(t,"lower") = vm_landdiff_natveg.lo; ov35_other_expansion(t,j,othertype35,"lower") = v35_other_expansion.lo(j,othertype35); - ov35_other_reduction(t,j,ac,othertype35,"lower") = v35_other_reduction.lo(j,ac,othertype35); + ov35_other_reduction(t,j,othertype35,ac,"lower") = v35_other_reduction.lo(j,othertype35,ac); ov35_secdforest_expansion(t,j,"lower") = v35_secdforest_expansion.lo(j); ov35_secdforest_reduction(t,j,ac,"lower") = v35_secdforest_reduction.lo(j,ac); ov35_primforest_reduction(t,j,"lower") = v35_primforest_reduction.lo(j); ov35_hvarea_secdforest(t,j,ac,"lower") = v35_hvarea_secdforest.lo(j,ac); - ov35_hvarea_other(t,j,ac,othertype35,"lower") = v35_hvarea_other.lo(j,ac,othertype35); + ov35_hvarea_other(t,j,othertype35,ac,"lower") = v35_hvarea_other.lo(j,othertype35,ac); ov35_hvarea_primforest(t,j,"lower") = v35_hvarea_primforest.lo(j); ov_prod_natveg(t,j,land_natveg,kforestry,"lower") = vm_prod_natveg.lo(j,land_natveg,kforestry); ov_cost_hvarea_natveg(t,i,"lower") = vm_cost_hvarea_natveg.lo(i); @@ -170,7 +170,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_min_other(t,j,"lower") = q35_min_other.lo(j); oq35_landdiff(t,"lower") = q35_landdiff.lo; oq35_other_expansion(t,j,othertype35,"lower") = q35_other_expansion.lo(j,othertype35); - oq35_other_reduction(t,j,ac,othertype35,"lower") = q35_other_reduction.lo(j,ac,othertype35); + oq35_other_reduction(t,j,othertype35,ac,"lower") = q35_other_reduction.lo(j,othertype35,ac); oq35_secdforest_expansion(t,j,"lower") = q35_secdforest_expansion.lo(j); oq35_secdforest_reduction(t,j,ac,"lower") = q35_secdforest_reduction.lo(j,ac); oq35_primforest_reduction(t,j,"lower") = q35_primforest_reduction.lo(j); @@ -179,7 +179,7 @@ pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; oq35_other_regeneration(t,j,"lower") = q35_other_regeneration.lo(j); oq35_other_est(t,j,ac,"lower") = q35_other_est.lo(j,ac); oq35_secdforest_est(t,j,ac,"lower") = q35_secdforest_est.lo(j,ac); - oq35_hvarea_other(t,j,ac,othertype35,"lower") = q35_hvarea_other.lo(j,ac,othertype35); + oq35_hvarea_other(t,j,othertype35,ac,"lower") = q35_hvarea_other.lo(j,othertype35,ac); oq35_hvarea_secdforest(t,j,ac,"lower") = q35_hvarea_secdforest.lo(j,ac); oq35_hvarea_primforest(t,j,"lower") = q35_hvarea_primforest.lo(j); oq35_prod_secdforest(t,j,"lower") = q35_prod_secdforest.lo(j); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 773cc7587e..3f4750017f 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -6,8 +6,8 @@ *** | Contact: magpie@pik-potsdam.de ** initialize other land -i35_land_other(j,ac,othertype35) = 0; -i35_land_other(j,"acx","othernat") = pcm_land(j,"other"); +i35_land_other(j,othertype35,ac) = 0; +i35_land_other(j,"othernat","acx") = pcm_land(j,"other"); ** initialize secdforest area depending on switch. if(s35_secdf_distribution = 0, @@ -33,7 +33,7 @@ elseif s35_secdf_distribution = 2, i35_secdforest(j,"acx") = i35_secdforest(j,"acx") + (pcm_land(j,"secdforest") - sum(ac, i35_secdforest(j,ac))); *initialize parameter -p35_land_other(t,j,ac,othertype35) = 0; +p35_land_other(t,j,othertype35,ac) = 0; p35_secdforest(t,j,ac) = 0; * initialize forest disturbance losses @@ -79,4 +79,4 @@ m_sigmoid_time_interpol(p35_damage_fader,sm_fix_SSP2,s35_forest_damage_end,0,1); * --------------------------------------- pc35_secdforest(j,ac) = i35_secdforest(j,ac); - pc35_land_other(j,ac,othertype35) = i35_land_other(j,ac,othertype35); + pc35_land_other(j,othertype35,ac) = i35_land_other(j,othertype35,ac); diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 354e77c0f0..a9647b2fb6 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,21 +45,21 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Distribute forestry abandonement -* Abandoned forestry is directly shifted into pc35_land_other(j,ac_est,"youngsecdf") because it is +* Abandoned forestry is directly shifted into pc35_land_other(j,"youngsecdf",ac_est) because it is * assumed that forestry was located in areas suitable to grow forests. -pc35_land_other(j,ac_est,"youngsecdf") = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); -pc35_land_other(j,ac_est,"youngsecdf")$(sum(ac_est2,pc35_land_other(j,ac_est2,"youngsecdf")) > pcm_max_forest_est(j)) = pcm_max_forest_est(j)/card(ac_est2); +pc35_land_other(j,"youngsecdf",ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); +pc35_land_other(j,"youngsecdf",ac_est)$(sum(ac_est2,pc35_land_other(j,"youngsecdf",ac_est2)) > pcm_max_forest_est(j)) = pcm_max_forest_est(j)/card(ac_est2); * The proportion of secondary forest recovery in total natveg recovery is derived * from the remaining forest recovery area -p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,ac,"youngsecdf")); +p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; -* Abandoned land pc35_land_other(j,ac_est,"othernat") is then distributed proportionally using the forest recovery share. -p35_forest_recovery_area(t,j,ac_est) = pc35_land_other(j,ac_est,"othernat") * p35_forest_recovery_shr(j); +* Abandoned land pc35_land_other(j,"othernat",ac_est) is then distributed proportionally using the forest recovery share. +p35_forest_recovery_area(t,j,ac_est) = pc35_land_other(j,"othernat",ac_est) * p35_forest_recovery_shr(j); p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2,p35_forest_recovery_area(t,j,ac_est2)) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j)/card(ac_est2); -pc35_land_other(j,ac_est,"othernat") = pc35_land_other(j,ac_est,"othernat") - p35_forest_recovery_area(t,j,ac_est); -pc35_land_other(j,ac_est,"youngsecdf") = pc35_land_other(j,ac_est,"youngsecdf") + p35_forest_recovery_area(t,j,ac_est); +pc35_land_other(j,"othernat",ac_est) = pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est); +pc35_land_other(j,"youngsecdf",ac_est) = pc35_land_other(j,"youngsecdf",ac_est) + p35_forest_recovery_area(t,j,ac_est); * ------------------------------------------------ * Natural vegetation growth (age-class shift) @@ -68,10 +68,10 @@ pc35_land_other(j,ac_est,"youngsecdf") = pc35_land_other(j,ac_est,"youngsecdf") * Regrowth of natural vegetation (natural succession) is modelled by shifting age-classes according to time step length. s35_shift = m_timestep_length_forestry/5; * example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) - p35_land_other(t,j,ac,othertype35)$(ord(ac) > s35_shift) = pc35_land_other(j,ac-s35_shift,othertype35); + p35_land_other(t,j,othertype35,ac)$(ord(ac) > s35_shift) = pc35_land_other(j,othertype35,ac-s35_shift); * account for cases at the end of the age class set (s35_shift > 1) which are not shifted by the above calculation - p35_land_other(t,j,"acx",othertype35) = p35_land_other(t,j,"acx",othertype35) - + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_land_other(j,ac,othertype35)); + p35_land_other(t,j,othertype35,"acx") = p35_land_other(t,j,othertype35,"acx") + + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_land_other(j,othertype35,ac)); * Usual shift * example: ac10 in t = ac5 (ac10-1) in t-1 for a 5 yr time step (s35_shift = 1) @@ -90,8 +90,8 @@ s35_shift = m_timestep_length_forestry/5; *' exceeds a threshold of 20 tC/ha the respective area is shifted from young secondary *' forest, which is still considered other land, to secondary forest land. p35_maturesecdf(t,j,ac)$(not sameas(ac,"acx")) = - p35_land_other(t,j,ac,"youngsecdf")$(pm_carbon_density_secdforest_ac(t,j,ac,"vegc") > 20); -p35_land_other(t,j,ac,"youngsecdf") = p35_land_other(t,j,ac,"youngsecdf") - p35_maturesecdf(t,j,ac); + p35_land_other(t,j,"youngsecdf",ac)$(pm_carbon_density_secdforest_ac(t,j,ac,"vegc") > 20); +p35_land_other(t,j,"youngsecdf",ac) = p35_land_other(t,j,"youngsecdf",ac) - p35_maturesecdf(t,j,ac); p35_secdforest(t,j,ac) = p35_secdforest(t,j,ac) + p35_maturesecdf(t,j,ac); *' @stop @@ -100,11 +100,11 @@ v35_secdforest.l(j,ac) = pc35_secdforest(j,ac); vm_land.l(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); pcm_land(j,"secdforest") = sum(ac, pc35_secdforest(j,ac)); -pc35_land_other(j,ac,othertype35) = p35_land_other(t,j,ac,othertype35); -vm_land_other.l(j,ac,othertype35) = pc35_land_other(j,ac,othertype35); +pc35_land_other(j,othertype35,ac) = p35_land_other(t,j,othertype35,ac); +vm_land_other.l(j,othertype35,ac) = pc35_land_other(j,othertype35,ac); -vm_land.l(j,"other") = sum((ac,othertype35), pc35_land_other(j,ac,othertype35)); -pcm_land(j,"other") = sum((ac,othertype35), pc35_land_other(j,ac,othertype35)); +vm_land.l(j,"other") = sum((othertype35,ac), pc35_land_other(j,othertype35,ac)); +pcm_land(j,"other") = sum((othertype35,ac), pc35_land_other(j,othertype35,ac)); * ------------------------------------- * Set bounds based on land conservation @@ -170,19 +170,19 @@ vm_land.lo(j,"secdforest") = pm_land_conservation(t,j,"secdforest","protect") + ** Other land *reset bounds -vm_land_other.lo(j,ac,"othernat") = 0; -vm_land_other.up(j,ac,"othernat") = Inf; -vm_land_other.lo(j,ac,"youngsecdf") = 0; +vm_land_other.lo(j,"othernat",ac) = 0; +vm_land_other.up(j,"othernat",ac) = Inf; +vm_land_other.lo(j,"youngsecdf",ac) = 0; *set upper bound -vm_land_other.up(j,ac_sub,"othernat") = pc35_land_other(j,ac_sub,"othernat"); -vm_land_other.up(j,ac_sub,"youngsecdf") = pc35_land_other(j,ac_sub,"youngsecdf"); -vm_land_other.fx(j,ac_est,"youngsecdf") = 0; -m_boundfix(vm_land_other,(j,ac_sub,othertype35),l,1e-6); +vm_land_other.up(j,"othernat",ac_sub) = pc35_land_other(j,"othernat",ac_sub); +vm_land_other.up(j,"youngsecdf",ac_sub) = pc35_land_other(j,"youngsecdf",ac_sub); +vm_land_other.fx(j,"youngsecdf",ac_est) = 0; +m_boundfix(vm_land_other,(j,othertype35,ac_sub),l,1e-6); * Other land conservation * protection bound fix -pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_land_other(j,ac_sub,"othernat"))) < 1e-6) = sum(ac_sub, pc35_land_other(j,ac_sub,"othernat")); +pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_land_other(j,"othernat",ac_sub))) < 1e-6) = sum(ac_sub, pc35_land_other(j,"othernat",ac_sub)); * set restoration target p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * Do not restore other land in areas where total natural @@ -195,8 +195,8 @@ vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_r * Calculate carbon density * ------------------------------ -p35_carbon_density_other(t,j,ac,"othernat",ag_pools) = pm_carbon_density_other_ac(t,j,ac,ag_pools); -p35_carbon_density_other(t,j,ac,"youngsecdf",ag_pools) = pm_carbon_density_secdforest_ac(t,j,ac,ag_pools); +p35_carbon_density_other(t,j,"othernat",ac,ag_pools) = pm_carbon_density_other_ac(t,j,ac,ag_pools); +p35_carbon_density_other(t,j,"youngsecdf",ac,ag_pools) = pm_carbon_density_secdforest_ac(t,j,ac,ag_pools); * ---------------------------- * NPI/NDC protection policy @@ -208,18 +208,18 @@ p35_min_other(t,j)$(p35_min_other(t,j) > pcm_land(j,"other")) = pcm_land(j,"othe ** Youngest age classes are not allowed to be harvested v35_hvarea_secdforest.fx(j,ac_est) = 0; -v35_hvarea_other.fx(j,ac_est,othertype35) = 0; +v35_hvarea_other.fx(j,othertype35,ac_est) = 0; v35_secdforest_reduction.fx(j,ac_est) = 0; -v35_other_reduction.fx(j,ac_est,othertype35) = 0; +v35_other_reduction.fx(j,othertype35,ac_est) = 0; vm_prod_natveg.fx(j,"other","wood") = 0; if(s35_hvarea = 0, v35_hvarea_secdforest.fx(j,ac_sub) = 0; v35_hvarea_primforest.fx(j) = 0; - v35_hvarea_other.fx(j,ac_sub,othertype35) = 0; + v35_hvarea_other.fx(j,othertype35,ac_sub) = 0; elseif s35_hvarea = 1, v35_hvarea_secdforest.fx(j,ac_sub) = (v35_secdforest.l(j,ac_sub) - v35_secdforest.lo(j,ac_sub))*s35_hvarea_secdforest*m_timestep_length_forestry; v35_hvarea_primforest.fx(j) = (vm_land.l(j,"primforest") - vm_land.lo(j,"primforest"))*s35_hvarea_primforest*m_timestep_length_forestry; - v35_hvarea_other.fx(j,ac_sub,othertype35) = (vm_land_other.l(j,ac_sub,othertype35) - vm_land_other.lo(j,ac_sub,othertype35))*s35_hvarea_other*m_timestep_length_forestry; + v35_hvarea_other.fx(j,othertype35,ac_sub) = (vm_land_other.l(j,othertype35,ac_sub) - vm_land_other.lo(j,othertype35,ac_sub))*s35_hvarea_other*m_timestep_length_forestry; ); diff --git a/modules/59_som/static_jan19/equations.gms b/modules/59_som/static_jan19/equations.gms index e2217bbe37..2d77aa7917 100644 --- a/modules/59_som/static_jan19/equations.gms +++ b/modules/59_som/static_jan19/equations.gms @@ -19,8 +19,8 @@ q59_soilcarbon_other(j2,stockType) .. vm_carbon_stock(j2,"other","soilc",stockType) =e= - sum((ct,ac), vm_land_other(j2,ac,"othernat") * fm_carbon_density(ct,j2,"other","soilc")) - + sum((ct,ac), vm_land_other(j2,ac,"youngsecdf") * fm_carbon_density(ct,j2,"secdforest","soilc")) ; + sum((ct,ac), vm_land_other(j2,"othernat",ac) * fm_carbon_density(ct,j2,"other","soilc")) + + sum((ct,ac), vm_land_other(j2,"youngsecdf",ac) * fm_carbon_density(ct,j2,"secdforest","soilc")) ; From 43d3496c3c36aaa9d452e2a7cf976414ded76262 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 27 May 2024 15:12:10 +0200 Subject: [PATCH 229/259] redefined p35_forest_recovery_area to improve reporting --- .../pot_forest_may24/declarations.gms | 5 +-- .../35_natveg/pot_forest_may24/presolve.gms | 31 +++++++++++-------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index ff509557ed..eb6882d1d7 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -19,11 +19,12 @@ parameters p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) - p35_forest_recovery_shr(j) Forest share in natveg recovery (1) + p35_forestry_abandon_area(j) Abandoned forestry area (mio. ha) + pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) - p35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) + pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index a9647b2fb6..bbb3a48e35 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -44,20 +44,25 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * Calculate area of secondary forest recovery * ------------------------------------------------- +*** Calculate the upper boundary for secondary forest recovery +pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac_sub, pc35_land_other(j,"youngsecdf",ac_sub)); + *** Distribute forestry abandonement -* Abandoned forestry is directly shifted into pc35_land_other(j,"youngsecdf",ac_est) because it is +* Abandoned forestry is directly shifted into p35_forest_recovery_area(t,j,ac_est) because it is * assumed that forestry was located in areas suitable to grow forests. -pc35_land_other(j,"youngsecdf",ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); -pc35_land_other(j,"youngsecdf",ac_est)$(sum(ac_est2,pc35_land_other(j,"youngsecdf",ac_est2)) > pcm_max_forest_est(j)) = pcm_max_forest_est(j)/card(ac_est2); - -* The proportion of secondary forest recovery in total natveg recovery is derived -* from the remaining forest recovery area -p35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); -p35_forest_recovery_shr(j) = p35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); -p35_forest_recovery_shr(j)$(p35_forest_recovery_shr(j) > 1) = 1; -* Abandoned land pc35_land_other(j,"othernat",ac_est) is then distributed proportionally using the forest recovery share. -p35_forest_recovery_area(t,j,ac_est) = pc35_land_other(j,"othernat",ac_est) * p35_forest_recovery_shr(j); -p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2,p35_forest_recovery_area(t,j,ac_est2)) > p35_max_forest_recovery(j)) = p35_max_forest_recovery(j)/card(ac_est2); +p35_forest_recovery_area(t,j,ac_est) = vm_lu_transitions.l(j,"forestry","other")/card(ac_est2); +p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2, p35_forest_recovery_area(t,j,ac_est2)) > pc35_max_forest_recovery(j)) = pc35_max_forest_recovery(j)/card(ac_est2); + +* The proportion of secondary forest recovery in total natveg +* recovery is derived from the remaining forest recovery area +pc35_max_forest_recovery(j) = pc35_max_forest_recovery(j) - sum(ac_est, p35_forest_recovery_area(t,j,ac_est)); +pc35_forest_recovery_shr(j) = pc35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); +pc35_forest_recovery_shr(j)$(pc35_forest_recovery_shr(j) > 1) = 1; +* Abandoned land pc35_land_other(j,"othernat",ac_est) that has not yet been allocated to +* p35_forest_recovery_area(t,j,ac_est) is then distributed proportionally using the forest recovery share. +p35_forest_recovery_area(t,j,ac_est) = p35_forest_recovery_area(t,j,ac_est) + + (pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est)) + * pc35_forest_recovery_shr(j); pc35_land_other(j,"othernat",ac_est) = pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est); pc35_land_other(j,"youngsecdf",ac_est) = pc35_land_other(j,"youngsecdf",ac_est) + p35_forest_recovery_area(t,j,ac_est); @@ -159,7 +164,7 @@ p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) * Since forest restoration cannot be bigger than the potential area for secdforest recovery, * any remaining restoration area is substracted and shifted to other land restoration. -p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - p35_max_forest_recovery(j); +p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - pc35_max_forest_recovery(j); p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); From 74fd1a80e37b5659958c7451b93a1aa533d0de40 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 27 May 2024 15:21:21 +0200 Subject: [PATCH 230/259] parameter not needed --- modules/35_natveg/pot_forest_may24/declarations.gms | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index eb6882d1d7..e440e3a270 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -19,12 +19,11 @@ parameters p35_min_forest(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_min_other(t,j) Minimum forest and other stock based on NPI or NDC targets (mio. ha) p35_damage_fader(t_all) Fader for forest damage (1) - p35_forestry_abandon_area(j) Abandoned forestry area (mio. ha) - pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) + pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) - pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) + pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) p35_disturbance_loss_primf(t,j) Loss due to disturbances in primary forest (mio. ha) From b846b240b317d445b787d84b3f81c24e98fede85 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Mon, 27 May 2024 16:03:10 +0200 Subject: [PATCH 231/259] max forest recovery fix --- modules/35_natveg/pot_forest_may24/presolve.gms | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index bbb3a48e35..8d2ac2ede8 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,7 +45,7 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Calculate the upper boundary for secondary forest recovery -pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac_sub, pc35_land_other(j,"youngsecdf",ac_sub)); +pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); *** Distribute forestry abandonement * Abandoned forestry is directly shifted into p35_forest_recovery_area(t,j,ac_est) because it is @@ -55,14 +55,15 @@ p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2, p35_forest_recovery_area(t,j, * The proportion of secondary forest recovery in total natveg * recovery is derived from the remaining forest recovery area -pc35_max_forest_recovery(j) = pc35_max_forest_recovery(j) - sum(ac_est, p35_forest_recovery_area(t,j,ac_est)); -pc35_forest_recovery_shr(j) = pc35_max_forest_recovery(j) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); +pc35_forest_recovery_shr(j) = (pc35_max_forest_recovery(j) - sum(ac_est, p35_forest_recovery_area(t,j,ac_est))) + / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); pc35_forest_recovery_shr(j)$(pc35_forest_recovery_shr(j) > 1) = 1; * Abandoned land pc35_land_other(j,"othernat",ac_est) that has not yet been allocated to * p35_forest_recovery_area(t,j,ac_est) is then distributed proportionally using the forest recovery share. p35_forest_recovery_area(t,j,ac_est) = p35_forest_recovery_area(t,j,ac_est) + (pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est)) * pc35_forest_recovery_shr(j); +p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2, p35_forest_recovery_area(t,j,ac_est2)) > pc35_max_forest_recovery(j)) = pc35_max_forest_recovery(j)/card(ac_est2); pc35_land_other(j,"othernat",ac_est) = pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est); pc35_land_other(j,"youngsecdf",ac_est) = pc35_land_other(j,"youngsecdf",ac_est) + p35_forest_recovery_area(t,j,ac_est); From 01fa7a3ebce0551d2d8b96e210f590387da97e5a Mon Sep 17 00:00:00 2001 From: Felicitas Date: Tue, 28 May 2024 18:30:55 +0200 Subject: [PATCH 232/259] merged solve conflict in scenario config --- config/scenario_config.csv | 38 ++++++++++++++------------------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index ddfa0d2589..131070f9a1 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -1,10 +1,12 @@ ;cc;nocc;nocc_hist;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SDP;SDP-EI;SDP-RC;SDP-MC;BASE;NPI;NDC;coupling;emulator;input;Tland;eat_lancet_diet;EL2_PHD;EL2_Demand;EL2_default;LAMA_Inequal;LAMA_Inequal-SustDemand;LAMA_Inequal-EnvirProt;LAMA_Inequal-GHGPrice;LAMA_Sustainability;NAVIGATE_AllOff;NAVIGATE_LandSup;NAVIGATE_LandDem;NAVIGATE_AllOn;ForestryEndo;ForestryExo;ForestryOff;frst_shock_none;frst_shock_002lin2030;frst_shock_004lin2030;frst_shock_008lin2030;frst_shock_016lin2030;rcp1p9;rcp2p6;rcp4p5;rcp6p0;rcp7p0;rcp8p5;NGFS_o_lowdem;GENIE_SCP +gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 gms$c09_pop_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP1;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$c09_gdp_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SDP_EI;SDP_RC;SDP_MC;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$c09_pal_scenario;;;;SSP1;SSP2;SSP2EU;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;SDP;SDP;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;; gms$s12_interest_lic;;;;;;;;;;;;;;;;;;;;;;0.06;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s12_interest_hic;;;;;;;;;;;;;;;;;;;;;;0.04;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c13_tccost;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;high +gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc gms$food;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;anthropometrics_jan18 gms$c15_food_scenario;;;;SSP1;SSP2;SSP2;SSP3;SSP4;SSP5;SSP1;SSP2;SSP1;SSP1;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; gms$c15_food_scenario_noselect;;;;;;;;;;;;;;;;;;;;;;;;;SSP4;SSP1;SSP4;SSP4;SSP1;;;;;;;;;;;;;;;;;;;SSP2; @@ -46,7 +48,7 @@ gms$s30_snv_scenario_target;;;;;;;;;;;;;2030;;;;;;;;;;;;2030;2030;2030;2030;2030 gms$s30_annual_max_growth;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0.02 gms$c31_grassl_yld_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;4;4;0;;;;;;;;;;;;; +gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; gms$s32_aff_plantation;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;0;;;;;;;;;;;;;;;;;;;;;;;;; gms$s32_aff_bii_coeff;;;;0;0;0;0;0;0;0;1;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -58,19 +60,23 @@ gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;; gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;0;0;0;0;0;;;;;0;0;0;;;;;;;;;;;;; -gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; +gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; +gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; gms$factor_costs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sticky_feb18 +gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;;;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; gms$c42_env_flow_policy;;;;on;off;off;off;mixed;on;on;on;on;on;;;;;;;on;;;;;on;on;on;on;on;;;;;;;;;;;;;;;;;;;; gms$s42_efp_targetyear;;;;2040;2040;2040;2040;2040;2040;2040;2050;2070;2050;;;;;;;2040;;;;;2040;2040;2040;2040;2040;;;;;;;;;;;;;;;;;;;; +gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$s44_target_price;;;;0;0;0;0;0;0;0;0;0;0;;;;;;;0;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$s44_cost_bii_missing;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10000000 gms$c50_scen_neff;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;;;;;;;;;;;;;;;;;;;; gms$c50_scen_neff_noselect;;;;baseeff_add3_add10_add20_max75;baseeff_add3_add5_add10_max65;baseeff_add3_add5_add10_max65;baseeff_add3_add0_add0_max55;baseeff_add3_add10_add15_max75;baseeff_add3_add5_add15_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max75;baseeff_add3_add15_add25_max65;baseeff_add3_add15_add25_max75;;;;;;;baseeff_add3_add15_add25_max75;;;;;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;baseeff_add3_add10_add15_max75;;;;;;;;;;;;;;;;;;;; +gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; +gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; gms$c55_scen_conf;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp1;ssp1;ssp1;ssp1;ssp1;;;;;;;;;;;;;;;;;;;; gms$c55_scen_conf_noselect;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp1;ssp1;ssp1;;;;;;;ssp1;;;;;ssp4;ssp4;ssp1;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; gms$c56_pollutant_prices;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi @@ -79,6 +85,11 @@ gms$s56_c_price_exp_aff;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;; gms$s56_buffer_aff;;;;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.2;0.3;;;;;;;0.5;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c56_emis_policy;;;;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;reddnatveg_nosoil;redd_nosoil;all_nosoil;;;;;;;reddnatveg_nosoil;;;;none;;;;;;;;;;;;;;;;;;;;;;;;; gms$s56_minimum_cprice;;;;;;;;;;;;;;0;0;18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 +gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; +gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; +gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; +gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$maccs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$bioenergy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1st2ndgen_priced_feb24 gms$c60_2ndgen_biodem;;;;;;;;;;;;;;;;;coupling;emulator;coupling;;;;;none;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;R21M42-SDP-PkBudg1000;;;;;;;;;;;;;;;;;;;;R32M46-SSP2EU-NPi @@ -88,27 +99,6 @@ gms$c60_biodem_level;;;;;;;;;;;;;;;;;1;0;;;;;;;1;1;1;1;1;;;;;;;;;;;;;;;;;;;; gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;;;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp1;;;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; -gms$c_timesteps;;;;;;;;;;;;;;;;;less_TS;less_TS;;;;;;;5year;5year;5year;5year;5year;;;;;;;;;;;;;;;;;;;;coup2110 -gms$c14_yields_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;;nocc -gms$c42_watdem_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c43_watavail_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c52_carbon_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$s32_initial_distribution;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -gms$s32_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;1;0;;;;;;;;;;;;; -gms$s35_secdf_distribution;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; -gms$s35_hvarea;;;;;;;;;;;;;;;;;;;;;;;;;2;2;2;2;2;;;;;2;2;0;;;;;;;;;;;;; gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -gms$s35_forest_damage;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4;4;4;4;4;;;;;;;; -gms$c32_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; -gms$c35_shock_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;none;002lin2030;004lin2030;008lin2030;016lin2030;;;;;;;; input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.106_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.106_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.106_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.106_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.106_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; -gms$c52_land_carbon_sink_rcp;;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RCP19;RCP26;RCP45;RCP60;RCPBU;RCPBU;; -gms$c56_mute_ghgprices_until;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;y2020 -gms$c57_macc_version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;PBL_2022;PBL_2022;PBL_2022;PBL_2022;;;;;;;;;;;;;;;; -gms$c57_macc_scenario;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Default;Optimistic;Default;Optimistic;;;;;;;;;;;;;;;; -gms$s58_rewetting_switch;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0;1;0;1;;;;;;;;;;;;;;;; -gms$c59_som_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; -gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.105_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.105_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.105_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.105_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.105_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.105_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;;;;;;;;;;;;;;;;;;;;;;;;; From 1ef1ccca4096d7945995046813c69da1561b7fbd Mon Sep 17 00:00:00 2001 From: florianh Date: Wed, 29 May 2024 16:59:18 +0200 Subject: [PATCH 233/259] bugfix othernat --- modules/35_natveg/pot_forest_may24/presolve.gms | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 8d2ac2ede8..c20b972644 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -55,8 +55,11 @@ p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2, p35_forest_recovery_area(t,j, * The proportion of secondary forest recovery in total natveg * recovery is derived from the remaining forest recovery area -pc35_forest_recovery_shr(j) = (pc35_max_forest_recovery(j) - sum(ac_est, p35_forest_recovery_area(t,j,ac_est))) - / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")+1e-10); +pc35_forest_recovery_shr(j) = 0; +pc35_forest_recovery_shr(j)$((sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")) > +1e-10) = + (pc35_max_forest_recovery(j) - sum(ac_est, p35_forest_recovery_area(t,j,ac_est))) + / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")); +pc35_forest_recovery_shr(j)$(pc35_forest_recovery_shr(j) < 0) = 0; pc35_forest_recovery_shr(j)$(pc35_forest_recovery_shr(j) > 1) = 1; * Abandoned land pc35_land_other(j,"othernat",ac_est) that has not yet been allocated to * p35_forest_recovery_area(t,j,ac_est) is then distributed proportionally using the forest recovery share. From d81391a6c5674300e1f57e48ddf298c92ec58ebe Mon Sep 17 00:00:00 2001 From: Jake Tommey Date: Fri, 24 May 2024 17:03:02 +0200 Subject: [PATCH 234/259] modified agmip merge report script to use piamInterfaces --- CHANGELOG.md | 1 + scripts/output/projects/agmip_merge_report.R | 37 ++++++++++++++++---- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d7b181f9e..954636af1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **35_natveg** `vm_land(j2,"forestry")` included in NPI/NDC constraint `q35_min_forest` - **35_natveg** replaced the realisation `dynamic_feb21` with realisation `pot_forest_may24`. The new realisation provides additional information on the potential forest area, which is now used to constrain forest and forestry expansion and recovery. The remaining area for forest establishment is provided to the forestry module via the new interface parameter `pcm_max_forest_est`. - **52_carbon** Separate carbon densities for forest and other land. Before there was only a single carbon density for natural vegetation land. +- **scripts** modified agmip_merge_report to use piamInterfaces ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` diff --git a/scripts/output/projects/agmip_merge_report.R b/scripts/output/projects/agmip_merge_report.R index 94dfa25996..a442673e22 100644 --- a/scripts/output/projects/agmip_merge_report.R +++ b/scripts/output/projects/agmip_merge_report.R @@ -14,8 +14,9 @@ library(lucode2) library(magclass) library(quitte) library(madrat) -library(iamc) +library(piamInterfaces) library(gms) +library(dplyr) options(error=function()traceback(2)) @@ -64,10 +65,32 @@ if (!is.null(missing)) { } if (file.exists("output/agmip_report_full.csv")) { - #saveRDS(read.quitte("output/agmip_report_full.csv"),file = "output/agmip_report_full.rds") - #agmip_report_full <- read.report(file="agmip_report_full.csv") - write.reportProject(mif = "output/agmip_report_full.csv", - mapping = system.file("extdata", mapping = "variablemappingAgMIP.csv", package = "magpie4"), - file = "output/agmip_report_subset.csv", format = "AgMIP") - #write.reportProject(mif="output/agmip_report_full.csv",mapping = "mapping_magpie_agmip.csv", file = "agmip_report_subset.csv",format="AgMIP") + submission <- generateIIASASubmission( + mifs = "output/agmip_report_full.csv", + mapping = "AgMIP", + model = "MAgPIE", + outputFilename = NULL, + timesteps = c(seq(1900, 2100, 1)), + naAction = "na.pass" + ) + submission <- submission %>% + mutate( + "item" := gsub(".*\\.", "", variable), + "variable" := gsub("\\..*", "", variable) + ) %>% + select( + "Model" = "model", + "Scenario" = "scenario", + "Region" = "region", + "Item" = "item", + "Variable" = "variable", + "Year" = "period", + "Unit" = "unit", + "Value" = "value" + ) + write.csv(submission, + quote = FALSE, + file = "output/agmip_submission_report.csv", + row.names = FALSE + ) } From 315b9a02261662620f52f1655633a1dc511aa1d7 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 3 Jun 2024 15:28:12 +0200 Subject: [PATCH 235/259] bugfix negative values in p35_forest_recovery_area --- modules/35_natveg/pot_forest_may24/presolve.gms | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index c20b972644..8a7415e985 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -56,7 +56,7 @@ p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2, p35_forest_recovery_area(t,j, * The proportion of secondary forest recovery in total natveg * recovery is derived from the remaining forest recovery area pc35_forest_recovery_shr(j) = 0; -pc35_forest_recovery_shr(j)$((sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")) > +1e-10) = +pc35_forest_recovery_shr(j)$((sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")) > 0) = (pc35_max_forest_recovery(j) - sum(ac_est, p35_forest_recovery_area(t,j,ac_est))) / (sum(land_ag, pcm_land(j,land_ag))+pcm_land(j,"urban")); pc35_forest_recovery_shr(j)$(pc35_forest_recovery_shr(j) < 0) = 0; @@ -67,6 +67,8 @@ p35_forest_recovery_area(t,j,ac_est) = p35_forest_recovery_area(t,j,ac_est) + (pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est)) * pc35_forest_recovery_shr(j); p35_forest_recovery_area(t,j,ac_est)$(sum(ac_est2, p35_forest_recovery_area(t,j,ac_est2)) > pc35_max_forest_recovery(j)) = pc35_max_forest_recovery(j)/card(ac_est2); +p35_forest_recovery_area(t,j,ac_est)$(p35_forest_recovery_area(t,j,ac_est) > pc35_land_other(j,"othernat",ac_est)) = pc35_land_other(j,"othernat",ac_est); +p35_forest_recovery_area(t,j,ac_est)$(p35_forest_recovery_area(t,j,ac_est) < 0) = 0; pc35_land_other(j,"othernat",ac_est) = pc35_land_other(j,"othernat",ac_est) - p35_forest_recovery_area(t,j,ac_est); pc35_land_other(j,"youngsecdf",ac_est) = pc35_land_other(j,"youngsecdf",ac_est) + p35_forest_recovery_area(t,j,ac_est); From b7b532378ef1b25145872c1fda10bade70880389 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 4 Jun 2024 08:51:32 +0200 Subject: [PATCH 236/259] bugfix negative values in p35_land_restoration --- modules/10_land/landmatrix_dec18/presolve.gms | 2 +- modules/35_natveg/pot_forest_may24/presolve.gms | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/10_land/landmatrix_dec18/presolve.gms b/modules/10_land/landmatrix_dec18/presolve.gms index edee5163dc..5a79286fe5 100644 --- a/modules/10_land/landmatrix_dec18/presolve.gms +++ b/modules/10_land/landmatrix_dec18/presolve.gms @@ -22,4 +22,4 @@ vm_lu_transitions.up(j,"primforest","primforest") = Inf; *' @stop -m_boundfix(vm_land,(j,land),up,10e-5); +m_boundfix(vm_land,(j,land),up,1e-6); diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 8a7415e985..de60662f9e 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -149,7 +149,10 @@ vm_land.up(j,"primforest") = pcm_land(j,"primforest"); v35_secdforest.lo(j,ac) = 0; v35_secdforest.up(j,ac) = Inf; -p35_protection_dist(j,ac_sub) = (pc35_secdforest(j,ac_sub)/sum(ac_sub2,pc35_secdforest(j,ac_sub2)))$(sum(ac_sub2,pc35_secdforest(j,ac_sub2))>0); +* Secondary forest conservation +p35_protection_dist(j,ac_sub) = 0; +p35_protection_dist(j,ac_sub)$(sum(ac_sub2,pc35_secdforest(j,ac_sub2)) > 0) = pc35_secdforest(j,ac_sub) / sum(ac_sub2,pc35_secdforest(j,ac_sub2)); +pm_land_conservation(t,j,"secdforest","protect")$(pm_land_conservation(t,j,"secdforest","protect") > sum(ac_sub, pc35_secdforest(j,ac_sub))) = sum(ac_sub, pc35_secdforest(j,ac_sub)); if (sum(sameas(t_past,t),1) = 1, v35_secdforest.lo(j,ac_sub) = pm_land_conservation(t,j,"secdforest","protect") * p35_protection_dist(j,ac_sub); else @@ -159,9 +162,6 @@ v35_secdforest.lo(j,ac_sub) = max((1-s35_natveg_harvest_shr) * pc35_secdforest(j v35_secdforest.up(j,ac_sub) = pc35_secdforest(j,ac_sub); m_boundfix(v35_secdforest,(j,ac_sub),l,1e-6); -* Secondary forest conservation -* protection bound fix -pm_land_conservation(t,j,"secdforest","protect")$(abs(pm_land_conservation(t,j,"secdforest","protect") - sum(ac_sub, pc35_secdforest(j,ac_sub))) < 1e-6) = sum(ac_sub, pc35_secdforest(j,ac_sub)); * set restoration target p35_land_restoration(j,"secdforest") = pm_land_conservation(t,j,"secdforest","restore"); * Do not restore secdforest in areas where total natural @@ -172,6 +172,7 @@ p35_land_restoration(j,"secdforest")$(sum(land_natveg, pcm_land(j,land_natveg)) * any remaining restoration area is substracted and shifted to other land restoration. p35_restoration_shift(j) = p35_land_restoration(j,"secdforest") - pc35_max_forest_recovery(j); p35_restoration_shift(j)$(p35_restoration_shift(j) < 0) = 0; +p35_restoration_shift(j)$(p35_restoration_shift(j) > p35_land_restoration(j,"secdforest")) = p35_land_restoration(j,"secdforest"); p35_land_restoration(j,"secdforest") = p35_land_restoration(j,"secdforest") - p35_restoration_shift(j); pm_land_conservation(t,j,"other","restore") = pm_land_conservation(t,j,"other","restore") + p35_restoration_shift(j); @@ -193,7 +194,7 @@ m_boundfix(vm_land_other,(j,othertype35,ac_sub),l,1e-6); * Other land conservation * protection bound fix -pm_land_conservation(t,j,"other","protect")$(abs(pm_land_conservation(t,j,"other","protect") - sum(ac_sub, pc35_land_other(j,"othernat",ac_sub))) < 1e-6) = sum(ac_sub, pc35_land_other(j,"othernat",ac_sub)); +pm_land_conservation(t,j,"other","protect")$(pm_land_conservation(t,j,"other","protect") > sum(ac_sub, pc35_land_other(j,"othernat",ac_sub))) = sum(ac_sub, pc35_land_other(j,"othernat",ac_sub)); * set restoration target p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * Do not restore other land in areas where total natural @@ -202,6 +203,9 @@ p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= su * set conservation bound vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); +* boundfix for land_natveg +m_boundfix(vm_land,(j,land),up,1e-6); + * ---------------------------- * Calculate carbon density * ------------------------------ From ce151bc7c726b86c7492c8049211e7b58918d4e1 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 4 Jun 2024 10:29:34 +0200 Subject: [PATCH 237/259] bugfix test_runs.R --- CHANGELOG.md | 1 + scripts/start/test_runs.R | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d7b181f9e..0e56c71ec2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **start/projects/fsec.R** scenario settings - **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working - **58_peatland** Added balance variable to avoid random infeasibilites +- **scripts/start/test_runs.R** include all default output script, in particular disaggregation.R, which is needed for BII ## [4.7.3] - 2024-04-12 diff --git a/scripts/start/test_runs.R b/scripts/start/test_runs.R index e30a77ab08..334a514ffb 100644 --- a/scripts/start/test_runs.R +++ b/scripts/start/test_runs.R @@ -26,7 +26,6 @@ download_and_update(cfg) # create additional information to describe the runs cfg$info$flag <- "weeklyTests" -cfg$output <- c("rds_report") # Only run rds_report after model run cfg$results_folder <- "output/:title:" cfg$force_replace <- TRUE From d74c41169fbfe2240cea45fac67444a1a7d273c4 Mon Sep 17 00:00:00 2001 From: Jake Tommey Date: Tue, 4 Jun 2024 11:01:21 +0200 Subject: [PATCH 238/259] change the agmip_merge_report script to start in 1995 --- scripts/output/projects/agmip_merge_report.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/projects/agmip_merge_report.R b/scripts/output/projects/agmip_merge_report.R index a442673e22..301c111cf6 100644 --- a/scripts/output/projects/agmip_merge_report.R +++ b/scripts/output/projects/agmip_merge_report.R @@ -70,7 +70,7 @@ if (file.exists("output/agmip_report_full.csv")) { mapping = "AgMIP", model = "MAgPIE", outputFilename = NULL, - timesteps = c(seq(1900, 2100, 1)), + timesteps = c(seq(1995, 2100, 1)), naAction = "na.pass" ) submission <- submission %>% From c5a0c57c9735014dcd9900a6e5e2249b88e6c7fe Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 4 Jun 2024 15:49:42 +0200 Subject: [PATCH 239/259] update --- modules/35_natveg/pot_forest_may24/equations.gms | 3 ++- modules/35_natveg/pot_forest_may24/presolve.gms | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index eea810d8bc..5052d648f8 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -211,8 +211,9 @@ q35_secdforest_regeneration(j2).. q35_other_regeneration(j2).. sum(ac_est, vm_land_other(j2,"othernat",ac_est)) - =g= + =e= sum((othertype35,ac_sub),v35_hvarea_other(j2,othertype35,ac_sub)) + + vm_landexpansion(j2,"other") ; *' The following two constraints distribute additions to secdforest and other land diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index de60662f9e..abad4f86bf 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -194,7 +194,9 @@ m_boundfix(vm_land_other,(j,othertype35,ac_sub),l,1e-6); * Other land conservation * protection bound fix -pm_land_conservation(t,j,"other","protect")$(pm_land_conservation(t,j,"other","protect") > sum(ac_sub, pc35_land_other(j,"othernat",ac_sub))) = sum(ac_sub, pc35_land_other(j,"othernat",ac_sub)); +pm_land_conservation(t,j,"other","protect")$(pm_land_conservation(t,j,"other","protect") > + sum((othertype35,ac_sub), pc35_land_other(j,othertype35,ac_sub))) = + sum((othertype35,ac_sub), pc35_land_other(j,othertype35,ac_sub)); * set restoration target p35_land_restoration(j,"other") = pm_land_conservation(t,j,"other","restore"); * Do not restore other land in areas where total natural @@ -204,7 +206,7 @@ p35_land_restoration(j,"other")$(sum(land_natveg, pcm_land(j,land_natveg)) >= su vm_land.lo(j,"other") = pm_land_conservation(t,j,"other","protect") + p35_land_restoration(j,"other"); * boundfix for land_natveg -m_boundfix(vm_land,(j,land),up,1e-6); +m_boundfix(vm_land,(j,land_natveg),up,1e-6); * ---------------------------- * Calculate carbon density From 11a568021ddff79fe588ba9061103a01a833aca4 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 4 Jun 2024 18:46:33 +0200 Subject: [PATCH 240/259] bugfix max forest recovery --- modules/35_natveg/pot_forest_may24/declarations.gms | 2 +- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- modules/35_natveg/pot_forest_may24/postsolve.gms | 10 +++++++--- modules/35_natveg/pot_forest_may24/preloop.gms | 13 +++++++++++-- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index e440e3a270..5caf9dd1a6 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -22,7 +22,7 @@ parameters pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) + pcm_max_forest_est(t,j) Overall forest establishment potential in current time step (mio. ha) pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 5052d648f8..662fbd9146 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -190,7 +190,7 @@ q35_hvarea_other(j2,othertype35,ac_sub).. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - pcm_max_forest_est(j2) + sum(ct, pcm_max_forest_est(ct,j2)) - sum(ac, vm_land_other(j2,"youngsecdf",ac) ) ; diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index d92c17f222..73a02e8bcb 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -12,9 +12,13 @@ pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); pc35_land_other(j,othertype35,ac) = vm_land_other.l(j,othertype35,ac); * Reset forest establishment bound -pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); -pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; - +if(m_year(t) <= sm_fix_SSP2, + pcm_max_forest_est(t,j) = 0; + pcm_max_forest_est(t,j)$(fm_carbon_density(t,j,"secdforest","vegc") > 20) = sum(land, vm_land.l(j,land)) - sum(land_forest, vm_land.l(j,land_forest)); +else + pcm_max_forest_est(t,j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); + pcm_max_forest_est(t,j)$(pcm_max_forest_est(t,j) < 0) = 0; +); *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); ov_land_other(t,j,othertype35,ac,"marginal") = vm_land_other.m(j,othertype35,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 3f4750017f..62aa874c01 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -47,8 +47,17 @@ p35_disturbance_loss_primf(t,j) = 0; * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; + +loop(t, + if(m_year(t) <= sm_fix_SSP2, + pcm_max_forest_est(t,j) = 0; + pcm_max_forest_est(t,j)$(fm_carbon_density(t,j,"secdforest","vegc") > 20) = sum(land, pcm_land(j,land)) - sum(land_forest, pcm_land(j,land_forest)); + else + pcm_max_forest_est(t,j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); + pcm_max_forest_est(t,j)$(pcm_max_forest_est(t,j) < 0) = 0; + ); +); + * ----------------------------------------- * Land conservation for climate mitigation diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index abad4f86bf..e2f42a5013 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,7 +45,7 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Calculate the upper boundary for secondary forest recovery -pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); +pc35_max_forest_recovery(j) = pcm_max_forest_est(t,j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); *** Distribute forestry abandonement * Abandoned forestry is directly shifted into p35_forest_recovery_area(t,j,ac_est) because it is From 48c12080ec62d9c39540e85d81b6ec7098fde651 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 4 Jun 2024 19:09:42 +0200 Subject: [PATCH 241/259] bugfix --- modules/32_forestry/dynamic_may24/presolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 65d4e73373..74f6cb5d2c 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -23,7 +23,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation p32_aff_pot(t,j) = sum((kcr,w),vm_area.l(j,kcr,w) - vm_area.lo(j,kcr,w)) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); *** NDC/NPI re/afforesation is further constrained by the remaining forest establishment potential - p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(j)) = pcm_max_forest_est(j); + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(t,j)) = pcm_max_forest_est(t,j); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available From 2ed583e7d90bd0f7c3a9890afd0f3958aa99370f Mon Sep 17 00:00:00 2001 From: florianh Date: Wed, 5 Jun 2024 14:16:42 +0200 Subject: [PATCH 242/259] reverting back pcm_max_forest_est --- modules/32_forestry/dynamic_may24/presolve.gms | 2 +- modules/35_natveg/pot_forest_may24/declarations.gms | 2 +- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- modules/35_natveg/pot_forest_may24/postsolve.gms | 10 +++++++--- modules/35_natveg/pot_forest_may24/preloop.gms | 13 +++++++++++-- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 6 files changed, 22 insertions(+), 9 deletions(-) diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 65d4e73373..74f6cb5d2c 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -23,7 +23,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation p32_aff_pot(t,j) = sum((kcr,w),vm_area.l(j,kcr,w) - vm_area.lo(j,kcr,w)) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); *** NDC/NPI re/afforesation is further constrained by the remaining forest establishment potential - p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(j)) = pcm_max_forest_est(j); + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(t,j)) = pcm_max_forest_est(t,j); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index e440e3a270..5caf9dd1a6 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -22,7 +22,7 @@ parameters pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) + pcm_max_forest_est(t,j) Overall forest establishment potential in current time step (mio. ha) pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 5052d648f8..662fbd9146 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -190,7 +190,7 @@ q35_hvarea_other(j2,othertype35,ac_sub).. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - pcm_max_forest_est(j2) + sum(ct, pcm_max_forest_est(ct,j2)) - sum(ac, vm_land_other(j2,"youngsecdf",ac) ) ; diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index d92c17f222..73a02e8bcb 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -12,9 +12,13 @@ pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); pc35_land_other(j,othertype35,ac) = vm_land_other.l(j,othertype35,ac); * Reset forest establishment bound -pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); -pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; - +if(m_year(t) <= sm_fix_SSP2, + pcm_max_forest_est(t,j) = 0; + pcm_max_forest_est(t,j)$(fm_carbon_density(t,j,"secdforest","vegc") > 20) = sum(land, vm_land.l(j,land)) - sum(land_forest, vm_land.l(j,land_forest)); +else + pcm_max_forest_est(t,j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); + pcm_max_forest_est(t,j)$(pcm_max_forest_est(t,j) < 0) = 0; +); *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); ov_land_other(t,j,othertype35,ac,"marginal") = vm_land_other.m(j,othertype35,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 3f4750017f..62aa874c01 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -47,8 +47,17 @@ p35_disturbance_loss_primf(t,j) = 0; * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; + +loop(t, + if(m_year(t) <= sm_fix_SSP2, + pcm_max_forest_est(t,j) = 0; + pcm_max_forest_est(t,j)$(fm_carbon_density(t,j,"secdforest","vegc") > 20) = sum(land, pcm_land(j,land)) - sum(land_forest, pcm_land(j,land_forest)); + else + pcm_max_forest_est(t,j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); + pcm_max_forest_est(t,j)$(pcm_max_forest_est(t,j) < 0) = 0; + ); +); + * ----------------------------------------- * Land conservation for climate mitigation diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index abad4f86bf..e2f42a5013 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,7 +45,7 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Calculate the upper boundary for secondary forest recovery -pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); +pc35_max_forest_recovery(j) = pcm_max_forest_est(t,j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); *** Distribute forestry abandonement * Abandoned forestry is directly shifted into p35_forest_recovery_area(t,j,ac_est) because it is From 50923e77bf87b8a73383a1b728cf54faae1504d4 Mon Sep 17 00:00:00 2001 From: florianh Date: Wed, 5 Jun 2024 14:22:41 +0200 Subject: [PATCH 243/259] Revert "bugfix" This reverts commit 48c12080ec62d9c39540e85d81b6ec7098fde651. --- modules/32_forestry/dynamic_may24/presolve.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 74f6cb5d2c..65d4e73373 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -23,7 +23,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation p32_aff_pot(t,j) = sum((kcr,w),vm_area.l(j,kcr,w) - vm_area.lo(j,kcr,w)) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); *** NDC/NPI re/afforesation is further constrained by the remaining forest establishment potential - p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(t,j)) = pcm_max_forest_est(t,j); + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(j)) = pcm_max_forest_est(j); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available From 7c99ab6d1616919f85358eaae589ffe4871a4dab Mon Sep 17 00:00:00 2001 From: florianh Date: Wed, 5 Jun 2024 14:22:51 +0200 Subject: [PATCH 244/259] Revert "bugfix max forest recovery" This reverts commit 11a568021ddff79fe588ba9061103a01a833aca4. --- modules/35_natveg/pot_forest_may24/declarations.gms | 2 +- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- modules/35_natveg/pot_forest_may24/postsolve.gms | 10 +++------- modules/35_natveg/pot_forest_may24/preloop.gms | 13 ++----------- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- 5 files changed, 8 insertions(+), 21 deletions(-) diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index 5caf9dd1a6..e440e3a270 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -22,7 +22,7 @@ parameters pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - pcm_max_forest_est(t,j) Overall forest establishment potential in current time step (mio. ha) + pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index 662fbd9146..5052d648f8 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -190,7 +190,7 @@ q35_hvarea_other(j2,othertype35,ac_sub).. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - sum(ct, pcm_max_forest_est(ct,j2)) + pcm_max_forest_est(j2) - sum(ac, vm_land_other(j2,"youngsecdf",ac) ) ; diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index 73a02e8bcb..d92c17f222 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -12,13 +12,9 @@ pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); pc35_land_other(j,othertype35,ac) = vm_land_other.l(j,othertype35,ac); * Reset forest establishment bound -if(m_year(t) <= sm_fix_SSP2, - pcm_max_forest_est(t,j) = 0; - pcm_max_forest_est(t,j)$(fm_carbon_density(t,j,"secdforest","vegc") > 20) = sum(land, vm_land.l(j,land)) - sum(land_forest, vm_land.l(j,land_forest)); -else - pcm_max_forest_est(t,j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); - pcm_max_forest_est(t,j)$(pcm_max_forest_est(t,j) < 0) = 0; -); +pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); +pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; + *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); ov_land_other(t,j,othertype35,ac,"marginal") = vm_land_other.m(j,othertype35,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 62aa874c01..3f4750017f 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -47,17 +47,8 @@ p35_disturbance_loss_primf(t,j) = 0; * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for forest establishments is given by the potential forest * area minus all forest areas in the previous time step. - -loop(t, - if(m_year(t) <= sm_fix_SSP2, - pcm_max_forest_est(t,j) = 0; - pcm_max_forest_est(t,j)$(fm_carbon_density(t,j,"secdforest","vegc") > 20) = sum(land, pcm_land(j,land)) - sum(land_forest, pcm_land(j,land_forest)); - else - pcm_max_forest_est(t,j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); - pcm_max_forest_est(t,j)$(pcm_max_forest_est(t,j) < 0) = 0; - ); -); - +pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); +pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; * ----------------------------------------- * Land conservation for climate mitigation diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index e2f42a5013..abad4f86bf 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,7 +45,7 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Calculate the upper boundary for secondary forest recovery -pc35_max_forest_recovery(j) = pcm_max_forest_est(t,j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); +pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); *** Distribute forestry abandonement * Abandoned forestry is directly shifted into p35_forest_recovery_area(t,j,ac_est) because it is From 05e3dc3ceaeb9e74f20c9a68aefad3f496fa8508 Mon Sep 17 00:00:00 2001 From: pvjeetze Date: Wed, 5 Jun 2024 17:13:01 +0200 Subject: [PATCH 245/259] added time dimension to potential forest area --- config/default.cfg | 6 ++++++ config/scenario_config.csv | 1 + modules/32_forestry/dynamic_may24/presolve.gms | 2 +- modules/35_natveg/pot_forest_may24/declarations.gms | 2 +- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- modules/35_natveg/pot_forest_may24/input.gms | 11 ++++++++++- modules/35_natveg/pot_forest_may24/postsolve.gms | 6 +++--- modules/35_natveg/pot_forest_may24/preloop.gms | 4 ++-- modules/35_natveg/pot_forest_may24/presolve.gms | 2 +- modules/35_natveg/pot_forest_may24/realization.gms | 2 +- 10 files changed, 27 insertions(+), 11 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 693b579897..9f7017f7e2 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -974,6 +974,12 @@ cfg$gms$s35_hvarea <- 2 # def = 2 # * ("016lin2030") Disturbance applied to 1p6 percent per year linear phase-in over 20yrs from 0 in 2030 cfg$gms$c35_shock_scenario = "none" # def = "none" +# * Scenario for potential forest area +# * options: cc (climate change) +# * nocc (no climate change) +# * nocc_hist (no climate change after year defined by sm_fix_cc) +cfg$gms$c35_pot_forest_scenario <- "cc" # def = "cc" + # ***--------------------- 36_employment ------------------------------- # * This module calculates agricultural employment. # * (exo_may22): employment is calculated based on labor costs and not affecting the diff --git a/config/scenario_config.csv b/config/scenario_config.csv index fd673c0b0e..a96bebeba2 100644 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -50,6 +50,7 @@ gms$c32_aff_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;; gms$s32_planing_horizon;;;;50;50;50;50;50;50;50;30;50;50;;;;;;;50;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c35_ad_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; gms$c35_aolc_policy;;;;;;;;;;;;;;none;npi;ndc;;;;;;;;;ndc;ndc;ndc;ndc;ndc;;;;;;;;;;;;;;;;;;;; +gms$c35_pot_forest_scenario;cc;nocc;nocc_hist;;;;;;;;;;;;;;;;;;;;;;cc;cc;cc;cc;cc;;;;;;;;;;;;;;;;;;;; gms$s35_forest_damage_end;;;;2030;2050;2050;2050;2050;2030;2030;2030;2030;2030;;;;;;;2030;;;;;2030;2030;2030;2030;2030;;;;;;;;;;;;;;;;;;;; gms$s42_watdem_nonagr_scenario;;;;1;2;2;3;2;1;1;1;3;1;;;;;;;;;;;;2;1;2;2;1;;;;;;;;;;;;;;;;;;;; gms$s42_irrig_eff_scenario;;;;2;2;2;2;2;2;3;3;3;3;;;;;;;3;;;;;3;3;3;3;3;;;;;;;;;;;;;;;;;;;; diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index 65d4e73373..0d37dcd651 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -23,7 +23,7 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; * Suitable area (`p32_aff_pot`) for NPI/NDC afforestation p32_aff_pot(t,j) = sum((kcr,w),vm_area.l(j,kcr,w) - vm_area.lo(j,kcr,w)) + (vm_land.l(j,"past") - vm_land.lo(j,"past")) - pm_land_conservation(t,j,"other","restore"); *** NDC/NPI re/afforesation is further constrained by the remaining forest establishment potential - p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pcm_max_forest_est(j)) = pcm_max_forest_est(j); + p32_aff_pot(t,j)$(p32_aff_pot(t,j) > pm_max_forest_est(t,j)) = pm_max_forest_est(t,j); * suitable area `p32_aff_pot` can be negative, if land restoration is switched on (level smaller than lower bound), therefore set negative values to 0 p32_aff_pot(t,j)$(p32_aff_pot(t,j) < 0) = 0; * Limit prescribed NPI/NDC afforestation in `p32_aff_pol_timestep` if not enough suitable area (`p32_aff_pot`) for afforestation is available diff --git a/modules/35_natveg/pot_forest_may24/declarations.gms b/modules/35_natveg/pot_forest_may24/declarations.gms index e440e3a270..a583d4da6c 100644 --- a/modules/35_natveg/pot_forest_may24/declarations.gms +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -22,7 +22,7 @@ parameters pc35_forest_recovery_shr(j) Forest share in natveg recovery (1) p35_forest_recovery_area(t,j,ac) Recovered forest (mio. ha) p35_maturesecdf(t,j,ac) Matured secondary forest (mio. ha) - pcm_max_forest_est(j) Overall forest establishment potential in current time step (mio. ha) + pm_max_forest_est(t,j) Overall forest establishment potential in current time step (mio. ha) pc35_max_forest_recovery(j) Maximum forest recovery potential after land abandonement (mio. ha) p35_carbon_density_other(t,j,othertype35,ac,ag_pools) Carbon density other land (tC per ha) p35_disturbance_loss_secdf(t,j,ac) Loss due to disturbances in secondary forest (mio. ha) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index eea810d8bc..e1ecbbbd61 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -190,7 +190,7 @@ q35_hvarea_other(j2,othertype35,ac_sub).. q35_max_forest_establishment(j2).. sum(land_forest, vm_landexpansion(j2,land_forest)) =l= - pcm_max_forest_est(j2) + sum(ct,pm_max_forest_est(ct,j2)) - sum(ac, vm_land_other(j2,"youngsecdf",ac) ) ; diff --git a/modules/35_natveg/pot_forest_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms index 0ed373a22b..d4922eae94 100644 --- a/modules/35_natveg/pot_forest_may24/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -9,6 +9,11 @@ $setglobal c35_ad_policy npi $setglobal c35_aolc_policy npi $setglobal c35_shock_scenario none +$setglobal c35_pot_forest_scenario cc +* options: cc (climate change) +* nocc (no climate change) +* nocc_hist (no climate change after year defined by sm_fix_cc) + scalars s35_hvarea Flag for harvested area (0=zero 1=exognous 2=endogneous) / 2 / s35_hvarea_secdforest annual secdforest harvest rate for s35_hvarea equals 1 (percent per year) / 0 / @@ -48,9 +53,13 @@ $include "./modules/35_natveg/input/f35_forest_disturbance_share.cs4" $offdelim /; -parameter f35_pot_forest_area(j) Potential forest area (mio. ha) +parameter f35_pot_forest_area(t_all,j) Potential forest area (mio. ha) / $ondelim $include "./modules/35_natveg/input/pot_forest_area.cs2" $offdelim /; + +$if "%c35_pot_forest_scenario%" == "nocc" f35_pot_forest_area(t_all,j) = f35_pot_forest_area("y1995",j); +$if "%c35_pot_forest_scenario%" == "nocc_hist" f35_pot_forest_area(t_all,j)$(m_year(t_all) > sm_fix_cc) = f35_pot_forest_area(t_all,j)$(m_year(t_all) = sm_fix_cc); +m_fillmissingyears(f35_pot_forest_area,"j"); diff --git a/modules/35_natveg/pot_forest_may24/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms index d92c17f222..cad9959091 100644 --- a/modules/35_natveg/pot_forest_may24/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -11,9 +11,9 @@ pc35_secdforest(j,ac) = v35_secdforest.l(j,ac); *other land age class calculation pc35_land_other(j,othertype35,ac) = vm_land_other.l(j,othertype35,ac); -* Reset forest establishment bound -pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, vm_land.l(j,land_forest)); -pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; +* Set the forest establishment bound for the next time step +pm_max_forest_est(t+1,j) = f35_pot_forest_area(t+1,j) - sum(land_forest, vm_land.l(j,land_forest)); +pm_max_forest_est(t+1,j)$(pm_max_forest_est(t+1,j) < 0) = 0; *#################### R SECTION START (OUTPUT DEFINITIONS) ##################### ov35_secdforest(t,j,ac,"marginal") = v35_secdforest.m(j,ac); diff --git a/modules/35_natveg/pot_forest_may24/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms index 3f4750017f..3b61137ec0 100644 --- a/modules/35_natveg/pot_forest_may24/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -47,8 +47,8 @@ p35_disturbance_loss_primf(t,j) = 0; * Forest establishment is constrained by the potential forest area in each cluster. * Hence, the area for forest establishments is given by the potential forest * area minus all forest areas in the previous time step. -pcm_max_forest_est(j) = f35_pot_forest_area(j) - sum(land_forest, pcm_land(j,land_forest)); -pcm_max_forest_est(j)$(pcm_max_forest_est(j) < 0) = 0; +pm_max_forest_est(t,j) = f35_pot_forest_area(t,j) - sum(land_forest, pcm_land(j,land_forest)); +pm_max_forest_est(t,j)$(pm_max_forest_est(t,j) < 0) = 0; * ----------------------------------------- * Land conservation for climate mitigation diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 8d2ac2ede8..068d8f1f44 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -45,7 +45,7 @@ vm_land.l(j,"primforest") = pcm_land(j,"primforest"); * ------------------------------------------------- *** Calculate the upper boundary for secondary forest recovery -pc35_max_forest_recovery(j) = pcm_max_forest_est(j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); +pc35_max_forest_recovery(j) = pm_max_forest_est(t,j) - sum(ac, pc35_land_other(j,"youngsecdf",ac)); *** Distribute forestry abandonement * Abandoned forestry is directly shifted into p35_forest_recovery_area(t,j,ac_est) because it is diff --git a/modules/35_natveg/pot_forest_may24/realization.gms b/modules/35_natveg/pot_forest_may24/realization.gms index 0003ac36b0..33081fc6d6 100644 --- a/modules/35_natveg/pot_forest_may24/realization.gms +++ b/modules/35_natveg/pot_forest_may24/realization.gms @@ -13,7 +13,7 @@ *' Forest establishment is constrained by the potential forest area, which is defined by *' areas with a potential carbon density of >20 tC/ha. The remaining forest establishment *' area in the current time step is provided to the [32_forestry] module via the -*' interface parameter `pcm_max_forest_est`. +*' interface parameter `pm_max_forest_est`. *' This realization also includes national policies implemented (NPI) and nationally *' determined contributions to the Paris agreement (NDC) with regard to forest and other *' land protection. The NPI/NDC polices ramp up until 2030 and are assumed constant From 79737dd2de133449cc493aef92e5cbfbfeb9320b Mon Sep 17 00:00:00 2001 From: florianh Date: Thu, 6 Jun 2024 16:15:49 +0200 Subject: [PATCH 246/259] update defaults from 2020 to 2025 --- CHANGELOG.md | 1 + config/default.cfg | 22 +++++++++---------- config/scenario_config.csv | 2 +- .../selfsuff_reduced_bilateral22/input.gms | 2 +- .../area_based_apr22/input.gms | 4 ++-- modules/30_crop/endo_apr21/input.gms | 6 ++--- modules/30_crop/penalty_apr22/input.gms | 6 ++--- modules/30_crop/rotation_apr22/input.gms | 6 ++--- .../38_factor_costs/sticky_labor/input.gms | 2 +- .../agr_sector_aug13/input.gms | 2 +- .../all_sectors_aug13/input.gms | 2 +- 11 files changed, 28 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e56c71ec2..6cf653c367 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **35_natveg** `vm_land(j2,"forestry")` included in NPI/NDC constraint `q35_min_forest` - **35_natveg** replaced the realisation `dynamic_feb21` with realisation `pot_forest_may24`. The new realisation provides additional information on the potential forest area, which is now used to constrain forest and forestry expansion and recovery. The remaining area for forest establishment is provided to the forestry module via the new interface parameter `pcm_max_forest_est`. - **52_carbon** Separate carbon densities for forest and other land. Before there was only a single carbon density for natural vegetation land. +- **default.cfg** defaults for `cfg$gms$sm_fix_SSP2`, `cfg$gms$sm_fix_cc` and other switches changed from 2020 to 2025 ### added - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` diff --git a/config/default.cfg b/config/default.cfg index 23cc26d900..75315aa837 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -192,10 +192,10 @@ cfg$gms$c09_pal_scenario <- "SSP2" # def = SSP2 # * SDP: "SDP", "SDP_EI", "SDP_MC", "SDP_RC" # Year until which all parameters are fixed to SSP2 values -cfg$gms$sm_fix_SSP2 <- 2020 +cfg$gms$sm_fix_SSP2 <- 2025 # Year until which all parameters affected by climate change are fixed to historical values -cfg$gms$sm_fix_cc <- 2020 +cfg$gms$sm_fix_cc <- 2025 # ***--------------------- 10_land ---------------------------------------- # * (landmatrix_dec18): includes a land transition matrix @@ -604,8 +604,8 @@ cfg$gms$s21_trade_tariff <- 1 # def =1 # * whether to fade out trade tariffs (bilateral trade realization) # def = 0 cfg$gms$s21_trade_tariff_fadeout <- 0 -# * start year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2020 -cfg$gms$s21_trade_tariff_startyear <- 2020 +# * start year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2025 +cfg$gms$s21_trade_tariff_startyear <- 2025 # * end year of fadeout if s21_trade_tariff_fadeout = 1 # def = 2050 cfg$gms$s21_trade_tariff_targetyear <- 2050 @@ -675,9 +675,9 @@ cfg$gms$s22_restore_land <- 1 # def = 1 # * sigmoidal trajectory. NOTE: This switch is only relevant # * if one of the 'future options' (e.g. BH) is chosen. # * Start year: -cfg$gms$s22_conservation_start <- 2020 # def = 2020 +cfg$gms$s22_conservation_start <- 2025 # def = 2025 # * Target year (year when full protection is reached): -cfg$gms$s22_conservation_target <- 2030 # def = 2030 +cfg$gms$s22_conservation_target <- 2050 # def = 2050 # ***--------------------- 29_ageclass ----------------------------------- # * (feb21): Distribution of age-classes according to Poulter et al 2018 @@ -706,7 +706,7 @@ cfg$gms$c30_rotation_constraints <- "on" # def = "on" cfg$gms$c30_rotation_scenario <- "default" # def = "default" # * Year by which rotation scenario is fully implemented: # * Start year: -cfg$gms$s30_rotation_scenario_start <- 2020 # def = 2020 +cfg$gms$s30_rotation_scenario_start <- 2025 # def = 2025 # * Target year (year when full implementation is reached): cfg$gms$s30_rotation_scenario_target <- 2050 # def = 2050 @@ -732,9 +732,9 @@ cfg$gms$s30_snv_shr <- 0 # def = 0 cfg$gms$s30_snv_shr_noselect <- 0 # def = 0 # * Year by which SNV policy ('s30_snv_shr') is fully implemented. # * Start year (should be close to 2019): -cfg$gms$s30_snv_scenario_start <- 2020 # def = 2020 +cfg$gms$s30_snv_scenario_start <- 2025 # def = 2025 # * Target year (year when full implementation is reached): -cfg$gms$s30_snv_scenario_target <- 2030 # def = 2030 +cfg$gms$s30_snv_scenario_target <- 2050 # def = 2050 # * Switch and specification of countries for which SNV policy in # * s30_snv_shr apply. # * Options: list of iso-codes of countries where SNV policy should be applied @@ -1042,7 +1042,7 @@ cfg$gms$c38_fac_req <- "glo" # default "glo" # * Year until which the capital share should be fixed to the historical values, not allowing for endogenous # * substitution between labor and capital. -cfg$gms$s38_startyear_labor_substitution <- 2020 # default 2020 +cfg$gms$s38_startyear_labor_substitution <- 2025 # default 2025 # * The following two settings are to create exogenous scenarios in which capital is substituted by labor to increase # * employment: @@ -1146,7 +1146,7 @@ cfg$gms$c42_env_flow_policy <- "off" # def = "off" # * Defines when linear fading in of policy starts and when the target of # * full protection based on 's42_env_flow_scenario' is reached # * Start year: -cfg$gms$s42_efp_startyear <- 2020 # def = 2020 +cfg$gms$s42_efp_startyear <- 2025 # def = 2025 # * Target year (year when full protection is reached): cfg$gms$s42_efp_targetyear <- 2040 # def = 2040 diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 54029f3184..60c00ffa42 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -18,7 +18,7 @@ gms$s15_food_substitution_target;;;;;;;;;;;2050;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$kfo_rd;;;;;;;;;;;livst_rum;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;livst_rum,livst_milk gms$s15_exo_foodscen_convergence;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;1;;;1;;;1;;;;;;;;;;;;;;;;;;;1; gms$s15_exo_foodscen_functional_form;;;;;;;;;;1;1;1;1;;;;;;;1;1;1;1;;;1;;;1;;;;;;;;;;;;;;;;;;;1; -gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2020;2020;2020;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020; +gms$s15_exo_foodscen_start;;;;;;;;;;2020;2020;2020;2020;;;;;;;2020;2025;2020;2020;;;2020;;;2020;;;;;;;;;;;;;;;;;;;2020; gms$s15_exo_foodscen_target;;;;;;;;;;2050;2050;2050;2070;;;;;;;2050;2050;2050;2050;;;2050;;;2050;;;;;;;;;;;;;;;;;;;2050; gms$s15_exo_waste;;;;0;0;0;0;0;0;1;1;1;1;;;;;;;1;0;1;1;;0;1;0;0;1;0;0;1;1;;;;;;;;;;;;;;;1; gms$s15_waste_scen;;;;;;;;;;1.2;1.3;1.2;1.25;;;;;;;1.2;1.2;1.2;1.2;;;1.2;;;1.2;;;;;;;;;;;;;;;;;;;1.2; diff --git a/modules/21_trade/selfsuff_reduced_bilateral22/input.gms b/modules/21_trade/selfsuff_reduced_bilateral22/input.gms index 52055626c4..e73d9007a3 100644 --- a/modules/21_trade/selfsuff_reduced_bilateral22/input.gms +++ b/modules/21_trade/selfsuff_reduced_bilateral22/input.gms @@ -16,7 +16,7 @@ sets scalars s21_trade_tariff Trade tariff switch (1=on 0=off) (1) / 1 / s21_trade_tariff_fadeout fadeout scenario setting for trade tariffs / 0 / - s21_trade_tariff_startyear year to start fading out trade tariffs / 2020 / + s21_trade_tariff_startyear year to start fading out trade tariffs / 2025 / s21_trade_tariff_targetyear year to finish fading out trade tariffs / 2050 / s21_cost_import Cost for additional imports to maintain feasibility (USD05MER per tDM) / 10000 / s21_min_trade_margin_forestry Minimum trade margin for forestry products (USD05MER per tDM) / 50 / diff --git a/modules/22_land_conservation/area_based_apr22/input.gms b/modules/22_land_conservation/area_based_apr22/input.gms index f72e91fe8a..d2a1d29841 100644 --- a/modules/22_land_conservation/area_based_apr22/input.gms +++ b/modules/22_land_conservation/area_based_apr22/input.gms @@ -12,8 +12,8 @@ $setglobal c22_protect_scenario_noselect none scalars s22_restore_land If land restoration is allowed (0=no 1=yes) / 1 / -s22_conservation_start Land conservation start year / 2020 / -s22_conservation_target Land conservation target year / 2030 / +s22_conservation_start Land conservation start year / 2025 / +s22_conservation_target Land conservation target year / 2050 / ; * Set-switch for countries affected by regional land conservation policy diff --git a/modules/30_crop/endo_apr21/input.gms b/modules/30_crop/endo_apr21/input.gms index cd040e783b..d96b3d1aef 100644 --- a/modules/30_crop/endo_apr21/input.gms +++ b/modules/30_crop/endo_apr21/input.gms @@ -23,11 +23,11 @@ $setglobal c30_rotation_constraints on scalars s30_snv_shr Share of available cropland that is witheld for other land cover types (1) / 0 / s30_snv_shr_noselect Share of available cropland that is witheld for other land cover types (1) / 0 / -s30_snv_scenario_start SNV scenario start year / 2020 / -s30_snv_scenario_target SNV scenario target year / 2030 / +s30_snv_scenario_start SNV scenario start year / 2025 / +s30_snv_scenario_target SNV scenario target year / 2050 / s30_snv_relocation_data_x1 First reference value in SNV target cropland data (1) / 0.2 / s30_snv_relocation_data_x2 Second reference value in SNV target cropland data (1) / 0.5 / -s30_rotation_scenario_start Rotation scenario start year / 2020 / +s30_rotation_scenario_start Rotation scenario start year / 2025 / s30_rotation_scenario_target Rotation scenario target year / 2050 / s30_annual_max_growth Max annual cropland growth as share of previous cropland (1) / Inf / ; diff --git a/modules/30_crop/penalty_apr22/input.gms b/modules/30_crop/penalty_apr22/input.gms index 540f7df5ea..021ede1339 100644 --- a/modules/30_crop/penalty_apr22/input.gms +++ b/modules/30_crop/penalty_apr22/input.gms @@ -29,9 +29,9 @@ $setglobal c30_rotation_scenario_speed by2050 scalars s30_snv_shr Share of available cropland that is witheld for other land cover types (1) / 0 / s30_snv_shr_noselect Share of available cropland that is witheld for other land cover types (1) / 0 / -s30_snv_scenario_start SNV scenario start year / 2020 / -s30_snv_scenario_target SNV scenario target year / 2030 / -s30_rotation_scenario_start Rotation scenario start year / 2020 / +s30_snv_scenario_start SNV scenario start year / 2025 / +s30_snv_scenario_target SNV scenario target year / 2050 / +s30_rotation_scenario_start Rotation scenario start year / 2025 / s30_rotation_scenario_target Rotation scenario target year / 2050 / s30_annual_max_growth Max annual cropland growth as share of previous cropland (1) / Inf / s30_snv_relocation_data_x1 First reference value in SNV target cropland data (1) / 0.2 / diff --git a/modules/30_crop/rotation_apr22/input.gms b/modules/30_crop/rotation_apr22/input.gms index f7b3c06424..0f60afd2e5 100644 --- a/modules/30_crop/rotation_apr22/input.gms +++ b/modules/30_crop/rotation_apr22/input.gms @@ -29,9 +29,9 @@ $setglobal c30_rotation_scenario_speed by2050 scalars s30_snv_shr Share of available cropland that is witheld for other land cover types (1) / 0 / s30_snv_shr_noselect Share of available cropland that is witheld for other land cover types (1) / 0 / -s30_snv_scenario_start SNV scenario start year / 2020 / -s30_snv_scenario_target SNV scenario target year / 2030 / -s30_rotation_scenario_start Rotation scenario start year / 2020 / +s30_snv_scenario_start SNV scenario start year / 2025 / +s30_snv_scenario_target SNV scenario target year / 2050 / +s30_rotation_scenario_start Rotation scenario start year / 2025 / s30_rotation_scenario_target Rotation scenario target year / 2050 / s30_annual_max_growth Max annual cropland growth as share of previous cropland (1) / Inf / s30_snv_relocation_data_x1 First reference value in SNV target cropland data (1) / 0.2 / diff --git a/modules/38_factor_costs/sticky_labor/input.gms b/modules/38_factor_costs/sticky_labor/input.gms index 1d9b6416e4..f19986da00 100644 --- a/modules/38_factor_costs/sticky_labor/input.gms +++ b/modules/38_factor_costs/sticky_labor/input.gms @@ -14,7 +14,7 @@ s38_depreciation_rate depreciation rate (share of costs) / 0.05 / * Share of immobile capital. s38_immobile immobile capital (share) / 1 / s38_ces_elast_subst Elasticity of substitution in CES function (1) / 0.3 / -s38_startyear_labor_substitution Year until which labor and capital requirements are fixed to historic values (year) / 2020 / +s38_startyear_labor_substitution Year until which labor and capital requirements are fixed to historic values (year) / 2025 / s38_target_labor_share Target labor share out of labor plus capital needed (1) / 0 / s38_targetyear_labor_share Year for which the target labor share should be set (year) / 2050 / s38_target_fulfillment Share by which a region moves from its baseline labor share towards the target value (1) / 0.5 / diff --git a/modules/42_water_demand/agr_sector_aug13/input.gms b/modules/42_water_demand/agr_sector_aug13/input.gms index fab1d14de8..30d9b37dfc 100644 --- a/modules/42_water_demand/agr_sector_aug13/input.gms +++ b/modules/42_water_demand/agr_sector_aug13/input.gms @@ -29,7 +29,7 @@ s42_env_flow_scenario EFP scenario. (1) / 2 / * s42_env_flow_fraction has no effect. * Linear fading in of environmental flow policy between startyear and targetyear -s42_efp_startyear Environmental flow policy start year / 2020 / +s42_efp_startyear Environmental flow policy start year / 2025 / s42_efp_targetyear Environmental flow policy target year / 2040 / s42_env_flow_base_fraction Fraction of available water that is reserved for the environment where no EFP policy is implemented (1) / 0.05 / diff --git a/modules/42_water_demand/all_sectors_aug13/input.gms b/modules/42_water_demand/all_sectors_aug13/input.gms index 07b0da00f0..a725f58cff 100644 --- a/modules/42_water_demand/all_sectors_aug13/input.gms +++ b/modules/42_water_demand/all_sectors_aug13/input.gms @@ -32,7 +32,7 @@ s42_env_flow_scenario Environmental flow protection scenario * s42_env_flow_fraction has no effect. * Linear fading in of environmental flow policy between startyear and targetyear -s42_efp_startyear Environmental flow policy start year / 2020 / +s42_efp_startyear Environmental flow policy start year / 2025 / s42_efp_targetyear Environmental flow policy target year / 2040 / s42_env_flow_base_fraction Fraction of available water that is reserved for the environment if no EFR protection policy is implemented (1) / 0.05 / s42_env_flow_fraction Fraction of available water that is reserved under protection policies (1) / 0.2 / From d10387baac70280afed49eb317a82472d4a150f6 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 7 Jun 2024 17:39:45 +0200 Subject: [PATCH 247/259] bugfix --- modules/09_drivers/aug17/declarations.gms | 3 --- modules/09_drivers/aug17/input.gms | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/09_drivers/aug17/declarations.gms b/modules/09_drivers/aug17/declarations.gms index ac0ea2b3e5..004c7bc854 100644 --- a/modules/09_drivers/aug17/declarations.gms +++ b/modules/09_drivers/aug17/declarations.gms @@ -33,7 +33,4 @@ parameters im_physical_inactivity(t_all,iso,sex,age) Share of population which is physically inactive (1) im_demography(t_all,iso,sex,age) Population by groups (mio. per yr) -* Years where SSPs and nocc/cc scenarios diverge - sm_fix_SSP2 year until which all parameters are fixed to SSP2 values (year) / 2020 / - sm_fix_cc year until which all parameters affected by cc are fixed to historical values (year) / 2020 / ; diff --git a/modules/09_drivers/aug17/input.gms b/modules/09_drivers/aug17/input.gms index 6266da6fe6..627d78607b 100644 --- a/modules/09_drivers/aug17/input.gms +++ b/modules/09_drivers/aug17/input.gms @@ -17,6 +17,11 @@ $setglobal c09_pal_scenario SSP2 * options: SSP: "SSP1", "SSP2", "SSP3", "SSP4", "SSP5", "SSP2EU" * SDP: "SDP", "SDP_EI", "SDP_MC", "SDP_RC" +parameters +* Years where SSPs and nocc/cc scenarios diverge + sm_fix_SSP2 year until which all parameters are fixed to SSP2 values (year) / 2025 / + sm_fix_cc year until which all parameters affected by cc are fixed to historical values (year) / 2025 / +; table f09_gdp_ppp_iso(t_all,iso,pop_gdp_scen09) Income in purchasing power parity (mio. USD05PPP per yr) $ondelim From 772f3217a5dd6c9fdc528ce0ba4a3418a2e67701 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 7 Jun 2024 21:50:35 +0200 Subject: [PATCH 248/259] bugfix --- modules/73_timber/default/preloop.gms | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/73_timber/default/preloop.gms b/modules/73_timber/default/preloop.gms index 8eed23dbf4..d5c9f58b72 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -13,7 +13,7 @@ p73_forestry_demand_prod_specific(t_past_forestry,iso,total_wood_products) = f73 ** Loop over time to calculate future demand ** Calculations based on Lauri et al. 2019 -loop(t_all$(m_year(t_all) >= sm_fix_SSP2 AND m_year(t_all) <= 2150), +loop(t_all$(m_year(t_all) > 2015 AND m_year(t_all) <= 2150), p73_forestry_demand_prod_specific(t_all,iso,total_wood_products)$(im_gdp_pc_ppp_iso(t_all,iso)>0 AND im_pop_iso(t_all,iso)>0) = p73_forestry_demand_prod_specific(t_all-1,iso,total_wood_products) * @@ -29,15 +29,15 @@ p73_timber_demand_gdp_pop(t_all,i,kforestry) = sum((i_to_iso(i,iso),kforestry_to ** Hard additive calibration for timber demand if(s73_timber_demand_switch=1, loop (t_all, - if(m_year(t_all) < sm_fix_SSP2, + if(m_year(t_all) <= 2015, p73_demand_calib(t_all,i,"wood") = f73_regional_timber_demand(t_all,i,"industrial_roundwood") - p73_timber_demand_gdp_pop(t_all,i,"wood"); p73_timber_demand_gdp_pop(t_all,i,"wood") = p73_timber_demand_gdp_pop(t_all,i,"wood") + p73_demand_calib(t_all,i,"wood"); ); ); - loop (t_all$(m_year(t_all)>=sm_fix_SSP2), - p73_timber_demand_gdp_pop(t_all,i,"wood")$(p73_timber_demand_gdp_pop(t_all,i,"wood") s73_increase_ceiling) = p73_timber_demand_gdp_pop(t_all-1,i,"wood") * s73_increase_ceiling; + loop (t_all$(m_year(t_all) > 2015), + p73_timber_demand_gdp_pop(t_all,i,"wood")$(p73_timber_demand_gdp_pop(t_all,i,"wood") < p73_timber_demand_gdp_pop(t_all-1,i,"wood")) = p73_timber_demand_gdp_pop(t_all-1,i,"wood") * s73_increase_ceiling; + p73_timber_demand_gdp_pop(t_all,i,"wood")$(p73_timber_demand_gdp_pop(t_all,i,"wood")/p73_timber_demand_gdp_pop(t_all-1,i,"wood") > s73_increase_ceiling) = p73_timber_demand_gdp_pop(t_all-1,i,"wood") * s73_increase_ceiling; ); ); @@ -59,7 +59,7 @@ pm_demand_forestry(t_all,i,kforestry) = round(p73_timber_demand_gdp_pop(t_all,i, p73_fraction(t_all) = s73_expansion/(m_year("y2100") - sm_fix_SSP2); ** Populate the fraction for each time step -loop(t_all$(m_year(t_all)>=sm_fix_SSP2), +loop(t_all$(m_year(t_all) > 2015), p73_fraction(t_all) = s73_expansion/(m_year("y2100") - sm_fix_SSP2) * m_yeardiff(t_all) + p73_fraction(t_all-1); ); From b369996d0bffa43e1901b0f199bb65a43d16f310 Mon Sep 17 00:00:00 2001 From: florianh Date: Fri, 7 Jun 2024 21:56:04 +0200 Subject: [PATCH 249/259] update input data --- config/default.cfg | 6 +++--- config/scenario_config.csv | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index 75315aa837..2dec6eef9a 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -22,9 +22,9 @@ cfg$model <- "main.gms" #def = "main.gms" #### input settings #### # which input data sets should be used? -cfg$input <- c(regional = "rev4.106_h12_magpie.tgz", - cellular = "rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", - validation = "rev4.106_h12_validation.tgz", +cfg$input <- c(regional = "rev4.108_h12_magpie.tgz", + cellular = "rev4.108_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz", + validation = "rev4.108_h12_validation.tgz", additional = "additional_data_rev4.50.tgz", calibration = "calibration_H12_26Mar24.tgz") diff --git a/config/scenario_config.csv b/config/scenario_config.csv index 60c00ffa42..a6c0a9ac2c 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -101,5 +101,5 @@ gms$c60_bioenergy_subsidy;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c60_res_2ndgenBE_dem;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;sdp;ssp2;sdp;sdp;;;;;;;sdp;;;;;ssp4;sdp;ssp4;ssp4;sdp;;;;;;;;;;;;;;;;;;;; gms$c70_feed_scen;;;;ssp1;ssp2;ssp2;ssp3;ssp4;ssp5;ssp1;ssp5;ssp1;ssp1;;;;;;;ssp1;;ssp1;;;ssp4;ssp1;ssp4;ssp4;ssp1;;;;;;;;;;;;;;;;;;;; gms$s73_timber_demand_switch;;;;;;;;;;;;;;;;;;;;;;;;;1;1;1;1;1;;;;;1;1;0;;;;;;;;;;;;; -input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.106_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.106_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.106_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.106_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.106_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.106_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; +input['cellular'];;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.108_h12_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.108_h12_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;rev4.108_h12_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.108_h12_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.108_h12_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.108_h12_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;; magicc_emis_scen;;;;;;;;;;;;;;;;;;;;;;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;REMIND_generic_C_SSP2EU-DSPkB650-DS_betax-rem-5.mif;;;;;;;;;;;;;;;;;;;;;;;;; From 67598ada8be72218828519e517cfdd241068ec3b Mon Sep 17 00:00:00 2001 From: florianh Date: Sat, 8 Jun 2024 09:46:27 +0200 Subject: [PATCH 250/259] bugfix 2025 --- .../all_sectors_aug13/presolve.gms | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/modules/42_water_demand/all_sectors_aug13/presolve.gms b/modules/42_water_demand/all_sectors_aug13/presolve.gms index 67275b377a..e3c7a4f9f7 100644 --- a/modules/42_water_demand/all_sectors_aug13/presolve.gms +++ b/modules/42_water_demand/all_sectors_aug13/presolve.gms @@ -37,12 +37,16 @@ if ((s42_pumping = 1), * Water withdrawals in manufacturing, electricity, domestic, ecosystem * depends on the socioeconomic scenario -if ((s42_watdem_nonagr_scenario = 1), - vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp1",watdem_ineldo); -Elseif(s42_watdem_nonagr_scenario = 2), - vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp2",watdem_ineldo); -Elseif(s42_watdem_nonagr_scenario = 3), - vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp3",watdem_ineldo); +if (m_year(t) <= sm_fix_SSP2, + vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp2",watdem_ineldo); +else + if ((s42_watdem_nonagr_scenario = 1), + vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp1",watdem_ineldo); + Elseif(s42_watdem_nonagr_scenario = 2), + vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp2",watdem_ineldo); + Elseif(s42_watdem_nonagr_scenario = 3), + vm_watdem.fx(watdem_ineldo,j) = f42_watdem_ineldo(t,j,"ssp3",watdem_ineldo); + ); ); From 61464e8404df2df9df313dd533c32d052c1b2c8b Mon Sep 17 00:00:00 2001 From: florianh Date: Sat, 8 Jun 2024 20:18:54 +0200 Subject: [PATCH 251/259] update FSEC --- config/scenario_fsec.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/scenario_fsec.csv b/config/scenario_fsec.csv index dfb83a5046..cdea1e2cef 100644 --- a/config/scenario_fsec.csv +++ b/config/scenario_fsec.csv @@ -74,9 +74,9 @@ gms$s62_max_dem_bioplastic;0;;;;400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_fac_req_regr;reg;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c70_feed_scen;;;;;;;;;;;;;;;;;;ssp1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; gms$c73_build_demand;;;;;;;;;;;;;;;;;;;;;;;;50pc;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['cellular'];rev4.106_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.106_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.106_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.106_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; -input['regional'];rev4.106_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -input['validation'];rev4.106_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['cellular'];rev4.108_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;rev4.108_FSEC_0bd54110_cellularmagpie_c200_MRI-ESM2-0-ssp119_lpjml-8e6c5eb1.tgz;rev4.108_FSEC_6819938d_cellularmagpie_c200_MRI-ESM2-0-ssp126_lpjml-8e6c5eb1.tgz;;rev4.108_FSEC_1b5c3817_cellularmagpie_c200_MRI-ESM2-0-ssp245_lpjml-8e6c5eb1.tgz;rev4.108_FSEC_3c888fa5_cellularmagpie_c200_MRI-ESM2-0-ssp460_lpjml-8e6c5eb1.tgz;rev4.108_FSEC_fd712c0b_cellularmagpie_c200_MRI-ESM2-0-ssp370_lpjml-8e6c5eb1.tgz;rev4.108_FSEC_09a63995_cellularmagpie_c200_MRI-ESM2-0-ssp585_lpjml-8e6c5eb1.tgz;;; +input['regional'];rev4.108_FSEC_magpie.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +input['validation'];rev4.108_FSEC_validation.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['additional'];additional_data_rev4.50.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; input['calibration'];calibration_FSEC_26Mar24.tgz;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; magicc_emis_scen;bjoernAR6_C_SSP2-NDC.mif;;;bjoernAR6_C_SSP2-PkBudg900.mif;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;bjoernAR6_C_SSP1-NDC.mif;;;;;;;;;;;;bjoernAR6_C_RemSDP-900-MagSSP1.mif;; From 00040a9e8aa319dc52d29151ef106276b781cff8 Mon Sep 17 00:00:00 2001 From: florianh Date: Sun, 9 Jun 2024 00:13:52 +0200 Subject: [PATCH 252/259] bugfix --- modules/35_natveg/pot_forest_may24/presolve.gms | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 0eb39f9aea..50131a05d3 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -191,6 +191,8 @@ vm_land_other.up(j,"youngsecdf",ac_sub) = pc35_land_other(j,"youngsecdf",ac_sub) vm_land_other.fx(j,"youngsecdf",ac_est) = 0; m_boundfix(vm_land_other,(j,othertype35,ac_sub),l,1e-6); +pm_max_forest_est(t,j)$(pm_max_forest_est(t,j) < sum(ac, pc35_land_other(j,"youngsecdf",ac))) = + sum(ac, pc35_land_other(j,"youngsecdf",ac)); * Other land conservation * protection bound fix From 119137e9db53ae9d08f4a8d6a98d1e743180130d Mon Sep 17 00:00:00 2001 From: florianh Date: Sun, 9 Jun 2024 07:33:55 +0200 Subject: [PATCH 253/259] bugfix --- modules/35_natveg/pot_forest_may24/equations.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index c5b48dbdf2..034a61129b 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -19,7 +19,7 @@ q35_natveg_conservation(j2) .. sum(land_natveg, vm_land(j2,land_natveg)) =g= - sum((ct,land_natveg,consv_type), pm_land_conservation(ct,j2,land_natveg,consv_type)); + sum((ct,land_natveg), pm_land_conservation(ct,j2,land_natveg,"protect")); q35_secdforest_restoration(j2) .. sum(land_ag, vm_lu_transitions(j2,land_ag,"secdforest")) From 4d6e186577f6c34278d613db35d1151701a051f1 Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Mon, 10 Jun 2024 13:58:55 +0200 Subject: [PATCH 254/259] magpie release 4.8.0 --- .zenodo.json | 11 ++++++--- CHANGELOG.md | 64 +++++++++++++++++++++++++++------------------------- CITATION.cff | 4 ++-- README.md | 6 ++--- 4 files changed, 46 insertions(+), 39 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index efa149f699..59c68fb06d 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,6 +1,6 @@ { "title": "MAgPIE - An Open Source land-use modeling framework", - "version": "4.7.3dev", + "version": "4.8.0", "creators": [ { "name": "Dietrich, Jan Philipp", @@ -99,6 +99,11 @@ "affiliation": "Potsdam Institute for Climate Impact Research", "orcid": "0000-0003-0328-4750" }, + { + "name": "Steinhauser, Jan", + "affiliation": "Potsdam Institute for Climate Impact Research", + "orcid": "0000-0002-5989-6855" + }, { "name": "Lotze-Campen, Hermann", "affiliation": "Potsdam Institute for Climate Impact Research", @@ -110,9 +115,9 @@ "orcid": "0000-0001-9500-1986" } ], - "keywords": ["landuse", "modeling", "nlp", "partial equilibrium"], + "keywords": ["landuse", "modeling", "model", "nlp", "partial equilibrium"], "license": { "id": "AGPL-3.0-or-later" }, - "publication_date": "2024-04-12" + "publication_date": "2024-06-10" } diff --git a/CHANGELOG.md b/CHANGELOG.md index c4cc96eb79..f65b05a489 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,66 +4,67 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## [Unreleased] +## [4.8.0] - 2024-06-10 ### changed -- **41_area_equipped_for_irrigation** updated (non-default) AEI data (from Mehta2022 to Mehta2024) -- **22_land_conservation and default.cfg** Added options for baseline protection +- **14_yields** revised timber yield calculations - **15_food, default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying food substitution scenarios and exogeneous food intake scenarios -- **70_livestock** default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios -- **default.cfg** update additional data to rev4.50 -- **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` -- **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. -- **scripts** start/test_runs.R added 2 more test runs from FSEC -- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. +- **22_land_conservation and default.cfg** Added options for baseline protection - **32_forestry** renamed interface `pm_demand_ext` to `pm_demand_forestry` -- **default.cfg** Forestry sector included by default by using the `ForestryEndo` settings from `scenario_config.csv`: `s32_initial_distribution = 1`, `s32_demand_establishment = 1`, `s32_hvarea = 2`, `s35_secdf_distribution = 2`, `s35_hvarea = 2`, `s73_timber_demand_switch = 1` -- **14_yields** revised timber yield calculations +- **32_forestry** revision and simplification of forestry implementation, renamed realization from `dynamic_feb21` to `dynamic_may24`. - **35_natveg** `vm_land(j2,"forestry")` included in NPI/NDC constraint `q35_min_forest` - **35_natveg** replaced the realisation `dynamic_feb21` with realisation `pot_forest_may24`. The new realisation provides additional information on the potential forest area, which is now used to constrain forest and forestry expansion and recovery. The remaining area for forest establishment is provided to the forestry module via the new interface parameter `pcm_max_forest_est`. +- **41_area_equipped_for_irrigation** updated (non-default) AEI data (from Mehta2022 to Mehta2024) - **52_carbon** Separate carbon densities for forest and other land. Before there was only a single carbon density for natural vegetation land. +- **70_livestock** default.cfg and scenario_config.csv** changed fader setup and introduced new switches for specifying feed substitution with SCP scenarios +- **80_optimization** Simplifed cycling through CONOPT4, CONOPT4 with OPTFILE, CONOPT4 without preprocessing and CONOPT3. +- **default.cfg** changed default realization for 44_biodiversity to new realization `bii_target_apr24` - **default.cfg** defaults for `cfg$gms$sm_fix_SSP2`, `cfg$gms$sm_fix_cc` and other switches changed from 2020 to 2025 +- **default.cfg** Forestry sector included by default by using the `ForestryEndo` settings from `scenario_config.csv`: `s32_initial_distribution = 1`, `s32_demand_establishment = 1`, `s32_hvarea = 2`, `s35_secdf_distribution = 2`, `s35_hvarea = 2`, `s73_timber_demand_switch = 1` +- **default.cfg** update additional data to rev4.50 - **scripts** modified agmip_merge_report to use piamInterfaces +- **scripts** start/test_runs.R added 2 more test runs from FSEC ### added -- **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` -- **default.cfg** added technical cost for missing BII increase `cfg$gms$s44_cost_bii_missing` -- **default.cfg** added settings for new price-driven bioenergy realization `1st2ndgen_priced_feb24`: `cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix`, `cfg$gms$c60_bioenergy_subsidy_fix_SSP2`, `s60_bioenergy_gj_price_1st`, -`s60_bioenergy_price_2nd`, `c60_price_implementation` -- **core** added `coup2110`timesteps - **15_food** added additional sigmoid food substition scenarios `sigmoid_75pc_25_50`, `sigmoid_50pc_25_50` and `sigmoid_25pc_25_50` +- **21_trade** Minimum trade margin for forestry products `s21_min_trade_margin_forestry` - **30_crop** added regional cropland equation `q30_crop_reg` and presolve growth constraint - **44_biodiversity** added new realization `bii_target_apr24`, taking into account `f44_rr_layer` - **60_bioenergy** added new realization `1st2ndgen_priced_feb24` to enable price-driven 2nd gen bioenergy production -- **scripts** added automatic set writer for new bioenergy realization to `start_functions` -- **scripts** added start scripts for the GENIE project -- **scenario_config.csv** added preset for GENIE project -- **default.cfg** cfg$gms$s80_secondsolve option for second solve statement with 0=off as default -- **21_trade** Minimum trade margin for forestry products `s21_min_trade_margin_forestry` - **73_timber** added interface `im_timber_prod_cost` -- **scripts** added "checkSummation" output script for consistency checking a report.mif - **citation** added abstract +- **core** added `coup2110`timesteps +- **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` +- **default.cfg** added settings for new price-driven bioenergy realization `1st2ndgen_priced_feb24`: `cfg$gms$s60_2ndgen_bioenergy_dem_min_post_fix`, `cfg$gms$c60_bioenergy_subsidy_fix_SSP2`, `s60_bioenergy_gj_price_1st`, +- **default.cfg** added technical cost for missing BII increase `cfg$gms$s44_cost_bii_missing` +- **default.cfg** cfg$gms$s80_secondsolve option for second solve statement with 0=off as default +- **scenario_config.csv** added preset for GENIE project +- **scripts** added "checkSummation" output script for consistency checking a report.mif +- **scripts** added automatic set writer for new bioenergy realization to `start_functions` +- **scripts** added start scripts for the GENIE project +`s60_bioenergy_price_2nd`, `c60_price_implementation` ### removed -- **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions -- **scripts** removed support for spam files in start_functions - **14_yields** removed interface `pm_timber_yield_initial` - **21_trade** removed interface `pm_selfsuff_ext`, removed `v21_manna_from_heaven` - **32_forestry** removed interface `pm_representative_rotation` -- **73_timber** removed interfaces `pm_demand_forestry_future` and `sm_wood_density` -- **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` - **35_natveg** removed growing stock calculation and calibration, which is no longer needed. +- **62_material/16_demand** Removed double structure for forestry products. `pm_demand_foresty` is now used in `62_material` +- **73_timber** removed interfaces `pm_demand_forestry_future` and `sm_wood_density` +- **scripts** removed support for spam files in start_functions +- **scripts/output/extra** removed scripts disaggregation_cropsplit and disaggregation_transitions ### fixed - **14_yields** fix division by zero in preloop of managementcalib_aug19 -- **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs - **44_biodiversity** avoid division by zero +- **58_peatland** Added balance variable to avoid random infeasibilites +- **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working +- **extra/disaggregation** fixed bug in disaggregation of land conservation related to switch from 59k to 67k that produced erroneous outputs - **scenario_config.csv** same revision for input files as in default.cfg - **scenario_fsec.csv** scenario settings -- **start/projects/fsec.R** scenario settings -- **80_optimization** fixed a bug in nlp_apr17; cycling through CONOPT4, CONOPT4 without preprocessing and CONOPT3 was not working -- **58_peatland** Added balance variable to avoid random infeasibilites - **scripts/start/test_runs.R** include all default output script, in particular disaggregation.R, which is needed for BII +- **start/projects/fsec.R** scenario settings + ## [4.7.3] - 2024-04-12 @@ -932,7 +933,8 @@ This release version is focussed on consistency between the MAgPIE setup and the First open source release of the framework. See [MAgPIE 4.0 paper](https://doi.org/10.5194/gmd-12-1299-2019) for more information. -[Unreleased]: https://github.com/magpiemodel/magpie/compare/v4.7.3...develop +[Unreleased]: https://github.com/magpiemodel/magpie/compare/v4.8.0...develop +[4.8.0]: https://github.com/magpiemodel/magpie/compare/v4.7.3...v4.8.0 [4.7.3]: https://github.com/magpiemodel/magpie/compare/v4.7.2...v4.7.3 [4.7.2]: https://github.com/magpiemodel/magpie/compare/v4.7.1...v4.7.2 [4.7.1]: https://github.com/magpiemodel/magpie/compare/v4.7.0...v4.7.1 diff --git a/CITATION.cff b/CITATION.cff index dfdfa23a75..79a17ee781 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -151,8 +151,8 @@ abstract: The *Model of Agricultural Production and its Impact on the Environmen exogenously given population in 10 food energy categories, based on regional diets. Future trends in food demand are derived from a cross-country regression analysis, based on future scenarios on GDP and population growth. -version: 4.7.3dev -date-released: 2024-04-12 +version: 4.8.0 +date-released: 2024-06-10 repository-code: https://github.com/magpiemodel/magpie keywords: - landuse diff --git a/README.md b/README.md index 221d210608..175f8dd5b2 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ https://www.pik-potsdam.de/research/projects/activities/land-use-modelling/magpi A framework description paper has been published in Geoscientific Model Development (GMD): https://doi.org/10.5194/gmd-12-1299-2019 -The model documentation for version 4.7.3 can be found at -https://rse.pik-potsdam.de/doc/magpie/4.7.3/ +The model documentation for version 4.8.0 can be found at +https://rse.pik-potsdam.de/doc/magpie/4.8.0/ A most recent version of the documentation can also be extracted from the model source code via the R package goxygen @@ -226,7 +226,7 @@ magpie@pik-potsdam.de Please contact magpie@pik-potsdam.de ## CITATION -See file CITATION.cff or the [How-to-Cite section](https://rse.pik-potsdam.de/doc/magpie/4.7.3/#how-to-cite) in the model documentation for information how to cite the model. +See file CITATION.cff or the [How-to-Cite section](https://rse.pik-potsdam.de/doc/magpie/4.8.0/#how-to-cite) in the model documentation for information how to cite the model. ## AUTHORS See list of authors in CITATION.cff From 14a3a4e665eb819e8b4c291f92c915d9895fc1ea Mon Sep 17 00:00:00 2001 From: Pascal Sauer Date: Mon, 10 Jun 2024 14:22:46 +0200 Subject: [PATCH 255/259] degree symbol caused goxygen pdf problems --- CITATION.cff | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CITATION.cff b/CITATION.cff index 79a17ee781..a089928475 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -141,7 +141,7 @@ title: MAgPIE - An Open Source land-use modeling framework abstract: The *Model of Agricultural Production and its Impact on the Environment* (MAgPIE) is a modular open source framework for modeling global land-systems, which is coupled to the grid-based dynamic vegetation model LPJmL, with a spatial resolution - of 0.5°x0.5°. It takes regional economic conditions such as demand for agricultural + of 0.5degx0.5deg. It takes regional economic conditions such as demand for agricultural commodities, technological development and production costs as well as spatially explicit data on potential crop yields, land and water constraints (from LPJmL) into account. Based on these, the model derives specific land use patterns, yields and From f6792ba96b66fe8029f915ab4e299e7b92647504 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 10 Jun 2024 17:13:26 +0200 Subject: [PATCH 256/259] bugfix disaggregation --- scripts/output/extra/disaggregation.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index ef98b04fca..cceede6c25 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -444,7 +444,7 @@ message("Disaggregating BII values") land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] side_layers_hr <- read.magpie(luh_side_layers) landArea <- dimSums(land_ini_hr, dim = 3) -side_layers_lr <- toolAggregate(x = side_layers_hr, rel = map_file, weight = landArea, from = "cell", to = "cluster") +side_layers_lr <- toolAggregate(x = side_layers_hr, rel = map_file, weight = landArea, from = "cell", to = "cluster", zeroWeight = "allow") # Convert land types for BII disaggregation land_ini_hr <- mbind( From 3355cf027a6e89c486e348fd670f4517fd5a8395 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 10 Jun 2024 18:31:20 +0200 Subject: [PATCH 257/259] bugfix warning --- scripts/output/extra/disaggregation.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index cceede6c25..7590163b43 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -161,7 +161,7 @@ if (length(map_file) > 1) { # for grassland and natural vegetation natveg <- c("primforest", "secdforest", "other") consv_sum_lr <- mbind( - dimSums(land_consv_lr[, , "past"], 3.2), + dimSums(land_consv_lr[, , "past"], 3), setNames(dimSums(land_consv_lr[, , natveg], dim = 3), "natveg") ) consv_sum_hr_agg <- mbind( From b2813f7bb8a1f5f48f54d6f5a9390dd4cd1d5401 Mon Sep 17 00:00:00 2001 From: florianh Date: Mon, 10 Jun 2024 18:35:48 +0200 Subject: [PATCH 258/259] bugfix warning --- scripts/output/extra/disaggregation.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 7590163b43..0c532f6bec 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -161,7 +161,7 @@ if (length(map_file) > 1) { # for grassland and natural vegetation natveg <- c("primforest", "secdforest", "other") consv_sum_lr <- mbind( - dimSums(land_consv_lr[, , "past"], 3), + land_consv_lr[, , "past"], setNames(dimSums(land_consv_lr[, , natveg], dim = 3), "natveg") ) consv_sum_hr_agg <- mbind( From 4cf96d1f8c5bd2c958c64b2b2f7abafa8e6ebe99 Mon Sep 17 00:00:00 2001 From: florianh Date: Tue, 11 Jun 2024 10:15:03 +0200 Subject: [PATCH 259/259] revert zero weight note --- scripts/output/extra/disaggregation.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/output/extra/disaggregation.R b/scripts/output/extra/disaggregation.R index 0c532f6bec..1b8546dd24 100644 --- a/scripts/output/extra/disaggregation.R +++ b/scripts/output/extra/disaggregation.R @@ -444,7 +444,7 @@ message("Disaggregating BII values") land_ini_hr <- read.magpie(land_hr_file)[, "y1995", ] side_layers_hr <- read.magpie(luh_side_layers) landArea <- dimSums(land_ini_hr, dim = 3) -side_layers_lr <- toolAggregate(x = side_layers_hr, rel = map_file, weight = landArea, from = "cell", to = "cluster", zeroWeight = "allow") +side_layers_lr <- toolAggregate(x = side_layers_hr, rel = map_file, weight = landArea, from = "cell", to = "cluster") # Convert land types for BII disaggregation land_ini_hr <- mbind(