Group-stepwise ORDC, load reserve provision, and OfflineReserve ORDC supply - #236
Group-stepwise ORDC, load reserve provision, and OfflineReserve ORDC supply#236rodrigomha wants to merge 6 commits into
Conversation
|
New commit |
|
@rodrigomha this PR needs to be rebased |
3479231 to
f33d289
Compare
|
Done with the rebase |
|
Performance Results
|
|
CI status after the rebase, fully diagnosed:
|
f0fda18 to
3382f8f
Compare
|
Restacked on #233 per the network-consolidation sequencing: base is now
|
luke-kiernan
left a comment
There was a problem hiding this comment.
Looks fine, no issues at a glance. However, you should probably have others review it too--I'm not very familiar the distinctions between these differennt types of reserves...
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
…eCostReserve The group formulation has supported time-series-backed ORDCs since the stepwise parameter machinery generalized to the reserve tree, but had no dedicated coverage. The test alternates the group curve's demand cap 40/80 MW by hour at a decisive price and asserts the cleared group demand tracks the alternation exactly - something a static curve cannot produce.
Stacked on #235 (base branch
rh/reserve_refactor); the diff shows only this feature's commits.New features (not refactor items) re-expressed on the psy6 reserve tree:
GroupStepwiseCostReserve: elastic group ORDC. One denseServiceRequirementVariableper group, a clearing constraintsum(member awards) >= requirement variable, and the group's demand curve (static or time series) priced through the existing delta-PWL path. Mis-pairedServiceModels (GroupReservewith a non-group formulation and vice versa) fail at declaration.PowerLoadDispatch: the inverse of a generator. Up reserve is committed shed (P - r_up >= 0), down reserve is committed extra consumption (P + r_down <= forecast), gated on an attached service model. A costless load selling reserves errors since nothing pins its consumption.OfflineReserve(non-spin) as ORDC supply from storage and loads: non-spinning is upward-only, so it routes like an up reserve everywhere a device supplies it (newUP_RESERVEunion). Previously only thermal was wired: the storage reserve-balance multipliers MethodError'd, two storage coverage branches silently skipped the service, complete coverage hit an@assert false, and_modify_device_model!no-opped everyOfflineReservemodel. The no-op is now scoped toNonSpinningReserve, whose awards rideReservePowerConstraintinstead of the device range expressions.Tests live in existing files: group-stepwise testsets in
test_services_constructor.jl; market integration, load provision, and theOfflineReserveORDC scenarios intest_device_reserve_offers.jl; the storage non-spin coverage testset intest_storage_device_models.jl.Full suite green: 106708/106708. Docs build green.
🤖 Generated with Claude Code