Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
[#2249](https://github.com/remindmodel/remind/pull/2249)
- **45_carbonprice** update NDC realization to run 2030+2035 NDC emissions targets by default and clean up and extend on switches for NDC variants
[[#2289](https://github.com/remindmodel/remind/pull/2289)]
- **core** Adapt maximum early retirement rates and differentiate between NPi and policy runs
[[#2300](https://github.com/remindmodel/remind/pull/2300)]

### removed
- **21_tax** remove input files with upper bounds on subsidies for final energy, as it is directly applied as part of input data generation
Expand Down
102 changes: 51 additions & 51 deletions config/scenario_config.csv

Large diffs are not rendered by default.

61 changes: 34 additions & 27 deletions core/bounds.gms
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,12 @@ if(cm_startyear <= 2015,
/ 7.5; !! this parameter is currently only for display and not further used to fix anything
p_deltaCapFromRWfix("2010",regi,"tnrs") = ( p_CapFixFromRWfix("2015",regi,"tnrs") - pm_aux_capLowerLimit("tnrs",regi,"2015") )
/ 7.5; !! this parameter is currently only for display and not further used to fix anything
vm_cap.fx("2015",regi,"tnrs","1") = p_CapFixFromRWfix("2015",regi,"tnrs");
*** keep nuclear power capacity in +-10% range of historic data for 2015, choose range to allow for some flexibility for the model
vm_cap.lo("2015",regi,"tnrs","1") = 0.9 * p_CapFixFromRWfix("2015",regi,"tnrs");
vm_cap.up("2015",regi,"tnrs","1") = 1.1 * p_CapFixFromRWfix("2015",regi,"tnrs");
);


if(cm_startyear <= 2020, !! require the realization of at least 70% of the plants that are currently under construction and thus might be finished until 2020 - should be updated with real-world 2020 numbers
vm_deltaCap.lo("2020",regi,"tnrs","1") = 0.70 * pm_NuclearConstraint("2020",regi,"tnrs") / 5;
vm_deltaCap.up("2020",regi,"tnrs","1") = pm_NuclearConstraint("2020",regi,"tnrs") / 5;
Expand Down Expand Up @@ -378,6 +381,36 @@ v_co2capturevalve.up(t,regi) = 1 * s_MtCO2_2_GtC;
*' #### 5. Early retirement and phase-out of technologies
*** ==================================================================



*' Early Retirement
*' Early retirement of capacities is not possible as long as vm_capEarlyReti is fixed to zero.
*' If early retirement should be activated, vm_capEarlyReti is allowed to increase up to one.
*' One means that 100% of standing capacity of this technology is retired and does not produce output in this time step.
*' allow early retirement only for technologies in teEarlyReti
vm_capEarlyReti.up(t,regi,te)$( NOT(teEarlyReti(te))) = 0;
vm_capEarlyReti.up(t,regi,teEarlyReti) = 1;

$ifthen.tech_earlyreti not "%c_tech_earlyreti_rate%" == "off"
*' allow early retirement also for technology and region combinations as defined by c_tech_earlyreti_rate switch
loop((ext_regi,te) $ p_techEarlyRetiRate(ext_regi,te),
vm_capEarlyReti.up(t,regi,te) $ (regi_group(ext_regi,regi)) = 1;
);
$endif.tech_earlyreti

*** restrict early retirement to time frame between 2015 and 2100 where it is relevant
vm_capEarlyReti.up(ttot,regi,te) $ (ttot.val < 2010 or ttot.val > 2110) = 0;

*** only US and EUR allow early retirement before 2035
loop(regi$(NOT(regi_group("USA_regi",regi) or regi_group("EUR_regi",regi))),
vm_capEarlyReti.up(t,regi,te) $ (t.val <= 2030) = 0;
);

*** lower bound of 0.01% to help the model to be aware of the early retirement option is time steps where it is active
vm_capEarlyReti.lo(t,regi,teEarlyReti) $ ( vm_capEarlyReti.up(t,regi,teEarlyReti) eq 1 and t.val > 2010 and t.val <= 2100) = 1e-4;

*' Phase-out of technologies

*' Switch off coal-h2 hydrogen investments after 2020, and gas-h2 investments after 2030. Our current seh2 hydrogen represents
*' only additional (clean) hydrogen use cases to current ones. However, as we have too high H2 demand in 2025 and 2030 from the
*' input data, we need to allow grey hydrogen for these time periods to meet the hydrogen demand which cannot be fully met by
Expand All @@ -389,34 +422,8 @@ vm_cap.lo(t,regi,"coalh2",rlf) $ (t.val >= 2020) = 0;
vm_cap.lo(t,regi,"gash2",rlf) $ (t.val > 2030) = 0;


*** CB: allow for early retirement at the start of free model time
*** allow non zero early retirement for all technologies to avoid mathematical errors
vm_capEarlyReti.up(t,regi,te) = 1e-6;
*** generally allow full early retiremnt for all fossil technologies without CCS
vm_capEarlyReti.up(t,regi,teFosNoCCS(te)) = 1;
*** allow nuclear early retirement
vm_capEarlyReti.up(t,regi,"tnrs") = 1;
*** allow early retirement of biomass used in electricity
vm_capEarlyReti.up(t,regi,"bioigcc") = 1;
*** allow early retirement of biomass used for heat and power
vm_capEarlyReti.up(t,regi,"biohp") = 1;
vm_capEarlyReti.up(t,regi,"biochp") = 1;

*** allow early retirement for techs added to the c_tech_earlyreti_rate switch
$ifthen.tech_earlyreti not "%c_tech_earlyreti_rate%" == "off"
loop((ext_regi,te) $ p_techEarlyRetiRate(ext_regi,te),
vm_capEarlyReti.up(t,regi,te) $ (regi_group(ext_regi,regi)) = 1;
);
$endif.tech_earlyreti

*** restrict early retirement to the modeling time frame (to reduce runtime, the early retirement equations are phased out after 2110)
vm_capEarlyReti.up(ttot,regi,te) $ (ttot.val < 2010 or ttot.val > 2110) = 0;

*** lower bound of 0.01% to help the model to be aware of the early retirement option
vm_capEarlyReti.lo(t,regi,te) $ (vm_capEarlyReti.up(t,regi,te) >= 1 and t.val > 2010 and t.val <= 2100) = 1e-4;

*** CB 20120301: no early retirement for diesel oil turbines, they are used despite their economic non-competitiveness for various reasons.
vm_capEarlyReti.fx(t,regi,"dot") = 0;


*** strong reliance on coal-to-liquids is not consistent with SSP1 storyline, therefore limit their use in the SSP1 and SSP2 policy scenarios
Expand Down
42 changes: 31 additions & 11 deletions core/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -764,16 +764,36 @@ pm_cf(ttot,regi,"tdh2i") = pm_cf(ttot,regi,"tdh2s");
loop(ext_regi$pm_extRegiEarlyRetiRate(ext_regi),
pm_regiEarlyRetiRate(t,regi,te)$(regi_group(ext_regi,regi)) = pm_extRegiEarlyRetiRate(ext_regi);
);
***Tech-specific*
*RP*: reduce early retirement for technologies with additional characteristics that are difficult to represent in REMIND, eg. industries built around heating/CHP plants, or flexibility from ngt plants


*** for runs with all EU subregions (regionmapping21_EU21), increase early retirement rates for the EU regions
*** because the higher regional resolution already introduces more intertia to the phase-out dynamics
*** check whether DEU, FRA, ENC, ESC, ESW, ECS all contained in regi set
if( (sum(regi$sameas(regi,"DEU"),1) > 0)
and (sum(regi$sameas(regi,"FRA"),1) > 0)
and (sum(regi$sameas(regi,"ENC"),1) > 0)
and (sum(regi$sameas(regi,"ESC"),1) > 0)
and (sum(regi$sameas(regi,"ESW"),1) > 0)
and (sum(regi$sameas(regi,"ECS"),1) > 0),
*** increase default early retirement rates by 2%/yr for EU subregions
loop(regi$regi_group("EUR_regi",regi),
pm_regiEarlyRetiRate(t,regi,te) = pm_regiEarlyRetiRate(t,regi,te) + 0.02
);
);


*** Technology-specific adaptations of maximum allowed annual early retirement rates
*** increase early retirement for technologies that are old and should be phased out faster
pm_regiEarlyRetiRate(t,regi,"pc") = 1.2 * pm_regiEarlyRetiRate(t,regi,"pc"); !! standard coal power plants, pc, are a relatively old technology that should be allowed to retire faster
*** reduce early retirement for technologies with additional characteristics that are difficult to represent in REMIND, eg. industries built around heating/CHP plants, or flexibility from ngt plants
pm_regiEarlyRetiRate(t,regi,"ngt") = 0.3 * pm_regiEarlyRetiRate(t,regi,"ngt"); !! ngt should only be phased out very slowly, as they provide flexibility - which REMIND is not too good at capturing endogeneously
pm_regiEarlyRetiRate(t,regi,"gaschp") = 0.5 * pm_regiEarlyRetiRate(t,regi,"gaschp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"coalchp") = 0.5 * pm_regiEarlyRetiRate(t,regi,"coalchp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"gashp") = 0.5 * pm_regiEarlyRetiRate(t,regi,"gashp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"coalhp") = 0.5 * pm_regiEarlyRetiRate(t,regi,"coalhp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"biohp") = 0.25 * pm_regiEarlyRetiRate(t,regi,"biohp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"biochp") = 0.25 * pm_regiEarlyRetiRate(t,regi,"biochp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"bioigcc") = 0.25 * pm_regiEarlyRetiRate(t,regi,"bioigcc"); !! reduce bio early retirement rate
pm_regiEarlyRetiRate(t,regi,"gaschp") = 0.7 * pm_regiEarlyRetiRate(t,regi,"gaschp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"coalchp") = 0.7 * pm_regiEarlyRetiRate(t,regi,"coalchp"); !! chp should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"gashp") = 0.5 * pm_regiEarlyRetiRate(t,regi,"gashp"); !! district heating plants should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"coalhp") = 0.5 * pm_regiEarlyRetiRate(t,regi,"coalhp"); !! district heating plants should only be phased out slowly, as district heating networks/ industry uses are designed to a specific heat input
pm_regiEarlyRetiRate(t,regi,"biohp") = 0.25 * pm_regiEarlyRetiRate(t,regi,"biohp"); !! biomass technologies should only be phased-out slowly, case for their early retirement is shifting the allocation of biomass across technologies to optimize biogenic carbon capture/use
pm_regiEarlyRetiRate(t,regi,"biochp") = 0.25 * pm_regiEarlyRetiRate(t,regi,"biochp"); !! biomass technologies should only be phased-out slowly, case for their early retirement is shifting the allocation of biomass across technologies to optimize biogenic carbon capture/use
pm_regiEarlyRetiRate(t,regi,"bioigcc") = 0.25 * pm_regiEarlyRetiRate(t,regi,"bioigcc"); !! biomass technologies should only be phased-out slowly, case for their early retirement is shifting the allocation of biomass across technologies to optimize biogenic carbon capture/use

$ifthen.tech_earlyreti not "%c_tech_earlyreti_rate%" == "off"
loop((ext_regi,te)$p_techEarlyRetiRate(ext_regi,te),
Expand Down Expand Up @@ -1206,7 +1226,7 @@ loop(ttot$(ttot.val ge 2005),
p_adj_seed_te(ttot,regi,"geohdr") = 0.1;
p_adj_seed_te(ttot,regi,"hydro") = 0.25;
p_adj_seed_te(ttot,regi,"windoff") = 0.5;
p_adj_seed_te(ttot,regi,"spv") = 2.00;
p_adj_seed_te(ttot,regi,"spv") = 1.5;
p_adj_seed_te(ttot,regi,"csp") = 0.25;
p_adj_seed_te(ttot,regi,"tnrs") = 0.25;
*** green hydrogen and synthetic fuels
Expand Down Expand Up @@ -1253,7 +1273,7 @@ $endif.cm_subsec_model_steel
p_adj_coeff(ttot,regi,"hydro") = 1.0;
p_adj_coeff(ttot,regi,"windon") = 0.25;
p_adj_coeff(ttot,regi,"windoff") = 0.35;
p_adj_coeff(ttot,regi,"spv") = 0.15;
p_adj_coeff(ttot,regi,"spv") = 0.18;
p_adj_coeff(ttot,regi,"tnrs") = 1.0;
*** VRE storage and grid
p_adj_coeff(ttot,regi,teGrid) = 0.3;
Expand Down
31 changes: 28 additions & 3 deletions core/sets.gms
Original file line number Diff line number Diff line change
Expand Up @@ -1172,6 +1172,11 @@ $ifthen.cm_subsec_model_steel "%cm_subsec_model_steel%" == "processes"
idrcc "Direct reduction CCS"
$endif.cm_subsec_model_steel
/

***-----------------------------------------------------------------------------
*** Definition of subsets of 'te':
***-----------------------------------------------------------------------------

teAdj(all_te) "technologies with adjustment costs on capacity additions"
/
ngcc "natural gas combined cycle"
Expand Down Expand Up @@ -1250,9 +1255,29 @@ $ifthen.cm_subsec_model_steel "%cm_subsec_model_steel%" == "processes"
$endif.cm_subsec_model_steel
/

***-----------------------------------------------------------------------------
*** Definition of subsets of 'te':
***-----------------------------------------------------------------------------
teEarlyReti(all_te) "technologies for which early retirement of existing capacities is allowed (i.e. before end of technical lifetime)."
/
ngcc
ngt
gastr
gaschp
gashp
gash2
gasftrec
refliq
igcc
pc
coalchp
coalhp
coaltr
coalgas
coalftrec
coalh2
biochp
biohp
bioigcc
tnrs
/

*** Note: technologies without endogenous learning can also have decreasing (or increasing) capital cost over time, due to for example convergence to global value
teLearn(all_te) "Learning technologies (for which investment costs are reduced endogenously through capacity deployment)."
Expand Down
14 changes: 10 additions & 4 deletions main.gms
Original file line number Diff line number Diff line change
Expand Up @@ -1398,11 +1398,17 @@ $setglobal cm_NPi_version 2025_cond !! def = "2025_cond" !! regexp = 2025_(
*' (ELEVATE2p3): settings used for ELEVATE2p3 LTS and NDC-LTS scenario
$setglobal cm_netZeroScen NGFS_v4 !! def = "NGFS_v4" !! regexp = NGFS_v4|NGFS_v4_20pc|ELEVATE2p3
*' * c_regi_earlyreti_rate "maximum percentage of capital stock that can be retired early (before reaching their expected lifetimes) in one year in specified regions, if they are not economically viable. It is applied to all techs unless otherwise specified in c_tech_earlyreti_rate."
*' * GLO 0.09, EUR_regi 0.15: default value. (0.09 means full retirement after 11 years, 10% standing after 10 years)
$setglobal c_regi_earlyreti_rate GLO 0.09, EUR_regi 0.15 !! def = GLO 0.09, EUR_regi 0.15
*' * Default value used in NPi runs: EUR_regi 0.06, USA_regi 0.04, CHA_regi 0.04, CAZ_regi 0.04, JPN_regi 0.04, GLO 0.03 (0.06 means 6% of capacity can be retired early per year at maximum, i.e. full retirement after 16.7 years, 40% standing capacity after 10 years)
*' * In target scenarios with ambition level beyond the NPi, we assume slightly higher early retirement rates outside the EU.
*' * Target scenario maximum retirement rates: EUR_regi 0.08, USA_regi 0.07, CHA_regi 0.07, CAZ_regi 0.07, JPN_regi 0.07, GLO 0.06
*' * This reflects that the current aversion to shut down plants before end of their lifetime linked to political economy dynamics can be overcome to speed up the energy transition.
*' * Finally, note that these maximum early retirement rates are further differentiated by technology. Coal power has 20% higher rates, for instance, while CHP plants have 30% lower rates than the default value (see core/datainput.gms).
$setglobal c_regi_earlyreti_rate EUR_regi 0.06, USA_regi 0.04, CHA_regi 0.04, CAZ_regi 0.04, JPN_regi 0.04, GLO 0.03 !! def = EUR_regi 0.06, USA_regi 0.04, CHA_regi 0.04, CAZ_regi 0.04, JPN_regi 0.04, GLO 0.03
*' * c_tech_earlyreti_rate "maximum percentage of capital stock of specific technologies that can be retired early in one year in specified regions. This switch overrides c_regi_earlyreti_rate to allow for fine-tuning of phase-out schedules, e.g. for implementation of certain policies or anticipated trends."
*' * USA_regi.pc 0.13, REF_regi.pc 0.13, CHA_regi.pc 0.13: default value, including retirement of 1st gen biofuels, higher rate of coal phase-out for USA, REF and CHA
$setglobal c_tech_earlyreti_rate USA_regi.pc 0.13, REF_regi.pc 0.13, CHA_regi.pc 0.13 !! def = USA_regi.pc 0.13, REF_regi.pc 0.13, CHA_regi.pc 0.13
*' * Example use: USA_regi.pc 0.1, CHA_regi.pc 0.1: Change max retirement rates for coal power in US and China to 10%/yr.
*' * Keep value "off" if not needed.
*' * This switch only changes the retirement rates strictly before the year specified in c_earlyRetiValidYr (default 2035).
$setglobal c_tech_earlyreti_rate off !! def = off
*** cm_LU_emi_scen "choose emission baseline for CO2, CH4, and N2O land use emissions from MAgPIE"
*** (SSP1): emissions (from SSP1 scenario in MAgPIE)
*** (SSP2): emissions (from SSP2 scenario in MAgPIE)
Expand Down
18 changes: 15 additions & 3 deletions modules/45_carbonprice/NPi2025/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,27 @@
*** CO2 Tax level growing exponentially from 2025 value taken from input data
***----------------------------

*** for years up to 2025 take CO2 price defined by fm_taxCO2eqHist
*** fm_taxCO2eqHist reflects historical carbon prices and
*** assumptions on current aggregate effect of other policies
pm_taxCO2eq(ttot,regi)$(ttot.val le 2025) = fm_taxCO2eqHist(ttot,regi) * sm_DptCO2_2_TDpGtC;

pm_taxCO2eq(t,regi)$(t.val gt 2025) = sum(ttot, pm_taxCO2eq(ttot,regi)$(ttot.val eq 2025)) + (t.val - 2025) * (20/75) * sm_DptCO2_2_TDpGtC;
*** for years after 2025, assume modest linear increase of CO2 price by 20 USD/tCO2 over 75 years (2025-2100)
pm_taxCO2eq(t,regi)$(t.val gt 2025) = pm_taxCO2eq("2025",regi)
+ (t.val - 2025) * (20/75) * sm_DptCO2_2_TDpGtC;


*** for EU, take carbon price from fm_taxCO2eqHist up to 2030,
*** then increase linearly by 20 USD/tCO2 over 75 years (2030-2100)
loop(ext_regi$sameas(ext_regi, "EUR_regi"),
pm_taxCO2eq(t,regi)$(t.val ge 2030 AND regi_group(ext_regi,regi)) = (fm_taxCO2eqHist("2030",regi)+ (t.val - 2030) * (20/75)) * sm_DptCO2_2_TDpGtC;
pm_taxCO2eq(t,regi)$( t.val ge 2030
AND regi_group(ext_regi,regi)) = ( fm_taxCO2eqHist("2030",regi)
+ (t.val - 2030) * (20/75) ) * sm_DptCO2_2_TDpGtC;
);

pm_taxCO2eq(t,regi)$(t.val gt 2100) = pm_taxCO2eq("2100",regi); !! to prevent huge taxes after 2100 and the resulting convergence problems, set taxes after 2100 equal to 2100 value

*** after 2100, keep CO2 price constant at 2100 level
pm_taxCO2eq(t,regi)$(t.val gt 2100) = pm_taxCO2eq("2100",regi);

*** switch off MAC abatement of land emissions, scenario should only have Magpie baseline emissions
pm_macSwitch(ttot,regi,emiMacMagpie) = 0;
Expand Down