diff --git a/CITATION.cff b/CITATION.cff index f2145643344bc9f7da6964ed4954edb95aea97b0..60fce63b18f6a584a2fb85f0cfa7dd618b33fb59 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -26,7 +26,8 @@ authors: affiliation: "Potsdam Institute for Climate Impact Research" - family-names: Dirnaichner - given-names: Alois + given-names: Alois + orcid: https://orcid.org/0000-0002-3240-2608 affiliation: "Potsdam Institute for Climate Impact Research" - family-names: Giannousakis diff --git a/core/equations.gms b/core/equations.gms index a9647754c0bffa6573ca78bb749d4db0c48b69bc..36fb20aaaf8d4be66be469fe85d0064819b2e4b9 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -172,10 +172,11 @@ $endif ***--------------------------------------------------------------------------- *' Transformation from secondary to final energy: ***--------------------------------------------------------------------------- -q_transSe2fe(t,regi,se2fe(enty,enty2,te)).. - pm_eta_conv(t,regi,te) * vm_demSe(t,regi,enty,enty2,te) - =e= - vm_prodFe(t,regi,enty,enty2,te) +q_transSe2fe(t,regi,se2fe(entySE,entyFE,te)) .. + pm_eta_conv(t,regi,te) + * vm_demSE(t,regi,entySE,entyFE,te) + =e= + vm_prodFE(t,regi,entySE,entyFE,te) ; @@ -506,34 +507,35 @@ q_emiTeDetail(t,regi,enty,enty2,te,enty3)$( emi2te(enty,enty2,te,enty3) *' Total energy-emissions: ***-------------------------------------------------- *mh calculate total energy system emissions for each region and timestep: -q_emiTe(t,regi,emiTe(enty)).. +q_emiTe(t,regi,emiTe(enty)) .. vm_emiTe(t,regi,enty) =e= -*** emissions from fuel combustion + !! emissions from fuel combustion sum(emi2te(enty2,enty3,te,enty), vm_emiTeDetail(t,regi,enty2,enty3,te,enty) ) -*** emissions from non-conventional fuel extraction + !! emissions from non-conventional fuel extraction + sum(emi2fuelMine(enty,enty2,rlf), p_cint(regi,enty,enty2,rlf) * vm_fuExtr(t,regi,enty2,rlf) )$( c_cint_scen eq 1 ) -*** emissions from conventional fuel extraction - + sum(pe2rlf(enty3,rlf2),sum(enty2, - (p_cintraw(enty2) - * pm_fuExtrOwnCons(regi, enty2, enty3) - * vm_fuExtr(t,regi,enty3,rlf2) - )$(pm_fuExtrOwnCons(regi, enty, enty2) gt 0) - )) -*** Industry CCS emissions + !! emissions from conventional fuel extraction + + sum((pe2rlf(enty3,rlf2),enty2)$( pm_fuExtrOwnCons(regi,enty,enty2) gt 0 ), + p_cintraw(enty2) + * pm_fuExtrOwnCons(regi,enty2,enty3) + * vm_fuExtr(t,regi,enty3,rlf2) + ) + !! Industry CCS emissions - sum(emiMac2mac(emiInd37_fuel,enty2), vm_emiIndCCS(t,regi,emiInd37_fuel) )$( sameas(enty,"co2") ) - -*** LP, Valve from cco2 capture step, to mangage if capture capacity and CCU/CCS capacity don't have the same lifetime + !! Valve from cco2 capture step, to mangage if capture capacity and CCU/CCS + !! capacity don't have the same lifetime + v_co2capturevalve(t,regi)$( sameas(enty,"co2") ) -*** JS CO2 from short-term CCU - + sum(teCCU2rlf(te2,rlf), vm_co2CCUshort(t,regi,"cco2","ccuco2short",te2,rlf) ) + !! CO2 from short-term CCU + + sum(teCCU2rlf(te2,rlf), + vm_co2CCUshort(t,regi,"cco2","ccuco2short",te2,rlf) + ) ; ***------------------------------------------------------ diff --git a/core/input/generisdata_tech_SSP5.prn b/core/input/generisdata_tech_SSP5.prn index 8c7e3e25d92f8dff25c01816de1153497825f5ba..0aa6c1365cb6a5a8d25a3a4bcfcd58d70e79ee3a 100644 --- a/core/input/generisdata_tech_SSP5.prn +++ b/core/input/generisdata_tech_SSP5.prn @@ -62,7 +62,7 @@ mix0 0.00 0.03 eta 1.00 0.95 0.35 0.72 0.39 0.28 0.55 0.61 0.55 0.36 0.55 0.93 0.40 0.41 omf 0.03 0.04 0.04 0.04 0.04 0.04 0.10 0.10 0.07 0.11 0.05 0.04 0.04 omv 30.11 25.00 31.50 50.50 10.90 10.60 10.60 97.27 38.99 5.05 10.60 -lifetime 20 35 40 40 40 40 40 35 35 35 20 20 35 35 +lifetime 35 35 40 40 40 40 40 35 35 35 20 20 35 35 + geohdr geohe hydro wind spv solhe csp tech_stat 1 diff --git a/core/sets.gms b/core/sets.gms index dedd238121fbcc484ea38dcf2ab25363d8a450ba..6492599581e613188efb219efe1f57047e47e927 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -1939,23 +1939,16 @@ steps "iterator for MAC steps" *** Helpful constructs: alias ***----------------------------------------------------------------------------- ***----------------------------------------------------------------------------- -alias(t,t2); -alias(t,t3); -alias(tall,tall2); -alias(tall,tall3); +alias(t,t2,t3); +alias(tall,tall2,tall3); alias(ttot,ttot2); alias(opTimeYr,opTimeYr2); alias(teVRE,teVRE2); alias(teLoc,teLoc2); alias(all_te,all_te2); -alias(te,te2); +alias(te,te2,te3); alias(all_enty,all_enty2); -alias(enty,enty2); -alias(enty,enty3); -alias(enty,enty4); -alias(enty,enty5); -alias(enty,enty6); -alias(enty,enty7); +alias(enty,enty2,enty3,enty4,enty5,enty6,enty7); alias(entyPE,entyPE2); alias(entySe,entySe2); alias(entyFe,entyFe2); @@ -2522,5 +2515,6 @@ es2ppfen(all_esty,all_in) "matching ES in ESM to ppfEn in MACRO" alias(ccs2te,ccs2te2); alias(pe2se,pe2se2); +alias(se2fe,se2fe2); *** EOF ./core/sets.gms diff --git a/doc/images/MAC_costs.png b/doc/images/MAC_costs.png new file mode 100644 index 0000000000000000000000000000000000000000..b4bdb721a65356466986fb440e55c29b5b6097f7 Binary files /dev/null and b/doc/images/MAC_costs.png differ diff --git a/modules/37_industry/fixed_shares/equations.gms b/modules/37_industry/fixed_shares/equations.gms index 84c42339f9e49a01da8dda06ec1e6e6478ab12dd..f0b827491e6743609be483e67463a30b9aca464e 100644 --- a/modules/37_industry/fixed_shares/equations.gms +++ b/modules/37_industry/fixed_shares/equations.gms @@ -60,9 +60,25 @@ q37_cementCCS(ttot,regi)$( ttot.val ge cm_startyear *' Industry CCS costs (by subsector) are equal to the integral below the MAC *' cost curve. -*' $$C_j = E_{\text{base},j} p \sum_{i = 1}^{n} \left(q_{n,j} - q_{i,j}\right)$$ -*' with $E_\text{base}$ the baseline emissions, $p$ the price step, and $q_i$ -*' the abatement fraction at step $i$ on the MAC. +*' For the calculation, consider this figure: +*'  +*' To make the calculations involving MAC curves leaner, they are discretised +*' into 5 $/tC steps (parameter `sm_dmac`) and transformed into step-wise +*' curves. The parameter `pm_macStep` holds the current step on the MAC curve +*' the model is on (given the CO~2~ price of the last iteration), and +*' `pm_macAbat` holds the abatement level (as a fraction) on that step. The +*' emission abatement equals the area under the MAC curve (turqoise area in the +*' figure). To calculate it, `pm_macStep` is multiplied by `pm_macAbat` (the +*' horizontal and vertical lines enclosing the colourd rectangle in the +*' figure). The `sum(steps$( ord(steps) eq pm_macStep ... )` part simply +*' selects the right step within the MAC curve. From this product (rectangle), +*' the area above the MAC curve (pink) is subtractad. To calculate it, the +*' abatement level at each MAC step up to and including the current step is +*' summed up. The area is subdivided into `pm_macStep` rectangles of height +*' `1 sm_dmac` and width `pm_macAbat(steps)` (which is zero for the first $n$ +*' steps at which price level no abatement is available). +*' Multiplying the area under the curve with the step width `sm_dmac` and the +*' baseline emissions (before mitigation) converts the units to $/tC and GtC. q37_IndCCSCost(ttot,regi,emiInd37)$( ttot.val ge cm_startyear ) .. vm_IndCCSCost(ttot,regi,emiInd37) =e= diff --git a/modules/37_industry/fixed_shares/postsolve.gms b/modules/37_industry/fixed_shares/postsolve.gms index 50eb92fa517a14fcf44f68226523c17b4fda2d7f..314d19e086469f72336934b500d1e755bafb1edf 100644 --- a/modules/37_industry/fixed_shares/postsolve.gms +++ b/modules/37_industry/fixed_shares/postsolve.gms @@ -17,6 +17,12 @@ loop (enty$( sameas(enty,"co2") OR sameas(enty,"cco2") ), * p37_shIndFE(regi,in,secInd37) ) * p37_fctEmi(entyFE) + !! share of SE in FE production + * ( vm_prodFE.l(ttot,regi,entySE,entyFE,te2) + / sum(se2fe2(entySE2,entyFE,te3), + vm_prodFE.l(ttot,regi,entySE2,entyFE,te3) + ) + ) ) !! share of PE in SE production * ( vm_prodSE.l(ttot,regi,entyPE,entySE,te)