diff --git a/CHANGELOG.md b/CHANGELOG.md index ad0ae465a1..1c98f29648 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **60_bioenergy** renamed `s60_bioenergy_gj_price_1st` to `s60_bioenergy_1st_price` and `s60_bioenergy_price_2nd` to `s60_bioenergy_2nd_price` - **default.cfg** default for `s60_bioenergy_1st_subsidy` (formerly `c60_bioenergy_subsidy`) changed from 246 USD17MER per ton to 6.5 USD17MER per GJ based on mean GJ per ton of 1st generation bioenergy products. - **default.cfg** default for `cfg$gms$bioenergy` change from `1stgen_priced_dec18` to `1st2ndgen_priced_feb24` +- **73_timber** revised timber demand calculations +- **32_forestry** revised plantation establishment assumptions +- **35_natveg** revised wood harvest assumptions ### added - **scripts** output script for testing elastic demand @@ -28,6 +31,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **scenario_config.csv** added scenario `VLLO` based on `SDP-MC` - **default.cfg** added selection of low and middle-income countries `isoCountriesLowMiddleIncome` - **scripts** start script for ScenarioMIP MAgPIE standalone runs +- **22_land_conservation** added option for base protection reversal - **scripts** The constraint to maintain 20% semi-natural vegetation at the 1x1km scale is passed on to SEALS, if the setting is changed from the `default.cfg` ### removed diff --git a/DESCRIPTION b/DESCRIPTION index 7e2b5847ff..b52823fd61 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -21,14 +21,14 @@ Imports: m4fsdp, madrat, magclass (>= 6.14.0), - magpie4 (>= 2.16.7), + magpie4 (>= 2.17.0), MagpieNCGains, magpiesets (>= 0.46.1), mip, mrcommons, patchwork, piamenv (>= 0.5.5), - piamInterfaces (>= 0.40.3), + piamInterfaces (>= 0.45.1), piamutils, quitte, raster, diff --git a/config/default.cfg b/config/default.cfg index 260f594745..fad54c1d5f 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -645,7 +645,6 @@ cfg$gms$s21_trade_tariff_targetyear <- 2050 # * (inflated from default originally in USD05 using USD05 --> USD17 inflation rate:1.23) cfg$gms$s21_min_trade_margin_forestry <- 62 # def = 50 * 1.23 - # ***--------------------- 22_land_conservation -------------------------------------- # * (area_based_apr22): Area-based conservation (baseline and future) # * based on WDPA and conservation priority areas @@ -661,6 +660,9 @@ cfg$gms$land_conservation <- "area_based_apr22" # def = area_based_ap cfg$gms$c22_base_protect <- "WDPA" # def = WDPA cfg$gms$c22_base_protect_noselect <- "WDPA" # def = WDPA +# Year in which Baseline protection reversal should take place (e.g. 2030) +cfg$gms$s22_base_protect_reversal <- Inf # def = Inf (no reversal) + # * 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 (Baseline only) diff --git a/config/scenario_config.csv b/config/scenario_config.csv index fe6de340ad..2029c4df95 100755 --- a/config/scenario_config.csv +++ b/config/scenario_config.csv @@ -33,6 +33,7 @@ gms$s15_exo_alcohol;;;;;;;;;1;0;1;1;1;;;;;;;;;;;;;1;1;;;;;;;;; gms$s15_alc_scen;;;;;;;;;;;;;;;;;;;;;;;;;;0.014;0;;;;;;;;; gms$c21_trade_liberalization;;;;l908080r807070;l909090r808080;l909595r809090;l908080r807070;l908080r807070;l908080r807070;l908080r807070;l909595r809090;l908080r807070;l908080r807070;;;;;;;;;;;;;;;;;;;;;;; gms$c22_protect_scenario;;;;none;none;none;none;none;BH;none;BH_IFL;BH;BH;;;;;;;;;;;;;;;;;;;;;;; +gms$s22_base_protect_reversal;;;;;;;;;;;;;;;;;;;Inf;Inf;2030;Inf;;;;;;;;;;;;;; gms$s29_snv_shr;;;;0;0;0;0;0;0;0;0;0.2;0.2;;;;;;;;;;;;;;;;;;;;;;; gms$s29_snv_scenario_target;;;;;;;;;;;;2050;2070;;;;;;;;;;;;;;;;;;;;;;; gms$s29_treecover_plantation;;;;;;;;;;;;;;;;;0;1;;;;;;;;;;;;;;;;;; diff --git a/modules/22_land_conservation/area_based_apr22/input.gms b/modules/22_land_conservation/area_based_apr22/input.gms index 646370ba6c..adf2b438e1 100644 --- a/modules/22_land_conservation/area_based_apr22/input.gms +++ b/modules/22_land_conservation/area_based_apr22/input.gms @@ -14,6 +14,7 @@ scalars s22_restore_land If land restoration is allowed (0=no 1=yes) / 1 / s22_conservation_start Land conservation start year / 2025 / s22_conservation_target Land conservation target year / 2050 / +s22_base_protect_reversal Year in which base protection reversal should take place (1) / Inf / ; * Set-switch for countries affected by regional land conservation policy diff --git a/modules/22_land_conservation/area_based_apr22/presolve.gms b/modules/22_land_conservation/area_based_apr22/presolve.gms index 2f0cbbb343..2a8bbc5d12 100644 --- a/modules/22_land_conservation/area_based_apr22/presolve.gms +++ b/modules/22_land_conservation/area_based_apr22/presolve.gms @@ -116,4 +116,8 @@ pm_land_conservation(t,j,land,"restore") = 0; ); +if (m_year(t) >= s22_base_protect_reversal, + pm_land_conservation(t,j,land,consv_type) = 0; +); + diff --git a/modules/32_forestry/dynamic_may24/declarations.gms b/modules/32_forestry/dynamic_may24/declarations.gms index c0a2b79aed..b2aaf512c3 100644 --- a/modules/32_forestry/dynamic_may24/declarations.gms +++ b/modules/32_forestry/dynamic_may24/declarations.gms @@ -56,6 +56,7 @@ parameters p32_demand_forestry_future(t,i,kforestry) Future forestry demand in current time step (tDM per yr) p32_est_cost(type32) Establishment cost (USD17MER per ha) i32_recurring_cost(type32) Recurring costs (USD17MER per ha) + p32_plantedforest(i) Planted forest (mio. ha) ; positive variables diff --git a/modules/32_forestry/dynamic_may24/input.gms b/modules/32_forestry/dynamic_may24/input.gms index b40d4a4d4f..5a396979cf 100644 --- a/modules/32_forestry/dynamic_may24/input.gms +++ b/modules/32_forestry/dynamic_may24/input.gms @@ -42,13 +42,14 @@ 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_startyear Start year for plantation contribution growth fader (year) / 1995 / + s32_plant_contr_growth_endyear End year for plantation contribution growth fader (year) / 2025 / + s32_plant_contr_growth_startvalue Start value for plantation contribution growth fader (percent per year) / 0.07 / 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_plant_contr_max Maximum plantation contribution for establishment decision (percent) / 1 / s32_demand_establishment Boolean switch for establishment demand assumption 1=forward looking 0=static (1) / 1 / s32_npi_ndc_reversal Year in which NPI NDC reversal should take place (1) / Inf / + s32_min_plant_shr Minimum share of plantations in planted forests (1) / 0.05 / ; 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 690484d54d..ce3f280a06 100644 --- a/modules/32_forestry/dynamic_may24/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -148,18 +148,21 @@ p32_cdr_ac(t,j,ac) = 0; 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 +** Set minimum share of plantations in planted forest +p32_plantedforest(i) = f32_plantedforest(i); +p32_plantedforest(i)$(p32_plantedforest(i) < s32_min_plant_shr) = s32_min_plant_shr; + ** 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)); + p32_land_start_ac(j,"plant","acx") = pcm_land(j,"forestry") * sum(cell(i,j),p32_plantedforest(i)); + p32_land_start_ac(j,"ndc","acx") = pcm_land(j,"forestry") * sum(cell(i,j),1-p32_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_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); + p32_land_start_ac(j,"plant",ac)$(ini32(j,ac)) = pm_land_start(j,"forestry") * sum(cell(i,j),p32_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- p32_plantedforest(i))/p32_rotation_cellular_harvesting("y1995",j); ); diff --git a/modules/35_natveg/pot_forest_may24/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms index d8557b65c4..07d7e62471 100644 --- a/modules/35_natveg/pot_forest_may24/equations.gms +++ b/modules/35_natveg/pot_forest_may24/equations.gms @@ -152,12 +152,11 @@ q35_prod_primforest(j2).. 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 +*' Woody biomass 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") + sum(kforestry, vm_prod_natveg(j2,"other",kforestry)) =e= (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")))) diff --git a/modules/35_natveg/pot_forest_may24/input.gms b/modules/35_natveg/pot_forest_may24/input.gms index 695e0be671..daae7d951b 100644 --- a/modules/35_natveg/pot_forest_may24/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -20,7 +20,7 @@ s35_hvarea_secdforest annual secdforest harvest rate for s35_hvarea equals 1 (pe 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 (USD17MER per ha) / 2460/ -s35_timber_harvest_cost_other Cost for harvesting from other land (USD17MER per ha) / 1845 / +s35_timber_harvest_cost_other Cost for harvesting from other land (USD17MER per ha) / 3075 / s35_timber_harvest_cost_primforest Cost for harvesting from primary forest (USD17MER per ha) / 3690/ 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) / 2 / diff --git a/modules/35_natveg/pot_forest_may24/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms index 450d4ecbe9..95dc31a683 100644 --- a/modules/35_natveg/pot_forest_may24/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -239,8 +239,6 @@ v35_hvarea_other.fx(j,othertype35,ac_est) = 0; v35_secdforest_reduction.fx(j,ac_est) = 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; diff --git a/modules/73_timber/default/declarations.gms b/modules/73_timber/default/declarations.gms index 3f7a9cdb44..51d8ed1ddf 100644 --- a/modules/73_timber/default/declarations.gms +++ b/modules/73_timber/default/declarations.gms @@ -9,13 +9,13 @@ 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(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) 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 (USD17MER per tDM) +p73_income_elasticity(t_all,iso,total_wood_products) Income elasticities of wood products (1) ; positive variables diff --git a/modules/73_timber/default/input.gms b/modules/73_timber/default/input.gms index 067a518d33..3e6de95c30 100644 --- a/modules/73_timber/default/input.gms +++ b/modules/73_timber/default/input.gms @@ -20,7 +20,7 @@ scalars s73_timber_prod_cost_woodfuel Cost for prodcing one unit of woodfuel (USD17MER per tDM) / 74 / s73_free_prod_cost Very high cost for settling demand without production (USD17MER per tDM) / 1e+06 / 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_income_threshold Threshold for income-elastic industrial roundwood demand (USD17PPP per cap per yr) / 10000 / 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 (USD17MER per tDM) / 2.5 / 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/preloop.gms b/modules/73_timber/default/preloop.gms index 5c659fb543..511d13a29e 100644 --- a/modules/73_timber/default/preloop.gms +++ b/modules/73_timber/default/preloop.gms @@ -11,36 +11,25 @@ s73_free_prod_cost$(s73_timber_demand_switch = 0) = s73_timber_prod_cost_wood; ** Set historical values to FAO values p73_forestry_demand_prod_specific(t_past_forestry,iso,total_wood_products) = f73_prod_specific_timber(t_past_forestry,iso,total_wood_products); +p73_income_elasticity(t_all,iso,total_wood_products) = f73_income_elasticity(total_wood_products); +p73_income_elasticity(t_all,iso,total_wood_products)$(im_gdp_pc_ppp_iso(t_all,iso) > s73_income_threshold) = 0; +p73_income_elasticity(t_all,iso,"wood_fuel") = f73_income_elasticity("wood_fuel"); + ** Loop over time to calculate future demand ** Calculations based on Lauri et al. 2019 -loop(t_all$(m_year(t_all) > 2015 AND m_year(t_all) <= 2150), +loop(t_all$(m_year(t_all) > 1995 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) * (im_pop_iso(t_all,iso)/im_pop_iso(t_all-1,iso)) * - ((im_gdp_pc_ppp_iso(t_all,iso)/im_gdp_pc_ppp_iso(t_all-1,iso))**f73_income_elasticity(total_wood_products)) + ((im_gdp_pc_ppp_iso(t_all,iso)/im_gdp_pc_ppp_iso(t_all-1,iso))**p73_income_elasticity(t_all,iso,total_wood_products)) ; ); ** Aggregate from ISO country level to MAgPIE region level p73_timber_demand_gdp_pop(t_all,i,kforestry) = sum((i_to_iso(i,iso),kforestry_to_woodprod(kforestry,total_wood_products)),p73_forestry_demand_prod_specific(t_all,iso,total_wood_products)) * s73_timber_demand_switch ; -** Hard additive calibration for timber demand -if(s73_timber_demand_switch=1, - loop (t_all, - 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) > 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; - ); -); - ** Alternative wood use scenarios $ifthen "%c73_wood_scen%" == "construction" p73_timber_demand_gdp_pop(t_all,i,"wood") = p73_timber_demand_gdp_pop(t_all,i,"wood") * f73_demand_modifier(t_all,"%c73_wood_scen%"); @@ -59,7 +48,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) > 2015), +loop(t_all$(m_year(t_all) > 1995), p73_fraction(t_all) = s73_expansion/(m_year("y2100") - sm_fix_SSP2) * m_yeardiff(t_all) + p73_fraction(t_all-1); ); diff --git a/modules/73_timber/default/sets.gms b/modules/73_timber/default/sets.gms index e9ebb54e23..0606140918 100644 --- a/modules/73_timber/default/sets.gms +++ b/modules/73_timber/default/sets.gms @@ -36,7 +36,7 @@ fibreboard,particle_board_and_osb,plywood,veneer_sheets kforestry_to_woodprod(kforestry,total_wood_products) Mapping between intermediate and end use wood products / -wood . (fibreboard,particle_board_and_osb,plywood,veneer_sheets,wood_pulp,sawnwood,other_sawnwood,other_industrial_roundwood) +wood . (industrial_roundwood) woodfuel . (wood_fuel) / diff --git a/scripts/start/projects/project_ScenarioMIP.R b/scripts/start/projects/project_ScenarioMIP.R index 722d422bb9..b444476ec0 100644 --- a/scripts/start/projects/project_ScenarioMIP.R +++ b/scripts/start/projects/project_ScenarioMIP.R @@ -21,7 +21,7 @@ source("scripts/start_functions.R") source("config/default.cfg") # create additional information to describe the runs -cfg$info$flag <- "SMIP37" +cfg$info$flag <- "SMIP46" cfg$results_folder <- "output/:title:" cfg$force_replace <- TRUE