From 18c56f100dc811dab41707556e466102e227e81b Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Mon, 9 Oct 2023 11:22:25 +0200 Subject: [PATCH 1/8] activate gasftrec and gasftcrec technologies again --- core/bounds.gms | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/bounds.gms b/core/bounds.gms index 755870109..bbfc0c332 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -405,9 +405,6 @@ loop(regi, *** Fixing will produce clearly attributable errors (good for debugging) when using inconsistent data, as the GAMS accuracy when comparing fixed results is very high (< 1e-8). ***vm_prodFE.fx("2005",regi,se2fe(enty,enty2,te)) = sum(fe2ppfEn(enty2,in), pm_cesdata("2005",regi,in,"quantity") ); -vm_deltaCap.up(t,regi,"gasftrec",rlf)$(t.val gt 2005) = 0.0; -vm_deltaCap.up(t,regi,"gasftcrec",rlf)$(t.val gt 2005) = 0.0; - $ontext *** ------------------------------------------------------------- *** *RP* Chinese depoyment of coal power plants and coal use in industry was probably not only demand-driven, but also policy-driven (faster than demand). Therefore, we implement lower bounds on coal power plants and solid coal use: From ff0809c541cc03ccfa1472ab0a3f19ef27a46754 Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Fri, 16 Feb 2024 09:10:58 +0100 Subject: [PATCH 2/8] update flexibility tax implementation for electrolysis by making flex tax benefit depend, additionally, on the share of electrolysis in total electricity demand based data from the German Langfristszenarien with detailed power system modeling --- modules/32_power/IntC/bounds.gms | 2 +- modules/32_power/IntC/datainput.gms | 8 ++++++ modules/32_power/IntC/declarations.gms | 23 +++++++++++---- modules/32_power/IntC/equations.gms | 39 +++++++++++++++++++++++--- modules/32_power/IntC/postsolve.gms | 5 ++++ 5 files changed, 66 insertions(+), 11 deletions(-) diff --git a/modules/32_power/IntC/bounds.gms b/modules/32_power/IntC/bounds.gms index 7b524972e..a6a126b7f 100644 --- a/modules/32_power/IntC/bounds.gms +++ b/modules/32_power/IntC/bounds.gms @@ -35,7 +35,7 @@ if ( cm_flex_tax eq 1, vm_capFac.up(t,regi,teFlexTax)$(t.val ge 2010) = pm_cf(t,regi,teFlexTax); else *** if flexibility tax feedback is off, only flexibliity tax benefit for flexible technologies and 0.5 capacity factor - vm_capFac.fx(t,regi,teFlex)$(t.val ge 2010) = 0.5; + vm_capFac.fx(t,regi,teFlex)$(t.val ge 2010) = 0.38; *** electricity price of inflexible technologies the same w/o feedback v32_flexPriceShare.fx(t,regi,te)$(teFlexTax(te) AND NOT(teFlex(te))) = 1; ); diff --git a/modules/32_power/IntC/datainput.gms b/modules/32_power/IntC/datainput.gms index 61fbbb44f..0f341c001 100644 --- a/modules/32_power/IntC/datainput.gms +++ b/modules/32_power/IntC/datainput.gms @@ -96,7 +96,15 @@ p32_flex_maxdiscount(regi,te) = p32_flex_maxdiscount(regi,te) * sm_TWa_2_MWh * s display p32_flex_maxdiscount; $offtext +*** Flexibility Tax Parameter + *** initialize p32_PriceDurSlope parameter p32_PriceDurSlope(regi,"elh2") = cm_PriceDurSlope_elh2; +*** Slope of increase of electricity price for electrolysis with increasing share of electrolysis in power system +*** The value of 1.1 is 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 +p32_flexSeelShare_slope(t,regi,"elh2") = 1.1; + *** EOF ./modules/32_power/IntC/datainput.gms diff --git a/modules/32_power/IntC/declarations.gms b/modules/32_power/IntC/declarations.gms index 3bd750582..a514501dd 100644 --- a/modules/32_power/IntC/declarations.gms +++ b/modules/32_power/IntC/declarations.gms @@ -18,6 +18,7 @@ parameters o32_dispatchDownPe2se(ttot,all_regi,all_te) "output parameter to check by how much a pe2se te reduced its output below the normal, in % of the normal output." p32_shThresholdTotVREAddIntCost(ttot) "Total VRE share threshold above which additional integration challenges arise. Increases with time as eg in 2030, there is still little experience with managing systems with 80% VRE share. Unit: Percent" p32_FactorAddIntCostTotVRE "Multiplicative factor that influences how much the total VRE share increases integration challenges" + p32_flexSeelShare_slope(ttot,all_regi,all_te) "Slope of relationship between average electricity price for flexible technology and share of this technology in total electricity demand. Unit: [ % percentage of average electricity price / % share in electricity demand]." ; scalars @@ -47,17 +48,27 @@ equations q32_limitSolarWind(tall,all_regi) "limits on fluctuating renewables, only turned on for special EMF27 scenarios" q32_h2turbVREcapfromTestor(tall,all_regi) "calculate capacities of dummy seel<--h2 technology from storXXX technologies" q32_h2turbVREcapfromTestorUp(ttot,all_regi) "constraint h2turbVRE hydrogen turbines to be only built together with storage capacities" - q32_flexAdj(tall,all_regi,all_te) "calculate flexibility used in flexibility tax for technologies with electricity input" - q32_flexPriceShareMin "calculatae miniumum share of average electricity that flexible technologies can see" - q32_flexPriceShare(tall,all_regi,all_te) "calculate share of average electricity price that flexible technologies see" - q32_flexPriceBalance(tall,all_regi) "constraint such that flexible electricity prices balanance to average electricity price" + q32_flexAdj(ttot,all_regi,all_te) "calculate flexibility used in flexibility tax for technologies with electricity input" + q32_flexPriceShareMin(ttot,all_regi,all_te) "calculatae miniumum share of average electricity that flexible technologies can see" + q32_flexPriceShareVRE(ttot,all_regi,all_te) "calculatae miniumum share of average electricity that flexible technologies can see given the current VRE share" + q32_flexPriceShare(ttot,all_regi,all_te) "calculate share of average electricity price that flexible technologies see given a certain VRE share and share of electrolysis in total electricity demand" + q32_flexPriceBalance(ttot,all_regi) "constraint such that flexible electricity prices balanance to average electricity price" q32_TotVREshare(ttot,all_regi) "calculate total VRE share" q32_shAddIntCostTotVRE(ttot,all_regi) "calculate how much total VRE share is above threshold value" ; variables -v32_flexPriceShare(tall,all_regi,all_te) "share of average electricity price that flexible technologies see [share: 0...1]" -v32_flexPriceShareMin(tall,all_regi,all_te) "possible minimum of share of average electricity price that flexible technologies see [share: 0...1]" +v32_flexPriceShare(ttot,all_regi,all_te) "share of average electricity price that flexible technologies see [share: 0...1]" +v32_flexPriceShareVRE(ttot,all_regi,all_te) "possible minimum of share of average electricity price that flexible technologies see given the current VRE share [share: 0...1]" +v32_flexPriceShareMin(ttot,all_regi,all_te) "possible minimum of share of average electricity price that flexible technologies see [share: 0...1]" + ; + +*** for checks +parameter +o32_Elh2Share_SeelDem(ttot,all_regi,all_te) "share of technology in total SE electricity demand" +; + + *** EOF ./modules/32_power/IntC/declarations.gms diff --git a/modules/32_power/IntC/equations.gms b/modules/32_power/IntC/equations.gms index b3852cbe6..6cee0068f 100644 --- a/modules/32_power/IntC/equations.gms +++ b/modules/32_power/IntC/equations.gms @@ -247,15 +247,46 @@ q32_limitSolarWind(t,regi)$( (cm_solwindenergyscen = 2) OR (cm_solwindenergyscen 4 * vm_capFac(t,regi,te) ; -*** Calculates the electricity price of flexible technologies: -*** The effective flexible price linearly decreases with VRE share -*** from 1 (at 0% VRE share) to v32_flexPriceShareMin (at 100% VRE). +*** Calculates the minimum electricity price of flexible technologies depending on VRE share +*** at 0% share of flexible technology in total electricity demand (best-case). +*** 100% VRE share will give v32_flexPriceShareMin, +*** 0% VRE share will give 1, i.e. no flexibility benefit or cost +*** and electricity price is annual average electricity price from pm_SEPrice. +*** Linear relation between flexibility benefit or cost between 0-100% VRE share. +q32_flexPriceShareVRE(t,regi,te)$(teFlex(te)).. + v32_flexPriceShareVRE(t,regi,te) + =e= + 1 - +*** maximum flexibility benefit + ( ( 1-v32_flexPriceShareMin(t,regi,te) ) +*** VRE share + * sum(teVRE, vm_shSeEl(t,regi,teVRE))/100 + ) +; + +*** Calculates the electricity price of flexible technologies +*** depending on the share of the flexible technology in total electricity demand +*** At 0% demand share, v32_flexPriceShare = v32_flexPriceShareVRE from above equation. +*** Linear relation between flexibility benefit or cost and based on regression +*** from Langfristszenarien for Germany with hourly electricity system modeling. q32_flexPriceShare(t,regi,te)$(teFlex(te)).. v32_flexPriceShare(t,regi,te) =e= - 1 - (1-v32_flexPriceShareMin(t,regi,te)) * sum(teVRE, vm_shSeEl(t,regi,teVRE))/100 +*** minimum electricity price of flexible technology at this VRE share + v32_flexPriceShareVRE(t,regi,te) +*** linearly scale with share of flexible technology in total electricity demand + + (p32_flexSeelShare_slope(t,regi,te) + * sum(en2en(enty,enty2,te)$(sameas(enty,"seel")), + vm_demSe(t,regi,enty,enty2,te)) + / sum(en2en(enty,enty2,te2)$(sameas(enty,"seel")), + vm_demSe(t,regi,enty,enty2,te2)) + ) ; + + + + *** This balance ensures that the lower electricity prices of flexible technologies are compensated *** by higher electricity prices of inflexible technologies. Inflexible technologies are all technologies *** which are part of teFlexTax but not of teFlex. The weighted sum of diff --git a/modules/32_power/IntC/postsolve.gms b/modules/32_power/IntC/postsolve.gms index f473e235a..27861a115 100644 --- a/modules/32_power/IntC/postsolve.gms +++ b/modules/32_power/IntC/postsolve.gms @@ -20,6 +20,11 @@ loop(t, ); ); +*** some checks +o32_Elh2Share_SeelDem(t,regi,te) = sum(en2en(enty,enty2,te)$(sameas(enty,"seel")), + vm_demSe.l(t,regi,enty,enty2,te)) + / sum(en2en(enty,enty2,te2)$(sameas(enty,"seel")), + vm_demSe.l(t,regi,enty,enty2,te2)); *** EOF ./modules/32_power/IntC/postsolve.gms From 065fb9ddb7d5387733b25624b496baf8e76d441f Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Wed, 21 Feb 2024 13:01:25 +0100 Subject: [PATCH 3/8] add SE tax implementation to add taxes and grid fees for electricity used for electrolysis, tax levels are ramped up by a logistic function with increasing share of electrolysis in total electricity demand, vm_shDemSeel, based on the assumption that electrolyzers will not be charged taxes at low levels of deployment due to their balancing benefits for the power system --- modules/21_tax/on/datainput.gms | 18 +++++++++++ modules/21_tax/on/declarations.gms | 9 ++++++ modules/21_tax/on/equations.gms | 44 ++++++++++++++++++++++++++ modules/21_tax/on/postsolve.gms | 5 +++ modules/21_tax/on/preloop.gms | 3 ++ modules/21_tax/on/presolve.gms | 3 ++ modules/21_tax/on/sets.gms | 13 ++++++++ modules/32_power/IntC/declarations.gms | 2 ++ modules/32_power/IntC/equations.gms | 20 ++++++++---- 9 files changed, 111 insertions(+), 6 deletions(-) diff --git a/modules/21_tax/on/datainput.gms b/modules/21_tax/on/datainput.gms index a8547089c..785f932bb 100644 --- a/modules/21_tax/on/datainput.gms +++ b/modules/21_tax/on/datainput.gms @@ -242,4 +242,22 @@ p21_bio_EF(ttot,all_regi) = 0; p21_bio_EF(ttot,regi_bio_EFTax21) = cm_bioenergy_EF_for_tax * (1/1000 * 12/44) / (sm_EJ_2_TWa); +*** SE Tax +*** SE tax is currently used to tax electricity going into electrolysis. There is a maximum tax rate that is assumed +*** to be the sum of the industry electricity FE tax and the investment cost per unit electricity of the grid (grid fee). +*** There is a ramp up of the SE electricity tax for electrolysis depending on the share of electrolysis in total electricity demand +*** described by a logistic function. This results in low taxes for electrolysis at low shares of electrolysis in the power system +*** as the technology has system benefits in this domain. At higher shares this rapidly increases and converges towards the maximum tax rate. +*** See the equations file for more information on the SE tax. +p21_tau_SE_tax(t,regi,"elh2") = pm_tau_fe_tax(t,regi,"indst","feels") +*** calculate grid fees as levelized cost of CAPEX from tdels, the electricity transmission and distribution grid +*** by annualising the CAPEX and dividing by the capacity factor + + pm_inco0_t(t,regi,"tdels") + * p_teAnnuity("tdels") + / pm_cf(t,regi,"tdels"); + +p21_tau_SE_tax_rampup(t,regi,te,"a") = 0.4; +p21_tau_SE_tax_rampup(t,regi,te,"b") = 10; + + *** EOF ./modules/21_tax/on/datainput.gms diff --git a/modules/21_tax/on/declarations.gms b/modules/21_tax/on/declarations.gms index 91b1de7c3..d70a09c3d 100644 --- a/modules/21_tax/on/declarations.gms +++ b/modules/21_tax/on/declarations.gms @@ -20,6 +20,7 @@ p21_bio_EF(ttot,all_regi) "bioenergy emission factor, which p21_tau_Import(ttot,all_regi,all_enty) "tax on energy imports, currently only works on primary energy levels as those are traded on nash markets [trUSD/TWa]" pm_tau_pe_tax(ttot,all_regi,all_enty) "pe tax path" pm_tau_ces_tax(ttot,all_regi,all_in) "ces production tax to implement CES mark-up cost in a budget-neutral way" +p21_tau_SE_tax(ttot,all_regi,all_te) "maximum tax rate for SE electricity tax, used for taxes on electrolysis" pm_taxrevGHG0(ttot,all_regi) "reference level value of GHG emission tax" pm_taxrevCO2Sector0(ttot,all_regi,emi_sectors) "reference level value of CO2 sector markup tax" @@ -41,6 +42,7 @@ p21_taxemiMkt0(ttot,all_regi,all_emiMkt) "reference level value of co2 e p21_taxrevFlex0(ttot,all_regi) "reference level value of flexibility tax" p21_taxrevImport0(ttot,all_regi,all_enty) "reference level value of import tax" p21_taxrevChProdStartYear0(ttot,all_regi) "reference level value of tax to limit changes compared to reference run in cm_startyear" +p21_taxrevSE0(ttot,all_regi) "reference level value of tax on SE electricity demand" p21_taxrevGHG_iter(iteration,ttot,all_regi) "reference level value of GHG emission tax revenue" p21_taxrevCCS_iter(iteration,ttot,all_regi) "reference level value of CCS tax revenue" @@ -58,6 +60,7 @@ p21_implicitDiscRate_iter(iteration,ttot,all_regi) "reference level valu p21_taxrevFlex_iter(iteration,ttot,all_regi) "reference level value of flexibility tax revenue" p21_taxrevImport_iter(iteration,ttot,all_regi,all_enty) "reference level value of import tax" p21_taxrevChProdStartYear_iter(iteration,ttot,all_regi) "Difference to tax revenues in last iteration for: tax to limit changes compared to reference run in cm_startyear" +p21_taxrevSE_iter(iteration,ttot,all_regi) "Difference to tax revenues in last iteration for: tax on SE electricity demand" p21_CO2TaxSectorMarkup(ttot,all_regi,emi_sectors) "CO2 tax markup in building, industry or transport sector" @@ -67,6 +70,8 @@ p21_tau_CO2_tax_gdx(ttot,all_regi) "tax path from gdx, may overwrite d p21_tau_CO2_tax_gdx_bau(ttot,all_regi) "tax path from gdx, may overwrite default values" p21_implicitDiscRateMarg(ttot,all_regi,all_in) "Difference between the normal discount rate and the implicit discount rate" + +p21_tau_SE_tax_rampup(ttot,all_regi,all_te,teSeTax_coeff) "Paramters of logistic function to describe relationship between SE electricity tax rate and share of technology in total electricity demand" ; @@ -116,11 +121,13 @@ v21_implicitDiscRate(ttot,all_regi) "implicit tax on energy efficie v21_taxemiMkt(ttot,all_regi,all_emiMkt) "tax on greenhouse gas emissions" v21_taxrevImport(ttot,all_regi,all_enty) "tax on energy imports" v21_taxrevChProdStartYear(ttot,all_regi) "tax to limit changes compared to reference run in cm_startyear" +v21_taxrevSE(ttot,all_regi) "tax on SE electricity demand, used for taxes on electrolysis" ; Positive Variable v21_emiALLco2neg(ttot,all_regi) "negative part of total CO2 emissions" v21_emiALLco2neg_slack(ttot,all_regi) "dummy variable to extract negatice CO2 emissions from emiAll" +v21_tau_SE_tax(ttot,all_regi,all_te) "tax rate of tax on SE electricity demand, used for taxes on electrolysis" ; equations @@ -146,6 +153,8 @@ q21_implicitDiscRate(ttot,all_regi) "calculation of the implicit dis q21_taxemiMkt(ttot,all_regi,all_emiMkt) "calculation of specific emission market tax on CO2 emissions" q21_taxrevImport(ttot,all_regi,all_enty) "calculation of import tax" q21_taxrevChProdStartYear(ttot,all_regi) "calculation of tax to limit changes compared to reference run in cm_startyear" +q21_taxrevSE(ttot,all_regi) "calculation of tax on SE electricity demand, used for taxes on electrolysis" +q21_SeTaxRate(ttot,all_regi,all_te) "calculation of SE tax rate, used for taxes on electrolysis" ; *** EOF ./modules/21_tax/on/declarations.gms diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index f8e2ae5e1..c8233b9a3 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -36,6 +36,7 @@ q21_taxrev(t,regi)$(t.val ge max(2010,cm_startyear)).. + v21_taxrevCCS(t,regi) + v21_taxrevNetNegEmi(t,regi) + sum(entyPe, v21_taxrevPE(t,regi,entyPe)) + + v21_taxrevSE(t,regi) + v21_taxrevFE(t,regi) + sum(in, v21_taxrevCES(t,regi,in)) + v21_taxrevResEx(t,regi) @@ -123,6 +124,26 @@ q21_taxrevPE(t,regi,entyPe)$(t.val ge max(2010,cm_startyear)).. v21_taxrevPE(t,regi,entyPe) =e= pm_tau_pe_tax(t,regi,entyPe) * vm_prodPe(t,regi,entyPe) - p21_taxrevPE0(t,regi,entyPe); + +***--------------------------------------------------------------------------- +*' Calculation of SE tax: tax rate times secondary energy times secondary energy demand +*' Typically, energy taxes are accounted on FE level. However, this tax is used to +*' account for taxes and grid fees for the electricity input to electrolysis, which is an SE2SE technology. +***--------------------------------------------------------------------------- + +q21_taxrevSE(t,regi)$( t.val ge max(2010, cm_startyear) ) .. + v21_taxrevSE(t,regi) + =e= + sum(se2se(enty,enty2,te)$(teSeTax(te)), + !! v21_tau_SE_tax is the (endogenous calculated) tax rate, + !! i.e. electricity price increase due to taxes and grid fees + v21_tau_SE_tax(t,regi,te) + * vm_demSe(t,regi,enty,enty2,te) + ) + - p21_taxrevSE0(t,regi) +; + + ***--------------------------------------------------------------------------- *' Calculation of final Energy taxes: effective tax rate (tax - subsidy) times FE use in the specific sector *' Documentation of overall tax approach is above at q21_taxrev. @@ -308,5 +329,28 @@ q21_taxrevChProdStartYear(t,regi)$(t.val ge max(2010,cm_startyear)).. ; +*' This calculates the SE tax rate for electricity going into electrolysis. +*' It contains the final energy tax rate for electricity use in industry and +*' grid fees that are assumed be equal to the investment cost of tdfels. +*' We furthermore assume that these taxes and fees are small at low shares +*' of electrolysis in total electricity demand as electrolysis has power system +*' benefits at low shares. The tax rate increases with increasing share of electrolysis +*' following a logistic curve. It starts at close to zero tax rate for a share o 0%, reaches half +*' of the full tax rate at 10% share and is within 1% of the full tax rate above a 25% share of +*' electrolysis electricity demand within total electricity demand. The parameters +*' to define this functional relationsship are set to in the datainput file. +q21_SeTaxRate(t,regi,te)$(teSeTax(te)).. + v21_tau_SE_tax(t,regi,te) + =e= + p21_tau_SE_tax(t,regi,te) + / ( 1 + + (exp(-p21_tau_SE_tax_rampup(t,regi,te,"a") + * (vm_shDemSeel(t,regi,te) * 100 + - p21_tau_SE_tax_rampup(t,regi,te,"b")) + ) + ) + ) +; + *** EOF ./modules/21_tax/on/equations.gms diff --git a/modules/21_tax/on/postsolve.gms b/modules/21_tax/on/postsolve.gms index 205bb3fe2..ef989de02 100644 --- a/modules/21_tax/on/postsolve.gms +++ b/modules/21_tax/on/postsolve.gms @@ -55,6 +55,10 @@ p21_taxrevFlex0(ttot,regi) = sum(en2en(enty,enty2,te)$(teFlexTax(te)), -vm_flexAdj.l(ttot,regi,te) * vm_demSe.l(ttot,regi,enty,enty2,te)); p21_taxrevImport0(ttot,regi,tradePe) = p21_tau_Import(ttot,regi,tradePe) * pm_pvp(ttot,tradePe) / pm_pvp(ttot,"good") * vm_Mport.l(ttot,regi,tradePe); p21_taxrevChProdStartYear0(t,regi) = sum(en2en(enty,enty2,te), vm_changeProdStartyearCost.l(t,regi,te)$( (t.val gt 2005) AND (t.val eq cm_startyear ) ) ); +p21_taxrevSE0(t,regi) = sum(se2se(enty,enty2,te)$(teSeTax(te)), + v21_tau_SE_tax.l(t,regi,te) + * vm_demSe.l(t,regi,enty,enty2,te)); + *** Save reference level of tax revenues for each iteration p21_taxrevGHG_iter(iteration+1,ttot,regi) = v21_taxrevGHG.l(ttot,regi); @@ -74,6 +78,7 @@ p21_implicitDiscRate_iter(iteration+1,ttot,regi) = v21_implicitDiscRate.l(ttot,r p21_taxrevFlex_iter(iteration+1,ttot,regi) = v21_taxrevFlex.l(ttot,regi); p21_taxrevImport_iter(iteration+1,ttot,regi,tradePe) = v21_taxrevImport.l(ttot,regi,tradePe); p21_taxrevChProdStartYear_iter(iteration+1,t,regi) = v21_taxrevChProdStartYear.l(t,regi); +p21_taxrevSE_iter(iteration+1,t,regi) = v21_taxrevSE.l(t,regi); display p21_taxrevFE_iter; diff --git a/modules/21_tax/on/preloop.gms b/modules/21_tax/on/preloop.gms index 6c9481400..cf6f7e6e5 100644 --- a/modules/21_tax/on/preloop.gms +++ b/modules/21_tax/on/preloop.gms @@ -159,4 +159,7 @@ v21_taxrevImport.l(t,regi,tradePe) = 0; *** initialize taxrevImport v21_taxrevChProdStartYear.l(t,regi) = 0; +*** initialize SE tax rate +v21_tau_SE_tax.l(t,regi,te)=0; + *** EOF ./modules/21_tax/on/preloop.gms diff --git a/modules/21_tax/on/presolve.gms b/modules/21_tax/on/presolve.gms index 57ac621bd..7be050be1 100644 --- a/modules/21_tax/on/presolve.gms +++ b/modules/21_tax/on/presolve.gms @@ -54,5 +54,8 @@ p21_taxrevFlex0(ttot,regi) = sum(en2en(enty,enty2,te)$(teFlexTax(te)), -vm_flexAdj.l(ttot,regi,te) * vm_demSe.l(ttot,regi,enty,enty2,te)); p21_taxrevImport0(ttot,regi,tradePe) = p21_tau_Import(ttot,regi,tradePe) * pm_pvp(ttot,tradePe) / pm_pvp(ttot,"good") * vm_Mport.l(ttot,regi,tradePe); p21_taxrevChProdStartYear0(t,regi) = sum(en2en(enty,enty2,te), vm_changeProdStartyearCost.l(t,regi,te)$( (t.val gt 2005) AND (t.val eq cm_startyear ) ) ); +p21_taxrevSE0(t,regi) = sum(se2se(enty,enty2,te)$(teSeTax(te)), + v21_tau_SE_tax.l(t,regi,te) + * vm_demSe.l(t,regi,enty,enty2,te)); *** EOF ./modules/21_tax/on/presolve.gms diff --git a/modules/21_tax/on/sets.gms b/modules/21_tax/on/sets.gms index 1f73a6a05..aad968914 100644 --- a/modules/21_tax/on/sets.gms +++ b/modules/21_tax/on/sets.gms @@ -15,4 +15,17 @@ $else.regi_bio_EFTax set regi_bio_EFTax21(all_regi) "regions in which an emission-factor-based bioenergy tax is active" / %cm_regi_bioenergy_EFTax% /; $endif.regi_bio_EFTax +Sets +teSeTax(all_te) "all technologies which SE electricity demand tax" +/ +elh2 +/ + +teSeTax_coeff "coefficients of logistic function to describe relationsship between SE tax rate and share of technology in total SE demand" +/ + "a" + "b" +/ +; + *** EOF ./modules/21_tax/on/sets.gms diff --git a/modules/32_power/IntC/declarations.gms b/modules/32_power/IntC/declarations.gms index a514501dd..1697f0c93 100644 --- a/modules/32_power/IntC/declarations.gms +++ b/modules/32_power/IntC/declarations.gms @@ -32,6 +32,7 @@ positive variables v32_testdemSeShare(ttot,all_regi,all_te) "test variable for tech share of SE electricity demand" v32_TotVREshare(ttot,all_regi) "Total VRE share as calculated by summing shSeEl. Unit: Percent" v32_shAddIntCostTotVRE(ttot,all_regi) "Variable containing how much the total VRE share is above the threshold - needed to calculate additional integation costs due to total VRE share." + vm_shDemSeel(ttot,all_regi,all_te) "Share of electricity demand per technology in total electricity demand" ; equations @@ -55,6 +56,7 @@ equations q32_flexPriceBalance(ttot,all_regi) "constraint such that flexible electricity prices balanance to average electricity price" q32_TotVREshare(ttot,all_regi) "calculate total VRE share" q32_shAddIntCostTotVRE(ttot,all_regi) "calculate how much total VRE share is above threshold value" + q32_shDemSeel(ttot,all_regi,all_te) "calculate share of electricity demand per technology in total electricity demand" ; variables diff --git a/modules/32_power/IntC/equations.gms b/modules/32_power/IntC/equations.gms index 6cee0068f..81eb33d13 100644 --- a/modules/32_power/IntC/equations.gms +++ b/modules/32_power/IntC/equations.gms @@ -264,6 +264,18 @@ q32_flexPriceShareVRE(t,regi,te)$(teFlex(te)).. ) ; + +*** Calculate share of electricity demand per technology in total electricity demand +*** Relevant for technologies that see flexibility tax or SE (electricity) taxes. +q32_shDemSeel(t,regi,te)$(teFlex(te) OR teSeTax(te)).. + vm_shDemSeel(t,regi,te) + * sum(en2en(enty,enty2,te2)$(sameas(enty,"seel")), + vm_demSe(t,regi,enty,enty2,te2)) + =e= + sum(en2en(enty,enty2,te)$(sameas(enty,"seel")), + vm_demSe(t,regi,enty,enty2,te)) +; + *** Calculates the electricity price of flexible technologies *** depending on the share of the flexible technology in total electricity demand *** At 0% demand share, v32_flexPriceShare = v32_flexPriceShareVRE from above equation. @@ -275,12 +287,8 @@ q32_flexPriceShare(t,regi,te)$(teFlex(te)).. *** minimum electricity price of flexible technology at this VRE share v32_flexPriceShareVRE(t,regi,te) *** linearly scale with share of flexible technology in total electricity demand - + (p32_flexSeelShare_slope(t,regi,te) - * sum(en2en(enty,enty2,te)$(sameas(enty,"seel")), - vm_demSe(t,regi,enty,enty2,te)) - / sum(en2en(enty,enty2,te2)$(sameas(enty,"seel")), - vm_demSe(t,regi,enty,enty2,te2)) - ) + + p32_flexSeelShare_slope(t,regi,te) + * vm_shDemSeel(t,regi,te) ; From 2089f4132ff060ec07f6418a56ce5ba27acb4fa4 Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Fri, 1 Mar 2024 14:40:24 +0100 Subject: [PATCH 4/8] fix bug that prevented SE tax for electrolysis to include FE electricity tax from pm_tau_fe_tax --- modules/21_tax/on/datainput.gms | 18 ------------------ modules/21_tax/on/preloop.gms | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/modules/21_tax/on/datainput.gms b/modules/21_tax/on/datainput.gms index 785f932bb..a8547089c 100644 --- a/modules/21_tax/on/datainput.gms +++ b/modules/21_tax/on/datainput.gms @@ -242,22 +242,4 @@ p21_bio_EF(ttot,all_regi) = 0; p21_bio_EF(ttot,regi_bio_EFTax21) = cm_bioenergy_EF_for_tax * (1/1000 * 12/44) / (sm_EJ_2_TWa); -*** SE Tax -*** SE tax is currently used to tax electricity going into electrolysis. There is a maximum tax rate that is assumed -*** to be the sum of the industry electricity FE tax and the investment cost per unit electricity of the grid (grid fee). -*** There is a ramp up of the SE electricity tax for electrolysis depending on the share of electrolysis in total electricity demand -*** described by a logistic function. This results in low taxes for electrolysis at low shares of electrolysis in the power system -*** as the technology has system benefits in this domain. At higher shares this rapidly increases and converges towards the maximum tax rate. -*** See the equations file for more information on the SE tax. -p21_tau_SE_tax(t,regi,"elh2") = pm_tau_fe_tax(t,regi,"indst","feels") -*** calculate grid fees as levelized cost of CAPEX from tdels, the electricity transmission and distribution grid -*** by annualising the CAPEX and dividing by the capacity factor - + pm_inco0_t(t,regi,"tdels") - * p_teAnnuity("tdels") - / pm_cf(t,regi,"tdels"); - -p21_tau_SE_tax_rampup(t,regi,te,"a") = 0.4; -p21_tau_SE_tax_rampup(t,regi,te,"b") = 10; - - *** EOF ./modules/21_tax/on/datainput.gms diff --git a/modules/21_tax/on/preloop.gms b/modules/21_tax/on/preloop.gms index cf6f7e6e5..a0808a78c 100644 --- a/modules/21_tax/on/preloop.gms +++ b/modules/21_tax/on/preloop.gms @@ -139,6 +139,24 @@ display pm_tau_fe_sub; display pm_tau_fe_tax; display p21_tau_pe2se_sub, p21_tau_fuEx_sub; +*** SE Tax +*** SE tax is currently used to tax electricity going into electrolysis. There is a maximum tax rate that is assumed +*** to be the sum of the industry electricity FE tax and the investment cost per unit electricity of the grid (grid fee). +*** There is a ramp up of the SE electricity tax for electrolysis depending on the share of electrolysis in total electricity demand +*** described by a logistic function. This results in low taxes for electrolysis at low shares of electrolysis in the power system +*** as the technology has system benefits in this domain. At higher shares this rapidly increases and converges towards the maximum tax rate. +*** See the equations file for more information on the SE tax. +*** Parameter datainput needs to happen here because pm_tau_fe_tax is set in this file and not in the datainput file. +p21_tau_SE_tax(t,regi,"elh2") = pm_tau_fe_tax(t,regi,"indst","feels") +*** calculate grid fees as levelized cost of CAPEX from tdels, the electricity transmission and distribution grid +*** by annualising the CAPEX and dividing by the capacity factor + + pm_inco0_t(t,regi,"tdels") + * p_teAnnuity("tdels") + / pm_cf(t,regi,"tdels"); + +p21_tau_SE_tax_rampup(t,regi,te,"a") = 0.4; +p21_tau_SE_tax_rampup(t,regi,te,"b") = 10; + *LB* initialization of vm_emiMac vm_emiMac.l(ttot,regi,enty) = 0; *LB* initialization of v21_emiALLco2neg From 93c5d02bec1e9f482caacc6ecdeef20541b0ff3f Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Wed, 13 Mar 2024 13:59:15 +0100 Subject: [PATCH 5/8] improve documentation of flex tax and SE tax from hydrogen update --- main.gms | 4 ++-- modules/21_tax/on/equations.gms | 18 ++++++++------- modules/21_tax/on/preloop.gms | 6 ++--- modules/32_power/IntC/datainput.gms | 11 +++++---- modules/32_power/IntC/declarations.gms | 14 +++-------- modules/32_power/IntC/equations.gms | 32 +++++++++++++++----------- modules/32_power/IntC/postsolve.gms | 6 ----- 7 files changed, 43 insertions(+), 48 deletions(-) diff --git a/main.gms b/main.gms index 234fcc629..b72dc32bb 100755 --- a/main.gms +++ b/main.gms @@ -1011,9 +1011,9 @@ parameter cm_PriceDurSlope_elh2 "slope of price duration curve of electrolysis" ; cm_PriceDurSlope_elh2 = 15; !! def = 15 -*' cm_PriceDurSlope_elh2, slope of price duration curve for electrolysis (increase means more flexibility subsidy for electrolysis H2) +*' cm_PriceDurSlope_elh2, slope of price duration curve for electrolysis (increase means more flexibility subsidy for electrolysis H2) *' 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). parameter cm_FlexTaxFeedback "switch deciding whether flexibility tax feedback on buildlings and industry electricity prices is on" ; diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index c8233b9a3..64e75cff3 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -135,8 +135,8 @@ q21_taxrevSE(t,regi)$( t.val ge max(2010, cm_startyear) ) .. v21_taxrevSE(t,regi) =e= sum(se2se(enty,enty2,te)$(teSeTax(te)), - !! v21_tau_SE_tax is the (endogenous calculated) tax rate, - !! i.e. electricity price increase due to taxes and grid fees +*** v21_tau_SE_tax is the (endogenous calculated) tax rate, +*** i.e. electricity price increase due to taxes and grid fees v21_tau_SE_tax(t,regi,te) * vm_demSe(t,regi,enty,enty2,te) ) @@ -286,7 +286,7 @@ q21_taxemiMkt(t,regi,emiMkt)$(t.val ge max(2010,cm_startyear)).. ; ***--------------------------------------------------------------------------- -*' FS: Calculation of tax/subsidy on technologies with inflexible/flexible electricity input +*' Calculation of tax/subsidy on technologies with inflexible/flexible electricity input *' This is to emulate the effect of lower/higher electricity prices in high VRE systems on flexible/inflexible electricity demands. ***--------------------------------------------------------------------------- @@ -305,7 +305,7 @@ q21_taxrevFlex(t,regi)$( t.val ge max(2010, cm_startyear) ) .. ***--------------------------------------------------------------------------- -*' FS: (PE) import tax +*' (PE) import tax *' can be used to place taxes on PE energy imports *' e.g. bioenergy import taxes due to sustainability concerns by importers ***--------------------------------------------------------------------------- @@ -329,20 +329,22 @@ q21_taxrevChProdStartYear(t,regi)$(t.val ge max(2010,cm_startyear)).. ; -*' This calculates the SE tax rate for electricity going into electrolysis. +*' This calculates the SE tax rate for electricity going into electrolysis. *' It contains the final energy tax rate for electricity use in industry and -*' grid fees that are assumed be equal to the investment cost of tdfels. +*' grid fees that are assumed be equal to the investment cost of tdfels. *' We furthermore assume that these taxes and fees are small at low shares *' of electrolysis in total electricity demand as electrolysis has power system *' benefits at low shares. The tax rate increases with increasing share of electrolysis *' following a logistic curve. It starts at close to zero tax rate for a share o 0%, reaches half -*' of the full tax rate at 10% share and is within 1% of the full tax rate above a 25% share of +*' of the full tax rate at 10% share and is within 1% of the full tax rate above a 25% share of *' electrolysis electricity demand within total electricity demand. The parameters -*' to define this functional relationsship are set to in the datainput file. +*' to define this functional relationsship are set to in the preloop file. q21_SeTaxRate(t,regi,te)$(teSeTax(te)).. v21_tau_SE_tax(t,regi,te) =e= +*** maximum electrolysis SE tax rate p21_tau_SE_tax(t,regi,te) +*** logistic ramp-up function depending on electrolysis share in total electricity demand vm_shDemSeel / ( 1 + (exp(-p21_tau_SE_tax_rampup(t,regi,te,"a") * (vm_shDemSeel(t,regi,te) * 100 diff --git a/modules/21_tax/on/preloop.gms b/modules/21_tax/on/preloop.gms index a0808a78c..4ac400dc2 100644 --- a/modules/21_tax/on/preloop.gms +++ b/modules/21_tax/on/preloop.gms @@ -144,9 +144,9 @@ display p21_tau_pe2se_sub, p21_tau_fuEx_sub; *** to be the sum of the industry electricity FE tax and the investment cost per unit electricity of the grid (grid fee). *** There is a ramp up of the SE electricity tax for electrolysis depending on the share of electrolysis in total electricity demand *** described by a logistic function. This results in low taxes for electrolysis at low shares of electrolysis in the power system -*** as the technology has system benefits in this domain. At higher shares this rapidly increases and converges towards the maximum tax rate. -*** See the equations file for more information on the SE tax. -*** Parameter datainput needs to happen here because pm_tau_fe_tax is set in this file and not in the datainput file. +*** as the technology has system benefits in this domain. At higher shares this rapidly increases and converges towards the maximum tax rate. +*** See the equations file of the tax module for more information on the SE tax. +*** Parameter datainput needs to happen here because pm_tau_fe_tax, the final energy tax rate, is set in this file and not in the datainput file. p21_tau_SE_tax(t,regi,"elh2") = pm_tau_fe_tax(t,regi,"indst","feels") *** calculate grid fees as levelized cost of CAPEX from tdels, the electricity transmission and distribution grid *** by annualising the CAPEX and dividing by the capacity factor diff --git a/modules/32_power/IntC/datainput.gms b/modules/32_power/IntC/datainput.gms index 0f341c001..90fd39c88 100644 --- a/modules/32_power/IntC/datainput.gms +++ b/modules/32_power/IntC/datainput.gms @@ -98,13 +98,16 @@ $offtext *** Flexibility Tax Parameter -*** initialize p32_PriceDurSlope parameter +*** 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 + +*** 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(regi,"elh2") = cm_PriceDurSlope_elh2; *** Slope of increase of electricity price for electrolysis with increasing share of electrolysis in power system -*** The value of 1.1 is 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 +*** The value of 1.1 is derived from the regression of the German Langfristzenarien. p32_flexSeelShare_slope(t,regi,"elh2") = 1.1; *** EOF ./modules/32_power/IntC/datainput.gms diff --git a/modules/32_power/IntC/declarations.gms b/modules/32_power/IntC/declarations.gms index 1697f0c93..abe2f4681 100644 --- a/modules/32_power/IntC/declarations.gms +++ b/modules/32_power/IntC/declarations.gms @@ -49,9 +49,9 @@ equations q32_limitSolarWind(tall,all_regi) "limits on fluctuating renewables, only turned on for special EMF27 scenarios" q32_h2turbVREcapfromTestor(tall,all_regi) "calculate capacities of dummy seel<--h2 technology from storXXX technologies" q32_h2turbVREcapfromTestorUp(ttot,all_regi) "constraint h2turbVRE hydrogen turbines to be only built together with storage capacities" - q32_flexAdj(ttot,all_regi,all_te) "calculate flexibility used in flexibility tax for technologies with electricity input" - q32_flexPriceShareMin(ttot,all_regi,all_te) "calculatae miniumum share of average electricity that flexible technologies can see" - q32_flexPriceShareVRE(ttot,all_regi,all_te) "calculatae miniumum share of average electricity that flexible technologies can see given the current VRE share" + q32_flexAdj(ttot,all_regi,all_te) "calculate flexibility benefit or cost per flexible technology to be used by flexibility tax" + q32_flexPriceShareMin(ttot,all_regi,all_te) "calculate miniumum share of average electricity that flexible technologies can see" + q32_flexPriceShareVRE(ttot,all_regi,all_te) "calculate miniumum share of average electricity that flexible technologies can see given the current VRE share" q32_flexPriceShare(ttot,all_regi,all_te) "calculate share of average electricity price that flexible technologies see given a certain VRE share and share of electrolysis in total electricity demand" q32_flexPriceBalance(ttot,all_regi) "constraint such that flexible electricity prices balanance to average electricity price" q32_TotVREshare(ttot,all_regi) "calculate total VRE share" @@ -65,12 +65,4 @@ v32_flexPriceShareVRE(ttot,all_regi,all_te) "possible minimum of share o v32_flexPriceShareMin(ttot,all_regi,all_te) "possible minimum of share of average electricity price that flexible technologies see [share: 0...1]" ; - - -*** for checks -parameter -o32_Elh2Share_SeelDem(ttot,all_regi,all_te) "share of technology in total SE electricity demand" -; - - *** EOF ./modules/32_power/IntC/declarations.gms diff --git a/modules/32_power/IntC/equations.gms b/modules/32_power/IntC/equations.gms index 81eb33d13..3aa98d9e1 100644 --- a/modules/32_power/IntC/equations.gms +++ b/modules/32_power/IntC/equations.gms @@ -227,10 +227,15 @@ q32_limitSolarWind(t,regi)$( (cm_solwindenergyscen = 2) OR (cm_solwindenergyscen ***---------------------------------------------------------------------------- *** This equation calculates the minimal flexible electricity price that flexible technologies (like elh2) can see. It is reached when the VRE share is 100%. -*** It depends on the capacity factor with a hyperbolic function. The equation ensures that by decreasing +*** It depends on the capacity factor with a hyperbolic function. The equation ensures that by decreasing *** capacity factor of flexible technologies (teFlex) these technologies see lower electricity prices given that there is a high VRE share in the power system. +*** Note: By default, capacity factors in REMIND are exogenuous (see bounds file of the power module). +*** In that standard case, the minimum electricity price for electrolysis, v32_flexPriceShareMin, only depends on p32_PriceDurSlope, +*** which is defined by scenario assumptions via the switch cm_PriceDurSlope_elh2. +*** It essentially makes an assumption about how many low electricity price hours electrolysis will run on in future VRE-based power systems. +*** The standard value is derived from data of the German Langfristszenarien (see datainput file). -*** On the derivation of the equation: +*** On the derivation of the equation: *** The formulation assumes a cubic price duration curve. That is, the effective electricity price the flexible technologies sees *** depends on the capacity factor (CF) with a cubic function centered at (0.5,1): *** p32_PriceDurSlope * (CF-0.5)^3 + 1, @@ -247,12 +252,12 @@ q32_limitSolarWind(t,regi)$( (cm_solwindenergyscen = 2) OR (cm_solwindenergyscen 4 * vm_capFac(t,regi,te) ; -*** Calculates the minimum electricity price of flexible technologies depending on VRE share -*** at 0% share of flexible technology in total electricity demand (best-case). -*** 100% VRE share will give v32_flexPriceShareMin, -*** 0% VRE share will give 1, i.e. no flexibility benefit or cost -*** and electricity price is annual average electricity price from pm_SEPrice. -*** Linear relation between flexibility benefit or cost between 0-100% VRE share. +*** Calculates the minimum electricity price of flexible technologies depending on VRE share. +*** 100% VRE share will give v32_flexPriceShareMin, +*** 0% VRE share will give 1, i.e. no flexibility benefit or cost. +*** In the latter case, electricity price is annual average electricity price from pm_SEPrice. +*** Linear relation assumed between flexibility benefit or cost in range of 0-100% VRE share. +*** This parameterizes that flexibility benefits increase in power systems with higher VRE shares. q32_flexPriceShareVRE(t,regi,te)$(teFlex(te)).. v32_flexPriceShareVRE(t,regi,te) =e= @@ -264,9 +269,8 @@ q32_flexPriceShareVRE(t,regi,te)$(teFlex(te)).. ) ; - *** Calculate share of electricity demand per technology in total electricity demand -*** Relevant for technologies that see flexibility tax or SE (electricity) taxes. +*** Relevant for technologies that see flexibility tax or SE (electricity) taxes. q32_shDemSeel(t,regi,te)$(teFlex(te) OR teSeTax(te)).. vm_shDemSeel(t,regi,te) * sum(en2en(enty,enty2,te2)$(sameas(enty,"seel")), @@ -279,8 +283,8 @@ q32_shDemSeel(t,regi,te)$(teFlex(te) OR teSeTax(te)).. *** Calculates the electricity price of flexible technologies *** depending on the share of the flexible technology in total electricity demand *** At 0% demand share, v32_flexPriceShare = v32_flexPriceShareVRE from above equation. -*** Linear relation between flexibility benefit or cost and based on regression -*** from Langfristszenarien for Germany with hourly electricity system modeling. +*** Linear relation between flexibility benefit based on regression +*** from German Langfristszenarien (see datainput file). q32_flexPriceShare(t,regi,te)$(teFlex(te)).. v32_flexPriceShare(t,regi,te) =e= @@ -294,12 +298,12 @@ q32_flexPriceShare(t,regi,te)$(teFlex(te)).. - +*** Note: This equation is not active by default. This means that there is no change in electricity prices for inflexible technologies. +*** The equation is only active if cm_FlexTaxFeedback = 1. *** This balance ensures that the lower electricity prices of flexible technologies are compensated *** by higher electricity prices of inflexible technologies. Inflexible technologies are all technologies *** which are part of teFlexTax but not of teFlex. The weighted sum of *** flexible/inflexible electricity prices (v32_flexPriceShare) and electricity demand must be one. -*** Note: this is only on if cm_FlexTaxFeedback = 1. Otherwise, there is no change in electricity prices for inflexible technologies. q32_flexPriceBalance(t,regi)$(cm_FlexTaxFeedback eq 1).. sum(en2en(enty,enty2,te)$(teFlexTax(te)), vm_demSe(t,regi,enty,enty2,te)) diff --git a/modules/32_power/IntC/postsolve.gms b/modules/32_power/IntC/postsolve.gms index 27861a115..a2a0a76e0 100644 --- a/modules/32_power/IntC/postsolve.gms +++ b/modules/32_power/IntC/postsolve.gms @@ -20,11 +20,5 @@ loop(t, ); ); -*** some checks -o32_Elh2Share_SeelDem(t,regi,te) = sum(en2en(enty,enty2,te)$(sameas(enty,"seel")), - vm_demSe.l(t,regi,enty,enty2,te)) - / sum(en2en(enty,enty2,te2)$(sameas(enty,"seel")), - vm_demSe.l(t,regi,enty,enty2,te2)); - *** EOF ./modules/32_power/IntC/postsolve.gms From 33edeec963da2cb0ae73fb0340e28bf0ead813b2 Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Wed, 13 Mar 2024 15:55:14 +0100 Subject: [PATCH 6/8] fix code check errors --- core/datainput.gms | 4 ++-- core/declarations.gms | 2 +- modules/21_tax/off/not_used.txt | 3 +++ modules/21_tax/on/preloop.gms | 2 +- modules/32_power/DTcoup/not_used.txt | 1 + modules/32_power/RLDC/not_used.txt | 1 + 6 files changed, 9 insertions(+), 4 deletions(-) diff --git a/core/datainput.gms b/core/datainput.gms index fb78f50ad..67310eb18 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -811,9 +811,9 @@ loop(regi, *RP* calculate annuity of a technology p_discountedLifetime(te) = sum(opTimeYr, (sum(regi, pm_omeg(regi,opTimeYr,te))/sum(regi,1)) / 1.06**opTimeYr.val ); -p_teAnnuity(te) = 1/p_discountedLifetime(te) ; +pm_teAnnuity(te) = 1/p_discountedLifetime(te) ; -display p_discountedLifetime, p_teAnnuity; +display p_discountedLifetime, pm_teAnnuity; *** read in data on Nuclear capacities used as bound on vm_cap.fx("2015",regi,"tnrs","1"), vm_deltaCap.fx("2020",regi,"tnrs","1") and vm_deltaCap.up("2025" and "2030") parameter pm_NuclearConstraint(ttot,all_regi,all_te) "parameter with the real-world capacities, construction and plans" diff --git a/core/declarations.gms b/core/declarations.gms index eaeac341c..31c26cf98 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -307,7 +307,7 @@ p_share_seh2_s(ttot,all_regi) "share of hydrogen used for p_share_seel_s(ttot,all_regi) "Share of electricity used for stationary sector (feels). [0..1]" p_discountedLifetime(all_te) "Sum over the discounted (@6%) depreciation factor (omega)" -p_teAnnuity(all_te) "Annuity factor of a technology" +pm_teAnnuity(all_te) "Annuity factor of a technology" ; diff --git a/modules/21_tax/off/not_used.txt b/modules/21_tax/off/not_used.txt index 239fd4d83..6199f444e 100644 --- a/modules/21_tax/off/not_used.txt +++ b/modules/21_tax/off/not_used.txt @@ -70,3 +70,6 @@ vm_costInvTeDir,input,only needed if tax is on vm_costInvTeAdj,input,only needed if tax is on pm_cintraw,input,only needed if tax is on pm_gdp,input,only needed if tax is on +pm_cf,input,only needed if tax is on +vm_shDemSeel,input,only needed if tax is on +pm_teAnnuity,input,only needed if tax is on diff --git a/modules/21_tax/on/preloop.gms b/modules/21_tax/on/preloop.gms index 2742b0f86..62b81c001 100644 --- a/modules/21_tax/on/preloop.gms +++ b/modules/21_tax/on/preloop.gms @@ -151,7 +151,7 @@ p21_tau_SE_tax(t,regi,"elh2") = p21_tau_fe_tax(t,regi,"indst","feels") *** calculate grid fees as levelized cost of CAPEX from tdels, the electricity transmission and distribution grid *** by annualising the CAPEX and dividing by the capacity factor + pm_inco0_t(t,regi,"tdels") - * p_teAnnuity("tdels") + * pm_teAnnuity("tdels") / pm_cf(t,regi,"tdels"); p21_tau_SE_tax_rampup(t,regi,te,"a") = 0.4; diff --git a/modules/32_power/DTcoup/not_used.txt b/modules/32_power/DTcoup/not_used.txt index 50ddbe1c0..374a11820 100644 --- a/modules/32_power/DTcoup/not_used.txt +++ b/modules/32_power/DTcoup/not_used.txt @@ -15,3 +15,4 @@ cm_emiscen,input,questionnaire cm_ccapturescen,input,questionnaire pm_boundCapCCS,input,questionnaire pm_cap0,input,questionnaire +vm_shDemSeel,input,only used in IntC realization diff --git a/modules/32_power/RLDC/not_used.txt b/modules/32_power/RLDC/not_used.txt index a2d124323..a80a3d9a4 100644 --- a/modules/32_power/RLDC/not_used.txt +++ b/modules/32_power/RLDC/not_used.txt @@ -11,3 +11,4 @@ cm_VRE_supply_assumptions,input,questionnaire cm_flex_tax,input,questionnaire cm_PriceDurSlope_elh2,input,questionnaire cm_FlexTaxFeedback,input,questionnaire +vm_shDemSeel,input,only used in IntC realization From 7dfb79149d9b9a02ddd1df7606c98efd4e54b8cd Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Wed, 13 Mar 2024 19:58:08 +0100 Subject: [PATCH 7/8] improve documentation on electrolysis technology --- core/sets.gms | 2 +- modules/32_power/IntC/bounds.gms | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/core/sets.gms b/core/sets.gms index be4fb3110..4e64968aa 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -204,7 +204,7 @@ all_te "all energy technologies, including from modules" solhe "solar thermal heat generation" tnrs "thermal nuclear reactor (simple structure)" fnrs "fast nuclear reactor (simple structure)" - elh2 "hydrogen elecrolysis" + elh2 "hydrogen electrolysis, using grid electricity" h2turb "hydrogen turbine for electricity production" elh2VRE "dummy technology: hydrogen electrolysis; to demonstrate the capacities and SE flows inside the storXXX technologies" h2turbVRE "dummy technology: hydrogen turbine for electricity production; to demonstrate the capacities and SE flows inside the storXXX technologies" diff --git a/modules/32_power/IntC/bounds.gms b/modules/32_power/IntC/bounds.gms index a6a126b7f..ccea911d9 100644 --- a/modules/32_power/IntC/bounds.gms +++ b/modules/32_power/IntC/bounds.gms @@ -34,9 +34,11 @@ if ( cm_flex_tax eq 1, vm_capFac.lo(t,regi,teFlexTax)$(t.val ge 2010) = 0.1; vm_capFac.up(t,regi,teFlexTax)$(t.val ge 2010) = pm_cf(t,regi,teFlexTax); else -*** if flexibility tax feedback is off, only flexibliity tax benefit for flexible technologies and 0.5 capacity factor - vm_capFac.fx(t,regi,teFlex)$(t.val ge 2010) = 0.38; -*** electricity price of inflexible technologies the same w/o feedback +*** if flexibility tax feedback is off, flexibility tax benefit only for flexible technologies and capacity factors fixed. +*** Assume capacity factor of flexible electrolysis to be 0.38. +*** The value based on data from German Langfristszenarien (see flexibility tax section in datainput file). + vm_capFac.fx(t,regi,"elh2")$(t.val ge 2010) = 0.38; +*** electricity price of inflexible technologies the same as w/o feedback v32_flexPriceShare.fx(t,regi,te)$(teFlexTax(te) AND NOT(teFlex(te))) = 1; ); ); From e547f99ff9064938008d270e119d4997bdf381d8 Mon Sep 17 00:00:00 2001 From: Felix Schreyer Date: Wed, 13 Mar 2024 20:29:03 +0100 Subject: [PATCH 8/8] update changelog for H2 changes --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8b18c320..026b7dc8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - **core** change of preference parameters and associated computation of interest rates/mark ups - **scripts** add script to automatically check project summations from piamInterfaces [[#1587](https://github.com/remindmodel/remind/pull/1587)] +- **32_power** extend and reparameterize flexibility tax implementation for electrolysis for hydrogen production +- **21_tax** add SE tax on electricity going into electrolysis for hydrogen production ### fixed - fixed weights of energy carriers in `pm_IndstCO2Captured`