Add multi-metrics for RA#99
Conversation
patrickbrown4
left a comment
There was a problem hiding this comment.
This is cool, thanks! I haven't gone all the way through stress_periods.py yet, but adding some interim comments. My main thoughts are:
- I would call it LOLH instead of LOLE if the units are event-hours
- I think it would simplify the processing to drop the third argument of the compound
GSw_PRM_StressThreshold{LOLE|EUE|NEUE}switches; instead of leaving it up to the user, NEUE- and EUE-based thresholds would always add stress periods with the highest EUE, and the LOLH-based threshold would always add stress periods with the highest LOLH. (When we add the depth-based metric, it would always add stress periods with the highest peak outage MW.)
| #%% Write consolidated NEUE so far | ||
| #%% Write consolidated stress metrics so far | ||
| try: | ||
| ## TODO: Check if get_and_write_neue() is still needed |
There was a problem hiding this comment.
We don't use the national NEUE within the model so it can be removed (sorry for all the cruft). You would also remove the following blocks. It's kind of a lot though, and it's not directly related to this PR, so it might be best to save for a followup cleanup PR.
ReEDS/postprocessing/bokehpivot/reeds2.py
Lines 2764 to 2775 in ce7c0d5
ReEDS/postprocessing/compare_cases.py
Line 196 in ce7c0d5
All the 'NEUE (ppm)' keys in reedsplots.plot_diff() like
Line 117 in ce7c0d5
Lines 486 to 490 in ce7c0d5
patrickbrown4
left a comment
There was a problem hiding this comment.
Thanks, happy to discuss any of these if helpful (particularly the one about dropping GSw_PRM_StressThresholdEUE). Could you re-request a review when I should take another look?
| @@ -288,8 +263,7 @@ | |||
| day_after = timeindex[(day_index + periodhours) % len(timeindex)] | |||
|
|
|||
| if ( | |||
| ((cutofftype == 'eue') and (end_headspace_MWh / day_eue >= float(cutoff))) | |||
| or ((cutofftype[:3] == 'cap') and (end_headspace_frac >= float(cutoff))) | |||
There was a problem hiding this comment.
The default GSw_PRM_StressStorageCutoff is still EUE_0.1, which looks like it means the default shoulder-period functionality would be removed with this change.
I think we should keep the original EUE formulation in get_shoulder_periods(). It should apply for both GSw_PRM_StressThresholdEUE and GSw_PRM_StressThresholdNEUE (both of which use EUE to select stress periods).
I'm not sure if it should apply to GSw_PRM_StressThresholdLOLH-identified periods. If it does, I think it's fine to still use EUE to identify those shoulder periods. If that complicates things, you can just drop the shoulder functionality for LOLH-identified periods (but keep it for the NEUE-/EUE-identified periods).
| GSw_PRM_StressThreshold,/-delimited list of annual NEUE level [ppm] above which to re-solve the latest model year with new stress periods; formulated as HierarchyLevel_NEUEppm_StressMetric_PeriodAggMethod where HierarchyLevel is a column in hierarchy.csv; NEUEppm is normalized expected unserved energy in parts per million; StressMetric is EUE or NEUE (only used in period selection); PeriodAggMethod is 'sum' or 'max' over the hours in each period (only used in period selection) (see README.md for detailed notes),N/A,transgrp_1_EUE_sum, | ||
| GSw_PRM_StressThresholdMetrics,"/-delimited list of metrics for identifying stress periods (supported options are: NEUE, EUE, LOLH)",N/A,NEUE, | ||
| GSw_PRM_StressThresholdLOLH,LOLH threshold [hours/year] above which to re-solve the latest model year with new stress periods; formulated as HierarchyLevel_LOLH_StressMetric_PeriodAggMethod where HierarchyLevel is a column in hierarchy.csv; LOLH is number of loss of load event-hours; StressMetric is LOLH; PeriodAggMethod is 'sum' or 'max' over the hours in each period (only used in period selection) (see README.md for detailed notes),N/A,transgrp_36_sum, | ||
| GSw_PRM_StressThresholdEUE,Annual EUE level [MWh] threshold above which to re-solve the latest model year with new stress periods; formulated as HierarchyLevel_EUE_StressMetric_PeriodAggMethod where HierarchyLevel is a column in hierarchy.csv; EUE is expected unserved energy; StressMetric EUE (only used in period selection); PeriodAggMethod is 'sum' or 'max' over the hours in each period (only used in period selection) (see README.md for detailed notes),N/A,transgrp_10000_sum, |
There was a problem hiding this comment.
Can you remind me, do any of the regions you reviewed formulate their RA target as EUE [MWh] instead of NEUE [ppm]? EUE MWh would be a bit of a weird threshold in the context of load growth, and a single number wouldn't really make sense to apply across different transgrp regions with different loads (as is specified in the default value).
So I guess my feeling is that it might be simpler just to drop GSw_PRM_StressThresholdEUE and stick with NEUE and LOLH as the two options. What do you think?
There was a problem hiding this comment.
Some regions (e.g., SPP had EUE seasonal targets and The Tri-State Agency had <0.5 GWh, and ERCOT (magnitude) of 19 GW). Nevertheless, I agree that NEUE makes it easier to implement across multiple regions with different load profiles etc. I'll remove the EUE for now and we can always return it in a future update.
|
Included in #124 |
Summary
Technical details
Implementation notes
EUEis no longer used for determining the shoulder periods in functionget_houlder_periods(), in caseEUEis not defined as a stress metricEUEis not included as a stress metric, PRAS-informed PRM update is blocked, and fixed-increment update is used, similar to settingGSW_PRM_UpdateMethod=1Switches added/removed/changed
GSw_PRM_StressThreshold->GSw_PRM_StressThresholdMetrics: This switch now defines the/delimited stress metric switches to be used for evaluation. For eachMetric, a dedicated switch is added to define theHierarchyLevel,Criterion, and thePeriodAggMethod. Current tested metrics areEUE,LOLH, andNEUE.GSw_PRM_StressThresholdEUE: Switch to define theEUEstress metric hierarchy, threshold, and PeriodAggMethod.GSw_PRM_StressThresholdLOLH: Switch to define theLOLHstress metric hierarchy, threshold, and PeriodAggMethod.GSw_PRM_StressThresholdNEUE: Switch to define theNEUEstress metric hierarchy, threshold, and PeriodAggMethod.LOLHGSw_PRM_StressThresholdLOLHtransgrp_2.4_sum: TheLOLHthreshold is set at 2.4 events-hour/year, aggregated usingsumovertransgrpEUEGSw_PRM_StressThresholdEUEtransgrp_10000_sum: TheEUEthreshold is set at 10000 MWh over the study period, aggregated usingsumovertransgrpNEUEGSw_PRM_StressThresholdNEUEtransgrp_1_sum: TheNEUEthreshold is set at 1 ppm aggregated usingsumovertransgrpRelevant sources or documentation
Slides deck reviewing Resource Adequacy multi-metrics:
RA multi metrics slides deck
Validation, testing, and comparison report(s)
Comparison report
To check
Checklist for author
Details to double-check
General information to guide review
Did you use LLM tools (chatbot or copilot) in the preparation of this PR? If so, describe how
runreeds.pyandstress_periods.py