From 6ba4e68a5be613910c5a509875e6bfea8522a420 Mon Sep 17 00:00:00 2001 From: David Klein Date: Tue, 13 Jan 2026 17:01:23 +0100 Subject: [PATCH 01/25] Add different scenarios for the geological storage potential. Requires new input data f_geoStorPot.cs3r from mrremind::calcPotentialGeologicalStorage --- core/datainput.gms | 19 +++++++++++++++++++ main.gms | 11 +++++++++++ 2 files changed, 30 insertions(+) diff --git a/core/datainput.gms b/core/datainput.gms index 5a3e9c813..65bfd65e4 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1167,6 +1167,25 @@ $include "./core/input/pm_dataccs.cs3r" $offdelim ; +*** import regionalized storage potential: +table f_geoStorPot(all_regi,char) "different categories of geological storage potential for CO2. Unit: GtC" +$ondelim +$include "./core/input/f_geoStorPot.cs3r" +$offdelim +; + +*** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen +if (c_geoStorPotScen eq 1, + pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "TechPotOn"); + pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "TechPotOff"); +elseif (c_geoStorPotScen eq 2), + pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "PlanetLimOn"); + pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "PlanetLimOff"); +elseif (c_geoStorPotScen eq 3), + pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "MixedOld"); + pm_dataccs(all_regi, "quan", "2") = 0; +); + ***----------------------------------------------------------------------------- *** adjustment cost parameter ***----------------------------------------------------------------------------- diff --git a/main.gms b/main.gms index 1b15f37a6..dd3c493f6 100755 --- a/main.gms +++ b/main.gms @@ -903,6 +903,17 @@ parameter *' * (1) reference (90%) *' * (2) increased capture rate (99%) *' + +Parameter c_geoStorPotScen "select the amount of geological storage potential for CO2 offshore and onshore" +; + +c_geoStorPotScen = 3; + +*' This switch determines the upper bound of the total geological storage potential for CO2 (onshore + offshore). +*' * (1) high: technical potential without any exclusion layers applied +*' * (2) low: applying all exclusion layers described in Gidden 2025, Table S1 of https://zenodo.org/records/15657543 +*' * (3) old: formerly used scenario when there was only one grade + parameter c_export_tax_scen "choose which oil export tax is used in the model. 0 = none, 1 = fix" ; From 4eaf87f55ffefd4bd1c4a73857022c3f26d7fcbb Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 14 Jan 2026 11:00:20 +0100 Subject: [PATCH 02/25] Add categories for storage potential to set 'char' Rename categories --- core/datainput.gms | 10 +++++----- core/sets.gms | 5 +++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/datainput.gms b/core/datainput.gms index 65bfd65e4..c506be71b 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1176,13 +1176,13 @@ $offdelim *** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen if (c_geoStorPotScen eq 1, - pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "TechPotOn"); - pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "TechPotOff"); + pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "potTechOn"); + pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "potTechOff"); elseif (c_geoStorPotScen eq 2), - pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "PlanetLimOn"); - pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "PlanetLimOff"); + pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "potLimOn"); + pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "potLimOff"); elseif (c_geoStorPotScen eq 3), - pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "MixedOld"); + pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "mixedOld"); pm_dataccs(all_regi, "quan", "2") = 0; ); diff --git a/core/sets.gms b/core/sets.gms index c9042fd55..d1e917736 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -2212,6 +2212,11 @@ char "characteristics of technologies" batteryVREcapRatio "ratio of battery capacity to storage technology capacity" priceLow "biochar price path assumption" priceHigh "biochar price path assumption" + potTechOff "technical geological storage potential Offshore" + potTechOn "technical geological storage potential Onshore" + potLimOff "limited geological storage potential Offshore" + potLimOn "limited geological storage potential Onshore" + mixedOld "old geological storage potential formerly used in REMIND" / ***----------------------------------------------------------------------------- From 624a9d26985c89d2a024256f88c5893944197407 Mon Sep 17 00:00:00 2001 From: David Klein Date: Tue, 27 Jan 2026 12:15:53 +0100 Subject: [PATCH 03/25] Make new data for technical potential the default for the geological storage potential --- main.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.gms b/main.gms index dd3c493f6..8bb548145 100755 --- a/main.gms +++ b/main.gms @@ -907,7 +907,7 @@ parameter Parameter c_geoStorPotScen "select the amount of geological storage potential for CO2 offshore and onshore" ; -c_geoStorPotScen = 3; +c_geoStorPotScen = 1; !! def = 1 !! regexp = [1-3] *' This switch determines the upper bound of the total geological storage potential for CO2 (onshore + offshore). *' * (1) high: technical potential without any exclusion layers applied From 5ae03316ed90a4e22ef2881d67fc50a3ae1755ae Mon Sep 17 00:00:00 2001 From: David Klein Date: Thu, 29 Jan 2026 16:25:44 +0100 Subject: [PATCH 04/25] Rename ccsinje to ccsinjeon (onshore) --- core/bounds.gms | 10 +++++----- core/datainput.gms | 16 ++++++++-------- core/equations.gms | 2 +- core/input/generisdata_tech.prn | 2 +- core/input/generisdata_vintages.prn | 2 +- core/sets.gms | 16 ++++++++-------- main.gms | 4 ++-- .../04_PE_FE_parameters/iea2014/datainput.gms | 2 +- modules/21_tax/on/equations.gms | 2 +- modules/21_tax/on/postsolve.gms | 2 +- modules/21_tax/on/presolve.gms | 2 +- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core/bounds.gms b/core/bounds.gms index 1b5bb628d..9cfb14793 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -306,7 +306,7 @@ vm_cap.fx("2020",regi,te,rlf) $ (teBio(te) and teCCS(te)) = 0; *' switch to deactivate carbon sequestration if(c_ccsinjecratescen = 0, - vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2","ccsinje","1") = 0; + vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2","ccsinjeon","1") = 0; ); *' bound on maximum annual carbon storage by region @@ -315,7 +315,7 @@ if(c_ccsinjecratescen > 0, *' DK 20100929: default value (pm_ccsinjecrate= 0.5%) is consistent with Interview Gerling (BGR) *' (http://www.iz-klima.de/aktuelles/archiv/news-2010/mai/news-05052010-2/): *' 12 Gt storage potential in Germany, 50-75 Mt/a injection => 60 Mt/a => 60/12000=0.005 - vm_co2CCS.up(t,regi,"cco2","ico2","ccsinje","1") = pm_dataccs(regi,"quan","1") * pm_ccsinjecrate(regi); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","1") * pm_ccsinjecrate(regi); *** Lower limit for 2020-2030 is capacities of all projects that are operational (2020-2030) from project data base *** Upper limit for 2025 and 2030 additionally includes all projects under construction and 30% @@ -325,8 +325,8 @@ if(c_ccsinjecratescen > 0, *** Potential of EU27 regions is pooled and redistributed according to GDP (Only upper limit for 2030) *** Norway and UK announced to store CO2 for EU27 countries. So 50% of Norway and UK potential in 2030 is attributed to EU27-Pool if(not cm_emiscen = 1, !! cm_emiscen 1 = BAU - vm_co2CCS.lo(t,regi,"cco2","ico2","ccsinje","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030); - vm_co2CCS.up(t,regi,"cco2","ico2","ccsinje","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * ( + vm_co2CCS.lo(t,regi,"cco2","ico2","ccsinjeon","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * ( p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"construction") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"planned") $ (t.val <= 2030) * c_fracRealfromAnnouncedCCScap2030); @@ -341,7 +341,7 @@ if(cm_emiscen = 1, if(cm_ccapturescen = 2, !! no carbon capture at all vm_cap.fx(t,regi_capturescen,teCCS,rlf) = 0; - vm_cap.fx(t,regi_capturescen,"ccsinje",rlf) = 0; + vm_cap.fx(t,regi_capturescen,"ccsinjeon",rlf) = 0; elseif(cm_ccapturescen = 3), !! no bio carbon capture: vm_cap.fx(t,regi_capturescen,te,rlf) $ (teCCS(te) and teBio(te)) = 0; elseif(cm_ccapturescen = 4), !! no carbon capture in the electricity sector diff --git a/core/datainput.gms b/core/datainput.gms index c506be71b..df609d1c5 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -161,7 +161,7 @@ fm_dataglob("learn", te)$(sameAs(te, "biopyronly") OR sameAs(te, "biopyrhe") OR $ifthen.c_techAssumptScen "%c_techAssumptScen%" == "SSP1" *** hampers technologies with CCS or FT *** TODO: add industry ccs technologies bfcc and idrcc - loop(te $ (teCCS(te) or teFischerTropsch(te) or sameas(te,"ccsinje")), + loop(te $ (teCCS(te) or teFischerTropsch(te) or sameas(te,"ccsinjeon")), fm_dataglob("inco0",te) = 1.3 * fm_dataglob("inco0",te); ); *** hampers nuclear a lot @@ -212,7 +212,7 @@ $elseif.c_techAssumptScen "%c_techAssumptScen%" == "SSP3" $elseif.c_techAssumptScen "%c_techAssumptScen%" == "SSP5" *** favours technologies with CCS or FT - loop(te $ (teCCS(te) or teFischerTropsch(te) or sameas(te,"ccsinje")), + loop(te $ (teCCS(te) or teFischerTropsch(te) or sameas(te,"ccsinjeon")), fm_dataglob("inco0",te) = 0.9 * fm_dataglob("inco0",te); ); *** hampers nuclear @@ -240,12 +240,12 @@ $endif.c_techAssumptScen ***--------------------------------------------------------------------------- *** cm_ccsinjeCost cost scenarios *** Warning: it applies absolute values; only use it in combination with default c_techAssumptScen SSP2. -*** low estimate: ccsinje cost prior to 03/2024; i.e. ~11 USD/tCO2 in 2025, decreasing to ~7.5USD/tCO2 as of 2035 -$if "%cm_ccsinjeCost%" == "low" fm_dataglob("tech_stat","ccsinje") = 2; -$if "%cm_ccsinjeCost%" == "low" fm_dataglob("inco0","ccsinje") = 220; -$if "%cm_ccsinjeCost%" == "low" fm_dataglob("constrTme","ccsinje") = 0; +*** low estimate: ccsinjeon cost prior to 03/2024; i.e. ~11 USD/tCO2 in 2025, decreasing to ~7.5USD/tCO2 as of 2035 +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("tech_stat","ccsinjeon") = 2; +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("inco0","ccsinjeon") = 220; +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("constrTme","ccsinjeon") = 0; *** high estimate: ~20USD/tCO2 (constant), assuming upper end of storage cost and long transport distances -$if "%cm_ccsinjeCost%" == "high" fm_dataglob("inco0","ccsinje") = 550; +$if "%cm_ccsinjeCost%" == "high" fm_dataglob("inco0","ccsinjeon") = 550; *** cm_VRE_supply_assumptions: Modify learning and floor costs for electricity storage and production of VRE @@ -1282,7 +1282,7 @@ $endif.cm_subsec_model_steel p_adj_coeff(ttot,regi,"MeOH") = 0.5; p_adj_coeff(ttot,regi,"h22ch4") = 0.5; *** CO2 storage and CDR technologies - p_adj_coeff(ttot,regi,"ccsinje") = 1.0; + p_adj_coeff(ttot,regi,"ccsinjeon") = 1.0; p_adj_coeff(ttot,regi,"biopyronly") = 0.55; !! like biochp and bioigcc; p_adj_coeff(ttot,regi,"biopyrhe") = 0.55; !! like biochp and bioigcc; p_adj_coeff(ttot,regi,"biopyrchp") = 0.55; !! like biochp and bioigcc; diff --git a/core/equations.gms b/core/equations.gms index 42d3e93ce..464ae7b9d 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -912,7 +912,7 @@ q_balCCUvsCCS(t,regi) .. ; q_ccsShare(t,regi) .. - sum(teCCS2rlf(te, rlf), v_co2capture(t, regi, "cco2", "ico2", "ccsinje", rlf)) * + sum(teCCS2rlf(te, rlf), v_co2capture(t, regi, "cco2", "ico2", "ccsinjeon", rlf)) * v_ccsShare(t,regi) =e= sum(teCCS2rlf(te, rlf), vm_co2CCS(t, regi, "cco2", "ico2", te, rlf)) diff --git a/core/input/generisdata_tech.prn b/core/input/generisdata_tech.prn index 9f9946f0d..676b7e748 100644 --- a/core/input/generisdata_tech.prn +++ b/core/input/generisdata_tech.prn @@ -154,7 +154,7 @@ lifetime 30 30 45 45 45 *** carbon management -+ ccsinje weathering dac oae_ng oae_el ++ ccsinjeon weathering dac oae_ng oae_el tech_stat 0 4 inco0 350 0.01 18800 200 400 floorcost 4800 diff --git a/core/input/generisdata_vintages.prn b/core/input/generisdata_vintages.prn index d79369e3e..09590403c 100644 --- a/core/input/generisdata_vintages.prn +++ b/core/input/generisdata_vintages.prn @@ -147,7 +147,7 @@ $offtext + storspv storwindon storwindoff storcsp gridspv gridwindon gridwindoff gridcsp 1 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -+ ccsinje ++ ccsinjeon 1 1.0 + tdsyngas tdsyngat tdsynhos tdsynpet tdsyndie diff --git a/core/sets.gms b/core/sets.gms index d1e917736..a2bc9dd92 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -224,7 +224,7 @@ all_te "all energy technologies, including from modules" tdhes "transmission and distribution for heat to stationary users" tdheb "transmission and distribution for heat to buildings" - ccsinje "injection of co2" + ccsinjeon "injection of co2" *** Storage technology: storspv "storage technology for photo voltaic (PV)" storwind "storage technology for wind onshore" @@ -1145,7 +1145,7 @@ te(all_te) "energy technologies" tdh2i "helper technologies (without cost) to avoid sudden H2 use switching in buildings and industry" tdh2b "helper technologies (without cost) to avoid sudden H2 use switching in buildings and industry" - ccsinje "injection of co2, CCS related" + ccsinjeon "injection of co2, CCS related" storspv "storage technology for photo voltaic" *** storwind "storage technology for wind onshore" @@ -1228,7 +1228,7 @@ teAdj(all_te) "technologies with adjustment costs on capacity addition elh2 "hydrogen elecrolysis" h2turb "hydrogen turbine for electricity production" h2curt "hydrogen production from curtailment" - ccsinje "injection of co2, CCS related" + ccsinjeon "injection of co2, CCS related" storspv "storage technology for PV" *** storwind "storage technology for wind onshore" @@ -2523,7 +2523,7 @@ pc2te(all_enty,all_enty,all_te,all_enty) "mapping for own consumption of tech segabio.fegas.tdbiogas.seel segafos.fegas.tdfosgas.seel pegeo.sehe.geohe.seel - cco2.ico2.ccsinje.seel + cco2.ico2.ccsinjeon.seel / *NB* mappings for emissions, capture and leakage emi2te(all_enty,all_enty,all_te,all_enty) " map emissions to technologies" @@ -2629,7 +2629,7 @@ emi2te(all_enty,all_enty,all_te,all_enty) " map emissions to technologies" pebiolc.sebiochar.biopyrliq.co2 segabio.fegas.tdbiogas.ch4 segafos.fegas.tdfosgas.ch4 - cco2.ico2.ccsinje.co2 + cco2.ico2.ccsinjeon.co2 pebiolc.seel.bioigccc.co2 pebiolc.seel.bioigccc.cco2 seliqbio.fehos.tdbiohos.bc @@ -2743,12 +2743,12 @@ emi2fuelMine(all_enty,all_enty,rlf) "missions from fossil fuel extraction" / ccs2te(all_enty,all_enty,all_te) "chain for ccs" / - cco2.ico2.ccsinje + cco2.ico2.ccsinjeon / ccs2Leak(all_enty,all_enty,all_te,all_enty) "leakage along ccs chain" / - cco2.ico2.ccsinje.co2 + cco2.ico2.ccsinjeon.co2 / pe2rlf(all_enty,rlf) "map exhaustible energy to grades for qm_fuel2pe" @@ -2823,7 +2823,7 @@ teMat2rlf(all_te,rlf) "mapping for material production technologies to grade teCCS2rlf(all_te,rlf) "mapping for CCS technologies to grades" / - (ccsinje) . 1 + (ccsinjeon) . 1 / teNoTransform2rlf(all_te,rlf) "mapping for no transformation technologies to grades" diff --git a/main.gms b/main.gms index 8bb548145..32f8f4f5b 100755 --- a/main.gms +++ b/main.gms @@ -1123,7 +1123,7 @@ parameter cm_carbonprice_temperatureLimit = 1.8; !! def = 1.8 *' parameter - cm_frac_CCS "tax on carbon transport & storage (ccsinje) to reflect risk of leakage, formulated as fraction of ccsinje O&M costs" + cm_frac_CCS "tax on carbon transport & storage (ccsinjeon) to reflect risk of leakage, formulated as fraction of ccsinjeon O&M costs" ; cm_frac_CCS = 10; !! def = 10 *' @@ -1764,7 +1764,7 @@ $setglobal cm_adj_seed_multiplier off $setglobal cm_adj_coeff_multiplier off *** cm_inco0Factor "change investment costs. [factor]." *' * (off): no scale-factor, use default investment costs (inco0) values -*' * (any value ge 0) list of techs with respective factor to change inco0 value by a multiplication factor. (e.g. "ccsinje 0.5,bioigccc 0.66) +*' * (any value ge 0) list of techs with respective factor to change inco0 value by a multiplication factor. (e.g. "ccsinjeon 0.5,bioigccc 0.66) *' Note: if %cm_techcosts% == "GLO", switch will not work for policy runs, i.e. cm_startyear > 2005, for pc, ngt and ngcc as this gets overwritten in 05_initialCap module $setglobal cm_inco0Factor off !! def = off *** cm_inco0RegiFactor "change investment costs regionalized technology values. [factor]." diff --git a/modules/04_PE_FE_parameters/iea2014/datainput.gms b/modules/04_PE_FE_parameters/iea2014/datainput.gms index 31c6c1ed8..26e6a51f7 100644 --- a/modules/04_PE_FE_parameters/iea2014/datainput.gms +++ b/modules/04_PE_FE_parameters/iea2014/datainput.gms @@ -306,7 +306,7 @@ p04_prodCoupleGlob("pebiolc","seliqbio","bioftcrec","seel") = 0.108; p04_prodCoupleGlob("segabio","fegas","tdbiogas","seel") = -0.05; p04_prodCoupleGlob("segafos","fegas","tdfosgas","seel") = -0.05; p04_prodCoupleGlob("pegeo","sehe","geohe","seel") = -0.3; -p04_prodCoupleGlob("cco2","ico2","ccsinje","seel") = -0.005; +p04_prodCoupleGlob("cco2","ico2","ccsinjeon","seel") = -0.005; *** Co-Production based on Dorndorf et al (in review) p04_prodCoupleGlob("pebiolc","sebiochar","biopyronly","seel") = -0.04; !! 2% of biomass input (Fawzy et al., 2022, https://doi.org/10.1016/j.jclepro.2022.133660) diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index f614c22d6..0fe1a45ee 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -317,7 +317,7 @@ q21_taxrevFlex(t,regi)$( t.val ge max(2010, cm_startyear) ) .. ***--------------------------------------------------------------------------- q21_taxrevCCS(t,regi)$(t.val ge max(2010,cm_startyear)).. v21_taxrevCCS(t,regi) - =e= cm_frac_CCS * pm_data(regi,"omf","ccsinje") * pm_inco0_t(t,regi,"ccsinje") + =e= cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(t,regi,"ccsinjeon") * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) ) * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","1") !! fraction of injection constraint per year - p21_taxrevCCS0(t,regi) diff --git a/modules/21_tax/on/postsolve.gms b/modules/21_tax/on/postsolve.gms index b8ea8879c..1c3fde8ff 100644 --- a/modules/21_tax/on/postsolve.gms +++ b/modules/21_tax/on/postsolve.gms @@ -21,7 +21,7 @@ OPTION decimals =3; pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3)); pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); -p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinje") * pm_inco0_t(ttot,regi,"ccsinje") +p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","1"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); diff --git a/modules/21_tax/on/presolve.gms b/modules/21_tax/on/presolve.gms index 8f74fcfe5..36920bedf 100644 --- a/modules/21_tax/on/presolve.gms +++ b/modules/21_tax/on/presolve.gms @@ -27,7 +27,7 @@ p21_tau_so2_tax(ttot,regi)$(ttot.val>2100)=p21_tau_so2_tax("2100",regi); pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3)); pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); -p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinje") * pm_inco0_t(ttot,regi,"ccsinje") +p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","1"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); From f65c6911925fbf91c93c0e620e78b7cbffe23ff0 Mon Sep 17 00:00:00 2001 From: David Klein Date: Thu, 29 Jan 2026 16:45:38 +0100 Subject: [PATCH 05/25] In pm_dataccs replace rlf dimension with te, since there is only one grade anyway but more technologies to come (ccsinjeon and ccsinjeoff), each with its own storage potential defined by pm_dataccs. --- core/bounds.gms | 2 +- core/datainput.gms | 14 +++++++------- core/declarations.gms | 2 +- core/equations.gms | 2 +- modules/21_tax/on/equations.gms | 2 +- modules/21_tax/on/postsolve.gms | 2 +- modules/21_tax/on/presolve.gms | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/core/bounds.gms b/core/bounds.gms index 9cfb14793..a7a63b710 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -315,7 +315,7 @@ if(c_ccsinjecratescen > 0, *' DK 20100929: default value (pm_ccsinjecrate= 0.5%) is consistent with Interview Gerling (BGR) *' (http://www.iz-klima.de/aktuelles/archiv/news-2010/mai/news-05052010-2/): *' 12 Gt storage potential in Germany, 50-75 Mt/a injection => 60 Mt/a => 60/12000=0.005 - vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","1") * pm_ccsinjecrate(regi); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","ccsinjeon") * pm_ccsinjecrate(regi); *** Lower limit for 2020-2030 is capacities of all projects that are operational (2020-2030) from project data base *** Upper limit for 2025 and 2030 additionally includes all projects under construction and 30% diff --git a/core/datainput.gms b/core/datainput.gms index df609d1c5..ed8150fde 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1161,7 +1161,7 @@ teEtaConst(te) = not teEtaIncr(te); display teEtaIncr; *** import regionalized CCS constraints: -table pm_dataccs(all_regi,char,rlf) "maximum CO2 storage capacity using CCS technology. Unit: GtC" +table pm_dataccs(all_regi,char,all_te) "maximum CO2 storage capacity using CCS technology. Unit: GtC" $ondelim $include "./core/input/pm_dataccs.cs3r" $offdelim @@ -1176,14 +1176,14 @@ $offdelim *** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen if (c_geoStorPotScen eq 1, - pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "potTechOn"); - pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "potTechOff"); + pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potTechOn"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potTechOff"); elseif (c_geoStorPotScen eq 2), - pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "potLimOn"); - pm_dataccs(all_regi, "quan", "2") = f_geoStorPot(all_regi, "potLimOff"); + pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potLimOn"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potLimOff"); elseif (c_geoStorPotScen eq 3), - pm_dataccs(all_regi, "quan", "1") = f_geoStorPot(all_regi, "mixedOld"); - pm_dataccs(all_regi, "quan", "2") = 0; + pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "mixedOld"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0; ); ***----------------------------------------------------------------------------- diff --git a/core/declarations.gms b/core/declarations.gms index 96881b9d3..d634bc8c1 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -546,7 +546,7 @@ $ifthen.tech_CO2capturerate not "%c_tech_CO2capturerate%" == "off" p_tech_co2capturerate(all_te) "Technology specific CO2 capture rate, fraction of carbon from input fuel that is captured [share]" / %c_tech_CO2capturerate% / p_PECarriers_CarbonContent(all_enty) "Carbon content of PE carriers [GtC/TWa]" $endif.tech_CO2capturerate -pm_dataccs(all_regi,char,rlf) "maximum CO2 storage capacity using CCS technology. [GtC]" +pm_dataccs(all_regi,char,all_te) "maximum CO2 storage capacity using CCS technology. [GtC]" pm_ccsinjecrate(all_regi) "Regional CCS injection rate factor. [1/year]." p_extRegiccsinjecrateRegi(ext_regi) "Regional CCS injection rate factor. [1/year]. (extended regions)" ; diff --git a/core/equations.gms b/core/equations.gms index 464ae7b9d..12a65ecec 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -925,7 +925,7 @@ q_ccsShare(t,regi) .. 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); + pm_dataccs(regi,"quan",te); ***--------------------------------------------------------------------------- diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index 0fe1a45ee..1c660d2b3 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -319,7 +319,7 @@ q21_taxrevCCS(t,regi)$(t.val ge max(2010,cm_startyear)).. v21_taxrevCCS(t,regi) =e= cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(t,regi,"ccsinjeon") * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","1") !! fraction of injection constraint per year + * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon") !! fraction of injection constraint per year - p21_taxrevCCS0(t,regi) ; diff --git a/modules/21_tax/on/postsolve.gms b/modules/21_tax/on/postsolve.gms index 1c3fde8ff..9bbf7b9ca 100644 --- a/modules/21_tax/on/postsolve.gms +++ b/modules/21_tax/on/postsolve.gms @@ -23,7 +23,7 @@ pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,em pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","1"); + * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_taxrevFE0(ttot,regi) = sum((entyFe,sector)$entyFe2Sector(entyFe,sector), ( p21_tau_fe_tax(ttot,regi,sector,entyFe) + p21_tau_fe_sub(ttot,regi,sector,entyFe) ) diff --git a/modules/21_tax/on/presolve.gms b/modules/21_tax/on/presolve.gms index 36920bedf..ab1420f61 100644 --- a/modules/21_tax/on/presolve.gms +++ b/modules/21_tax/on/presolve.gms @@ -29,7 +29,7 @@ pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,em pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","1"); + * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_emiAllco2neg0(ttot,regi) = vm_emiAllco2neg.l(ttot,regi); p21_emiAllco2neg_acrossIterations0(ttot,regi) = v21_emiAllco2neg_acrossIterations.l(ttot,regi); From 02f44d698f9e431be5d691898e57322c6dc7fa0d Mon Sep 17 00:00:00 2001 From: David Klein Date: Thu, 29 Jan 2026 17:05:00 +0100 Subject: [PATCH 06/25] Remove import of pm_dataccs.cs3r because data is taken from f_geoStorPot now --- core/datainput.gms | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/core/datainput.gms b/core/datainput.gms index ed8150fde..05c6cd43b 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1160,13 +1160,6 @@ loop(te, teEtaConst(te) = not teEtaIncr(te); display teEtaIncr; -*** import regionalized CCS constraints: -table pm_dataccs(all_regi,char,all_te) "maximum CO2 storage capacity using CCS technology. Unit: GtC" -$ondelim -$include "./core/input/pm_dataccs.cs3r" -$offdelim -; - *** import regionalized storage potential: table f_geoStorPot(all_regi,char) "different categories of geological storage potential for CO2. Unit: GtC" $ondelim @@ -1177,13 +1170,13 @@ $offdelim *** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen if (c_geoStorPotScen eq 1, pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potTechOn"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potTechOff"); +*** pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potTechOff"); elseif (c_geoStorPotScen eq 2), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potLimOn"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potLimOff"); +*** pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potLimOff"); elseif (c_geoStorPotScen eq 3), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "mixedOld"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0; +*** pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0; ); ***----------------------------------------------------------------------------- From 348a29ad6a8452da086516bb37134a9fe4670835 Mon Sep 17 00:00:00 2001 From: David Klein Date: Thu, 5 Feb 2026 16:57:03 +0100 Subject: [PATCH 07/25] Remove unnecessary dimensions (all_enty,all_enty,all_te,rlf) from v_co2capture --- core/declarations.gms | 4 ++-- core/equations.gms | 18 +++++++++++------- core/postsolve.gms | 2 +- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/core/declarations.gms b/core/declarations.gms index d634bc8c1..62c8d407c 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -153,7 +153,7 @@ vm_emiAllMkt(tall,all_regi,all_enty,all_emiMkt) "total emissions per emissi *** ------------- Emissions Positive Variables -------------------------------- positive variables -v_co2capture(ttot,all_regi,all_enty,all_enty,all_te,rlf) "total captured CO2 [GtC/year]" +v_co2capture(ttot,all_regi) "total captured CO2 [GtC/year]" vm_co2CCS(ttot,all_regi,all_enty,all_enty,all_te,rlf) "total CO2 injected into geological storage [GtC/a]" v_co2capturevalve(ttot,all_regi) "total CO2 emitted right after capture [GtC/a], note: used in q_balCCUvsCCS to account for different lifetimes of capture and CCU/CCS te and capacities [GtC/year]" v_ccsShare(ttot,all_regi) "fraction of captured CO2 that is stored geologically [share]" @@ -181,7 +181,7 @@ q_emiTeMkt(ttot,all_regi,all_enty,all_emiMkt) "total energy-emissions per q_emiEnFuelEx(ttot,all_regi,all_enty) "energy emissions from fuel extraction" q_emiAllMkt(ttot,all_regi,all_enty,all_emiMkt) "total regional emissions for each emission market" q_emiCdrAll(ttot,all_regi) "summing over all CDR emissions" -q_balcapture(ttot,all_regi,all_enty,all_enty,all_te) "balance equation for carbon capture" +q_balcapture(ttot,all_regi) "balance equation for carbon capture" q_balCCUvsCCS(ttot,all_regi) "balance equation for captured carbon to CCU or CCS or valve" q_ccsShare(ttot,all_regi) "calculate the share of captured CO2 that is stored geologically" ; diff --git a/core/equations.gms b/core/equations.gms index 12a65ecec..c172b947b 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -880,15 +880,19 @@ q_budgetCO2eqGlob$(cm_emiscen=6).. ***--------------------------------------------------------------------------- *' Definition of carbon capture : ***--------------------------------------------------------------------------- -q_balcapture(t,regi,ccs2te(ccsCo2(enty),enty2,te)) .. - sum(teCCS2rlf(te,rlf), v_co2capture(t,regi,enty,enty2,te,rlf)) + +***q_balcapture(t,regi, enty, enty2, te) +***q_balcapture(t,regi,"cco2","ico2","ccsinjeon") + +q_balcapture(t,regi) .. + v_co2capture(t,regi) =e= !! carbon captured in energy sector - sum(emi2te(enty3,enty4,te2,enty), - vm_emiTeDetail(t,regi,enty3,enty4,te2,enty) + sum(emi2te(enty3,enty4,te2,"cco2"), + vm_emiTeDetail(t,regi,enty3,enty4,te2,"cco2") ) !! carbon captured from CDR technologies in CDR module - + sum(teCCS2rlf(te,rlf), vm_co2capture_cdr(t,regi,enty,enty2,te,rlf)) + + sum(teCCS2rlf(te,rlf), vm_co2capture_cdr(t,regi,"cco2","ico2",te,rlf)) !! carbon captured from industry + sum(emiInd37, vm_emiIndCCS(t,regi,emiInd37)) + sum((sefe(entySe,entyFe),emiMkt)$( @@ -904,7 +908,7 @@ q_balcapture(t,regi,ccs2te(ccsCo2(enty),enty2,te)) .. *' atmosphere) ***--------------------------------------------------------------------------- q_balCCUvsCCS(t,regi) .. - sum(teCCS2rlf(te,rlf), v_co2capture(t,regi,"cco2","ico2",te,rlf)) + v_co2capture(t,regi) =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)) @@ -912,7 +916,7 @@ q_balCCUvsCCS(t,regi) .. ; q_ccsShare(t,regi) .. - sum(teCCS2rlf(te, rlf), v_co2capture(t, regi, "cco2", "ico2", "ccsinjeon", rlf)) * + v_co2capture(t,regi) * v_ccsShare(t,regi) =e= sum(teCCS2rlf(te, rlf), vm_co2CCS(t, regi, "cco2", "ico2", te, rlf)) diff --git a/core/postsolve.gms b/core/postsolve.gms index 079224422..cbcd25608 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -103,7 +103,7 @@ pm_PEPrice(ttot,regi,entyPe)$(abs (qm_budget.m(ttot,regi)) gt sm_eps) = q_balPe.m(ttot,regi,entyPe) / qm_budget.m(ttot,regi); *** calculate share of stored CO2 from captured CO2 -pm_share_CCS_CCO2(t,regi) = sum(teCCS2rlf(te,rlf), vm_co2CCS.l(t,regi,"cco2","ico2",te,rlf)) / (sum(teCCS2rlf(te,rlf), v_co2capture.l(t,regi,"cco2","ico2",te,rlf))+sm_eps); +pm_share_CCS_CCO2(t,regi) = sum(teCCS2rlf(te,rlf), vm_co2CCS.l(t,regi,"cco2","ico2",te,rlf)) / (v_co2capture.l(t,regi)+sm_eps); *CG**ML*: capital interest rate From 78fbc819af2608b2709ea8913b32f4667aff500c Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 6 Feb 2026 17:52:40 +0100 Subject: [PATCH 08/25] Remove unnecessary dimensions (all_enty,all_enty,rlf) from vm_co2CCS --- core/bounds.gms | 8 +++---- core/datainput.gms | 2 +- core/declarations.gms | 16 ++++++------- core/equations.gms | 24 +++++++++---------- core/postsolve.gms | 2 +- core/sets.gms | 5 ++++ modules/21_tax/on/equations.gms | 4 ++-- modules/21_tax/on/postsolve.gms | 4 ++-- modules/21_tax/on/presolve.gms | 4 ++-- modules/32_power/IntC/equations.gms | 3 +-- modules/47_regipol/none/bounds.gms | 2 +- .../47_regipol/regiCarbonPrice/equations.gms | 6 ++--- .../47_regipol/regiCarbonPrice/postsolve.gms | 4 ++-- .../47_regipol/regiCarbonPrice/presolve.gms | 2 +- 14 files changed, 44 insertions(+), 42 deletions(-) mode change 100755 => 100644 core/bounds.gms diff --git a/core/bounds.gms b/core/bounds.gms old mode 100755 new mode 100644 index a7a63b710..cbea00579 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -306,7 +306,7 @@ vm_cap.fx("2020",regi,te,rlf) $ (teBio(te) and teCCS(te)) = 0; *' switch to deactivate carbon sequestration if(c_ccsinjecratescen = 0, - vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2","ccsinjeon","1") = 0; + vm_co2CCS.fx(t,regi_capturescen,teccsinje(te)) = 0; ); *' bound on maximum annual carbon storage by region @@ -315,7 +315,7 @@ if(c_ccsinjecratescen > 0, *' DK 20100929: default value (pm_ccsinjecrate= 0.5%) is consistent with Interview Gerling (BGR) *' (http://www.iz-klima.de/aktuelles/archiv/news-2010/mai/news-05052010-2/): *' 12 Gt storage potential in Germany, 50-75 Mt/a injection => 60 Mt/a => 60/12000=0.005 - vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","ccsinjeon") * pm_ccsinjecrate(regi); + vm_co2CCS.up(t,regi,te)$(teccsinje(te)) = pm_dataccs(regi,"quan",te)$(teccsinje(te)) * pm_ccsinjecrate(regi); *** Lower limit for 2020-2030 is capacities of all projects that are operational (2020-2030) from project data base *** Upper limit for 2025 and 2030 additionally includes all projects under construction and 30% @@ -325,8 +325,8 @@ if(c_ccsinjecratescen > 0, *** Potential of EU27 regions is pooled and redistributed according to GDP (Only upper limit for 2030) *** Norway and UK announced to store CO2 for EU27 countries. So 50% of Norway and UK potential in 2030 is attributed to EU27-Pool if(not cm_emiscen = 1, !! cm_emiscen 1 = BAU - vm_co2CCS.lo(t,regi,"cco2","ico2","ccsinjeon","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030); - vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * ( + vm_co2CCS.lo(t,regi,"ccsinjeon") $ (t.val <= 2030) = s_MtCO2_2_GtC * p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030); + vm_co2CCS.up(t,regi,"ccsinjeon") $ (t.val <= 2030) = s_MtCO2_2_GtC * ( p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"construction") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"planned") $ (t.val <= 2030) * c_fracRealfromAnnouncedCCScap2030); diff --git a/core/datainput.gms b/core/datainput.gms index 05c6cd43b..cd981463d 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1637,7 +1637,7 @@ p_prodAllReference(t,regi,te) = + sum(se2se(enty,enty2,te), p_prodSeReference(t,regi,enty,enty2,te) ) + sum(se2fe(enty,enty2,te), pm_prodFEReference(t,regi,enty,enty2,te) ) + sum(fe2ue(enty,enty2,te), p_prodUeReference(t,regi,enty,enty2,te) ) - + sum(ccs2te(enty,enty2,te), sum(teCCS2rlf(te,rlf), p_co2CCSReference(t,regi,enty,enty2,te,rlf) ) ) + + sum(teccsinje(te), p_co2CCSReference(t,regi,te)) ; *' initialize vm_changeProdStartyearCost for tax calculation diff --git a/core/declarations.gms b/core/declarations.gms index 62c8d407c..4863a878a 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -153,11 +153,11 @@ vm_emiAllMkt(tall,all_regi,all_enty,all_emiMkt) "total emissions per emissi *** ------------- Emissions Positive Variables -------------------------------- positive variables -v_co2capture(ttot,all_regi) "total captured CO2 [GtC/year]" -vm_co2CCS(ttot,all_regi,all_enty,all_enty,all_te,rlf) "total CO2 injected into geological storage [GtC/a]" -v_co2capturevalve(ttot,all_regi) "total CO2 emitted right after capture [GtC/a], note: used in q_balCCUvsCCS to account for different lifetimes of capture and CCU/CCS te and capacities [GtC/year]" -v_ccsShare(ttot,all_regi) "fraction of captured CO2 that is stored geologically [share]" -vm_emiCdrAll(ttot,all_regi) "all CDR emissions, net negative emissions from land-use change, gross removals for all other options [GtC/year]" +v_co2capture(ttot,all_regi) "total captured CO2 [GtC/year]" +vm_co2CCS(ttot,all_regi,all_te) "total CO2 injected into geological storage [GtC/a]" +v_co2capturevalve(ttot,all_regi) "total CO2 emitted right after capture [GtC/a], note: used in q_balCCUvsCCS to account for different lifetimes of capture and CCU/CCS te and capacities [GtC/year]" +v_ccsShare(ttot,all_regi) "fraction of captured CO2 that is stored geologically [share]" +vm_emiCdrAll(ttot,all_regi) "all CDR emissions, net negative emissions from land-use change, gross removals for all other options [GtC/year]" ; @@ -294,7 +294,7 @@ p_maxhistProdSeGrowthRate(all_regi,all_enty,all_te) "maximum historic energy pr p_prodSeReference(ttot,all_regi,all_enty,all_enty,all_te) "Secondary Energy output of a technology in the reference run [TWa]" pm_prodFEReference(ttot,all_regi,all_enty,all_enty,all_te) "Final Energy output of a technology in the reference run [TWa]" p_prodUeReference(ttot,all_regi,all_enty,all_enty,all_te) "Useful Energy output of a technology in the reference run [TWa]" -p_co2CCSReference(ttot,all_regi,all_enty,all_enty,all_te,rlf) "Captured CO2 put through the CCS chain in ccs2te (pipelines/injection) in the reference run [GtC]" +p_co2CCSReference(ttot,all_regi,all_te) "Captured CO2 put through the CCS chain in ccs2te (pipelines/injection) in the reference run [GtC]" p_prodAllReference(ttot,all_regi,all_te) "Sum of the above in the reference run. As each technology has only one type of output, the differing units should not be a problem" *** CES calibration tarjectories industry and buildings @@ -556,10 +556,10 @@ p_extRegiccsinjecrateRegi(ext_regi) "Regional CCS injection rat equations *** carbon management technology equations -q_limitCCS(all_regi,all_enty,all_enty,all_te,rlf) "limit cumulated CO2 injection into geological storage to maximum storage potential" +q_limitCCS(all_regi,all_te) "limit cumulated CO2 injection into geological storage to maximum storage potential" *** capacity constraint for CCS (capacity * capacity factor = co2 injection) -q_limitCapCCS(ttot,all_regi,all_enty,all_enty,all_te,rlf) "capacity constraint for ccs" +q_limitCapCCS(ttot,all_regi,all_te) "capacity constraint for ccs" ; *** --------------------------------------------------------------------------- diff --git a/core/equations.gms b/core/equations.gms index c172b947b..021a1f16e 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -142,11 +142,9 @@ q_balSe(t,regi,enty2)$( entySe(enty2) AND (NOT (sameas(enty2,"seel"))) ).. * 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) - ) - ) + * vm_co2CCS(t,regi,te) + ) *** add (reused gas from waste landfills) to segas to not account for CO2 *** emissions - it comes from biomass + ( s_MtCH4_2_TWa @@ -289,8 +287,8 @@ q_limitCapFe(t,regi,te).. ***--------------------------------------------------------------------------- *' 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) +q_limitCapCCS(t,regi,teccsinje(te)).. + vm_co2CCS(t,regi,te) =e= sum(teCCS2rlf(te,rlf), vm_capFac(t,regi,te) * vm_cap(t,regi,te,rlf)); @@ -581,9 +579,9 @@ q_emiTeDetailMkt(t,regi,enty,enty2,te,enty3,emiMkt)$( pm_emifac(t,regi,enty,enty2,te,enty3) * vm_demPe(t,regi,enty,enty2,te) ) - + sum((ccs2Leak(enty,enty2,te,enty3),teCCS2rlf(te,rlf)), + + sum((ccs2Leak(enty,enty2,te,enty3)), pm_emifac(t,regi,enty,enty2,te,enty3) - * vm_co2CCS(t,regi,enty,enty2,te,rlf) + * vm_co2CCS(t,regi,te) ) )$( sameas(emiMkt,"ETS") ) + sum(se2fe(enty,enty2,te), @@ -910,7 +908,7 @@ q_balcapture(t,regi) .. q_balCCUvsCCS(t,regi) .. v_co2capture(t,regi) =e= - sum(teCCS2rlf(te,rlf), vm_co2CCS(t,regi,"cco2","ico2",te,rlf)) + sum(teccsinje(te), vm_co2CCS(t,regi,te)) + sum(teCCU2rlf(te,rlf), vm_co2CCUshort(t,regi,"cco2","ccuco2short",te,rlf)) + v_co2capturevalve(t,regi) ; @@ -919,15 +917,15 @@ q_ccsShare(t,regi) .. v_co2capture(t,regi) * v_ccsShare(t,regi) =e= - sum(teCCS2rlf(te, rlf), vm_co2CCS(t, regi, "cco2", "ico2", te, rlf)) + sum(teccsinje(te), vm_co2CCS(t,regi,te)) ; ***--------------------------------------------------------------------------- *' Definition of the CCS transformation chain: ***--------------------------------------------------------------------------- -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)) +q_limitCCS(regi,teccsinje(te)).. + sum(ttot $(ttot.val ge 2005), pm_ts(ttot) * vm_co2CCS(ttot,regi,te)) =l= pm_dataccs(regi,"quan",te); @@ -960,7 +958,7 @@ q_changeProdStartyear(t,regi,te)$( (t.val gt 2005) AND (t.val eq cm_startyear ) + sum(se2se(enty,enty2,te), vm_prodSe(t,regi,enty,enty2,te) - p_prodSeReference(t,regi,enty,enty2,te) ) + sum(se2fe(enty,enty2,te), vm_prodFe(t,regi,enty,enty2,te) - pm_prodFEReference(t,regi,enty,enty2,te) ) + sum(fe2ue(enty,enty2,te), v_prodUe (t,regi,enty,enty2,te) - p_prodUeReference(t,regi,enty,enty2,te) ) - + sum(ccs2te(enty,enty2,te), sum(teCCS2rlf(te,rlf), vm_co2CCS(t,regi,enty,enty2,te,rlf) - p_co2CCSReference(t,regi,enty,enty2,te,rlf) ) ) + + sum(teccsinje(te), vm_co2CCS(t,regi,te) - p_co2CCSReference(t,regi,te) ) ; *' calculating the relative change diff --git a/core/postsolve.gms b/core/postsolve.gms index cbcd25608..01b64b3e9 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -103,7 +103,7 @@ pm_PEPrice(ttot,regi,entyPe)$(abs (qm_budget.m(ttot,regi)) gt sm_eps) = q_balPe.m(ttot,regi,entyPe) / qm_budget.m(ttot,regi); *** calculate share of stored CO2 from captured CO2 -pm_share_CCS_CCO2(t,regi) = sum(teCCS2rlf(te,rlf), vm_co2CCS.l(t,regi,"cco2","ico2",te,rlf)) / (v_co2capture.l(t,regi)+sm_eps); +pm_share_CCS_CCO2(t,regi) = sum(teccsinje(te), vm_co2CCS.l(t,regi,te)) / (v_co2capture.l(t,regi)+sm_eps); *CG**ML*: capital interest rate diff --git a/core/sets.gms b/core/sets.gms index a2bc9dd92..d9213d776 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -1306,6 +1306,11 @@ teCCS(all_te) "Technologies with carbon capture" bioh2c "biomass to hydrogen with carbon capture" / +teccsinje(all_te) +/ + ccsinjeon +/ + te2teCCS(all_te,all_te) "Map an energy technology to its CCS equivalent" / ngcc . ngccc "natural gas combined cycle" diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index 1c660d2b3..72f20a441 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -318,8 +318,8 @@ q21_taxrevFlex(t,regi)$( t.val ge max(2010, cm_startyear) ) .. q21_taxrevCCS(t,regi)$(t.val ge max(2010,cm_startyear)).. v21_taxrevCCS(t,regi) =e= cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(t,regi,"ccsinjeon") - * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon") !! fraction of injection constraint per year + * sum(teccsinje(te), vm_co2CCS(t,regi,te) ) + * (1/pm_ccsinjecrate(regi)) * sum(teccsinje(te), vm_co2CCS(t,regi,te) ) / pm_dataccs(regi,"quan","ccsinjeon") !! fraction of injection constraint per year - p21_taxrevCCS0(t,regi) ; diff --git a/modules/21_tax/on/postsolve.gms b/modules/21_tax/on/postsolve.gms index 9bbf7b9ca..7928c1b6e 100644 --- a/modules/21_tax/on/postsolve.gms +++ b/modules/21_tax/on/postsolve.gms @@ -22,8 +22,8 @@ pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMac pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") - * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); + * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) + * (1/pm_ccsinjecrate(regi)) * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) / pm_dataccs(regi,"quan","ccsinjeon"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_taxrevFE0(ttot,regi) = sum((entyFe,sector)$entyFe2Sector(entyFe,sector), ( p21_tau_fe_tax(ttot,regi,sector,entyFe) + p21_tau_fe_sub(ttot,regi,sector,entyFe) ) diff --git a/modules/21_tax/on/presolve.gms b/modules/21_tax/on/presolve.gms index ab1420f61..b82f1f943 100644 --- a/modules/21_tax/on/presolve.gms +++ b/modules/21_tax/on/presolve.gms @@ -28,8 +28,8 @@ pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMac pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") - * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); + * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) + * (1/pm_ccsinjecrate(regi)) * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) / pm_dataccs(regi,"quan","ccsinjeon"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_emiAllco2neg0(ttot,regi) = vm_emiAllco2neg.l(ttot,regi); p21_emiAllco2neg_acrossIterations0(ttot,regi) = v21_emiAllco2neg_acrossIterations.l(ttot,regi); diff --git a/modules/32_power/IntC/equations.gms b/modules/32_power/IntC/equations.gms index 0881ec88a..968d06e18 100644 --- a/modules/32_power/IntC/equations.gms +++ b/modules/32_power/IntC/equations.gms @@ -19,8 +19,7 @@ q32_balSe(t,regi,enty2)$(sameas(enty2,"seel")).. + 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) ) ) + pm_prodCouple(regi,enty,enty3,te,enty2) * vm_co2CCS(t,regi,te) ) + vm_Mport(t,regi,enty2) =e= sum(se2fe(enty2,enty3,te), vm_demSe(t,regi,enty2,enty3,te) ) diff --git a/modules/47_regipol/none/bounds.gms b/modules/47_regipol/none/bounds.gms index 87585ad1f..2d6e6ea7d 100644 --- a/modules/47_regipol/none/bounds.gms +++ b/modules/47_regipol/none/bounds.gms @@ -21,7 +21,7 @@ loop(regi$(sameAs(regi,"DEU")), *** only small amount of co2 injection ccs until 2030 in Germany -vm_co2CCS.up(t,regi,"cco2","ico2",te,rlf)$((t.val le 2030) AND (sameas(regi,"DEU"))) = 1e-3; +vm_co2CCS.up(t,regi,"ccsinjeon",rlf)$((t.val le 2030) AND (sameas(regi,"DEU"))) = 1e-3; *** no Pe2Se fossil CCS in Germany, if c_noPeFosCCDeu = 1 chosen vm_emiTeDetail.up(t,regi,peFos,entySe,teFosCCS,"cco2")$((sameas(regi,"DEU")) AND (cm_noPeFosCCDeu = 1)) = 1e-4; *** limit German CDR amount (Energy system BECCS, DACCS, EW and negative Landuse Change emissions), conversion from MtCO2 to GtC diff --git a/modules/47_regipol/regiCarbonPrice/equations.gms b/modules/47_regipol/regiCarbonPrice/equations.gms index 304e0c020..d34a43a84 100644 --- a/modules/47_regipol/regiCarbonPrice/equations.gms +++ b/modules/47_regipol/regiCarbonPrice/equations.gms @@ -30,8 +30,8 @@ q47_implicitQttyTargetTax(t,regi)$(t.val ge max(2010,cm_startyear)).. )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + ( - p47_implicitQttyTargetTax(t,regi,qttyTarget,qttyTargetGroup) * sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS(t,regi,enty,enty2,te,rlf))) - )$(sameas(qttyTarget,"CCS")) + p47_implicitQttyTargetTax(t,regi,qttyTarget,qttyTargetGroup) * sum(teccsinje(te),vm_co2CCS(t,regi,te)) + )$(sameas(qttyTarget,"CCS")) + ( p47_implicitQttyTargetTax(t,regi,qttyTarget,qttyTargetGroup) * (-sum(te_oae33, vm_emiCdrTeDetail(t,regi,te_oae33))) @@ -122,7 +122,7 @@ $endIf.cm_VREminShare $ifthen.cm_CCSmaxBound not "%cm_CCSmaxBound%" == "off" q47_CCSmaxBound(t,regi)$p47_CCSmaxBound(regi).. - sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS(t,regi,enty,enty2,te,rlf))) + sum(teccsinje(te), vm_co2CCS(t,regi,te)) =l= p47_CCSmaxBound(regi) ; diff --git a/modules/47_regipol/regiCarbonPrice/postsolve.gms b/modules/47_regipol/regiCarbonPrice/postsolve.gms index 4cb57cdc4..0810874a7 100644 --- a/modules/47_regipol/regiCarbonPrice/postsolve.gms +++ b/modules/47_regipol/regiCarbonPrice/postsolve.gms @@ -494,7 +494,7 @@ p47_implicitQttyTargetTax0(t,regi) = ( sum(entySe$energyQttyTargetANDGroup2enty("FE",qttyTargetGroup,entySe), sum(se2fe(entySe,entyFe,te), sum((sector,emiMkt)$(entyFe2Sector(entyFe,sector) AND sector2emiMkt(sector,emiMkt)), vm_demFeSector.l(t,regi,entySe,entyFe,sector,emiMkt)))) )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + - ( sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS.l(t,regi,enty,enty2,te,rlf))) + ( sum(teccsinje(te), vm_co2CCS.l(t,regi,te)) )$(sameas(qttyTarget,"CCS") AND sameas(qttyTargetGroup,"all")) + ( sum(te_oae33, -vm_emiCdrTeDetail.l(t,regi,te_oae33)) @@ -526,7 +526,7 @@ loop((ttot,ext_regi,taxType,targetType,qttyTarget,qttyTargetGroup)$pm_implicitQt )$(sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + - ( sum(regi$regi_groupExt(ext_regi,regi), sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf)))) + ( sum(regi$regi_groupExt(ext_regi,regi), sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te))) )$(sameas(qttyTarget,"CCS") AND sameas(qttyTargetGroup,"all")) + ( sum(regi$regi_groupExt(ext_regi,regi), sum(te_oae33, -vm_emiCdrTeDetail.l(ttot,regi,te_oae33))) diff --git a/modules/47_regipol/regiCarbonPrice/presolve.gms b/modules/47_regipol/regiCarbonPrice/presolve.gms index 9d96a7f67..60cfe20be 100644 --- a/modules/47_regipol/regiCarbonPrice/presolve.gms +++ b/modules/47_regipol/regiCarbonPrice/presolve.gms @@ -62,7 +62,7 @@ p47_implicitQttyTargetTax0(t,regi) = ( sum(entySe$energyQttyTargetANDGroup2enty("FE",qttyTargetGroup,entySe), sum(se2fe(entySe,entyFe,te), sum((sector,emiMkt)$(entyFe2Sector(entyFe,sector) AND sector2emiMkt(sector,emiMkt)), vm_demFeSector.l(t,regi,entySe,entyFe,sector,emiMkt)))) )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + - ( sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS.l(t,regi,enty,enty2,te,rlf))) + ( sum(teccsinje(te), vm_co2CCS.l(t,regi,te)) )$(sameas(qttyTarget,"CCS") AND sameas(qttyTargetGroup,"all")) + ( sum(te_oae33, -vm_emiCdrTeDetail.l(t,regi,te_oae33)) From 032192c5a5a6cbe9931a2275673ead2105ef1bf2 Mon Sep 17 00:00:00 2001 From: David Klein Date: Mon, 9 Feb 2026 11:48:06 +0100 Subject: [PATCH 09/25] Revert "Remove unnecessary dimensions (all_enty,all_enty,rlf) from vm_co2CCS" This reverts commit 78fbc819af2608b2709ea8913b32f4667aff500c. --- core/bounds.gms | 8 +++---- core/datainput.gms | 2 +- core/declarations.gms | 16 ++++++------- core/equations.gms | 24 ++++++++++--------- core/postsolve.gms | 2 +- core/sets.gms | 5 ---- modules/21_tax/on/equations.gms | 4 ++-- modules/21_tax/on/postsolve.gms | 4 ++-- modules/21_tax/on/presolve.gms | 4 ++-- modules/32_power/IntC/equations.gms | 3 ++- modules/47_regipol/none/bounds.gms | 2 +- .../47_regipol/regiCarbonPrice/equations.gms | 6 ++--- .../47_regipol/regiCarbonPrice/postsolve.gms | 4 ++-- .../47_regipol/regiCarbonPrice/presolve.gms | 2 +- 14 files changed, 42 insertions(+), 44 deletions(-) mode change 100644 => 100755 core/bounds.gms diff --git a/core/bounds.gms b/core/bounds.gms old mode 100644 new mode 100755 index cbea00579..a7a63b710 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -306,7 +306,7 @@ vm_cap.fx("2020",regi,te,rlf) $ (teBio(te) and teCCS(te)) = 0; *' switch to deactivate carbon sequestration if(c_ccsinjecratescen = 0, - vm_co2CCS.fx(t,regi_capturescen,teccsinje(te)) = 0; + vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2","ccsinjeon","1") = 0; ); *' bound on maximum annual carbon storage by region @@ -315,7 +315,7 @@ if(c_ccsinjecratescen > 0, *' DK 20100929: default value (pm_ccsinjecrate= 0.5%) is consistent with Interview Gerling (BGR) *' (http://www.iz-klima.de/aktuelles/archiv/news-2010/mai/news-05052010-2/): *' 12 Gt storage potential in Germany, 50-75 Mt/a injection => 60 Mt/a => 60/12000=0.005 - vm_co2CCS.up(t,regi,te)$(teccsinje(te)) = pm_dataccs(regi,"quan",te)$(teccsinje(te)) * pm_ccsinjecrate(regi); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","ccsinjeon") * pm_ccsinjecrate(regi); *** Lower limit for 2020-2030 is capacities of all projects that are operational (2020-2030) from project data base *** Upper limit for 2025 and 2030 additionally includes all projects under construction and 30% @@ -325,8 +325,8 @@ if(c_ccsinjecratescen > 0, *** Potential of EU27 regions is pooled and redistributed according to GDP (Only upper limit for 2030) *** Norway and UK announced to store CO2 for EU27 countries. So 50% of Norway and UK potential in 2030 is attributed to EU27-Pool if(not cm_emiscen = 1, !! cm_emiscen 1 = BAU - vm_co2CCS.lo(t,regi,"ccsinjeon") $ (t.val <= 2030) = s_MtCO2_2_GtC * p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030); - vm_co2CCS.up(t,regi,"ccsinjeon") $ (t.val <= 2030) = s_MtCO2_2_GtC * ( + vm_co2CCS.lo(t,regi,"cco2","ico2","ccsinjeon","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") $ (t.val <= 2030) = s_MtCO2_2_GtC * ( p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"construction") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"planned") $ (t.val <= 2030) * c_fracRealfromAnnouncedCCScap2030); diff --git a/core/datainput.gms b/core/datainput.gms index cd981463d..05c6cd43b 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1637,7 +1637,7 @@ p_prodAllReference(t,regi,te) = + sum(se2se(enty,enty2,te), p_prodSeReference(t,regi,enty,enty2,te) ) + sum(se2fe(enty,enty2,te), pm_prodFEReference(t,regi,enty,enty2,te) ) + sum(fe2ue(enty,enty2,te), p_prodUeReference(t,regi,enty,enty2,te) ) - + sum(teccsinje(te), p_co2CCSReference(t,regi,te)) + + sum(ccs2te(enty,enty2,te), sum(teCCS2rlf(te,rlf), p_co2CCSReference(t,regi,enty,enty2,te,rlf) ) ) ; *' initialize vm_changeProdStartyearCost for tax calculation diff --git a/core/declarations.gms b/core/declarations.gms index 4863a878a..62c8d407c 100644 --- a/core/declarations.gms +++ b/core/declarations.gms @@ -153,11 +153,11 @@ vm_emiAllMkt(tall,all_regi,all_enty,all_emiMkt) "total emissions per emissi *** ------------- Emissions Positive Variables -------------------------------- positive variables -v_co2capture(ttot,all_regi) "total captured CO2 [GtC/year]" -vm_co2CCS(ttot,all_regi,all_te) "total CO2 injected into geological storage [GtC/a]" -v_co2capturevalve(ttot,all_regi) "total CO2 emitted right after capture [GtC/a], note: used in q_balCCUvsCCS to account for different lifetimes of capture and CCU/CCS te and capacities [GtC/year]" -v_ccsShare(ttot,all_regi) "fraction of captured CO2 that is stored geologically [share]" -vm_emiCdrAll(ttot,all_regi) "all CDR emissions, net negative emissions from land-use change, gross removals for all other options [GtC/year]" +v_co2capture(ttot,all_regi) "total captured CO2 [GtC/year]" +vm_co2CCS(ttot,all_regi,all_enty,all_enty,all_te,rlf) "total CO2 injected into geological storage [GtC/a]" +v_co2capturevalve(ttot,all_regi) "total CO2 emitted right after capture [GtC/a], note: used in q_balCCUvsCCS to account for different lifetimes of capture and CCU/CCS te and capacities [GtC/year]" +v_ccsShare(ttot,all_regi) "fraction of captured CO2 that is stored geologically [share]" +vm_emiCdrAll(ttot,all_regi) "all CDR emissions, net negative emissions from land-use change, gross removals for all other options [GtC/year]" ; @@ -294,7 +294,7 @@ p_maxhistProdSeGrowthRate(all_regi,all_enty,all_te) "maximum historic energy pr p_prodSeReference(ttot,all_regi,all_enty,all_enty,all_te) "Secondary Energy output of a technology in the reference run [TWa]" pm_prodFEReference(ttot,all_regi,all_enty,all_enty,all_te) "Final Energy output of a technology in the reference run [TWa]" p_prodUeReference(ttot,all_regi,all_enty,all_enty,all_te) "Useful Energy output of a technology in the reference run [TWa]" -p_co2CCSReference(ttot,all_regi,all_te) "Captured CO2 put through the CCS chain in ccs2te (pipelines/injection) in the reference run [GtC]" +p_co2CCSReference(ttot,all_regi,all_enty,all_enty,all_te,rlf) "Captured CO2 put through the CCS chain in ccs2te (pipelines/injection) in the reference run [GtC]" p_prodAllReference(ttot,all_regi,all_te) "Sum of the above in the reference run. As each technology has only one type of output, the differing units should not be a problem" *** CES calibration tarjectories industry and buildings @@ -556,10 +556,10 @@ p_extRegiccsinjecrateRegi(ext_regi) "Regional CCS injection rat equations *** carbon management technology equations -q_limitCCS(all_regi,all_te) "limit cumulated CO2 injection into geological storage to maximum storage potential" +q_limitCCS(all_regi,all_enty,all_enty,all_te,rlf) "limit cumulated CO2 injection into geological storage to maximum storage potential" *** capacity constraint for CCS (capacity * capacity factor = co2 injection) -q_limitCapCCS(ttot,all_regi,all_te) "capacity constraint for ccs" +q_limitCapCCS(ttot,all_regi,all_enty,all_enty,all_te,rlf) "capacity constraint for ccs" ; *** --------------------------------------------------------------------------- diff --git a/core/equations.gms b/core/equations.gms index 021a1f16e..c172b947b 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -142,9 +142,11 @@ q_balSe(t,regi,enty2)$( entySe(enty2) AND (NOT (sameas(enty2,"seel"))) ).. * 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,te) - ) + * 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 + ( s_MtCH4_2_TWa @@ -287,8 +289,8 @@ q_limitCapFe(t,regi,te).. ***--------------------------------------------------------------------------- *' Definition of capacity constraints for CCS technologies: ***--------------------------------------------------------------------------- -q_limitCapCCS(t,regi,teccsinje(te)).. - vm_co2CCS(t,regi,te) +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)); @@ -579,9 +581,9 @@ q_emiTeDetailMkt(t,regi,enty,enty2,te,enty3,emiMkt)$( pm_emifac(t,regi,enty,enty2,te,enty3) * vm_demPe(t,regi,enty,enty2,te) ) - + sum((ccs2Leak(enty,enty2,te,enty3)), + + sum((ccs2Leak(enty,enty2,te,enty3),teCCS2rlf(te,rlf)), pm_emifac(t,regi,enty,enty2,te,enty3) - * vm_co2CCS(t,regi,te) + * vm_co2CCS(t,regi,enty,enty2,te,rlf) ) )$( sameas(emiMkt,"ETS") ) + sum(se2fe(enty,enty2,te), @@ -908,7 +910,7 @@ q_balcapture(t,regi) .. q_balCCUvsCCS(t,regi) .. v_co2capture(t,regi) =e= - sum(teccsinje(te), vm_co2CCS(t,regi,te)) + 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) ; @@ -917,15 +919,15 @@ q_ccsShare(t,regi) .. v_co2capture(t,regi) * v_ccsShare(t,regi) =e= - sum(teccsinje(te), vm_co2CCS(t,regi,te)) + sum(teCCS2rlf(te, rlf), vm_co2CCS(t, regi, "cco2", "ico2", te, rlf)) ; ***--------------------------------------------------------------------------- *' Definition of the CCS transformation chain: ***--------------------------------------------------------------------------- -q_limitCCS(regi,teccsinje(te)).. - sum(ttot $(ttot.val ge 2005), pm_ts(ttot) * vm_co2CCS(ttot,regi,te)) +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",te); @@ -958,7 +960,7 @@ q_changeProdStartyear(t,regi,te)$( (t.val gt 2005) AND (t.val eq cm_startyear ) + sum(se2se(enty,enty2,te), vm_prodSe(t,regi,enty,enty2,te) - p_prodSeReference(t,regi,enty,enty2,te) ) + sum(se2fe(enty,enty2,te), vm_prodFe(t,regi,enty,enty2,te) - pm_prodFEReference(t,regi,enty,enty2,te) ) + sum(fe2ue(enty,enty2,te), v_prodUe (t,regi,enty,enty2,te) - p_prodUeReference(t,regi,enty,enty2,te) ) - + sum(teccsinje(te), vm_co2CCS(t,regi,te) - p_co2CCSReference(t,regi,te) ) + + sum(ccs2te(enty,enty2,te), sum(teCCS2rlf(te,rlf), vm_co2CCS(t,regi,enty,enty2,te,rlf) - p_co2CCSReference(t,regi,enty,enty2,te,rlf) ) ) ; *' calculating the relative change diff --git a/core/postsolve.gms b/core/postsolve.gms index 01b64b3e9..cbcd25608 100644 --- a/core/postsolve.gms +++ b/core/postsolve.gms @@ -103,7 +103,7 @@ pm_PEPrice(ttot,regi,entyPe)$(abs (qm_budget.m(ttot,regi)) gt sm_eps) = q_balPe.m(ttot,regi,entyPe) / qm_budget.m(ttot,regi); *** calculate share of stored CO2 from captured CO2 -pm_share_CCS_CCO2(t,regi) = sum(teccsinje(te), vm_co2CCS.l(t,regi,te)) / (v_co2capture.l(t,regi)+sm_eps); +pm_share_CCS_CCO2(t,regi) = sum(teCCS2rlf(te,rlf), vm_co2CCS.l(t,regi,"cco2","ico2",te,rlf)) / (v_co2capture.l(t,regi)+sm_eps); *CG**ML*: capital interest rate diff --git a/core/sets.gms b/core/sets.gms index d9213d776..a2bc9dd92 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -1306,11 +1306,6 @@ teCCS(all_te) "Technologies with carbon capture" bioh2c "biomass to hydrogen with carbon capture" / -teccsinje(all_te) -/ - ccsinjeon -/ - te2teCCS(all_te,all_te) "Map an energy technology to its CCS equivalent" / ngcc . ngccc "natural gas combined cycle" diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index 72f20a441..1c660d2b3 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -318,8 +318,8 @@ q21_taxrevFlex(t,regi)$( t.val ge max(2010, cm_startyear) ) .. q21_taxrevCCS(t,regi)$(t.val ge max(2010,cm_startyear)).. v21_taxrevCCS(t,regi) =e= cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(t,regi,"ccsinjeon") - * sum(teccsinje(te), vm_co2CCS(t,regi,te) ) - * (1/pm_ccsinjecrate(regi)) * sum(teccsinje(te), vm_co2CCS(t,regi,te) ) / pm_dataccs(regi,"quan","ccsinjeon") !! fraction of injection constraint per year + * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) ) + * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon") !! fraction of injection constraint per year - p21_taxrevCCS0(t,regi) ; diff --git a/modules/21_tax/on/postsolve.gms b/modules/21_tax/on/postsolve.gms index 7928c1b6e..9bbf7b9ca 100644 --- a/modules/21_tax/on/postsolve.gms +++ b/modules/21_tax/on/postsolve.gms @@ -22,8 +22,8 @@ pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMac pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") - * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) - * (1/pm_ccsinjecrate(regi)) * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) / pm_dataccs(regi,"quan","ccsinjeon"); + * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) + * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_taxrevFE0(ttot,regi) = sum((entyFe,sector)$entyFe2Sector(entyFe,sector), ( p21_tau_fe_tax(ttot,regi,sector,entyFe) + p21_tau_fe_sub(ttot,regi,sector,entyFe) ) diff --git a/modules/21_tax/on/presolve.gms b/modules/21_tax/on/presolve.gms index b82f1f943..ab1420f61 100644 --- a/modules/21_tax/on/presolve.gms +++ b/modules/21_tax/on/presolve.gms @@ -28,8 +28,8 @@ pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMac pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") - * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) - * (1/pm_ccsinjecrate(regi)) * sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te) ) / pm_dataccs(regi,"quan","ccsinjeon"); + * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) + * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_emiAllco2neg0(ttot,regi) = vm_emiAllco2neg.l(ttot,regi); p21_emiAllco2neg_acrossIterations0(ttot,regi) = v21_emiAllco2neg_acrossIterations.l(ttot,regi); diff --git a/modules/32_power/IntC/equations.gms b/modules/32_power/IntC/equations.gms index 968d06e18..0881ec88a 100644 --- a/modules/32_power/IntC/equations.gms +++ b/modules/32_power/IntC/equations.gms @@ -19,7 +19,8 @@ q32_balSe(t,regi,enty2)$(sameas(enty2,"seel")).. + 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), - pm_prodCouple(regi,enty,enty3,te,enty2) * vm_co2CCS(t,regi,te) ) + sum(teCCS2rlf(te,rlf), + pm_prodCouple(regi,enty,enty3,te,enty2) * vm_co2CCS(t,regi,enty,enty3,te,rlf) ) ) + vm_Mport(t,regi,enty2) =e= sum(se2fe(enty2,enty3,te), vm_demSe(t,regi,enty2,enty3,te) ) diff --git a/modules/47_regipol/none/bounds.gms b/modules/47_regipol/none/bounds.gms index 2d6e6ea7d..87585ad1f 100644 --- a/modules/47_regipol/none/bounds.gms +++ b/modules/47_regipol/none/bounds.gms @@ -21,7 +21,7 @@ loop(regi$(sameAs(regi,"DEU")), *** only small amount of co2 injection ccs until 2030 in Germany -vm_co2CCS.up(t,regi,"ccsinjeon",rlf)$((t.val le 2030) AND (sameas(regi,"DEU"))) = 1e-3; +vm_co2CCS.up(t,regi,"cco2","ico2",te,rlf)$((t.val le 2030) AND (sameas(regi,"DEU"))) = 1e-3; *** no Pe2Se fossil CCS in Germany, if c_noPeFosCCDeu = 1 chosen vm_emiTeDetail.up(t,regi,peFos,entySe,teFosCCS,"cco2")$((sameas(regi,"DEU")) AND (cm_noPeFosCCDeu = 1)) = 1e-4; *** limit German CDR amount (Energy system BECCS, DACCS, EW and negative Landuse Change emissions), conversion from MtCO2 to GtC diff --git a/modules/47_regipol/regiCarbonPrice/equations.gms b/modules/47_regipol/regiCarbonPrice/equations.gms index d34a43a84..304e0c020 100644 --- a/modules/47_regipol/regiCarbonPrice/equations.gms +++ b/modules/47_regipol/regiCarbonPrice/equations.gms @@ -30,8 +30,8 @@ q47_implicitQttyTargetTax(t,regi)$(t.val ge max(2010,cm_startyear)).. )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + ( - p47_implicitQttyTargetTax(t,regi,qttyTarget,qttyTargetGroup) * sum(teccsinje(te),vm_co2CCS(t,regi,te)) - )$(sameas(qttyTarget,"CCS")) + p47_implicitQttyTargetTax(t,regi,qttyTarget,qttyTargetGroup) * sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS(t,regi,enty,enty2,te,rlf))) + )$(sameas(qttyTarget,"CCS")) + ( p47_implicitQttyTargetTax(t,regi,qttyTarget,qttyTargetGroup) * (-sum(te_oae33, vm_emiCdrTeDetail(t,regi,te_oae33))) @@ -122,7 +122,7 @@ $endIf.cm_VREminShare $ifthen.cm_CCSmaxBound not "%cm_CCSmaxBound%" == "off" q47_CCSmaxBound(t,regi)$p47_CCSmaxBound(regi).. - sum(teccsinje(te), vm_co2CCS(t,regi,te)) + sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS(t,regi,enty,enty2,te,rlf))) =l= p47_CCSmaxBound(regi) ; diff --git a/modules/47_regipol/regiCarbonPrice/postsolve.gms b/modules/47_regipol/regiCarbonPrice/postsolve.gms index 0810874a7..4cb57cdc4 100644 --- a/modules/47_regipol/regiCarbonPrice/postsolve.gms +++ b/modules/47_regipol/regiCarbonPrice/postsolve.gms @@ -494,7 +494,7 @@ p47_implicitQttyTargetTax0(t,regi) = ( sum(entySe$energyQttyTargetANDGroup2enty("FE",qttyTargetGroup,entySe), sum(se2fe(entySe,entyFe,te), sum((sector,emiMkt)$(entyFe2Sector(entyFe,sector) AND sector2emiMkt(sector,emiMkt)), vm_demFeSector.l(t,regi,entySe,entyFe,sector,emiMkt)))) )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + - ( sum(teccsinje(te), vm_co2CCS.l(t,regi,te)) + ( sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS.l(t,regi,enty,enty2,te,rlf))) )$(sameas(qttyTarget,"CCS") AND sameas(qttyTargetGroup,"all")) + ( sum(te_oae33, -vm_emiCdrTeDetail.l(t,regi,te_oae33)) @@ -526,7 +526,7 @@ loop((ttot,ext_regi,taxType,targetType,qttyTarget,qttyTargetGroup)$pm_implicitQt )$(sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + - ( sum(regi$regi_groupExt(ext_regi,regi), sum(teccsinje(te), vm_co2CCS.l(ttot,regi,te))) + ( sum(regi$regi_groupExt(ext_regi,regi), sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf)))) )$(sameas(qttyTarget,"CCS") AND sameas(qttyTargetGroup,"all")) + ( sum(regi$regi_groupExt(ext_regi,regi), sum(te_oae33, -vm_emiCdrTeDetail.l(ttot,regi,te_oae33))) diff --git a/modules/47_regipol/regiCarbonPrice/presolve.gms b/modules/47_regipol/regiCarbonPrice/presolve.gms index 60cfe20be..9d96a7f67 100644 --- a/modules/47_regipol/regiCarbonPrice/presolve.gms +++ b/modules/47_regipol/regiCarbonPrice/presolve.gms @@ -62,7 +62,7 @@ p47_implicitQttyTargetTax0(t,regi) = ( sum(entySe$energyQttyTargetANDGroup2enty("FE",qttyTargetGroup,entySe), sum(se2fe(entySe,entyFe,te), sum((sector,emiMkt)$(entyFe2Sector(entyFe,sector) AND sector2emiMkt(sector,emiMkt)), vm_demFeSector.l(t,regi,entySe,entyFe,sector,emiMkt)))) )$(sameas(qttyTarget,"FE") or sameas(qttyTarget,"FE_wo_b") or sameas(qttyTarget,"FE_wo_n_e") or sameas(qttyTarget,"FE_wo_b_wo_n_e")) + - ( sum(teccsinje(te), vm_co2CCS.l(t,regi,te)) + ( sum(ccs2te(ccsCo2(enty),enty2,te), sum(teCCS2rlf(te,rlf),vm_co2CCS.l(t,regi,enty,enty2,te,rlf))) )$(sameas(qttyTarget,"CCS") AND sameas(qttyTargetGroup,"all")) + ( sum(te_oae33, -vm_emiCdrTeDetail.l(t,regi,te_oae33)) From 8205dac283bd8ff98fe9fd1d03de03b9712c9f06 Mon Sep 17 00:00:00 2001 From: David Klein Date: Thu, 5 Feb 2026 16:39:34 +0100 Subject: [PATCH 10/25] Start adding ccsinjeoff to sets --- core/bounds.gms | 7 ++++--- core/sets.gms | 15 +++++++++++---- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/core/bounds.gms b/core/bounds.gms index a7a63b710..f7d8bf333 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -306,7 +306,7 @@ vm_cap.fx("2020",regi,te,rlf) $ (teBio(te) and teCCS(te)) = 0; *' switch to deactivate carbon sequestration if(c_ccsinjecratescen = 0, - vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2","ccsinjeon","1") = 0; + vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2",teCCS2rlf(te,rlf)) = 0; ); *' bound on maximum annual carbon storage by region @@ -315,7 +315,8 @@ if(c_ccsinjecratescen > 0, *' DK 20100929: default value (pm_ccsinjecrate= 0.5%) is consistent with Interview Gerling (BGR) *' (http://www.iz-klima.de/aktuelles/archiv/news-2010/mai/news-05052010-2/): *' 12 Gt storage potential in Germany, 50-75 Mt/a injection => 60 Mt/a => 60/12000=0.005 - vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","ccsinjeon") * pm_ccsinjecrate(regi); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeon","1") = pm_dataccs(regi,"quan","ccsinjeon") * pm_ccsinjecrate(regi); + vm_co2CCS.up(t,regi,"cco2","ico2","ccsinjeoff","1") = pm_dataccs(regi,"quan","ccsinjeoff") * pm_ccsinjecrate(regi); *** Lower limit for 2020-2030 is capacities of all projects that are operational (2020-2030) from project data base *** Upper limit for 2025 and 2030 additionally includes all projects under construction and 30% @@ -341,7 +342,7 @@ if(cm_emiscen = 1, if(cm_ccapturescen = 2, !! no carbon capture at all vm_cap.fx(t,regi_capturescen,teCCS,rlf) = 0; - vm_cap.fx(t,regi_capturescen,"ccsinjeon",rlf) = 0; + vm_cap.fx(t,regi_capturescen,teCCS2rlf(te,rlf)) = 0; elseif(cm_ccapturescen = 3), !! no bio carbon capture: vm_cap.fx(t,regi_capturescen,te,rlf) $ (teCCS(te) and teBio(te)) = 0; elseif(cm_ccapturescen = 4), !! no carbon capture in the electricity sector diff --git a/core/sets.gms b/core/sets.gms index a2bc9dd92..2a4193d26 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -224,7 +224,8 @@ all_te "all energy technologies, including from modules" tdhes "transmission and distribution for heat to stationary users" tdheb "transmission and distribution for heat to buildings" - ccsinjeon "injection of co2" + ccsinjeon "transport, injection, and storage of co2 onshore" + ccsinjeoff "transport, injection, and storage of co2 offshore" *** Storage technology: storspv "storage technology for photo voltaic (PV)" storwind "storage technology for wind onshore" @@ -1145,7 +1146,8 @@ te(all_te) "energy technologies" tdh2i "helper technologies (without cost) to avoid sudden H2 use switching in buildings and industry" tdh2b "helper technologies (without cost) to avoid sudden H2 use switching in buildings and industry" - ccsinjeon "injection of co2, CCS related" + ccsinjeon "transport, injection, and storage of co2 onshore, CCS related" + ccsinjeoff "transport, injection, and storage of co2 offshore, CCS related" storspv "storage technology for photo voltaic" *** storwind "storage technology for wind onshore" @@ -1228,7 +1230,8 @@ teAdj(all_te) "technologies with adjustment costs on capacity addition elh2 "hydrogen elecrolysis" h2turb "hydrogen turbine for electricity production" h2curt "hydrogen production from curtailment" - ccsinjeon "injection of co2, CCS related" + ccsinjeon "transport, injection, and storage of co2 onshore, CCS related" + ccsinjeoff "transport, injection, and storage of co2 offshore, CCS related" storspv "storage technology for PV" *** storwind "storage technology for wind onshore" @@ -2524,6 +2527,7 @@ pc2te(all_enty,all_enty,all_te,all_enty) "mapping for own consumption of tech segafos.fegas.tdfosgas.seel pegeo.sehe.geohe.seel cco2.ico2.ccsinjeon.seel + cco2.ico2.ccsinjeoff.seel / *NB* mappings for emissions, capture and leakage emi2te(all_enty,all_enty,all_te,all_enty) " map emissions to technologies" @@ -2630,6 +2634,7 @@ emi2te(all_enty,all_enty,all_te,all_enty) " map emissions to technologies" segabio.fegas.tdbiogas.ch4 segafos.fegas.tdfosgas.ch4 cco2.ico2.ccsinjeon.co2 + cco2.ico2.ccsinjeoff.co2 pebiolc.seel.bioigccc.co2 pebiolc.seel.bioigccc.cco2 seliqbio.fehos.tdbiohos.bc @@ -2744,11 +2749,13 @@ emi2fuelMine(all_enty,all_enty,rlf) "missions from fossil fuel extraction" ccs2te(all_enty,all_enty,all_te) "chain for ccs" / cco2.ico2.ccsinjeon + cco2.ico2.ccsinjeoff / ccs2Leak(all_enty,all_enty,all_te,all_enty) "leakage along ccs chain" / cco2.ico2.ccsinjeon.co2 + cco2.ico2.ccsinjeoff.co2 / pe2rlf(all_enty,rlf) "map exhaustible energy to grades for qm_fuel2pe" @@ -2823,7 +2830,7 @@ teMat2rlf(all_te,rlf) "mapping for material production technologies to grade teCCS2rlf(all_te,rlf) "mapping for CCS technologies to grades" / - (ccsinjeon) . 1 + (ccsinjeon,ccsinjeoff) . 1 / teNoTransform2rlf(all_te,rlf) "mapping for no transformation technologies to grades" From 7455180f29a2050914cf4b5365025dc0bd7a99bc Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 11 Feb 2026 15:28:54 +0100 Subject: [PATCH 11/25] Formatting --- modules/32_power/IntC/equations.gms | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/32_power/IntC/equations.gms b/modules/32_power/IntC/equations.gms index 0881ec88a..840ecef3f 100644 --- a/modules/32_power/IntC/equations.gms +++ b/modules/32_power/IntC/equations.gms @@ -18,10 +18,10 @@ q32_balSe(t,regi,enty2)$(sameas(enty2,"seel")).. 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(pc2te(enty,enty3,te,enty2), sum(teCCS2rlf(te,rlf), pm_prodCouple(regi,enty,enty3,te,enty2) * vm_co2CCS(t,regi,enty,enty3,te,rlf) ) ) - + vm_Mport(t,regi,enty2) + + vm_Mport(t,regi,enty2) =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) ) From 8a5021641c9ac10ca217ab26073eabfe92853c21 Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 11 Feb 2026 15:29:43 +0100 Subject: [PATCH 12/25] Add ccsinjeoff to code (transport, injection, and storage of co2 offshore) --- core/bounds.gms | 1 + core/datainput.gms | 20 ++++++++++------- core/equations.gms | 16 +++++++------- core/input/generisdata_tech.prn | 22 +++++++++---------- core/input/generisdata_vintages.prn | 4 ++-- core/sets.gms | 7 +++++- .../04_PE_FE_parameters/iea2014/datainput.gms | 3 ++- modules/21_tax/on/equations.gms | 10 ++++++--- modules/21_tax/on/postsolve.gms | 11 +++++++--- modules/21_tax/on/presolve.gms | 11 +++++++--- modules/47_regipol/none/bounds.gms | 2 +- 11 files changed, 66 insertions(+), 41 deletions(-) diff --git a/core/bounds.gms b/core/bounds.gms index f7d8bf333..4b3a98800 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -331,6 +331,7 @@ if(c_ccsinjecratescen > 0, p_boundCapCCS(t,regi,"operational") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"construction") $ (t.val <= 2030) + p_boundCapCCS(t,regi,"planned") $ (t.val <= 2030) * c_fracRealfromAnnouncedCCScap2030); + !! DKX: assumptions for ccsinjeoff ); ); diff --git a/core/datainput.gms b/core/datainput.gms index 05c6cd43b..419320865 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -161,7 +161,7 @@ fm_dataglob("learn", te)$(sameAs(te, "biopyronly") OR sameAs(te, "biopyrhe") OR $ifthen.c_techAssumptScen "%c_techAssumptScen%" == "SSP1" *** hampers technologies with CCS or FT *** TODO: add industry ccs technologies bfcc and idrcc - loop(te $ (teCCS(te) or teFischerTropsch(te) or sameas(te,"ccsinjeon")), + loop(te $ (teCCS(te) or teFischerTropsch(te) or teccsinje(te)), !! DKX: assumptions correct? fm_dataglob("inco0",te) = 1.3 * fm_dataglob("inco0",te); ); *** hampers nuclear a lot @@ -212,7 +212,7 @@ $elseif.c_techAssumptScen "%c_techAssumptScen%" == "SSP3" $elseif.c_techAssumptScen "%c_techAssumptScen%" == "SSP5" *** favours technologies with CCS or FT - loop(te $ (teCCS(te) or teFischerTropsch(te) or sameas(te,"ccsinjeon")), + loop(te $ (teCCS(te) or teFischerTropsch(te) or teccsinje(te)), !! DKX: assumptions correct? fm_dataglob("inco0",te) = 0.9 * fm_dataglob("inco0",te); ); *** hampers nuclear @@ -242,10 +242,14 @@ $endif.c_techAssumptScen *** Warning: it applies absolute values; only use it in combination with default c_techAssumptScen SSP2. *** low estimate: ccsinjeon cost prior to 03/2024; i.e. ~11 USD/tCO2 in 2025, decreasing to ~7.5USD/tCO2 as of 2035 $if "%cm_ccsinjeCost%" == "low" fm_dataglob("tech_stat","ccsinjeon") = 2; -$if "%cm_ccsinjeCost%" == "low" fm_dataglob("inco0","ccsinjeon") = 220; +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("inco0","ccsinjeon") = 220; $if "%cm_ccsinjeCost%" == "low" fm_dataglob("constrTme","ccsinjeon") = 0; +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("tech_stat","ccsinjeoff") = 2; !! DKX: assumptions +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("inco0","ccsinjeoff") = 330; !! DKX: assumptions +$if "%cm_ccsinjeCost%" == "low" fm_dataglob("constrTme","ccsinjeoff") = 0; !! DKX: assumptions *** high estimate: ~20USD/tCO2 (constant), assuming upper end of storage cost and long transport distances -$if "%cm_ccsinjeCost%" == "high" fm_dataglob("inco0","ccsinjeon") = 550; +$if "%cm_ccsinjeCost%" == "high" fm_dataglob("inco0","ccsinjeon") = 550; +$if "%cm_ccsinjeCost%" == "high" fm_dataglob("inco0","ccsinjeoff") = 825; !! DKX: assumptions *** cm_VRE_supply_assumptions: Modify learning and floor costs for electricity storage and production of VRE @@ -1170,13 +1174,13 @@ $offdelim *** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen if (c_geoStorPotScen eq 1, pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potTechOn"); -*** pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potTechOff"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.0000001; !!f_geoStorPot(all_regi, "potTechOff"); elseif (c_geoStorPotScen eq 2), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potLimOn"); -*** pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potLimOff"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.0000001; !!f_geoStorPot(all_regi, "potLimOff"); elseif (c_geoStorPotScen eq 3), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "mixedOld"); -*** pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0; + pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.0000001; ); ***----------------------------------------------------------------------------- @@ -1275,7 +1279,7 @@ $endif.cm_subsec_model_steel p_adj_coeff(ttot,regi,"MeOH") = 0.5; p_adj_coeff(ttot,regi,"h22ch4") = 0.5; *** CO2 storage and CDR technologies - p_adj_coeff(ttot,regi,"ccsinjeon") = 1.0; + p_adj_coeff(ttot,regi,teccsinje) = 1.0; p_adj_coeff(ttot,regi,"biopyronly") = 0.55; !! like biochp and bioigcc; p_adj_coeff(ttot,regi,"biopyrhe") = 0.55; !! like biochp and bioigcc; p_adj_coeff(ttot,regi,"biopyrchp") = 0.55; !! like biochp and bioigcc; diff --git a/core/equations.gms b/core/equations.gms index c172b947b..bad7fddaf 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -142,11 +142,11 @@ q_balSe(t,regi,enty2)$( entySe(enty2) AND (NOT (sameas(enty2,"seel"))) ).. * 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) - ) - ) + 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 + ( s_MtCH4_2_TWa @@ -572,7 +572,7 @@ q_emiTe(t,regi,emiTe(enty)).. *' transformations within the chain of CCS steps (Leakage). ***----------------------------------------------------------------------------- q_emiTeDetailMkt(t,regi,enty,enty2,te,enty3,emiMkt)$( - emi2te(enty,enty2,te,enty3) + emi2te(enty,enty2,te,enty3) !! emi2te = cco2.ico2.ccsinje.co2 OR (pe2se(enty,enty2,te) AND sameas(enty3,"cco2")) ) .. vm_emiTeDetailMkt(t,regi,enty,enty2,te,enty3,emiMkt) =e= @@ -581,7 +581,7 @@ q_emiTeDetailMkt(t,regi,enty,enty2,te,enty3,emiMkt)$( pm_emifac(t,regi,enty,enty2,te,enty3) * vm_demPe(t,regi,enty,enty2,te) ) - + sum((ccs2Leak(enty,enty2,te,enty3),teCCS2rlf(te,rlf)), + + sum((ccs2Leak(enty,enty2,te,enty3),teCCS2rlf(te,rlf)), !! ccs2Leak = cco2.ico2.ccsinje.co2 pm_emifac(t,regi,enty,enty2,te,enty3) * vm_co2CCS(t,regi,enty,enty2,te,rlf) ) @@ -926,7 +926,7 @@ q_ccsShare(t,regi) .. *' Definition of the CCS transformation chain: ***--------------------------------------------------------------------------- -q_limitCCS(regi,ccs2te2(enty,"ico2",te),rlf)$teCCS2rlf(te,rlf).. +q_limitCCS(regi,ccs2te(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",te); diff --git a/core/input/generisdata_tech.prn b/core/input/generisdata_tech.prn index 676b7e748..1d89c0918 100644 --- a/core/input/generisdata_tech.prn +++ b/core/input/generisdata_tech.prn @@ -154,17 +154,17 @@ lifetime 30 30 45 45 45 *** carbon management -+ ccsinjeon weathering dac oae_ng oae_el -tech_stat 0 4 -inco0 350 0.01 18800 200 400 -floorcost 4800 -constrTme 3 -lifetime 40 20 20 25 25 -mix0 1.00 -eta 1.00 1.00 1.00 1.00 1.00 -omf 0.06 0.84 0.025 0.35 0.17 -ccap0 0.0008 -learn 0.15 ++ ccsinjeon ccsinjeoff weathering dac oae_ng oae_el +tech_stat 0 0 4 +inco0 350 525 0.01 18800 200 400 +floorcost 4800 +constrTme 3 5 +lifetime 40 40 20 20 25 25 +mix0 1.00 1.00 +eta 1.00 1.00 1.00 1.00 1.00 1.00 +omf 0.06 0.12 0.84 0.025 0.35 0.17 +ccap0 0.0008 +learn 0.15 $ifthen.cm_subsec_model_steel "%cm_subsec_model_steel%" == "processes" diff --git a/core/input/generisdata_vintages.prn b/core/input/generisdata_vintages.prn index 09590403c..f179c48b2 100644 --- a/core/input/generisdata_vintages.prn +++ b/core/input/generisdata_vintages.prn @@ -147,8 +147,8 @@ $offtext + storspv storwindon storwindoff storcsp gridspv gridwindon gridwindoff gridcsp 1 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 -+ ccsinjeon -1 1.0 ++ ccsinjeon ccsinjeoff +1 1.0 1.0 + tdsyngas tdsyngat tdsynhos tdsynpet tdsyndie 1 1.0 1.0 1.0 1.0 1.0 diff --git a/core/sets.gms b/core/sets.gms index 2a4193d26..757dc308d 100755 --- a/core/sets.gms +++ b/core/sets.gms @@ -1323,6 +1323,12 @@ te2teCCS(all_te,all_te) "Map an energy technology to its CCS equivalent" bioh2 . bioh2c "biomass to hydrogen" / +teccsinje(all_te) "transport, storage, and injection of ico2" +/ + ccsinjeon + ccsinjeoff +/ + teNoCCS(all_te) "Technologies without CCS" teChp(all_te) "Technologies that produce seel as main output und sehe as secondary output - dynamically defined" @@ -2889,7 +2895,6 @@ es2ppfen(all_esty,all_in) "matching ES in ESM to ppfEn in MACRO" ***----------------------------------------------------------------------------- ***----------------------------------------------------------------------------- -alias(ccs2te,ccs2te2); alias(pe2se,pe2se2); alias(se2fe,se2fe2); diff --git a/modules/04_PE_FE_parameters/iea2014/datainput.gms b/modules/04_PE_FE_parameters/iea2014/datainput.gms index 26e6a51f7..f9d940c06 100644 --- a/modules/04_PE_FE_parameters/iea2014/datainput.gms +++ b/modules/04_PE_FE_parameters/iea2014/datainput.gms @@ -306,7 +306,8 @@ p04_prodCoupleGlob("pebiolc","seliqbio","bioftcrec","seel") = 0.108; p04_prodCoupleGlob("segabio","fegas","tdbiogas","seel") = -0.05; p04_prodCoupleGlob("segafos","fegas","tdfosgas","seel") = -0.05; p04_prodCoupleGlob("pegeo","sehe","geohe","seel") = -0.3; -p04_prodCoupleGlob("cco2","ico2","ccsinjeon","seel") = -0.005; +p04_prodCoupleGlob("cco2","ico2","ccsinjeon","seel") = -0.005; +p04_prodCoupleGlob("cco2","ico2","ccsinjeoff","seel") = -0.005; !!DKX assumption correct? *** Co-Production based on Dorndorf et al (in review) p04_prodCoupleGlob("pebiolc","sebiochar","biopyronly","seel") = -0.04; !! 2% of biomass input (Fawzy et al., 2022, https://doi.org/10.1016/j.jclepro.2022.133660) diff --git a/modules/21_tax/on/equations.gms b/modules/21_tax/on/equations.gms index 1c660d2b3..971c025c0 100644 --- a/modules/21_tax/on/equations.gms +++ b/modules/21_tax/on/equations.gms @@ -317,9 +317,13 @@ q21_taxrevFlex(t,regi)$( t.val ge max(2010, cm_startyear) ) .. ***--------------------------------------------------------------------------- q21_taxrevCCS(t,regi)$(t.val ge max(2010,cm_startyear)).. v21_taxrevCCS(t,regi) - =e= cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(t,regi,"ccsinjeon") - * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS(t,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon") !! fraction of injection constraint per year + =e= + cm_frac_CCS + * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), + pm_data(regi,"omf",te) * pm_inco0_t(t,regi,te) + * vm_co2CCS(t,regi,enty,enty2,te,rlf) + * vm_co2CCS(t,regi,enty,enty2,te,rlf) / (pm_dataccs(regi,"quan",te) * pm_ccsinjecrate(regi)) !! fraction of injection constraint per year + )) - p21_taxrevCCS0(t,regi) ; diff --git a/modules/21_tax/on/postsolve.gms b/modules/21_tax/on/postsolve.gms index 9bbf7b9ca..d9f8ad42a 100644 --- a/modules/21_tax/on/postsolve.gms +++ b/modules/21_tax/on/postsolve.gms @@ -21,9 +21,14 @@ OPTION decimals =3; pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3)); pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); -p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") - * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); + +p21_taxrevCCS0(ttot,regi) = cm_frac_CCS + * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), + pm_data(regi,"omf",te) * pm_inco0_t(ttot,regi,te) + * vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) + * vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) / ( pm_dataccs(regi,"quan",te) * pm_ccsinjecrate(regi)) + )); + pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_taxrevFE0(ttot,regi) = sum((entyFe,sector)$entyFe2Sector(entyFe,sector), ( p21_tau_fe_tax(ttot,regi,sector,entyFe) + p21_tau_fe_sub(ttot,regi,sector,entyFe) ) diff --git a/modules/21_tax/on/presolve.gms b/modules/21_tax/on/presolve.gms index ab1420f61..f52c5bff6 100644 --- a/modules/21_tax/on/presolve.gms +++ b/modules/21_tax/on/presolve.gms @@ -27,9 +27,14 @@ p21_tau_so2_tax(ttot,regi)$(ttot.val>2100)=p21_tau_so2_tax("2100",regi); pm_taxrevGHG0(t,regi) = pm_taxCO2eqSum(t,regi) * (vm_co2eq.l(t,regi) - vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3)); pm_taxrevCO2Sector0(ttot,regi,emi_sectors) = p21_CO2TaxSectorMarkup(ttot,regi,emi_sectors) * pm_taxCO2eqSum(ttot,regi) * vm_emiCO2Sector.l(ttot,regi,emi_sectors); pm_taxrevCO2LUC0(t,regi) = pm_taxCO2eqSum(t,regi) * vm_emiMacSector.l(t,regi,"co2luc")$(cm_multigasscen ne 3); -p21_taxrevCCS0(ttot,regi) = cm_frac_CCS * pm_data(regi,"omf","ccsinjeon") * pm_inco0_t(ttot,regi,"ccsinjeon") - * ( sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) ) - * (1/pm_ccsinjecrate(regi)) * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) ) ) / pm_dataccs(regi,"quan","ccsinjeon"); + +p21_taxrevCCS0(ttot,regi) = cm_frac_CCS + * sum(teCCS2rlf(te,rlf), sum(ccs2te(ccsCo2(enty),enty2,te), + pm_data(regi,"omf",te) * pm_inco0_t(ttot,regi,te) + * vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) + * vm_co2CCS.l(ttot,regi,enty,enty2,te,rlf) / ( pm_dataccs(regi,"quan",te) * pm_ccsinjecrate(regi)) + )); + pm_taxrevNetNegEmi0(ttot,regi) = s21_frac_NetNegEmi * pm_taxCO2eqSum(ttot,regi) * ( (1 - cm_NetNegEmi_calculation) * vm_emiAllco2neg.l(ttot,regi) + cm_NetNegEmi_calculation * v21_emiAllco2neg_acrossIterations.l(ttot,regi) ); p21_emiAllco2neg0(ttot,regi) = vm_emiAllco2neg.l(ttot,regi); p21_emiAllco2neg_acrossIterations0(ttot,regi) = v21_emiAllco2neg_acrossIterations.l(ttot,regi); diff --git a/modules/47_regipol/none/bounds.gms b/modules/47_regipol/none/bounds.gms index 87585ad1f..60d4c3d86 100644 --- a/modules/47_regipol/none/bounds.gms +++ b/modules/47_regipol/none/bounds.gms @@ -21,7 +21,7 @@ loop(regi$(sameAs(regi,"DEU")), *** only small amount of co2 injection ccs until 2030 in Germany -vm_co2CCS.up(t,regi,"cco2","ico2",te,rlf)$((t.val le 2030) AND (sameas(regi,"DEU"))) = 1e-3; +vm_co2CCS.up(t,regi,"cco2","ico2",te,rlf)$((t.val le 2030) AND (sameas(regi,"DEU"))) = 1e-3; !! DKX assumptions for ccsinjeoff *** no Pe2Se fossil CCS in Germany, if c_noPeFosCCDeu = 1 chosen vm_emiTeDetail.up(t,regi,peFos,entySe,teFosCCS,"cco2")$((sameas(regi,"DEU")) AND (cm_noPeFosCCDeu = 1)) = 1e-4; *** limit German CDR amount (Energy system BECCS, DACCS, EW and negative Landuse Change emissions), conversion from MtCO2 to GtC From 19a7434f60455236e75827f9f9383a6d1f025c97 Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 13 Feb 2026 11:04:36 +0100 Subject: [PATCH 13/25] Remove legacy sum in core/equations.gms Reduce dimensions of q_emiCdrAll to calculate the sum of ccsinjeon and ccsinjeoff and not individually --- core/equations.gms | 2 +- modules/33_CDR/portfolio/declarations.gms | 2 +- modules/33_CDR/portfolio/equations.gms | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/equations.gms b/core/equations.gms index bad7fddaf..4b19d2095 100644 --- a/core/equations.gms +++ b/core/equations.gms @@ -773,7 +773,7 @@ q_emiCdrAll(t,regi).. + ( !! pe2se-BECC sum(emiBECCS2te(enty,enty2,te,enty3),vm_emiTeDetail(t,regi,enty,enty2,te,enty3)) !! positive value !! + gross DACC - - sum(teCCS2rlf(te,rlf), vm_emiCdrTeDetail(t, regi, "dac"))) !! negative value + - vm_emiCdrTeDetail(t, regi, "dac")) !! negative value !! scaled by the fraction that gets stored geologically * v_ccsShare(t,regi) !! 2. gross CDR from Enhanced Weathering diff --git a/modules/33_CDR/portfolio/declarations.gms b/modules/33_CDR/portfolio/declarations.gms index 83e862e81..c916f7b1a 100644 --- a/modules/33_CDR/portfolio/declarations.gms +++ b/modules/33_CDR/portfolio/declarations.gms @@ -77,7 +77,7 @@ q33_emiCDR(ttot,all_regi) "aggregates the (negative) emissions captured by the q33_H2bio_lim(ttot,all_regi) "limits H2 from bioenergy to FE - H2 demand from CDR, i.e. no H2 from bioenergy for DAC" q33_capconst(ttot,all_regi,all_te) "calculates amount of carbon captured by DAC and OAE" q33_cco2_cdr_fromFE(ttot,all_regi,all_te) "calculates the amount of captured CO2 that comes from burning gas" -q33_ccsbal(ttot,all_regi,all_enty,all_enty,all_te) "calculates CCS emissions from CDR technologies" +q33_ccsbal(ttot,all_regi) "calculates CCS emissions from CDR technologies" *** DAC q33_DAC_FEdemand(ttot,all_regi,all_enty) "calculates final energy demand from DAC" diff --git a/modules/33_CDR/portfolio/equations.gms b/modules/33_CDR/portfolio/equations.gms index 0208d94da..b74b8fdec 100644 --- a/modules/33_CDR/portfolio/equations.gms +++ b/modules/33_CDR/portfolio/equations.gms @@ -74,8 +74,8 @@ q33_cco2_cdr_fromFE(t, regi, te_ccs33).. *' the second part is CO2 captured from energy usage (OAE or DAC) *' the third part is CO2 captured from calcination for OAE ***--------------------------------------------------------------------------- -q33_ccsbal(t, regi, ccs2te(ccsCo2(enty), enty2, te)).. - sum(teCCS2rlf(te, rlf), vm_co2capture_cdr(t, regi, enty, enty2, te, rlf)) +q33_ccsbal(t, regi).. + sum(teCCS2rlf(te, rlf), vm_co2capture_cdr(t, regi, "cco2", "ico2", te, rlf)) =e= - vm_emiCdrTeDetail(t, regi, "dac") + sm_capture_rate_cdrmodule * ( From 056b83af144be39458d235e91356f06da95f8a48 Mon Sep 17 00:00:00 2001 From: David Klein Date: Tue, 24 Feb 2026 16:52:39 +0100 Subject: [PATCH 14/25] Allow for co2 offshore storage using new storage potential --- core/datainput.gms | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/datainput.gms b/core/datainput.gms index 419320865..a4c0dd724 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1174,13 +1174,13 @@ $offdelim *** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen if (c_geoStorPotScen eq 1, pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potTechOn"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.0000001; !!f_geoStorPot(all_regi, "potTechOff"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potTechOff"); elseif (c_geoStorPotScen eq 2), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potLimOn"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.0000001; !!f_geoStorPot(all_regi, "potLimOff"); + pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potLimOff"); elseif (c_geoStorPotScen eq 3), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "mixedOld"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.0000001; + pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0; ); ***----------------------------------------------------------------------------- From d9c30d36d1e2951d9af720eca3d17f68c43bebc8 Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 25 Feb 2026 10:26:23 +0100 Subject: [PATCH 15/25] Update CHANGELOG.md --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a89e4c3c2..bed085195 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,18 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### input data/calibration +- **mrremind** new data source for geological CO2 storage potential (split into onshore/offshore and technical vs. limited potentials), replacing the previous LimitCCS output + [[#788](https://github.com/pik-piam/mrremind/pull/788)] ### changed - **45_carbonprice** Use ScenarioMIP settings as new default for regional carbon price differentiation in 45_carbonprice/functionalForm [[#2229](https://github.com/remindmodel/remind/pull/2229)] - **11_aerosols** Move calculation of air pollutant emissions from REMIND module 11_aerosols to remind2. [[#2231](https://github.com/remindmodel/remind/pull/2231)] +- **core** Distinguish between onshore and offshore transport and storage of captured CO2 + [[#2296](https://github.com/remindmodel/remind/pull/2296)] +- **reporting** Distinguish between onshore and offshore transport and storage of captured CO2 + [[#777](https://github.com/pik-piam/remind2/pull/777)] ### added - **40_techpol** implement renewable energy share targets for NPi2025 realization based on NewClimate policy protocol From 3576ef6a93cfb6a4b4ecce0ba30b0cb26042e2fe Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 25 Feb 2026 12:28:22 +0100 Subject: [PATCH 16/25] Still use old storage potential as default --- main.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.gms b/main.gms index 32f8f4f5b..ebd871bb5 100755 --- a/main.gms +++ b/main.gms @@ -907,7 +907,7 @@ parameter Parameter c_geoStorPotScen "select the amount of geological storage potential for CO2 offshore and onshore" ; -c_geoStorPotScen = 1; !! def = 1 !! regexp = [1-3] +c_geoStorPotScen = 3; !! def = 3 !! regexp = [1-3] *' This switch determines the upper bound of the total geological storage potential for CO2 (onshore + offshore). *' * (1) high: technical potential without any exclusion layers applied From 5416316dd69bd29884293f922e957c17b37929be Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 25 Feb 2026 12:30:15 +0100 Subject: [PATCH 17/25] Replace ccsinje --- main.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.gms b/main.gms index ebd871bb5..8724fc5c8 100755 --- a/main.gms +++ b/main.gms @@ -1123,7 +1123,7 @@ parameter cm_carbonprice_temperatureLimit = 1.8; !! def = 1.8 *' parameter - cm_frac_CCS "tax on carbon transport & storage (ccsinjeon) to reflect risk of leakage, formulated as fraction of ccsinjeon O&M costs" + cm_frac_CCS "tax on carbon transport & storage (teccsinje) to reflect risk of leakage, formulated as fraction of O&M costs" ; cm_frac_CCS = 10; !! def = 10 *' From 6af3b1d8abd3f3bc8d59132808e4eafe0af3d704 Mon Sep 17 00:00:00 2001 From: David Klein Date: Wed, 25 Feb 2026 16:49:44 +0100 Subject: [PATCH 18/25] When using old storage potential, set ccsinjeoff to very small value instead of zero to avoid devision by zero --- core/datainput.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/datainput.gms b/core/datainput.gms index a4c0dd724..85179084b 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1180,7 +1180,7 @@ elseif (c_geoStorPotScen eq 2), pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potLimOff"); elseif (c_geoStorPotScen eq 3), pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "mixedOld"); - pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0; + pm_dataccs(all_regi, "quan", "ccsinjeoff") = 0.00001; ); ***----------------------------------------------------------------------------- From 24c69a86925bd023c71fdf0abf846fff828bb0a2 Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 27 Feb 2026 12:26:45 +0100 Subject: [PATCH 19/25] New input data (including data for split of former CO2 storage technology ccsinje into ccsinjeon and ccsinjeoff) --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index 25a580bc2..33959ee58 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -28,7 +28,7 @@ cfg$regionmapping <- "config/regionmappingH12.csv" cfg$extramappings_historic <- "" #### Current input data revision (.) #### -cfg$inputRevision <- "7.81" +cfg$inputRevision <- "7.82" #### Current CES parameter and GDX revision (commit hash) #### cfg$CESandGDXversion <- "867f557491d5f3e72030799648c5eeac03f40de2" From b6b4d2c97f224197bffe4a264e0683058d16ab8d Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 27 Feb 2026 15:21:10 +0100 Subject: [PATCH 20/25] New input data --- config/default.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/default.cfg b/config/default.cfg index ae1e55f7a..c7e38b70d 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -28,7 +28,7 @@ cfg$regionmapping <- "config/regionmappingH12.csv" cfg$extramappings_historic <- "" #### Current input data revision (.) #### -cfg$inputRevision <- "7.82" +cfg$inputRevision <- "7.83" #### Current CES parameter and GDX revision (commit hash) #### cfg$CESandGDXversion <- "867f557491d5f3e72030799648c5eeac03f40de2" From 7636e6b8c2b38657c9c62af94ac64302367ae2ca Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 27 Feb 2026 15:38:41 +0100 Subject: [PATCH 21/25] Replace old ccs potential file with new one --- core/input/files | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/input/files b/core/input/files index 046125649..0cabf4693 100644 --- a/core/input/files +++ b/core/input/files @@ -38,7 +38,7 @@ p_macBaseVanv.cs4r p_macPolCO2luc.cs4r p_boundCapCCS.cs4r p_boundCapBiochar.cs4r -pm_dataccs.cs3r +f_geoStorPot.cs3r f_fedemand.cs4r f_fedemand_build.cs4r pm_NuclearConstraint.cs4r From 6f0d31fb1613fde12686e5bfe735e71a515b5bac Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 27 Feb 2026 15:42:51 +0100 Subject: [PATCH 22/25] Add requirement for remind2 2.0.3 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index ef40ebc44..d4df51bba 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -60,7 +60,7 @@ Imports: raster, readr, readxl, - remind2 (>= 1.186.0), + remind2 (>= 2.0.3), remindClimateAssessment (>= 0.1.0), renv (>= 1.1.1), reshape2, From dafbeeac35e29c447ec9276267677ea1437c2769 Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 27 Feb 2026 16:57:13 +0100 Subject: [PATCH 23/25] Correct comment --- core/datainput.gms | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/datainput.gms b/core/datainput.gms index dc92bf592..9e9420e83 100644 --- a/core/datainput.gms +++ b/core/datainput.gms @@ -1171,7 +1171,7 @@ $include "./core/input/f_geoStorPot.cs3r" $offdelim ; -*** set onshore (rlf "1") and offshore (rlf "2") storage potential according to c_geoStorPotScen +*** set onshore and offshore storage potential according to c_geoStorPotScen if (c_geoStorPotScen eq 1, pm_dataccs(all_regi, "quan", "ccsinjeon") = f_geoStorPot(all_regi, "potTechOn"); pm_dataccs(all_regi, "quan", "ccsinjeoff") = f_geoStorPot(all_regi, "potTechOff"); From 9adbf730a100ce8ef4a2a828ddbe6f826c084d47 Mon Sep 17 00:00:00 2001 From: David Klein Date: Fri, 27 Feb 2026 17:01:48 +0100 Subject: [PATCH 24/25] Clean formulation --- core/bounds.gms | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/bounds.gms b/core/bounds.gms index 4b3a98800..b2b7164fc 100755 --- a/core/bounds.gms +++ b/core/bounds.gms @@ -306,7 +306,7 @@ vm_cap.fx("2020",regi,te,rlf) $ (teBio(te) and teCCS(te)) = 0; *' switch to deactivate carbon sequestration if(c_ccsinjecratescen = 0, - vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2",teCCS2rlf(te,rlf)) = 0; + vm_co2CCS.fx(t,regi_capturescen,"cco2","ico2",te,rlf) $ teCCS2rlf(te,rlf) = 0; ); *' bound on maximum annual carbon storage by region @@ -343,7 +343,7 @@ if(cm_emiscen = 1, if(cm_ccapturescen = 2, !! no carbon capture at all vm_cap.fx(t,regi_capturescen,teCCS,rlf) = 0; - vm_cap.fx(t,regi_capturescen,teCCS2rlf(te,rlf)) = 0; + vm_cap.fx(t,regi_capturescen,te,rlf) $ teCCS2rlf(te,rlf) = 0; elseif(cm_ccapturescen = 3), !! no bio carbon capture: vm_cap.fx(t,regi_capturescen,te,rlf) $ (teCCS(te) and teBio(te)) = 0; elseif(cm_ccapturescen = 4), !! no carbon capture in the electricity sector From c396d17f9aa6d812d2c23b0a514550c5cb869762 Mon Sep 17 00:00:00 2001 From: David Klein Date: Mon, 2 Mar 2026 13:43:45 +0100 Subject: [PATCH 25/25] New CES parameters (required for proper reporting of testOneRegi after dimensions of a few equations and variables changed during split of ccsinje) New input data --- config/default.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/default.cfg b/config/default.cfg index c7e38b70d..9dc132cd7 100644 --- a/config/default.cfg +++ b/config/default.cfg @@ -28,10 +28,10 @@ cfg$regionmapping <- "config/regionmappingH12.csv" cfg$extramappings_historic <- "" #### Current input data revision (.) #### -cfg$inputRevision <- "7.83" +cfg$inputRevision <- "7.84" #### Current CES parameter and GDX revision (commit hash) #### -cfg$CESandGDXversion <- "867f557491d5f3e72030799648c5eeac03f40de2" +cfg$CESandGDXversion <- "fb20462c942811c4bd9b668f7d10126640116ff6" #### Path to a renv.lock file to restore a project's dependencies from. If NULL, all R packages in their currently installed version will be used. cfg$UseThisRenvLock <- NULL