Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revision timber demand and production + option for WDPA reversal #777

Merged
merged 27 commits into from
Feb 22, 2025
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

### removed
- **modules/15_food/anthropometrics_jan18** removed as outdated
Expand Down
5 changes: 3 additions & 2 deletions config/default.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -642,8 +642,7 @@ cfg$gms$s21_trade_tariff_startyear <- 2025
cfg$gms$s21_trade_tariff_targetyear <- 2050

# * Minimum trade margin for forestry products (USD17MER per tDM)
# * (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
cfg$gms$s21_min_trade_margin_forestry <- 120 # def = 120


# ***--------------------- 22_land_conservation --------------------------------------
Expand All @@ -661,6 +660,8 @@ 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

cfg$gms$s22_base_protect_reversal <- Inf # def = Inf

# * 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)
Expand Down
1 change: 1 addition & 0 deletions config/scenario_config.csv
Original file line number Diff line number Diff line change
Expand Up @@ -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;;;;;;;;;;;;;;;;;;
Expand Down
1 change: 1 addition & 0 deletions modules/22_land_conservation/area_based_apr22/input.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 4 additions & 0 deletions modules/22_land_conservation/area_based_apr22/presolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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;
);


1 change: 1 addition & 0 deletions modules/32_forestry/dynamic_may24/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 4 additions & 3 deletions modules/32_forestry/dynamic_may24/input.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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_startyear Start year for plantation contribution growth fader (year) / 1995 /
s32_plant_contr_growth_endyear End year for plantation contribution growth fader (year) / 2030 /
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_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.2 /
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is that minimum share introduced?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have regional data set based on FAOSTAT that provides the share of plantations in planted forests. Most regions have a share of 0.7 or more. However, some regions have very small shares (JPN:0,REF:0.06,EUR:017). Considering the high shares in all other regions, this seems implausbile. The difference might be caused by different definitions of plantation forest. The mininum share for plantations aims to avoid that wood harvest relies too strongly on natural vegetation.

;

parameter f32_aff_mask(j) afforestation mask (binary)
Expand Down
6 changes: 4 additions & 2 deletions modules/32_forestry/dynamic_may24/preloop.gms
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,10 @@ 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_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_plantedforest(i) = f32_plantedforest(i);
p32_plantedforest(i)$(p32_plantedforest(i) < s32_min_plant_shr) = s32_min_plant_shr;
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);

);

Expand Down
2 changes: 1 addition & 1 deletion modules/32_forestry/dynamic_may24/presolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_co
** 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));
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) = sum(t_ext$(t_ext.pos = t.pos + p32_rotation_regional(t,i)),pm_demand_forestry(t_ext,i,kforestry));
);
Expand Down
2 changes: 1 addition & 1 deletion modules/35_natveg/pot_forest_may24/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ q35_prod_primforest(j2)..
*' Wood production from other landis not allowed.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
*' Wood production from other landis not allowed.
*' Wood production from other land is not allowed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR allows wood production from other land.
I revised the in-code documentation accordingly.


q35_prod_other(j2)..
vm_prod_natveg(j2,"other","woodfuel")
sum(kforestry, vm_prod_natveg(j2,"other",kforestry))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

warum der wechsel?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the current develop, we see implausible imports and exports of industrial roundwood. This is caused by declining growing stock of secondary forest in some regions, causing shortage of wood supply. Allowing not only wood fuel but also industrial roundwood production (kforestry) from other land reduces these issues. The definition of forest vs non-forest natural land is seamless is many cases, and differs from country to country.
Therefore, some wood harvest from other land seems plausible.

=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"))))
Expand Down
2 changes: 0 additions & 2 deletions modules/35_natveg/pot_forest_may24/presolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what happened here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed on purpose. See above.


if(s35_hvarea = 0,
v35_hvarea_secdforest.fx(j,ac_sub) = 0;
v35_hvarea_primforest.fx(j) = 0;
Expand Down
1 change: 1 addition & 0 deletions modules/73_timber/default/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ p73_fraction(t_all) Frac
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
Expand Down
2 changes: 1 addition & 1 deletion modules/73_timber/default/input.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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 /
Expand Down
25 changes: 7 additions & 18 deletions modules/73_timber/default/preloop.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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%");
Expand All @@ -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);
);

Expand Down
2 changes: 1 addition & 1 deletion modules/73_timber/default/sets.gms
Original file line number Diff line number Diff line change
Expand Up @@ -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)
/

Expand Down