diff --git a/main.gms b/main.gms index 1b15f37a62..93c97bee49 100755 --- a/main.gms +++ b/main.gms @@ -812,12 +812,23 @@ parameter *' * (3): all GHG excl CO2 emissions from LULUCF *' parameter - cm_permittradescen "scenario on permit trade" + cm_permittradescen "Scenario on permit trade, not used in the TradingOnRef realisation" ; cm_permittradescen = 1; !! def = 1 !! regexp = [1-3] *' * (1): full permit trade (no restrictions) *' * (2): no permit trade (only domestic mitigation) -*' * (3): limited trade (certain percentage of GDP) +*' * (3): limited trade (certain percentage of permits) +*' + +parameter + cm_permitTradeFinalYr "[TradingOnRef] Year until permit trading is allowed" +; + cm_permitTradeFinalYr = 2100; !! def = 2100 +*' +parameter + cm_permitTradeRatio "[TradingOnRef] Share of emissions allowed for permit trading between 0 and 1" +; + cm_permitTradeRatio = 0.2; !! def = 0.2 *' parameter cm_rentdiscoil "[grades2poly] discount factor for the oil rent" diff --git a/modules/41_emicapregi/AbilityToPay/not_used.txt b/modules/41_emicapregi/AbilityToPay/not_used.txt index 009a793d19..3131f6520b 100644 --- a/modules/41_emicapregi/AbilityToPay/not_used.txt +++ b/modules/41_emicapregi/AbilityToPay/not_used.txt @@ -10,3 +10,5 @@ pm_gdp_gdx, parameter, ??? pm_budgetCO2eq, parameter, ??? vm_co2eqGlob,input,questionnaire cm_emiscen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? diff --git a/modules/41_emicapregi/CandC/not_used.txt b/modules/41_emicapregi/CandC/not_used.txt index e7413e8496..b3699610aa 100644 --- a/modules/41_emicapregi/CandC/not_used.txt +++ b/modules/41_emicapregi/CandC/not_used.txt @@ -13,3 +13,5 @@ pm_budgetCO2eq, parameter, ??? pm_shPPPMER,input,questionnaire pm_gdp,input,questionnaire cm_permittradescen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? diff --git a/modules/41_emicapregi/GDPint/not_used.txt b/modules/41_emicapregi/GDPint/not_used.txt index 22f931e772..4a39a3e606 100644 --- a/modules/41_emicapregi/GDPint/not_used.txt +++ b/modules/41_emicapregi/GDPint/not_used.txt @@ -13,3 +13,5 @@ pm_budgetCO2eq, parameter, ??? pm_shPPPMER,input,questionnaire pm_gdp,input,questionnaire cm_permittradescen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? diff --git a/modules/41_emicapregi/POPint/not_used.txt b/modules/41_emicapregi/POPint/not_used.txt index 1f082f491d..f3df1eafc1 100644 --- a/modules/41_emicapregi/POPint/not_used.txt +++ b/modules/41_emicapregi/POPint/not_used.txt @@ -11,3 +11,5 @@ vm_Mport,input,questionnaire pm_shPPPMER,input,questionnaire pm_gdp,input,questionnaire cm_permittradescen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? \ No newline at end of file diff --git a/modules/41_emicapregi/PerCapitaConvergence/not_used.txt b/modules/41_emicapregi/PerCapitaConvergence/not_used.txt index 78c95ab216..7f60d3e45d 100644 --- a/modules/41_emicapregi/PerCapitaConvergence/not_used.txt +++ b/modules/41_emicapregi/PerCapitaConvergence/not_used.txt @@ -12,3 +12,5 @@ vm_co2eqGlob,input,questionnaire pm_shPPPMER,input,questionnaire pm_gdp,input,questionnaire cm_emiscen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? \ No newline at end of file diff --git a/modules/41_emicapregi/TradingOnRef/bounds.gms b/modules/41_emicapregi/TradingOnRef/bounds.gms new file mode 100755 index 0000000000..ee62ca0773 --- /dev/null +++ b/modules/41_emicapregi/TradingOnRef/bounds.gms @@ -0,0 +1,23 @@ +*** | (C) 2006-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | REMIND License Exception, version 1.0 (see LICENSE file). +*** | Contact: remind@pik-potsdam.de +*** SOF ./modules/41_emicapregi/TradingOnRef/bounds.gms + +*** calculate emission cap in absolute terms +vm_perm.fx(t,regi) = p41_co2eq(t,regi); + +display vm_perm.up; + +vm_Xport.fx(t,regi,"perm") = 0; +vm_Mport.fx(t,regi,"perm") = 0; + +*** Only activate permit trade between 2030 and cm_permitTradeFinalYr +*** cm_permitTradeRatio determines the proportion of emissions that can be traded, +*** between 0 (no permit trade allowed) and 1 (all emissions can be traded) +vm_Xport.up(t,regi,"perm") $ (t.val > 2025 and t.val <= cm_permitTradeFinalYr) = cm_permitTradeRatio * abs(p41_co2eq(t,regi)); +vm_Mport.up(t,regi,"perm") $ (t.val > 2025 and t.val <= cm_permitTradeFinalYr) = cm_permitTradeRatio * abs(p41_co2eq(t,regi)); + +*** EOF ./modules/41_emicapregi/TradingOnRef/bounds.gms diff --git a/modules/41_emicapregi/TradingOnRef/datainput.gms b/modules/41_emicapregi/TradingOnRef/datainput.gms new file mode 100755 index 0000000000..6ca8b2bb39 --- /dev/null +++ b/modules/41_emicapregi/TradingOnRef/datainput.gms @@ -0,0 +1,22 @@ +*** | (C) 2006-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | REMIND License Exception, version 1.0 (see LICENSE file). +*** | Contact: remind@pik-potsdam.de +*** SOF ./modules/41_emicapregi/TradingOnRef/datainput.gms + + +*** read in data of cost-optimal reference climate policy run +*' load CO2 emissions from reference run to assing the allocates permits + +Execute_Loadpoint "input_ref" p41_co2eq_in = vm_emiAll.l; +p41_co2eq(t, regi) = p41_co2eq_in(t,regi,"co2"); + + +*** initialization of pm_shPermit +pm_emicapglob(t) = sum(regi, p41_co2eq(t,regi)); +pm_shPerm(t,regi) = p41_co2eq(t,regi) / pm_emicapglob(t); + + +*** EOF ./modules/41_emicapregi/TradingOnRef/datainput.gms diff --git a/modules/41_emicapregi/TradingOnRef/declarations.gms b/modules/41_emicapregi/TradingOnRef/declarations.gms new file mode 100755 index 0000000000..37ad76b9ab --- /dev/null +++ b/modules/41_emicapregi/TradingOnRef/declarations.gms @@ -0,0 +1,20 @@ +*** | (C) 2006-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | REMIND License Exception, version 1.0 (see LICENSE file). +*** | Contact: remind@pik-potsdam.de +*** SOF ./modules/41_emicapregi/TradingOnRef/declarations.gms + +variables +vm_perm(ttot,all_regi) "emission allowances [GtCeq]" +; + +parameter +pm_shPerm(tall, all_regi) "emission permit shares [share]" +pm_emicapglob(tall) "global emission cap [GtC]" +p41_co2eq_in(ttot,all_regi,all_enty) "emissions from cost-optimal reference run" +p41_co2eq(ttot,all_regi) "emissions from cost-optimal reference run" +; + +*** EOF ./modules/41_emicapregi/TradingOnRef/declarations.gms diff --git a/modules/41_emicapregi/TradingOnRef/not_used.txt b/modules/41_emicapregi/TradingOnRef/not_used.txt new file mode 100755 index 0000000000..f8db314466 --- /dev/null +++ b/modules/41_emicapregi/TradingOnRef/not_used.txt @@ -0,0 +1,19 @@ +# | (C) 2006-2024 Potsdam Institute for Climate Impact Research (PIK) +# | authors, and contributors see CITATION.cff file. This file is part +# | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of +# | AGPL-3.0, you are granted additional permissions described in the +# | REMIND License Exception, version 1.0 (see LICENSE file). +# | Contact: remind@pik-potsdam.de +name, type, reason +sm_budgetCO2eqGlob, parameter, ??? +pm_gdp_gdx, parameter, ??? +pm_budgetCO2eq, parameter, ??? +vm_co2eqGlob,input,questionnaire +cm_emiscen,input,questionnaire +p41_precorrection_reduction, parameter, ??? +p41_correct_factor, parameter, ??? +pm_shPPPMER,input,questionnaire +pm_pop, parameter, ??? +pm_gdp,input,questionnaire +p41_co2eq_bau, parameter, ??? +cm_permittradescen,input,replaced by cm_permitTradeRatio \ No newline at end of file diff --git a/modules/41_emicapregi/TradingOnRef/realization.gms b/modules/41_emicapregi/TradingOnRef/realization.gms new file mode 100755 index 0000000000..86759e4cae --- /dev/null +++ b/modules/41_emicapregi/TradingOnRef/realization.gms @@ -0,0 +1,24 @@ +*** | (C) 2006-2024 Potsdam Institute for Climate Impact Research (PIK) +*** | authors, and contributors see CITATION.cff file. This file is part +*** | of REMIND and licensed under AGPL-3.0-or-later. Under Section 7 of +*** | AGPL-3.0, you are granted additional permissions described in the +*** | REMIND License Exception, version 1.0 (see LICENSE file). +*** | Contact: remind@pik-potsdam.de +*** SOF ./modules/41_emicapregi/TradingOnRef/realization.gms + +*' @description: Emission caps/permits are allocated according to a reference run +*' There are three different trade patterns currently available. +*' cm_permittradescen = 1; !! def = 1 !! regexp = [1-3] +*' * (1): full permit trade (no restrictions) +*' * (2): no permit trade (only domestic mitigation) +*' * (3): limited trade (certain percentage of regional allowances) +*' for limited trade use cm_permitTradeFinalYr to set the final year until permit trading is allowed +*' with cm_permitTradeRatio set the percentage of allowed trade + + +*####################### R SECTION START (PHASES) ############################## +$Ifi "%phase%" == "declarations" $include "./modules/41_emicapregi/TradingOnRef/declarations.gms" +$Ifi "%phase%" == "datainput" $include "./modules/41_emicapregi/TradingOnRef/datainput.gms" +$Ifi "%phase%" == "bounds" $include "./modules/41_emicapregi/TradingOnRef/bounds.gms" +*######################## R SECTION END (PHASES) ############################### +*** EOF ./modules/41_emicapregi/TradingOnRef/realization.gms diff --git a/modules/41_emicapregi/exog/not_used.txt b/modules/41_emicapregi/exog/not_used.txt index ad24171408..5e9156d090 100644 --- a/modules/41_emicapregi/exog/not_used.txt +++ b/modules/41_emicapregi/exog/not_used.txt @@ -16,3 +16,5 @@ cm_emiscen, switch, ??? pm_shPPPMER,input,questionnair pm_gdp,input,questionnaire cm_permittradescen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? diff --git a/modules/41_emicapregi/module.gms b/modules/41_emicapregi/module.gms index e8e89b5406..14ae2e4d0e 100644 --- a/modules/41_emicapregi/module.gms +++ b/modules/41_emicapregi/module.gms @@ -26,6 +26,7 @@ $Ifi "%emicapregi%" == "CandC" $include "./modules/41_emicapregi/CandC/realizati $Ifi "%emicapregi%" == "GDPint" $include "./modules/41_emicapregi/GDPint/realization.gms" $Ifi "%emicapregi%" == "POPint" $include "./modules/41_emicapregi/POPint/realization.gms" $Ifi "%emicapregi%" == "PerCapitaConvergence" $include "./modules/41_emicapregi/PerCapitaConvergence/realization.gms" +$Ifi "%emicapregi%" == "TradingOnRef" $include "./modules/41_emicapregi/TradingOnRef/realization.gms" $Ifi "%emicapregi%" == "exog" $include "./modules/41_emicapregi/exog/realization.gms" $Ifi "%emicapregi%" == "none" $include "./modules/41_emicapregi/none/realization.gms" *###################### R SECTION END (MODULETYPES) ############################ diff --git a/modules/41_emicapregi/none/not_used.txt b/modules/41_emicapregi/none/not_used.txt index f08fbec934..2ae02ab04f 100644 --- a/modules/41_emicapregi/none/not_used.txt +++ b/modules/41_emicapregi/none/not_used.txt @@ -14,3 +14,5 @@ cm_emiscen, switch, ??? pm_shPPPMER,input,questionnaire pm_gdp,input,questionnaire cm_permittradescen,input,questionnaire +cm_permitTradeFinalYr, input, ??? +cm_permitTradeRatio, input, ??? diff --git a/modules/80_optimization/nash/datainput.gms b/modules/80_optimization/nash/datainput.gms index 2588cb4055..c24ea97c16 100644 --- a/modules/80_optimization/nash/datainput.gms +++ b/modules/80_optimization/nash/datainput.gms @@ -37,7 +37,7 @@ cm_iteration_max = 100; ***convergences thresholds - very coarse p80_surplusMaxTolerance(tradePe) = 2* 1.5 * sm_EJ_2_TWa; !! convert EJ/yr into internal unit TWa p80_surplusMaxTolerance("good") = 2* 100/1000; !! in internal unit, trillion Dollar - p80_surplusMaxTolerance("perm") = 2* 300 * 12/44 / 1000; !! convert MtCO2eq into internal unit GtC + p80_surplusMaxTolerance("perm") = 3* 300 * 12/44 / 1000; !! convert MtCO2eq into internal unit GtC ); ); @@ -54,12 +54,12 @@ p80_etaXp("perm") = 0.2; *LB* parameter for Nash price algorithm between different iterations p80_etaLT(trade) = 0; -p80_etaLT("perm") = 0.03; +p80_etaLT("perm") = 0.04; ***These parameters are pretty sensitive. If market surpluses diverge, try higher values (up to 1). If surpluses oscillate, try lower values. p80_etaST(tradePe) = 0.3; p80_etaST("good") = 0.25; -p80_etaST("perm") = 0.3; +p80_etaST("perm") = 0.8; $ifi %banking% == "banking" p80_etaST("perm") = 0.2; !! in banking mode, the permit market reacts more sensitively. $ifi %emicapregi% == "budget" p80_etaST("perm") = 0.25; !! in budget mode, the permit market reacts more sensitively. diff --git a/modules/80_optimization/nash/equations.gms b/modules/80_optimization/nash/equations.gms index 8bc6b50d25..b7d46b2781 100644 --- a/modules/80_optimization/nash/equations.gms +++ b/modules/80_optimization/nash/equations.gms @@ -44,7 +44,7 @@ q80_costAdjNash(ttot,regi)$( ttot.val ge cm_startyear ) .. ; *' link between permit budget and emission budget -q80_budgetPermRestr(regi)$(cm_emiscen=6) .. +q80_budgetPermRestr(regi)$(cm_emiscen=6 OR cm_emiscen = 4) .. sum(ttot$(ttot.val lt sm_endBudgetCO2eq and ttot.val ge cm_startyear), pm_ts(ttot)* vm_perm(ttot,regi)) + sum(ttot$(ttot.val eq sm_endBudgetCO2eq),pm_ts(ttot)/2 * (vm_perm(ttot,regi))) =l= pm_budgetCO2eq(regi) - sum(ttot $((ttot.val ge 2005) and (ttot.val lt cm_startyear)), pm_ts(ttot)* vm_co2eq(ttot,regi)); diff --git a/modules/80_optimization/nash/preloop.gms b/modules/80_optimization/nash/preloop.gms index 9cf0c48be1..6600873cd9 100644 --- a/modules/80_optimization/nash/preloop.gms +++ b/modules/80_optimization/nash/preloop.gms @@ -61,11 +61,11 @@ loop(regi, if(p80_Mport0("2005",regi,tradePe) eq NA, p80_Mport0("2005",regi,tradePe) = 0); );); -*AJS* starting policy runs from permit prices that are all zero doesnot work. start from 30$ price path instead +*AJS* starting policy runs from permit prices that are all zero doesnot work. start from 49$ price path instead if((cm_emiscen ne 1) and (cm_emiscen ne 9) and (smax(t,pm_pvp(t,"perm"))) eq 0, loop(ttot$(ttot.val ge 2005), -***this is a 30$/tCo2eq in 2020 trajectory: - pm_pvp(ttot,"perm") = 0.11*1.05**(ttot.val-2020) * pm_pvp(ttot,"good"); +***this is a 49$/tCo2eq in 2020 trajectory ([T$/GtC]. To get $/tCO2, multiply with 272: 0.18 T$/GtC = 48.96 $/tCO2): + pm_pvp(ttot,"perm") = 0.18*1.05**(ttot.val-2020) * pm_pvp(ttot,"good"); ); pm_pvp("2005","perm")=0; );