Base Configuration#

This is the base configuration outline used in the analysis “The Role of Energy Storage in Germany”. 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.form.yaml

  2. config.form.yaml (this section)

  3. config.default.yaml

  4. config.kpi.yaml

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

run#

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

run:
  prefix: "scenarios"
  name: "baseline-mds"
  scenarios:
    enable: true
    file: config/scenarios.form.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.form.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:
  ll:
  - v1.11  # v1.x with x according to additional NEP links (existing_capacities=zero)
  clusters:
  - 52
  planning_horizons:
  - 2035
  • ll: v1.11 indicates that the existing transmission network capacity can be increased by 11%.

  • clusters: The model results are grouped into 52 nodes; see the clustering section for the disaggregation list.

  • planning_horizons: The model is simulating the year 2035.

countries#

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

countries: ['AT', 'BE', 'CH', 'CZ', 'DE', 'DK', 'FR', 'IT', 'LU', 'NL', 'PL', 'SE']

The analysis includes Germany and its grid neighboring countries, along with Italy. The complete list:

  • AT: Austria

  • BE: Belgium

  • CH: Switzerland

  • CZ: Czech Republic

  • DE: Germany

  • DK: Denmark

  • FR: France

  • IT: Italy

  • LU: Luxembourg

  • NL: Netherlands

  • PL: Poland

  • SE: Sweden

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, with the snapshots adjusted in each scenarios accordingly.

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
  final_adjustment: true

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

co2 budget#

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

co2_budget:
  2035: 0.107 # derived from individual countries carbon emission targets for included sectors excluding domestic transport emissions from scope

The CO2 budget is derived from individual countries carbon emission targets for included sectors excluding fossil fuel domestic transport emissions from scope This means that the total budget is 315.4 MtCO2, equivalent to 10.7% of 1990 emissions for this scope. The complete calculation can be seen in the Carbon Emission Calculation section.

electricity#

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

electricity:
  max_hours:
    li-ion battery: [1, 2, 4, 8]
    vanadium: [10]
    lair: [12]
    pair: [24]
    H2: [168]
    iron-air battery: [100]
  extendable_carriers:
    Generator: [solar, solar-hsat, onwind, offwind-ac, offwind-dc, offwind-float]
  powerplants_filter: DateOut >= 2024 and not Fueltype.isin(['Nuclear', 'Hard Coal', 'Lignite'])
  custom_powerplants: DateIn <= 2024 and DateOut >= 2024

Configuration changes made:

  • Lithium-ion are disaggregated into 1h, 2h, 4h and 8h for a more detail analysis.

  • Iron-air batteries have a maximum storage duration (max hours) of 100 hours

  • Nuclear, Hard Coal, and Lignite power plants are excluded from the powerplantmatching database.

  • Instead, we use a validated dataset of power plants from data/custom_powerplants.csv where German nuclear, coal and lignite power plants are phased out for 2035.

atlite#

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

Define and specify the atlite.Cutout used for calculating renewable potentials and time-series. All options except for features are directly used as cutout parameters.

atlite:
  # TODO: weather year - input from FORM
  default_cutout: europe-2013-sarah3-era5
  nprocesses: 4
  show_progress: false
  cutouts:
    # use 'base' to determine geographical bounds and time span from config
    # base:
      # module: era5
    europe-2013-sarah3-era5:
      module: [sarah, era5] # in priority order
      x: [-12., 42.]
      y: [33., 72.]
      dx: 0.3
      dy: 0.3
      time: ['2013', '2013']

The default_cutout is derived for 2013 from SARAH-3 weather data, with missing values filled in using ERA-5 weather data.

renewable#

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

renewable:
  hydro:
    PHS_max_hours: 10

The maximum storage duration for pumped hydro storages are set to 10h, instead of the default 6h.

conventional#

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

conventional:
  unit_commitment: false
  dynamic_fuel_price: false
  nuclear:
    p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name
    p_min_pu: 0.5
    

The minimum energy dispatch for nuclear power plants is set to 50%.

lines#

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

lines:
  s_max_pu: 0.5
  dynamic_line_rating:
    activate: false
    cutout: europe-2013-sarah3-era5
    correction_factor: 0.95
    max_voltage_difference: 30 # Glaum & Hofmann, 2022 https://arxiv.org/abs/2208.04716
    max_line_rating: 1.5 # based on https://www.energysystem2050.net/content/TransnetBW-Study_EnergySystem2050.pdf?v2, p.81

The maximum line capacity is set to 50% of its total capacity, rather than 70%, to better approximate security and reserve capacity for reactive power flows given the clustered spatial resolution of the model.

transmission_projects#

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

transmission_projects:
  enable: true
  include:
    tyndp2020: false
    nep: true
    manual: false
  skip:
  - upgraded_lines
  - upgraded_links
  status:
  - under_construction
  - in_permitting
  - confirmed
    #- planned_not_yet_permitted
    #- under_consideration
  new_link_capacity: zero #keep or zero

Configuration changes made:

  • The Ten Year Network Development Plan (TYNDP) 2020 transmission plan has been excluded from the model.

  • The Netzentwicklungsplan (NEP) of Germany has been included in the model.

  • Only transmission projects that are under construction, in permitting, or confirmed are included.

Since the focus is on Germany, a conservative assumption is made regarding transmission projects, specifically by selecting only those that are most likely to be realized. This is why the NEP is preferred over the TYNDP.

existing_capacities#

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

existing_capacities:
  grouping_years_power: [1920, 1950, 1955, 1960, 1965, 1970, 1975, 1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2020, 2025]
  grouping_years_heat: [1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015, 2019] # heat grouping years >= baseyear will be ignored
  threshold_capacity: 10
  default_heating_lifetime: 20
  conventional_carriers:
  - lignite
  - coal
  - oil
  - uranium

The content is kept identical to the default configuration file.

sector#

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

sector:
  transport: true
  heating: true
  biomass: false
  industry: false
  agriculture: false
  fossil_fuels: true
  district_heating:
    potential: 0.3
    progress:
      2035: 0.45
  bev_dsm: true
  bev_dsm_availability: 0.2 # FE input
  bev_charge_rate: 0.007  # FE input
  v2g: true
  land_transport_fuel_cell_share:
    2035: 0
  land_transport_electric_share:
    2035: 0.30 # FE input
  land_transport_ice_share:
    2035: 0 # only include electric transport
  include_transport_emissions: false
  reduce_space_heat_exogenously: true
  reduce_space_heat_exogenously_factor:
    2035: 0.21
  tes: false
  dac: true
  dac_limit:
      enable: true
      2035: 12.4  # limit in MtCO2
  methanation: false
  co2_sequestration_potential:
    2035: 22.3
  marginal_cost_storage: 0. #1e-4
  stores: ["H2"]
  storage_units: ["li-ion battery", "vanadium", "lair", "pair", "iron-air battery"]
  residential_heat_dsm: true
  residential_heat_restriction_value: 0.27
  residential_heat_restriction_time: [ 10, 22 ] # 9am and 9pm
  hydrogen_fuel_cell: true
  hydrogen_turbine: false
  hydrogen_underground_storage: true
  hydrogen_underground_storage_locations:
    # - onshore  # more than 50 km from sea
  - nearshore    # within 50 km of sea
    # - offshore
  H2_network: false
  gas_network: false
  H2_retrofit: false
  chp_extendable_DE: true # in final adjustment

Configuration changes made:

  • This analysis includes the power, heating and electric transport sector.

  • This analysis excludes the biomass, agriculture, industry, and fossil transport sector.

  • The availability of battery electric vehicles (BEV) for demand-side management is reduced from 50% to 20%.

  • The charging rate for BEVs is reduced from 11 kW to 7 kW.

  • The predicted share of land electric vehicles is reduced from 45% to 30% by 2035.

  • Land transport emissions are excluded from the model, as they are determined exogenously.

  • The reduction in space heating demand is increased from 11% to 21% by 2035 to adjust for the geographical scope of the model.

  • Li-ion batteries, vanadium, liquid air, CAES, and Iron-air batteries are defined as storage unit components rather than stores.

  • The hydrogen network is excluded from the model as to the limited scope of H2 in the rest of the model and as a trade-off with model complexity, particularly in terms of computational time.

load#

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

load:
  scaling_factor: 1.26  # electricity load increase PyPSA 2013 to 2035 (https://www.agora-energiewende.de/fileadmin/Projekte/2021/2021_11_DE_KNStrom2035/2022-06-23_Praesentation_Klimaneutrales_Stromsystem_2035.pdf)

The model’s electricity load is based on data from 2013. By 2035, electricity demand is projected to increase by 26% compared to 2013 (Source from Agora Energiewende).

costs#

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

costs:
  year: 2035
  version: 67a5830
  social_discountrate: 0.02
  fill_values:
    FOM: 0
    VOM: 0
    efficiency: 1
    fuel: 0
    investment: 0
    lifetime: 25
    "CO2 intensity": 0
    "discount rate": 0.07
  # Marginal and capital costs can be overwritten
  # capital_cost:
  #   onwind: 500
  fuel:
    OCGT: 38.84 # https://eur-lex.europa.eu/legal-content/EN/TXT/PDF/?uri=CELEX:52022SC0230 (Annex)
    CCGT: 38.84
    gas: 38.84
    coal: 24.57 # https://businessanalytiq.com/procurementanalytics/index/subbituminous-coal-price-index/
    lignite: 22.11 # https://businessanalytiq.com/procurementanalytics/index/lignite-coal-price-index/
    nuclear: 1.75 # https://markets.businessinsider.com/commodities/uranium-price
    uranium: 1.75
  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.
  emission_prices:
    enable: false
    co2: 0.
    co2_monthly_prices: false

Configuration changes made:

clustering#

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

clustering:
  focus_weights:
    DE: 0.6
  temporal:
    resolution_sector: 4380SEG

Germany has a focus weight of 0.6, which means that out of 52 nodes, the distribution is as follows:

  • Germany: 31 nodes

  • France: 6 nodes

  • Italy: 5 nodes

  • Denmark: 2 nodes

The following countries each have 1 node, contributing to a total of 9 nodes:

  • Austria

  • Belgium

  • Switzerland

  • Czech Republic

  • Luxembourg

  • Netherlands

  • Poland

  • Sweden

The temporal resolution is segmented into 4380 snapshots, equivalent to an average temporal clustering of 2 hourly resolution.

Note

High segmentation temporal resolution such as 4380SEG has shown to yield similar results to 1 hourly temporal resolution, while providing a good compromise in terms of computational cost. See Segmentation Temporal Clustering for more details

solving#

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

solving:
  mem_mb: 150000 #memory in MB; 20 GB enough for 50+B+I+H2; 100 GB for 181+B+I+H2
  runtime: 24h #runtime in humanfriendly style https://humanfriendly.readthedocs.io/en/latest/

  solver:
    name: gurobi
    options: gurobi-default

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

plotting#

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

plotting:
  time_series:
    start_date: '2013-05-01'
    end_date: '2013-06-01'
  costs_max: 40
  costs_threshold: 0.01
  tech_colors:
    # all battery variation:
    lfp: '#ace37f'
    vanadium: '#9B111E'
    Vanadium Redox Flow battery storage: '#9B111E'
    Vanadium-Redox Battery Storage: '#9B111E'
    lair: '#87CEEB'
    Liquid Air energy storage: '#87CEEB'
    Liquid Air Energy Storage: '#87CEEB'
    pair: '#003366'
    Adiabatic CAES: '#edba1c'
    iron-air battery: '#1c404c'
    Iron-Air battery storage: '#1c404c'
    Iron-Air Battery Storage: '#1c404c'
    Li-Ion battery storage: '#ace37f'
    li-ion battery 1h: '#445A32'
    li-ion battery 2h: '#67884C'
    li-ion battery 4h: '#89B565'
    li-ion battery 8h: '#ace37f'
    Li-Ion Battery Storage 1h: '#445A32'
    Li-Ion Battery Storage 2h: '#67884C'
    Li-Ion Battery Storage 4h: '#89B565'
    Li-Ion Battery Storage 8h: '#ace37f'
    Li-Ion Battery Storage: '#ace37f'
    other battery storage: '#80c944'
  storage_map_cmaps:
    iron-air battery: "Greys"
    li-ion battery: "Greens"
    lair: "Oranges"
    pair: "YlOrBr"
    vanadium: "Reds"
    H2: "Purples"
    PHS: "Blues"

Compared to the default configuration, the coloring scheme has been customized to the scope of this study.