Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
9920a9f
fix: compatibility of build_gas_* rules with pyogrio >=0.12.0 (#1955)
coroa Jan 6, 2026
c8870c5
[pre-commit.ci] pre-commit autoupdate (#1954)
pre-commit-ci[bot] Jan 6, 2026
0d76b18
doc: fix PR template hyperlink (#1957)
tgilon Jan 7, 2026
9e631e0
fix: add pydeck lower version bound that was missing from pypsa <1.0.…
coroa Jan 7, 2026
347fd27
fix: fix compatibility with numpy >=2 (#1958)
coroa Jan 12, 2026
fbeb4d8
fix: Version controlled data layer (#1963)
euronion Jan 12, 2026
ab01bff
[github-actions.ci] Update locked envs (#1953)
github-actions[bot] Jan 14, 2026
09fed80
Bugfix pypsa eur as snakemake module (#1967)
jonathan-peel Jan 14, 2026
006d74e
doc: Correct section indent for data inventory (#1973)
euronion Jan 14, 2026
8b06487
Config Validation with Pydantic (#1912)
lkstrp Jan 15, 2026
cd00bb3
Update lock file workflow to remove push trigger (#1975)
lkstrp Jan 15, 2026
857c76b
chore: fix formatting and improve consistency in data layer doc (#1977)
tgilon Jan 15, 2026
8608d15
follow up on #1977 (#1980)
lkstrp Jan 15, 2026
6b0bdd5
Fix atlite cutouts default value (#1979)
bobbyxng Jan 15, 2026
1c7617e
Revert "Update lock file workflow to remove push trigger (#1975)" (#1…
lkstrp Jan 16, 2026
04d35de
Add user friendly messages to snakemake workflow (#1846)
willu47 Jan 16, 2026
a81e100
process eurostat energy balances via API
fneum Jan 18, 2026
46c01e8
Revert "process eurostat energy balances via API"
fneum Jan 18, 2026
2b76489
fix: avoid netcdf4 version 1.7.4 (#1988)
FabianHofmann Jan 19, 2026
dcc3c00
Update locked environment files for all platforms (#1983)
github-actions[bot] Jan 19, 2026
1e3e24b
Updated technology-data to v0.13.4. (#1985)
bobbyxng Jan 20, 2026
3c43925
Fix mock snakemake for Snakemake API changes. (#1984)
bobbyxng Jan 20, 2026
c49f04c
fix: retrieve eez data from own archive in test (#1992)
lkstrp Jan 20, 2026
21477be
Bugfix industry only (#1971)
jonathan-peel Jan 20, 2026
44f260a
Fix bug of no gas infrastructure when no CCGT: gas implemented. (#1993)
jonathan-peel Jan 21, 2026
f807031
feat: move archive from zenodo to s3 bucket (#1960)
lkstrp Jan 21, 2026
6bee929
update linopy pin (#1990)
FabianHofmann Jan 21, 2026
491ff9f
feat: remove and disallow setting credentials in config (#1989)
lkstrp Jan 21, 2026
f07ada9
Update locked environment files for all platforms (#1994)
github-actions[bot] Jan 21, 2026
18842da
fix: update costs for solar-hsat in myopic optimization; small refact…
lindnemi Jan 21, 2026
9450f99
Fix raw OSM build and release process (#1956)
brynpickering Jan 22, 2026
630d37d
feat: add electricitymaps and entsoepy bidding zone data to data laye…
daniel-rdt Jan 22, 2026
ff78022
Add Xpress solver configuration support (#2006)
brunoficoxpress Jan 24, 2026
adc14a9
fix: remove slurm dependency from windows environments (#2009)
coroa Jan 26, 2026
bca9f16
fix: follow up on added bidding zones datasets (#2007)
lkstrp Jan 26, 2026
3f04d24
Update locked environment files for all platforms (#2011)
github-actions[bot] Jan 26, 2026
88acb83
code: Fix logic for extracting WDPA and WDPA marine (#2010)
euronion Jan 26, 2026
547e8e8
Fix the WDPA links to function on Windows (#2008)
Eric-Nitschke Jan 26, 2026
c3dcdb0
Fix `min/max_shore_distance` param access in availability matrix calc…
brynpickering Jan 28, 2026
e87b0c6
chore(deps): bump prefix-dev/setup-pixi in the github-actions group (…
dependabot[bot] Jan 29, 2026
c5d57a7
Fix snakemake message for build_electricity/clean_osm_data (#2022)
bobbyxng Jan 29, 2026
7c15940
fix: fix minor bugs in the new validation schema (#2024)
tgilon Feb 2, 2026
36357be
Fix raw custom costs (#2023)
lindnemi Feb 2, 2026
945daf9
fix: add schema related files to the REUSE.toml (#2029)
tgilon Feb 2, 2026
5664e14
update GEM steel and use GEM cement plant tracker (#1830)
fneum Feb 2, 2026
594da3a
follow up on #1830 (#2031)
lkstrp Feb 3, 2026
0cca46e
update data sources for country-level electricity demand (#1828)
fneum Feb 3, 2026
ae955c1
docs: list all available archive cutouts in own weather data section …
lkstrp Feb 3, 2026
8606920
Add lfp, vanadium, lair, pair battery technologies (Form-Energy Stora…
virio-andreyana Feb 4, 2026
ac6fd17
Make corine optional (#2013)
cristobal-GC Feb 4, 2026
5bdfa0d
Add script path provider (take 2) (#1997)
brynpickering Feb 5, 2026
212c09b
chore: revivew docker image with pixi (#2041)
lkstrp Feb 5, 2026
39c12e8
chore: image follow up (#2042)
lkstrp Feb 5, 2026
6ecf9da
Remove check-merge-conflict hook (#2044)
lkstrp Feb 10, 2026
18ae47b
add powerplantmatching 0.8.0 (#2040)
fneum Feb 10, 2026
699fdb4
Improving OSM raw building process (assets under construction, start …
bobbyxng Feb 10, 2026
74f7bad
update co2 price time series (#2035)
fneum Feb 11, 2026
b46858e
fix handling of missing years in EIA stats (#2047)
fneum Feb 11, 2026
6a5489e
update and process eurostat energy balances via API (#1987)
fneum Feb 11, 2026
5352136
Update fossil fuel price time series (#2036)
fneum Feb 11, 2026
d4f4bea
Refactor meoh config (#2043)
lindnemi Feb 11, 2026
3b9e79f
Update to JRC IDEES 2023 (#1976)
fneum Feb 11, 2026
665315c
Fix unit commitment compatibility with PyPSA ≥ 1.0 component API (#2049)
danielelerede-oet Feb 11, 2026
0d3923e
add powerplantmatching 0.8.1 (#2051)
fneum Feb 12, 2026
1b95490
Follow-up improvements to OSM network building (#2052)
bobbyxng Feb 12, 2026
4172d04
switch back to 2019 energy balance year until CH fix (#2053)
fneum Feb 12, 2026
374e032
Add prebuilt OSM network v0.7 (#2054)
bobbyxng Feb 12, 2026
8584ab7
doc: fix type hints in add_electricity.py (#2060)
tgilon Feb 13, 2026
958ceaa
Add multi-circuit rendering to OSM interactive map (#2055)
bobbyxng Feb 13, 2026
1fa9a4f
update and process Swiss energy balances from SFOE source (#2057)
fneum Feb 13, 2026
0acc172
Move to using `conda-forge` for `pydeflate` (#2062)
brynpickering Feb 13, 2026
b37a778
change default energy balance year to 2023 (#2063)
fneum Feb 14, 2026
728f4f3
Make OSM building process for assets under construction more robust (…
bobbyxng Feb 14, 2026
bc645bb
add technology-data v0.14.0 (#2061)
fneum Feb 14, 2026
e106bbb
[github-actions.ci] Update locked envs (#2026)
github-actions[bot] Feb 16, 2026
7fe2f81
feat: add store_model option to save linopy model after solving (#2001)
FabianHofmann Feb 16, 2026
b90cd2a
fix powerplant to region mapping; use ppm for wind and solar (#2050)
fneum Feb 16, 2026
1b0ae32
PyPSA v1 deprecation warnings (#1903)
euronion Feb 16, 2026
696706c
make WDPA download optional even with UA/MD (#2066)
fneum Feb 16, 2026
e04ffd3
make LUISA download optional again (#2065)
fneum Feb 16, 2026
94b3a1f
update README and figures (#2067)
fneum Feb 16, 2026
79cf375
more robust implementation for solve network adding constraints only …
toniseibold Feb 16, 2026
bcfa87e
Add config schema updater & docs (#2056)
brynpickering Feb 17, 2026
5c3e094
update unit commitment parameters and fix startup cost (#2073)
fneum Feb 18, 2026
050d5a5
add name to unclustered power plants (#2069)
fneum Feb 18, 2026
9d6340c
rolling horizon: drop cyclicity and allow in solve_network (#2070)
fneum Feb 18, 2026
72d1df0
add option to add existing batteries from powerplantmatching (#2071)
fneum Feb 18, 2026
d8e2909
handle co2stop id column across versions (#2077)
fneum Feb 18, 2026
0bf228e
fix missing or outdated configuration options (#2074)
fneum Feb 18, 2026
5c80319
allow custom efficiency_classes for conventional generators (#2075)
fneum Feb 18, 2026
a465b6b
chore: pin grpcio<1.78 to silence warnings (#2080)
daniel-rdt Feb 18, 2026
3247e2a
annual nuclear energy availability factors (#2072)
fneum Feb 18, 2026
f545f18
Allow pixi post link scripts to run (#2079)
brynpickering Feb 18, 2026
7bf8ed4
Fix offshore wind potentials in Germany (#2081)
fneum Feb 18, 2026
f4ed8eb
distribute electricity demand by JRC energy atlas (#1829)
fneum Feb 18, 2026
748f878
Reverting to .pdf file ending for `plot_summary` (#2083)
bobbyxng Feb 18, 2026
67806b0
prepare release v2026.02.0 (#2084)
fneum Feb 18, 2026
2a06802
Update locked environment files for all platforms (#2082)
github-actions[bot] Feb 18, 2026
99ec2d9
ci: always run integration tests on workflow_dispatch trigger (#2085)
lkstrp Feb 18, 2026
d6383eb
[github-actions.ci] prepare release v2026.02.0
lkstrp Feb 19, 2026
e0ce3a9
update prefix
lindnemi Feb 20, 2026
bdd99cb
Merge remote-tracking branch 'upstream/master' into merge-v2026.02
lindnemi Feb 20, 2026
319732e
Squashed commit of:
lindnemi Feb 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions .github/workflows/push-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ name: Push images

on:
push:

branches:
- master
workflow_dispatch:

env:
IMAGE_NAME: pypsa/eur-dev-env
BASE_ENV: envs/linux-64.lock.yaml

jobs:
push-image:
Expand All @@ -20,9 +18,9 @@ jobs:
with:
fetch-depth: 0

- name: 'Get relevant env'
- name: 'Get last commit that changed pixi env'
run: |
hash_last_changed=$(git log -1 --pretty=format:%H -- ${{ env.BASE_ENV }})
hash_last_changed=$(git log -1 --pretty=format:%H -- pixi.toml pixi.lock)
echo "hash_last_changed=$hash_last_changed" >> $GITHUB_ENV

- name: 'Login to GitHub Container Registry'
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:
token: ${{ steps.generate-token.outputs.token }}

- name: Setup Pixi
uses: prefix-dev/setup-pixi@v0.9.3
uses: prefix-dev/setup-pixi@v0.9.4
with:
pixi-version: v0.59.0
cache: true
Expand Down
72 changes: 49 additions & 23 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Test workflows
name: Test

on:
push:
Expand All @@ -17,8 +17,30 @@ concurrency:
cancel-in-progress: true

jobs:
run-tests:
name: OS
unit-tests:
name: Unit
runs-on: ubuntu-latest

defaults:
run:
shell: bash -l {0}

steps:
- uses: actions/checkout@v6

- name: Setup Pixi
uses: prefix-dev/setup-pixi@v0.9.4
with:
pixi-version: v0.59.0
cache: true
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'master' }}

- name: Run unit tests
run: |
pixi run unit-tests

integration-tests:
name: Integration
runs-on: ${{ matrix.os }}-latest
strategy:
fail-fast: false
Expand All @@ -43,7 +65,6 @@ jobs:
- 'data/**'
- 'Snakefile'
- 'config/**'
- 'test/**'
- 'pixi.toml'
- 'pixi.lock'
- '.github/workflows/test.yaml'
Expand All @@ -58,51 +79,56 @@ jobs:
sudo docker builder prune -a --force
echo "Final disk space"
df -h

- name: Skip - no source changes
if: steps.filter.outputs.src != 'true' && github.event_name != 'schedule'
if: steps.filter.outputs.src != 'true' && github.event_name != 'schedule' && github.event_name != 'workflow_dispatch'
run: echo "Skipping tests because no source code changes detected"

- name: Setup Pixi
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
uses: prefix-dev/setup-pixi@v0.9.3
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
uses: prefix-dev/setup-pixi@v0.9.4
with:
pixi-version: v0.59.0
cache: true
# Do not cache in branches
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'main' }}
cache-write: ${{ github.event_name == 'push' && github.ref_name == 'master' }}

- name: Setup cache keys
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
run: |
echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV # data and cutouts
echo "WEEK=$(date +'%Y%U')" >> $GITHUB_ENV # data
echo "MONTH=$(date +'%Y%m')" >> $GITHUB_ENV # cutouts
echo "VERSIONS_HASH=${{ hashFiles('data/versions.csv') }}" >> $GITHUB_ENV

- uses: actions/cache@v5
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
with:
path: |
data
cutouts
key: data-cutouts-${{ env.WEEK }}
path: data
key: data-${{ env.WEEK }}-${{ env.VERSIONS_HASH }}

- uses: actions/cache@v5
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
with:
path: cutouts
key: cutouts-${{ env.MONTH }}

- name: Restore git-tracked files in data/
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
run: git checkout HEAD -- data/

- name: Run pylint check on scripts
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
# check for undefined variables to reuse functions across scripts
run: |
pixi run pylint --disable=all --enable=E0601,E0606 --output-format=parseable scripts/add_* scripts/prepare_* scripts/solve_*

- name: Run snakemake test workflows
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
env:
SNAKEMAKE_STORAGE_CACHED_HTTP_CACHE: ""
SNAKEMAKE_STORAGE_CACHED_HTTP_SKIP_REMOTE_CHECKS: "1"
run: |
pixi run integration-tests

- name: Run unit tests
if: steps.filter.outputs.src == 'true' || github.event_name == 'schedule'
run: |
pixi run unit-tests

- name: Upload artifacts
if: always()
uses: actions/upload-artifact@v6
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/update-lockfile.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
- uses: actions/checkout@v6

- name: Setup Pixi
uses: prefix-dev/setup-pixi@v0.9.3
uses: prefix-dev/setup-pixi@v0.9.4
with:
pixi-version: v0.59.0

Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ gurobi.log
/cutouts
/tmp
doc/_build
_build

/scripts/old
/scripts/create_scenarios.py
Expand Down Expand Up @@ -65,6 +66,8 @@ d1gam3xoknrgr2.cloudfront.net/

*~

*.egg-info

*.pyc

*.xlsx
Expand Down
5 changes: 4 additions & 1 deletion .pixi/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@
# SPDX-License-Identifier: CC0-1.0

pinning-strategy = "latest-up"
run-post-link-scripts = "false" # set to "insecure" to allow running post-link scripts

# This aligns with default `conda` behaviour.
# Set to "false" to stop post-link scripts from running.
run-post-link-scripts = "insecure"
6 changes: 2 additions & 4 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
# SPDX-FileCopyrightText: Contributors to PyPSA-Eur <https://github.com/pypsa/pypsa-eur>
#
# SPDX-License-Identifier: CC0-1.0

exclude: "^LICENSES"
exclude: "^LICENSES|^config/schema\\.json$|^config/config\\.default\\.yaml$"

ci:
autoupdate_schedule: quarterly
Expand All @@ -11,7 +10,6 @@ repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v6.0.0
hooks:
- id: check-merge-conflict
- id: check-added-large-files
args: ["--maxkb=2000"]

Expand All @@ -31,7 +29,7 @@ repos:
rev: v2.4.1
hooks:
- id: codespell
args: ['--ignore-regex="(\b[A-Z]+\b)"', '--ignore-words-list=fom,appartment,bage,ore,setis,tabacco,berfore,vor,pris,bund,GuD,Dezember,Juni,Juli,Produktion,WorstCase'] # Ignore capital case words, e.g. country codes
args: ['--ignore-regex="(\b[A-Z]+\b)"', '--ignore-words-list=fom,appartment,bage,ore,setis,tabacco,berfore,vor,pris,bund,ons,GuD,Dezember,Juni,Juli,Produktion,WorstCase'] # Ignore capital case words, e.g. country codes
types_or: [python, rst, markdown]
files: ^(scripts|doc)/

Expand Down
2 changes: 1 addition & 1 deletion CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ preferred-citation:
references:
- title: "PyPSA-Eur: An open sector-coupled optimisation model of the European energy system"
repository: https://github.com/pypsa/pypsa-eur
version: v2025.07.0
version: v2026.02.0
license: MIT
authors:
- family-names: Brown
Expand Down
95 changes: 44 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,11 @@ SPDX-License-Identifier: CC-BY-4.0
# PyPSA-Eur: A Sector-Coupled Open Optimisation Model of the European Energy System

PyPSA-Eur is an open model dataset of the European energy system at the
transmission network level that covers the full ENTSO-E area. The model is suitable both for operational studies and generation and transmission expansion planning studies.
The continental scope and highly resolved spatial scale enables a proper description of the long-range
smoothing effects for renewable power generation and their varying resource availability.
transmission network level that covers the full ENTSO-E area and all energy sectors, including transport, heating, biomass, industry, and agriculture.
Besides the power grid, pipeline networks for gas, hydrogen, carbon dioxide, and liquid fuels are included.
The model is suitable both for planning studies and operational studies.
The model is built from open data using a Snakemake workflow and fully open source.
It is designed to be imported into the open-source energy system modelling framework [PyPSA](www.pypsa.org).

The model is described in the [documentation](https://pypsa-eur.readthedocs.io)
and in the paper
Expand All @@ -144,64 +146,55 @@ The model is designed to be imported into the open toolbox
> Institute of Technology](http://www.kit.edu/english/index.php) funded by the
> [Helmholtz Association](https://www.helmholtz.de/en/).

> [!WARNING]
> PyPSA-Eur is under active development and has several
> [limitations](https://pypsa-eur.readthedocs.io/en/latest/limitations.html) which
> you should understand before using the model. The github repository
> [issues](https://github.com/PyPSA/pypsa-eur/issues) collect known topics we are
> working on (please feel free to help or make suggestions). The
> [documentation](https://pypsa-eur.readthedocs.io/) remains somewhat patchy. You
> can find showcases of the model's capabilities in the Joule paper [The potential
> role of a hydrogen network in
> Europe](https://doi.org/10.1016/j.joule.2023.06.016), another [paper in Joule
> with a description of the industry
> sector](https://doi.org/10.1016/j.joule.2022.04.016), or in [a 2021 presentation
> at EMP-E](https://nworbmot.org/energy/brown-empe.pdf). We do not recommend to
> use the full resolution network model for simulations. At high granularity the
> assignment of loads and generators to the nearest network node may not be a
> correct assumption, depending on the topology of the underlying distribution
> grid, and local grid bottlenecks may cause unrealistic load-shedding or
> generator curtailment. We recommend to cluster the network to a couple of
> hundred nodes to remove these local inconsistencies. See the discussion in
> Section 3.4 "Model validation" of the paper.

![PyPSA-Eur Grid Model](doc/img/elec.png)

The dataset consists of:

- A grid model based on a modified [GridKit](https://github.com/bdw/GridKit)
extraction of the [ENTSO-E Transmission System
Map](https://www.entsoe.eu/data/map/). The grid model contains 7072 lines
(alternating current lines at and above 220kV voltage level and all high
voltage direct current lines) and 3803 substations.

Among many other things, the dataset consists of:

- A power grid model based on [OpenStreetMap](https://zenodo.org/records/18619025) for voltage levels above 220kV (optional above 60kV).
- The open power plant database
[powerplantmatching](https://github.com/PyPSA/powerplantmatching).
- Electrical demand time series from the
[OPSD project](https://open-power-system-data.org/).
- Renewable time series based on ERA5 and SARAH, assembled using the [atlite tool](https://github.com/PyPSA/atlite).
- Geographical potentials for wind and solar generators based on land use (CORINE) and excluding nature reserves (Natura2000) are computed with the [atlite library](https://github.com/PyPSA/atlite).
- Electrical demand time series from the [ENTSO-E Transparency Platform](https://transparency.entsoe.eu/).
- Renewable time series based on ERA5 and SARAH-3, assembled using [atlite](https://github.com/PyPSA/atlite).
- Geographical potentials for wind and solar generators based land eligibility analysis in [atlite](https://github.com/PyPSA/atlite).
- Energy balances compiled from Eurostat and JRC-IDEES datasets.

The high-voltage grid and the power plant fleet are shown in this map of the unclustered model (as of 1 January 2026):

A sector-coupled extension adds demand
and supply for the following sectors: transport, space and water
heating, biomass, industry and industrial feedstocks, agriculture,
forestry and fishing. This completes the energy system and includes
all greenhouse gas emitters except waste management and land use.
![PyPSA-Eur Unclustered](doc/img/base.png)


For computational reasons the model is usually clustered down
to 50-250 nodes. The image below shows the electricity network and power plants clustered to NUTS2 regions:

![network diagram](doc/img/elec.png)

This diagram gives an overview of the sectors and the links between
them:
them within each model region:

![sector diagram](doc/img/multisector_figure.png)

Each of these sectors is built up on the transmission network nodes
from [PyPSA-Eur](https://github.com/PyPSA/pypsa-eur):

![network diagram](https://github.com/PyPSA/pypsa-eur/blob/master/doc/img/base.png?raw=true)

For computational reasons the model is usually clustered down
to 50-200 nodes.

Already-built versions of the model can be found in the accompanying [Zenodo
repository](https://doi.org/10.5281/zenodo.3601881).
# Warnings

PyPSA-Eur is under active development and has several
[limitations](https://pypsa-eur.readthedocs.io/en/latest/limitations.html) which
you should understand before using the model. The github repository
[issues](https://github.com/PyPSA/pypsa-eur/issues) collect known topics we are
working on (please feel free to help or make suggestions). The
[documentation](https://pypsa-eur.readthedocs.io/) remains somewhat patchy. You
can find showcases of the model's capabilities in the Joule paper [The potential
role of a hydrogen network in
Europe](https://doi.org/10.1016/j.joule.2023.06.016), another [paper in Joule
with a description of the industry
sector](https://doi.org/10.1016/j.joule.2022.04.016), or in [a 2021 presentation
at EMP-E](https://nworbmot.org/energy/brown-empe.pdf). We do not recommend to
use the full resolution network model for simulations. At high granularity the
assignment of loads and generators to the nearest network node may not be a
correct assumption, depending on the topology of the underlying distribution
grid, and local grid bottlenecks may cause unrealistic load-shedding or
generator curtailment. We recommend to cluster the network to a couple of
hundred nodes to remove these local inconsistencies. See the discussion in
Section 3.4 "Model validation" of the paper.

# Contributing and Support

Expand Down
6 changes: 3 additions & 3 deletions REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ SPDX-PackageDownloadLocation = "https://github.com/pypsa/pypsa-eur"

[[annotations]]
path = [
"doc/configtables/*",
"doc/data_inventory.csv",
"doc/img/*",
"test/test_data/*",
Expand All @@ -20,7 +19,9 @@ path = [
"pixi.lock",
"matplotlibrc",
"envs/*.pin.txt",
"envs/environment.yaml"
"envs/environment.yaml",
"config/config.default.yaml",
"config/schema.default.json"
]
SPDX-FileCopyrightText = "The PyPSA-Eur Authors"
SPDX-License-Identifier = "CC0-1.0"
Expand All @@ -41,7 +42,6 @@ path = [
"data/parameter_corrections.yaml",
"data/retro/window_assumptions.csv",
"data/retro/retro_cost_germany.csv",
"data/switzerland-new_format-all_years.csv",
"data/transmission_projects/**",
"data/unit_commitment.csv",
"data/versions.csv",
Expand Down
Loading