Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Update green hydrogen cost and tax parameterization and near-term bounds for electrolysis and CCU technologies #1882

Merged
merged 12 commits into from
Nov 20, 2024
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
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- **core** changed adjustment cost of geohe (central heat pumps), elh2 (electrolysis), MeOH (FT-Synthesis: H2-to-Liquids)
and h22ch4 (methanation: H2-to-Gas) to better reflect upscaling dynamics
[[#1823](https://github.com/remindmodel/remind/pull/1823)]
- **core** increase electrolysis CAPEX and slightly adjust default setting for electrolysis taxation and flexibility benefit,
add near-term bounds for electrolysis and synthetic fuel deployment
[[#1882](https://github.com/remindmodel/remind/pull/1882)]

### added
- **32_power** increase minimum required dispatchable back-up capacity for VRE integration
Expand Down
14 changes: 14 additions & 0 deletions core/bounds.gms
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,20 @@ loop(te$(sameas(te,"ngcc") OR sameas(te,"ngt") OR sameas(te,"gaschp")),
vm_cap.lo("2020",regi,te,"1")$pm_histCap("2020",regi,te) = 0.95 * pm_histCap("2020",regi,te);
);


*** bounds on near-term electrolysis capacities
*' set lower and upper bounds for 2025 based on projects annoucements
*' from IEA Hydryogen project database:
*' https://www.iea.org/data-and-statistics/data-product/hydrogen-production-and-infrastructure-projects-database
*' distribute to regions via GDP share
*' in future this should be differentiated by region based on regionalized input data of project announcements
*' 2 GW(el) at least globally in 2025, about operational capacity as of 2023
vm_cap.lo("2025",regi,"elh2","1")= 2 * pm_eta_conv("2025",regi,"elh2")*pm_gdp("2025",regi)
/ sum(regi2,pm_gdp("2025",regi2)) * 1e-3;
*' 10 GW(el) at maximum globally in 2025
vm_cap.up("2025",regi,"elh2","1")= 10 * pm_eta_conv("2025",regi,"elh2")*pm_gdp("2025",regi)
/ sum(regi2,pm_gdp("2025",regi2)) * 1e-3;

*** fix capacities for advanced bio carbon capture technologies to zero in 2020 (i.e. no BECCS in 2020)
vm_cap.fx("2020",regi,te,rlf)$(teBio(te) AND teCCS(te)) = 0;

Expand Down
2 changes: 1 addition & 1 deletion core/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ vm_costAddTeInv(tall,all_regi,all_te,emi_sectors) "additional sector-specific

vm_co2CCS(ttot,all_regi,all_enty,all_enty,all_te,rlf) "all different ccs. [GtC/a]"

vm_co2capture(ttot,all_regi,all_enty,all_enty,all_te,rlf) "all captured CO2. [GtC/a]"
v_co2capture(ttot,all_regi,all_enty,all_enty,all_te,rlf) "all captured CO2. [GtC/a]"
v_co2capturevalve(ttot,all_regi) "CO2 emitted right after capture [GtC/a] (in q_balCCUvsCCS to account for different lifetimes of capture and CCU/CCS te and capacities)"

v_prodUe (ttot,all_regi,all_enty,all_enty,all_te) "Useful energy production [TWa]"
Expand Down
6 changes: 3 additions & 3 deletions core/equations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -744,7 +744,7 @@ q_emiCdrAll(t,regi)..
)
* ( !! scaled by the fraction that gets stored geologically
sum(teCCS2rlf(te, rlf), vm_co2CCS(t, regi, "cco2", "ico2", te, rlf))
/ (sum(teCCS2rlf(te, rlf), vm_co2capture(t, regi, "cco2", "ico2", "ccsinje", rlf)) + sm_eps)
/ (sum(teCCS2rlf(te, rlf), v_co2capture(t, regi, "cco2", "ico2", "ccsinje", rlf)) + sm_eps)
)
!! net negative emissions from co2luc
- p_macBaseMagpieNegCo2(t,regi)
Expand Down Expand Up @@ -829,7 +829,7 @@ q_budgetCO2eqGlob$(cm_emiscen=6)..
*' Definition of carbon capture :
***---------------------------------------------------------------------------
q_balcapture(t,regi,ccs2te(ccsCo2(enty),enty2,te)) ..
sum(teCCS2rlf(te,rlf), vm_co2capture(t,regi,enty,enty2,te,rlf))
sum(teCCS2rlf(te,rlf), v_co2capture(t,regi,enty,enty2,te,rlf))
=e=
!! carbon captured in energy sector
sum(emi2te(enty3,enty4,te2,enty),
Expand All @@ -852,7 +852,7 @@ q_balcapture(t,regi,ccs2te(ccsCo2(enty),enty2,te)) ..
*' atmosphere)
***---------------------------------------------------------------------------
q_balCCUvsCCS(t,regi) ..
sum(teCCS2rlf(te,rlf), vm_co2capture(t,regi,"cco2","ico2",te,rlf))
sum(teCCS2rlf(te,rlf), v_co2capture(t,regi,"cco2","ico2",te,rlf))
=e=
sum(teCCS2rlf(te,rlf), vm_co2CCS(t,regi,"cco2","ico2",te,rlf))
+ sum(teCCU2rlf(te,rlf), vm_co2CCUshort(t,regi,"cco2","ccuco2short",te,rlf))
Expand Down
23 changes: 11 additions & 12 deletions core/input/generisdata_tech.prn
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,16 @@ luse


+ elh2 dot dhp h2turb h2curt h2turbVRE elh2VRE h22ch4 MeOH
tech_stat 4 5 5 5 3 3
inco0 1350 480 360 510 700 510 0.1 700 1300
tech_stat 3 5 5 5 3 3
inco0 3500 480 360 510 700 510 0.1 700 1300
constrTme 2 2 1 2 2 2 1 2 2
mix0
eta 0.73 0.30 0.80 0.40 0.62 0.40 0.73 0.8 0.7
omf 0.05 0.03 0.03 0.03 0.05 0.03 0.00 0.04 0.05
omv 3 12 12 24 0 24 3 25
lifetime 30 25 25 30 30 30 30 30 30
incolearn 1200
ccap0 0.0065
incolearn 3370
ccap0 0.00077
learn 0.15


Expand Down Expand Up @@ -188,14 +188,13 @@ Explanations:

Electrolysis - elh2
learning parameterization:
Assume that 10 GW(el) electrolysis installed globally and CAPEX of 800 EUR/kW(el) in 2025
(slightly optimistic due to recent policies, e.g. EU Hydrogen Bank and US Inflation Reduction Act)
(Odenweller et al. (2022), https://doi.org/10.1038/s41560-022-01097-4,
Ueckerdt et al. (2021), https://doi.org/10.1038/s41558-021-01032-7, Fig. S3).
10 GW(el) * 0.65 (elh2 efficiency) * 1e-3 ~ 0.0065 TW(H2) = ccap0
800 EUR/kW(el) / 0.65 (elh2 efficiency) * 1.1 (EUR to USD, 2015) ~ 1350 USD/kW(H2) = inco0
Assume floor cost: 100 EUR/kW(el)
100 EUR/kW(el) / 0.75 (long-term elh2 efficiency) * 1.1 (EUR to USD, 2015) ~ 150 USD/kW(H2) -> incolearn = 1200
Initialize learning curve for electrolysis at 0.5 GW(el) installed globally at CAPEX of 2300 USD/kW(el) in 2020.
Based on Ramboll 2023, https://energycentral.com/system/files/ece/nodes/658117/ghpp.pdf
and IEA 2024 Hydrogen Review, https://www.iea.org/reports/global-hydrogen-review-2024
0.5 GW(el) * 0.65 (elh2 efficiency) * 1e-3 ~ 0.00077 TW(H2) = ccap0 (for 2020)
2300 USD/kW(el) / 0.65 (elh2 efficiency) ~ 3500 USD/kW(H2) = inco0 (for 2020)
Assume floor cost: 100 USD/kW(el)
100 USD/kW(el) / 0.75 (long-term elh2 efficiency) ~ 133 USD/kW(H2) -> incolearn = 3370

Direct Air Capture - dac
learning parameterization:
Expand Down
8 changes: 4 additions & 4 deletions core/input/generisdata_tech_SSP1.prn
Original file line number Diff line number Diff line change
Expand Up @@ -68,16 +68,16 @@ learn 0.108 0.12 0
luse 0.09 0.021

+ elh2 dot dhp h2turb h2curt h2turbVRE elh2VRE h22ch4 MeOH
tech_stat 4 5 5 5 3 3
inco0 2000 480 360 510 700 510 0.1 700 800
tech_stat 3 5 5 5 3 3
inco0 3500 480 360 510 700 510 0.1 700 800
constrTme 2 2 1 2 2 1 1 2 2
mix0
eta 0.73 0.30 0.80 0.40 0.62 0.40 0.73 0.8 0.7
omf 0.05 0.03 0.03 0.03 0.05 0.00 0.00 0.03 0.03
omv 3 12 12 24 0 3 12
lifetime 30 25 25 30 30 30 30 30 30
incolearn 1500
ccap0 0.013
incolearn 3370
ccap0 0.00077
learn 0.15

+ tdels tdbiogas tdfosgas tdbiohos tdfoshos tdh2s tdh2t
Expand Down
8 changes: 4 additions & 4 deletions core/input/generisdata_tech_SSP5.prn
Original file line number Diff line number Diff line change
Expand Up @@ -67,16 +67,16 @@ learn 0.084 0.096
luse 0.09 0.021

+ elh2 dot dhp h2turb h2curt h2turbVRE elh2VRE h22ch4 MeOH
tech_stat 4 5 5 5 3 3
inco0 2000 480 360 510 700 510 0.1 700 800
tech_stat 3 5 5 5 3 3
inco0 3500 480 360 510 700 510 0.1 700 800
constrTme 2 2 1 2 2 1 1 2 2
mix0
eta 0.73 0.30 0.80 0.40 0.62 0.40 0.73 0.8 0.7
omf 0.05 0.03 0.03 0.03 0.05 0.00 0.00 0.03 0.03
omv 3 12 12 24 0 3 12
lifetime 30 25 25 30 30 30 30 30 30
incolearn 1500
ccap0 0.013
incolearn 3370
ccap0 0.00077
learn 0.15

+ tdels tdbiogas tdfosgas tdbiohos tdfoshos tdh2s tdh2t
Expand Down
4 changes: 2 additions & 2 deletions core/postsolve.gms
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,7 @@ pm_PEPrice(ttot,regi,entyPe)$(abs (qm_budget.m(ttot,regi)) gt sm_eps) =
q_balPe.m(ttot,regi,entyPe) / qm_budget.m(ttot,regi);

*** calculate share of stored CO2 from captured CO2
pm_share_CCS_CCO2(t,regi) = sum(teCCS2rlf(te,rlf), vm_co2CCS.l(t,regi,"cco2","ico2",te,rlf)) / (sum(teCCS2rlf(te,rlf), vm_co2capture.l(t,regi,"cco2","ico2",te,rlf))+sm_eps);
pm_share_CCS_CCO2(t,regi) = sum(teCCS2rlf(te,rlf), vm_co2CCS.l(t,regi,"cco2","ico2",te,rlf)) / (sum(teCCS2rlf(te,rlf), v_co2capture.l(t,regi,"cco2","ico2",te,rlf))+sm_eps);

*** emissions reporting helper parameters
o_emissions_bunkers(ttot,regi,emi)$(ttot.val ge 2005) =
Expand Down Expand Up @@ -732,7 +732,7 @@ o_emissions_other(ttot,regi,emi)$(ttot.val ge 2005) =
***Carbon Management|Carbon Capture (Mt CO2/yr)
o_capture(ttot,regi,"co2")$(ttot.val ge 2005) =
sum(teCCS2rlf(te,rlf),
vm_co2capture.l(ttot,regi,"cco2","ico2","ccsinje",rlf)
v_co2capture.l(ttot,regi,"cco2","ico2","ccsinje",rlf)
)*o_emi_conv("co2");

***Carbon Management|Carbon Capture|Process|Energy (Mt CO2/yr)
Expand Down
26 changes: 17 additions & 9 deletions main.gms
Original file line number Diff line number Diff line change
Expand Up @@ -371,14 +371,14 @@ $setglobal emicapregi none !! def = none
*'
*' This module defines the carbon price pm_taxCO2eq, with behaviour across regions governed by similar principles (e.g. global targets, or all following NDC or NPi policies).
*'
*' * (diffExp2Lin) and (diffLin2Lin): standard carbonprice realizations for ambitious climate policy scenarios [REMIND default for peak budget runs: diffLin2Lin in combination with iterative_target_adj = 9],
*' * (diffExp2Lin) and (diffLin2Lin): standard carbonprice realizations for ambitious climate policy scenarios [REMIND default for peak budget runs: diffLin2Lin in combination with iterative_target_adj = 9],
*' * three main design choices:
*' * [diff]: level of regional carbonprice differentiation in 2030 determined by cm_co2_tax_spread (default = 10); quadratic phase-in to reach globally uniform carbonprices in cm_CO2priceRegConvEndYr
*' * [Exp or Lin]: functional form of carbonprice path for developed regions:
*' * [Exp]: exponential increase with rate given by cm_co2_tax_growth, (initial) value in cm_startyear is given by cm_co2_tax_startyear
*' * [Lin]: linear increase starting at historical level given by cm_co2_tax_hist in year cm_year_co2_tax_hist, (initial) value in cm_startyear set by cm_co2_tax_startyear
*' * [2Lin]: post-peak behaviour depending on cm_iterative_target_adj
*' * [9]: after the (endogenously adjusted) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant)
*' * [9]: after the (endogenously adjusted) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant)
*' * [5]: no adaptation of carbonprice path after peak year
*' * [0]: after the (exogenously fixed) peak year, carbonprice path increases linearly with fixed annual increase given by cm_taxCO2inc_after_peakBudgYr (default = 0, i.e. constant);
*' * choose cm_peakBudgYr = 2110 for no adaptation of carbonprice path until end of century
Expand All @@ -389,7 +389,7 @@ $setglobal emicapregi none !! def = none
*' * (NPi): National Policies Implemented, extrapolation of historical (until 2020) carbon prices
*' * (none): no tax policy (combined with all emiscens except emiscen = 9)

*** (exponential) is superseded by (diffExp2Lin): For a globally uniform, exponentially increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_co2_tax_startyear.
*** (exponential) is superseded by (diffExp2Lin): For a globally uniform, exponentially increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_co2_tax_startyear.
*** (linear) is superseded by (diffLin2Lin): For a globally uniform, linearly increasing carbonprice path until end of century [in combination with cm_iterative_target_adj = 0 or 5], set cm_co2_tax_spread = 1, set cm_peakBudgYr = 2110, and choose the initial carbonprice in cm_startyear via cm_co2_tax_startyear. [Adjust historical reference point (cm_year_co2_tax_hist, cm_co2_tax_hist) if needed.]

$setglobal carbonprice none !! def = none
Expand Down Expand Up @@ -911,7 +911,7 @@ parameter
;
cm_33_EW_upScalingRateLimit = 0.2; !! def = 20% !! regexp = is.nonnegative

parameter
parameter
cm_33_EW_shortTermLimit "Limit on 2030 potential for enhanced weathering, defined as % of land on which EW is applied. Default 0.5% of land"
;
cm_33_EW_shortTermLimit = 0.005; !! def = 0.5% !! regexp = is.nonnegative
Expand Down Expand Up @@ -1504,9 +1504,12 @@ $setGlobal cm_import_EU off !! def off
*** (off) no ARIADNE-specific H2 imports for Germany
$setGlobal cm_import_ariadne off !! def off
*** cm_PriceDurSlope_elh2, slope of price duration curve for electrolysis (increase means more flexibility subsidy for electrolysis H2)
*** It parameterizes how much the electricity price for electrolysis is reduced relative to the annual average electricity price
*** This switch only has an effect if the flexibility tax is on by cm_flex_tax set to 1
*** Default value is based on data from German Langfristszenarien (see ./modules/32_power/IntC/datainput.gms).
$setGlobal cm_PriceDurSlope_elh2 GLO 15 !! def = GLO 15
*** Default value is based on data from German Langfristszenarien derived by the power system model Enertile.
*** It is derived by fitting a linear function to capture the relation between electrolysis electricity price and electrolysis share in total electricity demand
*** See https://github.com/remindmodel/development_issues/issues/404 for details.
$setGlobal cm_PriceDurSlope_elh2 GLO 20 !! def = GLO 20
*** cm_trade_SE_exog
*** set exogenous SE trade scenarios (requires se_trade realization of modul 24 to be active)
*** e.g. "2030.2050.MEA.DEU.seh2 0.5", means import of SE hydrogen from MEA to Germany from 2050 onwards of 0.5 EJ/yr,
Expand All @@ -1518,14 +1521,19 @@ $setGlobal cm_PriceDurSlope_elh2 GLO 15 !! def = GLO 15
$setGlobal cm_trade_SE_exog off !! def off
*** This allows to manually adjust the ramp-up curve of the SE tax on electricity. It is mainly used for taxing electricity going into electrolysis for green hydrogen production.
*** The ramp-up curve is a logistic function that determines how fast taxes increase with increasing share of technology in total power demand.
*** This essentially makes an assumption about to what extend the power demand of electrolysis will be taxed and how much tax exemptions there will be at low shares of green hydrogen production.
*** This essentially makes an assumption about to what extend the power demand of electrolysis will be taxed and how much tax exemptions there will be at low shares of green hydrogen production
*** The parameter a defines how fast the tax increases with increasing share, with 4/a being the percentage point range over which the tax value increases from 12% to 88%
*** The parameter b defines at which share the tax is halfway between the value at 0 share and the maximum value (defined by a region's electricity tax and the electricity grid cost) that it converges to for high shares.
*** The parameter b defines at which share the tax is halfway between the value at 0 share and
*** the maximum value (defined by a region's electricity tax and the electricity grid cost) that it converges to for high shares.
*** Example use:
*** cm_SEtaxRampUpParam = "GLO.elh2.a 0.2, GLO.elh2.b 20" sets the logistic function parameter values a=0.2 and b=20 for electrolysis (elh2) to all model regions (GLO).
*** cm_SEtaxRampUpParam = "off" disables v21_tau_SE_tax
*** Default:
*** cm_SEtaxRampUpParam = "GLO.elh2.a 0.2, GLO.elh2.b 20, EUR_regi.elh2.a 0.15, EUR_regi.elh2.b 40"
*** This means that electrolysis tax is at half of electricity taxation at 40% electrolysis share in power demand for European regions, and half at 20% share for the rest of the world.
*** We anticipate this lower taxation share in Europe, because Europe has particularly high electricity taxes compared to the rest of the world.
*** For details, please see ./modules/21_tax/on/equations.gms.
$setGlobal cm_SEtaxRampUpParam GLO.elh2.a 0.2, GLO.elh2.b 20 !! def = GLO.elh2.a 0.2, GLO.elh2.b 20
$setGlobal cm_SEtaxRampUpParam GLO.elh2.a 0.2, GLO.elh2.b 20, EUR_regi.elh2.a 0.15, EUR_regi.elh2.b 40 !! def = GLO.elh2.a 0.2, GLO.elh2.b 20, EUR_regi.elh2.a 0.15, EUR_regi.elh2.b 40
*** cm_EnSecScen "switch for running an ARIADNE energy security scenario, introducing a tax on PE fossil energy in Germany"
*** switch on energy security scenario for Germany (used in ARIADNE project), sets tax on fossil PE
*** switch to activate energy security scenario assumptions for Germany including additional tax on gas/oil
Expand Down
Loading
Loading