Merge branch 'master' into ci-review
This commit is contained in:
commit
8bf6238785
2
.github/workflows/ci.yaml
vendored
2
.github/workflows/ci.yaml
vendored
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: : 2021 The PyPSA-Eur Authors
|
# SPDX-FileCopyrightText: : 2021-2023 The PyPSA-Eur Authors
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: CC0-1.0
|
# SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright 2017-2021 The PyPSA-Eur Authors
|
Copyright 2017-2023 The PyPSA-Eur Authors
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
version: 0.6.0
|
version: 0.7.0
|
||||||
|
|
||||||
logging_level: INFO
|
logging_level: INFO
|
||||||
|
|
||||||
@ -538,6 +538,7 @@ plotting:
|
|||||||
natural gas: '#e05b09'
|
natural gas: '#e05b09'
|
||||||
CCGT: '#a85522'
|
CCGT: '#a85522'
|
||||||
CCGT marginal: '#a85522'
|
CCGT marginal: '#a85522'
|
||||||
|
allam: '#B98F76'
|
||||||
gas for industry co2 to atmosphere: '#692e0a'
|
gas for industry co2 to atmosphere: '#692e0a'
|
||||||
gas for industry co2 to stored: '#8a3400'
|
gas for industry co2 to stored: '#8a3400'
|
||||||
gas for industry: '#853403'
|
gas for industry: '#853403'
|
||||||
|
@ -63,17 +63,17 @@ master_doc = 'index'
|
|||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u'PyPSA-Eur-Sec'
|
project = u'PyPSA-Eur-Sec'
|
||||||
copyright = u'2019-2021 Tom Brown (KIT, TUB), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB), Fabian Neumann (TUB)'
|
copyright = u'2019-2023 Tom Brown (KIT, TUB), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB), Fabian Neumann (TUB)'
|
||||||
author = u'2019-2021 Tom Brown (KIT, TUB), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB), Fabian Neumann (TUB)'
|
author = u'2019-2023 Tom Brown (KIT, TUB), Marta Victoria (Aarhus University), Lisa Zeyen (KIT, TUB), Fabian Neumann (TUB)'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
# built documents.
|
# built documents.
|
||||||
#
|
#
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = u'0.6'
|
version = u'0.7'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = u'0.6.0'
|
release = u'0.7.0'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
@ -16,6 +16,7 @@ existing heating potentials,existing_infrastructure/existing_heating_raw.csv,unk
|
|||||||
IRENA existing VRE capacities,existing_infrastructure/{solar|onwind|offwind}_capcity_IRENA.csv,unknown,https://www.irena.org/Statistics/Download-Data
|
IRENA existing VRE capacities,existing_infrastructure/{solar|onwind|offwind}_capcity_IRENA.csv,unknown,https://www.irena.org/Statistics/Download-Data
|
||||||
USGS ammonia production,myb1-2017-nitro.xls,unknown,https://www.usgs.gov/centers/nmic/nitrogen-statistics-and-information
|
USGS ammonia production,myb1-2017-nitro.xls,unknown,https://www.usgs.gov/centers/nmic/nitrogen-statistics-and-information
|
||||||
hydrogen salt cavern potentials,h2_salt_caverns_GWh_per_sqkm.geojson,CC BY 4.0,https://doi.org/10.1016/j.ijhydene.2019.12.161 https://doi.org/10.20944/preprints201910.0187.v1
|
hydrogen salt cavern potentials,h2_salt_caverns_GWh_per_sqkm.geojson,CC BY 4.0,https://doi.org/10.1016/j.ijhydene.2019.12.161 https://doi.org/10.20944/preprints201910.0187.v1
|
||||||
|
international port trade volumes,attributed_ports.json,CC BY 4.0,https://datacatalog.worldbank.org/search/dataset/0038118/Global---International-Ports
|
||||||
hotmaps industrial site database,Industrial_Database.csv,CC BY 4.0,https://gitlab.com/hotmaps/industrial_sites/industrial_sites_Industrial_Database
|
hotmaps industrial site database,Industrial_Database.csv,CC BY 4.0,https://gitlab.com/hotmaps/industrial_sites/industrial_sites_Industrial_Database
|
||||||
Hotmaps building stock data,data_building_stock.csv,CC BY 4.0,https://gitlab.com/hotmaps/building-stock
|
Hotmaps building stock data,data_building_stock.csv,CC BY 4.0,https://gitlab.com/hotmaps/building-stock
|
||||||
U-values Poland,u_values_poland.csv,unknown,https://data.europa.eu/euodp/de/data/dataset/building-stock-observatory
|
U-values Poland,u_values_poland.csv,unknown,https://data.europa.eu/euodp/de/data/dataset/building-stock-observatory
|
||||||
|
|
@ -14,10 +14,6 @@ PyPSA-Eur-Sec: A Sector-Coupled Open Optimisation Model of the European Energy S
|
|||||||
.. image:: https://img.shields.io/github/repo-size/pypsa/pypsa-eur-sec
|
.. image:: https://img.shields.io/github/repo-size/pypsa/pypsa-eur-sec
|
||||||
:alt: GitHub repo size
|
:alt: GitHub repo size
|
||||||
|
|
||||||
.. image:: https://badges.gitter.im/PyPSA/community.svg
|
|
||||||
:target: https://gitter.im/PyPSA/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
|
|
||||||
:alt: Chat on Gitter
|
|
||||||
|
|
||||||
|
|
||||||
PyPSA-Eur-Sec is an open model dataset of the European energy system at the
|
PyPSA-Eur-Sec is an open model dataset of the European energy system at the
|
||||||
transmission network level that covers the full ENTSO-E area.
|
transmission network level that covers the full ENTSO-E area.
|
||||||
@ -101,6 +97,15 @@ Ministry for Education and Research (BMBF) <https://www.bmbf.de/en/index.html>`_
|
|||||||
as part of the `Stromnetze Research Initiative
|
as part of the `Stromnetze Research Initiative
|
||||||
<http://forschung-stromnetze.info/projekte/grundlagen-und-konzepte-fuer-effiziente-dezentrale-stromnetze/>`_.
|
<http://forschung-stromnetze.info/projekte/grundlagen-und-konzepte-fuer-effiziente-dezentrale-stromnetze/>`_.
|
||||||
|
|
||||||
|
Workflow Outline
|
||||||
|
================
|
||||||
|
|
||||||
|
.. image:: ../graphics/workflow.png
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
The graph above was generated using
|
||||||
|
``snakemake --rulegraph -F | sed -n "/digraph/,/}/p" | dot -Tpng -o workflow.png``
|
||||||
|
|
||||||
|
|
||||||
Documentation
|
Documentation
|
||||||
=============
|
=============
|
||||||
|
@ -8,31 +8,49 @@ Future release
|
|||||||
.. note::
|
.. note::
|
||||||
This unreleased version currently may require the master branches of PyPSA, PyPSA-Eur, and the technology-data repository.
|
This unreleased version currently may require the master branches of PyPSA, PyPSA-Eur, and the technology-data repository.
|
||||||
|
|
||||||
This release includes the addition of the European gas transmission network and
|
* new feature
|
||||||
incorporates retrofitting options to hydrogen.
|
|
||||||
|
|
||||||
|
PyPSA-Eur-Sec 0.7.0 (16th February 2023)
|
||||||
|
========================================
|
||||||
|
|
||||||
|
This release includes many new features. Highlights include new gas
|
||||||
|
infrastructure data with retrofitting options for hydrogen transport, improved
|
||||||
|
carbon management and infrastructure planning, regionalised potentials for
|
||||||
|
hydrogen underground storage and carbon sequestration, new applications for
|
||||||
|
biomass, and explicit modelling of methanol and ammonia as separate energy
|
||||||
|
carriers.
|
||||||
|
|
||||||
|
This release is known to work with `PyPSA-Eur
|
||||||
|
<https://github.com/PyPSA/pypsa-eur>`_ Version 0.7.0 and `Technology Data
|
||||||
|
<https://github.com/PyPSA/technology-data>`_ Version 0.5.0.
|
||||||
|
|
||||||
**Gas Transmission Network**
|
**Gas Transmission Network**
|
||||||
|
|
||||||
* New rule ``retrieve_gas_infrastructure_data`` that downloads and extracts the
|
* New rule ``retrieve_gas_infrastructure_data`` that downloads and extracts the
|
||||||
SciGRID_gas `IGGIELGN <https://zenodo.org/record/4767098>`_ dataset from zenodo.
|
SciGRID_gas `IGGIELGN <https://zenodo.org/record/4767098>`_ dataset from
|
||||||
It includes data on the transmission routes, pipe diameters, capacities, pressure,
|
zenodo. It includes data on the transmission routes, pipe diameters,
|
||||||
and whether the pipeline is bidirectional and carries H-Gas or L-Gas.
|
capacities, pressure, and whether the pipeline is bidirectional and carries
|
||||||
|
H-Gas or L-Gas.
|
||||||
|
|
||||||
* New rule ``build_gas_network`` processes and cleans the pipeline data from SciGRID_gas.
|
* New rule ``build_gas_network`` processes and cleans the pipeline data from
|
||||||
Missing or uncertain pipeline capacities can be inferred by diameter.
|
SciGRID_gas. Missing or uncertain pipeline capacities can be inferred by
|
||||||
|
diameter.
|
||||||
|
|
||||||
* New rule ``build_gas_input_locations`` compiles the LNG import capacities
|
* New rule ``build_gas_input_locations`` compiles the LNG import capacities
|
||||||
(including planned projects from gem.wiki), pipeline entry capacities and
|
(from the Global Energy Monitor's `Europe Gas Tracker
|
||||||
local production capacities for each region of the model. These are the
|
<https://globalenergymonitor.org/projects/europe-gas-tracker/>`_, pipeline
|
||||||
regions where fossil gas can eventually enter the model.
|
entry capacities and local production capacities for each region of the model.
|
||||||
|
These are the regions where fossil gas can eventually enter the model.
|
||||||
|
|
||||||
* New rule ``cluster_gas_network`` that clusters the gas transmission network
|
* New rule ``cluster_gas_network`` that clusters the gas transmission network
|
||||||
data to the model resolution. Cross-regional pipeline capacities are aggregated
|
data to the model resolution. Cross-regional pipeline capacities are
|
||||||
(while pressure and diameter compatibility is ignored), intra-regional pipelines
|
aggregated (while pressure and diameter compatibility is ignored),
|
||||||
are dropped. Lengths are recalculated based on the regions' centroids.
|
intra-regional pipelines are dropped. Lengths are recalculated based on the
|
||||||
|
regions' centroids.
|
||||||
|
|
||||||
* With the option ``sector: gas_network:``, the existing gas network is
|
* With the option ``sector: gas_network:``, the existing gas network is added
|
||||||
added with a lossless transport model. A length-weighted `k-edge augmentation
|
with a lossless transport model. A length-weighted `k-edge augmentation
|
||||||
algorithm
|
algorithm
|
||||||
<https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation.html#networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation>`_
|
<https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation.html#networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation>`_
|
||||||
can be run to add new candidate gas pipelines such that all regions of the
|
can be run to add new candidate gas pipelines such that all regions of the
|
||||||
@ -41,69 +59,27 @@ incorporates retrofitting options to hydrogen.
|
|||||||
the gas network is activated, all the gas demands are regionally disaggregated
|
the gas network is activated, all the gas demands are regionally disaggregated
|
||||||
as well.
|
as well.
|
||||||
|
|
||||||
* New constraint allows endogenous retrofitting of gas pipelines to hydrogen pipelines.
|
* New constraint allows endogenous retrofitting of gas pipelines to hydrogen
|
||||||
This option is activated via the setting ``sector: H2_retrofit:``. For every
|
pipelines. This option is activated via the setting ``sector: H2_retrofit:``.
|
||||||
unit of gas pipeline capacity dismantled, ``sector:
|
For every unit of gas pipeline capacity dismantled, ``sector:
|
||||||
H2_retrofit_capacity_per_CH4`` units are made available as hydrogen pipeline
|
H2_retrofit_capacity_per_CH4`` units are made available as hydrogen pipeline
|
||||||
capacity in the corresponding corridor. These repurposed hydrogen pipelines
|
capacity in the corresponding corridor. These repurposed hydrogen pipelines
|
||||||
have lower costs than new hydrogen pipelines. Both new and repurposed pipelines
|
have lower costs than new hydrogen pipelines. Both new and repurposed
|
||||||
can be built simultaneously. The retrofitting option ``sector: H2_retrofit:`` also works
|
pipelines can be built simultaneously. The retrofitting option ``sector:
|
||||||
with a copperplated methane infrastructure, i.e. when ``sector: gas_network: false``.
|
H2_retrofit:`` also works with a copperplated methane infrastructure, i.e.
|
||||||
|
when ``sector: gas_network: false``.
|
||||||
|
|
||||||
* New hydrogen pipelines can now be built where there are already power or gas
|
* New hydrogen pipelines can now be built where there are already power or gas
|
||||||
transmission routes. Previously, only the electricity transmission routes were
|
transmission routes. Previously, only the electricity transmission routes were
|
||||||
considered.
|
considered.
|
||||||
|
|
||||||
**New features and functionality**
|
**Carbon Management and Biomass**
|
||||||
|
|
||||||
|
|
||||||
* Add option to aggregate network temporally using representative snapshots or segments (with tsam package)
|
|
||||||
|
|
||||||
* Add option for biomass boilers (wood pellets) for decentral heating
|
|
||||||
|
|
||||||
* Add option for BioSNG (methane from biomass) with and without CC
|
|
||||||
|
|
||||||
* Add option for BtL (Biomass to liquid fuel/oil) with and without CC
|
|
||||||
|
|
||||||
* Add option for minimum part load for Fischer-Tropsch plants (default: 90%) and methanolisation plants (default: 50%).
|
|
||||||
|
|
||||||
* Units are assigned to the buses. These only provide a better understanding. The specifications of the units are not taken into account in the optimisation, which means that no automatic conversion of units takes place.
|
|
||||||
|
|
||||||
* Option ``retrieve_sector_databundle`` to automatically retrieve and extract data bundle.
|
|
||||||
|
|
||||||
* Add option to use waste heat of electrolysis in district heating networks (``use_electrolysis_waste_heat``).
|
|
||||||
|
|
||||||
* Add regionalised hydrogen salt cavern storage potentials from `Technical Potential of Salt Caverns for Hydrogen Storage in Europe <https://doi.org/10.20944/preprints201910.0187.v1>`_.
|
|
||||||
|
|
||||||
* Add option to sweep the global CO2 sequestration potentials with keyword ``seq200`` in the ``{sector_opts}`` wildcard (for limit of 200 Mt CO2).
|
|
||||||
|
|
||||||
* Add option to resolve ammonia as separate energy carrier with Haber-Bosch
|
|
||||||
synthesis, ammonia cracking, storage and industrial demand. The ammonia
|
|
||||||
carrier can be nodally resolved or copperplated across Europe. This feature is
|
|
||||||
controlled by ``sector: ammonia:``.
|
|
||||||
|
|
||||||
* Add methanol as energy carrier, methanolisation as process, and option for methanol demand in shipping sector.
|
|
||||||
|
|
||||||
* Updated `data bundle <https://zenodo.org/record/5824485/files/pypsa-eur-sec-data-bundle.tar.gz>`_ that includes the hydrogan salt cavern storage potentials.
|
|
||||||
|
|
||||||
* Updated and extended documentation in <https://pypsa-eur-sec.readthedocs.io/en/latest/>
|
|
||||||
|
|
||||||
* Shipping demand now defaults to (synthetic) oil rather than liquefied hydrogen until 2050.
|
|
||||||
|
|
||||||
* Improved network plots including better legends, hydrogen retrofitting network display, and change to EqualEarth projection.
|
|
||||||
|
|
||||||
* New config options for changing energy demands in aviation
|
|
||||||
(``aviation_demand_factor``) and HVC industry (``HVC_demand_factor``), as well
|
|
||||||
as explicit ICE shares for land transport (``land_transport_ice_share``) and
|
|
||||||
agriculture machinery (``agriculture_machinery_oil_share``).
|
|
||||||
|
|
||||||
* Add option to spatially resolve carrier representing stored carbon dioxide
|
* Add option to spatially resolve carrier representing stored carbon dioxide
|
||||||
(``co2_spatial``). This allows for more detailed modelling of CCUTS, e.g.
|
(``co2_spatial``). This allows for more detailed modelling of CCUTS, e.g.
|
||||||
regarding the capturing of industrial process emissions, usage as feedstock
|
regarding the capturing of industrial process emissions, usage as feedstock
|
||||||
for electrofuels, transport of carbon dioxide, and geological sequestration sites.
|
for electrofuels, transport of carbon dioxide, and geological sequestration
|
||||||
|
sites.
|
||||||
* Add option for planning a new carbon dioxide network (``co2network``).
|
|
||||||
|
|
||||||
|
|
||||||
* Add option for regionally-resolved geological carbon dioxide sequestration
|
* Add option for regionally-resolved geological carbon dioxide sequestration
|
||||||
potentials through new rule ``build_sequestration_potentials`` based on
|
potentials through new rule ``build_sequestration_potentials`` based on
|
||||||
@ -115,18 +91,135 @@ incorporates retrofitting options to hydrogen.
|
|||||||
potential. The defaults are preliminary and will be validated the next
|
potential. The defaults are preliminary and will be validated the next
|
||||||
release.
|
release.
|
||||||
|
|
||||||
* Separate option to regionally resolve biomass (``biomass_spatial``) from
|
* Add option to sweep the global CO2 sequestration potentials with keyword
|
||||||
option to allow biomass transport (``biomass_transport``).
|
``seq200`` in the ``{sector_opts}`` wildcard (for limit of 200 Mt CO2).
|
||||||
|
|
||||||
* Add option to include `Allam cycle gas power plants
|
* Add option to include `Allam cycle gas power plants
|
||||||
<https://en.wikipedia.org/wiki/Allam_power_cycle>`_ (``allam_cycle``).
|
<https://en.wikipedia.org/wiki/Allam_power_cycle>`_ (``allam_cycle``).
|
||||||
|
|
||||||
|
* Add option for planning a new carbon dioxide network (``co2network``).
|
||||||
|
|
||||||
|
* Separate option to regionally resolve biomass (``biomass_spatial``) from
|
||||||
|
option to allow biomass transport (``biomass_transport``).
|
||||||
|
|
||||||
|
* Add option for biomass boilers (wood pellets) for decentral heating.
|
||||||
|
|
||||||
|
* Add option for BioSNG (methane from biomass) with and without carbon capture.
|
||||||
|
|
||||||
|
* Add option for BtL (biomass to liquid fuel/oil) with and without carbon
|
||||||
|
capture.
|
||||||
|
|
||||||
|
|
||||||
|
**Other new features**
|
||||||
|
|
||||||
|
* Add regionalised hydrogen salt cavern storage potentials from `Technical
|
||||||
|
Potential of Salt Caverns for Hydrogen Storage in Europe
|
||||||
|
<https://doi.org/10.20944/preprints201910.0187.v1>`_. This data is compiled in
|
||||||
|
a new rule ``build_salt_cavern_potentials``.
|
||||||
|
|
||||||
|
* Add option to resolve ammonia as separate energy carrier with Haber-Bosch
|
||||||
|
synthesis, ammonia cracking, storage and industrial demand. The ammonia
|
||||||
|
carrier can be nodally resolved or copperplated across Europe (see
|
||||||
|
``ammonia``).
|
||||||
|
|
||||||
|
* Add methanol as energy carrier, methanolisation as process, and option for
|
||||||
|
methanol demand in shipping sector.
|
||||||
|
|
||||||
|
* Shipping demand now defaults to methanol rather than liquefied hydrogen
|
||||||
|
until 2050.
|
||||||
|
|
||||||
|
* Demand for liquid hydrogen in international shipping is now geographically
|
||||||
|
distributed by port trade volumes in a new rule ``build_shipping_demand``
|
||||||
|
using data from the `World Bank Data Catalogue
|
||||||
|
<https://datacatalog.worldbank.org/search/dataset/0038118/Global---International-Ports>`_.
|
||||||
|
Domestic shipping remains distributed by population.
|
||||||
|
|
||||||
|
* Add option to aggregate network temporally using representative snapshots or
|
||||||
|
segments (with `tsam <https://github.com/FZJ-IEK3-VSA/tsam>`_).
|
||||||
|
|
||||||
|
* Add option for minimum part load for Fischer-Tropsch plants (default: 90%) and
|
||||||
|
methanolisation plants (default: 50%).
|
||||||
|
|
||||||
|
* Add option to use waste heat of electrolysis in district heating networks
|
||||||
|
(``use_electrolysis_waste_heat``).
|
||||||
|
|
||||||
|
* Add option for coal CHPs with carbon capture (see ``coal_cc``).
|
||||||
|
|
||||||
|
* In overnight optimisation, it is now possible to specify a year for the
|
||||||
|
technology cost projections separate from the planning horizon.
|
||||||
|
|
||||||
|
* New config options for changing energy demands in aviation
|
||||||
|
(``aviation_demand_factor``) and HVC industry (``HVC_demand_factor``), as well
|
||||||
|
as explicit ICE shares for land transport (``land_transport_ice_share``) and
|
||||||
|
agriculture machinery (``agriculture_machinery_oil_share``).
|
||||||
|
|
||||||
|
* It is now possible to merge residential and services heat buses to reduce the
|
||||||
|
problem size (see ``cluster_heat_nodes``).
|
||||||
|
|
||||||
|
* Added option to tweak (almost) any configuration parameter through the
|
||||||
|
``{sector_opts}`` wildcard. The regional_co2_sequestration_potential is
|
||||||
|
triggered by the prefix ``CF+`` after which it is possible to pipe to any
|
||||||
|
setting that does not contain underscores (``_``). Example:
|
||||||
|
``CF+sector+v2g+false`` disables vehicle-to-grid flexibility.
|
||||||
|
|
||||||
|
* Option ``retrieve_sector_databundle`` to automatically retrieve and extract
|
||||||
|
data bundle.
|
||||||
|
|
||||||
|
* Removed the need to clone ``technology-data`` repository in a parallel
|
||||||
|
directory. The new approach automatically retrieves the technology data from
|
||||||
|
remote in the rule ``retrieve_cost_data``.
|
||||||
|
|
||||||
|
* Improved network plots including better legends, hydrogen retrofitting network
|
||||||
|
display, and change to EqualEarth projection. A new color scheme for
|
||||||
|
technologies was also introduced.
|
||||||
|
|
||||||
|
* Add two new rules ``build_transport_demand`` and
|
||||||
|
``build_population_weighted_energy_totals`` using code previously contained in
|
||||||
|
``prepare_sector_network``.
|
||||||
|
|
||||||
|
* Rules that convert weather data with ``atlite`` now largely run separately for
|
||||||
|
categories residential, rural and total.
|
||||||
|
|
||||||
|
* Units are assigned to the buses. These only provide a better understanding.
|
||||||
|
The specifications of the units are not taken into account in the
|
||||||
|
optimisation, which means that no automatic conversion of units takes place.
|
||||||
|
|
||||||
|
* Configuration file and wildcards are now stored under ``n.meta`` in every
|
||||||
|
PyPSA network.
|
||||||
|
|
||||||
|
* Updated `data bundle
|
||||||
|
<https://zenodo.org/record/5824485/files/pypsa-eur-sec-data-bundle.tar.gz>`_
|
||||||
|
that includes the hydrogan salt cavern storage potentials.
|
||||||
|
|
||||||
|
* Updated and extended documentation in
|
||||||
|
<https://pypsa-eur-sec.readthedocs.io/en/latest/>
|
||||||
|
|
||||||
|
* Added new rule ``copy_conda_env`` that exports a list of packages with which
|
||||||
|
the workflow was executed.
|
||||||
|
|
||||||
|
* Add basic continuous integration using Github Actions.
|
||||||
|
|
||||||
|
* Add basic ``rsync`` setup.
|
||||||
|
|
||||||
**Bugfixes**
|
**Bugfixes**
|
||||||
|
|
||||||
* The CO2 sequestration limit implemented as GlobalConstraint (introduced in the previous version)
|
* The CO2 sequestration limit implemented as GlobalConstraint (introduced in the
|
||||||
caused a failure to read in the shadow prices of other global constraints.
|
previous version) caused a failure to read in the shadow prices of other
|
||||||
|
global constraints.
|
||||||
|
|
||||||
* Correct capital cost of Fischer-Tropsch according to new units in ``technology-data``.
|
* Correct capital cost of Fischer-Tropsch according to new units in
|
||||||
|
``technology-data`` repository.
|
||||||
|
|
||||||
|
* Fix unit conversion error for thermal energy storage.
|
||||||
|
|
||||||
|
* For myopic pathway optimisation, set optimised capacities of power grid
|
||||||
|
expansion of previous iteration as minimum capacity for next iteration.
|
||||||
|
|
||||||
|
* Further rather minor bugfixes for myopic optimisation code (see `#256
|
||||||
|
<https://github.com/PyPSA/pypsa-eur-sec/pull/256>`_).
|
||||||
|
|
||||||
|
|
||||||
|
Many thanks to all who contributed to this release!
|
||||||
|
|
||||||
|
|
||||||
PyPSA-Eur-Sec 0.6.0 (4 October 2021)
|
PyPSA-Eur-Sec 0.6.0 (4 October 2021)
|
||||||
|
BIN
graphics/workflow.png
Normal file
BIN
graphics/workflow.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 324 KiB |
@ -178,7 +178,7 @@ def add_power_capacities_installed_before_baseyear(n, grouping_years, costs, bas
|
|||||||
busmap = pd.read_csv(snakemake.input.busmap, index_col=0).squeeze()
|
busmap = pd.read_csv(snakemake.input.busmap, index_col=0).squeeze()
|
||||||
|
|
||||||
inv_busmap = {}
|
inv_busmap = {}
|
||||||
for k, v in busmap.iteritems():
|
for k, v in busmap.items():
|
||||||
inv_busmap[v] = inv_busmap.get(v, []) + [k]
|
inv_busmap[v] = inv_busmap.get(v, []) + [k]
|
||||||
|
|
||||||
clustermaps = busmap_s.map(busmap)
|
clustermaps = busmap_s.map(busmap)
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from functools import partial
|
from functools import partial
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
from helper import mute
|
||||||
|
|
||||||
import multiprocessing as mp
|
import multiprocessing as mp
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
@ -8,6 +9,8 @@ import numpy as np
|
|||||||
|
|
||||||
idx = pd.IndexSlice
|
idx = pd.IndexSlice
|
||||||
|
|
||||||
|
mute()
|
||||||
|
|
||||||
def cartesian(s1, s2):
|
def cartesian(s1, s2):
|
||||||
"""Cartesian product of two pd.Series"""
|
"""Cartesian product of two pd.Series"""
|
||||||
return pd.DataFrame(np.outer(s1, s2), index=s1.index, columns=s2.index)
|
return pd.DataFrame(np.outer(s1, s2), index=s1.index, columns=s2.index)
|
||||||
@ -126,7 +129,6 @@ to_ipcc = {
|
|||||||
"total woL": "Total (without LULUCF)",
|
"total woL": "Total (without LULUCF)",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def build_eurostat(input_eurostat, countries, report_year, year):
|
def build_eurostat(input_eurostat, countries, report_year, year):
|
||||||
"""Return multi-index for all countries' energy data in TWh/a."""
|
"""Return multi-index for all countries' energy data in TWh/a."""
|
||||||
|
|
||||||
@ -380,7 +382,7 @@ def build_idees(countries, year):
|
|||||||
func = partial(idees_per_country, year=year)
|
func = partial(idees_per_country, year=year)
|
||||||
tqdm_kwargs = dict(ascii=False, unit=' country', total=len(countries),
|
tqdm_kwargs = dict(ascii=False, unit=' country', total=len(countries),
|
||||||
desc='Build from IDEES database')
|
desc='Build from IDEES database')
|
||||||
with mp.Pool(processes=nprocesses) as pool:
|
with mp.Pool(processes=nprocesses, initializer=mute) as pool:
|
||||||
totals_list = list(tqdm(pool.imap(func, countries), **tqdm_kwargs))
|
totals_list = list(tqdm(pool.imap(func, countries), **tqdm_kwargs))
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import pandas as pd
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import multiprocessing as mp
|
import multiprocessing as mp
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
|
from helper import mute
|
||||||
|
|
||||||
tj_to_ktoe = 0.0238845
|
tj_to_ktoe = 0.0238845
|
||||||
ktoe_to_twh = 0.01163
|
ktoe_to_twh = 0.01163
|
||||||
@ -99,7 +99,6 @@ e_switzerland = pd.Series({'Iron and steel': 7889.,
|
|||||||
'Other Industrial Sectors': 10825.,
|
'Other Industrial Sectors': 10825.,
|
||||||
'current electricity': 53760.})
|
'current electricity': 53760.})
|
||||||
|
|
||||||
|
|
||||||
def find_physical_output(df):
|
def find_physical_output(df):
|
||||||
start = np.where(df.index.str.contains('Physical output', na=''))[0][0]
|
start = np.where(df.index.str.contains('Physical output', na=''))[0][0]
|
||||||
empty_row = np.where(df.index.isnull())[0]
|
empty_row = np.where(df.index.isnull())[0]
|
||||||
@ -169,7 +168,7 @@ def industry_production(countries):
|
|||||||
func = industry_production_per_country
|
func = industry_production_per_country
|
||||||
tqdm_kwargs = dict(ascii=False, unit=' country', total=len(countries),
|
tqdm_kwargs = dict(ascii=False, unit=' country', total=len(countries),
|
||||||
desc="Build industry production")
|
desc="Build industry production")
|
||||||
with mp.Pool(processes=nprocesses) as pool:
|
with mp.Pool(processes=nprocesses, initializer=mute) as pool:
|
||||||
demand_l = list(tqdm(pool.imap(func, countries), **tqdm_kwargs))
|
demand_l = list(tqdm(pool.imap(func, countries), **tqdm_kwargs))
|
||||||
|
|
||||||
demand = pd.concat(demand_l, axis=1).T
|
demand = pd.concat(demand_l, axis=1).T
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
"""Build industry sector ratios."""
|
"""Build industry sector ratios."""
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
from helper import mute
|
||||||
|
|
||||||
|
mute()
|
||||||
|
|
||||||
# GWh/ktoe OR MWh/toe
|
# GWh/ktoe OR MWh/toe
|
||||||
toe_to_MWh = 11.630
|
toe_to_MWh = 11.630
|
||||||
|
@ -40,7 +40,7 @@ if __name__ == '__main__':
|
|||||||
reference = ["RS", "BA"]
|
reference = ["RS", "BA"]
|
||||||
average = urban_fraction[reference].mean()
|
average = urban_fraction[reference].mean()
|
||||||
fill_values = pd.Series({ct: average for ct in missing})
|
fill_values = pd.Series({ct: average for ct in missing})
|
||||||
urban_fraction = urban_fraction.append(fill_values)
|
urban_fraction = pd.concat([urban_fraction, fill_values])
|
||||||
|
|
||||||
# population in each grid cell
|
# population in each grid cell
|
||||||
pop_cells = pd.Series(I.dot(nuts3['pop']))
|
pop_cells = pd.Series(I.dot(nuts3['pop']))
|
||||||
|
@ -28,8 +28,8 @@ def build_transport_demand(traffic_fn, airtemp_fn, nodes, nodal_transport_data):
|
|||||||
## Get overall demand curve for all vehicles
|
## Get overall demand curve for all vehicles
|
||||||
|
|
||||||
traffic = pd.read_csv(
|
traffic = pd.read_csv(
|
||||||
traffic_fn, skiprows=2, usecols=["count"], squeeze=True
|
traffic_fn, skiprows=2, usecols=["count"]
|
||||||
)
|
).squeeze("columns")
|
||||||
|
|
||||||
transport_shape = generate_periodic_profiles(
|
transport_shape = generate_periodic_profiles(
|
||||||
dt_index=snapshots,
|
dt_index=snapshots,
|
||||||
@ -118,7 +118,7 @@ def bev_availability_profile(fn, snapshots, nodes, options):
|
|||||||
Derive plugged-in availability for passenger electric vehicles.
|
Derive plugged-in availability for passenger electric vehicles.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
traffic = pd.read_csv(fn, skiprows=2, usecols=["count"], squeeze=True)
|
traffic = pd.read_csv(fn, skiprows=2, usecols=["count"]).squeeze("columns")
|
||||||
|
|
||||||
avail_max = options["bev_avail_max"]
|
avail_max = options["bev_avail_max"]
|
||||||
avail_mean = options["bev_avail_mean"]
|
avail_mean = options["bev_avail_mean"]
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import yaml
|
import yaml
|
||||||
import pytz
|
import pytz
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
@ -10,6 +11,10 @@ from pypsa.components import components, component_attrs
|
|||||||
import logging
|
import logging
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
def mute():
|
||||||
|
"""hide irrelevant outputs of subprocess in multiprocessing pools.
|
||||||
|
also hide irrelevant outputs caused by pd.read_excel"""
|
||||||
|
sys.stdout = open(os.devnull, 'w')
|
||||||
|
|
||||||
def override_component_attrs(directory):
|
def override_component_attrs(directory):
|
||||||
"""Tell PyPSA that links can have multiple outputs by
|
"""Tell PyPSA that links can have multiple outputs by
|
||||||
|
@ -527,6 +527,8 @@ def add_co2_tracking(n, options):
|
|||||||
e_nom_max = pd.read_csv(snakemake.input.sequestration_potential, index_col=0).squeeze()
|
e_nom_max = pd.read_csv(snakemake.input.sequestration_potential, index_col=0).squeeze()
|
||||||
e_nom_max = e_nom_max.reindex(spatial.co2.locations).fillna(0.).clip(upper=upper_limit).mul(1e6) / annualiser # t
|
e_nom_max = e_nom_max.reindex(spatial.co2.locations).fillna(0.).clip(upper=upper_limit).mul(1e6) / annualiser # t
|
||||||
e_nom_max = e_nom_max.rename(index=lambda x: x + " co2 stored")
|
e_nom_max = e_nom_max.rename(index=lambda x: x + " co2 stored")
|
||||||
|
else:
|
||||||
|
e_nom_max = np.inf
|
||||||
|
|
||||||
n.madd("Store",
|
n.madd("Store",
|
||||||
spatial.co2.nodes,
|
spatial.co2.nodes,
|
||||||
@ -759,8 +761,8 @@ def add_ammonia(n, costs):
|
|||||||
carrier="Haber-Bosch",
|
carrier="Haber-Bosch",
|
||||||
efficiency=1 / (cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"]), # output: MW_NH3 per MW_elec
|
efficiency=1 / (cf_industry["MWh_elec_per_tNH3_electrolysis"] / cf_industry["MWh_NH3_per_tNH3"]), # output: MW_NH3 per MW_elec
|
||||||
efficiency2=-cf_industry["MWh_H2_per_tNH3_electrolysis"] / cf_industry["MWh_elec_per_tNH3_electrolysis"], # input: MW_H2 per MW_elec
|
efficiency2=-cf_industry["MWh_H2_per_tNH3_electrolysis"] / cf_industry["MWh_elec_per_tNH3_electrolysis"], # input: MW_H2 per MW_elec
|
||||||
capital_cost=costs.at["Haber-Bosch synthesis", "fixed"],
|
capital_cost=costs.at["Haber-Bosch", "fixed"],
|
||||||
lifetime=costs.at["Haber-Bosch synthesis", 'lifetime']
|
lifetime=costs.at["Haber-Bosch", 'lifetime']
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd("Link",
|
n.madd("Link",
|
||||||
@ -2905,6 +2907,9 @@ if __name__ == "__main__":
|
|||||||
if "B" in opts:
|
if "B" in opts:
|
||||||
add_biomass(n, costs)
|
add_biomass(n, costs)
|
||||||
|
|
||||||
|
if options['ammonia']:
|
||||||
|
add_ammonia(n, costs)
|
||||||
|
|
||||||
if "I" in opts:
|
if "I" in opts:
|
||||||
add_industry(n, costs)
|
add_industry(n, costs)
|
||||||
|
|
||||||
@ -2917,9 +2922,6 @@ if __name__ == "__main__":
|
|||||||
if options['dac']:
|
if options['dac']:
|
||||||
add_dac(n, costs)
|
add_dac(n, costs)
|
||||||
|
|
||||||
if options['ammonia']:
|
|
||||||
add_ammonia(n, costs)
|
|
||||||
|
|
||||||
if "decentral" in opts:
|
if "decentral" in opts:
|
||||||
decentral(n)
|
decentral(n)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user