diff --git a/README.md b/README.md index c6671ccb..dcc7c6fc 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,6 @@ SPDX-License-Identifier: CC-BY-4.0 ![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/pypsa/pypsa-eur?include_prereleases) [![Build Status](https://travis-ci.org/PyPSA/pypsa-eur.svg?branch=master)](https://travis-ci.org/PyPSA/pypsa-eur) [![Documentation](https://readthedocs.org/projects/pypsa-eur/badge/?version=latest)](https://pypsa-eur.readthedocs.io/en/latest/?badge=latest) -![GitHub](https://img.shields.io/github/license/pypsa/pypsa-eur) ![Size](https://img.shields.io/github/repo-size/pypsa/pypsa-eur) [![Zenodo](https://zenodo.org/badge/DOI/10.5281/zenodo.3520875.svg)](https://doi.org/10.5281/zenodo.3520875) [![Gitter](https://badges.gitter.im/PyPSA/community.svg)](https://gitter.im/PyPSA/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) diff --git a/config.default.yaml b/config.default.yaml index 20876a9f..b039c047 100755 --- a/config.default.yaml +++ b/config.default.yaml @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: CC0-1.0 -version: 0.1.0 +version: 0.2.0 tutorial: false logging: diff --git a/config.tutorial.yaml b/config.tutorial.yaml index b7d37357..f199424d 100755 --- a/config.tutorial.yaml +++ b/config.tutorial.yaml @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: CC0-1.0 -version: 0.1.0 +version: 0.2.0 tutorial: true logging: level: INFO diff --git a/doc/conf.py b/doc/conf.py index 15b4631e..899cbe1a 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -74,9 +74,9 @@ author = u'Jonas Hoersch (KIT, FIAS), Fabian Hofmann (FIAS), David Schlachtberge # built documents. # # The short X.Y version. -version = u'0.1' +version = u'0.2' # The full version, including alpha/beta/rc tags. -release = u'0.1.0' +release = u'0.2.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/img/elec_s_128.png b/doc/img/elec_s_128.png new file mode 100644 index 00000000..4db4f84f Binary files /dev/null and b/doc/img/elec_s_128.png differ diff --git a/doc/img/elec_s_256.png b/doc/img/elec_s_256.png new file mode 100644 index 00000000..661d78b1 Binary files /dev/null and b/doc/img/elec_s_256.png differ diff --git a/doc/img/elec_s_37.png b/doc/img/elec_s_37.png new file mode 100644 index 00000000..730e8ccd Binary files /dev/null and b/doc/img/elec_s_37.png differ diff --git a/doc/img/elec_s_512.png b/doc/img/elec_s_512.png new file mode 100644 index 00000000..5ae9467c Binary files /dev/null and b/doc/img/elec_s_512.png differ diff --git a/doc/img/eligibility.png b/doc/img/eligibility.png new file mode 100644 index 00000000..ed51e9c2 Binary files /dev/null and b/doc/img/eligibility.png differ diff --git a/doc/img/offwindac-gridcell.png b/doc/img/offwindac-gridcell.png new file mode 100644 index 00000000..ff0c0316 Binary files /dev/null and b/doc/img/offwindac-gridcell.png differ diff --git a/doc/img/offwinddc-gridcell.png b/doc/img/offwinddc-gridcell.png new file mode 100644 index 00000000..f6055556 Binary files /dev/null and b/doc/img/offwinddc-gridcell.png differ diff --git a/doc/img/onwind-gridcell.png b/doc/img/onwind-gridcell.png new file mode 100644 index 00000000..833c9c0e Binary files /dev/null and b/doc/img/onwind-gridcell.png differ diff --git a/doc/img/scenarios.png b/doc/img/scenarios.png index d18164fc..e342103d 100644 Binary files a/doc/img/scenarios.png and b/doc/img/scenarios.png differ diff --git a/doc/img/solar-gridcell.png b/doc/img/solar-gridcell.png new file mode 100644 index 00000000..c5ca6703 Binary files /dev/null and b/doc/img/solar-gridcell.png differ diff --git a/doc/index.rst b/doc/index.rst index 70905979..f5bc03a4 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -16,9 +16,6 @@ PyPSA-Eur: An Open Optimisation Model of the European Transmission System :target: https://pypsa-eur.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status -.. image:: https://img.shields.io/github/license/pypsa/pypsa-eur - :alt: GitHub - .. image:: https://img.shields.io/github/repo-size/pypsa/pypsa-eur :alt: GitHub repo size diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 00ad17b9..06f41116 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -7,17 +7,46 @@ Release Notes ########################################## + +Upcoming Release +================ + +* ... + + +PyPSA-Eur 0.2.0 (8th June 2020) +================================== + * The optimization is now performed using the ``pyomo=False`` setting in the :func:`pypsa.lopf.network_lopf`. This speeds up the solving process significantly and consumes much less memory. The inclusion of additional constraints were adjusted to the new implementation. They are all passed to the :func:`network_lopf` function via the ``extra_functionality`` argument. The rule ``trace_solve_network`` was integrated into the rule :mod:`solve_network` and can be activated via configuration with ``solving: options: track_iterations: true``. The charging and discharging capacities of batteries modelled as store-link combination are now coupled (`#116 `_). * An updated extract of the `ENTSO-E Transmission System Map `_ (including Malta) was added to the repository using the `GridKit `_ tool. This tool has been updated to retrieve up-to-date map extracts using a single `script `_. The update extract features 5322 buses, 6574 lines, 46 links. (`#118 `_). -* Removed the ``id`` column for custom power plants in ``data/custom_powerplants.csv`` to avoid custom power plants with conflicting ids getting attached to the wrong bus (`#131 `_). +* Added `FSFE REUSE `_ compliant license information. Documentation now licensed under CC-BY-4.0 (`#160 `_). + +* Added a 30 minute `video introduction `_ and a 20 minute `video tutorial `_ + +* Networks now store a color and a nicely formatted name for each carrier, accessible via ``n.carrier['color']`` and ``n.carrier['nice_name'] ``(networks after ``elec.nc``). + +* Added an option to skip iterative solving usually performed to update the line impedances of expanded lines at ``solving: options: skip_iterations:``. * ``snakemake`` rules for retrieving cutouts and the natura raster can now be disabled independently from their respective rules to build them; via ``config.*yaml`` (`#136 `_). -* Add option ``renewables: {carrier}: keep_all_available_areas: `` to use all availabe weather cells for renewable profile and potential generation. The default ignores weather cells where only less than 1 MW can be installed (`#150 `_). +* Removed the ``id`` column for custom power plants in ``data/custom_powerplants.csv`` to avoid custom power plants with conflicting ids getting attached to the wrong bus (`#131 `_). + +* Add option ``renewables: {carrier}: keep_all_available_areas:`` to use all availabe weather cells for renewable profile and potential generation. The default ignores weather cells where only less than 1 MW can be installed (`#150 `_). + +* Added a function ``_helpers.load_network()`` which loads a network with overridden components specified in ``snakemake.config['override_components']`` (`#128 `_). + +* Bugfix in :mod:`base_network` which now finds all closest links, not only the first entry (`#143 `_). + +* Bugfix in :mod:`cluster_network` which now skips recalculation of link parameters if there are no links (`#149 `_). + +* Added information on pull requests to contribution guidelines (`#151 `_). + +* Improved documentation on open-source solver setup and added usage warnings. + +* Updated ``conda`` environment regarding ``pypsa``, ``pyproj``, ``gurobi``, ``lxml``. This release requires PyPSA v0.17.0. -* Added `FSFE REUSE `_ compliant license information. Documentation now licensed under CC-BY-4.0 (`#160 `_). PyPSA-Eur 0.1.0 (9th January 2020) ================================== diff --git a/environment.fixedversions.yaml b/environment.fixedversions.yaml index be6f5c49..5c936bb9 100644 --- a/environment.fixedversions.yaml +++ b/environment.fixedversions.yaml @@ -1,237 +1,237 @@ -# SPDX-FileCopyrightText: : 2017-2020 The PyPSA-Eur Authors -# -# SPDX-License-Identifier: GPL-3.0-or-later - -name: pypsa-eur +name: pypsa-eur-v0.2.0 channels: - bioconda + - gurobi - conda-forge - - http://conda.anaconda.org/gurobi - defaults dependencies: - _libgcc_mutex=0.1 - affine=2.3.0 - appdirs=1.4.3 - - atlite=0.0.2 + - atlite=0.0.3 - attrs=19.3.0 - backcall=0.1.0 - - beautifulsoup4=4.8.2 - - blosc=1.17.0 - - bokeh=1.4.0 - - boost-cpp=1.70.0 - - bottleneck=1.3.1 + - beautifulsoup4=4.9.1 + - blas=1.0 + - blosc=1.16.3 + - bokeh=2.0.2 + - bottleneck=1.3.2 - bzip2=1.0.8 - - ca-certificates=2019.11.28 - - cairo=1.16.0 + - ca-certificates=2020.1.1 + - cairo=1.14.12 - cartopy=0.17.0 - - certifi=2019.11.28 - - cffi=1.13.2 + - certifi=2020.4.5.1 + - cffi=1.14.0 - cfitsio=3.470 - - cftime=1.0.4.2 + - cftime=1.1.2 - chardet=3.0.4 - - click=7.0 + - click=7.1.2 - click-plugins=1.1.1 - cligj=0.5.0 - - cloudpickle=1.2.2 - - configargparse=0.13.0 - - cryptography=2.8 - - curl=7.65.3 + - cloudpickle=1.4.1 + - coincbc=2.10.5 + - configargparse=1.1 + - cryptography=2.9.2 + - curl=7.67.0 - cycler=0.10.0 - cytoolz=0.10.1 - - dask=2.9.1 - - dask-core=2.9.1 - - datrie=0.8 - - dbus=1.13.6 - - decorator=4.4.1 - - distributed=2.9.1 - - docutils=0.15.2 + - dask=2.17.2 + - dask-core=2.17.2 + - datrie=0.8.2 + - dbus=1.13.14 + - decorator=4.4.2 + - distributed=2.17.0 + - docutils=0.16 - entsoe-py=0.2.10 - - expat=2.2.5 - - fiona=1.8.6 - - fontconfig=2.13.1 - - freetype=2.10.0 + - expat=2.2.6 + - fiona=1.8.11 + - fontconfig=2.13.0 + - freetype=2.9.1 - freexl=1.0.5 - - fsspec=0.6.2 - - gdal=2.4.1 + - fsspec=0.7.4 + - gdal=3.0.2 - geographiclib=1.50 - - geopandas=0.6.2 - - geopy=1.20.0 - - geos=3.7.2 - - geotiff=1.4.3 - - gettext=0.19.8.1 - - giflib=5.1.7 - - gitdb2=2.0.6 - - gitpython=3.0.5 - - glib=2.58.3 - - gst-plugins-base=1.14.5 - - gstreamer=1.14.5 + - geopandas=0.6.1 + - geopy=1.22.0 + - geos=3.8.0 + - geotiff=1.5.1 + - giflib=5.1.4 + - gitdb=4.0.2 + - gitpython=3.1.1 + - glib=2.63.1 + - gst-plugins-base=1.14.0 + - gstreamer=1.14.0 + - gurobi=9.0.2 - hdf4=4.2.13 - - hdf5=1.10.5 + - hdf5=1.10.4 - heapdict=1.0.1 - icu=58.2 - - idna=2.8 - - importlib_metadata=1.3.0 - - ipython=7.11.1 + - idna=2.9 + - importlib-metadata=1.6.0 + - importlib_metadata=1.6.0 + - intel-openmp=2020.1 + - ipopt=3.13.2 + - ipython=7.13.0 - ipython_genutils=0.2.0 - - jedi=0.15.2 - - jinja2=2.10.3 - - joblib=0.14.1 - - jpeg=9c + - jedi=0.17.0 + - jinja2=2.11.2 + - joblib=0.15.1 + - jpeg=9b - json-c=0.13.1 - jsonschema=3.2.0 - - kealib=1.4.10 - - kiwisolver=1.1.0 + - jupyter_core=4.6.3 + - kealib=1.4.7 + - kiwisolver=1.2.0 - krb5=1.16.4 - ld_impl_linux-64=2.33.1 - libblas=3.8.0 + - libboost=1.67.0 - libcblas=3.8.0 - - libcurl=7.65.3 - - libdap4=3.20.4 - - libedit=3.1.20170329 - - libffi=3.2.1 - - libgcc-ng=9.2.0 - - libgdal=2.4.1 + - libcurl=7.67.0 + - libdap4=3.19.1 + - libedit=3.1.20181209 + - libffi=3.3 + - libgcc-ng=9.1.0 + - libgdal=3.0.2 - libgfortran-ng=7.3.0 - - libgomp=9.2.0 - - libiconv=1.15 - libkml=1.3.0 - liblapack=3.8.0 - - libnetcdf=4.6.2 - - libopenblas=0.3.7 + - libnetcdf=4.6.1 - libpng=1.6.37 - libpq=11.5 - libspatialindex=1.9.3 - libspatialite=4.3.0a - - libssh2=1.8.2 - - libstdcxx-ng=9.2.0 + - libssh2=1.9.0 + - libstdcxx-ng=9.1.0 - libtiff=4.1.0 - - libuuid=2.32.1 + - libuuid=1.0.3 - libxcb=1.13 - libxml2=2.9.9 + - libxslt=1.1.33 - locket=0.2.0 - - lz4-c=1.8.3 + - lxml=4.5.0 + - lz4-c=1.8.1.2 - lzo=2.10 - markupsafe=1.1.1 - - matplotlib=3.1.1 - - matplotlib-base=3.1.1 - - memory_profiler=0.56.0 - - mock=3.0.5 - - more-itertools=8.0.2 - - msgpack-python=0.6.2 + - matplotlib=3.1.3 + - matplotlib-base=3.1.3 + - memory_profiler=0.55.0 + - metis=5.1.0 + - mkl=2020.1 + - mkl-service=2.3.0 + - mkl_fft=1.0.15 + - mkl_random=1.1.1 + - mock=4.0.2 + - more-itertools=8.3.0 + - msgpack-python=1.0.0 - munch=2.5.0 - - ncurses=6.1 - - netcdf4=1.5.1.2 + - nbformat=5.0.6 + - ncurses=6.2 + - netcdf4=1.4.2 - networkx=2.4 - nose=1.3.7 - numexpr=2.7.1 - - numpy=1.17.3 + - numpy=1.18.1 + - numpy-base=1.18.1 - olefile=0.46 - - openjpeg=2.3.1 - - openmp_impl=4.5 - - openssl=1.1.1d - - owslib=0.19.0 - - packaging=20.0 - - pandas=0.25.3 - - parso=0.5.2 + - openjpeg=2.3.0 + - openssl=1.1.1g + - owslib=0.19.2 + - packaging=20.3 + - pandas=1.0.3 + - parso=0.7.0 - partd=1.1.0 - - patsy=0.5.1 - pcre=8.43 - - pexpect=4.7.0 + - pexpect=4.8.0 - pickleshare=0.7.5 - - pillow=7.0.0 - - pip=19.3.1 + - pillow=7.1.2 + - pip=20.0.2 - pixman=0.38.0 - - pluggy=0.13.0 + - pluggy=0.13.1 - ply=3.11 - - poppler=0.67.0 + - poppler=0.65.0 - poppler-data=0.4.9 - postgresql=11.5 - - powerplantmatching=0.4.3 - - progressbar2=3.47.0 - - proj4=5.2.0 - - prompt_toolkit=3.0.2 - - psutil=5.6.7 - - pthread-stubs=0.4 + - powerplantmatching=0.4.5 + - progressbar2=3.37.1 + - proj=6.2.1 + - prompt-toolkit=3.0.5 + - prompt_toolkit=3.0.5 + - psutil=5.7.0 - ptyprocess=0.6.0 - py=1.8.1 - pycountry=19.8.18 - - pycparser=2.19 + - pycparser=2.20 - pyepsg=0.4.0 - - pygments=2.5.2 + - pygments=2.6.1 - pykdtree=1.3.1 - - pyomo=5.6.8 + - pyomo=5.6.9 - pyopenssl=19.1.0 - - pyparsing=2.4.6 - - pyproj=1.9.6 - - pypsa=0.16.0 + - pyparsing=2.4.7 + - pyproj=2.6.1.post1 + - pypsa=0.17.0 - pyqt=5.9.2 - - pyrsistent=0.15.7 + - pyrsistent=0.16.0 - pyshp=2.1.0 - pysocks=1.7.1 - pytables=3.6.1 - - pytest=5.3.2 + - pytest=5.4.2 - pytest-runner=5.2 - - python=3.7.6 + - python=3.7.7 - python-dateutil=2.8.1 - python-utils=2.3.0 - - pytz=2019.3 - - pyutilib=5.7.3 - - pyyaml=5.3 + - python_abi=3.7 + - pytz=2020.1 + - pyutilib=5.8.0 + - pyyaml=5.3.1 - qt=5.9.7 - - rasterio=1.0.25 + - rasterio=1.1.0 - ratelimiter=1.2.0 - readline=8.0 - - requests=2.22.0 - - rtree=0.9.3 + - requests=2.23.0 + - rtree=0.9.4 - scikit-learn=0.22.1 - scipy=1.4.1 - - seaborn=0.9.0 - - setuptools=44.0.0 - - shapely=1.6.4 + - seaborn=0.10.1 + - setuptools=47.1.1 + - shapely=1.7.0 - sip=4.19.8 - - six=1.13.0 - - smmap2=2.0.5 - - snakemake-minimal=5.9.1 + - six=1.15.0 + - smmap=3.0.2 + - snakemake-minimal=5.19.2 + - snappy=1.1.7 - snuggs=1.4.7 - sortedcontainers=2.1.0 - - soupsieve=1.9.4 - - sqlite=3.30.1 - - statsmodels=0.10.2 + - soupsieve=2.0.1 + - sqlite=3.31.1 + - tbb=2018.0.5 - tblib=1.6.0 - - tk=8.6.10 + - tiledb=1.6.3 + - tk=8.6.8 - toolz=0.10.0 - - tornado=6.0.3 + - toposort=1.5 + - tornado=6.0.4 - traitlets=4.3.3 - - tzcode=2019a - - urllib3=1.25.7 - - wcwidth=0.1.8 - - wheel=0.33.6 - - wrapt=1.11.2 - - xarray=0.14.1 + - typing_extensions=3.7.4.1 + - tzcode=2020a + - urllib3=1.25.8 + - wcwidth=0.1.9 + - wheel=0.34.2 + - wrapt=1.12.1 + - xarray=0.15.1 - xerces-c=3.2.2 - xlrd=1.2.0 - - xorg-kbproto=1.0.7 - - xorg-libice=1.0.10 - - xorg-libsm=1.2.3 - - xorg-libx11=1.6.9 - - xorg-libxau=1.0.9 - - xorg-libxdmcp=1.1.3 - - xorg-libxext=1.3.4 - - xorg-libxrender=0.9.10 - - xorg-renderproto=0.11.1 - - xorg-xextproto=7.3.0 - - xorg-xproto=7.0.31 - - xz=5.2.4 - - yaml=0.2.2 - - zict=1.0.0 - - zipp=0.6.0 + - xz=5.2.5 + - yaml=0.1.7 + - zict=2.0.0 + - zipp=3.1.0 - zlib=1.2.11 - - zstd=1.4.4 + - zstd=1.3.7 - pip: - - cdsapi==0.2.5 + - cdsapi==0.2.7 - countrycode==0.2 - descartes==1.1.0 - geokit==1.1.2 - glaes==1.1.2 - - tqdm==4.41.1 - - vresutils==0.3 + - tqdm==4.46.1 + - vresutils==0.3.1 diff --git a/scenarios.png b/scenarios.png new file mode 100644 index 00000000..e342103d Binary files /dev/null and b/scenarios.png differ diff --git a/scripts/build_renewable_profiles.py b/scripts/build_renewable_profiles.py index c8ff69ae..6578fd75 100644 --- a/scripts/build_renewable_profiles.py +++ b/scripts/build_renewable_profiles.py @@ -96,26 +96,31 @@ Outputs .. image:: ../img/profile_ts.png :scale: 33 % + :align: center - **p_nom_max** .. image:: ../img/p_nom_max_hist.png :scale: 33 % + :align: center - **potential** .. image:: ../img/potential_heatmap.png :scale: 33 % + :align: center - **average_distance** .. image:: ../img/distance_hist.png :scale: 33 % + :align: center - **underwater_fraction** .. image:: ../img/underwater_hist.png :scale: 33 % + :align: center Description ----------- @@ -134,11 +139,31 @@ cutout grid cell and each node using the `GLAES `_ library. This uses the CORINE land use data, Natura2000 nature reserves and GEBCO bathymetry data. +.. image:: ../img/eligibility.png + :scale: 50 % + :align: center + To compute the layout of generators in each node's Voronoi cell, the installable potential in each grid cell is multiplied with the capacity factor at each grid cell. This is done since we assume more generators are installed at cells with a higher capacity factor. +.. image:: ../img/offwinddc-gridcell.png + :scale: 50 % + :align: center + +.. image:: ../img/offwindac-gridcell.png + :scale: 50 % + :align: center + +.. image:: ../img/onwind-gridcell.png + :scale: 50 % + :align: center + +.. image:: ../img/solar-gridcell.png + :scale: 50 % + :align: center + This layout is then used to compute the generation availability time series from the weather data cutout from ``atlite``. diff --git a/scripts/cluster_network.py b/scripts/cluster_network.py index 1d47f947..c5ce98e0 100644 --- a/scripts/cluster_network.py +++ b/scripts/cluster_network.py @@ -93,6 +93,30 @@ Description for all ``scenario`` s in the configuration file the rule :mod:`cluster_network`. +Exemplary unsolved network clustered to 512 nodes: + +.. image:: ../img/elec_s_512.png + :scale: 40 % + :align: center + +Exemplary unsolved network clustered to 256 nodes: + +.. image:: ../img/elec_s_256.png + :scale: 40 % + :align: center + +Exemplary unsolved network clustered to 128 nodes: + +.. image:: ../img/elec_s_128.png + :scale: 40 % + :align: center + +Exemplary unsolved network clustered to 37 nodes: + +.. image:: ../img/elec_s_37.png + :scale: 40 % + :align: center + """ import logging diff --git a/test/config.test1.yaml b/test/config.test1.yaml index 9614fa87..572776c3 100755 --- a/test/config.test1.yaml +++ b/test/config.test1.yaml @@ -2,7 +2,7 @@ # # SPDX-License-Identifier: CC0-1.0 -version: 0.1.0 +version: 0.2.0 tutorial: true logging: level: INFO