reserve¶
Granular operating-reserve constraints (multi-product, LP relaxation).
Generalises the v1.12 / v1.14 reserve module from "one reserve_up + one reserve_down" to named reserve products, each with its own eligibility and zonal requirement -- matching the structure of real ancillary-services markets (CAISO, ERCOT, MISO, etc.) and the way GenX, ReEDS, and PowNet model reserves.
Default product set¶
Four products ship by default. The direction (up vs down) is encoded in the product name and inferred by the suffix:
regulation_up-- frequency regulation, increase outputregulation_down-- frequency regulation, decrease outputspinning-- contingency reserve, online + ready, up-onlynon_spinning-- contingency reserve, may be offline, up-only
The full set is read from the reserve_eligible CSV (column
product); any product name that ends in _down is treated as
a down-direction product, everything else is up.
Constraints¶
Per (h, m, y, z, te) and per direction d -- headroom is
shared across products in the same direction (otherwise we would
double-count: a unit's spare megawatts can serve regulation OR
spinning, not both at the same instant):
Per (h, m, y, z, p) zonal requirement:
Non-eligible (tech, product) cells are forced to zero. Products with no eligible techs in a zone produce a non-binding requirement.
Inputs¶
tech_reserve_eligible.csv-- columnstech, product, eligible. Missing rows default toeligible=0. v1.12 files (colstech, eligible) are NOT readable by this module; migrate by:old: Coal,1 new: Coal,regulation_up,1
Coal,regulation_down,1 Coal,spinning,1 Coal,non_spinning,1
reserve_requirement.csv-- columnszone, year, product, unit, value. Missing rows default to 0 (non-binding).
Module is gated by config.json.reserve_parameters.is_reserve;
when off, no variables / constraints are built.