JustMIP ES - #2437
Conversation
…to JustmipDefault
| if (c_ccsinjecratescen eq 6, s_ccsinjecrate = s_ccsinjecrate * 0.44 ); !! Intermediate estimate | ||
| pm_ccsinjecrate(regi) = s_ccsinjecrate; | ||
|
|
||
| if (jpn_goes_wild = 1, |
There was a problem hiding this comment.
Delete jpn_goes_wild, instead adjust in config file c_ccsinjecrateRegi for JPN
There was a problem hiding this comment.
Thank you, I switched to c_ccsinjecrateRegi!
| - sum(se2fe(enty,enty2,te), !! subtract bunker emissions if cm_bunkerscen is eq 3 or 6 | ||
| pm_emifac(ttot2,regi,enty,enty2,te,"co2") | ||
| * vm_demFeSector.l(ttot2,regi,enty,enty2,"trans","other"))$(c_budgetscen eq 3 OR c_budgetscen eq 6)) | ||
| * vm_demFeSector.l(ttot2,regi,enty,enty2,"trans","other"))$(c_budgetscen eq 3 OR c_budgetscen eq 6))!! subtract net trade of permits if cm_emiscen is eq 6 or 4 |
There was a problem hiding this comment.
If this applies to cm_emiscen eq 4, please adjust it in the line above, where eq 3 is still written
| - sum(se2fe(enty,enty2,te), !! subtract bunker emissions if cm_bunkerscen is eq 3 or 6 | ||
| pm_emifac(ttot2,regi,enty,enty2,te,"co2") | ||
| * vm_demFeSector.l(ttot2,regi,enty,enty2,"trans","other"))$(c_budgetscen eq 3 OR c_budgetscen eq 6) | ||
| + (vm_Xport.l(ttot2,regi,"perm") - vm_Mport.l(ttot2,regi,"perm"))*(1/sm_c_2_co2))!! subtract net trade of permits (units from CO2 to C) |
There was a problem hiding this comment.
Adjust vm_Xport and vm_Mport to GtC instead of conversion
There was a problem hiding this comment.
Changed perm trading to GtC
| p33_EW_maxShareOfCropland(regi)$(regi_groupExt(ext_regi, regi)) = f33_EW_maxShareOfCropland(ext_regi); | ||
| ); | ||
|
|
||
| if (jpn_goes_wild = 1, |
There was a problem hiding this comment.
See comment above regarding jpn_goes_wild, should be adjusted via config cm_33_EW_maxShareOfCropland JPN 0.5
| *** In later iterations, recalculate allocation from market emissions | ||
|
|
||
| !! Set bounds for permit allocation | ||
| vm_perm.lo(t,regi) = -10; |
There was a problem hiding this comment.
Please explain logic and values for this and following line
| pm_emicapglob(t) = 100; | ||
| pm_shPerm(t,regi) = 1; | ||
| vm_perm.fx(t,regi) = 0; |
There was a problem hiding this comment.
Please add further explanation for values
| *' * (0): no numeric lower bound for the carbon price | ||
| *' * (any number > 0): numeric lower bound for the carbon price in $ per t CO2eq | ||
|
|
||
| parameter |
There was a problem hiding this comment.
remove switch also here please :)
| ); | ||
| ); | ||
|
|
||
| *RM* Permit price growth reflects the carbon price trajectory |
There was a problem hiding this comment.
interesting that you made this choice! let's talk about whether it is necessary and/or wanted? Also in combination with the othre changes you make to the intertemporal budget equation of regions?
|
|
||
| *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, | ||
| if((cm_emiscen ne 1 or (cm_emiscen ne 9 and cm_permTradingJustMip eq 0)) and (smax(t,pm_pvp(t,"perm"))) eq 0, |
There was a problem hiding this comment.
this now means that it is active when cm_emiscen = 9 and cm_permTradingJustMIP = 1
Just checking that this is what you want?
There was a problem hiding this comment.
Yes! it should be off with cm_emiscen = 9 and cm_permTradingJustMIP = 0 as in the initial setting...
| !! "Very low" is for now <1 USD/t CO2 in 2100, tbd | ||
| else | ||
| if ((abs(p80_regionalBudget_absDev_iter(iteration,regi)) gt abs(cm_budgetCO2_absDevTol)) | ||
| AND (pm_taxCO2eq("2100",regi) gt (1 * sm_DptCO2_2_TDpGtC)), |
There was a problem hiding this comment.
the problem may also be the combination with the lower bound on carbon prices? I will have a look
There was a problem hiding this comment.
If we keep the cm_taxCO2_lowerBound_nr switch, we will have to adjust the code here independent of JustMIP
There was a problem hiding this comment.
This was my code with cm_taxCO2_lowerBound_nr existing - might help for testing now
!! If the deviation is negative, i.e. budget is too low and would require a decrease of the Carbon Price => only "not converged" if the carbon price is not already very low,
!! "Very low" is for now <1 USD/t CO2 in 2100, tbd
else
if (cm_taxCO2_lowerBound_nr eq 0,
if ((abs(p80_regionalBudget_absDev_iter(iteration,regi)) gt pm_regionalBudget_absDevTol(regi))
AND (pm_taxCO2eq("2100",regi) gt (1 * sm_DptCO2_2_TDpGtC)),
s80_bool = 0;
p80_messageShow("regiBudget") = YES;
);
else !! if there is a lower bound that is equal to cm_taxCO2_lowerBound_nr, then this should be the defining lower carbon price bound
if ((abs(p80_regionalBudget_absDev_iter(iteration,regi)) gt pm_regionalBudget_absDevTol(regi))
AND (pm_taxCO2eq("2100",regi) gt (1.01 * cm_taxCO2_lowerBound_nr * sm_DptCO2_2_TDpGtC)),
s80_bool = 0;
p80_messageShow("regiBudget") = YES;
);
); !! if there is a lower carbon price bound set through cm_taxCO2_lowerBound_nr
| *' | ||
|
|
||
| parameter | ||
| cm_taxCO2_lowerBound_nr "switch to set a numeric lower bound for the carbon price" |
There was a problem hiding this comment.
this switch is in the main.gms but no longer in the code in functionalFormRegi/postsolve
| pm_taxCO2eq(t,regi) = max(pm_taxCO2eq(t,regi), p45_taxCO2eq_path_gdx_ref(t,regi)); | ||
| display pm_taxCO2eq; | ||
| ); | ||
|
|
There was a problem hiding this comment.
add here:
if(cm_taxCO2_lowerBound_nr ne 0,
loop(regi,
loop(t,
pm_taxCO2eq(t,regi) = max(pm_taxCO2eq(t,regi), cm_taxCO2_lowerBound_nr * sm_DptCO2_2_TDpGtC);
display pm_taxCO2eq;
);
);
);
There was a problem hiding this comment.
replace with:
!! Set the peakBudgYr value plus predefined increase thereafter (the only currently tested version is post-increase slope = 0) (necessary because initial shape & thus all following are taken from the anchor trajectory)
!! if the rescaled carbon price in the peak year is lower than 1.5 times the carbon price in the start year, then have a no increase after the peak budget year.
if(sum(ttot$(ttot.val eq p45_peakBudgYr_regi(regi)), p45_taxCO2eq_anchorRegi(ttot,regi)) le (1.5 * sum(ttot2$(ttot2.val eq s45_YearBeforeStartYear), p45_taxCO2eq_anchorRegi(ttot2,regi))),
p45_taxCO2eq_anchorRegi(ttot3,regi)$(ttot3.val gt p45_peakBudgYr_regi(regi)) = sum(ttot4$(ttot4.val eq p45_peakBudgYr_regi(regi)), p45_taxCO2eq_anchorRegi(ttot4,regi)); !! CO2 tax in peak budget year
else
p45_taxCO2eq_anchorRegi(ttot,regi)$(ttot.val gt p45_peakBudgYr_regi(regi)) = sum(ttot2$(ttot2.val eq p45_peakBudgYr_regi(regi)), p45_taxCO2eq_anchorRegi(ttot2,regi)) !! CO2 tax in peak budget year
+ (ttot.val - p45_peakBudgYr_regi(regi)) * cm_taxCO2_IncAfterPeakBudgYr * sm_DptCO2_2_TDpGtC); !! increase by cm_taxCO2inc_after_peakBudgYr per year
!! B4.4a: Calculate the slope for a linear connection between the last carbon price from input data and the price in the Peak Bud
Purpose of this PR
Concept of standard permit trading:
cm_emiscen = 6 or 4This PR introduces the
41_emicapregirealizationJustMIPthat allows for limited emission trading that relaxes the regional budget allocations in45_carbonprice/functionalFormRegi.With these central main differences compared to regular permit trading scenarios:
cm_emiscen = 9ifcm_permTradingJustMip = 1. Emission permit are consistently treated in GtCO2eq. This still requires adjustments in remind2 for the correct unit output.Changes in the configs
Scenarios including and excluding trade:
/p/projects/elevate/WP5.4/Tests_Rahel/CO2eqWP/compScen-Submission_V1_ES-2026-08-02_06.19.43-REMIND-MAgPIE.pdfTrade
Strong trade price increase seems to motivate regions to change trading strategies
</style>Type of change
Indicate the items relevant for your PR by replacing ◻️ with ☑️.
Do not delete any lines. This makes it easier to understand which areas are affected by your changes and which are not.
Parts concerned
Impact
Checklist
Do not delete any line. Leave unfinished elements unchecked so others know how far along you are.
In the end all checkboxes must be ticked before you can merge.
make test) after my final commit and all tests pass (FAIL 0)remind2if and where it was neededforbiddenColumnNamesin readCheckScenarioConfig.R in case the PR leads to deprecated switchesCHANGELOG.mdcorrectly (added, changed, fixed, removed, input data/calibration)Further information (optional)