Skip to content

Technical Implementation

This section provides technical details about GB-specific implementation features.

FES Powerplants Data

Overview

The GB model uses powerplant capacity data from the Future Energy Scenarios (FES) workbook, enriched with technical and cost parameters to create a complete dataset ready for PyPSA network composition. This data replaces the default PyPSA-Eur powerplants dataset with GB-specific capacity projections.

Data Pipeline

The powerplants data flows through two main stages:

  1. Capacity Aggregation (create_powerplants_table.py)

  2. Processes FES workbook data (GB regions)

  3. Processes European supply data (neighboring countries)
  4. Maps technology names to PyPSA carriers
  5. Aggregates capacities by bus, year, carrier, and set

  6. Cost Enrichment (create_powerplants_table.py)

  7. Joins technology cost data (efficiency, VOM, fuel costs, etc.)

  8. Calculates marginal costs
  9. Fills missing values with sensible defaults
  10. Creates unique generator indices

Output Format

The resulting fes_powerplants.csv contains complete generator data:

Core Attributes:

  • bus - Network bus ID (string)
  • year - Planning year (integer)
  • carrier - Technology type (CCGT, nuclear, onwind, etc.)
  • set - Generator classification (PP, CHP, Store)
  • p_nom - Nominal capacity in MW (float)
  • build_year - Year of installation (integer)

Technical Parameters:

  • efficiency - Energy conversion efficiency (0-1)
  • lifetime - Asset lifetime in years (float)

Economic Parameters:

  • VOM - Variable O&M cost (GBP/MWh)
  • FOM - Fixed O&M cost (€/MW/year)
  • capital_cost - Investment cost (€/MW)
  • fuel - Fuel cost (GBP/MWh_thermal)
  • marginal_cost - Total variable cost (GBP/MWh_el)

Index Format: "{bus} {carrier}-{year}-{counter}"

Example: "GB0 CCGT-2030-0", "GB0 CCGT-2030-1"

Marginal Cost Calculation

Marginal cost combines variable O&M and fuel costs:

marginal_cost = VOM + fuel / efficiency

Where:

  • VOM - Variable operations and maintenance (GBP/MWh_el)
  • fuel - Fuel cost (GBP/MWh_thermal)
  • efficiency - Conversion efficiency (MWh_el / MWh_thermal)

Example for CCGT with efficiency=0.55, VOM=2.5, fuel=25.0:

marginal_cost = 2.5 + 25.0/0.55 = 47.95 GBP/MWh

Default Values

When cost data is unavailable for specific carriers, defaults are applied:

  • efficiency: 1 (100% conversion efficiency)
  • capital_cost: 0.0 €/MW
  • lifetime: 25.0 years
  • marginal_cost: 0.0 GBP/MWh

These defaults prevent missing data from blocking network composition while logging warnings for review.

Integration with compose_network

The compose_network rule loads the enriched powerplants data directly:

ppl = pd.read_csv(powerplants_path, index_col=0, dtype={"bus": "str"})

This data is then used by:

  • attach_conventional_generators() - Adds fossil/nuclear generators
  • attach_wind_and_solar() - Adds renewable generators
  • attach_hydro() - Adds hydro and storage units
  • attach_chp_constraints() - Applies CHP heat demand constraints

No additional preprocessing is required; all necessary attributes are present in the CSV.

Configuration

The create_powerplants_table rule requires:

Inputs:

  • gsp_data - GB regional capacity data from FES workbook
  • eur_data - European national capacity data
  • tech_costs - Technology cost assumptions

Parameters:

  • gb_config - GB technology mapping configuration
  • eur_config - European technology mapping configuration
  • default_set - Default generator classification (typically "PP")

Output:

  • fes_powerplants.csv - Complete powerplants dataset

File Location

scripts/gb_model/
└── create_powerplants_table.py   # Data processing and enrichment

rules/
└── gb-model.smk                  # Snakemake rule definitions

results/{run}/resources/gb-model/
└── fes_powerplants.csv           # Generated output