*** | (C) 2006-2019 Potsdam Institute for Climate Impact Research (PIK) *** | authors, and contributors see CITATION.cff file. This file is part *** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of *** | AGPL-3.0, you are granted additional permissions described in the *** | REMIND License Exception, version 1.0 (see LICENSE file). *** | Contact: remind@pik-potsdam.de *** SOF ./core/equations.gms ***--------------------------------------------------------------------------- ***--------------------------------------------------------------------------- ***--------------------------------------------------------------------------- *** DEFINITION OF MODEL EQUATIONS: ***--------------------------------------------------------------------------- ***--------------------------------------------------------------------------- ***--------------------------------------------------------------------------- *' Fuel costs are associated with the use of exhaustible primary energy (fossils, uranium) and biomass. ***--------------------------------------------------------------------------- q_costFu(t,regi).. v_costFu(t,regi) =e= vm_costFuBio(t,regi) + sum(peEx(enty), vm_costFuEx(t,regi,enty)) ; ***--------------------------------------------------------------------------- *' Specific investment costs of learning technologies are a model-endogenous variable; *' those of non-learning technologies are fixed to constant values. *' Total investment costs are the product of specific costs and capacity additions plus adjustment costs. ***--------------------------------------------------------------------------- q_costInv(t,regi).. v_costInv(t,regi) =e= sum(en2en(enty,enty2,te), v_costInvTeDir(t,regi,te) + v_costInvTeAdj(t,regi,te)$teAdj(te) ) + sum(teNoTransform, v_costInvTeDir(t,regi,teNoTransform) + v_costInvTeAdj(t,regi,teNoTransform)$teAdj(teNoTransform) ) ; *RP* 2010-05-10 adjustment costs q_costInvTeDir(t,regi,te).. v_costInvTeDir(t,regi,te) =e= vm_costTeCapital(t,regi,te) * sum(te2rlf(te,rlf), vm_deltaCap(t,regi,te,rlf) ) ; *RP* 2011-12-01 remove global adjustment costs to decrease runtime, only keep regional adjustment costs. Maybe change in the future. v_adjFactorGlob.fx(t,regi,te) = 0; q_costInvTeAdj(t,regi,teAdj).. v_costInvTeAdj(t,regi,teAdj) =e= vm_costTeCapital(t,regi,teAdj) * ( (p_adj_coeff(t,regi,teAdj) * v_adjFactor(t,regi,teAdj)) + (p_adj_coeff_glob(teAdj) * v_adjFactorGlob(t,regi,teAdj) ) ) ; ***--------------------------------------------------------------------------- *' Operation and maintenance resut form costs maintenance of existing facilities according to their capacity and *' operation of energy transformations according to the amount of produced secondary and final energy. ***--------------------------------------------------------------------------- q_costOM(t,regi).. v_costOM(t,regi) =e= sum(en2en(enty,enty2,te), pm_data(regi,"omf",te) * sum(te2rlf(te,rlf), vm_costTeCapital(t,regi,te) * vm_cap(t,regi,te,rlf) ) + pm_data(regi,"omv",te) * (vm_prodSe(t,regi,enty,enty2,te)$entySe(enty2) + vm_prodFe(t,regi,enty,enty2,te)$entyFe(enty2)) ) + sum(teNoTransform(te), pm_data(regi,"omf",te) * sum(te2rlf(te,rlf), vm_costTeCapital(t,regi,te) * vm_cap(t,regi,te,rlf) ) ) + vm_omcosts_cdr(t,regi) ; ***--------------------------------------------------------------------------- *' Energy balance equations equate the production of and demand for each primary, secondary and final energy. *' The balance equation for primary energy equals supply of primary energy demand on primary energy. ***--------------------------------------------------------------------------- q_balPe(t,regi,entyPe(enty)).. vm_prodPe(t,regi,enty) + p_macPE(t,regi,enty) =e= sum(pe2se(enty,enty2,te), vm_demPe(t,regi,enty,enty2,te)) *** through p_datacs one could correct for non-energetic use, e.g. bitumen for roads; set to 0 in current version, as the total oil value already contains the non-energy use part + p_datacs(regi,enty) / 0.95 ; ***--------------------------------------------------------------------------- *' The secondary energy balance comprises the following terms (except power, defined on module): *' 1. Secondary energy can be produced from primary or (another type of) secondary energy. *' 2. Own consumption of secondary energy occurs from the production of secondary and final energy, and from CCS technologies. *'Own consumption is calculated as the product of the respective production and a negative coefficient. *'The mapping defines possible combinations: the first two enty types of the mapping define the underlying *'transformation process, the 3rd argument the technology, and the 4th argument specifies the consumed energy type. *' 3. Couple production is modeled as own consumption, but with a positive coefficient. *' 4. Secondary energy can be demanded to produce final or (another type of) secondary energy. ***--------------------------------------------------------------------------- q_balSe(t,regi,enty2)$( entySE(enty2) AND (NOT (sameas(enty2,"seel"))) ).. sum(pe2se(enty,enty2,te), vm_prodSe(t,regi,enty,enty2,te)) + sum(se2se(enty,enty2,te), vm_prodSe(t,regi,enty,enty2,te)) + sum(pc2te(enty,entySE(enty3),te,enty2), pm_prodCouple(regi,enty,enty3,te,enty2) * vm_prodSe(t,regi,enty,enty3,te) ) + sum(pc2te(enty4,entyFE(enty5),te,enty2), pm_prodCouple(regi,enty4,enty5,te,enty2) * vm_prodFe(t,regi,enty4,enty5,te) ) + sum(pc2te(enty,enty3,te,enty2), sum(teCCS2rlf(te,rlf), pm_prodCouple(regi,enty,enty3,te,enty2) * vm_co2CCS(t,regi,enty,enty3,te,rlf) ) ) *** add (reused gas from waste landfills) to segas to not account for CO2 *** emissions - it comes from biomass + ( sm_MtCH4_2_TWa * ( vm_macBase(t,regi,"ch4wstl") - vm_emiMacSector(t,regi,"ch4wstl") ) )$( sameas(enty2,"segabio") AND t.val gt 2005 ) + sum(prodSeOth2te(enty2,te), vm_prodSeOth(t,regi,enty2,te) ) =e= sum(se2fe(enty2,enty3,te), vm_demSe(t,regi,enty2,enty3,te)) + sum(se2se(enty2,enty3,te), vm_demSe(t,regi,enty2,enty3,te)) + sum(demSeOth2te(enty2,te), vm_demSeOth(t,regi,enty2,te) ) ; ***--------------------------------------------------------------------------- *' Taking the technology-specific transformation eficiency into account, *' the equations describe the transformation of an energy type to another type. *' Depending on the detail of the technology representation, the transformation technology's eficiency *' can depend either only on the current year or on the year when a specific technology was built. *' Transformation from primary to secondary energy: ***--------------------------------------------------------------------------- *MLB 05/2008* correction factor included to avoid pre-triangular infeasibility q_transPe2se(ttot,regi,pe2se(enty,enty2,te))$(ttot.val ge cm_startyear).. vm_demPe(ttot,regi,enty,enty2,te) =e= (1 / pm_eta_conv(ttot,regi,te) * vm_prodSe(ttot,regi,enty,enty2,te))$teEtaConst(te) + ***cb early retirement for some fossil technologies (1 - vm_capEarlyReti(ttot,regi,te)) * sum(teSe2rlf(teEtaIncr(te),rlf), vm_capFac(ttot,regi,te) * ( sum(opTimeYr2te(te,opTimeYr)$(tsu2opTimeYr(ttot,opTimeYr) AND (opTimeYr.val gt 1) ), pm_ts(ttot-(pm_tsu2opTimeYr(ttot,opTimeYr)-1)) / pm_dataeta(ttot-(pm_tsu2opTimeYr(ttot,opTimeYr)-1),regi,te) * pm_omeg(regi,opTimeYr+1,te) * vm_deltaCap(ttot-(pm_tsu2opTimeYr(ttot,opTimeYr)-1),regi,te,rlf) ) *LB* add half of the last time step ttot + pm_dt(ttot)/2 / pm_dataeta(ttot,regi,te) * pm_omeg(regi,"2",te) * vm_deltaCap(ttot,regi,te,rlf) $ifthen setglobal END2110 - (pm_ts(ttot) / pm_dataeta(ttot,regi,te) * pm_omeg(regi,"11",te) * 0.5*vm_deltaCap(ttot,regi,te,rlf))$(ord(ttot) eq card(ttot)) $endif ) ); ***--------------------------------------------------------------------------- *' Transformation from secondary to final energy: ***--------------------------------------------------------------------------- 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) ; ***--------------------------------------------------------------------------- *' Transformation between secondary energy types: ***--------------------------------------------------------------------------- q_transSe2se(t,regi,se2se(enty,enty2,te)).. pm_eta_conv(t,regi,te) * vm_demSe(t,regi,enty,enty2,te) =e= vm_prodSe(t,regi,enty,enty2,te); ***--------------------------------------------------------------------------- *' Final energy pathway I: Direct hand-over of FEs to CES. ***--------------------------------------------------------------------------- *MLB 5/2008* add correction for initial imbalance of fehes qm_balFeForCesAndEs(t,regi,entyFe)$(feForCes(entyFe) OR feForEs(entyFe)) .. sum(se2fe(entySe,entyFe,te), vm_prodFE(t,regi,entySe,entyFe,te)) =e= *** FE Pathway I: Direct hand-over of FEs to CES sum(fe2ppfEn(entyFe,ppfEn), vm_cesIO(t,regi,ppfEn) + pm_cesdata(t,regi,ppfEn,"offset_quantity") ) *** FE Pathway III: Energy service layer (prodFe -> demFeForEs -> prodEs) + sum(fe2es(entyFe,esty,teEs), vm_demFeForEs(t,regi,entyFe,esty,teEs) ) *** Other demand which is not Pathway II + vm_otherFEdemand(t,regi,entyFe) ; ***--------------------------------------------------------------------------- *' Final energy pathway II: Useful energy layer (prodFe -> demFe -> prodUe), with capacaity tracking. ***--------------------------------------------------------------------------- *' Final energy balance q_balFe(t,regi,entyFe)$feForUe(entyFe).. sum(se2fe(enty,entyFe,te), vm_prodFe(t,regi,enty,entyFe,te) ) *** couple production from FE to ES for heavy duty vehicles + sum(pc2te(entyFE2,entyUe,te,entyFE), pm_prodCouple(regi,entyFE2,entyUe,te,entyFE) * vm_prodUe(t,regi,entyFE2,entyUe,te) ) =e= sum(fe2ue(entyFe,entyUe,te), v_demFe(t,regi,entyFe,entyUe,te) ) + vm_otherFEdemand(t,regi,entyFe) ; *' Transformation from final energy to useful energy: q_transFe2Ue(t,regi,fe2ue(entyFe,entyUe,te)).. pm_eta_conv(t,regi,te) * v_demFe(t,regi,entyFe,entyUe,te) =e= vm_prodUe(t,regi,entyFe,entyUe,te); *' Hand-over to CES: q_esm2macro(t,regi,in)$ppfenFromUe(in).. vm_cesIO(t,regi,in) + pm_cesdata(t,regi,in,"offset_quantity") =e= *** all entyFe that are first transformed into entyUe and then fed into the CES production function sum(fe2ue(entyFe,entyUe,te)$ue2ppfen(entyUe,in), vm_prodUe(t,regi,entyFe,entyUe,te)) ; *' Definition of capacity constraints for FE to ES transformation: q_limitCapUe(t,regi,fe2ue(entyFe,entyUe,te)).. vm_prodUe(t,regi,entyFe,entyUe,te) =l= sum(teue2rlf(te,rlf), vm_capFac(t,regi,te) * vm_cap(t,regi,te,rlf) ) ; ***--------------------------------------------------------------------------- *' FE Pathway III: Energy service layer (prodFe -> demFeForEs -> prodEs), no capacity tracking. ***--------------------------------------------------------------------------- *' Transformation from final energy to useful energy: q_transFe2Es(t,regi,fe2es(entyFe,esty,teEs)).. pm_fe2es(t,regi,teEs) * vm_demFeForEs(t,regi,entyFe,esty,teEs) =e= v_prodEs(t,regi,entyFe,esty,teEs); *' Hand-over to CES: q_es2ppfen(t,regi,in)$ppfenFromEs(in).. vm_cesIO(t,regi,in) + pm_cesdata(t,regi,in,"offset_quantity") =e= sum(fe2es(entyFe,esty,teEs)$es2ppfen(esty,in), v_prodEs(t,regi,entyFe,esty,teEs)) ; *' Shares of FE carriers w.r.t. a CES node: q_shFeCes(t,regi,entyFe,in,teEs)$feViaEs2ppfen(entyFe,in,teEs).. sum(fe2es(entyFe2,esty,teEs2)$es2ppfen(esty,in), vm_demFeForEs(t,regi,entyFe2,esty,teEs2)) * pm_shFeCes(t,regi,entyFe,in,teEs) =e= sum(fe2es(entyFe,esty,teEs)$es2ppfen(esty,in), vm_demFeForEs(t,regi,entyFe,esty,teEs)) ; ***--------------------------------------------------------------------------- *' Definition of capacity constraints for primary energy to secondary energy transformation: ***-------------------------------------------------------------------------- q_limitCapSe(t,regi,pe2se(enty,enty2,te)).. vm_prodSe(t,regi,enty,enty2,te) =e= sum(teSe2rlf(te,rlf), vm_capFac(t,regi,te) * pm_dataren(regi,"nur",rlf,te) * vm_cap(t,regi,te,rlf) )$(NOT teReNoBio(te)) + sum(teRe2rlfDetail(te,rlf), ( 1$teRLDCDisp(te) + pm_dataren(regi,"nur",rlf,te)$(NOT teRLDCDisp(te)) ) * vm_capFac(t,regi,te) * vm_capDistr(t,regi,te,rlf) )$(teReNoBio(te)) ; ***---------------------------------------------------------------------------- *' Definition of capacity constraints for secondary energy to secondary energy transformation: ***--------------------------------------------------------------------------- q_limitCapSe2se(t,regi,se2se(enty,enty2,te)).. vm_prodSe(t,regi,enty,enty2,te) =e= sum(teSe2rlf(te,rlf), vm_capFac(t,regi,te) * pm_dataren(regi,"nur",rlf,te) * vm_cap(t,regi,te,rlf) ); ***--------------------------------------------------------------------------- *' Definition of capacity constraints for secondary energy to final energy transformation: ***--------------------------------------------------------------------------- q_limitCapFe(t,regi,te).. sum((entySe,entyFe)$(se2fe(entySe,entyFe,te)), vm_prodFe(t,regi,entySe,entyFe,te)) =l= sum(teFe2rlf(te,rlf), vm_capFac(t,regi,te) * vm_cap(t,regi,te,rlf)); ***--------------------------------------------------------------------------- *' Definition of capacity constraints for CCS technologies: ***--------------------------------------------------------------------------- q_limitCapCCS(t,regi,ccs2te(enty,enty2,te),rlf)$teCCS2rlf(te,rlf).. vm_co2CCS(t,regi,enty,enty2,te,rlf) =e= sum(teCCS2rlf(te,rlf), vm_capFac(t,regi,te) * vm_cap(t,regi,te,rlf)); ***----------------------------------------------------------------------------- *' The capacities of vintaged technologies depreciate according to a vintage depreciation scheme, *' with generally low depreciation at the beginning of the lifetime, and fast depreciation around the average lifetime. *' Depreciation can generally be tracked for each grade separately. *' By implementation, however, only grades of level 1 are affected. The depreciation of any fossil *' technology can be accelerated by early retirement, which is a crucial way to quickly phase out emissions *' after the implementation of stringent climate policies. *' Calculation of actual capacities (exponential and vintage growth TE): ***----------------------------------------------------------------------------- q_cap(ttot,regi,te2rlf(te,rlf))$(ttot.val ge cm_startyear).. vm_cap(ttot,regi,te,rlf) =e= ***cb early retirement for some fossil technologies (1 - vm_capEarlyReti(ttot,regi,te)) * (sum(opTimeYr2te(te,opTimeYr)$(tsu2opTimeYr(ttot,opTimeYr) AND (opTimeYr.val gt 1) ), pm_ts(ttot-(pm_tsu2opTimeYr(ttot,opTimeYr)-1)) * pm_omeg(regi,opTimeYr+1,te) * vm_deltaCap(ttot-(pm_tsu2opTimeYr(ttot,opTimeYr)-1),regi,te,rlf) ) *LB* half of the last time step ttot + pm_dt(ttot)/2 * pm_omeg(regi,"2",te) * vm_deltaCap(ttot,regi,te,rlf) $ifthen setGlobal END2110 - (pm_ts(ttot)* pm_omeg(regi,"11",te) * 0.5 * vm_deltaCap(ttot,regi,te,rlf))$(ord(ttot) eq card(ttot)) $endif ); q_capDistr(t,regi,teReNoBio(te)).. sum(teRe2rlfDetail(te,rlf), vm_capDistr(t,regi,te,rlf) ) =e= vm_cap(t,regi,te,"1") ; ***--------------------------------------------------------------------------- *' Technological change is an important driver of the evolution of energy systems. *' For mature technologies, such as coal-fired power plants, the evolution *' of techno-economic parameters is prescribed exogenously. For less mature *' technologies with substantial potential for cost decreases via learning-bydoing, *' investment costs are determined via an endogenous one-factor learning *' curve approach that assumes floor costs. ***--------------------------------------------------------------------------- ***--------------------------------------------------------------------------- *' Calculation of cumulated capacities (learning technologies only): ***--------------------------------------------------------------------------- qm_deltaCapCumNet(ttot,regi,teLearn)$(ord(ttot) lt card(ttot) AND pm_ttot_val(ttot+1) ge max(2010, cm_startyear)).. vm_capCum(ttot+1,regi,teLearn) =e= sum(te2rlf(teLearn,rlf), (pm_ts(ttot) / 2 * vm_deltaCap(ttot,regi,teLearn,rlf)) + (pm_ts(ttot+1) / 2 * vm_deltaCap(ttot+1,regi,teLearn,rlf)) ) + vm_capCum(ttot,regi,teLearn); ***--------------------------------------------------------------------------- *' Initial values for cumulated capacities (learning technologies only): ***--------------------------------------------------------------------------- q_capCumNet(t0,regi,teLearn).. vm_capCum(t0,regi,teLearn) =e= pm_data(regi,"ccap0",teLearn); ***--------------------------------------------------------------------------- *' Additional equation for fuel shadow price calulation: ***--------------------------------------------------------------------------- *ml* reasonable results only for members of peExGrade and peren2rlf30 *NB*110625 changes for transition towards grades qm_fuel2pe(t,regi,peRicardian(enty)).. vm_prodPe(t,regi,enty) =e= sum(pe2rlf(enty,rlf2),vm_fuExtr(t,regi,enty,rlf2))-(vm_Xport(t,regi,enty)-(1-pm_costsPEtradeMp(regi,enty))*vm_Mport(t,regi,enty))$(tradePe(enty)) - sum(pe2rlf(enty2,rlf2), (pm_fuExtrOwnCons(regi, enty, enty2) * vm_fuExtr(t,regi,enty2,rlf2))$(pm_fuExtrOwnCons(regi, enty, enty2) gt 0)); ***--------------------------------------------------------------------------- *' Definition of resource constraints for renewable energy types: ***--------------------------------------------------------------------------- *ml* assuming maxprod to be technical potential q_limitProd(t,regi,teRe2rlfDetail(teReNoBio(te),rlf)).. pm_dataren(regi,"maxprod",rlf,te) =g= ( 1$teRLDCDisp(te) + pm_dataren(regi,"nur",rlf,te)$(NOT teRLDCDisp(te)) ) * vm_capFac(t,regi,te) * vm_capDistr(t,regi,te,rlf); ***----------------------------------------------------------------------------- *' Definition of competition for geographical potential for renewable energy types: ***----------------------------------------------------------------------------- *RP* assuming q_limitGeopot to be geographical potential, whith luse equivalent to the land use parameter q_limitGeopot(t,regi,peReComp(enty),rlf).. p_datapot(regi,"limitGeopot",rlf,enty) =g= sum(te$teReComp2pe(enty,te,rlf), (vm_capDistr(t,regi,te,rlf) / (pm_data(regi,"luse",te)/1000))); *** learning curve for investment costs q_costTeCapital(t,regi,teLearn) .. vm_costTeCapital(t,regi,teLearn) =e= *** special treatment for first time steps: using global estimates better *** matches historic values ( fm_dataglob("learnMult_wFC",teLearn) * ( ( sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn) ) ** fm_dataglob("learnExp_wFC",teLearn) ) )$( t.val le 2005 ) *** special treatment for 2010, 2015: start divergence of regional values by using a *** t-split of global 2005 to regional 2020 in order to phase-in the observed 2020 regional *** variation from input-data + ( (2020 - t.val)/15 * fm_dataglob("learnMult_wFC",teLearn) * ( sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn) ) ** fm_dataglob("learnExp_wFC",teLearn) + (t.val - 2005)/15 * pm_data(regi,"learnMult_wFC",teLearn) * ( sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn) ) ** pm_data(regi,"learnExp_wFC",teLearn) )$( (t.val gt 2005) AND (t.val lt 2020) ) *** assuming linear convergence of regional learning curves to global values until 2050 + ( (pm_ttot_val(t) - 2020) / 30 * fm_dataglob("learnMult_wFC",teLearn) * ( sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn) ) ** fm_dataglob("learnExp_wFC",teLearn) + (2050 - pm_ttot_val(t)) / 30 * pm_data(regi,"learnMult_wFC",teLearn) * ( sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn) ) ** pm_data(regi,"learnExp_wFC",teLearn) )$( t.val ge 2020 AND t.val le 2050 ) *** globally harmonized costs after 2050 + ( fm_dataglob("learnMult_wFC",teLearn) * (sum(regi2, vm_capCum(t,regi2,teLearn)) + pm_capCumForeign(t,regi,teLearn) ) **(fm_dataglob("learnExp_wFC",teLearn)) )$(t.val gt 2050) *** floor costs - calculated such that they coincide for all regions + pm_data(regi,"floorcost",teLearn) ; ***--------------------------------------------------------------------------- *' EMF27 limits on fluctuating renewables, only turned on for special EMF27 and AWP 2 scenarios, not for SSP ***--------------------------------------------------------------------------- *** this is to prevent that in the long term, all solids are supplied by biomass. Residential solids can be fully supplied by biomass (-> wood pellets), so the FE residential demand is subtracted *** vm_cesIO(t,regi,"fesob") will be 0 in the stationary realization q_limitBiotrmod(t,regi)$(t.val > 2020).. vm_prodSe(t,regi,"pebiolc","sesobio","biotrmod") - sum (in$sameAs("fesob",in), vm_cesIO(t,regi,in)) - sum (fe2es(entyFe,esty,teEs)$buildMoBio(esty), vm_demFeForEs(t,regi,entyFe,esty,teEs) ) =l= (2 + max(0,min(1,( 2100 - pm_ttot_val(t)) / ( 2100 - 2020 ))) * 3) !! 5 in 2020 and 2 in 2100 * vm_prodSe(t,regi,"pecoal","sesofos","coaltr") ; ***----------------------------------------------------------------------------- *' Emissions result from primary to secondary energy transformation, *' from secondary to final energy transformation (some air pollutants), or *' transformations within the chain of CCS steps (Leakage). ***----------------------------------------------------------------------------- q_emiTeDetail(t,regi,enty,enty2,te,enty3)$( emi2te(enty,enty2,te,enty3) OR ( pe2se(enty,enty2,te) AND sameas(enty3,"cco2")) ) .. vm_emiTeDetail(t,regi,enty,enty2,te,enty3) =e= sum(emi2te(enty,enty2,te,enty3), sum(pe2se(enty,enty2,te), pm_emifac(t,regi,enty,enty2,te,enty3) * vm_demPE(t,regi,enty,enty2,te) ) + sum(se2fe(enty,enty2,te), pm_emifac(t,regi,enty,enty2,te,enty3) * vm_prodFE(t,regi,enty,enty2,te) ) + sum((ccs2Leak(enty,enty2,te,enty3),teCCS2rlf(te,rlf)), pm_emifac(t,regi,enty,enty2,te,enty3) * vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) ; ***-------------------------------------------------- *' Total energy-emissions: ***-------------------------------------------------- *mh calculate total energy system emissions for each region and timestep: q_emiTe(t,regi,emiTe(enty)) .. vm_emiTe(t,regi,enty) =e= !! emissions from fuel combustion sum(emi2te(enty2,enty3,te,enty), vm_emiTeDetail(t,regi,enty2,enty3,te,enty) ) !! 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),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") ) !! 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") ) !! CO2 from short-term CCU + sum(teCCU2rlf(te2,rlf), vm_co2CCUshort(t,regi,"cco2","ccuco2short",te2,rlf) ) ; ***------------------------------------------------------ *' Mitigation options that are independent of energy consumption are represented *' using marginal abatement cost (MAC) curves, which describe the *' percentage of abated emissions as a function of the costs. *' Baseline emissions are obtained by three different methods: by source (via emission factors), *' by econometric estimate, and exogenous. Emissions are calculated as *' baseline emissions times (1 - relative emission reduction). *' In case of CO2 from landuse (co2luc), emissions can be negative. *' To treat these emissions in the same framework, we subtract the minimal emission level from *' baseline emissions. This shift factor is then added again when calculating total emissions. *' The ndogenous baselines of non-energy emissions are calculated in the following equation: ***------------------------------------------------------ q_macBase(t,regi,enty)$( emiFuEx(enty) OR sameas(enty,"n2ofertin") ) .. vm_macBase(t,regi,enty) =e= sum(emi2fuel(enty2,enty), p_efFossilFuelExtr(regi,enty2,enty) * sum(pe2rlf(enty2,rlf), vm_fuExtr(t,regi,enty2,rlf)) )$( emiFuEx(enty) ) + ( p_macBaseMagpie(t,regi,enty) + p_efFossilFuelExtr(regi,"pebiolc","n2obio") * vm_fuExtr(t,regi,"pebiolc","1") )$( sameas(enty,"n2ofertin") ) ; ***------------------------------------------------------ *' Total non-energy emissions: ***------------------------------------------------------ q_emiMacSector(t,regi,emiMacSector(enty)).. vm_emiMacSector(t,regi,enty) =e= ( vm_macBase(t,regi,enty) * sum(emiMac2mac(enty,enty2), 1 - (pm_macSwitch(enty) * pm_macAbatLev(t,regi,enty2)) ) )$( NOT sameas(enty,"co2cement_process") ) *** cement process emissions are accounted for in the industry module + ( vm_macBaseInd(t,regi,enty,"cement") - vm_emiIndCCS(t,regi,enty) )$( sameas(enty,"co2cement_process") ) + p_macPolCO2luc(t,regi)$( sameas(enty,"co2luc") ) ; q_emiMac(t,regi,emiMac) .. vm_emiMac(t,regi,emiMac) =e= sum(emiMacSector2emiMac(emiMacSector,emiMac), vm_emiMacSector(t,regi,emiMacSector) ) ; ***------------------------------------------------------ *' Total regional emissions are the sum of emissions from technologies, MAC-curves, CDR-technologies and emissions that are exogenously given for REMIND. ***------------------------------------------------------ *LB* calculate total emissions for each region at each time step q_emiAll(t,regi,emi(enty)).. vm_emiAll(t,regi,enty) =e= vm_emiTe(t,regi,enty) + vm_emiMac(t,regi,enty) + vm_emiCdr(t,regi,enty) + pm_emiExog(t,regi,enty) ; ***------------------------------------------------------ *' Total global emissions are calculated for each GHG emission type and links the energy system to the climate module. ***------------------------------------------------------ *LB* calculate total global emissions for each timestep - link to the climate module q_emiAllGlob(t,emi(enty)).. vm_emiAllGlob(t,enty) =e= sum(regi, vm_emiAll(t,regi,enty) + pm_emissionsForeign(t,regi,enty) ) ; ***------------------------------------------------------ *' Total regional emissions in CO2 equivalents that are part of the climate policy are computed based on regional GHG *' emissions from different sectors(energy system, non-energy system, exogenous, CDR technologies). ***------------------------------------------------------ *mlb 8/2010* extension for multigas accounting/trading *cb only "static" equation to be active before cm_startyear, as multigasscen could be different from a scenario to another that is fixed on the first q_co2eq(ttot,regi)$(ttot.val ge cm_startyear).. vm_co2eq(ttot,regi) =e= vm_emiAll(ttot,regi,"co2") + (s_tgn_2_pgc * vm_emiAll(ttot,regi,"n2o") + s_tgch4_2_pgc * vm_emiAll(ttot,regi,"ch4")) $(cm_multigasscen eq 2 or cm_multigasscen eq 3) - vm_emiMacSector(ttot,regi,"co2luc") $(cm_multigasscen eq 3); ***------------------------------------------------------ *' Total global emissions in CO2 equivalents that are part of the climate policy also take into account foreign emissions. ***------------------------------------------------------ *mlb 20140108* computation of global emissions (related to cap) q_co2eqGlob(t) $(t.val > 2010).. vm_co2eqGlob(t) =e= sum(regi, vm_co2eq(t,regi) + pm_co2eqForeign(t,regi)); ***------------------------------------ *' Linking GHG emissions to tradable emission permits. ***------------------------------------ *mh for each region and time step: emissions + permit trade balance < emission cap q_emiCap(t,regi) .. vm_co2eq(t,regi) + vm_Xport(t,regi,"perm") - vm_Mport(t,regi,"perm") + vm_banking(t,regi) =l= vm_perm(t,regi); ***----------------------------------------------------------------- *** Budgets on GHG emissions (single or two subsequent time periods) ***----------------------------------------------------------------- qm_co2eqCum(regi).. v_co2eqCum(regi) =e= sum(ttot$(ttot.val lt sm_endBudgetCO2eq and ttot.val gt s_t_start), pm_ts(ttot) * vm_co2eq(ttot,regi) ) + sum(ttot$(ttot.val eq sm_endBudgetCO2eq or ttot.val eq s_t_start), pm_ts(ttot) / 2 * vm_co2eq(ttot,regi) ) ; q_budgetCO2eqGlob$(cm_emiscen=6).. sum(regi, v_co2eqCum(regi)) =l= sum(regi, pm_budgetCO2eq(regi)); ***--------------------------------------------------------------------------- *' 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)) =e= sum(emi2te(enty3,enty4,te2,enty), vm_emiTeDetail(t,regi,enty3,enty4,te2,enty) ) + sum(teCCS2rlf(te,rlf), vm_ccs_cdr(t,regi,enty,enty2,te,rlf) ) *** CCS from industry + sum(emiInd37, vm_emiIndCCS(t,regi,emiInd37) ) ; ***--------------------------------------------------------------------------- *' Definition of splitting of captured CO2 to CCS, CCU and a valve (the valve *' accounts for different lifetimes of capture, CCS and CCU technologies s.t. *' extra capture capacities of CO2 capture can release CO2 directly to the *' atmosphere) ***--------------------------------------------------------------------------- q_balCCUvsCCS(t,regi) .. sum(teCCS2rlf(te,rlf), vm_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)) + v_co2capturevalve(t,regi) ; ***--------------------------------------------------------------------------- *' Definition of the CCS transformation chain: ***--------------------------------------------------------------------------- *** no effect while CCS chain is limited to just one step (ccsinje) q_transCCS(t,regi,ccs2te(enty,enty2,te),ccs2te2(enty2,enty3,te2),rlf)$teCCS2rlf(te2,rlf).. (1-pm_emifac(t,regi,enty,enty2,te,"co2")) * vm_co2CCS(t,regi,enty,enty2,te,rlf) =e= vm_co2CCS(t,regi,enty2,enty3,te2,rlf); q_limitCCS(regi,ccs2te2(enty,"ico2",te),rlf)$teCCS2rlf(te,rlf).. sum(ttot $(ttot.val ge 2005), pm_ts(ttot) * vm_co2CCS(ttot,regi,enty,"ico2",te,rlf)) =l= pm_dataccs(regi,"quan",rlf); ***--------------------------------------------------------------------------- *' Emission constraint on SO2 after 2050: ***--------------------------------------------------------------------------- q_limitSo2(ttot+1,regi) $((pm_ttot_val(ttot+1) ge max(cm_startyear,2055)) AND (cm_emiscen gt 1) AND (ord(ttot) lt card(ttot))) .. vm_emiTe(ttot+1,regi,"so2") =l= vm_emiTe(ttot,regi,"so2"); q_limitCO2(ttot+1,regi) $((pm_ttot_val(ttot+1) ge max(cm_startyear,2055)) AND (ttot.val le 2100) AND (cm_emiscen eq 8)) .. vm_emiTe(ttot+1,regi,"co2") =l= vm_emiTe(ttot,regi,"co2"); q_eqadj(regi,ttot,teAdj(te))$(ttot.val ge max(2010, cm_startyear)) .. v_adjFactor(ttot,regi,te) =e= power( (sum(te2rlf(te,rlf),vm_deltaCap(ttot,regi,te,rlf)) - sum(te2rlf(te,rlf),vm_deltaCap(ttot-1,regi,te,rlf)))/(pm_ttot_val(ttot)-pm_ttot_val(ttot-1)) ,2) /( sum(te2rlf(te,rlf),vm_deltaCap(ttot-1,regi,te,rlf)) + p_adj_seed_reg(ttot,regi) * p_adj_seed_te(ttot,regi,te) + p_adj_deltacapoffset("2010",regi,te)$(ttot.val eq 2010) + p_adj_deltacapoffset("2015",regi,te)$(ttot.val eq 2015) ); ***--------------------------------------------------------------------------- *' The use of early retirement is restricted by the following equations: ***--------------------------------------------------------------------------- q_limitCapEarlyReti(ttot,regi,te)$(ttot.val lt 2109 AND pm_ttot_val(ttot+1) ge max(2010, cm_startyear)).. vm_capEarlyReti(ttot+1,regi,te) =g= vm_capEarlyReti(ttot,regi,te); q_smoothphaseoutCapEarlyReti(ttot,regi,te)$(ttot.val lt 2120 AND pm_ttot_val(ttot+1) ge max(2010, cm_startyear)).. vm_capEarlyReti(ttot+1,regi,te) =l= vm_capEarlyReti(ttot,regi,te) + (pm_ttot_val(ttot+1)-pm_ttot_val(ttot)) * (cm_earlyreti_rate *** more retirement possible for coal power plants in early time steps for Europe and USA, to account for relatively old fleet + p_earlyreti_adjRate(regi,te)$(ttot.val lt 2035) *** more retirement possible for first generation biofuels + 0.05$(sameas(te,"biodiesel") or sameas(te, "bioeths"))); *JK* Result of split of budget equation. Sum of all energy related costs. q_costEnergySys(ttot,regi)$( ttot.val ge cm_startyear ) .. vm_costEnergySys(ttot,regi) =e= ( v_costFu(ttot,regi) + v_costOM(ttot,regi) + v_costInv(ttot,regi) ) + sum(emiInd37, vm_IndCCSCost(ttot,regi,emiInd37)) + pm_CementDemandReductionCost(ttot,regi) ; ***--------------------------------------------------------------------------- *' Investment equation for end-use capital investments (energy service layer): ***--------------------------------------------------------------------------- q_esCapInv(ttot,regi,teEs)$pm_esCapCost(ttot,regi,teEs) .. vm_esCapInv(ttot,regi,teEs) =e= sum (fe2es(entyFe,esty,teEs), pm_esCapCost(ttot,regi,teEs) * v_prodEs(ttot,regi,entyFe,esty,teEs) ); ; *' Limit electricity use for fehes to 1/4th of total electricity use: q_limitSeel2fehes(t,regi).. 1/4 * vm_usableSe(t,regi,"seel") =g= - vm_prodSe(t,regi,"pegeo","sehe","geohe") * pm_prodCouple(regi,"pegeo","sehe","geohe","seel") ; *' Requires minimum share of liquids from oil in total liquids of 5%: q_limitShOil(t,regi).. sum(pe2se("peoil",enty2,te)$(sameas(te,"refliq") ), vm_prodSe(t,regi,"peoil",enty2,te) ) =g= 0.05 * sum(se2fe(enty,enty2,te)$(sameas(te,"tdfoshos") OR sameas(te,"tdfospet") OR sameas(te,"tdfosdie") ), vm_demSe(t,regi,enty,enty2,te) ) ; ***--------------------------------------------------------------------------- *' PE Historical Capacity: *** set the bound at 0.9*historic capacities so that the model still needs to build additional capacity beyond the bound in order to fulfill FE demand, otherwise the calibration routine has problems ***--------------------------------------------------------------------------- q_PE_histCap(t,regi,entyPe,entySe)$(p_PE_histCap(t,regi,entyPe,entySe)).. sum(te$pe2se(entyPe,entySe,te), sum(te2rlf(te,rlf), vm_cap(t,regi,te,rlf)) ) =g= 0.9 * p_PE_histCap(t,regi,entyPe,entySe) ; ***--------------------------------------------------------------------------- *' Share of green hydrogen in all hydrogen. ***--------------------------------------------------------------------------- q_shGreenH2(t,regi).. sum(se2se("seel","seh2",te), vm_prodSe(t,regi,"seel","seh2",te)) =e= ( sum(pe2se(entyPe,"seh2",te), vm_prodSe(t,regi,entyPe,"seh2",te)) + sum(se2se(entySe,"seh2",te), vm_prodSe(t,regi,entySe,"seh2",te)) ) * v_shGreenH2(t,regi) ; ***--------------------------------------------------------------------------- *' Share of biofuels in transport liquids ***--------------------------------------------------------------------------- q_shBioliq(t,regi).. sum(se2se(entyPe,"seliqbio",te), vm_prodSe(t,regi,entyPe,"seliqbio",te)) =e= ( sum(pe2se(entyPe,entySe,te)$seAgg2se("all_seliq",entySe), vm_prodSe(t,regi,entyPe,entySe,te)) + sum(se2se(entySe,entySe2,te)$seAgg2se("all_seliq",entySe2), vm_prodSe(t,regi,entySe,entySe2,te)) ) * v_shGreenH2(t,regi) ; *** EOF ./core/equations.gms