Storage Components#
This page describes how electrical storage assets are represented in the model, including their data sources, capacity assignment, parameterisation, and implementation.
Overview#
The model includes the following storage assets, sized by future FES scenarios:
Battery storage: Grid-connected battery storage
Pumped hydro storage (PHS): Gravity-based hydro reservoirs that can pump water uphill to store energy and generate on demand
Compressed (CAES) & liquid (LAES) air storage: Grid-connected compression storage, usually stored in large underground caverns or tanks
Hydrogen storage: Storage capacity that buffers the hydrogen system — documented in Hydrogen Subsystem
All storage assets are modelled as fixed-capacity, non-extendable units — the model dispatches within the capacities provided and does not invest in new storage.
Data Sources#
The figure below gives a high-level view of the storage data pipeline:
![digraph {
rankdir=LR;
node [shape=box, style=filled];
es1 [label="FES ES1\n(storage (dis)charge capacity\n& energy capacity)", fillcolor="#B3D9FF"];
fes_bb1 [label="FES BB1\n(battery p_nom,\nPHS capacity)", fillcolor="#B3D9FF"];
dukes [label="DUKES 5.11\n(PHS existing caps)", fillcolor="#B3D9FF"];
es2 [label="FES ES2\n(EUR battery p_nom)", fillcolor="#B3D9FF"];
hydro_cap [label="hydro_capacities.csv\n(PyPSA-Eur)", fillcolor="#B3D9FF"];
ppl [label="Powerplants table\n(carrier=battery/PHS/compressed-air/liquid-air)", fillcolor="#FFFACD"];
max_hours [label="Storage max hours", fillcolor="#FFFACD"];
network [label="PyPSA Network\n(StorageUnits)", fillcolor="#90EE90", shape=ellipse];
es1 -> max_hours;
fes_bb1 -> ppl;
dukes -> ppl;
es2 -> ppl;
max_hours -> ppl;
ppl -> network [label="storage p_nom & max_hours", style=dashed];
}](../_images/graphviz-943d73ba238ad2106352a8c6945dfb513af05417.png)
FES ES1 — Storage Max Hours#
Storage (dis)charge (p_nom, in MW) and energy capacity (e_nom, in GWh) for Great Britain is drawn from the NESO Future Energy Scenarios (FES) 2024 workbook, sheet ES1 (Electricity supply).
Together, these can be used to define the maximum number of hours that a storage vessel could discharge for: \(\text{max_hours} = e_\text{nom}/p_\text{nom}\).
This is then used in defining the technologies in PyPSA since StorageUnit component energy capacity is defined by its max_hours.
The max hours of a storage technology is assumed to be the same in all model regions.
FES BB1 — Regional Discharge Capacity#
Regional (dis)charge capacity (in GW) for Great Britain comes from the FES BB1 (Building Blocks) sheet and the powerplants pipeline (see Generation Components).
Battery and PHS capacity are both defined as their own building blocks. Compressed/liquid air storage is defined as an “other” building block and is distributed between the two technologies using GB capacities defined in the FES ES1 sheet.
DUKES 5.11 — PHS Existing Infrastructure#
The Digest of UK Energy Statistics (DUKES) table 5.11 provides current PHS installed capacity and is used to anchor the spatial distribution of PHS plant where FES provides only Transmission Operator (TO) level data.
Carrier assignment from DUKES uses the dukes-5.11.carrier_mapping configuration section.
FES ES2 — European Capacity Data#
European battery (dis)charge capacity is sourced from the FES ES2 sheet of the FES 2024 workbook, which provides scenario-aligned capacity projections for European countries. Data from this sheet is merged into the powerplants table alongside the GB regional data.
PyPSA-Eur - efficiency#
Technology characteristics unavailable in the FES are derived directly from the PyPSA-Eur workflow.
In the case of storage devices, we are only concerned with charge/discharge efficiency.
The choice of technology data to use for each storage technology is configured in fes_costs.pypsa_eur_tech_data_carrier_set_mapping.
We use one efficiency value per technology, which we take to be the round-trip efficiency.
Therefore the charge (efficiency_store) and discharge (efficiency_dispatch) efficiencies are calculated as \(\sqrt(efficiency)\).
System Components#
All electricity storage technologies are modelled as PyPSA StorageUnit components.
Hydrogen storage is documented separately in Hydrogen Subsystem.
For each of these components, charge / discharge efficiency is calculated based on values derived from PyPSA-Eur technology data. The PyPSA-Eur technology chosen to represent each GB storage technology is configurable.
Technology |
Battery |
PHS |
Compressed air |
Liquid air |
|---|---|---|---|---|
PyPSA network carrier |
|
|
|
|
Configuration#
FES technology to PyPSA network carrier mapping (GB):
fes.gb:
generators_and_storage:
carrier_mapping:
SubType:
Battery: battery
Biomass CHP: biomass
Biomass: biomass
CCGT: CCGT
CCS Biomass: biomass
CCS Gas: CCGT
Coal: coal
Compressed Air: compressed-air
Diesel: oil
Fuel Oil: oil
Gas CHP: CCGT
Gas Reciprocating Engines: engine
Hydro: ror
Hydrogen CHP: hydrogen-turbine
Hydrogen: hydrogen-turbine
Liquid Air: liquid-air
Marine: marine
Nuclear - Large: nuclear
Nuclear - SMR: nuclear
OCGT: OCGT
Offshore Wind: offwind-dc
Onshore Wind: onwind
Other Renewables: geothermal
Pumped Hydro: PHS
Solar PV: solar
Waste CHP: waste
Waste: waste
# [doc:fes-gb-set-mapping-start]
set_mapping:
SubType:
"^CCS .+": CCS
".+ CHP$": CHP
Technology:
Storage: Store
# [doc:fes-gb-set-mapping-end]
building_block_mapping:
Gen_BB001: [Gas CHP, CCGT, CCS Gas]
Gen_BB002: [Gas CHP]
Gen_BB003: [Gas CHP]
Gen_BB004: [Other Renewables]
Gen_BB005: [Diesel, Fuel Oil]
Gen_BB006: [Gas Reciprocating Engines]
Gen_BB007: [] # Hydrogen fuel cells
Gen_BB008: [OCGT]
Gen_BB009: [CCGT, CCS Gas]
Gen_BB010: [Biomass, CCS Biomass, Biomass CHP]
Gen_BB011: [Waste, Waste CHP]
Gen_BB012: [Solar PV]
Gen_BB013: [Solar PV]
Gen_BB014: [Offshore Wind]
Gen_BB015: [Onshore Wind]
Gen_BB016: [Onshore Wind]
Gen_BB017: [Marine]
Gen_BB018: [Hydro]
Gen_BB019: [Other Renewables]
Gen_BB020: [Nuclear - Large, Nuclear - SMR]
Gen_BB021: [Coal]
Gen_BB022: [] # interconnectors
Gen_BB023: [Hydrogen, Hydrogen CHP]
Gen_BB024: [Offshore Wind]
Srg_BB001: [Battery]
Srg_BB002: [Battery]
Srg_BB003: [Pumped Hydro]
Srg_BB004: [Liquid Air, Compressed Air]
building_block_mapping_tolerance: 0.005
FES technology to PyPSA network carrier mapping (EUR):
fes.eur:
generators_and_storage:
carrier_mapping:
SubType:
Battery: battery
Biomass CCS: biomass
Biomass: biomass
CCGT CHP: CCGT
Coal: coal
Fossil Gas: CCGT
Fossil Oil: oil
Geothermal: geothermal
GT Hydrogen: hydrogen-turbine
Marine: marine
Nuclear: nuclear
Pumped Hydro: PHS
Run-of-river Hydro: ror
Solar PV: solar
Waste: waste
Wind Offshore: offwind-dc
Wind Onshore: onwind
set_mapping:
SubType:
".+ CCS$": CCS
".+ CHP$": CHP
Category:
Storage: Store
Note
We use the dot notation for parent configuration keys.
For example, fes.gb is equivalent to fes as the top-level key, gb as the first-level key, then the configuration snippet is at the level below this.
PyPSA network carrier to PyPSA-Eur technology data mapping:
fes_costs:
pypsa_eur_tech_data_carrier_set_mapping:
battery: battery storage
biomass-CCS: biomass
biomass-CHP: biomass CHP
biomass: biomass
CCGT-CCS: CCGT
CCGT-CHP: central gas CHP
CCGT: CCGT
coal-CHP: central coal CHP
coal: coal
compressed-air: Compressed-Air-Adiabatic-bicharger
electrolysis: electrolysis
engine-CHP: central gas CHP
engine: central gas CHP # `direct firing gas` is a better fit but the data is spurious
geothermal: geothermal
hydro: ror
hydrogen-fuel-cell: fuel cell
hydrogen-turbine-CHP: central hydrogen CHP
hydrogen-turbine: CCGT
hydrogen: hydrogen storage tank type 1 including compressor
liquid-air: Liquid-Air-discharger # discharge efficiency closer to the round-trip efficiency
nuclear: nuclear
OCGT-CHP: central gas CHP
OCGT: OCGT
offwind: offwind
oil-CHP: oil
oil: oil
onwind: onwind
PHS: PHS
ror: ror
solar: solar
waste-CHP: waste CHP
waste: biomass
Cost mappings for storage VOM (fes_costs.fes_VOM_carrier_mapping):
fes_costs:
fes_VOM_carrier_set_mapping:
battery: Storage-Battery
biomass-CCS: CCS-CCS Biomass
biomass-CHP: Biomass-Biomass CHP
biomass: Biomass-Biomass
CCGT-CCS: CCS-CCS Gas
CCGT-CHP: Gas-Gas CHP
CCGT: Gas-CCGT
coal-CHP: Coal-Coal CHP
coal: Coal-Coal
compressed-air: Storage-Compressed Air
engine-CHP: Gas-Gas CHP
engine: Gas-Gas Reciprocating Engines
geothermal: Other Renewables-Other Renewables
hydrogen-fuel-cell: Storage-Fuel Cells
hydrogen-turbine-CHP: Gas-Gas CHP # there is no hydrogen CHP costs in FES
hydrogen-turbine: Low Carbon-Hydrogen
liquid-air: Storage-Liquid Air
marine: Marine-Marine
nuclear: Nuclear-Nuclear
OCGT-CHP: Gas-Gas CHP
OCGT: Gas-OCGT
offwind-dc: Offshore Wind-Offshore Wind
oil: Other Thermal-Fuel Oil
onwind: Onshore Wind-Onshore Wind
PHS: Storage-Pumped Hydro
ror: Hydro-Hydro
solar: Solar-Solar PV
waste-CHP: Waste-Waste CHP
waste: Waste-Waste
Implementation Notes#
Data Processing Workflow#
The storage system is built through a pipeline implemented in rules/gb-model/storage.smk and integrated via the standard PyPSA-Eur attach_hydro function:
Note
The graph above was generated using:
pixi run filtered_rulegraph \
"resources/GB/gb-model/HT/max_hours.csv \
resources/GB/gb-model/HT/regional_H2_storage_capacity_inc_eur_inc_tech_data.csv \
resources/GB/gb-model/HT/fes_powerplants_inc_tech_data.csv \
-w fes_scenario -w year \
-f rules/gb-model/storage.smk \
-s 10,8" \
"doc/gb-model/img/storage_workflow.svg"
The filtered_rulegraph task allows us to trim the full DAG to storage-related rules only.
FES FLX1 extraction (
process_battery_energy_capacity): Reads total GB battery energy capacity per scenario and year from FES FLX1; converts GWh to MWhRegional distribution (
process_regional_battery_storage_capacity): Distributes national batterye_nomto model regions in proportion to regionalp_nomfrom the powerplants table; appends European regions using the GB meane_nom/p_nomratioBattery storage attachment (
add_battery_storageinscripts/gb_model/compose_network.py): Merges regionale_nomwith the powerplants table onbusandyear, computesmax_hours, sets efficiency and cyclic state-of-charge, and adds each entry as aStorageUnitPHS and hydro attachment (
attach_hydroinside_integrate_renewables): Readsp_nomfor PHS and hydro from the powerplants table, sizese_nomfromdata/hydro_capacities.csv, and attaches inflow time series from the ERA5/runoff cutout in a single pass
Key Assumptions#
Regional battery distribution:
e_nomis allocated to regions strictly in proportion to their share of total GB batteryp_nom; regions with zerop_nomreceive no energy capacityEuropean battery duration: The GB mean
e_nom/p_nomratio is applied uniformly to all European battery entries; no country-specific duration data is usedFixed capacity: All storage assets are non-extendable (
p_nom_extendable = False); the model dispatches within given capacities and cannot invest in new storageRound-trip efficiency: Cycle efficiency is split symmetrically between charging and discharging (\(\eta_\text{store} = \eta_\text{dispatch} = \sqrt{\eta}\))
PHS energy capacity: Sized from PyPSA-Eur ERA5-derived
hydro_capacities.csv; no GB-specific reservoir volume data is used
See also
Related Documentation:
Generation Components - Powerplants pipeline that provides
p_nomfor battery and PHSHydrogen Subsystem - Hydrogen storage (documented separately)
Configuration - Full configuration reference
Dispatch and Redispatch Modelling - Storage dispatch in the optimisation
External Resources:
FES 2024 Data Workbook - Battery and PHS capacity projections
DUKES table 5.11 - Existing PHS installed capacity
PyPSA-Eur -
attach_hydrofunction and ERA5-derived hydro capacities