Base Configuration#

This is the procurement configuration used in the WattTime Impact Metastudy. The complete explaination of each configuration can be found in PyPSA-Eur: Configuration.

Note

The PyPSA-Eur configuration files follow a pyramid-like structure, where the parameters in the highest configuration file add to and override those in the configuration file below it. The order is as follows:

  1. scenarios.meta-{xH}.yaml

  2. config.meta.yaml (this section)

  3. config.default.yaml

Thus, for example changes specified in scenario.meta.yaml will add to and override configurations in config.meta.yaml and so on.

run#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Run Documentation.

run:
  prefix: ""
  name:
  - baseline-2025-1H
  #- baseline-2030-1H
  scenarios:
    enable: true
    file: config/scenarios.meta-1H.yaml
  disable_progressbar: false
  shared_resources:
    policy: false
    exclude: []
  shared_cutouts: true

This is the only few section in the file that needs to be changed in order to run the scenario.

  • prefix: (optional) directory for output results

  • name: Scenario name from config/scenarios.meta.yaml

foresight#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Foresight Documentation.

foresight: myopic

The scope of this work is based on myopic foresight.

scenario#

scenario:
  clusters:
  - 39
  opts:
  - ''
  sector_opts:
  - ''
  planning_horizons:
  # - 2025
  - 2030
  • clusters: The model outputs are organized into 39 nodes, which is the default configuration in PyPSA-Eur. Models with higher spatial resolution are currently not supported.

  • planning_horizons: The model simulates either the year 2025 or 2035.

countries#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Countries Documentation.

countries: ['AL', 'AT', 'BA', 'BE', 'BG', 'CH', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GB', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'ME', 'MK', 'NL', 'NO', 'PL', 'PT', 'RO', 'RS', 'SE', 'SI', 'SK', 'XK']

The analysis includes all of the default countries in PyPSA-Eur.

snapshots#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Snapshots Documentation.

snapshots:
  start: "2013-01-01"
  end: "2014-01-01"
  inclusive: 'left'

The baseline scenario is based on the climate year 2013.

enable#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Enable Documentation.

enable:
  retrieve: auto
  retrieve_databundle: false
  retrieve_cost_data: true
  build_cutout: false
  retrieve_cutout: false
  custom_busmap: false
  drop_leap_day: true
  procurement: true  # [true, false ] If true, model the procurement strategies
  ci_load: true

For the first run, it is recommended to set retrieve_databundle, retrieve_cost_data and retrieve_cutout as true.

electricity#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Electricity Documentation.

electricity:
  max_hours:
    li-ion battery: [8]
    vanadium: [10]
    lair: [12]
    pair: [24]
    H2: [168]
    iron-air battery: [100]

  extendable_carriers:
    StorageUnit: [] # li-ion battery, iron-air battery, H2, lfp, vanadium, lair, pair
    Store: [li-ion battery, H2]

  powerplants_filter: >
    (DateOut >= 2024 or DateOut != DateOut) and not (Country == 'DE' and Fueltype == 'Nuclear')
    and not (Country.isin(['AT', 'BE', 'DK', 'ES', 'FI', 'FR', 'GB', 'GR', 'HU', 'IE', 'IT', 'MK', 'NL', 'PT', 'RS', 'SE', 'SK'])
    and Fueltype.isin(['Hard Coal', 'Lignite']))

  transmission_limit: v1.0

  ci_load:
    load_path_1: data/CI-load.csv # path to Eurostat CI load input data (from https://ec.europa.eu/eurostat/databrowser/view/nrg_cb_e__custom_16270810/default/table?lang=en (CSV 2.0))
    load_path_2: data/CI-load-missing.xlsx # path to IEA CI load input data (from https://www.iea.org/data-and-statistics/data-product/world-energy-balances-highlights)
    load_year: 2023
    profile: "baseload" # type of load profile (e.g., "baseload", "industry", "total_daily_avg", "total")
    share: 50 # share of CI load to be moved to high voltage level (to avoid negative values when profile is not "total")

  freeze_capacity: false
  filter_TYNDP_build_year: true

Configuration changes made:

  • If the year 2030 is selected, the powerplants_filter excludes countries that have committed to phasing out coal power plants by 2030.

  • By default, Germany is set to phase out its nuclear power plants by 2025 and beyond.

  • transmission_limit is set to v1.0, meaning no transmission line expansions are allowed beyond those specified in transmission_projects.

New configuration options introduced in this repository:

  • ci_load: Settings for generating non-procuring CI loads and buses.

Note

The CI load should be already modelled in the baseline scenarios so to have a fair comparison with the procurement scenarios. If enable/ci_load is set to true, the CI load is generated through the add_ci_load function in the add_procurement.py script. The CI load is modelled as follows:

  • The CI annual electricity consumption of the 34 countries involved in the analysis is pulled from dedicated files in the data/ repository. In particular, for most of the countries data are taken from Eurostat (i.e., load_path_1). Instead, for Switzerland and United Kingdom, data are taken from IEA (i.e., load_path_2).

  • The reference year for energy consumption data is set through load_year.

  • The CI share over the annual electricity consumption is computed and applied to the PyPSA-Eur load time series:

    • profile: Setting for a certain daily profile to move from energy to load time series. A flat profile (i.e, baseload) is used by default, since it is considered among the most appropriate when dealing with CI loads.

    • share: Setting for a certain share of the CI load to be moved to high-voltage dedicated buses. This is used to avoid potential negative loads during some snapshots. For instance, consider the load DE0 0, which is connected to the low-voltage bus DE0 0 low voltage. The corresponding CI load would be a portion of DE0 0, that is called DE0 0 CI load and is connected to the dedicated high-voltage bus DE0 0 CI. Also, dedicated import and export links are modelled to connect the DE0 0 low voltage and DE0 0 CI buses.

  • freeze_capacity: Option to prevent the expansion of renewable energy technologies (not in use).

  • filter_TYNDP_build_year: Option to exclude TYNDP network components scheduled for construction after 2025 or 2030.

transmission_projects#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Transmission Projects Documentation.

transmission_projects:
  include:
    nep: false
  new_link_capacity: keep #keep or zero

Configuration changes made:

sector#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Sector Documentation.

sector:
  transport: false
  heating: false
  biomass: false
  ammonia: false
  # methanol: false
  industry: false
  shipping: false
  aviation: false
  agriculture: false
  dac: false
  H2_network: false
  co2_network: false
  allam_cycle_gas: false
  imports:
    enable: false
  gas_distribution_grid: false
  cluster_heat_buses: false

All sector-related configurations are disabled to model an electricity-only system.

costs#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Costs Documentation.

costs:
  year: 2030
  version: v0.10.1

  overwrites:
    fuel:
      OCGT: 31.98 # https://tradingeconomics.com/commodity/eu-natural-gas
      CCGT: 31.98
      gas: 31.98
      coal: 10.08 # https://www.tradingview.com/symbols/ICEEUR-ATW1!/ 1 USD = 0.88 EUR
      lignite: 22.11 # https://www.tradingview.com/symbols/ICEEUR-ATW1!/ 1 USD = 0.88 EUR, lignite ≈ 1/3 hard coal
    efficiency:
      Compressed-Air-Adiabatic-bicharger: 0.7745
    investment:
      iron-air battery: 21710  # in EUR/MWh (2020) from 23,500 EUR/MWh (2024)
      Compressed-Air-Adiabatic-store: 28835  # in EUR/MWh (2020) from 30,000 EUR/MWh (2022)
      Compressed-Air-Adiabatic-bicharger: 1658016  # in EUR/MW (2020) from 1,725,000 EUR/MW (2022)
    lifetime:
      Compressed-Air-Adiabatic-store: 40  # years
      Compressed-Air-Adiabatic-bicharger: 40  # years
  marginal_cost:
    solar: 0.01
    onwind: 0.015
    offwind: 0.015
    hydro: 0.
    H2: 0.
    electrolysis: 0.
    fuel cell: 0.
    li-ion battery: 0.
    battery inverter: 0.
  capital_cost:
    geothermal: 10000
  emission_prices:
    enable: false
    co2: 64.85
    co2_monthly_prices: false

Configuration changes made:

This configuration is relevant if those storage technologies are included in the model:

  • Iron-air battery price is set at 23,500 EUR/MWh (2024).

  • Storage energy cost for CAES is set at 30,000 EUR/MWh (2022).

  • Storage power cost for CAES is set at 1,725,000 EUR/MW (2022).

  • The lifetime of CAES is reduced to 40 years.

clustering#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Clustering Documentation.

clustering:
  temporal:
    resolution_sector: 1H

The temporal resolution is clustered to a 3H resolution by default, will change depending on the scenarios.

adjustments#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Plotting Documentation.

adjustments:
  sector:
    absolute:
      links:
        DC:
          marginal_cost: 0.5
        electricity distribution grid:
          marginal_cost: 0.5
  procurement:
    absolute:
      storage_units:
        li-ion battery 8h:
          marginal_cost: 0.5

Configuration changes made:

  • The marginal costs are set to 0.5 EUR/MWh to avoid unintended storage cycling phenomena. For more details on such phenomena, refer to this paper.

solving#

For a comprehensive explanation, refer to the upstream PyPSA-Eur Solving Documentation.

solving:
  mem_mb: 300000 #50 GB is enough for vol-match 1 country, 150 GB is needed for multiple countries
  runtime: 24h #runtime in humanfriendly style https://humanfriendly.readthedocs.io/en/latest/

Note

As noted in the Installation section, there are several solvers compatible with PyPSA. Please choose the ones that are available to you.

Each solver has a solver-specific parameter settings (options) to chose from:

  • gurobi: gurobi-default, gurobi-numeric-focus, gurobi-fallback

  • highs: highs-default

  • cplex: cplex-default

  • copt: copt-default, copt-gpu

  • cbc: cbc-default

  • glpk: glpk-default