diff --git a/modules/47_regipol/regiCarbonPrice/datainput.gms b/modules/47_regipol/regiCarbonPrice/datainput.gms index 358d7f883..76272b447 100644 --- a/modules/47_regipol/regiCarbonPrice/datainput.gms +++ b/modules/47_regipol/regiCarbonPrice/datainput.gms @@ -19,10 +19,15 @@ pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt) = 0; ***-------------------------------------------------- $IFTHEN.emiMkt not "%cm_emiMktTarget%" == "off" +*** slope calculation algorithm parameters +s47_slopeDegenerateThreshold = 1e-2; !! minimum emission change (fraction of 2005 emissions) for a reliable slope numerator +s47_slopeMaxWindow = 5; !! maximum iterations between reference and current; beyond this the reference is reset to stay local on the abatement cost curve + *** Auxiliar parameters based on emission targets information loop((ttot,ttot2,ext_regi,emiMktExt,target_type_47,emi_type_47)$pm_emiMktTarget(ttot,ttot2,ext_regi,emiMktExt,target_type_47,emi_type_47), !!calculated sets that depends on data parameter regiEmiMktTarget(ext_regi) = yes; !! assigning values to set containing extended regions that have regional emission targets - regiANDperiodEmiMktTarget_47(ttot2,ext_regi) = yes; !! assigning values to set containing extended regions and terminal years of regional emission targets + regiANDperiodEmiMktTarget_47(ttot2,ext_regi) = yes; !! assigning values to set containing extended regions and terminal years of regional emission targets + p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) = -0.3; !! initialize upper clamp bound for rescale slope ); *** Calculating set containing regions that should be controlled by a given regional emission target. @@ -106,6 +111,8 @@ p47_taxemiMkt_init(ttot,regi,emiMkt)$(p47_taxCO2eq_ref(ttot,regi) and (NOT(p47_t p47_factorRescaleSlope_iter("1","2020","2030",ext_regi,emiMktExt) = 0; *** initialize required parameter for cm_emiMktTarget rescale oscillation dampening. p47_factorRescaleemiMktCO2Tax_iter("1","2020","2030",ext_regi,emiMktExt) = 0; +*** initialize required parameter to track if the upper slope clamp fired. +p47_upperClampActive_iter("1","2020","2030",ext_regi,emiMktExt) = 0; $ENDIF.emiMkt diff --git a/modules/47_regipol/regiCarbonPrice/declarations.gms b/modules/47_regipol/regiCarbonPrice/declarations.gms index 071a9337b..e207f832d 100644 --- a/modules/47_regipol/regiCarbonPrice/declarations.gms +++ b/modules/47_regipol/regiCarbonPrice/declarations.gms @@ -13,6 +13,8 @@ Parameter s47_firstFreeYear "value of first free year for the carbon price trajectory" s47_prefreeYear "value of the last non-free year for the carbon price trajectory" + s47_slopeDegenerateThreshold "minimum emission change percentage relative to 2005 emissions required for a reliable slope; below this the slope numerator is treated as degenerate [fraction]" + s47_slopeMaxWindow "maximum number of iterations between the reference iteration and the current iteration for slope calculation; beyond this the reference is reset to force a local slope [#]" pm_emiLULUCF_GrassiShift(ttot,all_regi) "difference between Magpie land-use change emissions and UNFCCC emissions in 2015 to correct for national accounting in emissions targets [GtC]" pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt) "deviation of emissions of current iteration from target emissions, for budget target this is the difference normalized by target emissions, while for year targets this is the difference normalized by 2005 emissions [%]" pm_taxemiMkt(ttot,all_regi,all_emiMkt) "CO2 tax path per region and emissions market [T$/GtC]" @@ -62,6 +64,9 @@ $endif.emiMktTargetType p47_factorRescaleemiMktCO2Tax_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) "parameter to save rescale factor across iterations for debugging purposes [%]" p47_clampedRescaleSlope_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) "auxiliary parameter to save the slope value before clamping. Useful for debugging purposes [#]" p47_dampedFactorRescaleemiMktCO2Tax_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) "auxiliary parameter to save the rescale factor value before dampening. Useful for debugging purposes [#]" + p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) "adaptive upper clamp bound for rescale slope; starts at -0.3 and halves after two consecutive triggers at the same level [#]" + p47_slopeUpperClampBound_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) "adaptive upper clamp bound per iteration for debugging [#]" + p47_upperClampActive_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) "1 if the upper slope clamp fired in this iteration, 0 otherwise [0 or 1]" *** Parameters necessary to define the CO2 tax curve shape p47_targetConverged(ttot,ext_regi) "boolean to store if emission target has converged [0 or 1]" diff --git a/modules/47_regipol/regiCarbonPrice/postsolve.gms b/modules/47_regipol/regiCarbonPrice/postsolve.gms index 3f92dfdf1..98a496f35 100644 --- a/modules/47_regipol/regiCarbonPrice/postsolve.gms +++ b/modules/47_regipol/regiCarbonPrice/postsolve.gms @@ -142,7 +142,7 @@ p47_emiTargetMkt_iter(iteration,ttot,regi, emiMktExt,emi_type_47) = p47_emiTarge *** Emission markets (EU Emission trading system and Effort Sharing) ***-------------------------------------------------- -$IFTHEN.emiMkt not "%cm_emiMktTarget%" == "off" +$IFTHEN.emiMkt not "%cm_emiMktTarget%" == "off" *** Removing economy wide co2 tax parameters for regions within the emiMKt controlled targets (this is necessary here to remove any calculation made in other modules after the last run in the postsolve) loop(ext_regi$regiEmiMktTarget(ext_regi), @@ -251,6 +251,8 @@ loop((ext_regi,ttot)$regiANDperiodEmiMktTarget_47(ttot,ext_regi), p47_slopeReferenceIteration_iter(iteration,ttot,ext_regi) = 1; elseif(NOT(p47_currentConvergence_iter(iteration,ttot,ext_regi) eq p47_currentConvergence_iter(iteration-1,ttot,ext_regi))), !! reset the iteration reference for slope calculation if the target that is being analyzed changes p47_slopeReferenceIteration_iter(iteration,ttot,ext_regi) = ord(iteration); + elseif((ord(iteration) - p47_slopeReferenceIteration_iter(iteration-1,ttot,ext_regi)) gt s47_slopeMaxWindow), !! reset if reference is too old to represent the local abatement cost curve + p47_slopeReferenceIteration_iter(iteration,ttot,ext_regi) = ord(iteration); else p47_slopeReferenceIteration_iter(iteration,ttot,ext_regi) = p47_slopeReferenceIteration_iter(iteration-1,ttot,ext_regi); ); @@ -266,6 +268,8 @@ loop(ext_regi$regiEmiMktTarget(ext_regi), loop((ttot,emiMktExt,target_type_47,emi_type_47)$(pm_emiMktTarget(ttot,ttot2,ext_regi,emiMktExt,target_type_47,emi_type_47)), loop(emiMkt$emiMktGroup(emiMktExt,emiMkt), loop(regi$regiEmiMktTarget2regi_47(ext_regi,regi), +*** reset the rescale type tracking for the current iteration to avoid overlapping flags + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,rescaleType) = NO; *** if rescale factor was already calculated for ext_regi, there is no need to recalculate it continue$(pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt)); *** calculating the rescale factor @@ -297,52 +301,90 @@ loop(ext_regi$regiEmiMktTarget(ext_regi), (pm_taxemiMkt_iteration(iteration,ttot2,regi,emiMkt) - pm_taxemiMkt_iteration(iteration2,ttot2,regi,emiMkt)); *** else if denominator in relation to first iteration is not close to zero, calculate the price slope in relation to the first iteration mitigation and price levels instead elseif(NOT(abs(pm_taxemiMkt_iteration(iteration,ttot2,regi,emiMkt) - pm_taxemiMkt_iteration("1",ttot2,regi,emiMkt)) lt 1e-2)), - regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_firstIteration") = YES; - p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = - (p47_emiMktCurrent_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) - p47_emiMktCurrent_iter("1",ttot,ttot2,ext_regi,emiMktExt)) - / - (pm_taxemiMkt_iteration(iteration,ttot2,regi,emiMkt) - pm_taxemiMkt_iteration("1",ttot2,regi,emiMkt)); -*** else if there is a previous iteration calculated slope, repeat the previous iteration slope - elseif((iteration.val gt 1) and (p47_slopeReferenceIteration_iter(iteration,ttot,ext_regi) - p47_slopeReferenceIteration_iter(iteration-1,ttot,ext_regi) eq 0)), - regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_repeatPrev") = YES; - p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = p47_factorRescaleSlope_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt); -*** else slope is not available, set the rescale factor based on remaining deviation - else - regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_noSlope") = YES; - pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = power(1+pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt), 2); +*** only use iteration 1 as reference if it falls within the slope window; otherwise iteration 1 is too old +*** to represent the local abatement cost and squareDev is more appropriate + if((iteration.val - 1) le s47_slopeMaxWindow, + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_firstIteration") = YES; + p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = + (p47_emiMktCurrent_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) - p47_emiMktCurrent_iter("1",ttot,ttot2,ext_regi,emiMktExt)) + / + (pm_taxemiMkt_iteration(iteration,ttot2,regi,emiMkt) - pm_taxemiMkt_iteration("1",ttot2,regi,emiMkt)); + else + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_outsideWindow") = YES; + pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = power(1+pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt), 2); + ); ); -*** if we are using the slope - if(NOT(regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_noSlope")), -*** if the slope is positive - if(p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) gt 0, - regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,rescaleType) = NO; -*** if there is a previous iteration calculated slope, repeat the previous iteration slope to avoid the positive value because we assume a trade-off between tax and emission levels - if((iteration.val gt 1) and (p47_slopeReferenceIteration_iter(iteration,ttot,ext_regi) - p47_slopeReferenceIteration_iter(iteration-1,ttot,ext_regi) eq 0), - regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_repeatPrev_positiveSlope") = YES; - p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = p47_factorRescaleSlope_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt); -*** else slope is not available, set the rescale factor based on remaining deviation - else - regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_noNonPositiveSlope") = YES; - pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = power(1+pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt), 2); - ); +*** if the slope is positive + if(p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) gt 0, + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,rescaleType) = NO; +*** if there is a previous iteration calculated slope, repeat the previous iteration slope to avoid the positive value because we assume a trade-off between tax and emission levels + if((iteration.val gt 1) and (p47_slopeReferenceIteration_iter(iteration,ttot2,ext_regi) - p47_slopeReferenceIteration_iter(iteration-1,ttot2,ext_regi) eq 0), + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_repeatPrev_positiveSlope") = YES; + p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = p47_factorRescaleSlope_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt); +*** else slope is not available, set the rescale factor based on remaining deviation + else + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_noNonPositiveSlope") = YES; + pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = power(1+pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt), 2); ); -*** if we are still using the slope - if(NOT(regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_noNonPositiveSlope")), -*** clamp slopes values to avoid extreme changes (or no change) on a single iteration (avoid corner cases where other parts of the model changes causing undesirable fluctuations on the calculated slope) - if((p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) gt -0.3) OR (p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) lt -5), + ); +*** if we are still using the slope + if(NOT(regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_noNonPositiveSlope")) + AND NOT(regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_outsideWindow")), +*** initialize or reset adaptive upper clamp bound when reference iteration changes + if((p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) eq 0) + OR ((iteration.val gt 1) AND (p47_slopeReferenceIteration_iter(iteration,ttot2,ext_regi) ne p47_slopeReferenceIteration_iter(iteration-1,ttot2,ext_regi))), + p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) = -0.3; + ); + p47_slopeUpperClampBound_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) = p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt); +*** if upper clamp fires for second consecutive time at minimum level (-0.075), immediately override to squareDev and reset + if((p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) gt p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt)) + AND (p47_upperClampActive_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt) eq 1) + AND (p47_slopeUpperClampBound_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt) eq p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt)) + AND (p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) lt -0.07), + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,rescaleType) = NO; + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_adaptiveClamp") = YES; + pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = power(1+pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt), 2); + p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) = -0.3; + p47_slopeReferenceIteration_iter(iteration,ttot2,ext_regi) = ord(iteration); + else +*** clamp slopes values to avoid extreme changes (or no change) on a single iteration + if((p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) gt p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt)) OR (p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) lt -5), p47_clampedRescaleSlope_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) = p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt); ); - p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = max(-5,min(-0.3, p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt))); -*** calculate the tax rescale factor using the above calculated slope - pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = + p47_upperClampActive_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) = (p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) gt p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt)); + p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) = max(-5, min(p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt), p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt))); +*** calculate the tax rescale factor using the above calculated slope + pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = ( (pm_emiMktTarget(ttot,ttot2,ext_regi,emiMktExt,target_type_47,emi_type_47) - p47_emiMktCurrent_iter(iteration,ttot,ttot2,ext_regi,emiMktExt)) - / + / (p47_factorRescaleSlope(ttot,ttot2,ext_regi,emiMktExt) * pm_taxemiMkt_iteration(iteration,ttot2,regi,emiMkt)) ) + 1; +*** halve adaptive bound after two consecutive upper-clamp triggers at the same level; reset if clamp not triggered + if((p47_upperClampActive_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) eq 1) + AND (p47_upperClampActive_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt) eq 1) + AND (p47_slopeUpperClampBound_iter(iteration-1,ttot,ttot2,ext_regi,emiMktExt) eq p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt)), + p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) = p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) / 2; + elseif(p47_upperClampActive_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) eq 0), + p47_slopeUpperClampBound(ttot,ttot2,ext_regi,emiMktExt) = -0.3; + ); ); ); ); +*** if slope numerator is negligibly small relative to 2005 emissions, the reference iteration is degenerate (e.g. initialised from near-net-zero scenario where emi_ref ≈ emi_current ≈ 0). +*** fall back to squareDev and reset reference so next iteration uses a fresh slope. It only applies to year targets (pm_emiMktRefYear > 0) + if((regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_refIteration") + OR regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"slope_firstIteration")) + AND NOT((iteration.val - iteration2.val) eq 0) + AND (pm_emiMktRefYear(ttot,ttot2,ext_regi,emiMktExt) gt 0) + AND (abs(p47_emiMktCurrent_iter(iteration,ttot,ttot2,ext_regi,emiMktExt) + - p47_emiMktCurrent_iter(iteration2,ttot,ttot2,ext_regi,emiMktExt)) + lt s47_slopeDegenerateThreshold * pm_emiMktRefYear(ttot,ttot2,ext_regi,emiMktExt)), + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,rescaleType) = NO; + regiEmiMktRescaleType(iteration,ttot,ttot2,ext_regi,emiMktExt,"squareDev_degenerateSlope") = YES; + pm_factorRescaleemiMktCO2Tax(ttot,ttot2,ext_regi,emiMktExt) = power(1+pm_emiMktTarget_dev(ttot,ttot2,ext_regi,emiMktExt), 2); + p47_slopeReferenceIteration_iter(iteration,ttot2,ext_regi) = ord(iteration); + ); ); *** dampen if rescale oscillates if( (iteration.val > 3) , @@ -427,7 +469,12 @@ loop(ext_regi$regiEmiMktTarget(ext_regi), pm_taxemiMkt(t,regi,emiMkt)$((t.val gt ttot2.val) AND (t.val lt ttot3.val)) = pm_taxemiMkt(ttot2,regi,emiMkt) + ((pm_taxemiMkt(ttot3,regi,emiMkt) - pm_taxemiMkt(ttot2,regi,emiMkt))/(ttot3.val-ttot2.val))*(t.val-ttot2.val); !! price in between current target year and next target year *** else if next target was never executed by the algorithm yet, initialize next target value as weighted average convergence price between current target terminal year (ttot2.val) and next target year (p47_nextConvergencePeriod) else - p47_averagetaxemiMkt(t,regi) = +*** default: simple average across markets (guards against division by zero when total +*** net emissions are negligibly small, zero, or net-negative with cancellation) + p47_averagetaxemiMkt(t,regi) = + (pm_taxemiMkt(t,regi,"ETS") + pm_taxemiMkt(t,regi,"ES") + pm_taxemiMkt(t,regi,"other")) / 3; +*** override with emission-weighted average when total net emissions are large enough + p47_averagetaxemiMkt(t,regi)$(abs(p47_emiTargetMkt(t,regi,"ETS",emi_type_47) + p47_emiTargetMkt(t,regi,"ESR",emi_type_47) + p47_emiTargetMkt(t,regi,"other",emi_type_47)) gt 1e-6) = (pm_taxemiMkt(t,regi,"ETS")*p47_emiTargetMkt(t,regi,"ETS",emi_type_47) + pm_taxemiMkt(t,regi,"ES")*p47_emiTargetMkt(t,regi,"ESR",emi_type_47) + pm_taxemiMkt(t,regi,"other")*p47_emiTargetMkt(t,regi,"other",emi_type_47)) / (p47_emiTargetMkt(t,regi,"ETS",emi_type_47) + p47_emiTargetMkt(t,regi,"ESR",emi_type_47) + p47_emiTargetMkt(t,regi,"other",emi_type_47)); diff --git a/modules/47_regipol/regiCarbonPrice/sets.gms b/modules/47_regipol/regiCarbonPrice/sets.gms index 61ca8a8ca..29d1e791f 100644 --- a/modules/47_regipol/regiCarbonPrice/sets.gms +++ b/modules/47_regipol/regiCarbonPrice/sets.gms @@ -21,10 +21,10 @@ $ifThen.emiMkt not "%cm_emiMktTarget%" == "off" regiEmiMktTarget(ext_regi) "regions with emiMkt targets" / / regiANDperiodEmiMktTarget_47(ttot,ext_regi) "regions and periods with emiMkt targets" / / regiEmiMktTarget2regi_47(ext_regi,all_regi) "regions controlled by emiMkt market set to ext_regi" / / - rescaleType "emi mkt carbon price scaling factor calculation methods" / - "squareDev_firstIteration", "squareDev_perfectMatch", "squareDev_smallChange", "squareDev_noChange", - "slope_refIteration", "slope_firstIteration", "slope_repeatPrev", "slope_repeatPrev_positiveSlope", - "squareDev_noSlope", "squareDev_noNonPositiveSlope"/ + rescaleType "emi mkt carbon price scaling factor calculation methods" / + "squareDev_firstIteration", "squareDev_perfectMatch", "squareDev_smallChange", "squareDev_noChange", + "slope_refIteration", "slope_firstIteration", "slope_repeatPrev_positiveSlope", + "squareDev_noNonPositiveSlope", "squareDev_degenerateSlope", "squareDev_outsideWindow", "squareDev_adaptiveClamp"/ regiEmiMktRescaleType(iteration,ttot,ttot,ext_regi,emiMktExt,rescaleType) "saving scaling type used in iteration" / / convergenceType "emiMkt target non convergence reason" / "lowerThanTolerance", "smallPrice" / regiEmiMktconvergenceType(iteration,ttot,ttot,ext_regi,emiMktExt,convergenceType) "saving convergence type in iteration" / /