From ad5c561f7879f7e073ecd7f4b3f6d0470c92295b Mon Sep 17 00:00:00 2001 From: Lukas Trippe Date: Fri, 29 Nov 2024 16:40:47 +0100 Subject: [PATCH 01/11] pin `snakemake-minimal<8.25` (#1440) * pin `snakemake-minimal=8.25.3` * Update environment.yaml * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- envs/environment.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/envs/environment.yaml b/envs/environment.yaml index da1cc5685..e52cf4348 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -21,7 +21,7 @@ dependencies: - xlrd - openpyxl - seaborn -- snakemake-minimal>=8.14 +- snakemake-minimal<8.25 # See https://github.com/snakemake/snakemake/issues/3202 - memory_profiler - yaml - pytables From 912d9e6623912fd57f032b89bac7763dad296208 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 17:09:54 +0100 Subject: [PATCH 02/11] [github-actions.ci] Update pinned envs (#1441) * Update pinned environment files for all platforms * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: lkstrp <62255395+lkstrp@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- envs/linux-pinned.yaml | 52 +++++++++++++++++----------------- envs/macos-pinned.yaml | 54 ++++++++++++++++++------------------ envs/windows-pinned.yaml | 60 +++++++++++++++++++++++----------------- 3 files changed, 87 insertions(+), 79 deletions(-) diff --git a/envs/linux-pinned.yaml b/envs/linux-pinned.yaml index 3b4feba08..869915826 100644 --- a/envs/linux-pinned.yaml +++ b/envs/linux-pinned.yaml @@ -30,10 +30,10 @@ dependencies: - aws-c-http=0.9.1 - aws-c-io=0.15.2 - aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.1 +- aws-c-s3=0.7.2 - aws-c-sdkutils=0.2.1 - aws-checksums=0.2.2 -- aws-crt-cpp=0.29.5 +- aws-crt-cpp=0.29.6 - aws-sdk-cpp=1.11.449 - azure-core-cpp=1.14.0 - azure-identity-cpp=1.10.0 @@ -50,13 +50,12 @@ dependencies: - brotli-python=1.1.0 - bzip2=1.0.8 - c-ares=1.34.3 -- c-blosc2=2.15.1 +- c-blosc2=2.15.2 - ca-certificates=2024.8.30 -- cads-api-client=1.5.4 - cairo=1.18.0 - capnproto=1.0.2 - cartopy=0.24.0 -- cdsapi=0.7.4 +- cdsapi=0.7.5 - certifi=2024.8.30 - cffi=1.17.1 - cfgv=3.3.1 @@ -86,6 +85,7 @@ dependencies: - dask=2024.11.2 - dask-core=2024.11.2 - dask-expr=1.1.19 +- datapi=0.1.1 - datrie=0.8.2 - dav1d=1.2.1 - dbus=1.13.6 @@ -147,7 +147,7 @@ dependencies: - humanfriendly=10.0 - hyperframe=6.0.1 - icu=75.1 -- identify=2.6.2 +- identify=2.6.3 - idna=3.10 - immutables=0.21 - importlib-metadata=8.5.0 @@ -172,11 +172,11 @@ dependencies: - lerc=4.0.0 - libabseil=20240722.0 - libaec=1.1.3 -- libarchive=3.7.4 -- libarrow=18.0.0 -- libarrow-acero=18.0.0 -- libarrow-dataset=18.0.0 -- libarrow-substrait=18.0.0 +- libarchive=3.7.7 +- libarrow=18.1.0 +- libarrow-acero=18.1.0 +- libarrow-dataset=18.1.0 +- libarrow-substrait=18.1.0 - libavif16=1.1.1 - libblas=3.9.0 - libbrotlicommon=1.1.0 @@ -239,7 +239,7 @@ dependencies: - libntlm=1.4 - libopenblas=0.3.28 - libopengl=1.7.0 -- libparquet=18.0.0 +- libparquet=18.1.0 - libpciaccess=0.18 - libpng=1.6.44 - libpq=17.2 @@ -296,10 +296,10 @@ dependencies: - nomkl=1.0 - nspr=4.36 - nss=3.107 -- numexpr=2.10.1 +- numexpr=2.10.2 - numpy=1.26.4 - openjpeg=2.5.2 -- openldap=2.6.8 +- openldap=2.6.9 - openpyxl=3.1.5 - openssl=3.4.0 - orc=2.0.3 @@ -319,7 +319,7 @@ dependencies: - plac=1.4.3 - platformdirs=4.3.6 - pluggy=1.5.0 -- polars=1.14.0 +- polars=1.15.0 - poppler=24.08.0 - poppler-data=0.4.12 - postgresql=17.2 @@ -334,15 +334,15 @@ dependencies: - pulp=2.8.0 - pure_eval=0.2.3 - py-cpuinfo=9.0.0 -- pyarrow=18.0.0 -- pyarrow-core=18.0.0 +- pyarrow=18.1.0 +- pyarrow-core=18.1.0 - pycountry=24.6.1 - pycparser=2.22 - pygments=2.18.0 - pyogrio=0.10.0 - pyparsing=3.2.0 - pyproj=3.7.0 -- pypsa=0.31.1 +- pypsa=0.31.2 - pyscipopt=5.2.1 - pyshp=2.3.1 - pyside6=6.8.0.2 @@ -351,9 +351,9 @@ dependencies: - pytest=8.3.3 - python=3.12.7 - python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.20.0 +- python-fastjsonschema=2.21.0 - python-tzdata=2024.2 -- python-utils=3.9.0 +- python-utils=3.9.1 - python_abi=3.12 - pytz=2024.1 - pyxlsb=1.0.10 @@ -384,7 +384,7 @@ dependencies: - snakemake-interface-executor-plugins=9.3.2 - snakemake-interface-report-plugins=1.1.0 - snakemake-interface-storage-plugins=3.3.0 -- snakemake-minimal=8.25.3 +- snakemake-minimal=8.24.1 - snappy=1.2.1 - snuggs=1.4.7 - sortedcontainers=2.4.0 @@ -403,8 +403,8 @@ dependencies: - tk=8.6.13 - tomli=2.1.0 - toolz=1.0.0 -- tornado=6.4.1 -- tqdm=4.67.0 +- tornado=6.4.2 +- tqdm=4.67.1 - traitlets=5.14.3 - typing-extensions=4.12.2 - typing_extensions=4.12.2 @@ -417,13 +417,13 @@ dependencies: - uriparser=0.9.8 - urllib3=2.2.3 - validators=0.34.0 -- virtualenv=20.27.1 +- virtualenv=20.28.0 - wayland=1.23.1 - wcwidth=0.2.13 - wheel=0.45.1 -- wrapt=1.16.0 +- wrapt=1.17.0 - x265=3.5 -- xarray=2024.10.0 +- xarray=2024.11.0 - xcb-util=0.4.1 - xcb-util-cursor=0.1.5 - xcb-util-image=0.4.0 diff --git a/envs/macos-pinned.yaml b/envs/macos-pinned.yaml index 0d39f9e5f..ccd10868d 100644 --- a/envs/macos-pinned.yaml +++ b/envs/macos-pinned.yaml @@ -27,10 +27,10 @@ dependencies: - aws-c-http=0.9.1 - aws-c-io=0.15.2 - aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.1 +- aws-c-s3=0.7.2 - aws-c-sdkutils=0.2.1 - aws-checksums=0.2.2 -- aws-crt-cpp=0.29.5 +- aws-crt-cpp=0.29.6 - aws-sdk-cpp=1.11.449 - azure-core-cpp=1.14.0 - azure-identity-cpp=1.10.0 @@ -47,13 +47,12 @@ dependencies: - brotli-python=1.1.0 - bzip2=1.0.8 - c-ares=1.34.3 -- c-blosc2=2.15.1 +- c-blosc2=2.15.2 - ca-certificates=2024.8.30 -- cads-api-client=1.5.4 - cairo=1.18.0 - capnproto=1.0.2 - cartopy=0.24.0 -- cdsapi=0.7.4 +- cdsapi=0.7.5 - certifi=2024.8.30 - cffi=1.17.1 - cfgv=3.3.1 @@ -83,6 +82,7 @@ dependencies: - dask=2024.11.2 - dask-core=2024.11.2 - dask-expr=1.1.19 +- datapi=0.1.1 - datrie=0.8.2 - dav1d=1.2.1 - decorator=5.1.1 @@ -141,7 +141,7 @@ dependencies: - humanfriendly=10.0 - hyperframe=6.0.1 - icu=75.1 -- identify=2.6.2 +- identify=2.6.3 - idna=3.10 - immutables=0.21 - importlib-metadata=8.5.0 @@ -164,11 +164,11 @@ dependencies: - lerc=4.0.0 - libabseil=20240722.0 - libaec=1.1.3 -- libarchive=3.7.4 -- libarrow=18.0.0 -- libarrow-acero=18.0.0 -- libarrow-dataset=18.0.0 -- libarrow-substrait=18.0.0 +- libarchive=3.7.7 +- libarrow=18.1.0 +- libarrow-acero=18.1.0 +- libarrow-dataset=18.1.0 +- libarrow-substrait=18.1.0 - libavif16=1.1.1 - libblas=3.9.0 - libbrotlicommon=1.1.0 @@ -218,7 +218,7 @@ dependencies: - libnghttp2=1.64.0 - libntlm=1.4 - libopenblas=0.3.28 -- libparquet=18.0.0 +- libparquet=18.1.0 - libpng=1.6.44 - libpq=17.2 - libprotobuf=5.28.2 @@ -266,10 +266,10 @@ dependencies: - nodeenv=1.9.1 - nspr=4.36 - nss=3.107 -- numexpr=2.10.1 +- numexpr=2.10.2 - numpy=1.26.4 - openjpeg=2.5.2 -- openldap=2.6.8 +- openldap=2.6.9 - openpyxl=3.1.5 - openssl=3.4.0 - orc=2.0.3 @@ -289,8 +289,8 @@ dependencies: - plac=1.4.3 - platformdirs=4.3.6 - pluggy=1.5.0 -- polars=1.14.0 -- poppler=24.08.0 +- polars=1.15.0 +- poppler=24.11.0 - poppler-data=0.4.12 - postgresql=17.2 - powerplantmatching=0.5.19 @@ -304,15 +304,15 @@ dependencies: - pulp=2.8.0 - pure_eval=0.2.3 - py-cpuinfo=9.0.0 -- pyarrow=18.0.0 -- pyarrow-core=18.0.0 +- pyarrow=18.1.0 +- pyarrow-core=18.1.0 - pycountry=24.6.1 - pycparser=2.22 - pygments=2.18.0 - pyogrio=0.10.0 - pyparsing=3.2.0 - pyproj=3.7.0 -- pypsa=0.31.1 +- pypsa=0.31.2 - pyscipopt=5.2.1 - pyshp=2.3.1 - pysocks=1.7.1 @@ -320,9 +320,9 @@ dependencies: - pytest=8.3.3 - python=3.12.7 - python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.20.0 +- python-fastjsonschema=2.21.0 - python-tzdata=2024.2 -- python-utils=3.9.0 +- python-utils=3.9.1 - python_abi=3.12 - pytz=2024.1 - pyxlsb=1.0.10 @@ -351,7 +351,7 @@ dependencies: - snakemake-interface-executor-plugins=9.3.2 - snakemake-interface-report-plugins=1.1.0 - snakemake-interface-storage-plugins=3.3.0 -- snakemake-minimal=8.25.3 +- snakemake-minimal=8.24.1 - snappy=1.2.1 - snuggs=1.4.7 - sortedcontainers=2.4.0 @@ -370,8 +370,8 @@ dependencies: - tk=8.6.13 - tomli=2.1.0 - toolz=1.0.0 -- tornado=6.4.1 -- tqdm=4.67.0 +- tornado=6.4.2 +- tqdm=4.67.1 - traitlets=5.14.3 - typing-extensions=4.12.2 - typing_extensions=4.12.2 @@ -384,12 +384,12 @@ dependencies: - uriparser=0.9.8 - urllib3=2.2.3 - validators=0.34.0 -- virtualenv=20.27.1 +- virtualenv=20.28.0 - wcwidth=0.2.13 - wheel=0.45.1 -- wrapt=1.16.0 +- wrapt=1.17.0 - x265=3.5 -- xarray=2024.10.0 +- xarray=2024.11.0 - xerces-c=3.2.5 - xlrd=2.0.1 - xorg-libxau=1.0.11 diff --git a/envs/windows-pinned.yaml b/envs/windows-pinned.yaml index 4c751feee..b070a88ad 100644 --- a/envs/windows-pinned.yaml +++ b/envs/windows-pinned.yaml @@ -28,10 +28,10 @@ dependencies: - aws-c-http=0.9.1 - aws-c-io=0.15.2 - aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.1 +- aws-c-s3=0.7.2 - aws-c-sdkutils=0.2.1 - aws-checksums=0.2.2 -- aws-crt-cpp=0.29.5 +- aws-crt-cpp=0.29.6 - aws-sdk-cpp=1.11.449 - azure-core-cpp=1.14.0 - azure-identity-cpp=1.10.0 @@ -47,13 +47,12 @@ dependencies: - brotli-python=1.1.0 - bzip2=1.0.8 - c-ares=1.34.3 -- c-blosc2=2.15.1 +- c-blosc2=2.15.2 - ca-certificates=2024.8.30 -- cads-api-client=1.5.4 - cairo=1.18.0 - capnproto=1.0.2 - cartopy=0.24.0 -- cdsapi=0.7.4 +- cdsapi=0.7.5 - certifi=2024.8.30 - cffi=1.17.1 - cfgv=3.3.1 @@ -77,6 +76,7 @@ dependencies: - dask=2024.11.2 - dask-core=2024.11.2 - dask-expr=1.1.19 +- datapi=0.1.1 - datrie=0.8.2 - dav1d=1.2.1 - decorator=5.1.1 @@ -119,10 +119,14 @@ dependencies: - getopt-win32=0.1 - gitdb=4.0.11 - gitpython=3.1.43 +- glib=2.82.2 +- glib-tools=2.82.2 - glpk=5.0 - gmp=6.3.0 - graphite2=1.3.13 - graphviz=12.0.0 +- gst-plugins-base=1.24.7 +- gstreamer=1.24.7 - gts=0.7.6 - h2=4.1.0 - harfbuzz=9.0.0 @@ -132,7 +136,7 @@ dependencies: - humanfriendly=10.0 - hyperframe=6.0.1 - icu=75.1 -- identify=2.6.2 +- identify=2.6.3 - idna=3.10 - immutables=0.21 - importlib-metadata=8.5.0 @@ -154,11 +158,11 @@ dependencies: - lerc=4.0.0 - libabseil=20240722.0 - libaec=1.1.3 -- libarchive=3.7.4 -- libarrow=18.0.0 -- libarrow-acero=18.0.0 -- libarrow-dataset=18.0.0 -- libarrow-substrait=18.0.0 +- libarchive=3.7.7 +- libarrow=18.1.0 +- libarrow-acero=18.1.0 +- libarrow-dataset=18.1.0 +- libarrow-substrait=18.1.0 - libavif16=1.1.1 - libblas=3.9.0 - libboost=1.86.0 @@ -200,12 +204,14 @@ dependencies: - libhwloc=2.11.2 - libiconv=1.17 - libintl=0.22.5 +- libintl-devel=0.22.5 - libjpeg-turbo=3.0.0 - libkml=1.3.0 - liblapack=3.9.0 - libnetcdf=4.9.2 +- libogg=1.3.5 - libopenblas=0.3.28 -- libparquet=18.0.0 +- libparquet=18.1.0 - libpng=1.6.44 - libpq=17.2 - libprotobuf=5.28.2 @@ -217,6 +223,7 @@ dependencies: - libthrift=0.21.0 - libtiff=4.7.0 - libutf8proc=2.8.0 +- libvorbis=1.3.7 - libwebp-base=1.4.0 - libwinpthread=12.0.0.r4.gg4f2fc60ca - libxcb=1.17.0 @@ -248,7 +255,7 @@ dependencies: - networkx=3.4.2 - nodeenv=1.9.1 - nomkl=1.0 -- numexpr=2.10.1 +- numexpr=2.10.2 - numpy=1.26.4 - openjpeg=2.5.2 - openmp=5.0.0 @@ -270,7 +277,7 @@ dependencies: - plac=1.4.3 - platformdirs=4.3.6 - pluggy=1.5.0 -- poppler=24.08.0 +- poppler=24.11.0 - poppler-data=0.4.12 - postgresql=17.2 - powerplantmatching=0.5.19 @@ -283,15 +290,15 @@ dependencies: - pulp=2.8.0 - pure_eval=0.2.3 - py-cpuinfo=9.0.0 -- pyarrow=18.0.0 -- pyarrow-core=18.0.0 +- pyarrow=18.1.0 +- pyarrow-core=18.1.0 - pycountry=24.6.1 - pycparser=2.22 - pygments=2.18.0 - pyogrio=0.10.0 - pyparsing=3.2.0 - pyproj=3.7.0 -- pypsa=0.31.1 +- pypsa=0.31.2 - pyreadline3=3.5.4 - pyscipopt=5.2.1 - pyshp=2.3.1 @@ -301,15 +308,16 @@ dependencies: - pytest=8.3.3 - python=3.12.7 - python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.20.0 +- python-fastjsonschema=2.21.0 - python-tzdata=2024.2 -- python-utils=3.9.0 +- python-utils=3.9.1 - python_abi=3.12 - pytz=2024.1 - pywin32=307 - pyxlsb=1.0.10 - pyyaml=6.0.2 - qhull=2020.2 +- qt-main=5.15.15 - qt6-main=6.8.0 - rasterio=1.4.2 - rav1e=0.6.6 @@ -333,7 +341,7 @@ dependencies: - snakemake-interface-executor-plugins=9.3.2 - snakemake-interface-report-plugins=1.1.0 - snakemake-interface-storage-plugins=3.3.0 -- snakemake-minimal=8.25.3 +- snakemake-minimal=8.24.1 - snappy=1.2.1 - snuggs=1.4.7 - sortedcontainers=2.4.0 @@ -352,8 +360,8 @@ dependencies: - tk=8.6.13 - tomli=2.1.0 - toolz=1.0.0 -- tornado=6.4.1 -- tqdm=4.67.0 +- tornado=6.4.2 +- tqdm=4.67.1 - traitlets=5.14.3 - typing-extensions=4.12.2 - typing_extensions=4.12.2 @@ -367,14 +375,14 @@ dependencies: - validators=0.34.0 - vc=14.3 - vc14_runtime=14.42.34433 -- virtualenv=20.27.1 +- virtualenv=20.28.0 - vs2015_runtime=14.42.34433 - wcwidth=0.2.13 - wheel=0.45.1 - win_inet_pton=1.1.0 -- wrapt=1.16.0 +- wrapt=1.17.0 - x265=3.5 -- xarray=2024.10.0 +- xarray=2024.11.0 - xerces-c=3.2.5 - xlrd=2.0.1 - xorg-libice=1.1.1 @@ -401,7 +409,7 @@ dependencies: - highspy==1.7.2 - oauthlib==3.2.2 - ply==3.11 - - polars==1.14.0 + - polars==1.15.0 - pyomo==6.8.2 - requests-oauthlib==1.3.1 - snakemake-executor-plugin-cluster-generic==1.0.9 From 13e0c07878709ddba49206e0f1f63bc996bf7071 Mon Sep 17 00:00:00 2001 From: Amos Schledorn <60692940+amos-schledorn@users.noreply.github.com> Date: Mon, 2 Dec 2024 17:05:44 +0100 Subject: [PATCH 03/11] Add geothermal-sourced central heat pumps (#1359) * feat: add utilisation potential retrieval * feat: add build_heat_source_potentials module * feat: update config * feat: extend retrieve.smk * feat: pass potential to update prepare_sector_network * feat: update cop profile module * feat: update build_sector.smk accordingly * fix: use generator + links for heat source * clean up run.py * feat: generalise 'geothermal' to any heat source in Fraunhofer data * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * chor: simplify indexing * style: rename potentials var * fix: return 0 for COP calculation when source inlet temperature exceeds sink outlet temperature * refactor: remove unused function and clean up code in build_cop_profiles.run.py * style: clean-up comments in OnshoreRegionData.py and prepare_sector_network.py * feat: add direct heat source utilisation when source temp > forward temp * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * feat: add costs for geothermal heat source * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * style: pre-commit, add dev to gitignore * feat: replace access to config with unpack where possible Note: unpack() doesn't work in snakemake output, so geothermal is specified explicitly as only heat source! * feat: replace dict access to config in snakemake * doc: add docstrings, clean up code * docs: update release notes * doc: update configtables * doc: update data sourcs * update docs * Update config/config.default.yaml Co-authored-by: Lukas Trippe * docs: fix data-retrieval docs * feat: turn off geothermal DH heat by default * style: remove "fraunhofer_" in naming * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * style: use snakemake.wildcards.heat_sources rather than additional param * Update doc/configtables/sector.csv Co-authored-by: Fabian Neumann * Update doc/configtables/sector.csv Co-authored-by: Fabian Neumann * docs: update sector.csv * refactor: refactor scaling factor calculation in run.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs: add direct_utilisation_heat_sources to configtables * udpate release_notes --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Lukas Trippe Co-authored-by: Fabian Neumann --- .gitignore | 2 + config/config.default.yaml | 19 ++- doc/configtables/sector.csv | 9 ++ doc/data-retrieval.rst | 9 ++ doc/release_notes.rst | 2 + rules/build_sector.smk | 82 +++++++++++ rules/retrieve.smk | 18 +++ .../CentralHeatingCopApproximator.py | 10 +- scripts/build_cop_profiles/run.py | 32 +++-- ...direct_heat_source_utilisation_profiles.py | 115 +++++++++++++++ .../onshore_region_data.py | 96 +++++++++++++ scripts/build_heat_source_potentials/run.py | 96 +++++++++++++ scripts/definitions/heat_system.py | 18 +++ scripts/prepare_sector_network.py | 133 +++++++++++++++--- ...ieve_heat_source_utilisation_potentials.py | 57 ++++++++ 15 files changed, 661 insertions(+), 37 deletions(-) create mode 100644 scripts/build_direct_heat_source_utilisation_profiles.py create mode 100755 scripts/build_heat_source_potentials/onshore_region_data.py create mode 100644 scripts/build_heat_source_potentials/run.py create mode 100644 scripts/retrieve_heat_source_utilisation_potentials.py diff --git a/.gitignore b/.gitignore index 27a2fb182..83c1397e6 100644 --- a/.gitignore +++ b/.gitignore @@ -75,3 +75,5 @@ d1gam3xoknrgr2.cloudfront.net/ merger-todos.md *.html +# private dev folder +dev/* diff --git a/config/config.default.yaml b/config/config.default.yaml index c4335ec5e..15af59344 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -480,6 +480,18 @@ sector: heat_exchanger_pinch_point_temperature_difference: 5 #K isentropic_compressor_efficiency: 0.8 heat_loss: 0.0 + heat_utilisation_potentials: + geothermal: + # activate for 85C hydrothermal + # key: hydrothermal_85 + # constant_temperature_celsius: 85 + key: hydrothermal_65 + constant_temperature_celsius: 65 + column_name: Energy_TWh + unit: TWh + full_load_hours: 4000 + direct_utilisation_heat_sources: + - geothermal heat_pump_sources: urban central: - air @@ -827,7 +839,7 @@ industry: # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#costs costs: year: 2030 - version: v0.9.2 + version: v0.10.0 social_discountrate: 0.02 fill_values: FOM: 0 @@ -1228,8 +1240,11 @@ plotting: services urban decentral air heat pump: '#5af95d' services rural air heat pump: '#5af95d' urban central air heat pump: '#6cfb6b' + urban central geothermal heat pump: '#4f2144' + geothermal heat pump: '#4f2144' + geothermal heat direct utilisation: '#ba91b1' ground heat pump: '#2fb537' - residential rural ground heat pump: '#48f74f' + residential rural ground heat pump: '#4f2144' residential rural air heat pump: '#48f74f' services rural ground heat pump: '#5af95d' Ambient: '#98eb9d' diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 13246b27f..ba98adee0 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -23,6 +23,15 @@ district_heating,--,,`prepare_sector_network.py ) should be used, +-- -- geothermal,-,Name of the heat source. Must be the same as in ``heat_pump_sources``, +-- -- -- key,-,string used to complete URL for data download - e.g. `geothermal_65` or `geothermal_85`","i.e file names in `Fordatis `, +-- -- -- constant_temperature_celsius,°C,heat source temperature, +-- -- -- column_name,-,name of the data column in retrieved GeoDataFrame, + +-- -- -- unit,-,unit of heat source potential must be in (K/M/G/T)Wh, +-- -- -- full_load_hours,h,assumed full-load hours in Manz et al. (used to scale from utilisation to technical potential), +-- direct_utilisation_heat_sources,--,List of heat sources for direct heat utilisation in district heating. Must be in the keys of `heat_utilisation_potentials` (e.g. ``geothermal``), -- heat_pump_sources,--,, -- -- urban central,--,List of heat sources for heat pumps in urban central heating, -- -- urban decentral,--,List of heat sources for heat pumps in urban decentral heating, diff --git a/doc/data-retrieval.rst b/doc/data-retrieval.rst index 7509c8b57..3186157e7 100644 --- a/doc/data-retrieval.rst +++ b/doc/data-retrieval.rst @@ -9,6 +9,15 @@ Specific retrieval rules Data in this section is retrieved and extracted in rules specified in ``rules/retrieve.smk``. + +``data/fraunhofer_heat_source_utilisation_potentials`` + +- **Source:** Fraunhofer Fordatis +- **Link:** https://fordatis.fraunhofer.de/handle/fordatis/341.3?mode=simple +- **License:** `CC BY 4.0 `__ +- **Description:** Utilisation potentials for different heat sources across Europe, based on Manz et al. 2024. + + ``data/nuts`` - **Source:** GISCO diff --git a/doc/release_notes.rst b/doc/release_notes.rst index daefe6854..604537fdd 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -11,6 +11,8 @@ Release Notes Upcoming Release ================ +* Feature: Introduce geothermal district heating (direct utilisation and heat pumps). Potentials are based on `Manz et al. 2024: Spatial analysis of renewable and excess heat potentials for climate-neutral district heating in Europe `. + * Feature: Allow CHPs to use different fuel sources such as gas, oil, coal, and methanol. Note that the cost assumptions are based on a gas CHP (except for solid biomass-fired CHP). * Improve `sanitize_carrier`` function by filling in colors of missing carriers with colors mapped after using the function `rename_techs`. diff --git a/rules/build_sector.smk b/rules/build_sector.smk index c56675c17..04f5c3e8e 100755 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -284,6 +284,28 @@ rule build_central_heating_temperature_profiles: "../scripts/build_central_heating_temperature_profiles/run.py" +rule build_heat_source_potentials: + params: + heat_utilisation_potentials=config_provider( + "sector", "district_heating", "heat_utilisation_potentials" + ), + input: + utilisation_potential="data/heat_source_utilisation_potentials/{heat_source}.gpkg", + regions_onshore=resources("regions_onshore_base_s_{clusters}.geojson"), + output: + resources("heat_source_potential_{heat_source}_base_s_{clusters}.csv"), + resources: + mem_mb=2000, + log: + logs("build_heat_source_potentials_{heat_source}_s_{clusters}.log"), + benchmark: + benchmarks("build_heat_source_potentials/{heat_source}_s_{clusters}") + conda: + "../envs/environment.yaml" + script: + "../scripts/build_heat_source_potentials/run.py" + + rule build_cop_profiles: params: heat_pump_sink_T_decentral_heating=config_provider( @@ -296,6 +318,9 @@ rule build_cop_profiles: "sector", "district_heating", "heat_pump_cop_approximation" ), heat_pump_sources=config_provider("sector", "heat_pump_sources"), + heat_utilisation_potentials=config_provider( + "sector", "district_heating", "heat_utilisation_potentials" + ), snapshots=config_provider("snapshots"), input: central_heating_forward_temperature_profiles=resources( @@ -321,6 +346,39 @@ rule build_cop_profiles: "../scripts/build_cop_profiles/run.py" +rule build_direct_heat_source_utilisation_profiles: + params: + direct_utilisation_heat_sources=config_provider( + "sector", "district_heating", "direct_utilisation_heat_sources" + ), + heat_utilisation_potentials=config_provider( + "sector", "district_heating", "heat_utilisation_potentials" + ), + snapshots=config_provider("snapshots"), + input: + central_heating_forward_temperature_profiles=resources( + "central_heating_forward_temperature_profiles_base_s_{clusters}_{planning_horizons}.nc" + ), + output: + direct_heat_source_utilisation_profiles=resources( + "direct_heat_source_utilisation_profiles_base_s_{clusters}_{planning_horizons}.nc" + ), + resources: + mem_mb=20000, + log: + logs( + "build_direct_heat_source_utilisation_profiles_s_{clusters}_{planning_horizons}.log" + ), + benchmark: + benchmarks( + "build_direct_heat_source_utilisation_profiles/s_{clusters}_{planning_horizons}" + ) + conda: + "../envs/environment.yaml" + script: + "../scripts/build_direct_heat_source_utilisation_profiles.py" + + def solar_thermal_cutout(wildcards): c = config_provider("solar_thermal", "cutout")(wildcards) if c == "default": @@ -1004,6 +1062,20 @@ rule build_egs_potentials: "../scripts/build_egs_potentials.py" +def input_heat_source_potentials(w): + + return { + heat_source_name: resources( + "heat_source_potential_" + heat_source_name + "_base_s_{clusters}.csv" + ) + for heat_source_name in config_provider( + "sector", "district_heating", "heat_utilisation_potentials" + )(w).keys() + if heat_source_name + in config_provider("sector", "heat_pump_sources", "urban central")(w) + } + + rule prepare_sector_network: params: time_resolution=config_provider("clustering", "temporal", "resolution_sector"), @@ -1028,8 +1100,15 @@ rule prepare_sector_network: heat_pump_sources=config_provider("sector", "heat_pump_sources"), heat_systems=config_provider("sector", "heat_systems"), energy_totals_year=config_provider("energy", "energy_totals_year"), + heat_utilisation_potentials=config_provider( + "sector", "district_heating", "heat_utilisation_potentials" + ), + direct_utilisation_heat_sources=config_provider( + "sector", "district_heating", "direct_utilisation_heat_sources" + ), input: unpack(input_profile_offwind), + unpack(input_heat_source_potentials), **rules.cluster_gas_network.output, **rules.build_gas_input_locations.output, snapshot_weightings=resources( @@ -1119,6 +1198,9 @@ rule prepare_sector_network: if config_provider("sector", "enhanced_geothermal", "enable")(w) else [] ), + direct_heat_source_utilisation_profiles=resources( + "direct_heat_source_utilisation_profiles_base_s_{clusters}_{planning_horizons}.nc" + ), output: RESULTS + "prenetworks/base_s_{clusters}_l{ll}_{opts}_{sector_opts}_{planning_horizons}.nc", diff --git a/rules/retrieve.smk b/rules/retrieve.smk index a935159b4..9154386b1 100755 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -631,3 +631,21 @@ if config["enable"]["retrieve"] and ( "data/osm-raw/{country}/substations_relation.json", country=config_provider("countries"), ), + + +if config["enable"]["retrieve"]: + + rule retrieve_heat_source_utilisation_potentials: + params: + heat_source="{heat_source}", + heat_utilisation_potentials=config_provider( + "sector", "district_heating", "heat_utilisation_potentials" + ), + log: + "logs/retrieve_heat_source_potentials_{heat_source}.log", + resources: + mem_mb=500, + output: + "data/heat_source_utilisation_potentials/{heat_source}.gpkg", + script: + "../scripts/retrieve_heat_source_utilisation_potentials.py" diff --git a/scripts/build_cop_profiles/CentralHeatingCopApproximator.py b/scripts/build_cop_profiles/CentralHeatingCopApproximator.py index 08dd6a1a8..30f84356b 100644 --- a/scripts/build_cop_profiles/CentralHeatingCopApproximator.py +++ b/scripts/build_cop_profiles/CentralHeatingCopApproximator.py @@ -144,11 +144,17 @@ def approximate_cop(self) -> Union[xr.DataArray, np.array]: """ Calculate the coefficient of performance (COP) for the system. + Notes: + ------ + Returns 0 where the source inlet temperature is greater than the sink outlet temperature. + Returns: -------- Union[xr.DataArray, np.array]: The calculated COP values. """ - return ( + return xr.where( + self.t_source_in_kelvin > self.t_sink_out_kelvin, + 0, self.ideal_lorenz_cop * ( ( @@ -170,7 +176,7 @@ def approximate_cop(self) -> Union[xr.DataArray, np.array]: * (1 - self.ratio_evaporation_compression_work) + 1 - self.isentropic_efficiency_compressor_kelvin - - self.heat_loss + - self.heat_loss, ) @property diff --git a/scripts/build_cop_profiles/run.py b/scripts/build_cop_profiles/run.py index b93f7df69..28bbf1a10 100644 --- a/scripts/build_cop_profiles/run.py +++ b/scripts/build_cop_profiles/run.py @@ -4,7 +4,7 @@ # SPDX-License-Identifier: MIT """ Approximate heat pump coefficient-of-performance (COP) profiles for different -heat sources and systems. +heat sources and systems. Returns zero where source temperature higher than sink temperature. For central heating, this is based on Jensen et al. (2018) (c.f. `CentralHeatingCopApproximator `_) and for decentral heating, the approximation is based on Staffell et al. (2012) (c.f. `DecentralHeatingCopApproximator `_). @@ -27,11 +27,8 @@ urban central: urban decentral: rural: - snapshots: - Inputs ------ -- `resources//regions_onshore.geojson`: Onshore regions - `resources//temp_soil_total`: Ground temperature - `resources//temp_air_total`: Air temperature @@ -94,10 +91,6 @@ def get_cop( ).approximate_cop() -def get_country_from_node_name(node_name: str) -> str: - return node_name[:2] - - if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -109,9 +102,6 @@ def get_country_from_node_name(node_name: str) -> str: set_scenario_config(snakemake) - # map forward and return temperatures specified on country-level to onshore regions - regions_onshore = gpd.read_file(snakemake.input.regions_onshore)["name"] - snapshots = pd.date_range(freq="h", **snakemake.params.snapshots) central_heating_forward_temperature: xr.DataArray = xr.open_dataarray( snakemake.input.central_heating_forward_temperature_profiles ) @@ -123,9 +113,23 @@ def get_country_from_node_name(node_name: str) -> str: for heat_system_type, heat_sources in snakemake.params.heat_pump_sources.items(): cop_this_system_type = [] for heat_source in heat_sources: - source_inlet_temperature_celsius = xr.open_dataarray( - snakemake.input[f"temp_{heat_source.replace('ground', 'soil')}_total"] - ) + if heat_source in ["ground", "air"]: + source_inlet_temperature_celsius = xr.open_dataarray( + snakemake.input[ + f"temp_{heat_source.replace('ground', 'soil')}_total" + ] + ) + elif heat_source in snakemake.params.heat_utilisation_potentials.keys(): + source_inlet_temperature_celsius = ( + snakemake.params.heat_utilisation_potentials[heat_source][ + "constant_temperature_celsius" + ] + ) + else: + raise ValueError( + f"Unknown heat source {heat_source}. Must be one of [ground, air] or {snakemake.params.heat_sources.keys()}." + ) + cop_da = get_cop( heat_system_type=heat_system_type, heat_source=heat_source, diff --git a/scripts/build_direct_heat_source_utilisation_profiles.py b/scripts/build_direct_heat_source_utilisation_profiles.py new file mode 100644 index 000000000..72a9e4646 --- /dev/null +++ b/scripts/build_direct_heat_source_utilisation_profiles.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Build availability profiles for direct heat source utilisation (1 in regions and time steps where heat source can be utilised, 0 otherwise). +When direct utilisation is possible, heat pump COPs are set to zero (c.f. `build_cop_profiles`). + +Relevant Settings +----------------- + +.. code:: yaml + sector: + district_heating: + heat_utilisation_potentials: + direct_utilisation_heat_sources: + snapshots: + +Inputs +------ +- `resources//central_heating_forward_temperatures_base_s_{clusters}_{planning_horizons}.nc`: Central heating forward temperature profiles + +Outputs +------- +- `resources//direct_heat_source_utilisation_profiles_base_s_{clusters}_{planning_horizons}.nc`: Direct heat source utilisation profiles +""" + +from typing import List + +import xarray as xr +from _helpers import set_scenario_config + + +def get_source_temperature(heat_source_key: str): + """ + Get the constant temperature of a heat source. + + Args: + ----- + heat_source_key: str + The key (name) of the heat source. + + Returns: + -------- + float + The constant temperature of the heat source in degrees Celsius. + + Raises: + ------- + ValueError + If the heat source is unknown (not in `config`). + """ + + if heat_source_key in snakemake.params.heat_utilisation_potentials.keys(): + return snakemake.params.heat_utilisation_potentials[heat_source_key][ + "constant_temperature_celsius" + ] + else: + raise ValueError( + f"Unknown heat source {heat_source_key}. Must be one of { + snakemake.params.heat_sources.keys()}." + ) + + +def get_profile( + source_temperature: float | xr.DataArray, forward_temperature: xr.DataArray +) -> xr.DataArray | float: + """ + Get the direct heat source utilisation profile. + + Args: + ----- + source_temperature: float | xr.DataArray + The constant temperature of the heat source in degrees Celsius. If `xarray`, indexed by `time` and `region`. If a float, it is broadcasted to the shape of `forward_temperature`. + forward_temperature: xr.DataArray + The central heating forward temperature profiles. If `xarray`, indexed by `time` and `region`. If a float, it is broadcasted to the shape of `return_temperature`. + + Returns: + -------- + xr.DataArray | float + The direct heat source utilisation profile. + + """ + return xr.where(source_temperature >= forward_temperature, 1.0, 0.0) + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "build_cop_profiles", + clusters=48, + ) + + set_scenario_config(snakemake) + + direct_utilisation_heat_sources: List[str] = ( + snakemake.params.direct_utilisation_heat_sources + ) + + central_heating_forward_temperature: xr.DataArray = xr.open_dataarray( + snakemake.input.central_heating_forward_temperature_profiles + ) + + xr.concat( + [ + get_profile( + source_temperature=get_source_temperature(heat_source_key), + forward_temperature=central_heating_forward_temperature, + ).assign_coords(heat_source=heat_source_key) + for heat_source_key in direct_utilisation_heat_sources + ], + dim="heat_source", + ).to_netcdf(snakemake.output.direct_heat_source_utilisation_profiles) diff --git a/scripts/build_heat_source_potentials/onshore_region_data.py b/scripts/build_heat_source_potentials/onshore_region_data.py new file mode 100755 index 000000000..1dfcbf42d --- /dev/null +++ b/scripts/build_heat_source_potentials/onshore_region_data.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Helper class for matching heat source potentials to onshore regions. +""" + +from typing import List + +import geopandas as gpd + + +class OnshoreRegionData: + """ + This class is used to map heat potentials to onshore regions. + + Attributes + ---------- + onshore_regions : gpd.GeoDataFrame + GeoDataFrame containing the onshore regions + data : gpd.GeoDataFrame + GeoDataFrame containing the heat potentials + scaling_factor : float + Scaling factor for the heat potentials + """ + + def __init__( + self, + onshore_regions: gpd.GeoDataFrame, + data: gpd.GeoDataFrame, + column_name: str, + scaling_factor: float = 1.0, + ) -> None: + """ + Parameters + ---------- + onshore_regions : gpd.GeoDataFrame + GeoDataFrame containing the onshore regions + data : gpd.GeoDataFrame + GeoDataFrame containing the heat potentials + column_name : str + Column name of the heat potential data in `data` + scaling_factor : float, optional + Scaling factor for the heat potentials, by default 1.0 + """ + + self.onshore_regions = onshore_regions + self.scaling_factor = scaling_factor + self.data = data.to_crs(onshore_regions.crs) + self._column_name = column_name + + self._mapped = False + + @property + def data_in_regions_scaled(self) -> gpd.GeoDataFrame: + """ + Scale the heat potentials and map them to the onshore regions. + + Returns + ------- + gpd.GeoDataFrame + GeoDataFrame containing the scaled heat potentials in the onshore regions + """ + if self._mapped: + return self._scaled_data_in_regions + else: + self._data_in_regions = self._map_to_onshore_regions() + self._mapped = True + return self._scaled_data_in_regions + + def _map_to_onshore_regions(self): + """ + Map the heat potentials to the onshore regions + """ + data_in_regions = gpd.sjoin(self.data, self.onshore_regions, how="right") + + # Initialize an empty list to store the merged GeoDataFrames + ret_val = self.onshore_regions.copy() + ret_val[self._column_name] = ( + data_in_regions.groupby("name")[self._column_name] + .sum() + .reset_index(drop=True) + ) + ret_val = ret_val.set_index("name", drop=True).rename_axis("name")[ + self._column_name + ] + + return ret_val + + @property + def _scaled_data_in_regions(self): + """ + Scale the heat potentials in the onshore regions + """ + return self._data_in_regions * self.scaling_factor diff --git a/scripts/build_heat_source_potentials/run.py b/scripts/build_heat_source_potentials/run.py new file mode 100644 index 000000000..b824b613f --- /dev/null +++ b/scripts/build_heat_source_potentials/run.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Build heat source potentials for a given heat source. + +This script maps and aggregates heat source potentials per heat source to `onshore_regions` using `OnshoreRegionData`. +It scales the heat source utilisation potentials to technical potentials by dividing the utilisation potentials by the full load hours of the heat source, also taking into account the energy unit set for the respective source in the config. + + +Relevant Settings +----------------- +.. code:: yaml + sector: + district_heating: + heat_utilisation_potentials: + {heat_source} + + +Inputs +------ +- `resources//regions_onshore.geojson` +- `resources//heat_source_utilisation_potentials/.gpkg` + +Outputs +------- +- `resources//heat_source_technical_potential_{heat_source}_base_s_{clusters}.csv` +""" + +import geopandas as gpd +from _helpers import set_scenario_config + +from scripts.build_heat_source_potentials.onshore_region_data import OnshoreRegionData + + +def get_unit_conversion_factor( + input_unit: str, + output_unit: str, + unit_scaling: dict = {"Wh": 1, "kWh": 1e3, "MWh": 1e6, "GWh": 1e9, "TWh": 1e12}, +) -> float: + + if input_unit not in unit_scaling.keys(): + raise ValueError( + f"Input unit {input_unit} not allowed. Must be one of { + unit_scaling.keys()}" + ) + elif output_unit not in unit_scaling.keys(): + raise ValueError( + f"Output unit {output_unit} not allowed. Must be one of { + unit_scaling.keys()}" + ) + + return unit_scaling[input_unit] / unit_scaling[output_unit] + + +if __name__ == "__main__": + + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "build_heat_source_potentials", + clusters=48, + ) + + set_scenario_config(snakemake) + + regions_onshore = gpd.read_file(snakemake.input.regions_onshore) + heat_source_utilisation_potential = gpd.read_file( + snakemake.input.utilisation_potential + ) + + unit_conversion_factor = get_unit_conversion_factor( + input_unit=snakemake.params.heat_utilisation_potentials[ + snakemake.wildcards.heat_source + ]["unit"], + output_unit="MWh", + ) + scaling_factor = ( + unit_conversion_factor + / snakemake.params.heat_utilisation_potentials[snakemake.wildcards.heat_source][ + "full_load_hours" + ] + ) + + heat_source_technical_potential = OnshoreRegionData( + onshore_regions=regions_onshore, + data=heat_source_utilisation_potential, + column_name=snakemake.params.heat_utilisation_potentials[ + snakemake.wildcards.heat_source + ]["column_name"], + scaling_factor=scaling_factor, + ).data_in_regions_scaled + + heat_source_technical_potential.to_csv(snakemake.output[0]) diff --git a/scripts/definitions/heat_system.py b/scripts/definitions/heat_system.py index 2806f6bf4..127a991b6 100644 --- a/scripts/definitions/heat_system.py +++ b/scripts/definitions/heat_system.py @@ -226,6 +226,24 @@ def heat_pump_costs_name(self, heat_source: str) -> str: """ return f"{self.central_or_decentral} {heat_source}-sourced heat pump" + def heat_source_costs_name(self, heat_source: str) -> str: + """ + Generates the name for direct source utilisation costs based on the heat source and + system. + Used to retrieve data from `technology-data `. + + Parameters + ---------- + heat_source : str + The heat source. + + Returns + ------- + str + The name for the technology-data costs. + """ + return f"{self.central_or_decentral} {heat_source} heat source" + @property def resistive_heater_costs_name(self) -> str: """ diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b747e30ba..1709e8201 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2030,7 +2030,12 @@ def build_heat_demand(n): return heat_demand -def add_heat(n: pypsa.Network, costs: pd.DataFrame, cop: xr.DataArray): +def add_heat( + n: pypsa.Network, + costs: pd.DataFrame, + cop: xr.DataArray, + direct_heat_source_utilisation_profile: xr.DataArray, +): """ Add heat sector to the network. @@ -2147,8 +2152,8 @@ def add_heat(n: pypsa.Network, costs: pd.DataFrame, cop: xr.DataArray): for heat_source in snakemake.params.heat_pump_sources[ heat_system.system_type.value ]: - costs_name = heat_system.heat_pump_costs_name(heat_source) - efficiency = ( + costs_name_heat_pump = heat_system.heat_pump_costs_name(heat_source) + cop_heat_pump = ( cop.sel( heat_system=heat_system.system_type.value, heat_source=heat_source, @@ -2157,23 +2162,106 @@ def add_heat(n: pypsa.Network, costs: pd.DataFrame, cop: xr.DataArray): .to_pandas() .reindex(index=n.snapshots) if options["time_dep_hp_cop"] - else costs.at[costs_name, "efficiency"] + else costs.at[costs_name_heat_pump, "efficiency"] ) - n.add( - "Link", - nodes, - suffix=f" {heat_system} {heat_source} heat pump", - bus0=nodes, - bus1=nodes + f" {heat_system} heat", - carrier=f"{heat_system} {heat_source} heat pump", - efficiency=efficiency, - capital_cost=costs.at[costs_name, "efficiency"] - * costs.at[costs_name, "fixed"] - * overdim_factor, - p_nom_extendable=True, - lifetime=costs.at[costs_name, "lifetime"], - ) + if heat_source in snakemake.params.heat_utilisation_potentials: + # get potential + p_max_source = pd.read_csv( + snakemake.input[heat_source], + index_col=0, + ).squeeze()[nodes] + + # add resource + heat_carrier = f"{heat_system} {heat_source} heat" + n.add("Carrier", heat_carrier) + n.madd( + "Bus", + nodes, + suffix=f" {heat_carrier}", + carrier=heat_carrier, + ) + + costs_name_heat_source = heat_system.heat_source_costs_name(heat_source) + if heat_source in snakemake.params.direct_utilisation_heat_sources: + capital_cost = ( + costs.at[ + heat_system.heat_source_costs_name(heat_source), "fixed" + ] + * overdim_factor + ) + lifetime = costs.at[ + heat_system.heat_source_costs_name(heat_source), "lifetime" + ] + else: + capital_cost = 0.0 + lifetime = np.inf + n.madd( + "Generator", + nodes, + suffix=f" {heat_carrier}", + bus=nodes + f" {heat_carrier}", + carrier=heat_carrier, + p_nom_extendable=True, + capital_cost=capital_cost, + lifetime=lifetime, + p_nom_max=p_max_source, + ) + + # add heat pump converting source heat + electricity to urban central heat + n.madd( + "Link", + nodes, + suffix=f" {heat_system} {heat_source} heat pump", + bus0=nodes, + bus1=nodes + f" {heat_carrier}", + bus2=nodes + f" {heat_system} heat", + carrier=f"{heat_system} {heat_source} heat pump", + efficiency=-(cop_heat_pump - 1), + efficiency2=cop_heat_pump, + capital_cost=costs.at[costs_name_heat_pump, "efficiency"] + * costs.at[costs_name_heat_pump, "fixed"] + * overdim_factor, + p_nom_extendable=True, + lifetime=costs.at[costs_name_heat_pump, "lifetime"], + ) + + if heat_source in snakemake.params.direct_utilisation_heat_sources: + # 1 if source temperature exceeds forward temperature, 0 otherwise: + efficiency_direct_utilisation = ( + direct_heat_source_utilisation_profile.sel( + heat_source=heat_source, + name=nodes, + ) + .to_pandas() + .reindex(index=n.snapshots) + ) + # add link for direct usage of heat source when source temperature exceeds forward temperature + n.madd( + "Link", + nodes, + suffix=f" {heat_system} {heat_source} heat direct utilisation", + bus0=nodes + f" {heat_carrier}", + bus1=nodes + f" {heat_system} heat", + efficiency=efficiency_direct_utilisation, + carrier=f"{heat_system} {heat_source} heat direct utilisation", + p_nom_extendable=True, + ) + else: + n.madd( + "Link", + nodes, + suffix=f" {heat_system} {heat_source} heat pump", + bus0=nodes, + bus1=nodes + f" {heat_system} heat", + carrier=f"{heat_system} {heat_source} heat pump", + efficiency=cop_heat_pump, + capital_cost=costs.at[costs_name_heat_pump, "efficiency"] + * costs.at[costs_name_heat_pump, "fixed"] + * overdim_factor, + p_nom_extendable=True, + lifetime=costs.at[costs_name_heat_pump, "lifetime"], + ) if options["tes"]: n.add("Carrier", f"{heat_system} water tanks") @@ -4583,7 +4671,14 @@ def add_enhanced_geothermal(n, egs_potentials, egs_overlap, costs): add_land_transport(n, costs) if options["heating"]: - add_heat(n=n, costs=costs, cop=xr.open_dataarray(snakemake.input.cop_profiles)) + add_heat( + n=n, + costs=costs, + cop=xr.open_dataarray(snakemake.input.cop_profiles), + direct_heat_source_utilisation_profile=xr.open_dataarray( + snakemake.input.direct_heat_source_utilisation_profiles + ), + ) if options["biomass"]: add_biomass(n, costs) diff --git a/scripts/retrieve_heat_source_utilisation_potentials.py b/scripts/retrieve_heat_source_utilisation_potentials.py new file mode 100644 index 000000000..59e662d8b --- /dev/null +++ b/scripts/retrieve_heat_source_utilisation_potentials.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT +""" +Retrieve heat source utilisation potentials from Fraunhofer Fordatis. + +Source +------ +Manz et al. 2024: "Spatial analysis of renewable and excess heat potentials for climate-neutral district heating in Europe", Renewable Energy, vol. 224, no. 120111, https://doi.org/10.1016/j.renene.2024.120111 + +Relevant Settings +----------------- +.. code:: yaml + sector: + district_heating: + heat_utilisation_potentials: + +Outputs +------ +- `resources//heat_source_utilisation_potentials/.gpkg` +""" + +import logging +from pathlib import Path + +from _helpers import configure_logging, progress_retrieve, set_scenario_config + +logger = logging.getLogger(__name__) + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake("retrieve_heat_source_utilisation_potentials") + rootpath = ".." + else: + rootpath = "." + configure_logging(snakemake) + set_scenario_config(snakemake) + + # license: https://creativecommons.org/licenses/by/4.0/ + # download the data in url + heat_source = snakemake.params["heat_source"] + filepath = Path(snakemake.output[0]) + if not filepath.parent.exists(): + filepath.parent.mkdir(parents=True) + + url = f"https://fordatis.fraunhofer.de/bitstream/fordatis/341.3/10/{snakemake.params.heat_utilisation_potentials[heat_source]['key']}.gpkg" + + logger.info( + f"Downloading heat source utilisation potential data for {heat_source} from '{url}'." + ) + disable_progress = snakemake.config["run"].get("disable_progressbar", False) + progress_retrieve(url, filepath, disable=disable_progress) + + logger.info(f"Data available at at {filepath}") From 920ffb444497c9767fade5f2a9bdaa457a1b627b Mon Sep 17 00:00:00 2001 From: Bobby Xiong <36541459+bobbyxng@users.noreply.github.com> Date: Mon, 2 Dec 2024 17:06:07 +0100 Subject: [PATCH 04/11] Update to OSM-prebuilt v0.6 (#1431) * Implemented line merge over virtual bus functionality. * Implemented: Aggregating identical lines, bus merging to stations, creating voltage-specific bus endings in stations. * Implemented: Mapping of lines to buses and extending lines to buses. * Finished implementing converters and links. * Finished implementation of entirely new build_osm_network.py script. * Updated configtables. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Temporarily disabled tqdm in retrieve. Line splitting disabled as well. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Implemented relations. Running, converging workflow. * Added updated simplify_network.py * Cleaned up code. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Updated doc * Reactivated line splitting. * Updated build_osm_network. * Cleaned up code. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added 400 kV voltage level to config.default * Updated Zenodo link * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Cleaned up code based on PR comments * Added docstrings. * Updated prepare_osm_network to include interactive map. Added electric parameters for usage outside PyPSA/PyPSA-Eur * Updated config.default. Removed dummy configs. * Updated retriever to include map.html * Add custom busmaps * Added GB busmaps, 37 is london clustered. 314 is london clustered for europe * Removed data files, updated docs. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Fabian Neumann --- config/config.default.yaml | 2 +- doc/configtables/electricity.csv | 2 +- doc/data-base-network.rst | 8 +- doc/release_notes.rst | 2 +- rules/build_electricity.smk | 2 + rules/development.smk | 5 + rules/retrieve.smk | 5 + scripts/build_osm_network.py | 43 +++- scripts/prepare_osm_network_release.py | 278 ++++++++++++++++++++++++- 9 files changed, 330 insertions(+), 17 deletions(-) diff --git a/config/config.default.yaml b/config/config.default.yaml index 15af59344..64197dbbe 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -86,7 +86,7 @@ co2_budget: electricity: voltages: [220., 300., 330., 380., 400., 500., 750.] base_network: osm-prebuilt - osm-prebuilt-version: 0.5 + osm-prebuilt-version: 0.6 gaslimit_enable: false gaslimit: false co2limit_enable: false diff --git a/doc/configtables/electricity.csv b/doc/configtables/electricity.csv index 416191c8d..6e87d40b8 100644 --- a/doc/configtables/electricity.csv +++ b/doc/configtables/electricity.csv @@ -1,7 +1,7 @@ ,Unit,Values,Description voltages,kV,"Any subset of {220., 300., 330., 380., 400., 500., 750.}",Voltage levels to consider base_network, --, "Any value in {'entsoegridkit', 'osm-prebuilt', 'osm-raw}", "Specify the underlying base network, i.e. GridKit (based on ENTSO-E web map extract, OpenStreetMap (OSM) prebuilt or raw (built from raw OSM data), takes longer." -osm-prebuilt-version, --, "float, any value in range 0.1-0.5", "Choose the version of the prebuilt OSM network. Defaults to latest Zenodo release." +osm-prebuilt-version, --, "float, any value in range 0.1-0.6", "Choose the version of the prebuilt OSM network. Defaults to latest Zenodo release." gaslimit_enable,bool,true or false,Add an overall absolute gas limit configured in ``electricity: gaslimit``. gaslimit,MWhth,float or false,Global gas usage limit co2limit_enable,bool,true or false,Add an overall absolute carbon-dioxide emissions limit configured in ``electricity: co2limit`` in :mod:`prepare_network`. **Warning:** This option should currently only be used with electricity-only networks, not for sector-coupled networks.. diff --git a/doc/data-base-network.rst b/doc/data-base-network.rst index 5a61f71c5..98372c841 100644 --- a/doc/data-base-network.rst +++ b/doc/data-base-network.rst @@ -15,11 +15,11 @@ The map might take a moment to load. To view it in full screen, click `here `) + [Data set]. Zenodo. https://doi.org/10.5281/zenodo.14144752 +- **Link:** https://zenodo.org/records/14144752 +- **License:** ODbL (`reference `) - **Description:** Pre-built data of high-voltage transmission grid in Europe from OpenStreetMap. This dataset contains a topologically connected representation of the European diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 604537fdd..749b96b0b 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -103,7 +103,7 @@ Upcoming Release - Single transformers for each combination of voltage level per substation. Transformers now have a capacity s_nom based on connected lines - Use of OSM relations where available and unambiguous (Overwriting all lines that are members of the respective relation to avoid duplicates) -* Updated osm-prebuilt base network to version 0.5, for changelog, see https://zenodo.org/records/13981528 +* Updated osm-prebuilt base network to version 0.6, for changelog, see https://zenodo.org/records/14144752 * Bugfix: vehicle-to-grid dispatch capacity is now limited by the fraction of vehicles participating in demand-side-management, halving the dispatch capacity under the default demand-side management participation rate of 0.5. diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index 3fcbfed16..db390b9d7 100755 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -815,6 +815,8 @@ if config["electricity"]["base_network"] == "osm-raw": converters_geojson=resources("osm-raw/build/geojson/converters.geojson"), transformers_geojson=resources("osm-raw/build/geojson/transformers.geojson"), substations_geojson=resources("osm-raw/build/geojson/buses.geojson"), + stations_polygon=resources("osm-raw/build/geojson/stations_polygon.geojson"), + buses_polygon=resources("osm-raw/build/geojson/buses_polygon.geojson"), log: logs("build_osm_network.log"), benchmark: diff --git a/rules/development.smk b/rules/development.smk index 465490258..832a5f97b 100644 --- a/rules/development.smk +++ b/rules/development.smk @@ -5,14 +5,19 @@ if config["electricity"]["base_network"] == "osm-raw": rule prepare_osm_network_release: + params: + line_types=config["lines"]["types"], input: base_network=resources("networks/base.nc"), + stations_polygon=resources("osm-raw/build/geojson/stations_polygon.geojson"), + buses_polygon=resources("osm-raw/build/geojson/buses_polygon.geojson"), output: buses=resources("osm-raw/release/buses.csv"), converters=resources("osm-raw/release/converters.csv"), lines=resources("osm-raw/release/lines.csv"), links=resources("osm-raw/release/links.csv"), transformers=resources("osm-raw/release/transformers.csv"), + map=resources("osm-raw/release/map.html"), log: logs("prepare_osm_network_release.log"), benchmark: diff --git a/rules/retrieve.smk b/rules/retrieve.smk index 9154386b1..a2d4a9543 100755 --- a/rules/retrieve.smk +++ b/rules/retrieve.smk @@ -546,6 +546,7 @@ if config["enable"]["retrieve"] and ( 0.3: "13358976", 0.4: "13759222", 0.5: "13981528", + 0.6: "14144752", } # update rule to use the correct version @@ -566,12 +567,16 @@ if config["enable"]["retrieve"] and ( transformers=storage( f"https://zenodo.org/records/{osm_prebuilt_version[config['electricity']['osm-prebuilt-version']]}/files/transformers.csv" ), + map=storage( + f"https://zenodo.org/records/{osm_prebuilt_version[config['electricity']['osm-prebuilt-version']]}/files/map.html" + ), output: buses=f"data/osm-prebuilt/{config['electricity']['osm-prebuilt-version']}/buses.csv", converters=f"data/osm-prebuilt/{config['electricity']['osm-prebuilt-version']}/converters.csv", lines=f"data/osm-prebuilt/{config['electricity']['osm-prebuilt-version']}/lines.csv", links=f"data/osm-prebuilt/{config['electricity']['osm-prebuilt-version']}/links.csv", transformers=f"data/osm-prebuilt/{config['electricity']['osm-prebuilt-version']}/transformers.csv", + map=f"data/osm-prebuilt/{config['electricity']['osm-prebuilt-version']}/map.html", log: "logs/retrieve_osm_prebuilt.log", threads: 1 diff --git a/scripts/build_osm_network.py b/scripts/build_osm_network.py index 31884d461..169e74c63 100644 --- a/scripts/build_osm_network.py +++ b/scripts/build_osm_network.py @@ -1429,7 +1429,7 @@ def _finalise_network(all_buses, converters, lines, links, transformers): lines_all["voltage"] = lines_all["voltage"] / 1000 lines_all["length"] = lines_all["length"].round(2) lines_all["under_construction"] = False - lines_all["tags"] = lines_all["contains_lines"] + lines_all["tags"] = lines_all["contains_lines"].apply(lambda x: ";".join(x)) lines_all["underground"] = lines_all["underground"].replace({True: "t", False: "f"}) lines_all["under_construction"] = lines_all["under_construction"].replace( {True: "t", False: "f"} @@ -1581,12 +1581,33 @@ def build_network( lines["length"] = lines.to_crs(DISTANCE_CRS).length links["length"] = links.to_crs(DISTANCE_CRS).length + # Shapes + stations_polygon = stations[["station_id", "geometry"]].copy() + all_buses_polygon = buses_polygon.copy() + all_buses_polygon["dc"] = False + all_buses_polygon = pd.concat( + [ + all_buses_polygon, + dc_buses[["bus_id", "polygon", "dc"]].rename( + columns={"polygon": "geometry"} + ), + ] + ) + ### Saving outputs to PyPSA-compatible format buses_final, converters_final, lines_final, links_final, transformers_final = ( _finalise_network(all_buses, converters, lines, links, transformers) ) - return buses_final, converters_final, lines_final, links_final, transformers_final + return ( + buses_final, + converters_final, + lines_final, + links_final, + transformers_final, + stations_polygon, + all_buses_polygon, + ) if __name__ == "__main__": @@ -1604,16 +1625,18 @@ def build_network( country_shapes = gpd.read_file(snakemake.input["country_shapes"]).set_index("name") # Build network - buses, converters, lines, links, transformers = build_network( - snakemake.input, - country_shapes, - voltages, - line_types, + buses, converters, lines, links, transformers, stations_polygon, buses_polygon = ( + build_network( + snakemake.input, + country_shapes, + voltages, + line_types, + ) ) # Export to csv for base_network buses.to_csv(snakemake.output["substations"], quotechar="'") - lines.drop(columns=["tags"]).to_csv(snakemake.output["lines"], quotechar="'") + lines.to_csv(snakemake.output["lines"], quotechar="'") links.to_csv(snakemake.output["links"], quotechar="'") converters.to_csv(snakemake.output["converters"], quotechar="'") transformers.to_csv(snakemake.output["transformers"], quotechar="'") @@ -1624,3 +1647,7 @@ def build_network( links.to_file(snakemake.output["links_geojson"]) converters.to_file(snakemake.output["converters_geojson"]) transformers.to_file(snakemake.output["transformers_geojson"]) + + # Export polygons for visualisation + stations_polygon.to_file(snakemake.output["stations_polygon"]) + buses_polygon.to_file(snakemake.output["buses_polygon"]) diff --git a/scripts/prepare_osm_network_release.py b/scripts/prepare_osm_network_release.py index b66d851f7..5233407e5 100644 --- a/scripts/prepare_osm_network_release.py +++ b/scripts/prepare_osm_network_release.py @@ -4,15 +4,19 @@ # SPDX-License-Identifier: MIT import logging -import os -import pandas as pd +import folium +import geopandas as gpd +import numpy as np import pypsa from _helpers import configure_logging, set_scenario_config +from base_network import _get_linetype_by_voltage +from shapely.wkt import loads logger = logging.getLogger(__name__) +GEO_CRS = "EPSG:4326" BUSES_COLUMNS = [ "bus_id", "voltage", @@ -30,10 +34,17 @@ "bus0", "bus1", "voltage", + "i_nom", "circuits", + "s_nom", + "r", + "x", + "b", "length", "underground", "under_construction", + "type", + "tags", "geometry", ] LINKS_COLUMNS = [ @@ -98,6 +109,115 @@ def export_clean_csv(df, columns, output_file): return None +def create_geometries(network, crs=GEO_CRS): + """ + Create GeoDataFrames for different network components with specified coordinate reference system (CRS). + + Parameters: + network (PyPSA Network): The network object containing buses, lines, links, converters, and transformers data. + crs (str, optional): Coordinate reference system to be used for the GeoDataFrames. Defaults to GEO_CRS. + + Returns: + tuple: A tuple containing the following GeoDataFrames: + - buses (GeoDataFrame): GeoDataFrame containing bus data with geometries. + - lines (GeoDataFrame): GeoDataFrame containing line data with geometries. + - links (GeoDataFrame): GeoDataFrame containing link data with geometries. + - converters (GeoDataFrame): GeoDataFrame containing converter data with geometries. + - transformers (GeoDataFrame): GeoDataFrame containing transformer data with geometries. + """ + buses = network.buses.reset_index()[ + [ + "Bus", + "v_nom", + "dc", + "symbol", + "under_construction", + "tags", + "geometry", + ] + ] + buses["geometry"] = buses.geometry.apply(lambda x: loads(x)) + buses = gpd.GeoDataFrame(buses, geometry="geometry", crs=crs) + + lines = network.lines.reset_index()[ + [ + "Line", + "bus0", + "bus1", + "v_nom", + "i_nom", + "num_parallel", + "s_nom", + "r", + "x", + "b", + "length", + "underground", + "under_construction", + "type", + "tags", + "geometry", + ] + ] + # Create shapely linestring from geometry column + lines["geometry"] = lines.geometry.apply(lambda x: loads(x)) + lines = gpd.GeoDataFrame(lines, geometry="geometry", crs=crs) + + links = ( + network.links[~is_converter] + .reset_index() + .rename(columns={"voltage": "v_nom"})[ + [ + "Link", + "bus0", + "bus1", + "v_nom", + "p_nom", + "length", + "underground", + "under_construction", + "tags", + "geometry", + ] + ] + ) + links["geometry"] = links.geometry.apply(lambda x: loads(x)) + links = gpd.GeoDataFrame(links, geometry="geometry", crs=crs) + + converters = ( + network.links[is_converter] + .reset_index() + .rename(columns={"voltage": "v_nom"})[ + [ + "Link", + "bus0", + "bus1", + "v_nom", + "p_nom", + "geometry", + ] + ] + ) + converters["geometry"] = converters.geometry.apply(lambda x: loads(x)) + converters = gpd.GeoDataFrame(converters, geometry="geometry", crs=crs) + + transformers = network.transformers.reset_index()[ + [ + "Transformer", + "bus0", + "bus1", + "voltage_bus0", + "voltage_bus1", + "s_nom", + "geometry", + ] + ] + transformers["geometry"] = transformers.geometry.apply(lambda x: loads(x)) + transformers = gpd.GeoDataFrame(transformers, geometry="geometry", crs=crs) + + return buses, lines, links, converters, transformers + + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -107,8 +227,44 @@ def export_clean_csv(df, columns, output_file): configure_logging(snakemake) set_scenario_config(snakemake) + # Params + line_types = snakemake.params.line_types + network = pypsa.Network(snakemake.input.base_network) + logger.info("Re-adding line types to network.") + # Re-add line types + network.lines.loc[:, "type"] = network.lines.v_nom.apply( + lambda x: _get_linetype_by_voltage(x, line_types) + ) + + # Calculate dependent variables (r, x) + logger.info("Calculating dependent variables for network (r, x).") + network.calculate_dependent_values() + + # i_nom + network.lines["i_nom"] = ( + (network.lines.s_nom / network.lines.v_nom / network.lines.num_parallel) + .div(np.sqrt(3)) + .round(3) + ) # kA + + # Rounding of dependent values + network.lines.s_nom = network.lines.s_nom.round(3) + network.lines.r = network.lines.r.round(6) + network.lines.x = network.lines.x.round(6) + network.lines.b = network.lines.b.round(8) + + # Convert v_nom and num_parallel to integers + network.buses.v_nom = network.buses.v_nom.astype(int) + network.lines.v_nom = network.lines.v_nom.astype(int) + network.lines.num_parallel = network.lines.num_parallel.astype(int) + network.links.voltage = network.links.voltage.astype(int) + network.links.p_nom = network.links.p_nom.astype(int) + network.transformers.voltage_bus0 = network.transformers.voltage_bus0.astype(int) + network.transformers.voltage_bus1 = network.transformers.voltage_bus1.astype(int) + network.transformers.s_nom = network.transformers.s_nom.astype(int) + network.buses["dc"] = network.buses.pop("carrier").map({"DC": "t", "AC": "f"}) network.lines.length = network.lines.length * 1e3 network.links.length = network.links.length * 1e3 @@ -153,4 +309,122 @@ def export_clean_csv(df, columns, output_file): network.links[is_converter], CONVERTERS_COLUMNS, snakemake.output.converters ) + ### Create interactive map + buses, lines, links, converters, transformers = create_geometries( + network, crs=GEO_CRS + ) + stations_polygon = gpd.read_file(snakemake.input.stations_polygon) + buses_polygon = gpd.read_file(snakemake.input.buses_polygon) + + # Only keep stations_polygon that contain buses points + stations_polygon = gpd.sjoin( + stations_polygon, buses, how="left", predicate="contains" + ) + stations_polygon = stations_polygon[stations_polygon.index_right.notnull()] + stations_polygon = stations_polygon.drop_duplicates(subset=["station_id"]) + stations_polygon = stations_polygon[["station_id", "geometry"]] + + buses_polygon = gpd.sjoin(buses_polygon, buses, how="left", predicate="contains") + buses_polygon = buses_polygon[buses_polygon.index_right.notnull()] + buses_polygon = buses_polygon.drop_duplicates(subset=["bus_id", "dc_left"]) + buses_polygon.rename(columns={"dc_left": "dc"}, inplace=True) + buses_polygon = buses_polygon[["bus_id", "dc", "geometry"]] + + map = None + map = folium.Map(tiles="CartoDB positron", zoom_start=5, location=[53.5, 10]) + map = stations_polygon.loc[ + ( + stations_polygon.station_id.str.startswith("way") + | stations_polygon.station_id.str.startswith("relation") + ) + ].explore( + color="darkred", + popup=True, + m=map, + name="Clustered substations", + zindex=100, + ) + map = stations_polygon.loc[ + ~( + stations_polygon.station_id.str.startswith("way") + | stations_polygon.station_id.str.startswith("relation") + ) + ].explore( + color="grey", + popup=True, + m=map, + name="Clustered substations (virtual)", + zindex=101, + ) + map = buses_polygon.loc[buses_polygon.dc == False].explore( + color="yellow", + popup=True, + m=map, + name="Buses (AC)", + zindex=102, + ) + map = buses_polygon.loc[buses_polygon.dc == True].explore( + color="grey", + popup=True, + m=map, + name="Buses (DC)", + zindex=103, + ) + map = lines.explore( + color="rosybrown", + popup=True, + m=map, + name="Lines (AC)", + zindex=104, + ) + map = links.explore( + color="darkseagreen", + popup=True, + m=map, + name="Links (DC)", + zindex=105, + ) + map = transformers.explore( + color="orange", + popup=True, + m=map, + name="Transformers", + zindex=106, + ) + map = converters.explore( + color="purple", + popup=True, + m=map, + name="Converters", + zindex=107, + ) + map = buses.loc[buses.dc == "f"].explore( + color="red", + popup=True, + m=map, + name="Buses (AC, Points)", + zindex=108, + ) + map = buses.loc[buses.dc == "t"].explore( + color="black", + popup=True, + m=map, + name="Buses (DC, Points)", + zindex=109, + ) + # Add legend + folium.LayerControl(collapsed=False).add_to(map) + + map_title = "Prebuilt electricity high-voltage grid based on OpenStreetMap data" + map.get_root().html.add_child( + folium.Element( + f"

{map_title}

" + ) + ) + map + + # Export map + logger.info("Exporting interactive map.") + map.save(snakemake.output.map) + logger.info("Export of OSM network for release complete.") From feaceab19ba1b12b8699a234c84f321cd57cf949 Mon Sep 17 00:00:00 2001 From: Lukas Trippe Date: Tue, 10 Dec 2024 15:28:46 +0100 Subject: [PATCH 05/11] prepare for pypsa `0.32.0` (#1445) --- envs/environment.yaml | 2 +- scripts/make_summary.py | 4 +--- scripts/prepare_sector_network.py | 10 +++++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/envs/environment.yaml b/envs/environment.yaml index e52cf4348..631958eb9 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -11,7 +11,7 @@ dependencies: - pip # Inhouse packages -- pypsa>=0.31 +- pypsa>=0.32 - atlite>=0.2.9 - linopy - powerplantmatching>=0.5.15,<0.6 diff --git a/scripts/make_summary.py b/scripts/make_summary.py index 10a5ccefd..51698c787 100644 --- a/scripts/make_summary.py +++ b/scripts/make_summary.py @@ -540,14 +540,12 @@ def calculate_prices(n, label, prices): def calculate_weighted_prices(n, label, weighted_prices): - carriers = n.buses.carrier.unique() for carrier in carriers: - grouper = n.statistics.groupers.get_bus_and_carrier load = ( n.statistics.withdrawal( - groupby=grouper, + groupby=pypsa.statistics.groupers["bus", "carrier"], aggregate_time=False, nice_names=False, bus_carrier=carrier, diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1709e8201..7332c5947 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2175,7 +2175,7 @@ def add_heat( # add resource heat_carrier = f"{heat_system} {heat_source} heat" n.add("Carrier", heat_carrier) - n.madd( + n.add( "Bus", nodes, suffix=f" {heat_carrier}", @@ -2196,7 +2196,7 @@ def add_heat( else: capital_cost = 0.0 lifetime = np.inf - n.madd( + n.add( "Generator", nodes, suffix=f" {heat_carrier}", @@ -2209,7 +2209,7 @@ def add_heat( ) # add heat pump converting source heat + electricity to urban central heat - n.madd( + n.add( "Link", nodes, suffix=f" {heat_system} {heat_source} heat pump", @@ -2237,7 +2237,7 @@ def add_heat( .reindex(index=n.snapshots) ) # add link for direct usage of heat source when source temperature exceeds forward temperature - n.madd( + n.add( "Link", nodes, suffix=f" {heat_system} {heat_source} heat direct utilisation", @@ -2248,7 +2248,7 @@ def add_heat( p_nom_extendable=True, ) else: - n.madd( + n.add( "Link", nodes, suffix=f" {heat_system} {heat_source} heat pump", From 72a041362052508a97f8a8cae1a147fb960cde3f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 16:55:09 +0100 Subject: [PATCH 06/11] [github-actions.ci] Update pinned envs (#1446) * Update pinned environment files for all platforms * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: lkstrp <62255395+lkstrp@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- envs/linux-pinned.yaml | 122 ++++++++++++++++---------------------- envs/macos-pinned.yaml | 121 +++++++++++++++----------------------- envs/windows-pinned.yaml | 124 ++++++++++++++------------------------- 3 files changed, 141 insertions(+), 226 deletions(-) diff --git a/envs/linux-pinned.yaml b/envs/linux-pinned.yaml index 869915826..1d7d70731 100644 --- a/envs/linux-pinned.yaml +++ b/envs/linux-pinned.yaml @@ -13,28 +13,28 @@ dependencies: - _openmp_mutex=4.5 - affine=2.4.0 - alsa-lib=1.2.13 -- ampl-mp=3.1.0 +- ampl-asl=1.0.0 - amply=0.1.6 - aom=3.9.1 - appdirs=1.4.4 - argparse-dataclass=2.0.0 -- asttokens=2.4.1 +- asttokens=3.0.0 - atk-1.0=2.38.0 - atlite=0.3.0 - attrs=24.2.0 - aws-c-auth=0.8.0 -- aws-c-cal=0.8.0 -- aws-c-common=0.10.3 +- aws-c-cal=0.8.1 +- aws-c-common=0.10.5 - aws-c-compression=0.3.0 - aws-c-event-stream=0.5.0 -- aws-c-http=0.9.1 -- aws-c-io=0.15.2 +- aws-c-http=0.9.2 +- aws-c-io=0.15.3 - aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.2 +- aws-c-s3=0.7.5 - aws-c-sdkutils=0.2.1 - aws-checksums=0.2.2 -- aws-crt-cpp=0.29.6 -- aws-sdk-cpp=1.11.449 +- aws-crt-cpp=0.29.7 +- aws-sdk-cpp=1.11.458 - azure-core-cpp=1.14.0 - azure-identity-cpp=1.10.0 - azure-storage-blobs-cpp=12.13.0 @@ -42,7 +42,7 @@ dependencies: - azure-storage-files-datalake-cpp=12.12.0 - beautifulsoup4=4.12.3 - blosc=1.21.6 -- bokeh=3.6.1 +- bokeh=3.6.2 - bottleneck=1.4.2 - branca=0.7.2 - brotli=1.1.0 @@ -52,14 +52,12 @@ dependencies: - c-ares=1.34.3 - c-blosc2=2.15.2 - ca-certificates=2024.8.30 -- cairo=1.18.0 -- capnproto=1.0.2 +- cairo=1.18.2 - cartopy=0.24.0 - cdsapi=0.7.5 - certifi=2024.8.30 - cffi=1.17.1 - cfgv=3.3.1 -- cfitsio=4.4.1 - cftime=1.6.4 - charset-normalizer=3.4.0 - click=8.1.7 @@ -82,9 +80,9 @@ dependencies: - cycler=0.12.1 - cyrus-sasl=2.1.27 - cytoolz=1.0.0 -- dask=2024.11.2 -- dask-core=2024.11.2 -- dask-expr=1.1.19 +- dask=2024.12.0 +- dask-core=2024.12.0 +- dask-expr=1.1.20 - datapi=0.1.1 - datrie=0.8.2 - dav1d=1.2.1 @@ -93,7 +91,7 @@ dependencies: - deprecation=2.1.0 - descartes=1.1.0 - distlib=0.3.9 -- distributed=2024.11.2 +- distributed=2024.12.0 - docutils=0.21.2 - double-conversion=3.3.0 - dpath=2.2.0 @@ -104,7 +102,6 @@ dependencies: - expat=2.6.4 - filelock=3.16.1 - fiona=1.10.1 -- fmt=11.0.2 - folium=0.18.0 - font-ttf-dejavu-sans-mono=2.37 - font-ttf-inconsolata=3.000 @@ -113,12 +110,11 @@ dependencies: - fontconfig=2.15.0 - fonts-conda-ecosystem=1 - fonts-conda-forge=1 -- fonttools=4.55.0 +- fonttools=4.55.2 - freetype=2.12.1 - freexl=2.0.0 - fribidi=1.0.10 - fsspec=2024.10.0 -- gdal=3.10.0 - gdk-pixbuf=2.42.12 - geographiclib=2.0 - geojson=3.1.0 @@ -142,7 +138,7 @@ dependencies: - h2=4.1.0 - harfbuzz=9.0.0 - hdf4=4.2.15 -- hdf5=1.14.3 +- hdf5=1.14.4 - hpack=4.0.0 - humanfriendly=10.0 - hyperframe=6.0.1 @@ -154,7 +150,7 @@ dependencies: - importlib_resources=6.4.5 - iniconfig=2.0.0 - ipopt=3.14.16 -- ipython=8.29.0 +- ipython=8.30.0 - jedi=0.19.2 - jinja2=3.1.4 - joblib=1.4.2 @@ -163,7 +159,6 @@ dependencies: - jsonschema=4.23.0 - jsonschema-specifications=2024.10.1 - jupyter_core=5.7.2 -- kealib=1.5.3 - keyutils=1.6.1 - kiwisolver=1.4.7 - krb5=1.21.3 @@ -183,14 +178,14 @@ dependencies: - libbrotlidec=1.1.0 - libbrotlienc=1.1.0 - libcblas=3.9.0 -- libclang-cpp19.1=19.1.4 -- libclang13=19.1.4 +- libclang-cpp19.1=19.1.5 +- libclang13=19.1.5 - libcrc32c=1.1.2 - libcups=2.3.3 - libcurl=8.10.1 - libde265=1.0.15 - libdeflate=1.22 -- libdrm=2.4.123 +- libdrm=2.4.124 - libedit=3.1.20191231 - libegl=1.7.0 - libev=4.33 @@ -200,20 +195,7 @@ dependencies: - libgcc=14.2.0 - libgcc-ng=14.2.0 - libgd=2.3.3 -- libgdal=3.10.0 - libgdal-core=3.10.0 -- libgdal-fits=3.10.0 -- libgdal-grib=3.10.0 -- libgdal-hdf4=3.10.0 -- libgdal-hdf5=3.10.0 -- libgdal-jp2openjpeg=3.10.0 -- libgdal-kea=3.10.0 -- libgdal-netcdf=3.10.0 -- libgdal-pdf=3.10.0 -- libgdal-pg=3.10.0 -- libgdal-postgisraster=3.10.0 -- libgdal-tiledb=3.10.0 -- libgdal-xls=3.10.0 - libgfortran=14.2.0 - libgfortran-ng=14.2.0 - libgfortran5=14.2.0 @@ -232,7 +214,9 @@ dependencies: - libkml=1.3.0 - liblapack=3.9.0 - liblapacke=3.9.0 -- libllvm19=19.1.4 +- libllvm19=19.1.5 +- liblzma=5.6.3 +- liblzma-devel=5.6.3 - libnetcdf=4.9.2 - libnghttp2=1.64.0 - libnsl=2.0.1 @@ -250,13 +234,13 @@ dependencies: - libscotch=7.0.4 - libspatialite=5.1.0 - libspral=2024.05.08 -- libsqlite=3.47.0 +- libsqlite=3.47.2 - libssh2=1.11.1 - libstdcxx=14.2.0 - libstdcxx-ng=14.2.0 - libthrift=0.21.0 - libtiff=4.7.0 -- libutf8proc=2.8.0 +- libutf8proc=2.9.0 - libuuid=2.38.1 - libwebp-base=1.4.0 - libxcb=1.17.0 @@ -266,7 +250,7 @@ dependencies: - libxslt=1.1.39 - libzip=1.11.2 - libzlib=1.3.1 -- linopy=0.4.2 +- linopy=0.4.3 - locket=1.0.0 - lxml=5.3.0 - lz4=4.3.3 @@ -274,8 +258,8 @@ dependencies: - lzo=2.10 - mapclassify=2.8.1 - markupsafe=3.0.2 -- matplotlib=3.9.2 -- matplotlib-base=3.9.2 +- matplotlib=3.9.3 +- matplotlib-base=3.9.3 - matplotlib-inline=0.1.7 - memory_profiler=0.61.0 - metis=5.1.0 @@ -290,15 +274,13 @@ dependencies: - mysql-libs=9.0.1 - nbformat=5.10.4 - ncurses=6.5 -- netcdf4=1.7.1 +- netcdf4=1.7.2 - networkx=3.4.2 - nodeenv=1.9.1 - nomkl=1.0 -- nspr=4.36 -- nss=3.107 - numexpr=2.10.2 - numpy=1.26.4 -- openjpeg=2.5.2 +- openjpeg=2.5.3 - openldap=2.6.9 - openpyxl=3.1.5 - openssl=3.4.0 @@ -314,19 +296,16 @@ dependencies: - pickleshare=0.7.5 - pillow=11.0.0 - pip=24.3.1 -- pixman=0.43.2 +- pixman=0.44.2 - pkgutil-resolve-name=1.3.10 - plac=1.4.3 - platformdirs=4.3.6 - pluggy=1.5.0 -- polars=1.15.0 -- poppler=24.08.0 -- poppler-data=0.4.12 -- postgresql=17.2 +- polars=1.17.1 - powerplantmatching=0.5.19 - pre-commit=4.0.1 - progressbar2=4.5.0 -- proj=9.5.0 +- proj=9.5.1 - prompt-toolkit=3.0.48 - psutil=6.1.0 - pthread-stubs=0.4 @@ -342,16 +321,16 @@ dependencies: - pyogrio=0.10.0 - pyparsing=3.2.0 - pyproj=3.7.0 -- pypsa=0.31.2 +- pypsa=0.32.0 - pyscipopt=5.2.1 - pyshp=2.3.1 - pyside6=6.8.0.2 - pysocks=1.7.1 - pytables=3.10.1 -- pytest=8.3.3 -- python=3.12.7 +- pytest=8.3.4 +- python=3.12.8 - python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.21.0 +- python-fastjsonschema=2.21.1 - python-tzdata=2024.2 - python-utils=3.9.1 - python_abi=3.12 @@ -360,7 +339,7 @@ dependencies: - pyyaml=6.0.2 - qhull=2020.2 - qt6-main=6.8.0 -- rasterio=1.4.2 +- rasterio=1.4.3 - rav1e=0.6.6 - re2=2024.07.02 - readline=8.2 @@ -368,16 +347,16 @@ dependencies: - requests=2.32.3 - reretry=0.11.8 - rioxarray=0.17.0 -- rpds-py=0.21.0 +- rpds-py=0.22.3 - s2n=1.5.9 -- scikit-learn=1.5.2 +- scikit-learn=1.6.0 - scip=9.1.1 - scipy=1.14.1 - seaborn=0.13.2 - seaborn-base=0.13.2 - setuptools=75.6.0 - shapely=2.0.6 -- six=1.16.0 +- six=1.17.0 - smart_open=7.0.5 - smmap=5.0.0 - snakemake-interface-common=1.17.4 @@ -389,9 +368,8 @@ dependencies: - snuggs=1.4.7 - sortedcontainers=2.4.0 - soupsieve=2.5 -- spdlog=1.14.1 -- sqlite=3.47.0 -- stack_data=0.6.2 +- sqlite=3.47.2 +- stack_data=0.6.3 - statsmodels=0.14.4 - svt-av1=2.3.0 - tabulate=0.9.0 @@ -399,21 +377,18 @@ dependencies: - tblib=3.0.0 - threadpoolctl=3.5.0 - throttler=1.2.2 -- tiledb=2.26.2 - tk=8.6.13 -- tomli=2.1.0 +- tomli=2.2.1 - toolz=1.0.0 - tornado=6.4.2 - tqdm=4.67.1 - traitlets=5.14.3 - typing-extensions=4.12.2 - typing_extensions=4.12.2 -- tzcode=2024b - tzdata=2024b - ukkonen=1.0.1 - unicodedata2=15.1.0 - unidecode=1.3.8 -- unixodbc=2.3.12 - uriparser=0.9.8 - urllib3=2.2.3 - validators=0.34.0 @@ -448,11 +423,12 @@ dependencies: - xorg-libxrender=0.9.11 - xorg-libxtst=1.2.5 - xorg-libxxf86vm=1.1.5 -- xorg-xorgproto=2024.1 - xyzservices=2024.9.0 -- xz=5.2.6 +- xz=5.6.3 +- xz-gpl-tools=5.6.3 +- xz-tools=5.6.3 - yaml=0.2.5 -- yte=1.5.4 +- yte=1.5.5 - zict=3.0.0 - zipp=3.21.0 - zlib=1.3.1 diff --git a/envs/macos-pinned.yaml b/envs/macos-pinned.yaml index ccd10868d..a434ee111 100644 --- a/envs/macos-pinned.yaml +++ b/envs/macos-pinned.yaml @@ -10,28 +10,28 @@ channels: - https://repo.anaconda.com/pkgs/r dependencies: - affine=2.4.0 -- ampl-mp=3.1.0 +- ampl-asl=1.0.0 - amply=0.1.6 - aom=3.9.1 - appdirs=1.4.4 - argparse-dataclass=2.0.0 -- asttokens=2.4.1 +- asttokens=3.0.0 - atk-1.0=2.38.0 - atlite=0.3.0 - attrs=24.2.0 - aws-c-auth=0.8.0 -- aws-c-cal=0.8.0 -- aws-c-common=0.10.3 +- aws-c-cal=0.8.1 +- aws-c-common=0.10.5 - aws-c-compression=0.3.0 - aws-c-event-stream=0.5.0 -- aws-c-http=0.9.1 -- aws-c-io=0.15.2 +- aws-c-http=0.9.2 +- aws-c-io=0.15.3 - aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.2 +- aws-c-s3=0.7.5 - aws-c-sdkutils=0.2.1 - aws-checksums=0.2.2 -- aws-crt-cpp=0.29.6 -- aws-sdk-cpp=1.11.449 +- aws-crt-cpp=0.29.7 +- aws-sdk-cpp=1.11.458 - azure-core-cpp=1.14.0 - azure-identity-cpp=1.10.0 - azure-storage-blobs-cpp=12.13.0 @@ -39,7 +39,7 @@ dependencies: - azure-storage-files-datalake-cpp=12.12.0 - beautifulsoup4=4.12.3 - blosc=1.21.6 -- bokeh=3.6.1 +- bokeh=3.6.2 - bottleneck=1.4.2 - branca=0.7.2 - brotli=1.1.0 @@ -49,14 +49,12 @@ dependencies: - c-ares=1.34.3 - c-blosc2=2.15.2 - ca-certificates=2024.8.30 -- cairo=1.18.0 -- capnproto=1.0.2 +- cairo=1.18.2 - cartopy=0.24.0 - cdsapi=0.7.5 - certifi=2024.8.30 - cffi=1.17.1 - cfgv=3.3.1 -- cfitsio=4.4.1 - cftime=1.6.4 - charset-normalizer=3.4.0 - click=8.1.7 @@ -77,11 +75,10 @@ dependencies: - country_converter=1.2 - cppad=20240000.7 - cycler=0.12.1 -- cyrus-sasl=2.1.27 - cytoolz=1.0.0 -- dask=2024.11.2 -- dask-core=2024.11.2 -- dask-expr=1.1.19 +- dask=2024.12.0 +- dask-core=2024.12.0 +- dask-expr=1.1.20 - datapi=0.1.1 - datrie=0.8.2 - dav1d=1.2.1 @@ -89,7 +86,7 @@ dependencies: - deprecation=2.1.0 - descartes=1.1.0 - distlib=0.3.9 -- distributed=2024.11.2 +- distributed=2024.12.0 - docutils=0.21.2 - dpath=2.2.0 - entsoe-py=0.6.11 @@ -98,7 +95,6 @@ dependencies: - executing=2.1.0 - filelock=3.16.1 - fiona=1.10.1 -- fmt=11.0.2 - folium=0.18.0 - font-ttf-dejavu-sans-mono=2.37 - font-ttf-inconsolata=3.000 @@ -107,12 +103,11 @@ dependencies: - fontconfig=2.15.0 - fonts-conda-ecosystem=1 - fonts-conda-forge=1 -- fonttools=4.55.0 +- fonttools=4.55.2 - freetype=2.12.1 - freexl=2.0.0 - fribidi=1.0.10 - fsspec=2024.10.0 -- gdal=3.10.0 - gdk-pixbuf=2.42.12 - geographiclib=2.0 - geojson=3.1.0 @@ -136,7 +131,7 @@ dependencies: - h2=4.1.0 - harfbuzz=9.0.0 - hdf4=4.2.15 -- hdf5=1.14.3 +- hdf5=1.14.4 - hpack=4.0.0 - humanfriendly=10.0 - hyperframe=6.0.1 @@ -148,7 +143,7 @@ dependencies: - importlib_resources=6.4.5 - iniconfig=2.0.0 - ipopt=3.14.16 -- ipython=8.29.0 +- ipython=8.30.0 - jedi=0.19.2 - jinja2=3.1.4 - joblib=1.4.2 @@ -157,7 +152,6 @@ dependencies: - jsonschema=4.23.0 - jsonschema-specifications=2024.10.1 - jupyter_core=5.7.2 -- kealib=1.5.3 - kiwisolver=1.4.7 - krb5=1.21.3 - lcms2=2.16 @@ -177,7 +171,7 @@ dependencies: - libcblas=3.9.0 - libcrc32c=1.1.2 - libcurl=8.10.1 -- libcxx=19.1.4 +- libcxx=19.1.5 - libde265=1.0.15 - libdeflate=1.22 - libedit=3.1.20191231 @@ -186,20 +180,7 @@ dependencies: - libexpat=2.6.4 - libffi=3.4.2 - libgd=2.3.3 -- libgdal=3.10.0 - libgdal-core=3.10.0 -- libgdal-fits=3.10.0 -- libgdal-grib=3.10.0 -- libgdal-hdf4=3.10.0 -- libgdal-hdf5=3.10.0 -- libgdal-jp2openjpeg=3.10.0 -- libgdal-kea=3.10.0 -- libgdal-netcdf=3.10.0 -- libgdal-pdf=3.10.0 -- libgdal-pg=3.10.0 -- libgdal-postgisraster=3.10.0 -- libgdal-tiledb=3.10.0 -- libgdal-xls=3.10.0 - libgfortran=5.0.0 - libgfortran5=13.2.0 - libglib=2.82.2 @@ -214,32 +195,32 @@ dependencies: - libkml=1.3.0 - liblapack=3.9.0 - liblapacke=3.9.0 +- liblzma=5.6.3 +- liblzma-devel=5.6.3 - libnetcdf=4.9.2 - libnghttp2=1.64.0 -- libntlm=1.4 - libopenblas=0.3.28 - libparquet=18.1.0 - libpng=1.6.44 -- libpq=17.2 - libprotobuf=5.28.2 - libre2-11=2024.07.02 - librsvg=2.58.4 - librttopo=1.1.0 - libscotch=7.0.5 - libspatialite=5.1.0 -- libsqlite=3.47.0 +- libsqlite=3.47.2 - libssh2=1.11.1 - libthrift=0.21.0 - libtiff=4.7.0 -- libutf8proc=2.8.0 +- libutf8proc=2.9.0 - libwebp-base=1.4.0 - libxcb=1.17.0 - libxml2=2.13.5 - libxslt=1.1.39 - libzip=1.11.2 - libzlib=1.3.1 -- linopy=0.4.2 -- llvm-openmp=19.1.4 +- linopy=0.4.3 +- llvm-openmp=19.1.5 - locket=1.0.0 - lxml=5.3.0 - lz4=4.3.3 @@ -247,8 +228,8 @@ dependencies: - lzo=2.10 - mapclassify=2.8.1 - markupsafe=3.0.2 -- matplotlib=3.9.2 -- matplotlib-base=3.9.2 +- matplotlib=3.9.3 +- matplotlib-base=3.9.3 - matplotlib-inline=0.1.7 - memory_profiler=0.61.0 - metis=5.1.0 @@ -261,15 +242,12 @@ dependencies: - munkres=1.1.4 - nbformat=5.10.4 - ncurses=6.5 -- netcdf4=1.7.1 +- netcdf4=1.7.2 - networkx=3.4.2 - nodeenv=1.9.1 -- nspr=4.36 -- nss=3.107 - numexpr=2.10.2 - numpy=1.26.4 -- openjpeg=2.5.2 -- openldap=2.6.9 +- openjpeg=2.5.3 - openpyxl=3.1.5 - openssl=3.4.0 - orc=2.0.3 @@ -284,19 +262,16 @@ dependencies: - pickleshare=0.7.5 - pillow=11.0.0 - pip=24.3.1 -- pixman=0.43.4 +- pixman=0.44.2 - pkgutil-resolve-name=1.3.10 - plac=1.4.3 - platformdirs=4.3.6 - pluggy=1.5.0 -- polars=1.15.0 -- poppler=24.11.0 -- poppler-data=0.4.12 -- postgresql=17.2 +- polars=1.17.1 - powerplantmatching=0.5.19 - pre-commit=4.0.1 - progressbar2=4.5.0 -- proj=9.5.0 +- proj=9.5.1 - prompt-toolkit=3.0.48 - psutil=6.1.0 - pthread-stubs=0.4 @@ -312,15 +287,15 @@ dependencies: - pyogrio=0.10.0 - pyparsing=3.2.0 - pyproj=3.7.0 -- pypsa=0.31.2 +- pypsa=0.32.0 - pyscipopt=5.2.1 - pyshp=2.3.1 - pysocks=1.7.1 - pytables=3.10.1 -- pytest=8.3.3 -- python=3.12.7 +- pytest=8.3.4 +- python=3.12.8 - python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.21.0 +- python-fastjsonschema=2.21.1 - python-tzdata=2024.2 - python-utils=3.9.1 - python_abi=3.12 @@ -328,7 +303,7 @@ dependencies: - pyxlsb=1.0.10 - pyyaml=6.0.2 - qhull=2020.2 -- rasterio=1.4.2 +- rasterio=1.4.3 - rav1e=0.6.6 - re2=2024.07.02 - readline=8.2 @@ -336,15 +311,15 @@ dependencies: - requests=2.32.3 - reretry=0.11.8 - rioxarray=0.17.0 -- rpds-py=0.21.0 -- scikit-learn=1.5.2 +- rpds-py=0.22.3 +- scikit-learn=1.6.0 - scip=9.1.1 - scipy=1.14.1 - seaborn=0.13.2 - seaborn-base=0.13.2 - setuptools=75.6.0 - shapely=2.0.6 -- six=1.16.0 +- six=1.17.0 - smart_open=7.0.5 - smmap=5.0.0 - snakemake-interface-common=1.17.4 @@ -356,9 +331,8 @@ dependencies: - snuggs=1.4.7 - sortedcontainers=2.4.0 - soupsieve=2.5 -- spdlog=1.14.1 -- sqlite=3.47.0 -- stack_data=0.6.2 +- sqlite=3.47.2 +- stack_data=0.6.3 - statsmodels=0.14.4 - svt-av1=2.3.0 - tabulate=0.9.0 @@ -366,21 +340,18 @@ dependencies: - tblib=3.0.0 - threadpoolctl=3.5.0 - throttler=1.2.2 -- tiledb=2.26.2 - tk=8.6.13 -- tomli=2.1.0 +- tomli=2.2.1 - toolz=1.0.0 - tornado=6.4.2 - tqdm=4.67.1 - traitlets=5.14.3 - typing-extensions=4.12.2 - typing_extensions=4.12.2 -- tzcode=2024b - tzdata=2024b - ukkonen=1.0.1 - unicodedata2=15.1.0 - unidecode=1.3.8 -- unixodbc=2.3.12 - uriparser=0.9.8 - urllib3=2.2.3 - validators=0.34.0 @@ -395,9 +366,11 @@ dependencies: - xorg-libxau=1.0.11 - xorg-libxdmcp=1.1.5 - xyzservices=2024.9.0 -- xz=5.2.6 +- xz=5.6.3 +- xz-gpl-tools=5.6.3 +- xz-tools=5.6.3 - yaml=0.2.5 -- yte=1.5.4 +- yte=1.5.5 - zict=3.0.0 - zipp=3.21.0 - zlib=1.3.1 diff --git a/envs/windows-pinned.yaml b/envs/windows-pinned.yaml index b070a88ad..fcd9faa66 100644 --- a/envs/windows-pinned.yaml +++ b/envs/windows-pinned.yaml @@ -17,29 +17,25 @@ dependencies: - aom=3.9.1 - appdirs=1.4.4 - argparse-dataclass=2.0.0 -- asttokens=2.4.1 +- asttokens=3.0.0 - atlite=0.3.0 - attrs=24.2.0 - aws-c-auth=0.8.0 -- aws-c-cal=0.8.0 -- aws-c-common=0.10.3 +- aws-c-cal=0.8.1 +- aws-c-common=0.10.5 - aws-c-compression=0.3.0 - aws-c-event-stream=0.5.0 -- aws-c-http=0.9.1 -- aws-c-io=0.15.2 +- aws-c-http=0.9.2 +- aws-c-io=0.15.3 - aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.2 +- aws-c-s3=0.7.5 - aws-c-sdkutils=0.2.1 - aws-checksums=0.2.2 -- aws-crt-cpp=0.29.6 -- aws-sdk-cpp=1.11.449 -- azure-core-cpp=1.14.0 -- azure-identity-cpp=1.10.0 -- azure-storage-blobs-cpp=12.13.0 -- azure-storage-common-cpp=12.8.0 +- aws-crt-cpp=0.29.7 +- aws-sdk-cpp=1.11.458 - beautifulsoup4=4.12.3 - blosc=1.21.6 -- bokeh=3.6.1 +- bokeh=3.6.2 - bottleneck=1.4.2 - branca=0.7.2 - brotli=1.1.0 @@ -49,14 +45,12 @@ dependencies: - c-ares=1.34.3 - c-blosc2=2.15.2 - ca-certificates=2024.8.30 -- cairo=1.18.0 -- capnproto=1.0.2 +- cairo=1.18.2 - cartopy=0.24.0 - cdsapi=0.7.5 - certifi=2024.8.30 - cffi=1.17.1 - cfgv=3.3.1 -- cfitsio=4.4.1 - cftime=1.6.4 - charset-normalizer=3.4.0 - click=8.1.7 @@ -70,12 +64,12 @@ dependencies: - contourpy=1.3.1 - country_converter=1.2 - cppad=20240000.7 -- cpython=3.12.7 +- cpython=3.12.8 - cycler=0.12.1 - cytoolz=1.0.0 -- dask=2024.11.2 -- dask-core=2024.11.2 -- dask-expr=1.1.19 +- dask=2024.12.0 +- dask-core=2024.12.0 +- dask-expr=1.1.20 - datapi=0.1.1 - datrie=0.8.2 - dav1d=1.2.1 @@ -83,7 +77,7 @@ dependencies: - deprecation=2.1.0 - descartes=1.1.0 - distlib=0.3.9 -- distributed=2024.11.2 +- distributed=2024.12.0 - docutils=0.21.2 - double-conversion=3.3.0 - dpath=2.2.0 @@ -93,7 +87,6 @@ dependencies: - executing=2.1.0 - filelock=3.16.1 - fiona=1.10.1 -- fmt=11.0.2 - folium=0.18.0 - font-ttf-dejavu-sans-mono=2.37 - font-ttf-inconsolata=3.000 @@ -102,12 +95,11 @@ dependencies: - fontconfig=2.15.0 - fonts-conda-ecosystem=1 - fonts-conda-forge=1 -- fonttools=4.55.0 +- fonttools=4.55.2 - freetype=2.12.1 - freexl=2.0.0 - fribidi=1.0.10 - fsspec=2024.10.0 -- gdal=3.10.0 - geographiclib=2.0 - geojson=3.1.0 - geojson-rewind=1.1.0 @@ -119,19 +111,15 @@ dependencies: - getopt-win32=0.1 - gitdb=4.0.11 - gitpython=3.1.43 -- glib=2.82.2 -- glib-tools=2.82.2 - glpk=5.0 - gmp=6.3.0 - graphite2=1.3.13 - graphviz=12.0.0 -- gst-plugins-base=1.24.7 -- gstreamer=1.24.7 - gts=0.7.6 - h2=4.1.0 - harfbuzz=9.0.0 - hdf4=4.2.15 -- hdf5=1.14.3 +- hdf5=1.14.4 - hpack=4.0.0 - humanfriendly=10.0 - hyperframe=6.0.1 @@ -143,7 +131,7 @@ dependencies: - importlib_resources=6.4.5 - iniconfig=2.0.0 - ipopt=3.14.16 -- ipython=8.29.0 +- ipython=8.30.0 - jedi=0.19.2 - jinja2=3.1.4 - joblib=1.4.2 @@ -151,7 +139,6 @@ dependencies: - jsonschema=4.23.0 - jsonschema-specifications=2024.10.1 - jupyter_core=5.7.2 -- kealib=1.5.3 - kiwisolver=1.4.7 - krb5=1.21.3 - lcms2=2.16 @@ -170,7 +157,7 @@ dependencies: - libbrotlidec=1.1.0 - libbrotlienc=1.1.0 - libcblas=3.9.0 -- libclang13=19.1.4 +- libclang13=19.1.5 - libcrc32c=1.1.2 - libcurl=8.10.1 - libde265=1.0.15 @@ -181,20 +168,7 @@ dependencies: - libflang=5.0.0 - libgcc=14.2.0 - libgd=2.3.3 -- libgdal=3.10.0 - libgdal-core=3.10.0 -- libgdal-fits=3.10.0 -- libgdal-grib=3.10.0 -- libgdal-hdf4=3.10.0 -- libgdal-hdf5=3.10.0 -- libgdal-jp2openjpeg=3.10.0 -- libgdal-kea=3.10.0 -- libgdal-netcdf=3.10.0 -- libgdal-pdf=3.10.0 -- libgdal-pg=3.10.0 -- libgdal-postgisraster=3.10.0 -- libgdal-tiledb=3.10.0 -- libgdal-xls=3.10.0 - libglib=2.82.2 - libgomp=14.2.0 - libgoogle-cloud=2.31.0 @@ -204,26 +178,24 @@ dependencies: - libhwloc=2.11.2 - libiconv=1.17 - libintl=0.22.5 -- libintl-devel=0.22.5 - libjpeg-turbo=3.0.0 - libkml=1.3.0 - liblapack=3.9.0 +- liblzma=5.6.3 +- liblzma-devel=5.6.3 - libnetcdf=4.9.2 -- libogg=1.3.5 - libopenblas=0.3.28 - libparquet=18.1.0 - libpng=1.6.44 -- libpq=17.2 - libprotobuf=5.28.2 - libre2-11=2024.07.02 - librttopo=1.1.0 - libspatialite=5.1.0 -- libsqlite=3.47.0 +- libsqlite=3.47.2 - libssh2=1.11.1 - libthrift=0.21.0 - libtiff=4.7.0 -- libutf8proc=2.8.0 -- libvorbis=1.3.7 +- libutf8proc=2.9.0 - libwebp-base=1.4.0 - libwinpthread=12.0.0.r4.gg4f2fc60ca - libxcb=1.17.0 @@ -231,7 +203,7 @@ dependencies: - libxslt=1.1.39 - libzip=1.11.2 - libzlib=1.3.1 -- linopy=0.4.2 +- linopy=0.4.3 - llvm-meta=5.0.0 - locket=1.0.0 - lxml=5.3.0 @@ -240,8 +212,8 @@ dependencies: - lzo=2.10 - mapclassify=2.8.1 - markupsafe=3.0.2 -- matplotlib=3.9.2 -- matplotlib-base=3.9.2 +- matplotlib=3.9.3 +- matplotlib-base=3.9.3 - matplotlib-inline=0.1.7 - memory_profiler=0.61.0 - minizip=4.0.6 @@ -251,13 +223,13 @@ dependencies: - mumps-seq=5.7.3 - munkres=1.1.4 - nbformat=5.10.4 -- netcdf4=1.7.1 +- netcdf4=1.7.2 - networkx=3.4.2 - nodeenv=1.9.1 - nomkl=1.0 - numexpr=2.10.2 - numpy=1.26.4 -- openjpeg=2.5.2 +- openjpeg=2.5.3 - openmp=5.0.0 - openpyxl=3.1.5 - openssl=3.4.0 @@ -272,18 +244,15 @@ dependencies: - pickleshare=0.7.5 - pillow=11.0.0 - pip=24.3.1 -- pixman=0.43.4 +- pixman=0.44.2 - pkgutil-resolve-name=1.3.10 - plac=1.4.3 - platformdirs=4.3.6 - pluggy=1.5.0 -- poppler=24.11.0 -- poppler-data=0.4.12 -- postgresql=17.2 - powerplantmatching=0.5.19 - pre-commit=4.0.1 - progressbar2=4.5.0 -- proj=9.5.0 +- proj=9.5.1 - prompt-toolkit=3.0.48 - psutil=6.1.0 - pthread-stubs=0.4 @@ -298,17 +267,17 @@ dependencies: - pyogrio=0.10.0 - pyparsing=3.2.0 - pyproj=3.7.0 -- pypsa=0.31.2 +- pypsa=0.32.0 - pyreadline3=3.5.4 - pyscipopt=5.2.1 - pyshp=2.3.1 - pyside6=6.8.0.2 - pysocks=1.7.1 - pytables=3.10.1 -- pytest=8.3.3 -- python=3.12.7 +- pytest=8.3.4 +- python=3.12.8 - python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.21.0 +- python-fastjsonschema=2.21.1 - python-tzdata=2024.2 - python-utils=3.9.1 - python_abi=3.12 @@ -317,24 +286,23 @@ dependencies: - pyxlsb=1.0.10 - pyyaml=6.0.2 - qhull=2020.2 -- qt-main=5.15.15 - qt6-main=6.8.0 -- rasterio=1.4.2 +- rasterio=1.4.3 - rav1e=0.6.6 - re2=2024.07.02 - referencing=0.35.1 - requests=2.32.3 - reretry=0.11.8 - rioxarray=0.17.0 -- rpds-py=0.21.0 -- scikit-learn=1.5.2 +- rpds-py=0.22.3 +- scikit-learn=1.6.0 - scip=9.1.1 - scipy=1.14.1 - seaborn=0.13.2 - seaborn-base=0.13.2 - setuptools=75.6.0 - shapely=2.0.6 -- six=1.16.0 +- six=1.17.0 - smart_open=7.0.5 - smmap=5.0.0 - snakemake-interface-common=1.17.4 @@ -346,9 +314,8 @@ dependencies: - snuggs=1.4.7 - sortedcontainers=2.4.0 - soupsieve=2.5 -- spdlog=1.14.1 -- sqlite=3.47.0 -- stack_data=0.6.2 +- sqlite=3.47.2 +- stack_data=0.6.3 - statsmodels=0.14.4 - svt-av1=2.3.0 - tabulate=0.9.0 @@ -356,9 +323,8 @@ dependencies: - tblib=3.0.0 - threadpoolctl=3.5.0 - throttler=1.2.2 -- tiledb=2.26.2 - tk=8.6.13 -- tomli=2.1.0 +- tomli=2.2.1 - toolz=1.0.0 - tornado=6.4.2 - tqdm=4.67.1 @@ -393,11 +359,11 @@ dependencies: - xorg-libxext=1.3.6 - xorg-libxpm=3.5.17 - xorg-libxt=1.3.1 -- xorg-xorgproto=2024.1 - xyzservices=2024.9.0 -- xz=5.2.6 +- xz=5.6.3 +- xz-tools=5.6.3 - yaml=0.2.5 -- yte=1.5.4 +- yte=1.5.5 - zict=3.0.0 - zipp=3.21.0 - zlib=1.3.1 @@ -409,7 +375,7 @@ dependencies: - highspy==1.7.2 - oauthlib==3.2.2 - ply==3.11 - - polars==1.15.0 + - polars==1.17.1 - pyomo==6.8.2 - requests-oauthlib==1.3.1 - snakemake-executor-plugin-cluster-generic==1.0.9 From c7c664d3d7e3e8a3141fb7960d6488e7b2ba240e Mon Sep 17 00:00:00 2001 From: Lukas Trippe Date: Tue, 10 Dec 2024 17:16:56 +0100 Subject: [PATCH 07/11] fix: dont run pre-vommit in on pinned envs (#1447) --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 688aab8c6..356e0cdc2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -72,6 +72,7 @@ repos: rev: v2.14.0 hooks: - id: pretty-format-yaml + exclude: pinned\.yaml$ args: [--autofix, --indent, "2", --preserve-quotes] # Format Snakemake rule / workflow files From 212f9df5d8c32da143da1895bfc057cff0b79971 Mon Sep 17 00:00:00 2001 From: Fabrizio Finozzi <167071962+finozzifa@users.noreply.github.com> Date: Thu, 12 Dec 2024 18:42:55 +0100 Subject: [PATCH 08/11] Unit test base network (#1438) * code: add unit tests for base_network.py * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: pre-commit checks * code: add further unit tests base_network * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: new test * code: add unit test for _load_buses and sketch the one for _load_converters_from_osm * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * code: pre-commit * code: fix issue with test_load_buses * code: unit test for _load_converters_from_osm * data: add italy_shape.geojson * code: unit test for _load_converters_from_eg and _load_transformers * code: add unit test for _load_links_from_osm and _load_links_from_eg * code: add unit test for _load_lines * code: add unit test for _reconnect_crimea * code: add unit test for _set_electrical_parameters_lines_eg * code: add new unit tests * code: fixing unlink usage * code: config fixture - scope from function to session * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- scripts/base_network.py | 2 +- test/conftest.py | 89 +++- test/test_base_network.py | 675 +++++++++++++++++++++++++++++ test/test_build_powerplants.py | 5 +- test/test_data/italy_shape.geojson | 8 + 5 files changed, 774 insertions(+), 5 deletions(-) create mode 100644 test/test_base_network.py create mode 100644 test/test_data/italy_shape.geojson diff --git a/scripts/base_network.py b/scripts/base_network.py index 9a9be8ee3..8d953117c 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -90,7 +90,7 @@ from packaging.version import Version, parse from scipy.sparse import csgraph from scipy.spatial import KDTree -from shapely.geometry import LineString, Point +from shapely.geometry import Point PD_GE_2_2 = parse(pd.__version__) >= Version("2.2") diff --git a/test/conftest.py b/test/conftest.py index 13a0d1a9f..da08e75f6 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -7,6 +7,7 @@ import pathlib +import pandas as pd import pypsa import pytest import yaml @@ -22,9 +23,95 @@ def ac_dc_network(): return pypsa.examples.ac_dc_meshed(from_master=True) -@pytest.fixture(scope="function") +@pytest.fixture(scope="session") def config(): path_config = pathlib.Path(pathlib.Path.cwd(), "config", "config.default.yaml") with open(path_config, "r") as file: config_dict = yaml.safe_load(file) return config_dict + + +@pytest.fixture(scope="function") +def buses_dataframe(): + return pd.DataFrame( + { + "bus_id": [5231, 5232], + "voltage": [380.0, 380.0], + "dc": ["f", "f"], + "symbol": ["Substation", "Substation"], + "under_construction": ["f", "f"], + "x": [6.8884, 6.8894], + "y": [45.6783, 45.6793], + "country": ["IT", "IT"], + "geometry": ["POINT (6.8884 45.6783)", "POINT (6.8894 45.6793)"], + }, + index=[5090, 5091], + ) + + +@pytest.fixture(scope="function") +def converters_dataframe(): + return pd.DataFrame( + { + "converter_id": "convert_5231_5232", + "bus0": 5231, + "bus1": 5232, + "voltage": 380.0, + "geometry": "'LINESTRING(6.8884 45.6783 ", + "": "6.8894 45.6793)'", + }, + index=[0], + ) + + +@pytest.fixture(scope="function") +def lines_dataframe(): + return pd.DataFrame( + { + "line_id": "line_5231_5232", + "bus0": 5231, + "bus1": 5232, + "voltage": 380.0, + "circuits": 1.0, + "length": 1000.0, + "underground": "t", + "under_construction": "f", + "geometry": "'LINESTRING(6.8884 45.6783 ", + "": "6.8894 45.6793)'", + }, + index=[0], + ) + + +@pytest.fixture(scope="function") +def links_dataframe(): + return pd.DataFrame( + { + "link_id": "link_5231_5232", + "bus0": 5231, + "bus1": 5232, + "voltage": 380.0, + "p_nom": 600.0, + "length": 1000.0, + "underground": "t", + "under_construction": "f", + "geometry": "'LINESTRING(6.8884 45.6783 ", + "": "6.8894 45.6793)'", + }, + index=[0], + ) + + +@pytest.fixture(scope="function") +def transformers_dataframe(): + return pd.DataFrame( + { + "transformer_id": "transf_5231_5232", + "bus0": 5231, + "bus1": 5232, + "voltage": 380.0, + "geometry": "'LINESTRING(6.8884 45.6783 ", + "": "6.8894 45.6793)'", + }, + index=[0], + ) diff --git a/test/test_base_network.py b/test/test_base_network.py new file mode 100644 index 000000000..2ec1e5f14 --- /dev/null +++ b/test/test_base_network.py @@ -0,0 +1,675 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2024 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# coding: utf-8 +""" +Tests the functionalities of scripts/base_network.py. +""" + +import pathlib +import sys + +import numpy as np +import pandas as pd +import pytest + +sys.path.append("./scripts") + +from base_network import ( + _get_country, + _get_linetype_by_voltage, + _get_linetypes_config, + _get_oid, + _load_buses, + _load_converters_from_eg, + _load_converters_from_osm, + _load_lines, + _load_links_from_eg, + _load_links_from_osm, + _load_transformers, + _reconnect_crimea, + _set_electrical_parameters_converters, + _set_electrical_parameters_lines_eg, + _set_electrical_parameters_lines_osm, + _set_electrical_parameters_links_osm, + _set_electrical_parameters_transformers, +) + +path_cwd = pathlib.Path.cwd() + + +@pytest.mark.parametrize( + "column_name, expected", + [ + ("tags", pd.Series(["NG", "CH", "AU"])), + ("other", pd.Series([np.nan, np.nan, np.nan])), + ], +) +def test_get_country(column_name, expected): + """ + Verify what returned by _get_country() + """ + data_list = [['"country"=>"NG"'], ['"country"=>"CH"'], ['"country"=>"AU"']] + df_exercise = pd.DataFrame(data_list, columns=[column_name]) + output_series = _get_country(df_exercise) + comparison_series = output_series.compare(expected) + assert comparison_series.size == 0 + + +def test_get_linetypes_config(config): + """ + Verify what returned by _get_linetypes_config. + """ + output_dict = _get_linetypes_config( + config["lines"]["types"], config["electricity"]["voltages"] + ) + assert output_dict == config["lines"]["types"] + + +def test_get_linetype_by_voltage(config): + """ + Verify what returned by _get_linetype_by_voltage. + """ + + reference_list = [ + "Al/St 240/40 2-bundle 220.0", + "Al/St 240/40 3-bundle 300.0", + "Al/St 240/40 3-bundle 300.0", + "Al/St 240/40 4-bundle 380.0", + "Al/St 240/40 4-bundle 380.0", + "Al/St 240/40 4-bundle 380.0", + "Al/St 560/50 4-bundle 750.0", + ] + + v_nom_list = [ + 220.0, + 300.0, + 330.0, + 380.0, + 400.0, + 500.0, + 750.0, + ] + + line_type_list = [] + + for v_nom in v_nom_list: + line_type_list.append(_get_linetype_by_voltage(v_nom, config["lines"]["types"])) + assert len(line_type_list) == len(reference_list) + assert all([x == y for x, y in zip(line_type_list, reference_list)]) + + +@pytest.mark.parametrize( + "column_name, expected", + [ + ("tags", pd.Series(["12", "12345", "9876654"])), + ("other", pd.Series([np.nan, np.nan, np.nan])), + ], +) +def test_get_oid(column_name, expected): + """ + Verify what returned by _get_oid() + """ + data_list = [['"oid"=>"12"'], ['"oid"=>"12345"'], ['"oid"=>"9876654"']] + df_exercise = pd.DataFrame(data_list, columns=[column_name]) + output_series = _get_oid(df_exercise) + comparison_series = output_series.compare(expected) + assert comparison_series.size == 0 + + +def test_load_buses(tmpdir, config, buses_dataframe): + """ + Verify what returned by _load_buses. + """ + df_buses_reference = pd.DataFrame( + { + "bus_id": ["5231", "5232"], + "v_nom": [380.0, 380.0], + "symbol": ["Substation", "Substation"], + "under_construction": [False, False], + "x": [6.8884, 6.8894], + "y": [45.6783, 45.6793], + "country": ["IT", "IT"], + "geometry": ["POINT (6.8884 45.6783)", "POINT (6.8894 45.6793)"], + "carrier": ["AC", "AC"], + }, + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses_output = _load_buses( + buses_path, italy_shape, countries, config + ).reset_index() + pathlib.Path(buses_path).unlink(missing_ok=True) + df_comparison = df_buses_output.compare(df_buses_reference) + assert df_comparison.empty + + +def test_load_converters_from_eg(tmpdir, buses_dataframe, config, converters_dataframe): + """ + Verify what returned by _load_converters_from_eg. + """ + df_converters_eg_reference = pd.DataFrame( + { + "converter_id": "convert_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "B2B", + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + converters_path = pathlib.Path(tmpdir, "converters_exercise.csv") + converters_dataframe.to_csv(converters_path, index=False) + df_converters_output = ( + _load_converters_from_eg(df_buses, converters_path) + .reset_index() + .loc[:, ("converter_id", "bus0", "bus1", "voltage", "geometry", "carrier")] + ) + df_converters_comparison = df_converters_output.compare(df_converters_eg_reference) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(converters_path).unlink(missing_ok=True) + assert df_converters_comparison.empty + + +def test_load_converters_from_osm( + tmpdir, buses_dataframe, config, converters_dataframe +): + """ + Verify what returned by _load_converters_from_osm. + """ + df_converters_osm_reference = pd.DataFrame( + { + "converter_id": "convert_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "", + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + converters_path = pathlib.Path(tmpdir, "converters_exercise.csv") + converters_dataframe.to_csv(converters_path, index=False) + df_converters_output = ( + _load_converters_from_osm(df_buses, converters_path) + .reset_index() + .loc[:, ("converter_id", "bus0", "bus1", "voltage", "geometry", "carrier")] + ) + df_converters_comparison = df_converters_output.compare(df_converters_osm_reference) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(converters_path).unlink(missing_ok=True) + assert df_converters_comparison.empty + + +def test_load_lines(tmpdir, buses_dataframe, config, lines_dataframe): + """ + Verify what returned by _load_lines. + """ + df_lines_reference = pd.DataFrame( + { + "line_id": "line_5231_5232", + "bus0": "5231", + "bus1": "5232", + "v_nom": 380.0, + "num_parallel": 1.0, + "length": 1.0, + "underground": True, + "under_construction": False, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "AC", + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + lines_path = pathlib.Path(tmpdir, "lines_exercise.csv") + lines_dataframe.to_csv(lines_path, index=False) + df_lines_output = ( + _load_lines(df_buses, lines_path) + .reset_index() + .loc[ + :, + ( + "line_id", + "bus0", + "bus1", + "v_nom", + "num_parallel", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + ) + df_lines_comparison = df_lines_output.compare(df_lines_reference) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(lines_path).unlink(missing_ok=True) + assert df_lines_comparison.empty + + +def test_load_links_from_eg(tmpdir, buses_dataframe, config, links_dataframe): + """ + Verify what returned by _load_links_from_eg. + """ + df_links_eg_reference = pd.DataFrame( + { + "link_id": "link_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "p_nom": 600.0, + "length": 1.0, + "underground": True, + "under_construction": False, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "DC", + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + links_path = pathlib.Path(tmpdir, "links_exercise.csv") + links_dataframe.to_csv(links_path, index=False) + df_links_output = ( + _load_links_from_eg(df_buses, links_path) + .reset_index() + .loc[ + :, + ( + "link_id", + "bus0", + "bus1", + "voltage", + "p_nom", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + ) + df_links_comparison = df_links_output.compare(df_links_eg_reference) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(links_path).unlink(missing_ok=True) + assert df_links_comparison.empty + + +def test_load_links_from_osm(tmpdir, buses_dataframe, config, links_dataframe): + """ + Verify what returned by _load_links_from_osm. + """ + df_links_osm_reference = pd.DataFrame( + { + "link_id": "link_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "p_nom": 600.0, + "length": 1.0, + "underground": True, + "under_construction": False, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "DC", + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + links_path = pathlib.Path(tmpdir, "links_exercise.csv") + links_dataframe.to_csv(links_path, index=False) + df_links_output = ( + _load_links_from_osm(df_buses, links_path) + .reset_index() + .loc[ + :, + ( + "link_id", + "bus0", + "bus1", + "voltage", + "p_nom", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + ) + df_links_comparison = df_links_output.compare(df_links_osm_reference) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(links_path).unlink(missing_ok=True) + assert df_links_comparison.empty + + +def test_load_transformers(tmpdir, buses_dataframe, config, transformers_dataframe): + """ + Verify what returned by _load_transformers. + """ + df_transformers_reference = pd.DataFrame( + { + "transformer_id": "transf_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + transformers_path = pathlib.Path(tmpdir, "transformers_exercise.csv") + transformers_dataframe.to_csv(transformers_path, index=False) + df_transformers_output = ( + _load_transformers(df_buses, transformers_path) + .reset_index() + .loc[:, ("transformer_id", "bus0", "bus1", "voltage", "geometry")] + ) + df_transformers_comparison = df_transformers_output.compare( + df_transformers_reference + ) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(transformers_path).unlink(missing_ok=True) + assert df_transformers_comparison.empty + + +def test_reconnect_crimea(tmpdir, buses_dataframe, config, lines_dataframe): + """ + Verify what returned by _reconnect_crimea. + """ + df_lines_crimea_reference = pd.DataFrame( + { + "index": [ + "line_5231_5232", + "Melitopol", + "Liubymivka left", + "Luibymivka right", + ], + "bus0": ["5231", "3065", "3181", "3181"], + "bus1": ["5232", "3057", "3055", "3057"], + "v_nom": [380.0, 300.0, 300.0, 300.0], + "num_parallel": [1.0, 1.0, 1.0, 1.0], + "length": [1.0, 140.0, 120.0, 140.0], + "underground": [True, False, False, False], + "under_construction": [False, False, False, False], + "geometry": [ + "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + np.nan, + np.nan, + np.nan, + ], + "carrier": ["AC", "AC", "AC", "AC"], + }, + index=[0, 1, 2, 3], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + lines_path = pathlib.Path(tmpdir, "lines_exercise.csv") + lines_dataframe.to_csv(lines_path, index=False) + df_lines = _load_lines(df_buses, lines_path).loc[ + :, + ( + "bus0", + "bus1", + "v_nom", + "num_parallel", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + df_lines_crimea_output = _reconnect_crimea(df_lines).reset_index() + df_lines_crimea_comparison = df_lines_crimea_output.compare( + df_lines_crimea_reference + ) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(lines_path).unlink(missing_ok=True) + assert df_lines_crimea_comparison.empty + + +def test_set_electrical_parameters_lines_eg( + tmpdir, buses_dataframe, config, lines_dataframe +): + """ + Verify what returned by _set_electrical_parameters_lines_eg. + """ + df_lines_parameters_reference = pd.DataFrame( + { + "line_id": "line_5231_5232", + "bus0": "5231", + "bus1": "5232", + "v_nom": 380.0, + "num_parallel": 1.0, + "length": 1.0, + "underground": True, + "under_construction": False, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "AC", + "type": "Al/St 240/40 4-bundle 380.0", + "s_max_pu": 0.7, + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + lines_path = pathlib.Path(tmpdir, "lines_exercise.csv") + lines_dataframe.to_csv(lines_path, index=False) + df_lines = ( + _load_lines(df_buses, lines_path) + .reset_index() + .loc[ + :, + ( + "line_id", + "bus0", + "bus1", + "v_nom", + "num_parallel", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + ) + df_lines_output = _set_electrical_parameters_lines_eg(df_lines, config) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(lines_path).unlink(missing_ok=True) + df_lines_comparison = df_lines_output.compare(df_lines_parameters_reference) + assert df_lines_comparison.empty + + +def test_set_electrical_parameters_lines_osm( + tmpdir, buses_dataframe, config, lines_dataframe +): + """ + Verify what returned by _set_electrical_parameters_lines_osm. + """ + df_lines_parameters_reference = pd.DataFrame( + { + "line_id": "line_5231_5232", + "bus0": "5231", + "bus1": "5232", + "v_nom": 380.0, + "num_parallel": 1.0, + "length": 1.0, + "underground": True, + "under_construction": False, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "AC", + "dc": False, + "type": "Al/St 240/40 4-bundle 380.0", + "s_max_pu": 0.7, + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + lines_path = pathlib.Path(tmpdir, "lines_exercise.csv") + lines_dataframe.to_csv(lines_path, index=False) + df_lines = ( + _load_lines(df_buses, lines_path) + .reset_index() + .loc[ + :, + ( + "line_id", + "bus0", + "bus1", + "v_nom", + "num_parallel", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + ) + df_lines_output = _set_electrical_parameters_lines_osm(df_lines, config) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(lines_path).unlink(missing_ok=True) + df_lines_comparison = df_lines_output.compare(df_lines_parameters_reference) + assert df_lines_comparison.empty + + +def test_set_electrical_parameters_links_osm( + tmpdir, buses_dataframe, config, links_dataframe +): + """ + Verify what returned by _set_electrical_parameters_links_osm. + """ + df_links_parameters_reference = pd.DataFrame( + { + "link_id": "link_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "p_nom": 600.0, + "length": 1.0, + "underground": True, + "under_construction": False, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "DC", + "p_max_pu": 1.0, + "p_min_pu": -1.0, + "dc": True, + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + links_path = pathlib.Path(tmpdir, "links_exercise.csv") + links_dataframe.to_csv(links_path, index=False) + df_links = ( + _load_links_from_eg(df_buses, links_path) + .reset_index() + .loc[ + :, + ( + "link_id", + "bus0", + "bus1", + "voltage", + "p_nom", + "length", + "underground", + "under_construction", + "geometry", + "carrier", + ), + ] + ) + df_links_output = _set_electrical_parameters_links_osm(df_links, config) + df_links_comparison = df_links_output.compare(df_links_parameters_reference) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(links_path).unlink(missing_ok=True) + assert df_links_comparison.empty + + +def test_set_electrical_parameters_converters( + tmpdir, buses_dataframe, config, converters_dataframe +): + """ + Verify what returned by _set_electrical_parameters_converters. + """ + df_converters_parameters_reference = pd.DataFrame( + { + "converter_id": "convert_5231_5232", + "bus0": "5231", + "bus1": "5232", + "voltage": 380.0, + "geometry": "LINESTRING(6.8884 45.6783 ,6.8894 45.6793)", + "carrier": "B2B", + "p_max_pu": 1.0, + "p_min_pu": -1.0, + "p_nom": 2000, + "under_construction": False, + "underground": False, + }, + index=[0], + ) + buses_path = pathlib.Path(tmpdir, "buses.csv") + buses_dataframe.to_csv(buses_path, index=False) + countries = config["countries"] + italy_shape = pathlib.Path(path_cwd, "test", "test_data", "italy_shape.geojson") + df_buses = _load_buses(buses_path, italy_shape, countries, config) + converters_path = pathlib.Path(tmpdir, "converters_exercise.csv") + converters_dataframe.to_csv(converters_path, index=False) + df_converters = ( + _load_converters_from_eg(df_buses, converters_path) + .reset_index() + .loc[:, ("converter_id", "bus0", "bus1", "voltage", "geometry", "carrier")] + ) + df_converters_output = _set_electrical_parameters_converters(df_converters, config) + df_converters_comparison = df_converters_output.compare( + df_converters_parameters_reference + ) + pathlib.Path(buses_path).unlink(missing_ok=True) + pathlib.Path(converters_path).unlink(missing_ok=True) + assert df_converters_comparison.empty diff --git a/test/test_build_powerplants.py b/test/test_build_powerplants.py index b617bcdec..f02f9e142 100644 --- a/test/test_build_powerplants.py +++ b/test/test_build_powerplants.py @@ -34,8 +34,7 @@ def test_add_custom_powerplants(config, query_value, expected): """ Verify what returned by add_custom_powerplants. """ - config_dict = config - config_dict["electricity"]["custom_powerplants"] = query_value + config["electricity"]["custom_powerplants"] = query_value custom_powerplants_path = pathlib.Path( path_cwd, "test", "test_data", "custom_powerplants_DE.csv" ) @@ -44,7 +43,7 @@ def test_add_custom_powerplants(config, query_value, expected): ppl_final = add_custom_powerplants( ppl_df, custom_powerplants_path, - config_dict["electricity"]["custom_powerplants"], + config["electricity"]["custom_powerplants"], ) assert ppl_df.shape == (131, 18) assert ppl_final.shape == expected diff --git a/test/test_data/italy_shape.geojson b/test/test_data/italy_shape.geojson new file mode 100644 index 000000000..533d5d7ff --- /dev/null +++ b/test/test_data/italy_shape.geojson @@ -0,0 +1,8 @@ +{ +"type": "FeatureCollection", +"name": "europe_shape", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "index": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 9.270000000050402, 41.291944442214458 ], [ 9.316666667, 41.336111110425918 ], [ 9.450000000050352, 41.406388889462335 ], [ 9.630555555925184, 41.433611110688105 ], [ 9.716944444088028, 41.433611110688105 ], [ 10.218333331476686, 41.553611110388204 ], [ 10.218333331476686, 41.71055555777366 ], [ 10.143333331551617, 41.777500000212569 ], [ 10.055000000075211, 41.952222221201168 ], [ 9.951666666725316, 42.064166668361565 ], [ 9.878611111012845, 42.161111110500883 ], [ 9.838611110962859, 42.23055555797356 ], [ 9.803055555662866, 42.337500000012881 ], [ 9.798888888850399, 42.381666668224113 ], [ 9.783055555862575, 42.625833331738932 ], [ 9.745833333387793, 42.772499999937793 ], [ 9.730171223623131, 42.799940016119024 ], [ 9.712478792662125, 42.795528948502238 ], [ 9.699356313443161, 42.822264995233411 ], [ 9.680098216759404, 42.854988564470716 ], [ 9.654536426514937, 42.907361465159681 ], [ 9.645433787339527, 42.928682891702238 ], [ 9.637186148921785, 42.955385437787811 ], [ 9.620957343007035, 43.087084974891752 ], [ 9.615624838115878, 43.111829901029239 ], [ 9.609625945481127, 43.133608739851582 ], [ 9.594426429835892, 43.176661708970755 ], [ 9.588086468449092, 43.175858045120606 ], [ 9.583888888975423, 43.193611110638187 ], [ 9.570555555625276, 43.275277778812153 ], [ 8.999444443905929, 43.636944440333707 ], [ 8.73722222192572, 43.461388889387536 ], [ 8.459722222112987, 43.253333331651561 ], [ 8.081666666974968, 43.123888889275065 ], [ 7.840277777887877, 43.123888889275065 ], [ 7.672222222000698, 43.425277779111809 ], [ 7.63055555567513, 43.57527777896189 ], [ 7.612222222150365, 43.64527777871217 ], [ 7.538055555587846, 43.744166668211619 ], [ 7.537500000162879, 43.752500000037799 ], [ 7.528611111112809, 43.774444442251934 ], [ 7.529865313736536, 43.783694191837412 ], [ 7.558631539514465, 43.781000853007413 ], [ 7.560266852334053, 43.788395643644492 ], [ 7.560855598402953, 43.788590114057676 ], [ 7.544118686000047, 43.784491278000075 ], [ 7.531097852000073, 43.784491278000075 ], [ 7.52320397200009, 43.789048570000034 ], [ 7.512868686000047, 43.792141018000052 ], [ 7.502289259000065, 43.792222398000035 ], [ 7.482726278000058, 43.840219219000076 ], [ 7.477868693000062, 43.86551483200013 ], [ 7.493474976000101, 43.886237081000061 ], [ 7.536779826000071, 43.920782776000053 ], [ 7.556933634000131, 43.944088847000089 ], [ 7.608610066000068, 43.97561147100005 ], [ 7.630934285000137, 43.993543193000036 ], [ 7.63868575000015, 44.005067037000046 ], [ 7.646953979000102, 44.027494609000044 ], [ 7.65336185700005, 44.039690247000053 ], [ 7.664317261000093, 44.048578593000073 ], [ 7.67878666200005, 44.056588441000045 ], [ 7.689948771000076, 44.06733713800007 ], [ 7.691912475000095, 44.084648743000074 ], [ 7.687942587000094, 44.090799457000074 ], [ 7.676202840000144, 44.108988343000092 ], [ 7.654085327000132, 44.124956360000041 ], [ 7.64188968900001, 44.143559876000083 ], [ 7.655635620000055, 44.176064352000097 ], [ 7.624733114000065, 44.180095113 ], [ 7.583598674000086, 44.160716451000056 ], [ 7.554763224000055, 44.15906280600008 ], [ 7.380820353000075, 44.122940980000081 ], [ 7.34061608900015, 44.123664449000088 ], [ 7.331004272000143, 44.125266419000113 ], [ 7.32159916100008, 44.131881002000014 ], [ 7.316224813000133, 44.140200908000068 ], [ 7.309300171000132, 44.147487284000064 ], [ 7.296174357000069, 44.151156311000037 ], [ 7.270129435000115, 44.154308574000098 ], [ 7.251319214000091, 44.160044657000057 ], [ 7.144969116000084, 44.207225240000085 ], [ 7.104868205000088, 44.21776723300006 ], [ 7.046060425000121, 44.240298157000055 ], [ 7.033451375000084, 44.242933655000073 ], [ 7.020015503000138, 44.242106832000061 ], [ 7.008026570000084, 44.239212952000074 ], [ 6.996140991000061, 44.237817688000078 ], [ 6.982808471000055, 44.241745098000067 ], [ 6.973403361000095, 44.249444885000045 ], [ 6.968855835000056, 44.258178202000025 ], [ 6.96554854300004, 44.267531636000072 ], [ 6.959244019000039, 44.277350159000051 ], [ 6.950045613000043, 44.285101624000035 ], [ 6.930201864000139, 44.295385234000051 ], [ 6.921210164000087, 44.302154846000079 ], [ 6.915629110000083, 44.309699605000034 ], [ 6.903846883000085, 44.330008444000057 ], [ 6.895992065000144, 44.339826966000018 ], [ 6.873977905000061, 44.358378805000044 ], [ 6.869843791000051, 44.362926331 ], [ 6.866123088000052, 44.372124736000089 ], [ 6.866329793000091, 44.377189026000067 ], [ 6.868810262000068, 44.3831834920001 ], [ 6.877181844000035, 44.414396057000076 ], [ 6.88420983900005, 44.42302602200003 ], [ 6.917799519000084, 44.436306864000031 ], [ 6.891651245000077, 44.451964824000086 ], [ 6.861265503000112, 44.474909160000024 ], [ 6.838837931000114, 44.502917786000026 ], [ 6.835737345000069, 44.534026998000073 ], [ 6.84638269000007, 44.547462871000036 ], [ 6.89733565200001, 44.575419821000125 ], [ 6.931648804000133, 44.617949525000071 ], [ 6.945601441000122, 44.625442607000096 ], [ 6.934335978000149, 44.64668162 ], [ 6.941467326000094, 44.666990459000019 ], [ 6.959864135000089, 44.683165182 ], [ 6.982808471000055, 44.692156881000031 ], [ 7.001205282000029, 44.692260234000074 ], [ 7.03727543200003, 44.684612122 ], [ 7.055155476000095, 44.684870504000074 ], [ 7.049367717000109, 44.697892965 ], [ 7.01898197400007, 44.738872376000032 ], [ 7.015157918000114, 44.747398987000039 ], [ 7.009783569000149, 44.772100322000071 ], [ 6.998414754000066, 44.793752747000056 ], [ 6.999138224000063, 44.795044658000094 ], [ 7.004099162000017, 44.810805969000072 ], [ 7.00595951400004, 44.811529440000086 ], [ 7.005856160000093, 44.816335348000067 ], [ 7.006786336000062, 44.819022522000111 ], [ 7.007096395000133, 44.822071432000044 ], [ 7.004925985000057, 44.827962545000034 ], [ 7.000791870000114, 44.8329751590001 ], [ 6.982808471000055, 44.846979472 ], [ 6.932682332000127, 44.8616555790001 ], [ 6.915319051000097, 44.862689108000083 ], [ 6.866019735000094, 44.855661113000068 ], [ 6.847106161000056, 44.859071758000098 ], [ 6.778169800000029, 44.887648825000056 ], [ 6.745406941000027, 44.907802633000031 ], [ 6.727940307000097, 44.928731588000019 ], [ 6.729904012000105, 44.984697164000025 ], [ 6.723496134000072, 45.013377584000025 ], [ 6.69724450700005, 45.02691681 ], [ 6.662207885000043, 45.029242249000035 ], [ 6.651665894000075, 45.035650126000078 ], [ 6.639676961000106, 45.05037791000008 ], [ 6.63698978700009, 45.059421285000028 ], [ 6.638126669000087, 45.067431132000095 ], [ 6.636576375000061, 45.074459127000111 ], [ 6.620298299000126, 45.08443267900013 ], [ 6.602728312000067, 45.103449606000098 ], [ 6.614613892000108, 45.114766745000068 ], [ 6.629385185000046, 45.123545113000048 ], [ 6.632700643000106, 45.125515442000093 ], [ 6.66737552900014, 45.139623109000027 ], [ 6.676263875000132, 45.140759990000035 ], [ 6.694350626000073, 45.140294902 ], [ 6.702205445000089, 45.141225078000062 ], [ 6.710887085000138, 45.144739075000118 ], [ 6.728870483000037, 45.154609273000077 ], [ 6.736415242000078, 45.157348125000041 ], [ 6.77145186300001, 45.1531623340001 ], [ 6.808142131000068, 45.139106344000069 ], [ 6.84410892700015, 45.130114645000035 ], [ 6.876665079000105, 45.141225078000062 ], [ 6.878628784000028, 45.147426250000038 ], [ 6.872841023000149, 45.152025452000075 ], [ 6.868190144000096, 45.157451477000066 ], [ 6.873461141000121, 45.165926412000076 ], [ 6.881315958000073, 45.168406881000053 ], [ 6.904673706000096, 45.168613587 ], [ 6.913768758000089, 45.170163880000118 ], [ 6.928444865000074, 45.179568990000078 ], [ 6.945808146000076, 45.201066386000022 ], [ 6.958727254000081, 45.209799703000087 ], [ 6.99448734500001, 45.221323548000029 ], [ 7.029730672000085, 45.228196513000071 ], [ 7.037688843000041, 45.225767721000025 ], [ 7.050194539000131, 45.215019023000096 ], [ 7.055465536000071, 45.213675436000031 ], [ 7.062183471000111, 45.218533021000056 ], [ 7.081200399000068, 45.243079325000039 ], [ 7.108382202000143, 45.259202373 ], [ 7.108382202000143, 45.274912008000072 ], [ 7.097633504000044, 45.294962464000022 ], [ 7.092569213000075, 45.323952942000105 ], [ 7.097736857000058, 45.329844056000113 ], [ 7.130086304000145, 45.357077535000101 ], [ 7.150756877000077, 45.383225810000013 ], [ 7.159645223000098, 45.39847035800004 ], [ 7.160678752000081, 45.410924378000047 ], [ 7.15292728600005, 45.415110169000073 ], [ 7.110139201000038, 45.428287659000048 ], [ 7.096806681000118, 45.435419007000078 ], [ 7.088745158000108, 45.446632793000035 ], [ 7.081820515000032, 45.459086813000013 ], [ 7.075368543000081, 45.466285856000056 ], [ 7.072001993000072, 45.470042217000085 ], [ 7.028490437000045, 45.493141581000074 ], [ 6.982808471000055, 45.511124980000048 ], [ 6.9752637120001, 45.525646058000106 ], [ 6.96978601100011, 45.566987203000039 ], [ 6.965858601000122, 45.574428609000066 ], [ 6.954903198000068, 45.586210836000063 ], [ 6.952939494000105, 45.594272360000062 ], [ 6.95562666800015, 45.602592265000013 ], [ 6.967098836000076, 45.620162252000071 ], [ 6.96947595200001, 45.625846659000032 ], [ 6.963378133000049, 45.640729472000075 ], [ 6.951079142000111, 45.646775615000124 ], [ 6.918626343000085, 45.652563375000099 ], [ 6.905293823000079, 45.659694723000129 ], [ 6.882556193000084, 45.675507711000122 ], [ 6.869223673000079, 45.679021708000064 ], [ 6.843075398000082, 45.682742412 ], [ 6.816100301000034, 45.696850077000121 ], [ 6.79594649200007, 45.718140768000112 ], [ 6.784681030000115, 45.759585266000059 ], [ 6.781993856000071, 45.777465312000018 ], [ 6.782717325000078, 45.795293681000075 ], [ 6.788091675000118, 45.81172678700004 ], [ 6.800804077000095, 45.826454570000053 ], [ 6.816203654000077, 45.832914124000084 ], [ 6.843355552194634, 45.838642859960729 ], [ 6.851996927951799, 45.836223274748718 ], [ 6.858564373527243, 45.833458034506428 ], [ 6.864440509042115, 45.826890588930986 ], [ 6.870662299587273, 45.828273209052128 ], [ 6.871699264678133, 45.832766724445854 ], [ 6.872736229768993, 45.83967982505159 ], [ 6.873461141000121, 45.844799704000124 ], [ 6.880385782000104, 45.845523173000018 ], [ 6.905087117000107, 45.845368144000062 ], [ 6.926377808000098, 45.84976064100006 ], [ 6.949012085000049, 45.857822164000069 ], [ 6.969165893000138, 45.869759420000022 ], [ 6.982808471000055, 45.885779114000044 ], [ 6.989112997000063, 45.899266663000034 ], [ 6.997174519000055, 45.911307272 ], [ 7.007716512000115, 45.920505677000094 ], [ 7.022082560000115, 45.925259909 ], [ 7.066937703000093, 45.890223288000058 ], [ 7.090192097000113, 45.880508118000122 ], [ 7.120887899000138, 45.876115621000039 ], [ 7.153547404000022, 45.87652903300004 ], [ 7.183726440000044, 45.880456442000096 ], [ 7.245428100000083, 45.898129782000112 ], [ 7.273540079000043, 45.910273743000019 ], [ 7.286665893000105, 45.913426005000062 ], [ 7.361803426000108, 45.907844951000058 ], [ 7.393842814000038, 45.915699768000096 ], [ 7.452960652000087, 45.945878805000078 ], [ 7.482726278000058, 45.954870504000027 ], [ 7.503706909000073, 45.956730855000032 ], [ 7.514662312000041, 45.966704407000051 ], [ 7.524377482000091, 45.978073223000038 ], [ 7.541120646000138, 45.984119365000069 ], [ 7.643026571000121, 45.966342672000039 ], [ 7.6587362060001, 45.960038147000049 ], [ 7.673722371000053, 45.950322978000102 ], [ 7.692532593000067, 45.931202698 ], [ 7.693979533000061, 45.928670553000117 ], [ 7.706278523, 45.925724997000103 ], [ 7.714650105000089, 45.92712026 ], [ 7.72219486500012, 45.929600728000068 ], [ 7.732013387000109, 45.930375875000081 ], [ 7.780072469000061, 45.918128561000046 ], [ 7.807564331000037, 45.918490296000058 ], [ 7.825444376000092, 45.914666239 ], [ 7.831232137000143, 45.914459534000045 ], [ 7.843737833000148, 45.919213766000055 ], [ 7.846114949000111, 45.922572733000052 ], [ 7.845288127000089, 45.927792053000061 ], [ 7.848388712000116, 45.938075663000077 ], [ 7.84962011600004, 45.939712062000112 ], [ 7.870201292731351, 45.940369630770249 ], [ 7.872917431422034, 45.959382601605029 ], [ 7.883781986184766, 45.973868674622011 ], [ 7.898204794000065, 45.981948954000089 ], [ 7.969104858000037, 45.993111064000018 ], [ 7.978716674000026, 45.99517812100008 ], [ 7.985848022000084, 45.999312236000023 ], [ 7.998353719000079, 46.010629375000079 ], [ 7.999077189000076, 46.01279978400008 ], [ 8.008792358000107, 46.027682597000094 ], [ 8.010652710000102, 46.029697978000073 ], [ 8.015923706000137, 46.058171692000101 ], [ 8.016027059000066, 46.069385478000058 ], [ 8.018197469000143, 46.080857646000069 ], [ 8.025328817000087, 46.091141256000057 ], [ 8.035354044000115, 46.096515605000022 ], [ 8.056024617000048, 46.09806589800003 ], [ 8.066876668000077, 46.100598043000033 ], [ 8.110594930000076, 46.12695302300007 ], [ 8.132299032000077, 46.159354147000087 ], [ 8.129508504000114, 46.196044413000052 ], [ 8.099949585000076, 46.235628561000013 ], [ 8.076591837000109, 46.249736226000053 ], [ 8.073077840000082, 46.253611959000082 ], [ 8.077315307000021, 46.262035218000094 ], [ 8.087340535000038, 46.271802063000038 ], [ 8.106874227000048, 46.285547995000073 ], [ 8.128474975000131, 46.292472636000056 ], [ 8.171883178000115, 46.299190573 ], [ 8.192553752000038, 46.309164124000077 ], [ 8.241749715000111, 46.354122620000012 ], [ 8.270068400000099, 46.364044495000101 ], [ 8.281540568000111, 46.370116475000046 ], [ 8.291462443000114, 46.378358866 ], [ 8.297456909000033, 46.387505596000082 ], [ 8.297043497000118, 46.397634176000039 ], [ 8.290428914000131, 46.401122335000068 ], [ 8.286604859000079, 46.405359803000024 ], [ 8.294976441000074, 46.41804636600007 ], [ 8.316267130000142, 46.433652649000024 ], [ 8.343448934000037, 46.443884583000099 ], [ 8.385906925000114, 46.450206018000088 ], [ 8.399156128000072, 46.45217865000005 ], [ 8.427888224000071, 46.448690491000022 ], [ 8.441634155000116, 46.434944560000062 ], [ 8.445768270000116, 46.412361959000023 ], [ 8.446285034000084, 46.38218292300003 ], [ 8.442874389000053, 46.353373312000102 ], [ 8.426647990000049, 46.30156768800002 ], [ 8.423237345000103, 46.275832825000052 ], [ 8.427164754000074, 46.251441549 ], [ 8.438120158000061, 46.235370178000053 ], [ 8.456516968000045, 46.224828187000085 ], [ 8.482665242000053, 46.217541809000082 ], [ 8.510260457000072, 46.207878317000066 ], [ 8.538682495000074, 46.187621155000059 ], [ 8.601831095000136, 46.12281890900006 ], [ 8.611546264000083, 46.119356588000116 ], [ 8.630873250000121, 46.114705709000063 ], [ 8.677485392000079, 46.095792135000025 ], [ 8.695055379000081, 46.095172018000042 ], [ 8.702186727000111, 46.097962545000101 ], [ 8.717689656000118, 46.107522685 ], [ 8.723890828000094, 46.109538066000042 ], [ 8.728983368000115, 46.108233103000074 ], [ 8.732159057000047, 46.107419332000077 ], [ 8.739497111000048, 46.09806589800003 ], [ 8.747145223000103, 46.094448548000045 ], [ 8.763164917000068, 46.092898255000037 ], [ 8.793860717000115, 46.093415019000062 ], [ 8.808950236000101, 46.089745993000079 ], [ 8.834375041000015, 46.066388245000027 ], [ 8.819595581000101, 46.042927145000064 ], [ 8.790966838000116, 46.01869089800006 ], [ 8.773396850000069, 45.990578919000129 ], [ 8.769572794000112, 45.985773010000017 ], [ 8.767919149000079, 45.983085836 ], [ 8.785075724000109, 45.982310690000091 ], [ 8.800371948000077, 45.978538310000047 ], [ 8.857732788000078, 45.957092591000034 ], [ 8.864450724000079, 45.953423564000033 ], [ 8.870961954000052, 45.947067363000102 ], [ 8.880780476000041, 45.931099345000078 ], [ 8.89814375800006, 45.909550273000022 ], [ 8.906515340000112, 45.896476135000071 ], [ 8.912096394000031, 45.88340199800011 ], [ 8.9137500410001, 45.866090393000022 ], [ 8.909719279000086, 45.853688050000031 ], [ 8.903724812000064, 45.841802470000104 ], [ 8.900004109000065, 45.826402893000122 ], [ 8.939588257000111, 45.834826152000019 ], [ 8.972351115, 45.824645895000046 ], [ 9.002426798000073, 45.820718486 ], [ 9.034362834000149, 45.848106995000123 ], [ 9.059270874000021, 45.881955058000116 ], [ 9.063094930000148, 45.898956604000048 ], [ 9.051726115000065, 45.915544739000055 ], [ 9.042321004000115, 45.919730530000081 ], [ 9.0205135490001, 45.922779440000014 ], [ 9.010798380000068, 45.926655172000054 ], [ 9.001703329000094, 45.936060283000117 ], [ 8.993435099000124, 45.954250387000073 ], [ 8.982686401000109, 45.961846822000027 ], [ 8.980515991000118, 45.96437896800002 ], [ 8.979792521000121, 45.966911113 ], [ 8.980515991000118, 45.96949493400011 ], [ 8.982686401000109, 45.971975403000087 ], [ 9.015552612000135, 45.993111064000018 ], [ 8.997775919000105, 46.027940979000093 ], [ 9.002116740000105, 46.039309795000079 ], [ 9.027748250000059, 46.053107402000123 ], [ 9.049659057000014, 46.057913310000018 ], [ 9.059167521000091, 46.061789043 ], [ 9.067125692000076, 46.071142477000123 ], [ 9.07032963100005, 46.083441467000071 ], [ 9.068159220000041, 46.105972392000083 ], [ 9.072086629000097, 46.118891500000089 ], [ 9.090586792000124, 46.138166809000026 ], [ 9.163243856000065, 46.172273255 ], [ 9.163788025000059, 46.172989267 ], [ 9.171098673000103, 46.182608541000022 ], [ 9.17574955200007, 46.194132385000032 ], [ 9.181330607000092, 46.204054260000035 ], [ 9.192182658000121, 46.209635315000057 ], [ 9.204171590000101, 46.213562724000028 ], [ 9.215747111000042, 46.221055807000042 ], [ 9.224842163000119, 46.231184387 ], [ 9.239724975000058, 46.266996155000029 ], [ 9.2689738360001, 46.309370830000049 ], [ 9.275175008000076, 46.331384990000046 ], [ 9.273831420000107, 46.344252421000121 ], [ 9.260395548000076, 46.379728292000053 ], [ 9.260292195000147, 46.394016826000055 ], [ 9.262876017000053, 46.406625875000074 ], [ 9.260912313000119, 46.416651103 ], [ 9.247579794000103, 46.423033142000023 ], [ 9.237967977000068, 46.43654653 ], [ 9.245822794000105, 46.461041158000072 ], [ 9.263186076000125, 46.485122376 ], [ 9.282306355000117, 46.497369691000031 ], [ 9.330985555000069, 46.501503805000041 ], [ 9.350829305000047, 46.497860616000068 ], [ 9.35155277500013, 46.485484111000105 ], [ 9.377080933000087, 46.468689270000041 ], [ 9.384625691000025, 46.466415508000026 ], [ 9.395477742000082, 46.469412740000038 ], [ 9.400335327000107, 46.47540720700006 ], [ 9.403849324000134, 46.482512716000102 ], [ 9.410670614000111, 46.488894756000022 ], [ 9.426793660000072, 46.497111308000072 ], [ 9.434648478000014, 46.498325704000095 ], [ 9.437852417000101, 46.492047018000093 ], [ 9.443846883000106, 46.39613555900003 ], [ 9.442399943000112, 46.380891012000077 ], [ 9.444363648000149, 46.375284119000057 ], [ 9.451598348000118, 46.370374858000034 ], [ 9.47371586100013, 46.36187408500011 ], [ 9.482604207000065, 46.356809794000029 ], [ 9.502551310000058, 46.320739645000046 ], [ 9.51526371300011, 46.308595683000036 ], [ 9.536451050000068, 46.298622132000034 ], [ 9.559705444000087, 46.292731018000026 ], [ 9.674323771000047, 46.291800842000086 ], [ 9.693133992000043, 46.297071839000111 ], [ 9.708430217000114, 46.311747946000096 ], [ 9.708843628000125, 46.319628601000048 ], [ 9.707293335000088, 46.330971579000035 ], [ 9.709257039000136, 46.342392070000116 ], [ 9.720109090000079, 46.35089284300004 ], [ 9.730857788000094, 46.350711975000067 ], [ 9.755249064000026, 46.340531718000122 ], [ 9.768064819000102, 46.338619690000101 ], [ 9.788838745000049, 46.343296408000057 ], [ 9.855397990000142, 46.366964213000088 ], [ 9.899012899000098, 46.372157695000013 ], [ 9.918443237000076, 46.371150004000029 ], [ 9.939010457000052, 46.367455140000047 ], [ 9.964021851000069, 46.356086325000049 ], [ 9.970636434000141, 46.339808249000029 ], [ 9.971049846000057, 46.320016175000049 ], [ 9.977561076000114, 46.298105367000076 ], [ 9.99223718200011, 46.284359436000059 ], [ 10.031717977000142, 46.260071513000057 ], [ 10.041846557000099, 46.243069967000039 ], [ 10.04267338000011, 46.220487366 ], [ 10.075746297000109, 46.220022278000059 ], [ 10.117914266000071, 46.231132711 ], [ 10.145819539000058, 46.243328349000095 ], [ 10.158945353000121, 46.262448629000104 ], [ 10.14612959800013, 46.280276998000048 ], [ 10.104891805000136, 46.309370830000049 ], [ 10.095796753000059, 46.320532939000074 ], [ 10.091765991000074, 46.328956198000057 ], [ 10.092386108000113, 46.338102926000047 ], [ 10.097450398000092, 46.351642151000036 ], [ 10.104995158000065, 46.361357321000085 ], [ 10.125975789000051, 46.37437978200002 ], [ 10.133210490000124, 46.381097717000031 ], [ 10.14075524900008, 46.402905172000075 ], [ 10.133417195000078, 46.414015605000074 ], [ 10.116157267000091, 46.418821514000072 ], [ 10.071405477000042, 46.42481598000002 ], [ 10.042053263000071, 46.432722474000073 ], [ 10.026343627000074, 46.446261699000033 ], [ 10.044016968000079, 46.466983948000077 ], [ 10.035335327000041, 46.471066386000089 ], [ 10.03047774300012, 46.47667327900011 ], [ 10.028100627000072, 46.483933818000068 ], [ 10.026860392000117, 46.493183900000091 ], [ 10.031201212000099, 46.503829245000091 ], [ 10.03140791900006, 46.525791728000044 ], [ 10.032751506000125, 46.532974752000101 ], [ 10.041329793000074, 46.541863098000121 ], [ 10.062930542000117, 46.55674591100005 ], [ 10.07119877100007, 46.564394023000048 ], [ 10.083497762000121, 46.597001851000087 ], [ 10.087838582000103, 46.604391582000105 ], [ 10.097450398000092, 46.608034770000089 ], [ 10.192121623000048, 46.626819154000103 ], [ 10.21785648600013, 46.626974182000041 ], [ 10.233772827000053, 46.617982484 ], [ 10.235736531000072, 46.606691183000024 ], [ 10.230258830000082, 46.586149801000047 ], [ 10.234703003000106, 46.575297750000104 ], [ 10.27594079500011, 46.565530905000045 ], [ 10.283795614000041, 46.560724996000047 ], [ 10.289066609000059, 46.555686544000068 ], [ 10.295371135000096, 46.551087341000127 ], [ 10.306636597000136, 46.547495829000056 ], [ 10.319452351000024, 46.546048889000062 ], [ 10.354282267000087, 46.548322653000085 ], [ 10.425905803000148, 46.535326030000036 ], [ 10.443992554000147, 46.537728984000083 ], [ 10.45183267900012, 46.54670157200006 ], [ 10.457945190000146, 46.553697001000032 ], [ 10.465903361000102, 46.578475851000078 ], [ 10.466626831000013, 46.60428822900009 ], [ 10.459082072000058, 46.623563538000028 ], [ 10.438204793000097, 46.635655823000022 ], [ 10.395623413000123, 46.638808085000065 ], [ 10.377536662000097, 46.653277486 ], [ 10.36916508000013, 46.672397766000088 ], [ 10.373919312000112, 46.681906230000081 ], [ 10.384771363000084, 46.689011739000094 ], [ 10.394383179000073, 46.700819804 ], [ 10.396553588000074, 46.715004984000061 ], [ 10.395623413000123, 46.726399639000064 ], [ 10.399654175000109, 46.735546367000055 ], [ 10.41660404400011, 46.74301361100008 ], [ 10.42869633, 46.755648499000088 ], [ 10.426215861000031, 46.769420268000047 ], [ 10.419084513000087, 46.783967183000087 ], [ 10.417224162000082, 46.798849997000033 ], [ 10.439031616000108, 46.816885071000044 ], [ 10.444922730000116, 46.823241272000061 ], [ 10.4485400800001, 46.83223297100001 ], [ 10.453811076000136, 46.864427389000056 ], [ 10.486263875000134, 46.846366475000067 ], [ 10.527708374000099, 46.843214213000081 ], [ 10.629407593000053, 46.862412008000021 ], [ 10.647080932000051, 46.863755596 ], [ 10.662480509000119, 46.860965068000027 ], [ 10.738961629000102, 46.829545797 ], [ 10.748676798000133, 46.819443055000036 ], [ 10.743819213000023, 46.812518413000063 ], [ 10.7215983480001, 46.800141907000082 ], [ 10.716947469000047, 46.79520680800006 ], [ 10.722941935000051, 46.786447652000064 ], [ 10.733690633000066, 46.786189271000111 ], [ 10.754774618000113, 46.790762634000046 ], [ 10.766350138000064, 46.788101299000019 ], [ 10.795082235000052, 46.776887513000062 ], [ 10.804900757000041, 46.776629130000103 ], [ 10.823917684000094, 46.780349833000017 ], [ 10.834149617000065, 46.780246480000088 ], [ 10.843141317000118, 46.777042542000018 ], [ 10.860194539000133, 46.766991476000086 ], [ 10.870426473000123, 46.764071757000082 ], [ 10.880348348000041, 46.764588522000039 ], [ 10.913731323000093, 46.772339986000034 ], [ 10.93088789900014, 46.773993633000075 ], [ 10.965717814000129, 46.771642354000065 ], [ 10.98266768400012, 46.767740784000082 ], [ 10.996930379000105, 46.769110210000051 ], [ 11.010883016000093, 46.779212952000094 ], [ 11.033310588000091, 46.805567932000073 ], [ 11.037444702000101, 46.808255107 ], [ 11.048503458000113, 46.811691590000024 ], [ 11.052844279000084, 46.81492136700011 ], [ 11.054601277000074, 46.819933980000073 ], [ 11.053464396000066, 46.830320943000103 ], [ 11.054291219000078, 46.834144999000031 ], [ 11.073101441000091, 46.864969992000013 ], [ 11.083643432000144, 46.900135804000072 ], [ 11.091911662000115, 46.912434795000095 ], [ 11.1566105550001, 46.956514791000089 ], [ 11.174490601000059, 46.963852845000062 ], [ 11.243737020000054, 46.979252422000073 ], [ 11.313810262000089, 46.987262268000038 ], [ 11.349467001000079, 46.981939596000089 ], [ 11.380576212000051, 46.971552633000059 ], [ 11.411168661000147, 46.970493266000076 ], [ 11.445171753000096, 46.9929983520001 ], [ 11.445275106000111, 46.993101705000029 ], [ 11.452923217000091, 47.00087900900003 ], [ 11.461811564000101, 47.005504049000095 ], [ 11.471836792000119, 47.007080181000035 ], [ 11.48940677900012, 47.004212138000057 ], [ 11.495918009000093, 47.001602478000038 ], [ 11.501705770000058, 46.997855937000011 ], [ 11.506976766000093, 46.9929983520001 ], [ 11.515348348000146, 46.989484355000045 ], [ 11.524443400000024, 46.988347473000047 ], [ 11.533848511000087, 46.989536032000061 ], [ 11.543253621000133, 46.9929983520001 ], [ 11.543356974000062, 46.9929983520001 ], [ 11.543563680000119, 46.993101705000029 ], [ 11.543667033000048, 46.993101705000029 ], [ 11.572709188000147, 46.998915304000022 ], [ 11.596480347000096, 47.000439758000098 ], [ 11.647950073000089, 46.99325673500006 ], [ 11.648466838000047, 46.99325673500006 ], [ 11.649707072000069, 46.9929983520001 ], [ 11.65725183100011, 46.992533264000073 ], [ 11.664796590000066, 46.99325673500006 ], [ 11.683813517000118, 46.991913147 ], [ 11.716162964000119, 46.975480042000029 ], [ 11.734869832000101, 46.970622457000033 ], [ 11.746445353000041, 46.972456971000028 ], [ 11.766082397000076, 46.983438213000099 ], [ 11.777141154000077, 46.988295797000021 ], [ 11.822513061000109, 46.99325673500006 ], [ 11.85703291900009, 47.012015279000067 ], [ 11.899510946000134, 47.027724915000036 ], [ 11.943642618000126, 47.038163555000054 ], [ 12.014956096000105, 47.040488994 ], [ 12.116241903000116, 47.076559143000097 ], [ 12.133146314000101, 47.078831606000094 ], [ 12.180630737000115, 47.085214945000061 ], [ 12.20419519100011, 47.079685567000055 ], [ 12.203896989000043, 47.067011988 ], [ 12.203575073000138, 47.053330588000094 ], [ 12.182284383000081, 47.033616028000026 ], [ 12.121719604000106, 47.010516663000047 ], [ 12.111177612000063, 46.9929983520001 ], [ 12.117792196000039, 46.983076477000097 ], [ 12.122133015000117, 46.971655986000101 ], [ 12.128230835000096, 46.948582459000122 ], [ 12.134742065000069, 46.937446188000095 ], [ 12.141666708000031, 46.927989400000044 ], [ 12.141563355000102, 46.918842672000054 ], [ 12.126887247000127, 46.908869120000034 ], [ 12.137429240000074, 46.905923564000048 ], [ 12.16099369300008, 46.90302968400006 ], [ 12.172155802000105, 46.899179789000087 ], [ 12.183524617000103, 46.891221619000035 ], [ 12.189002319000082, 46.884942932000044 ], [ 12.195100138000043, 46.880085348000122 ], [ 12.208742716000074, 46.876623027000065 ], [ 12.250807332000079, 46.875615337000099 ], [ 12.266620320000072, 46.868148092000084 ], [ 12.275818726000097, 46.846288961000127 ], [ 12.276128784000065, 46.833989970000076 ], [ 12.27333825700012, 46.826755270000021 ], [ 12.269617554000092, 46.819830628000048 ], [ 12.266930380000076, 46.808255107 ], [ 12.266723673000115, 46.795335999000073 ], [ 12.269100789000049, 46.788566387000046 ], [ 12.274785197000114, 46.784638977000085 ], [ 12.284397013000103, 46.779988099000022 ], [ 12.305274292000092, 46.774458720000027 ], [ 12.326048218000039, 46.772495016000093 ], [ 12.342688029000044, 46.765131124000092 ], [ 12.35147302300004, 46.743246155000051 ], [ 12.370386596000088, 46.71115509000002 ], [ 12.405009806000095, 46.690122783 ], [ 12.445627482000106, 46.678702292000096 ], [ 12.469632190000141, 46.675798865000033 ], [ 12.499887736000062, 46.672139385000023 ], [ 12.530790242000052, 46.657669984000094 ], [ 12.547326701000145, 46.652192281000097 ], [ 12.562002807000056, 46.651210429000045 ], [ 12.620190471000058, 46.656481425000052 ], [ 12.669593139000085, 46.653019105000013 ], [ 12.671367650000093, 46.65246576300008 ], [ 12.679204956000092, 46.650021871000021 ], [ 12.697395061000122, 46.640539246000046 ], [ 12.706593465000111, 46.637748719000072 ], [ 12.715998576000089, 46.637955424000026 ], [ 12.73201827000014, 46.642270407000083 ], [ 12.739873088000081, 46.642993876 ], [ 12.74849950400008, 46.640996041000093 ], [ 12.773566122000119, 46.63519073500008 ], [ 12.830410197000077, 46.609636740000028 ], [ 13.064504435000089, 46.59803538000007 ], [ 13.14646325700005, 46.584961243000024 ], [ 13.210025269000113, 46.5580119830001 ], [ 13.231109253000056, 46.552172547000012 ], [ 13.271416870000081, 46.550777283000045 ], [ 13.373322794000075, 46.565789286000026 ], [ 13.417041056000073, 46.560492452000076 ], [ 13.478019246000116, 46.563567200000122 ], [ 13.484943889000107, 46.561732686000099 ], [ 13.49910323000006, 46.550622254000089 ], [ 13.506751343000133, 46.546927389000089 ], [ 13.549229370000091, 46.545842184 ], [ 13.670255574000066, 46.51871205700003 ], [ 13.685345093000052, 46.517626851000031 ], [ 13.700951375000102, 46.519745586000013 ], [ 13.701054728000116, 46.511890768000072 ], [ 13.699194376000037, 46.504836935000057 ], [ 13.695473673, 46.498635762000063 ], [ 13.689892619000091, 46.493338928000028 ], [ 13.688445678000107, 46.46775909500009 ], [ 13.685852877000059, 46.464047231000094 ], [ 13.67749027500011, 46.452075297000121 ], [ 13.658783407000044, 46.445124817000035 ], [ 13.634082072000126, 46.445719097000094 ], [ 13.600182332000117, 46.442644349000048 ], [ 13.575687703000057, 46.426676331000024 ], [ 13.554397013000084, 46.405954081000075 ], [ 13.530005737000067, 46.388332418000104 ], [ 13.483703654000067, 46.371150004000029 ], [ 13.45972579000005, 46.359031881000035 ], [ 13.44732344500008, 46.354846090000095 ], [ 13.434094279000107, 46.353864238000043 ], [ 13.423242229000039, 46.344846700000076 ], [ 13.409806355000086, 46.323607687000035 ], [ 13.395637648000076, 46.306727928000058 ], [ 13.391306193000077, 46.30156768800002 ], [ 13.365261271000094, 46.290302226000065 ], [ 13.373012736000106, 46.280276998000048 ], [ 13.37859379000011, 46.26839141900011 ], [ 13.384691610000061, 46.243328349000095 ], [ 13.384794963000104, 46.24322499600008 ], [ 13.384898316000118, 46.243121644000055 ], [ 13.39812748200012, 46.230512594000018 ], [ 13.40164148000008, 46.216663310000072 ], [ 13.41011641500009, 46.20798167 ], [ 13.437401570000105, 46.210927226000095 ], [ 13.422828816000049, 46.228600566000111 ], [ 13.438331746000131, 46.224879863000083 ], [ 13.468304077000084, 46.22343292300009 ], [ 13.482256713000083, 46.217903545000084 ], [ 13.510161988000078, 46.213976136000028 ], [ 13.528972208000084, 46.204829407000048 ], [ 13.559047892000137, 46.184107158000117 ], [ 13.584472697000137, 46.181316631000058 ], [ 13.613928264000066, 46.183538717000047 ], [ 13.627366324, 46.181733163000061 ], [ 13.637389363000125, 46.18038645500009 ], [ 13.64107145100013, 46.171405145000037 ], [ 13.645037475, 46.16173126300005 ], [ 13.616408732000139, 46.125040995000077 ], [ 13.522585297000091, 46.07529802300003 ], [ 13.505097697000082, 46.066026510000128 ], [ 13.482256713000083, 46.044839173000085 ], [ 13.490318237000082, 46.038948059000077 ], [ 13.492798706000144, 46.032488505000018 ], [ 13.490008179000085, 46.025563863000045 ], [ 13.482256713000083, 46.0184325150001 ], [ 13.47708907000009, 46.016055400000042 ], [ 13.461792846000037, 46.006391907000122 ], [ 13.474815307000142, 45.995746562000036 ], [ 13.47946618600011, 45.993111064000018 ], [ 13.480396362000079, 45.992284241000092 ], [ 13.481223186000108, 45.991354065000039 ], [ 13.481843302000073, 45.990372213000072 ], [ 13.482256713000083, 45.989235332000064 ], [ 13.509438517000149, 45.967427877000048 ], [ 13.539410848000102, 45.969029847000073 ], [ 13.571656942000061, 45.979830221000029 ], [ 13.600734872000089, 45.984574053000031 ], [ 13.605866740000067, 45.985411276000022 ], [ 13.622816610000086, 45.966394349000055 ], [ 13.615325176000084, 45.945912448000016 ], [ 13.608243856000115, 45.926551819000039 ], [ 13.599306242000097, 45.912327499000028 ], [ 13.569279826000127, 45.864540101000088 ], [ 13.56597253400011, 45.830330303 ], [ 13.574172202000085, 45.819028057000097 ], [ 13.581268758000078, 45.809246318000064 ], [ 13.609174032000055, 45.798600973000063 ], [ 13.643590535000016, 45.795655416000059 ], [ 13.660333699000148, 45.792038066000075 ], [ 13.699908416000142, 45.770523736000072 ], [ 13.70947798600011, 45.765321351000026 ], [ 13.778724406000038, 45.743410543000081 ], [ 13.858409465000079, 45.649359436000012 ], [ 13.869158163000094, 45.641142884 ], [ 13.884144327000087, 45.635148417000053 ], [ 13.893136027000111, 45.634683329000026 ], [ 13.893640530000113, 45.633758406000069 ], [ 13.894686320000034, 45.631841125000065 ], [ 13.887038208000149, 45.618766988000104 ], [ 13.867925706000079, 45.602169289000116 ], [ 13.84776411900009, 45.584660543000055 ], [ 13.800531860000149, 45.581249899000014 ], [ 13.76105106600005, 45.596236064 ], [ 13.711761915000068, 45.59320709800005 ], [ 13.718760613000086, 45.600653387000079 ], [ 13.723608671551661, 45.60595162254787 ], [ 13.719289302859465, 45.605872154576673 ], [ 13.712500000000318, 45.598333333333642 ], [ 13.63000000000045, 45.63000000000028 ], [ 13.387006679914464, 45.564946671152086 ], [ 13.312500000474699, 45.545000000449761 ], [ 13.211666666548979, 45.453333333472358 ], [ 13.21111111018962, 45.453611109964868 ], [ 13.18527778044529, 45.428611110014799 ], [ 13.098611110414538, 45.335277780045658 ], [ 13.061111110489492, 45.280277780695201 ], [ 13.016944440733482, 45.205277779945561 ], [ 13.002777780270492, 45.184444440658467 ], [ 13.072777780670151, 44.974444440358752 ], [ 13.101944440383704, 44.770277780095626 ], [ 13.109444440008986, 44.736944439934121 ], [ 13.129444440508621, 44.502777780270435 ], [ 13.178611110614327, 44.476111109939836 ], [ 13.192777780070571, 44.466944439934025 ], [ 13.465277780245515, 44.296111109939943 ], [ 13.583634248271547, 44.234851230916938 ], [ 13.631666666983733, 44.208333332917505 ], [ 13.666944440333737, 44.179444440508576 ], [ 13.725278428446096, 44.151114777974605 ], [ 14.015000000150337, 44.008333333317296 ], [ 14.080277780095571, 43.960277780095566 ], [ 14.170848772384252, 43.900540118681221 ], [ 14.354444440758357, 43.716944440533553 ], [ 14.391944440683574, 43.671111110289701 ], [ 14.408333333117298, 43.640000000300347 ], [ 14.416405210891153, 43.631503286830068 ], [ 14.437777779920737, 43.599444440408661 ], [ 14.501944440283808, 43.53194444018385 ], [ 14.53027778009556, 43.498611109914862 ], [ 14.537441126688663, 43.488625838604612 ], [ 14.581666666883791, 43.420000000200162 ], [ 14.722471068990806, 43.265242008362293 ], [ 14.76694443993398, 43.214444440458749 ], [ 14.797777779920636, 43.174444440358684 ], [ 14.859867989745593, 43.113267323912417 ], [ 14.908333333017367, 43.063333333766764 ], [ 14.963611110464342, 43.014444439958993 ], [ 15.010717265492618, 42.987209181034395 ], [ 15.15777777992065, 42.796944440034054 ], [ 15.362777779870612, 42.612777780270392 ], [ 15.746111110339541, 42.492777779970652 ], [ 15.992222220079498, 42.436388890135277 ], [ 16.227222220329281, 42.193333330468874 ], [ 16.575000000249929, 42.281388890085395 ], [ 16.61777778042034, 42.266388889935456 ], [ 16.943611110464531, 42.117222220029475 ], [ 17.215000000049997, 41.991388890485041 ], [ 17.311666669880879, 41.912222220079514 ], [ 17.617500000324867, 41.834722220054573 ], [ 17.997499999925139, 41.638888890110252 ], [ 18.018298590307722, 41.629702200296379 ], [ 18.216666666633728, 41.499999999900353 ], [ 18.242160045450248, 41.485035267564001 ], [ 18.321493067051847, 41.441751384918803 ], [ 18.346669569745302, 41.41298591906525 ], [ 18.448180247121172, 41.296845899818891 ], [ 18.46194444478067, 41.277499999625604 ], [ 18.542777777472793, 41.193611111463895 ], [ 18.576944444730827, 41.133611110864535 ], [ 18.595000000350183, 41.108055555619899 ], [ 18.658611110814547, 40.917499999625704 ], [ 18.659444444206201, 40.885000000050468 ], [ 18.671111110789582, 40.847222222028165 ], [ 18.711111110889476, 40.733055555470003 ], [ 18.739722222503076, 40.669444444106205 ], [ 18.745277778147397, 40.646111110939273 ], [ 18.759722222103335, 40.59388888896143 ], [ 18.795833333342216, 40.512222221978334 ], [ 18.851388888886561, 40.388055555619644 ], [ 18.859722221903439, 40.358333333416908 ], [ 18.879999999600784, 40.313888889161376 ], [ 18.951388888686665, 40.203611111463886 ], [ 18.977222222028502, 40.131944444281146 ], [ 18.995238279423404, 40.083579770707672 ], [ 18.95758056000011, 39.960683330000052 ], [ 18.934247220000032, 39.872347220000108 ], [ 18.914247220000107, 39.81567777999993 ], [ 18.925919440000087, 39.287333330000138 ], [ 18.899255560000086, 39.03233056 ], [ 18.730922220000025, 38.49898332999993 ], [ 18.475925000000132, 37.865636109999969 ], [ 18.282591669999931, 37.353961110000057 ], [ 18.317594440000107, 36.990619440000103 ], [ 18.31926389, 36.905619440000123 ], [ 18.309263890000068, 36.74895 ], [ 18.299266670000122, 36.440611109999963 ], [ 18.294266670000127, 36.400608330000011 ], [ 18.260936109999989, 36.182272220000016 ], [ 18.260936109999989, 36.148938889999954 ], [ 18.344425, 35.568930560000126 ], [ 18.304517058515898, 35.425145239061578 ], [ 18.206440508023547, 35.374439586118342 ], [ 17.937436214909837, 35.24761992601924 ], [ 17.763374613747771, 35.17260372937892 ], [ 17.541841667059771, 35.08044400388809 ], [ 17.4972593063722, 35.064406149224737 ], [ 17.081205915820931, 35.254897717555934 ], [ 17.013781307561658, 35.28558298686562 ], [ 16.96932604086453, 35.30567133136725 ], [ 16.176482993895547, 35.661857087135161 ], [ 15.576346941158761, 35.935695963798025 ], [ 15.509295663964053, 35.965228412861165 ], [ 15.051597237922692, 36.160362240225538 ], [ 14.984461670869905, 36.189416992800432 ], [ 14.929995370590348, 36.213594638282188 ], [ 14.872927775896585, 36.237460264879644 ], [ 14.748984627039306, 36.289659472307051 ], [ 14.669371074515823, 36.323326672288374 ], [ 14.609399514976076, 36.348702901817774 ], [ 14.524491015048682, 36.381759985535268 ], [ 14.470382559507868, 36.401982984627296 ], [ 14.451592675961535, 36.4087217099393 ], [ 14.413925522645116, 36.422043360213195 ], [ 14.386636320010609, 36.430792633273768 ], [ 14.32388555137743, 36.444841264013348 ], [ 14.202216087403031, 36.473963365916859 ], [ 14.15270567392804, 36.486317904148223 ], [ 14.076985776672814, 36.49761418404762 ], [ 14.005150518981736, 36.505814453374683 ], [ 13.930938052749354, 36.510936832569087 ], [ 13.873372529519031, 36.512308641330947 ], [ 13.834356443495551, 36.512399628440392 ], [ 13.774872598891591, 36.511300276486907 ], [ 13.693010770031435, 36.506537328435286 ], [ 13.608589981442947, 36.498474143667067 ], [ 13.521605316532487, 36.487107037659825 ], [ 13.455468121956642, 36.476269238435009 ], [ 13.416968867319895, 36.467544122963318 ], [ 13.447239916089757, 36.337132199191899 ], [ 13.472819941887394, 36.228212632507223 ], [ 13.520814722521777, 36.020919702182823 ], [ 13.531627865933729, 35.965719498456451 ], [ 13.552927980342361, 35.862001007041101 ], [ 13.579012720061314, 35.73478059554833 ], [ 13.58021319628233, 35.728937996991192 ], [ 13.601451407656612, 35.626487349112324 ], [ 13.60741648758119, 35.589690549779277 ], [ 13.612895898527313, 35.547048792967644 ], [ 13.61703387171633, 35.503531189113517 ], [ 13.618876977391153, 35.476424211608389 ], [ 13.617897523052704, 35.43722833941672 ], [ 13.616064348591237, 35.401549275978596 ], [ 13.608233703323208, 35.283512203425801 ], [ 13.609999999700619, 35.24999999980048 ], [ 13.191666666783817, 35.659999999700574 ], [ 13.095833333042151, 35.725833333141964 ], [ 13.069722222502946, 35.700555555994299 ], [ 13.049722222003311, 35.68583333304241 ], [ 13.02833333371666, 35.672499999675608 ], [ 13.009166666609019, 35.662777777972508 ], [ 12.981111111189364, 35.651388888586496 ], [ 12.955833333142095, 35.643888888961555 ], [ 12.925277777547933, 35.637499999925296 ], [ 12.8986111108145, 35.634444444455823 ], [ 12.848611110914419, 35.633333332967311 ], [ 12.863333332967613, 35.610277777897579 ], [ 12.876388889136592, 35.586944444730818 ], [ 12.885000000250329, 35.566111110839358 ], [ 12.889444444405967, 35.551666666883591 ], [ 12.893888888561776, 35.529999999600534 ], [ 12.895555555345027, 35.511666666783697 ], [ 12.895555555345027, 35.496944444730843 ], [ 12.891944444580872, 35.46416666705835 ], [ 12.888333332917455, 35.449722222203206 ], [ 12.879444444606008, 35.425000000350053 ], [ 12.872777777473004, 35.411388888886506 ], [ 12.856388888636729, 35.385277777447982 ], [ 12.849166667108534, 35.37583333294225 ], [ 12.836111110939441, 35.360833333691573 ], [ 12.812499999675936, 35.338888889211319 ], [ 12.795833333641667, 35.326388889236114 ], [ 12.766944444830528, 35.308888888911554 ], [ 12.743611110764562, 35.29805555571977 ], [ 12.715000000050338, 35.287499999725696 ], [ 12.70666666703346, 35.284722222352968 ], [ 12.667500000325163, 35.276111111239231 ], [ 12.645277777747708, 35.273333332967297 ], [ 12.613888888761551, 35.271944444280905 ], [ 12.609444444605742, 35.271944444280905 ], [ 12.586944444830806, 35.273055555769758 ], [ 12.564722222253124, 35.275555555944436 ], [ 12.525555555544884, 35.283611110864456 ], [ 12.486388888836586, 35.296666667033435 ], [ 12.460277777397835, 35.301388889286272 ], [ 12.426388889136547, 35.311388889086402 ], [ 12.39083333319212, 35.326944444530682 ], [ 12.372500000375055, 35.337777777722465 ], [ 12.352222221778732, 35.35222222257795 ], [ 12.32111111088966, 35.349722222402931 ], [ 12.285277777747524, 35.351111111089438 ], [ 12.249999999900808, 35.356666666733759 ], [ 12.22861111071461, 35.36222222237808 ], [ 12.195833333042287, 35.374444444256085 ], [ 12.173055555170095, 35.386111110839295 ], [ 12.14861111141397, 35.40222222247786 ], [ 12.126666666933602, 35.420833333391897 ], [ 12.103333333766784, 35.447777778222417 ], [ 12.087222222128389, 35.47416666685848 ], [ 12.083888888561887, 35.480833333092107 ], [ 12.075000000250441, 35.505555555844637 ], [ 12.069999999900688, 35.530833332992358 ], [ 12.068888889311381, 35.545555555944532 ], [ 12.069722221803659, 35.567500000425127 ], [ 12.071944444780627, 35.582222222477753 ], [ 12.078888889111511, 35.607222222427993 ], [ 12.091666666284027, 35.634444444455823 ], [ 12.097777778122463, 35.644444444256123 ], [ 12.10666666643391, 35.657222222328187 ], [ 12.119444444505802, 35.672222222477899 ], [ 12.13694444483076, 35.688888888511713 ], [ 12.156666666334161, 35.703888888661425 ], [ 12.170833333092446, 35.712777777872759 ], [ 12.193611110964298, 35.724722222552828 ], [ 12.217777777522883, 35.734444444256098 ], [ 12.247499999725562, 35.742777778172183 ], [ 12.26500000005052, 35.746388888936224 ], [ 12.286944444530945, 35.749166666308781 ], [ 12.322222222377945, 35.750277777797635 ], [ 12.357777777423223, 35.747222222328162 ], [ 12.39694444413152, 35.738611111214084 ], [ 12.421666666883482, 35.730000000100119 ], [ 12.446944444031203, 35.734444444256098 ], [ 12.482499999975516, 35.739166666508652 ], [ 12.513888888961446, 35.741666666683841 ], [ 12.518888889311199, 35.742222221978409 ], [ 12.557499999825382, 35.74388888876166 ], [ 12.588888888811539, 35.74388888876166 ], [ 12.620277777797867, 35.741111111389102 ], [ 12.608888889311174, 35.760277777597764 ], [ 12.606666666333979, 35.763611111164266 ], [ 12.590277777497761, 35.793611111464031 ], [ 12.579444444306148, 35.825277777647727 ], [ 12.575833333542164, 35.843333333267196 ], [ 12.573888888661827, 35.865277777747622 ], [ 12.575277777347878, 35.89444444465579 ], [ 12.580277777697802, 35.919722221803511 ], [ 12.58861111071451, 35.944444444555984 ], [ 12.60444444425616, 35.974722222053117 ], [ 12.615277777448114, 35.990555555594653 ], [ 12.627777777422807, 36.005833332942359 ], [ 12.641666666983383, 36.019999999700474 ], [ 12.656944444331089, 36.033333333067105 ], [ 12.660277777897591, 36.036111111339039 ], [ 12.676944444830951, 36.048055555120129 ], [ 12.694999999550703, 36.059166666409112 ], [ 12.634999999850379, 36.145000000349967 ], [ 12.540000000400028, 36.253333333167291 ], [ 12.503333332967372, 36.36166666688365 ], [ 12.489999999600741, 36.383333333266819 ], [ 12.353333333267415, 36.583333333766802 ], [ 12.295833333741598, 36.662777777772646 ], [ 12.291388888686583, 36.646666667033458 ], [ 12.282500000375308, 36.634166667058253 ], [ 12.264722221953662, 36.613333333167191 ], [ 12.241388888786673, 36.591388888686765 ], [ 12.218333333716771, 36.573888889261184 ], [ 12.197222222627829, 36.560555555894723 ], [ 12.163055555369908, 36.543333333666681 ], [ 12.14694444463089, 36.536666666533677 ], [ 12.126388888836686, 36.529444444106105 ], [ 12.100833333591765, 36.522499999775391 ], [ 12.074722222153241, 36.517222222228327 ], [ 12.043611111264113, 36.513333333367257 ], [ 12.021111111488949, 36.512222221878403 ], [ 12.003333333067303, 36.512222221878403 ], [ 11.998888888911495, 36.512222221878403 ], [ 11.963055555769699, 36.515000000150337 ], [ 11.954166666558876, 36.516111110739473 ], [ 11.940833333192245, 36.518333333716839 ], [ 11.902222221778516, 36.527222222028456 ], [ 11.877222221828504, 36.535555555944541 ], [ 11.849444444505764, 36.547222222527751 ], [ 11.826666666633741, 36.558888889111472 ], [ 11.805277777448225, 36.572222222477933 ], [ 11.785277777847455, 36.586944444530957 ], [ 11.766944444131241, 36.602777778072152 ], [ 11.753055555469814, 36.616944444830722 ], [ 11.738055555320102, 36.634999999550871 ], [ 11.725000000050386, 36.653888888561823 ], [ 11.713888888761517, 36.673888889061288 ], [ 11.694444444455996, 36.693611111463895 ], [ 11.689444444106243, 36.699722222403125 ], [ 11.672499999975457, 36.725277777647534 ], [ 11.663055555469839, 36.745555555345049 ], [ 11.656111111139523, 36.766388889235998 ], [ 11.651944444181026, 36.79138888918618 ], [ 11.652222222278454, 36.813055555569861 ], [ 11.655833333042267, 36.834444444755547 ], [ 11.660555555295332, 36.851944444181129 ], [ 11.668333333017472, 36.872777778072361 ], [ 11.684166666558667, 36.902777777472636 ], [ 11.697222221828383, 36.921666666483759 ], [ 11.7150000002502, 36.942500000374821 ], [ 11.729166667008656, 36.956388889036418 ], [ 11.75111111148891, 36.974444444655717 ], [ 11.77888888881165, 36.992777777472782 ], [ 11.805277777448225, 37.006666667033357 ], [ 11.83305555566983, 37.018333333616908 ], [ 11.853888888661913, 37.025277777947394 ], [ 11.87944444480587, 37.031944444181079 ], [ 11.901111111189209, 37.036111111139178 ], [ 11.905555555345018, 37.036666666433746 ], [ 11.932222222078167, 37.040000000000248 ], [ 11.973888888961653, 37.041111111489101 ], [ 11.991666666483923, 37.040000000000248 ], [ 12.02277777737288, 37.036666666433746 ], [ 12.02277777737288, 37.050277777897293 ], [ 12.014999999650513, 37.063333333167179 ], [ 11.946666666933481, 37.139999999800523 ], [ 11.878333333317187, 37.236666666933331 ], [ 11.803333333466924, 37.343333332967404 ], [ 11.758333333017447, 37.373333333266999 ], [ 11.700000000100317, 37.408333333017538 ], [ 11.316666666933486, 37.68666666693332 ], [ 11.171666666683905, 37.790000000300154 ], [ 10.878333333517048, 38.058333333516941 ], [ 10.694999999950426, 38.409999999600757 ], [ 9.903333333666751, 38.241666667083393 ], [ 9.673333333766948, 38.22500000015026 ], [ 9.563333333267337, 38.250000000100442 ], [ 8.813333332967318, 38.218333333017256 ], [ 8.541666667083348, 38.175000000250179 ], [ 8.371666666883698, 38.129999999800532 ], [ 8.159999999800732, 38.081666666683532 ], [ 7.816666666711455, 38.010000000266757 ], [ 7.812045318736921, 38.009980300750442 ], [ 7.476029583898708, 38.13012471238585 ], [ 7.44248390211078, 38.142423580783884 ], [ 7.37549760632993, 38.168238433057638 ], [ 7.308651416829775, 38.195674627182598 ], [ 7.060117028978084, 38.301513148912989 ], [ 6.977569564184535, 38.335076510472902 ], [ 6.892501627048773, 38.367619011108786 ], [ 6.821986848414838, 38.393087515576667 ], [ 6.739812639142485, 38.440291435101813 ], [ 6.668799065924588, 38.478962170667728 ], [ 6.478574996439193, 38.578875851739497 ], [ 6.431816185568891, 38.603780033422083 ], [ 6.066551114542563, 38.800874592388766 ], [ 6.096666666933402, 38.91666666663366 ], [ 6.216666666333822, 39.34666666703356 ], [ 6.300000000100283, 39.625000000050363 ], [ 6.300000000100283, 40.02833333371666 ], [ 6.198333333516928, 40.358333333416908 ], [ 6.168333333217163, 40.454999999650681 ], [ 6.129999999900519, 40.595000000450113 ], [ 5.959999999700699, 41.108333333716644 ], [ 5.943333333666942, 41.155000000050336 ], [ 5.889722222116461, 41.24333333147581 ], [ 5.90562909573174, 41.252313761112134 ], [ 5.911589427033164, 41.255678742639191 ], [ 6.204110593387782, 41.42082532111084 ], [ 6.369444444375517, 41.514166668461428 ], [ 6.930277777987726, 41.815833331739043 ], [ 7.1357999243113, 41.772276479036975 ], [ 7.689166666737776, 41.654999999975303 ], [ 7.986944444287985, 41.583055557811178 ], [ 8.139542767365413, 41.537169347676127 ], [ 8.304722222088117, 41.487499999962779 ], [ 8.556666666950093, 41.336111110425918 ], [ 8.65999999970029, 41.264722219754788 ], [ 8.774999999825411, 41.250000000200203 ], [ 8.812777777725501, 41.257777778849629 ], [ 9.134858924126092, 41.318029169562351 ], [ 9.270000000050402, 41.291944442214458 ] ] ] } } +] +} From 24091fe633632f609480694c8be5bf950c512124 Mon Sep 17 00:00:00 2001 From: Lukas Trippe Date: Fri, 13 Dec 2024 18:18:01 +0100 Subject: [PATCH 09/11] fix: retry failed cartopy retrievals (#1455) * fix: retry failed cartopy retrievals * fix * fix --- scripts/_helpers.py | 46 ++++++++++++++++++++++++++- scripts/plot_gas_network.py | 3 +- scripts/plot_hydrogen_network.py | 3 +- scripts/plot_power_network.py | 3 +- scripts/plot_power_network_perfect.py | 3 +- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/scripts/_helpers.py b/scripts/_helpers.py index 064488ec6..55f151264 100644 --- a/scripts/_helpers.py +++ b/scripts/_helpers.py @@ -9,12 +9,15 @@ import logging import os import re +import time import urllib -from functools import partial +from functools import partial, wraps from os.path import exists from pathlib import Path from shutil import copyfile +from typing import Callable +import fiona import pandas as pd import pytz import requests @@ -415,6 +418,47 @@ def progress_retrieve(url, file, disable=False): t.update(len(data)) +def retry(func: Callable) -> Callable: + """ + Retry decorator to run retry function on specific exceptions, before raising them. + + Can for example be used for debugging issues which are hard to replicate or + for for handling retrieval errors. + + Currently catches: + - fiona.errors.DriverError + + Parameters + ---------- + retries : int + Number of retries before raising the exception. + delay : int + Delay between retries in seconds. + + Returns + ------- + callable + A decorator function that can be used to wrap the function to be retried. + """ + retries = 3 + delay = 5 + + @wraps(func) + def wrapper(*args, **kwargs): + for attempt in range(retries): + try: + return func(*args, **kwargs) + except fiona.errors.DriverError as e: + logger.warning( + f"Attempt {attempt + 1} failed: {type(e).__name__} - {e}. " + f"Retrying..." + ) + time.sleep(delay) + raise Exception("Retrieval retries exhausted.") + + return wrapper + + def mock_snakemake( rulename, root_dir=None, diff --git a/scripts/plot_gas_network.py b/scripts/plot_gas_network.py index 8f03db09c..8a915a814 100644 --- a/scripts/plot_gas_network.py +++ b/scripts/plot_gas_network.py @@ -13,13 +13,14 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging, set_scenario_config +from _helpers import configure_logging, retry, set_scenario_config from plot_power_network import assign_location, load_projection from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches logger = logging.getLogger(__name__) +@retry def plot_ch4_map(n): # if "gas pipeline" not in n.links.carrier.unique(): # return diff --git a/scripts/plot_hydrogen_network.py b/scripts/plot_hydrogen_network.py index 327312e95..cb21bb120 100644 --- a/scripts/plot_hydrogen_network.py +++ b/scripts/plot_hydrogen_network.py @@ -13,7 +13,7 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging, set_scenario_config +from _helpers import configure_logging, retry, set_scenario_config from plot_power_network import assign_location, load_projection from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches @@ -43,6 +43,7 @@ def group_pipes(df, drop_direction=False): ) +@retry def plot_h2_map(n, regions): # if "H2 pipeline" not in n.links.carrier.unique(): # return diff --git a/scripts/plot_power_network.py b/scripts/plot_power_network.py index 69a4e4f9d..b06e35e43 100644 --- a/scripts/plot_power_network.py +++ b/scripts/plot_power_network.py @@ -14,7 +14,7 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging, rename_techs, set_scenario_config +from _helpers import configure_logging, rename_techs, retry, set_scenario_config from plot_summary import preferred_order from pypsa.plot import add_legend_circles, add_legend_lines, add_legend_patches @@ -62,6 +62,7 @@ def load_projection(plotting_params): return proj_func(**proj_kwargs) +@retry def plot_map( n, components=["links", "stores", "storage_units", "generators"], diff --git a/scripts/plot_power_network_perfect.py b/scripts/plot_power_network_perfect.py index 29dc5c6db..560661450 100644 --- a/scripts/plot_power_network_perfect.py +++ b/scripts/plot_power_network_perfect.py @@ -13,7 +13,7 @@ import matplotlib.pyplot as plt import pandas as pd import pypsa -from _helpers import configure_logging, set_scenario_config +from _helpers import configure_logging, retry, set_scenario_config from plot_power_network import assign_location, load_projection, rename_techs_tyndp from plot_summary import preferred_order from pypsa.plot import add_legend_circles, add_legend_lines @@ -21,6 +21,7 @@ logger = logging.getLogger(__name__) +@retry def plot_map_perfect( n, components=["Link", "Store", "StorageUnit", "Generator"], From 32ee24aab6eeae17e3c0754cb7237b7f8443568d Mon Sep 17 00:00:00 2001 From: Lukas Trippe Date: Wed, 18 Dec 2024 11:44:01 +0100 Subject: [PATCH 10/11] fix: pin `rasterio` and GDAL (#1457) --- envs/environment.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/envs/environment.yaml b/envs/environment.yaml index 631958eb9..72bd69f71 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -57,7 +57,8 @@ dependencies: # GIS dependencies: - cartopy - descartes -- rasterio +- rasterio==1.4.1 +- libgdal-core<3.10.0 # rasterio>=1.4.2 needed for GDAL 3.10 - pip: - gurobipy From 35b07ed02df1cc8effa2accffa724980b5489939 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 14:15:42 +0100 Subject: [PATCH 11/11] [github-actions.ci] Update pinned envs (#1456) * Update pinned environment files for all platforms * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: lkstrp <62255395+lkstrp@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- envs/linux-pinned.yaml | 904 ++++++++++++++++++++------------------- envs/macos-pinned.yaml | 788 +++++++++++++++++----------------- envs/windows-pinned.yaml | 788 +++++++++++++++++----------------- 3 files changed, 1266 insertions(+), 1214 deletions(-) diff --git a/envs/linux-pinned.yaml b/envs/linux-pinned.yaml index 1d7d70731..2dba4ca8c 100644 --- a/envs/linux-pinned.yaml +++ b/envs/linux-pinned.yaml @@ -3,448 +3,466 @@ name: pypsa-eur channels: -- conda-forge -- bioconda -- defaults -- https://repo.anaconda.com/pkgs/main -- https://repo.anaconda.com/pkgs/r + - conda-forge + - bioconda + - defaults + - https://repo.anaconda.com/pkgs/main + - https://repo.anaconda.com/pkgs/r dependencies: -- _libgcc_mutex=0.1 -- _openmp_mutex=4.5 -- affine=2.4.0 -- alsa-lib=1.2.13 -- ampl-asl=1.0.0 -- amply=0.1.6 -- aom=3.9.1 -- appdirs=1.4.4 -- argparse-dataclass=2.0.0 -- asttokens=3.0.0 -- atk-1.0=2.38.0 -- atlite=0.3.0 -- attrs=24.2.0 -- aws-c-auth=0.8.0 -- aws-c-cal=0.8.1 -- aws-c-common=0.10.5 -- aws-c-compression=0.3.0 -- aws-c-event-stream=0.5.0 -- aws-c-http=0.9.2 -- aws-c-io=0.15.3 -- aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.5 -- aws-c-sdkutils=0.2.1 -- aws-checksums=0.2.2 -- aws-crt-cpp=0.29.7 -- aws-sdk-cpp=1.11.458 -- azure-core-cpp=1.14.0 -- azure-identity-cpp=1.10.0 -- azure-storage-blobs-cpp=12.13.0 -- azure-storage-common-cpp=12.8.0 -- azure-storage-files-datalake-cpp=12.12.0 -- beautifulsoup4=4.12.3 -- blosc=1.21.6 -- bokeh=3.6.2 -- bottleneck=1.4.2 -- branca=0.7.2 -- brotli=1.1.0 -- brotli-bin=1.1.0 -- brotli-python=1.1.0 -- bzip2=1.0.8 -- c-ares=1.34.3 -- c-blosc2=2.15.2 -- ca-certificates=2024.8.30 -- cairo=1.18.2 -- cartopy=0.24.0 -- cdsapi=0.7.5 -- certifi=2024.8.30 -- cffi=1.17.1 -- cfgv=3.3.1 -- cftime=1.6.4 -- charset-normalizer=3.4.0 -- click=8.1.7 -- click-plugins=1.1.1 -- cligj=0.7.2 -- cloudpickle=3.1.0 -- coin-or-cbc=2.10.12 -- coin-or-cgl=0.60.9 -- coin-or-clp=1.17.10 -- coin-or-osi=0.108.11 -- coin-or-utils=2.11.12 -- coincbc=2.10.12 -- colorama=0.4.6 -- conda-inject=1.3.2 -- configargparse=1.7 -- connection_pool=0.0.3 -- contourpy=1.3.1 -- country_converter=1.2 -- cppad=20240000.7 -- cycler=0.12.1 -- cyrus-sasl=2.1.27 -- cytoolz=1.0.0 -- dask=2024.12.0 -- dask-core=2024.12.0 -- dask-expr=1.1.20 -- datapi=0.1.1 -- datrie=0.8.2 -- dav1d=1.2.1 -- dbus=1.13.6 -- decorator=5.1.1 -- deprecation=2.1.0 -- descartes=1.1.0 -- distlib=0.3.9 -- distributed=2024.12.0 -- docutils=0.21.2 -- double-conversion=3.3.0 -- dpath=2.2.0 -- entsoe-py=0.6.11 -- et_xmlfile=2.0.0 -- exceptiongroup=1.2.2 -- executing=2.1.0 -- expat=2.6.4 -- filelock=3.16.1 -- fiona=1.10.1 -- folium=0.18.0 -- font-ttf-dejavu-sans-mono=2.37 -- font-ttf-inconsolata=3.000 -- font-ttf-source-code-pro=2.038 -- font-ttf-ubuntu=0.83 -- fontconfig=2.15.0 -- fonts-conda-ecosystem=1 -- fonts-conda-forge=1 -- fonttools=4.55.2 -- freetype=2.12.1 -- freexl=2.0.0 -- fribidi=1.0.10 -- fsspec=2024.10.0 -- gdk-pixbuf=2.42.12 -- geographiclib=2.0 -- geojson=3.1.0 -- geojson-rewind=1.1.0 -- geopandas=1.0.1 -- geopandas-base=1.0.1 -- geopy=2.4.1 -- geos=3.13.0 -- geotiff=1.7.3 -- gflags=2.2.2 -- giflib=5.2.2 -- gitdb=4.0.11 -- gitpython=3.1.43 -- glog=0.7.1 -- glpk=5.0 -- gmp=6.3.0 -- graphite2=1.3.13 -- graphviz=12.0.0 -- gtk2=2.24.33 -- gts=0.7.6 -- h2=4.1.0 -- harfbuzz=9.0.0 -- hdf4=4.2.15 -- hdf5=1.14.4 -- hpack=4.0.0 -- humanfriendly=10.0 -- hyperframe=6.0.1 -- icu=75.1 -- identify=2.6.3 -- idna=3.10 -- immutables=0.21 -- importlib-metadata=8.5.0 -- importlib_resources=6.4.5 -- iniconfig=2.0.0 -- ipopt=3.14.16 -- ipython=8.30.0 -- jedi=0.19.2 -- jinja2=3.1.4 -- joblib=1.4.2 -- jpype1=1.5.1 -- json-c=0.18 -- jsonschema=4.23.0 -- jsonschema-specifications=2024.10.1 -- jupyter_core=5.7.2 -- keyutils=1.6.1 -- kiwisolver=1.4.7 -- krb5=1.21.3 -- lcms2=2.16 -- ld_impl_linux-64=2.43 -- lerc=4.0.0 -- libabseil=20240722.0 -- libaec=1.1.3 -- libarchive=3.7.7 -- libarrow=18.1.0 -- libarrow-acero=18.1.0 -- libarrow-dataset=18.1.0 -- libarrow-substrait=18.1.0 -- libavif16=1.1.1 -- libblas=3.9.0 -- libbrotlicommon=1.1.0 -- libbrotlidec=1.1.0 -- libbrotlienc=1.1.0 -- libcblas=3.9.0 -- libclang-cpp19.1=19.1.5 -- libclang13=19.1.5 -- libcrc32c=1.1.2 -- libcups=2.3.3 -- libcurl=8.10.1 -- libde265=1.0.15 -- libdeflate=1.22 -- libdrm=2.4.124 -- libedit=3.1.20191231 -- libegl=1.7.0 -- libev=4.33 -- libevent=2.1.12 -- libexpat=2.6.4 -- libffi=3.4.2 -- libgcc=14.2.0 -- libgcc-ng=14.2.0 -- libgd=2.3.3 -- libgdal-core=3.10.0 -- libgfortran=14.2.0 -- libgfortran-ng=14.2.0 -- libgfortran5=14.2.0 -- libgl=1.7.0 -- libglib=2.82.2 -- libglvnd=1.7.0 -- libglx=1.7.0 -- libgomp=14.2.0 -- libgoogle-cloud=2.31.0 -- libgoogle-cloud-storage=2.31.0 -- libgrpc=1.67.1 -- libheif=1.18.2 -- libhwloc=2.11.2 -- libiconv=1.17 -- libjpeg-turbo=3.0.0 -- libkml=1.3.0 -- liblapack=3.9.0 -- liblapacke=3.9.0 -- libllvm19=19.1.5 -- liblzma=5.6.3 -- liblzma-devel=5.6.3 -- libnetcdf=4.9.2 -- libnghttp2=1.64.0 -- libnsl=2.0.1 -- libntlm=1.4 -- libopenblas=0.3.28 -- libopengl=1.7.0 -- libparquet=18.1.0 -- libpciaccess=0.18 -- libpng=1.6.44 -- libpq=17.2 -- libprotobuf=5.28.2 -- libre2-11=2024.07.02 -- librsvg=2.58.4 -- librttopo=1.1.0 -- libscotch=7.0.4 -- libspatialite=5.1.0 -- libspral=2024.05.08 -- libsqlite=3.47.2 -- libssh2=1.11.1 -- libstdcxx=14.2.0 -- libstdcxx-ng=14.2.0 -- libthrift=0.21.0 -- libtiff=4.7.0 -- libutf8proc=2.9.0 -- libuuid=2.38.1 -- libwebp-base=1.4.0 -- libxcb=1.17.0 -- libxcrypt=4.4.36 -- libxkbcommon=1.7.0 -- libxml2=2.13.5 -- libxslt=1.1.39 -- libzip=1.11.2 -- libzlib=1.3.1 -- linopy=0.4.3 -- locket=1.0.0 -- lxml=5.3.0 -- lz4=4.3.3 -- lz4-c=1.9.4 -- lzo=2.10 -- mapclassify=2.8.1 -- markupsafe=3.0.2 -- matplotlib=3.9.3 -- matplotlib-base=3.9.3 -- matplotlib-inline=0.1.7 -- memory_profiler=0.61.0 -- metis=5.1.0 -- minizip=4.0.7 -- mpfr=4.2.1 -- msgpack-python=1.1.0 -- multiurl=0.3.3 -- mumps-include=5.7.3 -- mumps-seq=5.7.3 -- munkres=1.1.4 -- mysql-common=9.0.1 -- mysql-libs=9.0.1 -- nbformat=5.10.4 -- ncurses=6.5 -- netcdf4=1.7.2 -- networkx=3.4.2 -- nodeenv=1.9.1 -- nomkl=1.0 -- numexpr=2.10.2 -- numpy=1.26.4 -- openjpeg=2.5.3 -- openldap=2.6.9 -- openpyxl=3.1.5 -- openssl=3.4.0 -- orc=2.0.3 -- packaging=24.2 -- pandas=2.2.3 -- pango=1.54.0 -- parso=0.8.4 -- partd=1.4.2 -- patsy=1.0.1 -- pcre2=10.44 -- pexpect=4.9.0 -- pickleshare=0.7.5 -- pillow=11.0.0 -- pip=24.3.1 -- pixman=0.44.2 -- pkgutil-resolve-name=1.3.10 -- plac=1.4.3 -- platformdirs=4.3.6 -- pluggy=1.5.0 -- polars=1.17.1 -- powerplantmatching=0.5.19 -- pre-commit=4.0.1 -- progressbar2=4.5.0 -- proj=9.5.1 -- prompt-toolkit=3.0.48 -- psutil=6.1.0 -- pthread-stubs=0.4 -- ptyprocess=0.7.0 -- pulp=2.8.0 -- pure_eval=0.2.3 -- py-cpuinfo=9.0.0 -- pyarrow=18.1.0 -- pyarrow-core=18.1.0 -- pycountry=24.6.1 -- pycparser=2.22 -- pygments=2.18.0 -- pyogrio=0.10.0 -- pyparsing=3.2.0 -- pyproj=3.7.0 -- pypsa=0.32.0 -- pyscipopt=5.2.1 -- pyshp=2.3.1 -- pyside6=6.8.0.2 -- pysocks=1.7.1 -- pytables=3.10.1 -- pytest=8.3.4 -- python=3.12.8 -- python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.21.1 -- python-tzdata=2024.2 -- python-utils=3.9.1 -- python_abi=3.12 -- pytz=2024.1 -- pyxlsb=1.0.10 -- pyyaml=6.0.2 -- qhull=2020.2 -- qt6-main=6.8.0 -- rasterio=1.4.3 -- rav1e=0.6.6 -- re2=2024.07.02 -- readline=8.2 -- referencing=0.35.1 -- requests=2.32.3 -- reretry=0.11.8 -- rioxarray=0.17.0 -- rpds-py=0.22.3 -- s2n=1.5.9 -- scikit-learn=1.6.0 -- scip=9.1.1 -- scipy=1.14.1 -- seaborn=0.13.2 -- seaborn-base=0.13.2 -- setuptools=75.6.0 -- shapely=2.0.6 -- six=1.17.0 -- smart_open=7.0.5 -- smmap=5.0.0 -- snakemake-interface-common=1.17.4 -- snakemake-interface-executor-plugins=9.3.2 -- snakemake-interface-report-plugins=1.1.0 -- snakemake-interface-storage-plugins=3.3.0 -- snakemake-minimal=8.24.1 -- snappy=1.2.1 -- snuggs=1.4.7 -- sortedcontainers=2.4.0 -- soupsieve=2.5 -- sqlite=3.47.2 -- stack_data=0.6.3 -- statsmodels=0.14.4 -- svt-av1=2.3.0 -- tabulate=0.9.0 -- tbb=2022.0.0 -- tblib=3.0.0 -- threadpoolctl=3.5.0 -- throttler=1.2.2 -- tk=8.6.13 -- tomli=2.2.1 -- toolz=1.0.0 -- tornado=6.4.2 -- tqdm=4.67.1 -- traitlets=5.14.3 -- typing-extensions=4.12.2 -- typing_extensions=4.12.2 -- tzdata=2024b -- ukkonen=1.0.1 -- unicodedata2=15.1.0 -- unidecode=1.3.8 -- uriparser=0.9.8 -- urllib3=2.2.3 -- validators=0.34.0 -- virtualenv=20.28.0 -- wayland=1.23.1 -- wcwidth=0.2.13 -- wheel=0.45.1 -- wrapt=1.17.0 -- x265=3.5 -- xarray=2024.11.0 -- xcb-util=0.4.1 -- xcb-util-cursor=0.1.5 -- xcb-util-image=0.4.0 -- xcb-util-keysyms=0.4.1 -- xcb-util-renderutil=0.3.10 -- xcb-util-wm=0.4.2 -- xerces-c=3.2.5 -- xkeyboard-config=2.43 -- xlrd=2.0.1 -- xorg-libice=1.1.1 -- xorg-libsm=1.2.4 -- xorg-libx11=1.8.10 -- xorg-libxau=1.0.11 -- xorg-libxcomposite=0.4.6 -- xorg-libxcursor=1.2.3 -- xorg-libxdamage=1.1.6 -- xorg-libxdmcp=1.1.5 -- xorg-libxext=1.3.6 -- xorg-libxfixes=6.0.1 -- xorg-libxi=1.8.2 -- xorg-libxrandr=1.5.4 -- xorg-libxrender=0.9.11 -- xorg-libxtst=1.2.5 -- xorg-libxxf86vm=1.1.5 -- xyzservices=2024.9.0 -- xz=5.6.3 -- xz-gpl-tools=5.6.3 -- xz-tools=5.6.3 -- yaml=0.2.5 -- yte=1.5.5 -- zict=3.0.0 -- zipp=3.21.0 -- zlib=1.3.1 -- zlib-ng=2.2.2 -- zstandard=0.23.0 -- zstd=1.5.6 -- pip: - - gurobipy==12.0.0 - - highspy==1.7.2 - - oauthlib==3.2.2 - - ply==3.11 - - pyomo==6.8.2 - - requests-oauthlib==1.3.1 - - snakemake-executor-plugin-cluster-generic==1.0.9 - - snakemake-executor-plugin-slurm==0.11.2 - - snakemake-executor-plugin-slurm-jobstep==0.2.1 - - snakemake-storage-plugin-http==0.2.3 - - tsam==2.3.6 + - _libgcc_mutex=0.1 + - _openmp_mutex=4.5 + - affine=2.4.0 + - alsa-lib=1.2.13 + - ampl-asl=1.0.0 + - amply=0.1.6 + - appdirs=1.4.4 + - argparse-dataclass=2.0.0 + - asttokens=3.0.0 + - atk-1.0=2.38.0 + - atlite=0.3.0 + - attrs=24.3.0 + - aws-c-auth=0.8.0 + - aws-c-cal=0.8.1 + - aws-c-common=0.10.6 + - aws-c-compression=0.3.0 + - aws-c-event-stream=0.5.0 + - aws-c-http=0.9.2 + - aws-c-io=0.15.3 + - aws-c-mqtt=0.11.0 + - aws-c-s3=0.7.7 + - aws-c-sdkutils=0.2.1 + - aws-checksums=0.2.2 + - aws-crt-cpp=0.29.7 + - aws-sdk-cpp=1.11.458 + - azure-core-cpp=1.14.0 + - azure-identity-cpp=1.10.0 + - azure-storage-blobs-cpp=12.13.0 + - azure-storage-common-cpp=12.8.0 + - azure-storage-files-datalake-cpp=12.12.0 + - beautifulsoup4=4.12.3 + - blosc=1.21.6 + - bokeh=3.6.2 + - bottleneck=1.4.2 + - branca=0.8.1 + - brotli=1.1.0 + - brotli-bin=1.1.0 + - brotli-python=1.1.0 + - bzip2=1.0.8 + - c-ares=1.34.4 + - c-blosc2=2.15.2 + - ca-certificates=2024.12.14 + - cairo=1.18.2 + - capnproto=1.0.2 + - cartopy=0.24.0 + - cdsapi=0.7.5 + - certifi=2024.12.14 + - cffi=1.17.1 + - cfgv=3.3.1 + - cfitsio=4.4.1 + - cftime=1.6.4 + - charset-normalizer=3.4.0 + - click=8.1.7 + - click-plugins=1.1.1 + - cligj=0.7.2 + - cloudpickle=3.1.0 + - coin-or-cbc=2.10.12 + - coin-or-cgl=0.60.9 + - coin-or-clp=1.17.10 + - coin-or-osi=0.108.11 + - coin-or-utils=2.11.12 + - coincbc=2.10.12 + - colorama=0.4.6 + - conda-inject=1.3.2 + - configargparse=1.7 + - connection_pool=0.0.3 + - contourpy=1.3.1 + - country_converter=1.2 + - cppad=20240000.7 + - cycler=0.12.1 + - cyrus-sasl=2.1.27 + - cytoolz=1.0.1 + - dask=2024.12.1 + - dask-core=2024.12.1 + - dask-expr=1.1.21 + - datapi=0.1.1 + - datrie=0.8.2 + - dbus=1.13.6 + - decorator=5.1.1 + - deprecation=2.1.0 + - descartes=1.1.0 + - distlib=0.3.9 + - distributed=2024.12.1 + - docutils=0.21.2 + - double-conversion=3.3.0 + - dpath=2.2.0 + - entsoe-py=0.6.11 + - et_xmlfile=2.0.0 + - exceptiongroup=1.2.2 + - executing=2.1.0 + - expat=2.6.4 + - filelock=3.16.1 + - fiona=1.10.1 + - fmt=11.0.2 + - folium=0.19.2 + - font-ttf-dejavu-sans-mono=2.37 + - font-ttf-inconsolata=3.000 + - font-ttf-source-code-pro=2.038 + - font-ttf-ubuntu=0.83 + - fontconfig=2.15.0 + - fonts-conda-ecosystem=1 + - fonts-conda-forge=1 + - fonttools=4.55.3 + - freetype=2.12.1 + - freexl=2.0.0 + - fribidi=1.0.10 + - fsspec=2024.10.0 + - gdal=3.9.3 + - gdk-pixbuf=2.42.12 + - geographiclib=2.0 + - geojson=3.1.0 + - geojson-rewind=1.1.0 + - geopandas=1.0.1 + - geopandas-base=1.0.1 + - geopy=2.4.1 + - geos=3.13.0 + - geotiff=1.7.3 + - gflags=2.2.2 + - giflib=5.2.2 + - gitdb=4.0.11 + - gitpython=3.1.43 + - glog=0.7.1 + - glpk=5.0 + - gmp=6.3.0 + - graphite2=1.3.13 + - graphviz=12.0.0 + - gtk2=2.24.33 + - gts=0.7.6 + - h2=4.1.0 + - harfbuzz=9.0.0 + - hdf4=4.2.15 + - hdf5=1.14.3 + - hpack=4.0.0 + - humanfriendly=10.0 + - hyperframe=6.0.1 + - icu=75.1 + - identify=2.6.3 + - idna=3.10 + - immutables=0.21 + - importlib-metadata=8.5.0 + - importlib_resources=6.4.5 + - iniconfig=2.0.0 + - ipopt=3.14.16 + - ipython=8.30.0 + - jedi=0.19.2 + - jinja2=3.1.4 + - joblib=1.4.2 + - jpype1=1.5.1 + - json-c=0.18 + - jsonschema=4.23.0 + - jsonschema-specifications=2024.10.1 + - jupyter_core=5.7.2 + - kealib=1.6.0 + - keyutils=1.6.1 + - kiwisolver=1.4.7 + - krb5=1.21.3 + - lcms2=2.16 + - ld_impl_linux-64=2.43 + - lerc=4.0.0 + - libabseil=20240722.0 + - libaec=1.1.3 + - libarchive=3.7.7 + - libarrow=18.1.0 + - libarrow-acero=18.1.0 + - libarrow-dataset=18.1.0 + - libarrow-substrait=18.1.0 + - libblas=3.9.0 + - libbrotlicommon=1.1.0 + - libbrotlidec=1.1.0 + - libbrotlienc=1.1.0 + - libcblas=3.9.0 + - libclang-cpp19.1=19.1.6 + - libclang13=19.1.6 + - libcrc32c=1.1.2 + - libcups=2.3.3 + - libcurl=8.11.1 + - libdeflate=1.23 + - libdrm=2.4.124 + - libedit=3.1.20191231 + - libegl=1.7.0 + - libev=4.33 + - libevent=2.1.12 + - libexpat=2.6.4 + - libffi=3.4.2 + - libgcc=14.2.0 + - libgcc-ng=14.2.0 + - libgd=2.3.3 + - libgdal=3.9.3 + - libgdal-core=3.9.3 + - libgdal-fits=3.9.3 + - libgdal-grib=3.9.3 + - libgdal-hdf4=3.9.3 + - libgdal-hdf5=3.9.3 + - libgdal-jp2openjpeg=3.9.3 + - libgdal-kea=3.9.3 + - libgdal-netcdf=3.9.3 + - libgdal-pdf=3.9.3 + - libgdal-pg=3.9.3 + - libgdal-postgisraster=3.9.3 + - libgdal-tiledb=3.9.3 + - libgdal-xls=3.9.3 + - libgfortran=14.2.0 + - libgfortran-ng=14.2.0 + - libgfortran5=14.2.0 + - libgl=1.7.0 + - libglib=2.82.2 + - libglvnd=1.7.0 + - libglx=1.7.0 + - libgomp=14.2.0 + - libgoogle-cloud=2.32.0 + - libgoogle-cloud-storage=2.32.0 + - libgrpc=1.67.1 + - libhwloc=2.11.2 + - libiconv=1.17 + - libjpeg-turbo=3.0.0 + - libkml=1.3.0 + - liblapack=3.9.0 + - liblapacke=3.9.0 + - libllvm19=19.1.6 + - liblzma=5.6.3 + - liblzma-devel=5.6.3 + - libnetcdf=4.9.2 + - libnghttp2=1.64.0 + - libnsl=2.0.1 + - libntlm=1.4 + - libopenblas=0.3.28 + - libopengl=1.7.0 + - libparquet=18.1.0 + - libpciaccess=0.18 + - libpng=1.6.44 + - libpq=17.2 + - libprotobuf=5.28.2 + - libre2-11=2024.07.02 + - librsvg=2.58.4 + - librttopo=1.1.0 + - libscotch=7.0.4 + - libspatialite=5.1.0 + - libspral=2024.05.08 + - libsqlite=3.47.2 + - libssh2=1.11.1 + - libstdcxx=14.2.0 + - libstdcxx-ng=14.2.0 + - libthrift=0.21.0 + - libtiff=4.7.0 + - libutf8proc=2.9.0 + - libuuid=2.38.1 + - libwebp-base=1.4.0 + - libxcb=1.17.0 + - libxcrypt=4.4.36 + - libxkbcommon=1.7.0 + - libxml2=2.13.5 + - libxslt=1.1.39 + - libzip=1.11.2 + - libzlib=1.3.1 + - linopy=0.4.3 + - locket=1.0.0 + - lxml=5.3.0 + - lz4=4.3.3 + - lz4-c=1.10.0 + - lzo=2.10 + - mapclassify=2.8.1 + - markupsafe=3.0.2 + - matplotlib=3.10.0 + - matplotlib-base=3.10.0 + - matplotlib-inline=0.1.7 + - memory_profiler=0.61.0 + - metis=5.1.0 + - minizip=4.0.7 + - mpfr=4.2.1 + - msgpack-python=1.1.0 + - multiurl=0.3.3 + - mumps-include=5.7.3 + - mumps-seq=5.7.3 + - munkres=1.1.4 + - mysql-common=9.0.1 + - mysql-libs=9.0.1 + - nbformat=5.10.4 + - ncurses=6.5 + - netcdf4=1.7.2 + - networkx=3.4.2 + - nodeenv=1.9.1 + - nomkl=1.0 + - nspr=4.36 + - nss=3.107 + - numexpr=2.10.2 + - numpy=1.26.4 + - openjpeg=2.5.3 + - openldap=2.6.9 + - openpyxl=3.1.5 + - openssl=3.4.0 + - orc=2.0.3 + - packaging=24.2 + - pandas=2.2.3 + - pango=1.54.0 + - parso=0.8.4 + - partd=1.4.2 + - patsy=1.0.1 + - pcre2=10.44 + - pexpect=4.9.0 + - pickleshare=0.7.5 + - pillow=11.0.0 + - pip=24.3.1 + - pixman=0.44.2 + - pkgutil-resolve-name=1.3.10 + - plac=1.4.3 + - platformdirs=4.3.6 + - pluggy=1.5.0 + - polars=1.17.1 + - poppler=24.12.0 + - poppler-data=0.4.12 + - postgresql=17.2 + - powerplantmatching=0.5.19 + - pre-commit=4.0.1 + - progressbar2=4.5.0 + - proj=9.5.1 + - prompt-toolkit=3.0.48 + - psutil=6.1.0 + - pthread-stubs=0.4 + - ptyprocess=0.7.0 + - pulp=2.8.0 + - pure_eval=0.2.3 + - py-cpuinfo=9.0.0 + - pyarrow=18.1.0 + - pyarrow-core=18.1.0 + - pycountry=24.6.1 + - pycparser=2.22 + - pygments=2.18.0 + - pyogrio=0.10.0 + - pyparsing=3.2.0 + - pyproj=3.7.0 + - pypsa=0.32.0 + - pyscipopt=5.2.1 + - pyshp=2.3.1 + - pyside6=6.8.1 + - pysocks=1.7.1 + - pytables=3.10.1 + - pytest=8.3.4 + - python=3.12.8 + - python-dateutil=2.9.0.post0 + - python-fastjsonschema=2.21.1 + - python-tzdata=2024.2 + - python-utils=3.9.1 + - python_abi=3.12 + - pytz=2024.1 + - pyxlsb=1.0.10 + - pyyaml=6.0.2 + - qhull=2020.2 + - qt6-main=6.8.1 + - rasterio=1.4.1 + - re2=2024.07.02 + - readline=8.2 + - referencing=0.35.1 + - requests=2.32.3 + - reretry=0.11.8 + - rioxarray=0.17.0 + - rpds-py=0.22.3 + - s2n=1.5.10 + - scikit-learn=1.6.0 + - scip=9.1.1 + - scipy=1.14.1 + - seaborn=0.13.2 + - seaborn-base=0.13.2 + - setuptools=75.6.0 + - shapely=2.0.6 + - six=1.17.0 + - smart_open=7.1.0 + - smmap=5.0.0 + - snakemake-interface-common=1.17.4 + - snakemake-interface-executor-plugins=9.3.2 + - snakemake-interface-report-plugins=1.1.0 + - snakemake-interface-storage-plugins=3.3.0 + - snakemake-minimal=8.24.1 + - snappy=1.2.1 + - snuggs=1.4.7 + - sortedcontainers=2.4.0 + - soupsieve=2.5 + - spdlog=1.14.1 + - sqlite=3.47.2 + - stack_data=0.6.3 + - statsmodels=0.14.4 + - tabulate=0.9.0 + - tbb=2022.0.0 + - tblib=3.0.0 + - threadpoolctl=3.5.0 + - throttler=1.2.2 + - tiledb=2.27.0 + - tk=8.6.13 + - tomli=2.2.1 + - toolz=1.0.0 + - tornado=6.4.2 + - tqdm=4.67.1 + - traitlets=5.14.3 + - typing-extensions=4.12.2 + - typing_extensions=4.12.2 + - tzcode=2024b + - tzdata=2024b + - ukkonen=1.0.1 + - unicodedata2=15.1.0 + - unidecode=1.3.8 + - uriparser=0.9.8 + - urllib3=2.2.3 + - validators=0.34.0 + - virtualenv=20.28.0 + - wayland=1.23.1 + - wcwidth=0.2.13 + - wheel=0.45.1 + - wrapt=1.17.0 + - xarray=2024.11.0 + - xcb-util=0.4.1 + - xcb-util-cursor=0.1.5 + - xcb-util-image=0.4.0 + - xcb-util-keysyms=0.4.1 + - xcb-util-renderutil=0.3.10 + - xcb-util-wm=0.4.2 + - xerces-c=3.2.5 + - xkeyboard-config=2.43 + - xlrd=2.0.1 + - xorg-libice=1.1.2 + - xorg-libsm=1.2.5 + - xorg-libx11=1.8.10 + - xorg-libxau=1.0.12 + - xorg-libxcomposite=0.4.6 + - xorg-libxcursor=1.2.3 + - xorg-libxdamage=1.1.6 + - xorg-libxdmcp=1.1.5 + - xorg-libxext=1.3.6 + - xorg-libxfixes=6.0.1 + - xorg-libxi=1.8.2 + - xorg-libxrandr=1.5.4 + - xorg-libxrender=0.9.12 + - xorg-libxtst=1.2.5 + - xorg-libxxf86vm=1.1.6 + - xyzservices=2024.9.0 + - xz=5.6.3 + - xz-gpl-tools=5.6.3 + - xz-tools=5.6.3 + - yaml=0.2.5 + - yte=1.5.5 + - zict=3.0.0 + - zipp=3.21.0 + - zlib=1.3.1 + - zlib-ng=2.2.2 + - zstandard=0.23.0 + - zstd=1.5.6 + - pip: + - gurobipy==12.0.0 + - highspy==1.7.2 + - oauthlib==3.2.2 + - ply==3.11 + - pyomo==6.8.2 + - requests-oauthlib==1.3.1 + - snakemake-executor-plugin-cluster-generic==1.0.9 + - snakemake-executor-plugin-slurm==0.11.2 + - snakemake-executor-plugin-slurm-jobstep==0.2.1 + - snakemake-storage-plugin-http==0.2.3 + - tsam==2.3.6 prefix: /usr/share/miniconda/envs/pypsa-eur diff --git a/envs/macos-pinned.yaml b/envs/macos-pinned.yaml index a434ee111..75d323afe 100644 --- a/envs/macos-pinned.yaml +++ b/envs/macos-pinned.yaml @@ -3,390 +3,408 @@ name: pypsa-eur channels: -- conda-forge -- bioconda -- defaults -- https://repo.anaconda.com/pkgs/main -- https://repo.anaconda.com/pkgs/r + - conda-forge + - bioconda + - defaults + - https://repo.anaconda.com/pkgs/main + - https://repo.anaconda.com/pkgs/r dependencies: -- affine=2.4.0 -- ampl-asl=1.0.0 -- amply=0.1.6 -- aom=3.9.1 -- appdirs=1.4.4 -- argparse-dataclass=2.0.0 -- asttokens=3.0.0 -- atk-1.0=2.38.0 -- atlite=0.3.0 -- attrs=24.2.0 -- aws-c-auth=0.8.0 -- aws-c-cal=0.8.1 -- aws-c-common=0.10.5 -- aws-c-compression=0.3.0 -- aws-c-event-stream=0.5.0 -- aws-c-http=0.9.2 -- aws-c-io=0.15.3 -- aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.5 -- aws-c-sdkutils=0.2.1 -- aws-checksums=0.2.2 -- aws-crt-cpp=0.29.7 -- aws-sdk-cpp=1.11.458 -- azure-core-cpp=1.14.0 -- azure-identity-cpp=1.10.0 -- azure-storage-blobs-cpp=12.13.0 -- azure-storage-common-cpp=12.8.0 -- azure-storage-files-datalake-cpp=12.12.0 -- beautifulsoup4=4.12.3 -- blosc=1.21.6 -- bokeh=3.6.2 -- bottleneck=1.4.2 -- branca=0.7.2 -- brotli=1.1.0 -- brotli-bin=1.1.0 -- brotli-python=1.1.0 -- bzip2=1.0.8 -- c-ares=1.34.3 -- c-blosc2=2.15.2 -- ca-certificates=2024.8.30 -- cairo=1.18.2 -- cartopy=0.24.0 -- cdsapi=0.7.5 -- certifi=2024.8.30 -- cffi=1.17.1 -- cfgv=3.3.1 -- cftime=1.6.4 -- charset-normalizer=3.4.0 -- click=8.1.7 -- click-plugins=1.1.1 -- cligj=0.7.2 -- cloudpickle=3.1.0 -- coin-or-cbc=2.10.12 -- coin-or-cgl=0.60.9 -- coin-or-clp=1.17.10 -- coin-or-osi=0.108.11 -- coin-or-utils=2.11.12 -- coincbc=2.10.12 -- colorama=0.4.6 -- conda-inject=1.3.2 -- configargparse=1.7 -- connection_pool=0.0.3 -- contourpy=1.3.1 -- country_converter=1.2 -- cppad=20240000.7 -- cycler=0.12.1 -- cytoolz=1.0.0 -- dask=2024.12.0 -- dask-core=2024.12.0 -- dask-expr=1.1.20 -- datapi=0.1.1 -- datrie=0.8.2 -- dav1d=1.2.1 -- decorator=5.1.1 -- deprecation=2.1.0 -- descartes=1.1.0 -- distlib=0.3.9 -- distributed=2024.12.0 -- docutils=0.21.2 -- dpath=2.2.0 -- entsoe-py=0.6.11 -- et_xmlfile=2.0.0 -- exceptiongroup=1.2.2 -- executing=2.1.0 -- filelock=3.16.1 -- fiona=1.10.1 -- folium=0.18.0 -- font-ttf-dejavu-sans-mono=2.37 -- font-ttf-inconsolata=3.000 -- font-ttf-source-code-pro=2.038 -- font-ttf-ubuntu=0.83 -- fontconfig=2.15.0 -- fonts-conda-ecosystem=1 -- fonts-conda-forge=1 -- fonttools=4.55.2 -- freetype=2.12.1 -- freexl=2.0.0 -- fribidi=1.0.10 -- fsspec=2024.10.0 -- gdk-pixbuf=2.42.12 -- geographiclib=2.0 -- geojson=3.1.0 -- geojson-rewind=1.1.0 -- geopandas=1.0.1 -- geopandas-base=1.0.1 -- geopy=2.4.1 -- geos=3.13.0 -- geotiff=1.7.3 -- gflags=2.2.2 -- giflib=5.2.2 -- gitdb=4.0.11 -- gitpython=3.1.43 -- glog=0.7.1 -- glpk=5.0 -- gmp=6.3.0 -- graphite2=1.3.13 -- graphviz=12.0.0 -- gtk2=2.24.33 -- gts=0.7.6 -- h2=4.1.0 -- harfbuzz=9.0.0 -- hdf4=4.2.15 -- hdf5=1.14.4 -- hpack=4.0.0 -- humanfriendly=10.0 -- hyperframe=6.0.1 -- icu=75.1 -- identify=2.6.3 -- idna=3.10 -- immutables=0.21 -- importlib-metadata=8.5.0 -- importlib_resources=6.4.5 -- iniconfig=2.0.0 -- ipopt=3.14.16 -- ipython=8.30.0 -- jedi=0.19.2 -- jinja2=3.1.4 -- joblib=1.4.2 -- jpype1=1.5.1 -- json-c=0.18 -- jsonschema=4.23.0 -- jsonschema-specifications=2024.10.1 -- jupyter_core=5.7.2 -- kiwisolver=1.4.7 -- krb5=1.21.3 -- lcms2=2.16 -- lerc=4.0.0 -- libabseil=20240722.0 -- libaec=1.1.3 -- libarchive=3.7.7 -- libarrow=18.1.0 -- libarrow-acero=18.1.0 -- libarrow-dataset=18.1.0 -- libarrow-substrait=18.1.0 -- libavif16=1.1.1 -- libblas=3.9.0 -- libbrotlicommon=1.1.0 -- libbrotlidec=1.1.0 -- libbrotlienc=1.1.0 -- libcblas=3.9.0 -- libcrc32c=1.1.2 -- libcurl=8.10.1 -- libcxx=19.1.5 -- libde265=1.0.15 -- libdeflate=1.22 -- libedit=3.1.20191231 -- libev=4.33 -- libevent=2.1.12 -- libexpat=2.6.4 -- libffi=3.4.2 -- libgd=2.3.3 -- libgdal-core=3.10.0 -- libgfortran=5.0.0 -- libgfortran5=13.2.0 -- libglib=2.82.2 -- libgoogle-cloud=2.31.0 -- libgoogle-cloud-storage=2.31.0 -- libgrpc=1.67.1 -- libheif=1.18.2 -- libhwloc=2.11.2 -- libiconv=1.17 -- libintl=0.22.5 -- libjpeg-turbo=3.0.0 -- libkml=1.3.0 -- liblapack=3.9.0 -- liblapacke=3.9.0 -- liblzma=5.6.3 -- liblzma-devel=5.6.3 -- libnetcdf=4.9.2 -- libnghttp2=1.64.0 -- libopenblas=0.3.28 -- libparquet=18.1.0 -- libpng=1.6.44 -- libprotobuf=5.28.2 -- libre2-11=2024.07.02 -- librsvg=2.58.4 -- librttopo=1.1.0 -- libscotch=7.0.5 -- libspatialite=5.1.0 -- libsqlite=3.47.2 -- libssh2=1.11.1 -- libthrift=0.21.0 -- libtiff=4.7.0 -- libutf8proc=2.9.0 -- libwebp-base=1.4.0 -- libxcb=1.17.0 -- libxml2=2.13.5 -- libxslt=1.1.39 -- libzip=1.11.2 -- libzlib=1.3.1 -- linopy=0.4.3 -- llvm-openmp=19.1.5 -- locket=1.0.0 -- lxml=5.3.0 -- lz4=4.3.3 -- lz4-c=1.9.4 -- lzo=2.10 -- mapclassify=2.8.1 -- markupsafe=3.0.2 -- matplotlib=3.9.3 -- matplotlib-base=3.9.3 -- matplotlib-inline=0.1.7 -- memory_profiler=0.61.0 -- metis=5.1.0 -- minizip=4.0.7 -- mpfr=4.2.1 -- msgpack-python=1.1.0 -- multiurl=0.3.3 -- mumps-include=5.7.3 -- mumps-seq=5.7.3 -- munkres=1.1.4 -- nbformat=5.10.4 -- ncurses=6.5 -- netcdf4=1.7.2 -- networkx=3.4.2 -- nodeenv=1.9.1 -- numexpr=2.10.2 -- numpy=1.26.4 -- openjpeg=2.5.3 -- openpyxl=3.1.5 -- openssl=3.4.0 -- orc=2.0.3 -- packaging=24.2 -- pandas=2.2.3 -- pango=1.54.0 -- parso=0.8.4 -- partd=1.4.2 -- patsy=1.0.1 -- pcre2=10.44 -- pexpect=4.9.0 -- pickleshare=0.7.5 -- pillow=11.0.0 -- pip=24.3.1 -- pixman=0.44.2 -- pkgutil-resolve-name=1.3.10 -- plac=1.4.3 -- platformdirs=4.3.6 -- pluggy=1.5.0 -- polars=1.17.1 -- powerplantmatching=0.5.19 -- pre-commit=4.0.1 -- progressbar2=4.5.0 -- proj=9.5.1 -- prompt-toolkit=3.0.48 -- psutil=6.1.0 -- pthread-stubs=0.4 -- ptyprocess=0.7.0 -- pulp=2.8.0 -- pure_eval=0.2.3 -- py-cpuinfo=9.0.0 -- pyarrow=18.1.0 -- pyarrow-core=18.1.0 -- pycountry=24.6.1 -- pycparser=2.22 -- pygments=2.18.0 -- pyogrio=0.10.0 -- pyparsing=3.2.0 -- pyproj=3.7.0 -- pypsa=0.32.0 -- pyscipopt=5.2.1 -- pyshp=2.3.1 -- pysocks=1.7.1 -- pytables=3.10.1 -- pytest=8.3.4 -- python=3.12.8 -- python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.21.1 -- python-tzdata=2024.2 -- python-utils=3.9.1 -- python_abi=3.12 -- pytz=2024.1 -- pyxlsb=1.0.10 -- pyyaml=6.0.2 -- qhull=2020.2 -- rasterio=1.4.3 -- rav1e=0.6.6 -- re2=2024.07.02 -- readline=8.2 -- referencing=0.35.1 -- requests=2.32.3 -- reretry=0.11.8 -- rioxarray=0.17.0 -- rpds-py=0.22.3 -- scikit-learn=1.6.0 -- scip=9.1.1 -- scipy=1.14.1 -- seaborn=0.13.2 -- seaborn-base=0.13.2 -- setuptools=75.6.0 -- shapely=2.0.6 -- six=1.17.0 -- smart_open=7.0.5 -- smmap=5.0.0 -- snakemake-interface-common=1.17.4 -- snakemake-interface-executor-plugins=9.3.2 -- snakemake-interface-report-plugins=1.1.0 -- snakemake-interface-storage-plugins=3.3.0 -- snakemake-minimal=8.24.1 -- snappy=1.2.1 -- snuggs=1.4.7 -- sortedcontainers=2.4.0 -- soupsieve=2.5 -- sqlite=3.47.2 -- stack_data=0.6.3 -- statsmodels=0.14.4 -- svt-av1=2.3.0 -- tabulate=0.9.0 -- tbb=2022.0.0 -- tblib=3.0.0 -- threadpoolctl=3.5.0 -- throttler=1.2.2 -- tk=8.6.13 -- tomli=2.2.1 -- toolz=1.0.0 -- tornado=6.4.2 -- tqdm=4.67.1 -- traitlets=5.14.3 -- typing-extensions=4.12.2 -- typing_extensions=4.12.2 -- tzdata=2024b -- ukkonen=1.0.1 -- unicodedata2=15.1.0 -- unidecode=1.3.8 -- uriparser=0.9.8 -- urllib3=2.2.3 -- validators=0.34.0 -- virtualenv=20.28.0 -- wcwidth=0.2.13 -- wheel=0.45.1 -- wrapt=1.17.0 -- x265=3.5 -- xarray=2024.11.0 -- xerces-c=3.2.5 -- xlrd=2.0.1 -- xorg-libxau=1.0.11 -- xorg-libxdmcp=1.1.5 -- xyzservices=2024.9.0 -- xz=5.6.3 -- xz-gpl-tools=5.6.3 -- xz-tools=5.6.3 -- yaml=0.2.5 -- yte=1.5.5 -- zict=3.0.0 -- zipp=3.21.0 -- zlib=1.3.1 -- zlib-ng=2.2.2 -- zstandard=0.23.0 -- zstd=1.5.6 -- pip: - - gurobipy==12.0.0 - - highspy==1.7.2 - - oauthlib==3.2.2 - - ply==3.11 - - pyomo==6.8.2 - - requests-oauthlib==1.3.1 - - snakemake-executor-plugin-cluster-generic==1.0.9 - - snakemake-executor-plugin-slurm==0.11.2 - - snakemake-executor-plugin-slurm-jobstep==0.2.1 - - snakemake-storage-plugin-http==0.2.3 - - tsam==2.3.6 + - affine=2.4.0 + - ampl-asl=1.0.0 + - amply=0.1.6 + - appdirs=1.4.4 + - argparse-dataclass=2.0.0 + - asttokens=3.0.0 + - atk-1.0=2.38.0 + - atlite=0.3.0 + - attrs=24.3.0 + - aws-c-auth=0.8.0 + - aws-c-cal=0.8.1 + - aws-c-common=0.10.6 + - aws-c-compression=0.3.0 + - aws-c-event-stream=0.5.0 + - aws-c-http=0.9.2 + - aws-c-io=0.15.3 + - aws-c-mqtt=0.11.0 + - aws-c-s3=0.7.7 + - aws-c-sdkutils=0.2.1 + - aws-checksums=0.2.2 + - aws-crt-cpp=0.29.7 + - aws-sdk-cpp=1.11.458 + - azure-core-cpp=1.14.0 + - azure-identity-cpp=1.10.0 + - azure-storage-blobs-cpp=12.13.0 + - azure-storage-common-cpp=12.8.0 + - azure-storage-files-datalake-cpp=12.12.0 + - beautifulsoup4=4.12.3 + - blosc=1.21.6 + - bokeh=3.6.2 + - bottleneck=1.4.2 + - branca=0.8.1 + - brotli=1.1.0 + - brotli-bin=1.1.0 + - brotli-python=1.1.0 + - bzip2=1.0.8 + - c-ares=1.34.4 + - c-blosc2=2.15.2 + - ca-certificates=2024.12.14 + - cairo=1.18.2 + - capnproto=1.0.2 + - cartopy=0.24.0 + - cdsapi=0.7.5 + - certifi=2024.12.14 + - cffi=1.17.1 + - cfgv=3.3.1 + - cfitsio=4.4.1 + - cftime=1.6.4 + - charset-normalizer=3.4.0 + - click=8.1.7 + - click-plugins=1.1.1 + - cligj=0.7.2 + - cloudpickle=3.1.0 + - coin-or-cbc=2.10.12 + - coin-or-cgl=0.60.9 + - coin-or-clp=1.17.10 + - coin-or-osi=0.108.11 + - coin-or-utils=2.11.12 + - coincbc=2.10.12 + - colorama=0.4.6 + - conda-inject=1.3.2 + - configargparse=1.7 + - connection_pool=0.0.3 + - contourpy=1.3.1 + - country_converter=1.2 + - cppad=20240000.7 + - cycler=0.12.1 + - cyrus-sasl=2.1.27 + - cytoolz=1.0.1 + - dask=2024.12.1 + - dask-core=2024.12.1 + - dask-expr=1.1.21 + - datapi=0.1.1 + - datrie=0.8.2 + - decorator=5.1.1 + - deprecation=2.1.0 + - descartes=1.1.0 + - distlib=0.3.9 + - distributed=2024.12.1 + - docutils=0.21.2 + - dpath=2.2.0 + - entsoe-py=0.6.11 + - et_xmlfile=2.0.0 + - exceptiongroup=1.2.2 + - executing=2.1.0 + - filelock=3.16.1 + - fiona=1.10.1 + - fmt=11.0.2 + - folium=0.19.2 + - font-ttf-dejavu-sans-mono=2.37 + - font-ttf-inconsolata=3.000 + - font-ttf-source-code-pro=2.038 + - font-ttf-ubuntu=0.83 + - fontconfig=2.15.0 + - fonts-conda-ecosystem=1 + - fonts-conda-forge=1 + - fonttools=4.55.3 + - freetype=2.12.1 + - freexl=2.0.0 + - fribidi=1.0.10 + - fsspec=2024.10.0 + - gdal=3.9.3 + - gdk-pixbuf=2.42.12 + - geographiclib=2.0 + - geojson=3.1.0 + - geojson-rewind=1.1.0 + - geopandas=1.0.1 + - geopandas-base=1.0.1 + - geopy=2.4.1 + - geos=3.13.0 + - geotiff=1.7.3 + - gflags=2.2.2 + - giflib=5.2.2 + - gitdb=4.0.11 + - gitpython=3.1.43 + - glog=0.7.1 + - glpk=5.0 + - gmp=6.3.0 + - graphite2=1.3.13 + - graphviz=12.0.0 + - gtk2=2.24.33 + - gts=0.7.6 + - h2=4.1.0 + - harfbuzz=9.0.0 + - hdf4=4.2.15 + - hdf5=1.14.3 + - hpack=4.0.0 + - humanfriendly=10.0 + - hyperframe=6.0.1 + - icu=75.1 + - identify=2.6.3 + - idna=3.10 + - immutables=0.21 + - importlib-metadata=8.5.0 + - importlib_resources=6.4.5 + - iniconfig=2.0.0 + - ipopt=3.14.16 + - ipython=8.30.0 + - jedi=0.19.2 + - jinja2=3.1.4 + - joblib=1.4.2 + - jpype1=1.5.1 + - json-c=0.18 + - jsonschema=4.23.0 + - jsonschema-specifications=2024.10.1 + - jupyter_core=5.7.2 + - kealib=1.6.0 + - kiwisolver=1.4.7 + - krb5=1.21.3 + - lcms2=2.16 + - lerc=4.0.0 + - libabseil=20240722.0 + - libaec=1.1.3 + - libarchive=3.7.7 + - libarrow=18.1.0 + - libarrow-acero=18.1.0 + - libarrow-dataset=18.1.0 + - libarrow-substrait=18.1.0 + - libblas=3.9.0 + - libbrotlicommon=1.1.0 + - libbrotlidec=1.1.0 + - libbrotlienc=1.1.0 + - libcblas=3.9.0 + - libcrc32c=1.1.2 + - libcurl=8.11.1 + - libcxx=19.1.6 + - libdeflate=1.23 + - libedit=3.1.20191231 + - libev=4.33 + - libevent=2.1.12 + - libexpat=2.6.4 + - libffi=3.4.2 + - libgd=2.3.3 + - libgdal=3.9.3 + - libgdal-core=3.9.3 + - libgdal-fits=3.9.3 + - libgdal-grib=3.9.3 + - libgdal-hdf4=3.9.3 + - libgdal-hdf5=3.9.3 + - libgdal-jp2openjpeg=3.9.3 + - libgdal-kea=3.9.3 + - libgdal-netcdf=3.9.3 + - libgdal-pdf=3.9.3 + - libgdal-pg=3.9.3 + - libgdal-postgisraster=3.9.3 + - libgdal-tiledb=3.9.3 + - libgdal-xls=3.9.3 + - libgfortran=5.0.0 + - libgfortran5=13.2.0 + - libglib=2.82.2 + - libgoogle-cloud=2.32.0 + - libgoogle-cloud-storage=2.32.0 + - libgrpc=1.67.1 + - libhwloc=2.11.2 + - libiconv=1.17 + - libintl=0.22.5 + - libjpeg-turbo=3.0.0 + - libkml=1.3.0 + - liblapack=3.9.0 + - liblapacke=3.9.0 + - liblzma=5.6.3 + - libnetcdf=4.9.2 + - libnghttp2=1.64.0 + - libntlm=1.4 + - libopenblas=0.3.28 + - libparquet=18.1.0 + - libpng=1.6.44 + - libpq=17.2 + - libprotobuf=5.28.2 + - libre2-11=2024.07.02 + - librsvg=2.58.4 + - librttopo=1.1.0 + - libscotch=7.0.5 + - libspatialite=5.1.0 + - libsqlite=3.47.2 + - libssh2=1.11.1 + - libthrift=0.21.0 + - libtiff=4.7.0 + - libutf8proc=2.9.0 + - libwebp-base=1.4.0 + - libxcb=1.17.0 + - libxml2=2.13.5 + - libxslt=1.1.39 + - libzip=1.11.2 + - libzlib=1.3.1 + - linopy=0.4.3 + - llvm-openmp=19.1.5 + - locket=1.0.0 + - lxml=5.3.0 + - lz4=4.3.3 + - lz4-c=1.10.0 + - lzo=2.10 + - mapclassify=2.8.1 + - markupsafe=3.0.2 + - matplotlib=3.10.0 + - matplotlib-base=3.10.0 + - matplotlib-inline=0.1.7 + - memory_profiler=0.61.0 + - metis=5.1.0 + - minizip=4.0.7 + - mpfr=4.2.1 + - msgpack-python=1.1.0 + - multiurl=0.3.3 + - mumps-include=5.7.3 + - mumps-seq=5.7.3 + - munkres=1.1.4 + - nbformat=5.10.4 + - ncurses=6.5 + - netcdf4=1.7.2 + - networkx=3.4.2 + - nodeenv=1.9.1 + - nspr=4.36 + - nss=3.107 + - numexpr=2.10.2 + - numpy=1.26.4 + - openjpeg=2.5.3 + - openldap=2.6.9 + - openpyxl=3.1.5 + - openssl=3.4.0 + - orc=2.0.3 + - packaging=24.2 + - pandas=2.2.3 + - pango=1.54.0 + - parso=0.8.4 + - partd=1.4.2 + - patsy=1.0.1 + - pcre2=10.44 + - pexpect=4.9.0 + - pickleshare=0.7.5 + - pillow=11.0.0 + - pip=24.3.1 + - pixman=0.44.2 + - pkgutil-resolve-name=1.3.10 + - plac=1.4.3 + - platformdirs=4.3.6 + - pluggy=1.5.0 + - polars=1.17.1 + - poppler=24.12.0 + - poppler-data=0.4.12 + - postgresql=17.2 + - powerplantmatching=0.5.19 + - pre-commit=4.0.1 + - progressbar2=4.5.0 + - proj=9.5.1 + - prompt-toolkit=3.0.48 + - psutil=6.1.0 + - pthread-stubs=0.4 + - ptyprocess=0.7.0 + - pulp=2.8.0 + - pure_eval=0.2.3 + - py-cpuinfo=9.0.0 + - pyarrow=18.1.0 + - pyarrow-core=18.1.0 + - pycountry=24.6.1 + - pycparser=2.22 + - pygments=2.18.0 + - pyogrio=0.10.0 + - pyparsing=3.2.0 + - pyproj=3.7.0 + - pypsa=0.32.0 + - pyscipopt=5.2.1 + - pyshp=2.3.1 + - pysocks=1.7.1 + - pytables=3.10.1 + - pytest=8.3.4 + - python=3.12.8 + - python-dateutil=2.9.0.post0 + - python-fastjsonschema=2.21.1 + - python-tzdata=2024.2 + - python-utils=3.9.1 + - python_abi=3.12 + - pytz=2024.1 + - pyxlsb=1.0.10 + - pyyaml=6.0.2 + - qhull=2020.2 + - rasterio=1.4.1 + - re2=2024.07.02 + - readline=8.2 + - referencing=0.35.1 + - requests=2.32.3 + - reretry=0.11.8 + - rioxarray=0.17.0 + - rpds-py=0.22.3 + - scikit-learn=1.6.0 + - scip=9.1.1 + - scipy=1.14.1 + - seaborn=0.13.2 + - seaborn-base=0.13.2 + - setuptools=75.6.0 + - shapely=2.0.6 + - six=1.17.0 + - smart_open=7.1.0 + - smmap=5.0.0 + - snakemake-interface-common=1.17.4 + - snakemake-interface-executor-plugins=9.3.2 + - snakemake-interface-report-plugins=1.1.0 + - snakemake-interface-storage-plugins=3.3.0 + - snakemake-minimal=8.24.1 + - snappy=1.2.1 + - snuggs=1.4.7 + - sortedcontainers=2.4.0 + - soupsieve=2.5 + - spdlog=1.14.1 + - sqlite=3.47.2 + - stack_data=0.6.3 + - statsmodels=0.14.4 + - tabulate=0.9.0 + - tbb=2022.0.0 + - tblib=3.0.0 + - threadpoolctl=3.5.0 + - throttler=1.2.2 + - tiledb=2.27.0 + - tk=8.6.13 + - tomli=2.2.1 + - toolz=1.0.0 + - tornado=6.4.2 + - tqdm=4.67.1 + - traitlets=5.14.3 + - typing-extensions=4.12.2 + - typing_extensions=4.12.2 + - tzcode=2024b + - tzdata=2024b + - ukkonen=1.0.1 + - unicodedata2=15.1.0 + - unidecode=1.3.8 + - uriparser=0.9.8 + - urllib3=2.2.3 + - validators=0.34.0 + - virtualenv=20.28.0 + - wcwidth=0.2.13 + - wheel=0.45.1 + - wrapt=1.17.0 + - xarray=2024.11.0 + - xerces-c=3.2.5 + - xlrd=2.0.1 + - xorg-libxau=1.0.12 + - xorg-libxdmcp=1.1.5 + - xyzservices=2024.9.0 + - yaml=0.2.5 + - yte=1.5.5 + - zict=3.0.0 + - zipp=3.21.0 + - zlib=1.3.1 + - zlib-ng=2.2.2 + - zstandard=0.23.0 + - zstd=1.5.6 + - pip: + - gurobipy==12.0.0 + - highspy==1.7.2 + - oauthlib==3.2.2 + - ply==3.11 + - pyomo==6.8.2 + - requests-oauthlib==1.3.1 + - snakemake-executor-plugin-cluster-generic==1.0.9 + - snakemake-executor-plugin-slurm==0.11.2 + - snakemake-executor-plugin-slurm-jobstep==0.2.1 + - snakemake-storage-plugin-http==0.2.3 + - tsam==2.3.6 prefix: /Users/runner/miniconda3/envs/pypsa-eur diff --git a/envs/windows-pinned.yaml b/envs/windows-pinned.yaml index fcd9faa66..56aba717d 100644 --- a/envs/windows-pinned.yaml +++ b/envs/windows-pinned.yaml @@ -1,386 +1,402 @@ -# SPDX-FileCopyrightText: 2017-2024 The PyPSA-Eur Authors -# SPDX-License-Identifier: CC0-1.0 - -name: pypsa-eur -channels: -- conda-forge -- bioconda -- defaults -- https://repo.anaconda.com/pkgs/main -- https://repo.anaconda.com/pkgs/r -- https://repo.anaconda.com/pkgs/msys2 -dependencies: -- _libavif_api=1.1.1 -- _openmp_mutex=4.5 -- affine=2.4.0 -- amply=0.1.6 -- aom=3.9.1 -- appdirs=1.4.4 -- argparse-dataclass=2.0.0 -- asttokens=3.0.0 -- atlite=0.3.0 -- attrs=24.2.0 -- aws-c-auth=0.8.0 -- aws-c-cal=0.8.1 -- aws-c-common=0.10.5 -- aws-c-compression=0.3.0 -- aws-c-event-stream=0.5.0 -- aws-c-http=0.9.2 -- aws-c-io=0.15.3 -- aws-c-mqtt=0.11.0 -- aws-c-s3=0.7.5 -- aws-c-sdkutils=0.2.1 -- aws-checksums=0.2.2 -- aws-crt-cpp=0.29.7 -- aws-sdk-cpp=1.11.458 -- beautifulsoup4=4.12.3 -- blosc=1.21.6 -- bokeh=3.6.2 -- bottleneck=1.4.2 -- branca=0.7.2 -- brotli=1.1.0 -- brotli-bin=1.1.0 -- brotli-python=1.1.0 -- bzip2=1.0.8 -- c-ares=1.34.3 -- c-blosc2=2.15.2 -- ca-certificates=2024.8.30 -- cairo=1.18.2 -- cartopy=0.24.0 -- cdsapi=0.7.5 -- certifi=2024.8.30 -- cffi=1.17.1 -- cfgv=3.3.1 -- cftime=1.6.4 -- charset-normalizer=3.4.0 -- click=8.1.7 -- click-plugins=1.1.1 -- cligj=0.7.2 -- cloudpickle=3.1.0 -- colorama=0.4.6 -- conda-inject=1.3.2 -- configargparse=1.7 -- connection_pool=0.0.3 -- contourpy=1.3.1 -- country_converter=1.2 -- cppad=20240000.7 -- cpython=3.12.8 -- cycler=0.12.1 -- cytoolz=1.0.0 -- dask=2024.12.0 -- dask-core=2024.12.0 -- dask-expr=1.1.20 -- datapi=0.1.1 -- datrie=0.8.2 -- dav1d=1.2.1 -- decorator=5.1.1 -- deprecation=2.1.0 -- descartes=1.1.0 -- distlib=0.3.9 -- distributed=2024.12.0 -- docutils=0.21.2 -- double-conversion=3.3.0 -- dpath=2.2.0 -- entsoe-py=0.6.11 -- et_xmlfile=2.0.0 -- exceptiongroup=1.2.2 -- executing=2.1.0 -- filelock=3.16.1 -- fiona=1.10.1 -- folium=0.18.0 -- font-ttf-dejavu-sans-mono=2.37 -- font-ttf-inconsolata=3.000 -- font-ttf-source-code-pro=2.038 -- font-ttf-ubuntu=0.83 -- fontconfig=2.15.0 -- fonts-conda-ecosystem=1 -- fonts-conda-forge=1 -- fonttools=4.55.2 -- freetype=2.12.1 -- freexl=2.0.0 -- fribidi=1.0.10 -- fsspec=2024.10.0 -- geographiclib=2.0 -- geojson=3.1.0 -- geojson-rewind=1.1.0 -- geopandas=1.0.1 -- geopandas-base=1.0.1 -- geopy=2.4.1 -- geos=3.13.0 -- geotiff=1.7.3 -- getopt-win32=0.1 -- gitdb=4.0.11 -- gitpython=3.1.43 -- glpk=5.0 -- gmp=6.3.0 -- graphite2=1.3.13 -- graphviz=12.0.0 -- gts=0.7.6 -- h2=4.1.0 -- harfbuzz=9.0.0 -- hdf4=4.2.15 -- hdf5=1.14.4 -- hpack=4.0.0 -- humanfriendly=10.0 -- hyperframe=6.0.1 -- icu=75.1 -- identify=2.6.3 -- idna=3.10 -- immutables=0.21 -- importlib-metadata=8.5.0 -- importlib_resources=6.4.5 -- iniconfig=2.0.0 -- ipopt=3.14.16 -- ipython=8.30.0 -- jedi=0.19.2 -- jinja2=3.1.4 -- joblib=1.4.2 -- jpype1=1.5.1 -- jsonschema=4.23.0 -- jsonschema-specifications=2024.10.1 -- jupyter_core=5.7.2 -- kiwisolver=1.4.7 -- krb5=1.21.3 -- lcms2=2.16 -- lerc=4.0.0 -- libabseil=20240722.0 -- libaec=1.1.3 -- libarchive=3.7.7 -- libarrow=18.1.0 -- libarrow-acero=18.1.0 -- libarrow-dataset=18.1.0 -- libarrow-substrait=18.1.0 -- libavif16=1.1.1 -- libblas=3.9.0 -- libboost=1.86.0 -- libbrotlicommon=1.1.0 -- libbrotlidec=1.1.0 -- libbrotlienc=1.1.0 -- libcblas=3.9.0 -- libclang13=19.1.5 -- libcrc32c=1.1.2 -- libcurl=8.10.1 -- libde265=1.0.15 -- libdeflate=1.22 -- libevent=2.1.12 -- libexpat=2.6.4 -- libffi=3.4.2 -- libflang=5.0.0 -- libgcc=14.2.0 -- libgd=2.3.3 -- libgdal-core=3.10.0 -- libglib=2.82.2 -- libgomp=14.2.0 -- libgoogle-cloud=2.31.0 -- libgoogle-cloud-storage=2.31.0 -- libgrpc=1.67.1 -- libheif=1.18.2 -- libhwloc=2.11.2 -- libiconv=1.17 -- libintl=0.22.5 -- libjpeg-turbo=3.0.0 -- libkml=1.3.0 -- liblapack=3.9.0 -- liblzma=5.6.3 -- liblzma-devel=5.6.3 -- libnetcdf=4.9.2 -- libopenblas=0.3.28 -- libparquet=18.1.0 -- libpng=1.6.44 -- libprotobuf=5.28.2 -- libre2-11=2024.07.02 -- librttopo=1.1.0 -- libspatialite=5.1.0 -- libsqlite=3.47.2 -- libssh2=1.11.1 -- libthrift=0.21.0 -- libtiff=4.7.0 -- libutf8proc=2.9.0 -- libwebp-base=1.4.0 -- libwinpthread=12.0.0.r4.gg4f2fc60ca -- libxcb=1.17.0 -- libxml2=2.13.5 -- libxslt=1.1.39 -- libzip=1.11.2 -- libzlib=1.3.1 -- linopy=0.4.3 -- llvm-meta=5.0.0 -- locket=1.0.0 -- lxml=5.3.0 -- lz4=4.3.3 -- lz4-c=1.9.4 -- lzo=2.10 -- mapclassify=2.8.1 -- markupsafe=3.0.2 -- matplotlib=3.9.3 -- matplotlib-base=3.9.3 -- matplotlib-inline=0.1.7 -- memory_profiler=0.61.0 -- minizip=4.0.6 -- mpfr=4.2.1 -- msgpack-python=1.1.0 -- multiurl=0.3.3 -- mumps-seq=5.7.3 -- munkres=1.1.4 -- nbformat=5.10.4 -- netcdf4=1.7.2 -- networkx=3.4.2 -- nodeenv=1.9.1 -- nomkl=1.0 -- numexpr=2.10.2 -- numpy=1.26.4 -- openjpeg=2.5.3 -- openmp=5.0.0 -- openpyxl=3.1.5 -- openssl=3.4.0 -- orc=2.0.3 -- packaging=24.2 -- pandas=2.2.3 -- pango=1.54.0 -- parso=0.8.4 -- partd=1.4.2 -- patsy=1.0.1 -- pcre2=10.44 -- pickleshare=0.7.5 -- pillow=11.0.0 -- pip=24.3.1 -- pixman=0.44.2 -- pkgutil-resolve-name=1.3.10 -- plac=1.4.3 -- platformdirs=4.3.6 -- pluggy=1.5.0 -- powerplantmatching=0.5.19 -- pre-commit=4.0.1 -- progressbar2=4.5.0 -- proj=9.5.1 -- prompt-toolkit=3.0.48 -- psutil=6.1.0 -- pthread-stubs=0.4 -- pulp=2.8.0 -- pure_eval=0.2.3 -- py-cpuinfo=9.0.0 -- pyarrow=18.1.0 -- pyarrow-core=18.1.0 -- pycountry=24.6.1 -- pycparser=2.22 -- pygments=2.18.0 -- pyogrio=0.10.0 -- pyparsing=3.2.0 -- pyproj=3.7.0 -- pypsa=0.32.0 -- pyreadline3=3.5.4 -- pyscipopt=5.2.1 -- pyshp=2.3.1 -- pyside6=6.8.0.2 -- pysocks=1.7.1 -- pytables=3.10.1 -- pytest=8.3.4 -- python=3.12.8 -- python-dateutil=2.9.0.post0 -- python-fastjsonschema=2.21.1 -- python-tzdata=2024.2 -- python-utils=3.9.1 -- python_abi=3.12 -- pytz=2024.1 -- pywin32=307 -- pyxlsb=1.0.10 -- pyyaml=6.0.2 -- qhull=2020.2 -- qt6-main=6.8.0 -- rasterio=1.4.3 -- rav1e=0.6.6 -- re2=2024.07.02 -- referencing=0.35.1 -- requests=2.32.3 -- reretry=0.11.8 -- rioxarray=0.17.0 -- rpds-py=0.22.3 -- scikit-learn=1.6.0 -- scip=9.1.1 -- scipy=1.14.1 -- seaborn=0.13.2 -- seaborn-base=0.13.2 -- setuptools=75.6.0 -- shapely=2.0.6 -- six=1.17.0 -- smart_open=7.0.5 -- smmap=5.0.0 -- snakemake-interface-common=1.17.4 -- snakemake-interface-executor-plugins=9.3.2 -- snakemake-interface-report-plugins=1.1.0 -- snakemake-interface-storage-plugins=3.3.0 -- snakemake-minimal=8.24.1 -- snappy=1.2.1 -- snuggs=1.4.7 -- sortedcontainers=2.4.0 -- soupsieve=2.5 -- sqlite=3.47.2 -- stack_data=0.6.3 -- statsmodels=0.14.4 -- svt-av1=2.3.0 -- tabulate=0.9.0 -- tbb=2022.0.0 -- tblib=3.0.0 -- threadpoolctl=3.5.0 -- throttler=1.2.2 -- tk=8.6.13 -- tomli=2.2.1 -- toolz=1.0.0 -- tornado=6.4.2 -- tqdm=4.67.1 -- traitlets=5.14.3 -- typing-extensions=4.12.2 -- typing_extensions=4.12.2 -- tzdata=2024b -- ucrt=10.0.22621.0 -- ukkonen=1.0.1 -- unicodedata2=15.1.0 -- unidecode=1.3.8 -- uriparser=0.9.8 -- urllib3=2.2.3 -- validators=0.34.0 -- vc=14.3 -- vc14_runtime=14.42.34433 -- virtualenv=20.28.0 -- vs2015_runtime=14.42.34433 -- wcwidth=0.2.13 -- wheel=0.45.1 -- win_inet_pton=1.1.0 -- wrapt=1.17.0 -- x265=3.5 -- xarray=2024.11.0 -- xerces-c=3.2.5 -- xlrd=2.0.1 -- xorg-libice=1.1.1 -- xorg-libsm=1.2.4 -- xorg-libx11=1.8.10 -- xorg-libxau=1.0.11 -- xorg-libxdmcp=1.1.5 -- xorg-libxext=1.3.6 -- xorg-libxpm=3.5.17 -- xorg-libxt=1.3.1 -- xyzservices=2024.9.0 -- xz=5.6.3 -- xz-tools=5.6.3 -- yaml=0.2.5 -- yte=1.5.5 -- zict=3.0.0 -- zipp=3.21.0 -- zlib=1.3.1 -- zlib-ng=2.2.2 -- zstandard=0.23.0 -- zstd=1.5.6 -- pip: - - gurobipy==12.0.0 - - highspy==1.7.2 - - oauthlib==3.2.2 - - ply==3.11 - - polars==1.17.1 - - pyomo==6.8.2 - - requests-oauthlib==1.3.1 - - snakemake-executor-plugin-cluster-generic==1.0.9 - - snakemake-executor-plugin-slurm==0.11.2 - - snakemake-executor-plugin-slurm-jobstep==0.2.1 - - snakemake-storage-plugin-http==0.2.3 - - tsam==2.3.6 -prefix: C:\Miniconda\envs\pypsa-eur +# SPDX-FileCopyrightText: 2017-2024 The PyPSA-Eur Authors +# SPDX-License-Identifier: CC0-1.0 + +name: pypsa-eur +channels: + - conda-forge + - bioconda + - defaults + - https://repo.anaconda.com/pkgs/main + - https://repo.anaconda.com/pkgs/r + - https://repo.anaconda.com/pkgs/msys2 +dependencies: + - _openmp_mutex=4.5 + - affine=2.4.0 + - amply=0.1.6 + - appdirs=1.4.4 + - argparse-dataclass=2.0.0 + - asttokens=3.0.0 + - atlite=0.3.0 + - attrs=24.3.0 + - aws-c-auth=0.8.0 + - aws-c-cal=0.8.1 + - aws-c-common=0.10.6 + - aws-c-compression=0.3.0 + - aws-c-event-stream=0.5.0 + - aws-c-http=0.9.2 + - aws-c-io=0.15.3 + - aws-c-mqtt=0.11.0 + - aws-c-s3=0.7.7 + - aws-c-sdkutils=0.2.1 + - aws-checksums=0.2.2 + - aws-crt-cpp=0.29.7 + - aws-sdk-cpp=1.11.458 + - azure-core-cpp=1.14.0 + - azure-identity-cpp=1.10.0 + - azure-storage-blobs-cpp=12.13.0 + - azure-storage-common-cpp=12.8.0 + - beautifulsoup4=4.12.3 + - blosc=1.21.6 + - bokeh=3.6.2 + - bottleneck=1.4.2 + - branca=0.8.1 + - brotli=1.1.0 + - brotli-bin=1.1.0 + - brotli-python=1.1.0 + - bzip2=1.0.8 + - c-ares=1.34.4 + - c-blosc2=2.15.2 + - ca-certificates=2024.12.14 + - cairo=1.18.2 + - capnproto=1.0.2 + - cartopy=0.24.0 + - cdsapi=0.7.5 + - certifi=2024.12.14 + - cffi=1.17.1 + - cfgv=3.3.1 + - cfitsio=4.4.1 + - cftime=1.6.4 + - charset-normalizer=3.4.0 + - click=8.1.7 + - click-plugins=1.1.1 + - cligj=0.7.2 + - cloudpickle=3.1.0 + - colorama=0.4.6 + - conda-inject=1.3.2 + - configargparse=1.7 + - connection_pool=0.0.3 + - contourpy=1.3.1 + - country_converter=1.2 + - cppad=20240000.7 + - cpython=3.12.8 + - cycler=0.12.1 + - cytoolz=1.0.1 + - dask=2024.12.1 + - dask-core=2024.12.1 + - dask-expr=1.1.21 + - datapi=0.1.1 + - datrie=0.8.2 + - decorator=5.1.1 + - deprecation=2.1.0 + - descartes=1.1.0 + - distlib=0.3.9 + - distributed=2024.12.1 + - docutils=0.21.2 + - double-conversion=3.3.0 + - dpath=2.2.0 + - entsoe-py=0.6.11 + - et_xmlfile=2.0.0 + - exceptiongroup=1.2.2 + - executing=2.1.0 + - filelock=3.16.1 + - fiona=1.10.1 + - fmt=11.0.2 + - folium=0.19.2 + - font-ttf-dejavu-sans-mono=2.37 + - font-ttf-inconsolata=3.000 + - font-ttf-source-code-pro=2.038 + - font-ttf-ubuntu=0.83 + - fontconfig=2.15.0 + - fonts-conda-ecosystem=1 + - fonts-conda-forge=1 + - fonttools=4.55.3 + - freetype=2.12.1 + - freexl=2.0.0 + - fribidi=1.0.10 + - fsspec=2024.10.0 + - gdal=3.9.3 + - geographiclib=2.0 + - geojson=3.1.0 + - geojson-rewind=1.1.0 + - geopandas=1.0.1 + - geopandas-base=1.0.1 + - geopy=2.4.1 + - geos=3.13.0 + - geotiff=1.7.3 + - getopt-win32=0.1 + - gitdb=4.0.11 + - gitpython=3.1.43 + - glpk=5.0 + - gmp=6.3.0 + - graphite2=1.3.13 + - graphviz=12.0.0 + - gts=0.7.6 + - h2=4.1.0 + - harfbuzz=9.0.0 + - hdf4=4.2.15 + - hdf5=1.14.3 + - hpack=4.0.0 + - humanfriendly=10.0 + - hyperframe=6.0.1 + - icu=75.1 + - identify=2.6.3 + - idna=3.10 + - immutables=0.21 + - importlib-metadata=8.5.0 + - importlib_resources=6.4.5 + - iniconfig=2.0.0 + - ipopt=3.14.16 + - ipython=8.30.0 + - jedi=0.19.2 + - jinja2=3.1.4 + - joblib=1.4.2 + - jpype1=1.5.1 + - jsonschema=4.23.0 + - jsonschema-specifications=2024.10.1 + - jupyter_core=5.7.2 + - kealib=1.6.0 + - kiwisolver=1.4.7 + - krb5=1.21.3 + - lcms2=2.16 + - lerc=4.0.0 + - libabseil=20240722.0 + - libaec=1.1.3 + - libarchive=3.7.7 + - libarrow=18.1.0 + - libarrow-acero=18.1.0 + - libarrow-dataset=18.1.0 + - libarrow-substrait=18.1.0 + - libblas=3.9.0 + - libboost=1.86.0 + - libbrotlicommon=1.1.0 + - libbrotlidec=1.1.0 + - libbrotlienc=1.1.0 + - libcblas=3.9.0 + - libclang13=19.1.6 + - libcrc32c=1.1.2 + - libcurl=8.11.1 + - libdeflate=1.23 + - libevent=2.1.12 + - libexpat=2.6.4 + - libffi=3.4.2 + - libflang=5.0.0 + - libgcc=14.2.0 + - libgd=2.3.3 + - libgdal=3.9.3 + - libgdal-core=3.9.3 + - libgdal-fits=3.9.3 + - libgdal-grib=3.9.3 + - libgdal-hdf4=3.9.3 + - libgdal-hdf5=3.9.3 + - libgdal-jp2openjpeg=3.9.3 + - libgdal-kea=3.9.3 + - libgdal-netcdf=3.9.3 + - libgdal-pdf=3.9.3 + - libgdal-pg=3.9.3 + - libgdal-postgisraster=3.9.3 + - libgdal-tiledb=3.9.3 + - libgdal-xls=3.9.3 + - libglib=2.82.2 + - libgomp=14.2.0 + - libgoogle-cloud=2.32.0 + - libgoogle-cloud-storage=2.32.0 + - libgrpc=1.67.1 + - libhwloc=2.11.2 + - libiconv=1.17 + - libintl=0.22.5 + - libjpeg-turbo=3.0.0 + - libkml=1.3.0 + - liblapack=3.9.0 + - liblzma=5.6.3 + - libnetcdf=4.9.2 + - libopenblas=0.3.28 + - libparquet=18.1.0 + - libpng=1.6.44 + - libpq=17.2 + - libprotobuf=5.28.2 + - libre2-11=2024.07.02 + - librttopo=1.1.0 + - libspatialite=5.1.0 + - libsqlite=3.47.2 + - libssh2=1.11.1 + - libthrift=0.21.0 + - libtiff=4.7.0 + - libutf8proc=2.9.0 + - libwebp-base=1.4.0 + - libwinpthread=12.0.0.r4.gg4f2fc60ca + - libxcb=1.17.0 + - libxml2=2.13.5 + - libxslt=1.1.39 + - libzip=1.11.2 + - libzlib=1.3.1 + - linopy=0.4.3 + - llvm-meta=5.0.0 + - locket=1.0.0 + - lxml=5.3.0 + - lz4=4.3.3 + - lz4-c=1.10.0 + - lzo=2.10 + - mapclassify=2.8.1 + - markupsafe=3.0.2 + - matplotlib=3.10.0 + - matplotlib-base=3.10.0 + - matplotlib-inline=0.1.7 + - memory_profiler=0.61.0 + - minizip=4.0.7 + - mpfr=4.2.1 + - msgpack-python=1.1.0 + - multiurl=0.3.3 + - mumps-seq=5.7.3 + - munkres=1.1.4 + - nbformat=5.10.4 + - netcdf4=1.7.2 + - networkx=3.4.2 + - nodeenv=1.9.1 + - nomkl=1.0 + - numexpr=2.10.2 + - numpy=1.26.4 + - openjpeg=2.5.3 + - openmp=5.0.0 + - openpyxl=3.1.5 + - openssl=3.4.0 + - orc=2.0.3 + - packaging=24.2 + - pandas=2.2.3 + - pango=1.54.0 + - parso=0.8.4 + - partd=1.4.2 + - patsy=1.0.1 + - pcre2=10.44 + - pickleshare=0.7.5 + - pillow=11.0.0 + - pip=24.3.1 + - pixman=0.44.2 + - pkgutil-resolve-name=1.3.10 + - plac=1.4.3 + - platformdirs=4.3.6 + - pluggy=1.5.0 + - poppler=24.12.0 + - poppler-data=0.4.12 + - postgresql=17.2 + - powerplantmatching=0.5.19 + - pre-commit=4.0.1 + - progressbar2=4.5.0 + - proj=9.5.1 + - prompt-toolkit=3.0.48 + - psutil=6.1.0 + - pthread-stubs=0.4 + - pulp=2.8.0 + - pure_eval=0.2.3 + - py-cpuinfo=9.0.0 + - pyarrow=18.1.0 + - pyarrow-core=18.1.0 + - pycountry=24.6.1 + - pycparser=2.22 + - pygments=2.18.0 + - pyogrio=0.10.0 + - pyparsing=3.2.0 + - pyproj=3.7.0 + - pypsa=0.32.0 + - pyreadline3=3.5.4 + - pyscipopt=5.2.1 + - pyshp=2.3.1 + - pyside6=6.8.1 + - pysocks=1.7.1 + - pytables=3.10.1 + - pytest=8.3.4 + - python=3.12.8 + - python-dateutil=2.9.0.post0 + - python-fastjsonschema=2.21.1 + - python-tzdata=2024.2 + - python-utils=3.9.1 + - python_abi=3.12 + - pytz=2024.1 + - pywin32=307 + - pyxlsb=1.0.10 + - pyyaml=6.0.2 + - qhull=2020.2 + - qt6-main=6.8.1 + - rasterio=1.4.1 + - re2=2024.07.02 + - referencing=0.35.1 + - requests=2.32.3 + - reretry=0.11.8 + - rioxarray=0.17.0 + - rpds-py=0.22.3 + - scikit-learn=1.6.0 + - scip=9.1.1 + - scipy=1.14.1 + - seaborn=0.13.2 + - seaborn-base=0.13.2 + - setuptools=75.6.0 + - shapely=2.0.6 + - six=1.17.0 + - smart_open=7.1.0 + - smmap=5.0.0 + - snakemake-interface-common=1.17.4 + - snakemake-interface-executor-plugins=9.3.2 + - snakemake-interface-report-plugins=1.1.0 + - snakemake-interface-storage-plugins=3.3.0 + - snakemake-minimal=8.24.1 + - snappy=1.2.1 + - snuggs=1.4.7 + - sortedcontainers=2.4.0 + - soupsieve=2.5 + - spdlog=1.14.1 + - sqlite=3.47.2 + - stack_data=0.6.3 + - statsmodels=0.14.4 + - tabulate=0.9.0 + - tbb=2022.0.0 + - tblib=3.0.0 + - threadpoolctl=3.5.0 + - throttler=1.2.2 + - tiledb=2.27.0 + - tk=8.6.13 + - tomli=2.2.1 + - toolz=1.0.0 + - tornado=6.4.2 + - tqdm=4.67.1 + - traitlets=5.14.3 + - typing-extensions=4.12.2 + - typing_extensions=4.12.2 + - tzdata=2024b + - ucrt=10.0.22621.0 + - ukkonen=1.0.1 + - unicodedata2=15.1.0 + - unidecode=1.3.8 + - uriparser=0.9.8 + - urllib3=2.2.3 + - validators=0.34.0 + - vc=14.3 + - vc14_runtime=14.42.34433 + - virtualenv=20.28.0 + - vs2015_runtime=14.42.34433 + - wcwidth=0.2.13 + - wheel=0.45.1 + - win_inet_pton=1.1.0 + - wrapt=1.17.0 + - xarray=2024.11.0 + - xerces-c=3.2.5 + - xlrd=2.0.1 + - xorg-libice=1.1.2 + - xorg-libsm=1.2.5 + - xorg-libx11=1.8.10 + - xorg-libxau=1.0.12 + - xorg-libxdmcp=1.1.5 + - xorg-libxext=1.3.6 + - xorg-libxpm=3.5.17 + - xorg-libxt=1.3.1 + - xyzservices=2024.9.0 + - yaml=0.2.5 + - yte=1.5.5 + - zict=3.0.0 + - zipp=3.21.0 + - zlib=1.3.1 + - zlib-ng=2.2.2 + - zstandard=0.23.0 + - zstd=1.5.6 + - pip: + - gurobipy==12.0.0 + - highspy==1.7.2 + - oauthlib==3.2.2 + - ply==3.11 + - polars==1.17.1 + - pyomo==6.8.2 + - requests-oauthlib==1.3.1 + - snakemake-executor-plugin-cluster-generic==1.0.9 + - snakemake-executor-plugin-slurm==0.11.2 + - snakemake-executor-plugin-slurm-jobstep==0.2.1 + - snakemake-storage-plugin-http==0.2.3 + - tsam==2.3.6 +prefix: C:\Miniconda\envs\pypsa-eur