EnergyInnovation / eps-us

Energy Policy Simulator - United States
GNU General Public License v3.0
22 stars 7 forks source link

Add control lever to enable/disable RPS foresight #255

Closed robbieorvis closed 11 months ago

robbieorvis commented 1 year ago

The current structure of the EPS gives producers foresight into future RPS values, which can cause the RPS values in a given year that are achieved to exceed policy values. We have a current example of this in the Rhode Island EPS, where a quickly increasing BAU RPS value is being exceeded in certain years because the trend is non-linear and accelerates in the outer years. There are instances where this behavior is undesirable, such as when we are trying to match specific policy values (as in the case of Rhode Island).

We already have an attempt to adjust the slopes for curves in the RPS to account for whether or not producers have foresight, but this isn't working correctly. There is a relatively easy workaround.

When we calculate RPS Qualifying Percentage of Elec Demand to Seek this Year (or its BAU equivalent), we can add an extra bit to the calculation, so that if producers do not have foresight, then instead of taking the VMAX of the future year subscript of the slope values, we take the values for the year in which Time = Future Year (using the Numerical Future Year Definitions). This will restrict the values to using only the calculated slope for the specific year, which is tied directly back to the RPS values and not a computed slope. I have tested this and it works well.

Below are the changes I made to each variable

RPS Qualifying Percentage of Elec Demand to Seek this Year

IF THEN ELSE(

VMAX(Slope of Line Approaching Future RPS Percentages by Year[Future Year!]) < 0,

0,

IF THEN ELSE(Do Producers Have Foresight to Future Additional RPS Values=0,

SUM(IF THEN ELSE(Time=Numerical Future Year Definitions[Future Year!],1,0)* Slope of Line Approaching Future RPS Percentages by Year[Future Year!]) + RPS Qualifying Share of Elec Demand after Net Imports, RPS Qualifying Share of Elec Demand after Net Imports+ VMAX(Slope of Line Approaching Future RPS Percentages by Year[Future Year!]) ))

BAU RPS Qualifying Percentage of Elec Demand to Seek This Year

IF THEN ELSE(

VMAX(Slope of Line Approaching Future RPS Percentages by Year[Future Year!]) < 0,

0,

BAU RPS Qualifying Share of Elec Demand after Net Imports+ SUM(BAU Slope of Line Approaching Future RPS Percentages by Year[Future Year!]*IF THEN ELSE(Time = Numerical Future Year Definitions[Future Year!],1,0)) )

jrissman commented 1 year ago

We already have an attempt to adjust the slopes for curves in the RPS to account for whether or not producers have foresight, but this isn't working correctly.

I think this is a misunderstanding of what the EPS is trying to do. This GitHub issue (#255) is a useful example of why we should be very cautious before we hand off model development responsibilities. I fear that things in the EPS will be broken by another developer who does not realize what the EPS is doing today and why it is that way.

Your suggested change eliminates the whole foresight mechanism. Let's look at the BAU variable because it is simpler to understand than the non-BAU version. Your change is to sum across all the slopes to future years, but all future years other than the one currently being simulated are multiplied by zero, so you end up with the value for the current year. But if we're multiplying all the future slopes by zero, why are we calculating the slope of the line to each future year at all? We could just have the EPS seek the current year RPS value as defined by the BAU RPS input data (plus the policy value, in the policy case). So one issue with the proposed fix is that it creates a lot of dead code where we calculate a bunch of things and then never use those things. Dead code makes the model hard to understand and maintain for developers and modelers (and makes the model run slower).

But the deeper issue is that the suggested behavior is undesirable - it is removing an important feature. Long ago, the EPS used to work the way you suggest, with no foresight, and utilities trying to meet each year's RPS setting in that year. We found that we do not want utilities to behave as though they are caught flat-footed by abrupt increases in the RPS stringency in the out-years. In the real world, policymakers give businesses enough lead time to reasonably comply with policy requirements, and they expect businesses to gradually make progress toward future-year targets rather than scramble to meet the target at the very last moment. Without RPS foresight, utilities may need to build an unrealistic amount of expensive zero-carbon capacity because they can't build enough cheaper capacity all in one year, and the construction is unrealistically compressed into one or a few years instead of being spread out over the time that utilities really would be building plants.

For instance, suppose the utility knows it needs 100 GW more RPS-qualifying resources in 10 years than it has today, but intermediate targets aren't specified by law. The utility will try to build at least 10 GW of RPS-qualifying resources per year, rather than blindly following a BAU trajectory for nine years, then suddenly do extreme and unrealistic things to try to meet an 100 GW shortfall in RPS-qualifying resources all in one year.

This is a example of how the model puts you in the role of a policymaker, not an energy god. The model user should not be able to define the exact RPS target percentage that utilities seek in each year. The model user should only be able to define what the policy is, which dictates the RPS target the utilities are legally obligated to meet in each year. Utilities are free to over-comply in certain years if it will make their overall regulatory burden easier by allowing them to build resources gradually rather than in a sudden burst in one year. Policymakers should not be able to forbid utilities from doing this, so I would argue against even adding a control lever that can toggle foresight off. This would remove an important guardrail against becoming an energy god instead of a policymaker.

Why are you seeking settings that prevent utilities from exceeding certain RPS values in years leading up to the target? You wouldn't consider a law that caps the allowable percentage of RPS-qualifying resources and mandates fossil fuel resources be built or maintained instead. But that's essentially what happens when we disable RPS foresight - we prevent utilities from rationally responding to RPS settings and instead require them to maintain more fossil generation than they would want.

(The variable named Do Producers Have Foresight to Future Additional RPS Values exists only in the Policy case. Its goal is to prevent divergence from the BAU case in years prior to any non-BAU policy implementation, which are often historical years such as 2020 and 2021. We found it confusing to see divergence from BAU starting before the policy was enacted, particularly when the model would say that the user's policy setting changes history because the BAU case represents what actually happened in past years.)

robbieorvis commented 1 year ago

There is a tension here between what is economically rational and what happens in the real world. I understand the smoothing mechanism and why we built it and it makes sense. I don’t think it actually mirrors how utilities operate and how they procure.

For now, we can set this aside, since it need further discussion and I’d like to chat more with the power team. When there are large discontinuities in an RPS, this mechanism makes a lot of sense. In the most extreme case, you can consider a state with no RPS in for several years and then a 100% RPS in the next year. Obviously, it would be inaccurate to have the model built all of the qualifying capacity in the year the RPS becomes binding.

On the other hand. You might have a situation, like in Rhode Island, with a steadily increasing RPS, but which increases somewhat more over the last 5 years getting to 100% than in the previous years. In this instance, the model is overcomplying with the RPS in the years leading up to 100%. For example, the current 2030 value for the BAU RPS in the RI model is 72% but the model is getting well above 80% as it aims to hit 100% by 2030.

In this instance, I don’t think it is realistic that the state would overachieve so much. However, I acknowledge the need for the current structure and the challenge in determining what is acceptable vs. not in terms of the smoothing and don’t have a better option.

The reason we are pursuing this is that we are being asked to model BAU scenarios that achieve the RPS targets – not exceed them. As of right now, the only way to do that is to manually tweak the RPS until it arrives at the desired value in the desired years, which is very tedious.

jrissman commented 1 year ago

Rather than doing the tedious task you mention, perhaps you can try to teach the partner or policymaker that it may not be reasonable to assume that utilities exactly hit the RPS targets in every year without over-compliance. While over-complying in earlier years (80%+ in your example) may seem unrealistic, building extraordinarily fast in later years to get to 100% by 2030 could also be unrealistic. It is possible to devise a target that is so ambitious that any pathway to the target appears unrealistic. This by itself does not indicate that the model is doing anything wrong. We want the EPS to be objective and not to understate the difficulty of hitting ambitious targets. (Note that I'm not expressing any opinion about whether Rhode Island's target is realistic or not. I have no knowledge of Rhode Island's specific situation.)

On the other hand, I can see a case where we might think that a region could dramatically ramp up capacity construction rate, but it needs a few years first to start building new projects at a faster pace, since it takes a while to get new plants financed and built. So perhaps there is a happy medium where you include a single intermediate year policy schedule point (say, in 2026) that is lower than the RPS percentage the model would seek in 2026 if it were using a linear approach from 2023 to 2030, to reflect the ramp-up time required to start building new capacity faster. Then you let the EPS handle the 2027-2030 period with foresight, which in this case means a linear approach from 2027 to 2030. This wouldn't be tedious because you are adding just one intermediate schedule point instead of trying to match the legislated RPS values in every year.

If we really do need to completely disable foresight, we would add a control lever to toggle that behavior, and it would only be used in rare instances. If we decide to go that route, I can build the relevant control lever and it wouldn't take me that long, so there is no need to develop a working code example.

jrissman commented 1 year ago

I looked at the foresight code quite a bit during the debugging process for the RPS two weeks ago. I think it's working as intended. But I also understand that this feature may not be desirable in all regions. It mostly exists to deal with spiky BAU policy schedules where the RPS jumps in some far-out year and the model had to scramble to build all sorts of uneconomic RPS-qualifying stuff in that one year to comply. But in a region with a smoothly growing RPS, that caution really isn't necessary, and the way the foresight makes the model over-comply in the current year can result in unrealistic amounts of renewables being deployed. At the moment, I think the best solution is to add a control lever to toggle the foresight behavior on or off, which can be defaulted to either "on" or "off" in each particular region depending on what best serves the needs of that region.

This can be implemented cleanly by having the new control lever affect the variable Do Producers Have Foresight to Future Additional RPS Values. The model should handle everything correctly after that, as long as that Boolean value is set appropriately, so this one should be easy to program.

jrissman commented 11 months ago

Completed in 3cf90d5. I've tested it, and it works beautifully in combination with the revisions to the RPS calculations discussed in issue #232. It helps the system to approach the RPS target more gradually. It doesn't approach the 100% target along a ramrod-straight line perhaps due to a one-year delay in the estimate in the change in demand due to demand-altering technologies (reflecting grid battery effects, currently), resulting in very slight concavity, but that's perfectly fine. Here are a couple graphs of RPS performance with RPS set to 100% in 2050, with and without foresight enabled. (Note that in the case without foresight, construction of RPS-qualifying resources through 2041 is driven by the cost-effective capacity construction mechanism, not the RPS construction mechanism, which is correct, as we don't want any RPS-driven construction when foresight is disabled and the amount of RPS-qualifying resources is above the legal requirement.)

Without foresight

RPS1_No_Foresight_2

With foresight

RPS1_With_Foresight_2

Closing this issue.