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 8 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
15 changes: 15 additions & 0 deletions core/bounds.gms
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,21 @@ 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 emissions to historical emissions in 2010
*** RP: turned off in March 2018, as it produces substantial negative side-effects (requiring strong early retirement in 2010, which influences the future investments even in Reference scenarios)
*** vm_emiTe.up("2010",regi,"co2") = p_boundEmi("2010",regi) ;
Expand Down
2 changes: 1 addition & 1 deletion core/declarations.gms
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,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 3000 USD/kW(el) in 2020.
fschreyer marked this conversation as resolved.
Show resolved Hide resolved
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
2300 USD/kW(el) / 0.65 (elh2 efficiency) ~ 3500 USD/kW(H2) = inco0
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
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 @@ -1499,9 +1499,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 @@ -1513,14 +1516,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
20 changes: 11 additions & 9 deletions modules/32_power/IntC/datainput.gms
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ $offdelim
;

*** windoffshore-todo
*** allow input data with either "wind" or "windon" until mrremind is updated
*** allow input data with either "wind" or "windon" until mrremind is updated
f32_factorStorage(all_regi,"windon") $ (f32_factorStorage(all_regi,"windon") eq 0) = f32_factorStorage(all_regi,"wind");
f32_factorStorage(all_regi,"windoff") = f32_factorStorage(all_regi,"windon");
f32_factorStorage(all_regi,"windon") = 1.35 * f32_factorStorage(all_regi,"windon");
f32_factorStorage(all_regi,"windon") = 1.35 * f32_factorStorage(all_regi,"windon");

p32_factorStorage(all_regi,teVRE) = f32_factorStorage(all_regi,teVRE);

Expand All @@ -60,7 +60,7 @@ $include "./modules/32_power/IntC/input/f32_storageCap.prn"
p32_storageCap(te,char) = f32_storageCap(char,te);
display p32_storageCap;

*** set total VRE share threshold above which additional integration challenges arise:
*** set total VRE share threshold above which additional integration challenges arise:
p32_shThresholdTotVREAddIntCost(t)$(t.val < 2030) = 50;
p32_shThresholdTotVREAddIntCost("2030") = 60;
p32_shThresholdTotVREAddIntCost("2035") = 70;
Expand All @@ -70,21 +70,23 @@ p32_shThresholdTotVREAddIntCost(t)$(t.val > 2045) = 95;

p32_FactorAddIntCostTotVRE = 1.5;

*** Flexibility Tax Parameter
*** Flexibility Tax Parameters

*** The flexibility tax for electrolysis reduces the electricity price electrolysis sees via a subsidy. It is determined by two parameters
*** 1) p32_PriceDurSlope determines the minimum electricity price of electrolysis (relative to average elec. price) at an electrolysis share in electricity demand of 0 (and high VRE share)
*** 2) p32_flexSeelShare_slope determines the slope of the linear function at which the electrolysis el. price increases at higher electrolysis shares
*** Both flexibility tax parameters are based on a regression analysis with hourly dispatch data from high-VRE scenarios of the Langfristszenarien
*** for Germany provided by the Enertile power system model.
*** See: https://langfristszenarien.de/enertile-explorer-de/szenario-explorer/angebot.php
*** for Germany provided by the Enertile power system model ( https://langfristszenarien.de/enertile-explorer-de/szenario-explorer/angebot.php).
*** See https://github.com/remindmodel/development_issues/issues/404 for details.

*** This parameter determines by the maximum electricity price reduction for electrolysis at 100% VRE share and 0% share of electrolysis in total electricity demand.
*** Standard value is derived based on the regression of the German Langfristzenarien.
*** p32_PriceDurSlope can be chosen by a switch. The standard value can be found in main.gms.
parameter f32_cm_PriceDurSlope_elh2(ext_regi) "slope of price duration curve for electrolysis [#]" / %cm_PriceDurSlope_elh2% /;
p32_PriceDurSlope(regi,"elh2") = f32_cm_PriceDurSlope_elh2("GLO");
loop(ext_regi$f32_cm_PriceDurSlope_elh2(ext_regi),
loop(regi$regi_groupExt(ext_regi,regi),
p32_PriceDurSlope(regi,"elh2") = f32_cm_PriceDurSlope_elh2(ext_regi);
);
);
);

*** Slope of increase of electricity price for electrolysis with increasing share of electrolysis in power system
*** The value of 1.1 is derived from the regression of the German Langfristzenarien.
Expand Down
3 changes: 2 additions & 1 deletion modules/39_CCU/off/not_used.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ pm_emifac,input,questionnaire
cm_emiscen,input,questionnaire
cm_shSynGas,input,questionnaire
vm_prodSe,input,questionnaire
vm_co2capture,input,questionnaire
pm_gdp,input,not used
pm_cf,input,not used
Loading
Loading