diff --git a/CHANGELOG.md b/CHANGELOG.md index d04d4b4190..157d858538 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,13 @@ 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`. - **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` +- **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 - **default.cfg** added cropland growth constraint `cfg$gms$s30_annual_max_growth` diff --git a/config/default.cfg b/config/default.cfg index b44c05755f..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 @@ -930,8 +930,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/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/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/core/sets.gms b/core/sets.gms index 7850c15c4c..d68a6b0774 100644 --- a/core/sets.gms +++ b/core/sets.gms @@ -242,20 +242,23 @@ sets wat_dem Water demand sectors / agriculture, domestic, manufacturing, electricity, ecosystem / ***LAND POOLS*** - land Land pools + land Land pools / crop, past, forestry, primforest, secdforest, urban, other / land_ag(land) Agricultural land pools - / crop, past / + / crop, past / - forest_land(land) land from which timber can be taken away - / forestry, primforest, secdforest,other / + 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_timber) Forested land pools + / forestry, primforest, secdforest / + + 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/main.gms b/main.gms index bc8150e6bb..5a585545d1 100644 --- a/main.gms +++ b/main.gms @@ -148,19 +148,19 @@ $title magpie *##################### R SECTION START (VERSION INFO) ########################## * -* Used data set: rev4.104_h12_magpie.tgz +* Used data set: rev4.106_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 +* Used data set: rev4.106_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 +* Used data set: rev4.106_h12_validation.tgz * md5sum: NA * Repository: scp://cluster.pik-potsdam.de/p/projects/rd3mod/inputdata/output * -* Used data set: additional_data_rev4.48.tgz +* Used data set: additional_data_rev4.50.tgz * md5sum: NA * Repository: scp://cluster.pik-potsdam.de/p/projects/landuse/data/input/archive * @@ -179,11 +179,11 @@ $title magpie * * 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 @@ -195,7 +195,7 @@ $title magpie * * 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) ########################### @@ -255,7 +255,7 @@ $setglobal past endo_jun13 $setglobal forestry dynamic_may24 $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/14_yields/managementcalib_aug19/declarations.gms b/modules/14_yields/managementcalib_aug19/declarations.gms index 04d259f841..22aa3f5eda 100644 --- a/modules/14_yields/managementcalib_aug19/declarations.gms +++ b/modules/14_yields/managementcalib_aug19/declarations.gms @@ -14,7 +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) - pm_timber_yield(t,j,ac,forest_land) Forest growing stock (tDM per ha per yr) + pm_timber_yield(t,j,ac,land_timber) 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 8b3451220c..da314b8bd6 100644 --- a/modules/14_yields/managementcalib_aug19/input.gms +++ b/modules/14_yields/managementcalib_aug19/input.gms @@ -76,7 +76,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/14_yields/managementcalib_aug19/preloop.gms b/modules/14_yields/managementcalib_aug19/preloop.gms index eaed90f248..44304e1687 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; ); diff --git a/modules/14_yields/managementcalib_aug19/presolve.gms b/modules/14_yields/managementcalib_aug19/presolve.gms index e1b795fa46..ca1189f665 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_plantation_ac` 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 @@ -23,18 +23,36 @@ pm_timber_yield(t,j,ac,"forestry") = ( - pm_carbon_density_ac_forestry(t,j,ac,"vegc") + pm_carbon_density_plantation_ac(t,j,ac,"vegc") / s14_carbon_fraction * f14_aboveground_fraction("forestry") / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"plantations")) ) ; -pm_timber_yield(t,j,ac,land_natveg) = +pm_timber_yield(t,j,ac,"primforest") = ( - pm_carbon_density_ac(t,j,ac,"vegc") + fm_carbon_density(t,j,"primforest","vegc") / s14_carbon_fraction - * f14_aboveground_fraction(land_natveg) + * 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("secdforest") + / sum(clcl, pm_climate_class(j,clcl) * f14_ipcc_bce(clcl,"natveg")) + ) + ; + +pm_timber_yield(t,j,ac,"other") = + ( + 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")) ) ; @@ -42,6 +60,6 @@ pm_timber_yield(t,j,ac,land_natveg) = *` @stop ** 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); +pm_timber_yield(t,j,ac,land_timber) = pm_timber_yield(t,j,ac,land_timber)$(pm_timber_yield(t,j,ac,land_timber) > 0) + 0.0001$(pm_timber_yield(t,j,ac,land_timber) = 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; 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/32_forestry/dynamic_may24/equations.gms b/modules/32_forestry/dynamic_may24/equations.gms index e3ad87cf1a..d583c2040c 100644 --- a/modules/32_forestry/dynamic_may24/equations.gms +++ b/modules/32_forestry/dynamic_may24/equations.gms @@ -70,17 +70,17 @@ sum(ac_est, v32_land(j2,"aff",ac_est)) =l= sum(ac, v32_land(j2,"aff",ac)) - sum( q32_aff_pol(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`. -*' 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_may24/preloop.gms b/modules/32_forestry/dynamic_may24/preloop.gms index 0b08ad4822..a3f792c24d 100644 --- a/modules/32_forestry/dynamic_may24/preloop.gms +++ b/modules/32_forestry/dynamic_may24/preloop.gms @@ -8,13 +8,13 @@ *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("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"); +p32_carbon_density_ac_forestry(t_all,j,ac) = pm_carbon_density_plantation_ac(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. @@ -52,7 +52,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_plantation_ac(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."; diff --git a/modules/32_forestry/dynamic_may24/presolve.gms b/modules/32_forestry/dynamic_may24/presolve.gms index b8585fe52f..65d4e73373 100644 --- a/modules/32_forestry/dynamic_may24/presolve.gms +++ b/modules/32_forestry/dynamic_may24/presolve.gms @@ -22,6 +22,8 @@ v32_land_reduction.fx(j,type32,ac_est) = 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) = 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); * 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 @@ -29,21 +31,20 @@ v32_land_reduction.fx(j,type32,ac_est) = 0; ** 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); + 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) = pm_carbon_density_ac_forestry(t,j,ac,"vegc"); + p32_carbon_density_ac(t,j,"aff",ac,ag_pools) = pm_carbon_density_plantation_ac(t,j,ac,"vegc"); ); *' 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_plantation_ac(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) @@ -139,7 +140,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; @@ -171,7 +172,7 @@ if(ord(t) = 1, else p32_plant_contr(t,i) = p32_plant_contr(t-1,i) * (1+i32_plant_contr_growth_fader(t))**m_timestep_length_forestry; ); -p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_contr_max; +p32_plant_contr(t,i)$(p32_plant_contr(t,i) > s32_plant_contr_max) = s32_plant_contr_max; ** demand for establishment decision depends on s32_demand_establishment: ** s32_demand_establishment = 0 static (establishment based on current demand) @@ -183,7 +184,7 @@ if(s32_demand_establishment = 1, 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_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)); diff --git a/modules/35_natveg/dynamic_feb21/declarations.gms b/modules/35_natveg/dynamic_feb21/declarations.gms deleted file mode 100644 index e56a8dde9a..0000000000 --- a/modules/35_natveg/dynamic_feb21/declarations.gms +++ /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 - -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_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/input/files b/modules/35_natveg/input/files index 994bc46a69..dc39074a1e 100644 --- a/modules/35_natveg/input/files +++ b/modules/35_natveg/input/files @@ -3,3 +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.cs2 +pot_forest_area_0.5.mz diff --git a/modules/35_natveg/module.gms b/modules/35_natveg/module.gms index 9fec0983aa..8a39eecaa9 100644 --- a/modules/35_natveg/module.gms +++ b/modules/35_natveg/module.gms @@ -17,5 +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 new file mode 100644 index 0000000000..e440e3a270 --- /dev/null +++ b/modules/35_natveg/pot_forest_may24/declarations.gms @@ -0,0 +1,136 @@ +*** | (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_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,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,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) + 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) + 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) + 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,othertype35) Other land expansion (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) + 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,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) + 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) + 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,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,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) +; + + +*#################### R SECTION START (OUTPUT DECLARATIONS) #################### +parameters + ov35_secdforest(t,j,ac,type) Detailed stock of secdforest (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,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,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) + 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,othertype35,type) Other land expansion (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) + oq35_secdforest_regeneration(t,j,type) Secondary forest regeneration (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) + 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) + 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) + 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/dynamic_feb21/equations.gms b/modules/35_natveg/pot_forest_may24/equations.gms similarity index 65% rename from modules/35_natveg/dynamic_feb21/equations.gms rename to modules/35_natveg/pot_forest_may24/equations.gms index 6a49b108c6..eea810d8bc 100644 --- a/modules/35_natveg/dynamic_feb21/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((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 @@ -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 @@ -34,11 +45,11 @@ 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(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). @@ -53,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,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 @@ -61,7 +72,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)); @@ -74,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((othertype35,ac_sub), v35_other_reduction(j2,othertype35,ac_sub)) + 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,othertype35,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_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= @@ -115,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),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 ; ** Secondary forest @@ -124,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 @@ -133,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 @@ -143,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,"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 + ; *' 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 @@ -155,20 +168,31 @@ 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,othertype35,ac_sub).. + v35_hvarea_other(j2,othertype35,ac_sub) + =l= + v35_other_reduction(j2,othertype35,ac_sub); + -q35_hvarea_other(j2,ac_sub).. - v35_hvarea_other(j2,ac_sub) - =l= - v35_other_reduction(j2,ac_sub); +*' 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)) + =l= + pcm_max_forest_est(j2) + - sum(ac, vm_land_other(j2,"youngsecdf",ac) ) + ; *' Harvested secondary forest is still considered secondary forests due to *' restrictive NPI definitions. Also primary forest harvested will be considered @@ -176,20 +200,20 @@ q35_hvarea_other(j2,ac_sub).. *' 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,"othernat",ac_est)) + =g= + sum((othertype35,ac_sub),v35_hvarea_other(j2,othertype35,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). @@ -198,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,"othernat",ac_est) =e= sum(ac_est2, vm_land_other(j2,"othernat",ac_est2))/card(ac_est2); diff --git a/modules/35_natveg/dynamic_feb21/input.gms b/modules/35_natveg/pot_forest_may24/input.gms similarity index 94% rename from modules/35_natveg/dynamic_feb21/input.gms rename to modules/35_natveg/pot_forest_may24/input.gms index 2e8ff828cc..0ed373a22b 100644 --- a/modules/35_natveg/dynamic_feb21/input.gms +++ b/modules/35_natveg/pot_forest_may24/input.gms @@ -47,3 +47,10 @@ $ondelim $include "./modules/35_natveg/input/f35_forest_disturbance_share.cs4" $offdelim /; + +parameter f35_pot_forest_area(j) Potential forest area (mio. ha) +/ +$ondelim +$include "./modules/35_natveg/input/pot_forest_area.cs2" +$offdelim +/; diff --git a/modules/35_natveg/dynamic_feb21/postsolve.gms b/modules/35_natveg/pot_forest_may24/postsolve.gms similarity index 75% rename from modules/35_natveg/dynamic_feb21/postsolve.gms rename to modules/35_natveg/pot_forest_may24/postsolve.gms index 41f427750b..d92c17f222 100644 --- a/modules/35_natveg/dynamic_feb21/postsolve.gms +++ b/modules/35_natveg/pot_forest_may24/postsolve.gms @@ -6,22 +6,26 @@ *** | 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); +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; *#################### 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_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,"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,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,"marginal") = v35_hvarea_other.m(j,ac); + 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); @@ -33,16 +37,17 @@ p35_other(t,j,ac) = v35_other.l(j,ac); 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,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); oq35_secdforest_regeneration(t,j,"marginal") = q35_secdforest_regeneration.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); - oq35_hvarea_other(t,j,ac,"marginal") = q35_hvarea_other.m(j,ac); + 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); @@ -53,16 +58,18 @@ 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_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,"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,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,"level") = v35_hvarea_other.l(j,ac); + 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); @@ -74,16 +81,17 @@ p35_other(t,j,ac) = v35_other.l(j,ac); 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,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); oq35_secdforest_regeneration(t,j,"level") = q35_secdforest_regeneration.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); - oq35_hvarea_other(t,j,ac,"level") = q35_hvarea_other.l(j,ac); + 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); @@ -94,16 +102,18 @@ 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_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,"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,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,"upper") = v35_hvarea_other.up(j,ac); + 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); @@ -115,16 +125,17 @@ p35_other(t,j,ac) = v35_other.l(j,ac); 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,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); oq35_secdforest_regeneration(t,j,"upper") = q35_secdforest_regeneration.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); - oq35_hvarea_other(t,j,ac,"upper") = q35_hvarea_other.up(j,ac); + 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); @@ -135,16 +146,18 @@ 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_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,"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,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,"lower") = v35_hvarea_other.lo(j,ac); + 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); @@ -156,16 +169,17 @@ p35_other(t,j,ac) = v35_other.l(j,ac); 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,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); oq35_secdforest_regeneration(t,j,"lower") = q35_secdforest_regeneration.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); - oq35_hvarea_other(t,j,ac,"lower") = q35_hvarea_other.lo(j,ac); + 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); @@ -176,4 +190,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/dynamic_feb21/preloop.gms b/modules/35_natveg/pot_forest_may24/preloop.gms similarity index 74% rename from modules/35_natveg/dynamic_feb21/preloop.gms rename to modules/35_natveg/pot_forest_may24/preloop.gms index 85a49664f4..3f4750017f 100644 --- a/modules/35_natveg/dynamic_feb21/preloop.gms +++ b/modules/35_natveg/pot_forest_may24/preloop.gms @@ -6,8 +6,8 @@ *** | Contact: magpie@pik-potsdam.de ** initialize other land -i35_other(j,ac) = 0; -i35_other(j,"acx") = 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, @@ -32,17 +32,24 @@ elseif s35_secdf_distribution = 2, *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_land_other(t,j,othertype35,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; +* ------------------------------------------------------------- +* Initialize remaining potential forest establishment area +* ------------------------------------------------------------- + +* 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; + * ----------------------------------------- * Land conservation for climate mitigation * ----------------------------------------- @@ -66,3 +73,10 @@ 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_land_other(j,othertype35,ac) = i35_land_other(j,othertype35,ac); diff --git a/modules/35_natveg/dynamic_feb21/presolve.gms b/modules/35_natveg/pot_forest_may24/presolve.gms similarity index 59% rename from modules/35_natveg/dynamic_feb21/presolve.gms rename to modules/35_natveg/pot_forest_may24/presolve.gms index f4c870b7e5..8d2ac2ede8 100644 --- a/modules/35_natveg/dynamic_feb21/presolve.gms +++ b/modules/35_natveg/pot_forest_may24/presolve.gms @@ -5,14 +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_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 * ---------------------------------------------------- @@ -47,13 +39,45 @@ 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"); + +* ------------------------------------------------- +* 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, 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 +* assumed that forestry was located in areas suitable to grow forests. +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_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); + +* ------------------------------------------------ +* 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; * 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,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_other(t,j,"acx") = p35_other(t,j,"acx") - + sum(ac$(ord(ac) > card(ac)-s35_shift), pc35_other(j,ac)); + 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) @@ -62,17 +86,19 @@ 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)); -* -------------------------------------- -* Carbon threshold for secondary forest -* -------------------------------------- + +* ------------------------------------------------------- +* 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 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); +*' 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,"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 pc35_secdforest(j,ac) = p35_secdforest(t,j,ac); @@ -80,23 +106,24 @@ 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)); +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); -* 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); +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 * ------------------------------------- -* Within the optimization, primary and secondary forests can only decrease -* (e.g. for cropland expansion). +* Within the optimization, primary forests can only decrease +* (e.g. due to 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. +* 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 @@ -125,31 +152,43 @@ 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 * 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 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") - 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); + * 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; +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 -v35_other.up(j,ac_sub) = pc35_other(j,ac_sub); -m_boundfix(v35_other,(j,ac_sub),l,10e-5); +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_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_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 @@ -158,36 +197,35 @@ 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); +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 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,"forestry")) +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 v35_hvarea_secdforest.fx(j,ac_est) = 0; -v35_hvarea_other.fx(j,ac_est) = 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) = 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) = 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) = (v35_other.l(j,ac_sub) - v35_other.lo(j,ac_sub))*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/35_natveg/dynamic_feb21/realization.gms b/modules/35_natveg/pot_forest_may24/realization.gms similarity index 67% rename from modules/35_natveg/dynamic_feb21/realization.gms rename to modules/35_natveg/pot_forest_may24/realization.gms index 8f357c35db..0003ac36b0 100644 --- a/modules/35_natveg/dynamic_feb21/realization.gms +++ b/modules/35_natveg/pot_forest_may24/realization.gms @@ -5,11 +5,15 @@ *** | 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 +*' @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 *' LUH2 data set [@hurtt2018luh2]. +*' 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`. *' 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 @@ -33,12 +37,12 @@ *' 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" +$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_feb21/scaling.gms b/modules/35_natveg/pot_forest_may24/scaling.gms similarity index 100% rename from modules/35_natveg/dynamic_feb21/scaling.gms rename to modules/35_natveg/pot_forest_may24/scaling.gms diff --git a/modules/35_natveg/dynamic_feb21/sets.gms b/modules/35_natveg/pot_forest_may24/sets.gms similarity index 93% rename from modules/35_natveg/dynamic_feb21/sets.gms rename to modules/35_natveg/pot_forest_may24/sets.gms index 0ad78e215c..517e5d564b 100644 --- a/modules/35_natveg/dynamic_feb21/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 / + othertype35 Other land types + / othernat, youngsecdf / shock_scen Scenario name of forest carbon shock / none, 002lin2030,004lin2030,008lin2030,016lin2030 diff --git a/modules/52_carbon/normal_dec17/declarations.gms b/modules/52_carbon/normal_dec17/declarations.gms index f102773491..e56ff128d1 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_plantation_ac(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/input.gms b/modules/52_carbon/normal_dec17/input.gms index a7f8de3df7..16cb94a19e 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 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 * 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 diff --git a/modules/52_carbon/normal_dec17/start.gms b/modules/52_carbon/normal_dec17/start.gms index 1668e36251..a7e8879b67 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_plantation_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","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_plantation_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)); +* ----------------------------- +* 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)); 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_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/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/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 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..2d77aa7917 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,"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")) ; + + + 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/ diff --git a/modules/80_optimization/nlp_apr17/solve.gms b/modules/80_optimization/nlp_apr17/solve.gms index 42984f030b..0a0ba81a4e 100644 --- a/modules/80_optimization/nlp_apr17/solve.gms +++ b/modules/80_optimization/nlp_apr17/solve.gms @@ -47,25 +47,25 @@ if (magpie.modelstat > 2, if(s80_resolve_option = 1, display "Modelstat > 2 | Retry solve with CONOPT4 default setting"; option nlp = conopt4; - magpie.optfile = 0; - elseif s80_resolve_option = 2, + 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, + 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, + magpie.optfile = 2; + elseif s80_resolve_option = 4, display "Modelstat > 2 | Retry solve with CONOPT3"; option nlp = conopt; - magpie.optfile = 0; + 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; + magpie.optfile = s80_optfile; display "vm_cost_glo.l"; display vm_cost_glo.l; @@ -78,9 +78,9 @@ if (magpie.modelstat > 2, 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. +* 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)