diff --git a/CITATION.cff b/CITATION.cff index 712a02f3..c80b73ef 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -6,7 +6,7 @@ cff-version: 1.1.0 message: "If you use this package, please cite it in the following way." title: "PyPSA-Eur: An open sector-coupled optimisation model of the European energy system" repository: https://github.com/pypsa/pypsa-eur -version: 0.8.0 +version: 0.8.1 license: MIT authors: - family-names: Brown diff --git a/README.md b/README.md index 79cdfa65..9691abc4 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ SPDX-License-Identifier: CC-BY-4.0 ![Size](https://img.shields.io/github/repo-size/pypsa/pypsa-eur) [![Zenodo PyPSA-Eur](https://zenodo.org/badge/DOI/10.5281/zenodo.3520874.svg)](https://doi.org/10.5281/zenodo.3520874) [![Zenodo PyPSA-Eur-Sec](https://zenodo.org/badge/DOI/10.5281/zenodo.3938042.svg)](https://doi.org/10.5281/zenodo.3938042) -[![Snakemake](https://img.shields.io/badge/snakemake-≥5.0.0-brightgreen.svg?style=flat)](https://snakemake.readthedocs.io) +[![Snakemake](https://img.shields.io/badge/snakemake-≥7.7.0-brightgreen.svg?style=flat)](https://snakemake.readthedocs.io) [![REUSE status](https://api.reuse.software/badge/github.com/pypsa/pypsa-eur)](https://api.reuse.software/info/github.com/pypsa/pypsa-eur) [![Stack Exchange questions](https://img.shields.io/stackexchange/stackoverflow/t/pypsa)](https://stackoverflow.com/questions/tagged/pypsa) @@ -35,17 +35,18 @@ The model is designed to be imported into the open toolbox [PyPSA](https://github.com/PyPSA/PyPSA). **WARNING**: PyPSA-Eur is under active development and has several -[limitations](https://pypsa-eur.readthedocs.io/en/latest/limitations.html) -which you should understand before using the model. The github repository +[limitations](https://pypsa-eur.readthedocs.io/en/latest/limitations.html) which +you should understand before using the model. The github repository [issues](https://github.com/PyPSA/pypsa-eur/issues) collect known topics we are working on (please feel free to help or make suggestions). The [documentation](https://pypsa-eur.readthedocs.io/) remains somewhat patchy. You -can find showcases of the model's capabilities in the preprint [Benefits of a -Hydrogen Network in Europe](https://arxiv.org/abs/2207.05816), a [paper in Joule -with a description of the industry sector](https://arxiv.org/abs/2109.09563), or -in [a 2021 presentation at EMP-E](https://nworbmot.org/energy/brown-empe.pdf). -We cannot support this model if you choose to use it. We do not recommend to use -the full resolution network model for simulations. At high granularity the +can find showcases of the model's capabilities in the Joule paper [The potential +role of a hydrogen network in +Europe](https://doi.org/10.1016/j.joule.2023.06.016), another [paper in Joule +with a description of the industry +sector](https://doi.org/10.1016/j.joule.2022.04.016), or in [a 2021 presentation +at EMP-E](https://nworbmot.org/energy/brown-empe.pdf). We do not recommend to +use the full resolution network model for simulations. At high granularity the assignment of loads and generators to the nearest network node may not be a correct assumption, depending on the topology of the underlying distribution grid, and local grid bottlenecks may cause unrealistic load-shedding or diff --git a/config/config.default.yaml b/config/config.default.yaml index bd67caef..402a0918 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: CC0-1.0 # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#top-level-configuration -version: 0.8.0 +version: 0.8.1 tutorial: false logging: @@ -238,6 +238,12 @@ lines: max_extension: .inf length_factor: 1.25 under_construction: 'zero' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity + dynamic_line_rating: + activate: false + cutout: europe-2013-era5 + correction_factor: 0.95 + max_voltage_difference: false + max_line_rating: false # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#links links: diff --git a/config/test/config.electricity.yaml b/config/test/config.electricity.yaml index 6798e38c..b750bf62 100644 --- a/config/test/config.electricity.yaml +++ b/config/test/config.electricity.yaml @@ -60,6 +60,12 @@ renewable: clustering: exclude_carriers: ["OCGT", "offwind-ac", "coal"] +lines: + dynamic_line_rating: + activate: true + cutout: be-03-2013-era5 + max_line_rating: 1.3 + solving: solver: diff --git a/data/costs.csv b/data/costs.csv deleted file mode 100644 index 8953eb8a..00000000 --- a/data/costs.csv +++ /dev/null @@ -1,195 +0,0 @@ -technology,year,parameter,value,unit,source -solar-rooftop,2030,discount rate,0.04,per unit,standard for decentral -onwind,2030,lifetime,30,years,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind,2030,lifetime,30,years,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -solar,2030,lifetime,25,years,IEA2010 -solar-rooftop,2030,lifetime,25,years,IEA2010 -solar-utility,2030,lifetime,25,years,IEA2010 -PHS,2030,lifetime,80,years,IEA2010 -hydro,2030,lifetime,80,years,IEA2010 -ror,2030,lifetime,80,years,IEA2010 -OCGT,2030,lifetime,30,years,IEA2010 -nuclear,2030,lifetime,45,years,ECF2010 in DIW DataDoc http://hdl.handle.net/10419/80348 -CCGT,2030,lifetime,30,years,IEA2010 -coal,2030,lifetime,40,years,IEA2010 -lignite,2030,lifetime,40,years,IEA2010 -geothermal,2030,lifetime,40,years,IEA2010 -biomass,2030,lifetime,30,years,ECF2010 in DIW DataDoc http://hdl.handle.net/10419/80348 -oil,2030,lifetime,30,years,ECF2010 in DIW DataDoc http://hdl.handle.net/10419/80348 -onwind,2030,investment,1040,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind,2030,investment,1640,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind-ac-station,2030,investment,250,EUR/kWel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind-ac-connection-submarine,2030,investment,2685,EUR/MW/km,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind-ac-connection-underground,2030,investment,1342,EUR/MW/km,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind-dc-station,2030,investment,400,EUR/kWel,Haertel 2017; assuming one onshore and one offshore node + 13% learning reduction -offwind-dc-connection-submarine,2030,investment,2000,EUR/MW/km,DTU report based on Fig 34 of https://ec.europa.eu/energy/sites/ener/files/documents/2014_nsog_report.pdf -offwind-dc-connection-underground,2030,investment,1000,EUR/MW/km,Haertel 2017; average + 13% learning reduction -solar,2030,investment,600,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -biomass,2030,investment,2209,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -geothermal,2030,investment,3392,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -coal,2030,investment,1300,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC) -lignite,2030,investment,1500,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -solar-rooftop,2030,investment,725,EUR/kWel,ETIP PV -solar-utility,2030,investment,425,EUR/kWel,ETIP PV -PHS,2030,investment,2000,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -hydro,2030,investment,2000,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -ror,2030,investment,3000,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -OCGT,2030,investment,400,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -nuclear,2030,investment,6000,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -CCGT,2030,investment,800,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -oil,2030,investment,400,EUR/kWel,DIW DataDoc http://hdl.handle.net/10419/80348 -onwind,2030,FOM,2.450549,%/year,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind,2030,FOM,2.304878,%/year,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -solar,2030,FOM,4.166667,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -solar-rooftop,2030,FOM,2,%/year,ETIP PV -solar-utility,2030,FOM,3,%/year,ETIP PV -biomass,2030,FOM,4.526935,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -geothermal,2030,FOM,2.358491,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -coal,2030,FOM,1.923076,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC) -lignite,2030,FOM,2.0,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC) -oil,2030,FOM,1.5,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -PHS,2030,FOM,1,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -hydro,2030,FOM,1,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -ror,2030,FOM,2,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -CCGT,2030,FOM,2.5,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -OCGT,2030,FOM,3.75,%/year,DIW DataDoc http://hdl.handle.net/10419/80348 -onwind,2030,VOM,2.3,EUR/MWhel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -offwind,2030,VOM,2.7,EUR/MWhel,DEA https://ens.dk/en/our-services/projections-and-models/technology-data -solar,2030,VOM,0.01,EUR/MWhel,RES costs made up to fix curtailment order -coal,2030,VOM,6,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC) -lignite,2030,VOM,7,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 -CCGT,2030,VOM,4,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 -OCGT,2030,VOM,3,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 -nuclear,2030,VOM,8,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 -gas,2030,fuel,21.6,EUR/MWhth,IEA2011b -uranium,2030,fuel,3,EUR/MWhth,DIW DataDoc http://hdl.handle.net/10419/80348 -oil,2030,VOM,3,EUR/MWhel,DIW DataDoc http://hdl.handle.net/10419/80348 -nuclear,2030,fuel,3,EUR/MWhth,IEA2011b -biomass,2030,fuel,7,EUR/MWhth,IEA2011b -coal,2030,fuel,8.4,EUR/MWhth,IEA2011b -lignite,2030,fuel,2.9,EUR/MWhth,IEA2011b -oil,2030,fuel,50,EUR/MWhth,IEA WEM2017 97USD/boe = http://www.iea.org/media/weowebsite/2017/WEM_Documentation_WEO2017.pdf -PHS,2030,efficiency,0.75,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -hydro,2030,efficiency,0.9,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -ror,2030,efficiency,0.9,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -OCGT,2030,efficiency,0.39,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -CCGT,2030,efficiency,0.5,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -biomass,2030,efficiency,0.468,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -geothermal,2030,efficiency,0.239,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -nuclear,2030,efficiency,0.337,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -gas,2030,CO2 intensity,0.187,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -coal,2030,efficiency,0.464,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 PC (Advanced/SuperC) -lignite,2030,efficiency,0.447,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 -oil,2030,efficiency,0.393,per unit,DIW DataDoc http://hdl.handle.net/10419/80348 CT -coal,2030,CO2 intensity,0.354,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -lignite,2030,CO2 intensity,0.334,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -oil,2030,CO2 intensity,0.248,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -geothermal,2030,CO2 intensity,0.026,tCO2/MWth,https://www.eia.gov/environment/emissions/co2_vol_mass.php -electrolysis,2030,investment,350,EUR/kWel,Palzer Thesis -electrolysis,2030,FOM,4,%/year,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 -electrolysis,2030,lifetime,18,years,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 -electrolysis,2030,efficiency,0.8,per unit,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 -fuel cell,2030,investment,339,EUR/kWel,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 -fuel cell,2030,FOM,3,%/year,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 -fuel cell,2030,lifetime,20,years,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 -fuel cell,2030,efficiency,0.58,per unit,NREL http://www.nrel.gov/docs/fy09osti/45873.pdf; budischak2013 conservative 2020 -hydrogen storage,2030,investment,11.2,USD/kWh,budischak2013 -hydrogen storage,2030,lifetime,20,years,budischak2013 -hydrogen underground storage,2030,investment,0.5,EUR/kWh,maximum from https://www.nrel.gov/docs/fy10osti/46719.pdf -hydrogen underground storage,2030,lifetime,40,years,http://www.acatech.de/fileadmin/user_upload/Baumstruktur_nach_Website/Acatech/root/de/Publikationen/Materialien/ESYS_Technologiesteckbrief_Energiespeicher.pdf -H2 pipeline,2030,investment,267,EUR/MW/km,Welder et al https://doi.org/10.1016/j.ijhydene.2018.12.156 -H2 pipeline,2030,lifetime,40,years,Krieg2012 http://juser.fz-juelich.de/record/136392/files/Energie%26Umwelt_144.pdf -H2 pipeline,2030,FOM,5,%/year,Krieg2012 http://juser.fz-juelich.de/record/136392/files/Energie%26Umwelt_144.pdf -H2 pipeline,2030,efficiency,0.98,per unit,Krieg2012 http://juser.fz-juelich.de/record/136392/files/Energie%26Umwelt_144.pdf -methanation,2030,investment,1000,EUR/kWH2,Schaber thesis -methanation,2030,lifetime,25,years,Schaber thesis -methanation,2030,FOM,3,%/year,Schaber thesis -methanation,2030,efficiency,0.6,per unit,Palzer; Breyer for DAC -helmeth,2030,investment,1000,EUR/kW,no source -helmeth,2030,lifetime,25,years,no source -helmeth,2030,FOM,3,%/year,no source -helmeth,2030,efficiency,0.8,per unit,HELMETH press release -DAC,2030,investment,250,EUR/(tCO2/a),Fasihi/Climeworks -DAC,2030,lifetime,30,years,Fasihi -DAC,2030,FOM,4,%/year,Fasihi -battery inverter,2030,investment,411,USD/kWel,budischak2013 -battery inverter,2030,lifetime,20,years,budischak2013 -battery inverter,2030,efficiency,0.9,per unit charge/discharge,budischak2013; Lund and Kempton (2008) http://dx.doi.org/10.1016/j.enpol.2008.06.007 -battery inverter,2030,FOM,3,%/year,budischak2013 -battery storage,2030,investment,192,USD/kWh,budischak2013 -battery storage,2030,lifetime,15,years,budischak2013 -decentral air-sourced heat pump,2030,investment,1050,EUR/kWth,HP; Palzer thesis -decentral air-sourced heat pump,2030,lifetime,20,years,HP; Palzer thesis -decentral air-sourced heat pump,2030,FOM,3.5,%/year,Palzer thesis -decentral air-sourced heat pump,2030,efficiency,3,per unit,default for costs -decentral air-sourced heat pump,2030,discount rate,0.04,per unit,Palzer thesis -decentral ground-sourced heat pump,2030,investment,1400,EUR/kWth,Palzer thesis -decentral ground-sourced heat pump,2030,lifetime,20,years,Palzer thesis -decentral ground-sourced heat pump,2030,FOM,3.5,%/year,Palzer thesis -decentral ground-sourced heat pump,2030,efficiency,4,per unit,default for costs -decentral ground-sourced heat pump,2030,discount rate,0.04,per unit,Palzer thesis -central air-sourced heat pump,2030,investment,700,EUR/kWth,Palzer thesis -central air-sourced heat pump,2030,lifetime,20,years,Palzer thesis -central air-sourced heat pump,2030,FOM,3.5,%/year,Palzer thesis -central air-sourced heat pump,2030,efficiency,3,per unit,default for costs -retrofitting I,2030,discount rate,0.04,per unit,Palzer thesis -retrofitting I,2030,lifetime,50,years,Palzer thesis -retrofitting I,2030,FOM,1,%/year,Palzer thesis -retrofitting I,2030,investment,50,EUR/m2/fraction reduction,Palzer thesis -retrofitting II,2030,discount rate,0.04,per unit,Palzer thesis -retrofitting II,2030,lifetime,50,years,Palzer thesis -retrofitting II,2030,FOM,1,%/year,Palzer thesis -retrofitting II,2030,investment,250,EUR/m2/fraction reduction,Palzer thesis -water tank charger,2030,efficiency,0.9,per unit,HP -water tank discharger,2030,efficiency,0.9,per unit,HP -decentral water tank storage,2030,investment,860,EUR/m3,IWES Interaktion -decentral water tank storage,2030,FOM,1,%/year,HP -decentral water tank storage,2030,lifetime,20,years,HP -decentral water tank storage,2030,discount rate,0.04,per unit,Palzer thesis -central water tank storage,2030,investment,30,EUR/m3,IWES Interaktion -central water tank storage,2030,FOM,1,%/year,HP -central water tank storage,2030,lifetime,40,years,HP -decentral resistive heater,2030,investment,100,EUR/kWhth,Schaber thesis -decentral resistive heater,2030,lifetime,20,years,Schaber thesis -decentral resistive heater,2030,FOM,2,%/year,Schaber thesis -decentral resistive heater,2030,efficiency,0.9,per unit,Schaber thesis -decentral resistive heater,2030,discount rate,0.04,per unit,Palzer thesis -central resistive heater,2030,investment,100,EUR/kWhth,Schaber thesis -central resistive heater,2030,lifetime,20,years,Schaber thesis -central resistive heater,2030,FOM,2,%/year,Schaber thesis -central resistive heater,2030,efficiency,0.9,per unit,Schaber thesis -decentral gas boiler,2030,investment,175,EUR/kWhth,Palzer thesis -decentral gas boiler,2030,lifetime,20,years,Palzer thesis -decentral gas boiler,2030,FOM,2,%/year,Palzer thesis -decentral gas boiler,2030,efficiency,0.9,per unit,Palzer thesis -decentral gas boiler,2030,discount rate,0.04,per unit,Palzer thesis -central gas boiler,2030,investment,63,EUR/kWhth,Palzer thesis -central gas boiler,2030,lifetime,22,years,Palzer thesis -central gas boiler,2030,FOM,1,%/year,Palzer thesis -central gas boiler,2030,efficiency,0.9,per unit,Palzer thesis -decentral CHP,2030,lifetime,25,years,HP -decentral CHP,2030,investment,1400,EUR/kWel,HP -decentral CHP,2030,FOM,3,%/year,HP -decentral CHP,2030,discount rate,0.04,per unit,Palzer thesis -central CHP,2030,lifetime,25,years,HP -central CHP,2030,investment,650,EUR/kWel,HP -central CHP,2030,FOM,3,%/year,HP -decentral solar thermal,2030,discount rate,0.04,per unit,Palzer thesis -decentral solar thermal,2030,FOM,1.3,%/year,HP -decentral solar thermal,2030,investment,270000,EUR/1000m2,HP -decentral solar thermal,2030,lifetime,20,years,HP -central solar thermal,2030,FOM,1.4,%/year,HP -central solar thermal,2030,investment,140000,EUR/1000m2,HP -central solar thermal,2030,lifetime,20,years,HP -HVAC overhead,2030,investment,400,EUR/MW/km,Hagspiel -HVAC overhead,2030,lifetime,40,years,Hagspiel -HVAC overhead,2030,FOM,2,%/year,Hagspiel -HVDC overhead,2030,investment,400,EUR/MW/km,Hagspiel -HVDC overhead,2030,lifetime,40,years,Hagspiel -HVDC overhead,2030,FOM,2,%/year,Hagspiel -HVDC submarine,2030,investment,2000,EUR/MW/km,DTU report based on Fig 34 of https://ec.europa.eu/energy/sites/ener/files/documents/2014_nsog_report.pdf -HVDC submarine,2030,lifetime,40,years,Hagspiel -HVDC submarine,2030,FOM,2,%/year,Hagspiel -HVDC inverter pair,2030,investment,150000,EUR/MW,Hagspiel -HVDC inverter pair,2030,lifetime,40,years,Hagspiel -HVDC inverter pair,2030,FOM,2,%/year,Hagspiel diff --git a/doc/conf.py b/doc/conf.py index 8111c86c..1ddae466 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -82,7 +82,7 @@ author = "Tom Brown (KIT, TUB, FIAS), Jonas Hoersch (KIT, FIAS), Fabian Hofmann # The short X.Y version. version = "0.8" # The full version, including alpha/beta/rc tags. -release = "0.8.0" +release = "0.8.1" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/doc/configtables/lines.csv b/doc/configtables/lines.csv index ad5dd690..ec9ec007 100644 --- a/doc/configtables/lines.csv +++ b/doc/configtables/lines.csv @@ -5,3 +5,9 @@ s_nom_max,MW,"float","Global upper limit for the maximum capacity of each extend max_extension,MW,"float","Upper limit for the extended capacity of each extendable line." length_factor,--,float,"Correction factor to account for the fact that buses are *not* connected by lines through air-line distance." under_construction,--,"One of {'zero': set capacity to zero, 'remove': remove completely, 'keep': keep with full capacity}","Specifies how to handle lines which are currently under construction." +dynamic_line_rating,,, +-- activate,bool,"true or false","Whether to take dynamic line rating into account" +-- cutout,--,"Should be a folder listed in the configuration ``atlite: cutouts:`` (e.g. 'europe-2013-era5') or reference an existing folder in the directory ``cutouts``. Source module must be ERA5.","Specifies the directory where the relevant weather data ist stored." +-- correction_factor,--,"float","Factor to compensate for overestimation of wind speeds in hourly averaged wind data" +-- max_voltage_difference,deg,"float","Maximum voltage angle difference in degrees or 'false' to disable" +-- max_line_rating,--,"float","Maximum line rating relative to nominal capacity without DLR, e.g. 1.3 or 'false' to disable" diff --git a/doc/index.rst b/doc/index.rst index d702a42c..c5d92e87 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -78,10 +78,10 @@ them: .. note:: You can find showcases of the model's capabilities in the Supplementary Materials of the - preprint `Benefits of a Hydrogen Network in Europe - `_, the Supplementary Materials of the `paper in Joule with a + Joule paper `The potential role of a hydrogen network in Europe + `_, the Supplementary Materials of another `paper in Joule with a description of the industry sector - `_, or in `a 2021 presentation + `_, or in `a 2021 presentation at EMP-E `_. The sector-coupled extension of PyPSA-Eur was initially described in the paper `Synergies of sector coupling and transmission @@ -179,10 +179,13 @@ For sector-coupling studies: :: @misc{PyPSAEurSec, author = "Fabian Neumann and Elisabeth Zeyen and Marta Victoria and Tom Brown", - title = "The Potential Role of a Hydrogen Network in Europe", - year = "2022", + title = "The potential role of a hydrogen network in Europe", + journal "Joule", + volume = "7", + pages = "1--25" + year = "2023", eprint = "2207.05816", - url = "https://arxiv.org/abs/2207.05816", + doi = "10.1016/j.joule.2022.04.016", } For sector-coupling studies with pathway optimisation: :: diff --git a/doc/release_notes.rst b/doc/release_notes.rst index fd23e888..70a73e2f 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,43 +10,129 @@ Release Notes Upcoming Release ================ -* ``param:`` section in rule definition are added to track changed settings in ``config.yaml``. The goal is to automatically re-execute rules whose parameters have changed. See `Non-file parameters for rules `_ in the snakemake documentation. +* Updated Global Energy Monitor LNG terminal data to March 2023 version. -* **Important:** The configuration files are now located in the ``config`` directory. This counts for ``config.default.yaml``, ``config.yaml`` as well as the test configuration files which are now located in ``config/test``. Config files that are still in the root directory will be ignored. +PyPSA-Eur 0.8.1 (27th July 2023) +================================ -* Bugfix: Correct typo in the CPLEX solver configuration in ``config.default.yaml``. +**New Features** -* Bugfix: Error in ``add_electricity`` where carriers were added multiple times to the network, resulting in a non-unique carriers error. +* Add option to consider dynamic line rating based on wind speeds and + temperature according to `Glaum and Hofmann (2022) + `_. See configuration section ``lines: + dynamic_line_rating:`` for more details. (https://github.com/PyPSA/pypsa-eur/pull/675) -* Renamed script file from PyPSA-EUR ``build_load_data`` to ``build_electricity_demand`` and ``retrieve_load_data`` to ``retrieve_electricity_demand``. - -* Fix docs readthedocs built +* Add option to include a piecewise linear approximation of transmission losses, + e.g. by setting ``solving: options: transmission_losses: 2`` for an + approximation with two tangents. (https://github.com/PyPSA/pypsa-eur/pull/664) * Add plain hydrogen turbine as additional re-electrification option besides hydrogen fuel cell. Add switches for both re-electrification options under ``sector: hydrogen_turbine:`` and ``sector: hydrogen_fuel_cell:``. - -* A new function named ``sanitize_carrier`` ensures that all unique carrier names are present in the network's carriers attribute, and adds nice names and colors for each carrier according to the provided configuration dictionary. - -* Additional tech_color are added to include previously unlisted carriers. - -* Remove ``vresutils`` dependency. + (https://github.com/PyPSA/pypsa-eur/pull/647) * Added configuration option ``lines: max_extension:`` and ``links: max_extension:``` to control the maximum capacity addition per line or link in - MW. + MW. (https://github.com/PyPSA/pypsa-eur/pull/665) -* Add option to include a piecewise linear approximation of transmission losses, - e.g. by setting ``solving: options: transmission_losses: 2`` for an - approximation with two tangents. +* A ``param:`` section in the snakemake rule definitions was added to track + changed settings in ``config.yaml``. The goal is to automatically re-execute + rules where parameters have changed. See `Non-file parameters for rules + `_ + in the snakemake documentation. (https://github.com/PyPSA/pypsa-eur/pull/663) + +* A new function named ``sanitize_carrier`` ensures that all unique carrier + names are present in the network's carriers attribute, and adds nice names and + colors for each carrier according to the provided configuration dictionary. + (https://github.com/PyPSA/pypsa-eur/pull/653, + https://github.com/PyPSA/pypsa-eur/pull/690) + +* The configuration settings have been documented in more detail. + (https://github.com/PyPSA/pypsa-eur/pull/685) + +**Breaking Changes** + +* The configuration files are now located in the ``config`` directory. This + includes the ``config.default.yaml``, ``config.yaml`` as well as the test + configuration files which are now located in the ``config/test`` directory. + Config files that are still in the root directory will be ignored. + (https://github.com/PyPSA/pypsa-eur/pull/640) + +* Renamed script and rule name from ``build_load_data`` to + ``build_electricity_demand`` and ``retrieve_load_data`` to + ``retrieve_electricity_demand``. (https://github.com/PyPSA/pypsa-eur/pull/642, + https://github.com/PyPSA/pypsa-eur/pull/652) + +* Updated to new spatial clustering module introduced in PyPSA v0.25. + (https://github.com/PyPSA/pypsa-eur/pull/696) + +**Changes** * Handling networks with links with multiple inputs/outputs no longer requires to override component attributes. + (https://github.com/PyPSA/pypsa-eur/pull/695) * Added configuration option ``enable: retrieve:`` to control whether data retrieval rules from snakemake are enabled or not. Th default setting ``auto`` - will automatically detect and enable/disable the rules based on internet connectivity. + will automatically detect and enable/disable the rules based on internet + connectivity. (https://github.com/PyPSA/pypsa-eur/pull/694) +* Update to ``technology-data`` v0.6.0. + (https://github.com/PyPSA/pypsa-eur/pull/704) + +* Handle data bundle extraction paths via ``snakemake.output``. + +* Additional technologies are added to ``tech_color`` in the configuration files + to include previously unlisted carriers. + +* Doc: Added note that Windows is only tested in CI with WSL. + (https://github.com/PyPSA/pypsa-eur/issues/697) + +* Doc: Add support section. (https://github.com/PyPSA/pypsa-eur/pull/656) + +* Open ``rasterio`` files with ``rioxarray``. + (https://github.com/PyPSA/pypsa-eur/pull/474) + +* Migrate CI to ``micromamba``. (https://github.com/PyPSA/pypsa-eur/pull/700) + +**Bugs and Compatibility** + +* The new minimum PyPSA version is v0.25.1. + +* Removed ``vresutils`` dependency. + (https://github.com/PyPSA/pypsa-eur/pull/662) + +* Adapt to new ``powerplantmatching`` version. + (https://github.com/PyPSA/pypsa-eur/pull/687, + https://github.com/PyPSA/pypsa-eur/pull/701) + +* Bugfix: Correct typo in the CPLEX solver configuration in + ``config.default.yaml``. (https://github.com/PyPSA/pypsa-eur/pull/630) + +* Bugfix: Error in ``add_electricity`` where carriers were added multiple times + to the network, resulting in a non-unique carriers error. + +* Bugfix of optional reserve constraint. + (https://github.com/PyPSA/pypsa-eur/pull/645) + +* Fix broken equity constraints logic. + (https://github.com/PyPSA/pypsa-eur/pull/679) + +* Fix addition of load shedding generators. + (https://github.com/PyPSA/pypsa-eur/pull/649) + +* Fix automatic building of documentation on readthedocs.org. + (https://github.com/PyPSA/pypsa-eur/pull/658) + +* Bugfix: Update network clustering to avoid adding deleted links in clustered + network. (https://github.com/PyPSA/pypsa-eur/pull/678) + +* Address ``geopandas`` deprecations. + (https://github.com/PyPSA/pypsa-eur/pull/678) + +* Fix bug with underground hydrogen storage creation, where for some small model + regions no cavern storage is available. + (https://github.com/PyPSA/pypsa-eur/pull/672) PyPSA-Eur 0.8.0 (18th March 2023) diff --git a/envs/environment.fixed.yaml b/envs/environment.fixed.yaml index 1ff9313d..ca2ae848 100644 --- a/envs/environment.fixed.yaml +++ b/envs/environment.fixed.yaml @@ -12,74 +12,93 @@ dependencies: - _libgcc_mutex=0.1 - _openmp_mutex=4.5 - affine=2.4.0 -- alsa-lib=1.2.8 +- alsa-lib=1.2.9 - ampl-mp=3.1.0 -- amply=0.1.5 +- amply=0.1.6 +- anyio=3.7.1 - appdirs=1.4.4 +- argon2-cffi=21.3.0 +- argon2-cffi-bindings=21.2.0 - asttokens=2.2.1 -- atlite=0.2.10 +- async-lru=2.0.3 +- atk-1.0=2.38.0 +- atlite=0.2.11 - attr=2.5.1 -- attrs=22.2.0 +- attrs=23.1.0 +- aws-c-auth=0.7.0 +- aws-c-cal=0.6.0 +- aws-c-common=0.8.23 +- aws-c-compression=0.2.17 +- aws-c-event-stream=0.3.1 +- aws-c-http=0.7.11 +- aws-c-io=0.13.28 +- aws-c-mqtt=0.8.14 +- aws-c-s3=0.3.13 +- aws-c-sdkutils=0.1.11 +- aws-checksums=0.1.16 +- aws-crt-cpp=0.20.3 +- aws-sdk-cpp=1.10.57 +- babel=2.12.1 - backcall=0.2.0 - backports=1.0 -- backports.functools_lru_cache=1.6.4 -- beautifulsoup4=4.11.2 -- blosc=1.21.3 -- bokeh=2.4.3 +- backports.functools_lru_cache=1.6.5 +- beautifulsoup4=4.12.2 +- bleach=6.0.0 +- blosc=1.21.4 +- bokeh=3.2.1 - boost-cpp=1.78.0 -- bottleneck=1.3.6 +- bottleneck=1.3.7 - branca=0.6.0 - brotli=1.0.9 - brotli-bin=1.0.9 -- brotlipy=0.7.0 +- brotli-python=1.0.9 - bzip2=1.0.8 -- c-ares=1.18.1 -- ca-certificates=2022.12.7 +- c-ares=1.19.1 +- c-blosc2=2.10.0 +- ca-certificates=2023.7.22 - cairo=1.16.0 - cartopy=0.21.1 -- cdsapi=0.5.1 -- certifi=2022.12.7 +- cdsapi=0.6.1 +- certifi=2023.7.22 - cffi=1.15.1 - cfitsio=4.2.0 - cftime=1.6.2 -- charset-normalizer=2.1.1 -- click=8.1.3 +- charset-normalizer=3.2.0 +- click=8.1.6 - click-plugins=1.1.1 - cligj=0.7.2 - cloudpickle=2.2.1 -- coin-or-cbc=2.10.8 -- coin-or-cgl=0.60.6 -- coin-or-clp=1.17.7 -- coin-or-osi=0.108.7 -- coin-or-utils=2.11.6 -- coincbc=2.10.8 - colorama=0.4.6 -- configargparse=1.5.3 +- comm=0.1.3 +- configargparse=1.7 - connection_pool=0.0.3 -- country_converter=0.8.0 -- cryptography=39.0.1 -- curl=7.88.0 +- contourpy=1.1.0 +- country_converter=1.0.0 +- curl=8.2.0 - cycler=0.11.0 -- cytoolz=0.12.0 -- dask=2023.2.0 -- dask-core=2023.2.0 +- cytoolz=0.12.2 +- dask=2023.7.1 +- dask-core=2023.7.1 - datrie=0.8.2 - dbus=1.13.6 +- debugpy=1.6.7 - decorator=5.1.1 +- defusedxml=0.7.1 - deprecation=2.1.0 - descartes=1.1.0 -- distributed=2023.2.0 +- distributed=2023.7.1 - distro=1.8.0 -- docutils=0.19 -- dpath=2.1.4 -- entsoe-py=0.5.8 +- docutils=0.20.1 +- dpath=2.1.6 +- entrypoints=0.4 +- entsoe-py=0.5.10 - et_xmlfile=1.1.0 -- exceptiongroup=1.1.0 +- exceptiongroup=1.1.2 - executing=1.2.0 - expat=2.5.0 -- fftw=3.3.10 -- filelock=3.9.0 -- fiona=1.9.1 +- filelock=3.12.2 +- fiona=1.9.4 +- flit-core=3.9.0 - folium=0.14.0 - font-ttf-dejavu-sans-mono=2.37 - font-ttf-inconsolata=3.000 @@ -88,293 +107,366 @@ dependencies: - fontconfig=2.14.2 - fonts-conda-ecosystem=1 - fonts-conda-forge=1 -- fonttools=4.38.0 +- fonttools=4.41.1 - freetype=2.12.1 - freexl=1.0.6 -- fsspec=2023.1.0 -- gdal=3.6.2 +- fribidi=1.0.10 +- fsspec=2023.6.0 +- gdal=3.7.0 +- gdk-pixbuf=2.42.10 - geographiclib=1.52 - geojson-rewind=1.0.2 -- geopandas=0.12.2 -- geopandas-base=0.12.2 +- geopandas=0.13.2 +- geopandas-base=0.13.2 - geopy=2.3.0 -- geos=3.11.1 +- geos=3.11.2 - geotiff=1.7.1 - gettext=0.21.1 +- gflags=2.2.2 - giflib=5.2.1 - gitdb=4.0.10 -- gitpython=3.1.30 -- glib=2.74.1 -- glib-tools=2.74.1 +- gitpython=3.1.32 +- glib=2.76.4 +- glib-tools=2.76.4 +- glog=0.6.0 +- gmp=6.2.1 - graphite2=1.3.13 -- gst-plugins-base=1.22.0 -- gstreamer=1.22.0 -- gstreamer-orc=0.4.33 -- harfbuzz=6.0.0 +- graphviz=8.1.0 +- gst-plugins-base=1.22.5 +- gstreamer=1.22.5 +- gtk2=2.24.33 +- gts=0.7.6 +- harfbuzz=7.3.0 - hdf4=4.2.15 -- hdf5=1.12.2 -- heapdict=1.0.1 +- hdf5=1.14.1 - humanfriendly=10.0 -- icu=70.1 +- icu=72.1 - idna=3.4 -- importlib-metadata=6.0.0 -- importlib_resources=5.10.2 +- importlib-metadata=6.8.0 +- importlib_metadata=6.8.0 +- importlib_resources=6.0.0 - iniconfig=2.0.0 -- ipopt=3.14.11 -- ipython=8.10.0 -- jack=1.9.22 +- ipopt=3.14.12 +- ipykernel=6.24.0 +- ipython=8.14.0 +- ipython_genutils=0.2.0 +- ipywidgets=8.0.7 - jedi=0.18.2 - jinja2=3.1.2 -- joblib=1.2.0 -- jpeg=9e +- joblib=1.3.0 - json-c=0.16 -- jsonschema=4.17.3 -- jupyter_core=5.2.0 -- kealib=1.5.0 +- json5=0.9.14 +- jsonschema=4.18.4 +- jsonschema-specifications=2023.7.1 +- jupyter=1.0.0 +- jupyter-lsp=2.2.0 +- jupyter_client=8.3.0 +- jupyter_console=6.6.3 +- jupyter_core=5.3.1 +- jupyter_events=0.6.3 +- jupyter_server=2.7.0 +- jupyter_server_terminals=0.4.4 +- jupyterlab=4.0.3 +- jupyterlab_pygments=0.2.2 +- jupyterlab_server=2.24.0 +- jupyterlab_widgets=3.0.8 +- kealib=1.5.1 - keyutils=1.6.1 - kiwisolver=1.4.4 -- krb5=1.20.1 +- krb5=1.21.1 - lame=3.100 -- lcms2=2.14 +- lcms2=2.15 - ld_impl_linux-64=2.40 - lerc=4.0.0 +- libabseil=20230125.3 - libaec=1.0.6 +- libarchive=3.6.2 +- libarrow=12.0.1 - libblas=3.9.0 - libbrotlicommon=1.0.9 - libbrotlidec=1.0.9 - libbrotlienc=1.0.9 -- libcap=2.66 +- libcap=2.67 - libcblas=3.9.0 - libclang=15.0.7 - libclang13=15.0.7 +- libcrc32c=1.1.2 - libcups=2.3.3 -- libcurl=7.88.0 -- libdb=6.2.32 -- libdeflate=1.17 +- libcurl=8.2.0 +- libdeflate=1.18 - libedit=3.1.20191231 - libev=4.33 -- libevent=2.1.10 +- libevent=2.1.12 +- libexpat=2.5.0 - libffi=3.4.2 -- libflac=1.4.2 -- libgcc-ng=12.2.0 +- libflac=1.4.3 +- libgcc-ng=13.1.0 - libgcrypt=1.10.1 -- libgdal=3.6.2 -- libgfortran-ng=12.2.0 -- libgfortran5=12.2.0 -- libglib=2.74.1 -- libgomp=12.2.0 -- libgpg-error=1.46 +- libgd=2.3.3 +- libgdal=3.7.0 +- libgfortran-ng=13.1.0 +- libgfortran5=13.1.0 +- libglib=2.76.4 +- libgomp=13.1.0 +- libgoogle-cloud=2.12.0 +- libgpg-error=1.47 +- libgrpc=1.56.2 - libiconv=1.17 +- libjpeg-turbo=2.1.5.1 - libkml=1.3.0 - liblapack=3.9.0 - liblapacke=3.9.0 - libllvm15=15.0.7 -- libnetcdf=4.8.1 -- libnghttp2=1.51.0 +- libnetcdf=4.9.2 +- libnghttp2=1.52.0 - libnsl=2.0.0 +- libnuma=2.0.16 - libogg=1.3.4 -- libopenblas=0.3.21 +- libopenblas=0.3.23 - libopus=1.3.1 - libpng=1.6.39 -- libpq=15.2 +- libpq=15.3 +- libprotobuf=4.23.3 +- librsvg=2.56.1 - librttopo=1.1.0 - libsndfile=1.2.0 +- libsodium=1.0.18 - libspatialindex=1.9.3 - libspatialite=5.0.1 -- libsqlite=3.40.0 -- libssh2=1.10.0 -- libstdcxx-ng=12.2.0 -- libsystemd0=252 -- libtiff=4.5.0 +- libsqlite=3.42.0 +- libssh2=1.11.0 +- libstdcxx-ng=13.1.0 +- libsystemd0=253 +- libthrift=0.18.1 +- libtiff=4.5.1 - libtool=2.4.7 -- libudev1=252 -- libuuid=2.32.1 +- libutf8proc=2.8.0 +- libuuid=2.38.1 - libvorbis=1.3.7 -- libwebp-base=1.2.4 -- libxcb=1.13 +- libwebp=1.3.1 +- libwebp-base=1.3.1 +- libxcb=1.15 - libxkbcommon=1.5.0 -- libxml2=2.10.3 +- libxml2=2.11.4 - libxslt=1.1.37 - libzip=1.9.2 - libzlib=1.2.13 -- linopy=0.1.3 - locket=1.0.0 -- lxml=4.9.2 +- lxml=4.9.3 - lz4=4.3.2 - lz4-c=1.9.4 - lzo=2.10 - mapclassify=2.5.0 -- markupsafe=2.1.2 +- markupsafe=2.1.3 - matplotlib=3.5.3 - matplotlib-base=3.5.3 - matplotlib-inline=0.1.6 - memory_profiler=0.61.0 -- metis=5.1.0 -- mpg123=1.31.2 -- msgpack-python=1.0.4 +- metis=5.1.1 +- mistune=3.0.0 +- mpg123=1.31.3 +- msgpack-python=1.0.5 - mumps-include=5.2.1 - mumps-seq=5.2.1 -- munch=2.5.0 +- munch=4.0.0 - munkres=1.1.4 -- mysql-common=8.0.32 -- mysql-libs=8.0.32 -- nbformat=5.7.3 -- ncurses=6.3 -- netcdf4=1.6.2 -- networkx=3.0 +- mysql-common=8.0.33 +- mysql-libs=8.0.33 +- nbclient=0.8.0 +- nbconvert=7.7.2 +- nbconvert-core=7.7.2 +- nbconvert-pandoc=7.7.2 +- nbformat=5.9.1 +- ncurses=6.4 +- nest-asyncio=1.5.6 +- netcdf4=1.6.4 +- networkx=3.1 - nomkl=1.0 +- notebook=7.0.0 +- notebook-shim=0.2.3 - nspr=4.35 -- nss=3.88 -- numexpr=2.8.3 -- numpy=1.24 +- nss=3.89 +- numexpr=2.8.4 +- numpy=1.25.1 - openjdk=17.0.3 - openjpeg=2.5.0 -- openpyxl=3.1.0 -- openssl=3.0.8 -- packaging=23.0 -- pandas=1.5.3 +- openpyxl=3.1.2 +- openssl=3.1.1 +- orc=1.9.0 +- overrides=7.3.1 +- packaging=23.1 +- pandas=2.0.3 +- pandoc=3.1.3 +- pandocfilters=1.5.0 +- pango=1.50.14 - parso=0.8.3 -- partd=1.3.0 +- partd=1.4.0 - patsy=0.5.3 - pcre2=10.40 - pexpect=4.8.0 - pickleshare=0.7.5 -- pillow=9.4.0 -- pip=23.0 +- pillow=10.0.0 +- pip=23.2.1 - pixman=0.40.0 - pkgutil-resolve-name=1.3.10 - plac=1.3.5 -- platformdirs=3.0.0 -- pluggy=1.0.0 +- platformdirs=3.9.1 +- pluggy=1.2.0 - ply=3.11 -- pooch=1.6.0 -- poppler=22.12.0 +- pooch=1.7.0 +- poppler=23.05.0 - poppler-data=0.4.12 -- postgresql=15.2 -- powerplantmatching=0.5.6 +- postgresql=15.3 +- powerplantmatching=0.5.7 - progressbar2=4.2.0 -- proj=9.1.0 -- prompt-toolkit=3.0.36 -- psutil=5.9.4 +- proj=9.2.1 +- prometheus_client=0.17.1 +- prompt-toolkit=3.0.39 +- prompt_toolkit=3.0.39 +- psutil=5.9.5 - pthread-stubs=0.4 - ptyprocess=0.7.0 - pulp=2.7.0 -- pulseaudio=16.1 +- pulseaudio-client=16.1 - pure_eval=0.2.2 +- py-cpuinfo=9.0.0 +- pyarrow=12.0.1 - pycountry=22.3.5 - pycparser=2.21 -- pygments=2.14.0 -- pyomo=6.4.4 -- pyopenssl=23.0.0 -- pyparsing=3.0.9 -- pyproj=3.4.1 -- pypsa=0.22.1 +- pygments=2.15.1 +- pyomo=6.6.1 +- pyparsing=3.1.0 +- pyproj=3.6.0 - pyqt=5.15.7 - pyqt5-sip=12.11.0 -- pyrsistent=0.19.3 - pyshp=2.3.1 - pysocks=1.7.1 -- pytables=3.7.0 -- pytest=7.2.1 -- python=3.10.9 +- pytables=3.8.0 +- pytest=7.4.0 +- python=3.10.12 - python-dateutil=2.8.2 -- python-fastjsonschema=2.16.2 -- python-utils=3.5.2 +- python-fastjsonschema=2.18.0 +- python-json-logger=2.0.7 +- python-tzdata=2023.3 +- python-utils=3.7.0 - python_abi=3.10 -- pytz=2022.7.1 +- pytz=2023.3 - pyxlsb=1.0.10 - pyyaml=6.0 +- pyzmq=25.1.0 - qt-main=5.15.8 -- rasterio=1.3.4 -- readline=8.1.2 -- requests=2.28.1 -- retry=0.9.2 -- rich=12.5.1 -- rioxarray=0.13.3 -- rtree=1.0.0 -- s2n=1.0.10 -- scikit-learn=1.1.1 -- scipy=1.8.1 +- qtconsole=5.4.3 +- qtconsole-base=5.4.3 +- qtpy=2.3.1 +- rasterio=1.3.8 +- rdma-core=28.9 +- re2=2023.03.02 +- readline=8.2 +- referencing=0.30.0 +- requests=2.31.0 +- reretry=0.11.8 +- rfc3339-validator=0.1.4 +- rfc3986-validator=0.1.1 +- rioxarray=0.14.1 +- rpds-py=0.9.2 +- rtree=1.0.1 +- s2n=1.3.46 +- scikit-learn=1.3.0 +- scipy=1.11.1 - scotch=6.0.9 - seaborn=0.12.2 - seaborn-base=0.12.2 -- setuptools=67.3.2 +- send2trash=1.8.2 +- setuptools=68.0.0 - setuptools-scm=7.1.0 - setuptools_scm=7.1.0 - shapely=2.0.1 -- sip=6.7.7 +- sip=6.7.10 - six=1.16.0 - smart_open=6.3.0 - smmap=3.0.5 -- snakemake-minimal=7.22.0 -- snappy=1.1.9 +- snakemake-minimal=7.30.2 +- snappy=1.1.10 +- sniffio=1.3.0 - snuggs=1.4.7 - sortedcontainers=2.4.0 - soupsieve=2.3.2.post1 -- sqlite=3.40.0 +- sqlite=3.42.0 - stack_data=0.6.2 -- statsmodels=0.13.5 +- statsmodels=0.14.0 - stopit=1.1.2 - tabula-py=2.6.0 - tabulate=0.9.0 - tblib=1.7.0 -- threadpoolctl=3.1.0 +- terminado=0.17.1 +- threadpoolctl=3.2.0 - throttler=1.2.1 - tiledb=2.13.2 +- tinycss2=1.2.1 - tk=8.6.12 - toml=0.10.2 - tomli=2.0.1 - toolz=0.12.0 -- toposort=1.9 -- tornado=6.2 -- tqdm=4.64.1 +- toposort=1.10 +- tornado=6.3.2 +- tqdm=4.65.0 - traitlets=5.9.0 -- typing-extensions=4.4.0 -- typing_extensions=4.4.0 -- tzcode=2022g -- tzdata=2022g +- typing-extensions=4.7.1 +- typing_extensions=4.7.1 +- typing_utils=0.1.0 +- tzcode=2023c +- tzdata=2023c +- ucx=1.14.1 - unicodedata2=15.0.0 - unidecode=1.3.6 - unixodbc=2.3.10 -- urllib3=1.26.14 +- urllib3=2.0.4 - wcwidth=0.2.6 -- wheel=0.38.4 -- wrapt=1.14.1 -- xarray=2023.2.0 +- webencodings=0.5.1 +- websocket-client=1.6.1 +- wheel=0.41.0 +- widgetsnbextension=4.0.8 +- wrapt=1.15.0 +- xarray=2023.7.0 - xcb-util=0.4.0 - xcb-util-image=0.4.0 - xcb-util-keysyms=0.4.0 - xcb-util-renderutil=0.3.9 - xcb-util-wm=0.4.1 - xerces-c=3.2.4 +- xkeyboard-config=2.39 - xlrd=2.0.1 - xorg-fixesproto=5.0 - xorg-inputproto=2.3.2 - xorg-kbproto=1.0.7 -- xorg-libice=1.0.10 -- xorg-libsm=1.2.3 -- xorg-libx11=1.7.2 -- xorg-libxau=1.0.9 +- xorg-libice=1.1.1 +- xorg-libsm=1.2.4 +- xorg-libx11=1.8.6 +- xorg-libxau=1.0.11 - xorg-libxdmcp=1.1.3 - xorg-libxext=1.3.4 - xorg-libxfixes=5.0.3 - xorg-libxi=1.7.10 -- xorg-libxrender=0.9.10 +- xorg-libxrender=0.9.11 - xorg-libxtst=1.2.3 - xorg-recordproto=1.14.2 - xorg-renderproto=0.11.1 - xorg-xextproto=7.3.0 +- xorg-xf86vidmodeproto=2.3.1 - xorg-xproto=7.0.31 -- xyzservices=2022.9.0 +- xyzservices=2023.7.0 - xz=5.2.6 - yaml=0.2.5 - yte=1.5.1 -- zict=2.2.0 -- zipp=3.13.0 +- zeromq=4.3.4 +- zict=3.0.0 +- zipp=3.16.2 - zlib=1.2.13 +- zlib-ng=2.0.7 - zstd=1.5.2 - pip: - - countrycode==0.2 - - highspy==1.5.0.dev0 - - pybind11==2.10.3 - - tsam==2.2.2 + - gurobipy==10.0.2 + - linopy==0.2.2 + - pypsa==0.25.1 + - tsam==2.3.0 + - validators==0.20.0 diff --git a/envs/environment.yaml b/envs/environment.yaml index b4883752..c3af36bb 100644 --- a/envs/environment.yaml +++ b/envs/environment.yaml @@ -53,6 +53,7 @@ dependencies: - descartes - rasterio!=1.2.10 + - pip: - tsam>=1.1.0 - - git+https://github.com/pypsa/pypsa.git + - pypsa>=0.25.1 diff --git a/rules/build_electricity.smk b/rules/build_electricity.smk index f3d11e34..bee4bd3c 100644 --- a/rules/build_electricity.smk +++ b/rules/build_electricity.smk @@ -295,6 +295,30 @@ rule build_hydro_profile: "../scripts/build_hydro_profile.py" +if config["lines"]["dynamic_line_rating"]["activate"]: + + rule build_line_rating: + input: + base_network=RESOURCES + "networks/base.nc", + cutout="cutouts/" + + CDIR + + config["lines"]["dynamic_line_rating"]["cutout"] + + ".nc", + output: + output=RESOURCES + "networks/line_rating.nc", + log: + LOGS + "build_line_rating.log", + benchmark: + BENCHMARKS + "build_line_rating" + threads: ATLITE_NPROCESSES + resources: + mem_mb=ATLITE_NPROCESSES * 1000, + conda: + "../envs/environment.yaml" + script: + "../scripts/build_line_rating.py" + + rule add_electricity: params: length_factor=config["lines"]["length_factor"], @@ -317,6 +341,9 @@ rule add_electricity: if str(fn).startswith("data/") }, base_network=RESOURCES + "networks/base.nc", + line_rating=RESOURCES + "networks/line_rating.nc" + if config["lines"]["dynamic_line_rating"]["activate"] + else RESOURCES + "networks/base.nc", tech_costs=COSTS, regions=RESOURCES + "regions_onshore.geojson", powerplants=RESOURCES + "powerplants.csv", diff --git a/rules/build_sector.smk b/rules/build_sector.smk index 86f8bab2..4fe561a8 100644 --- a/rules/build_sector.smk +++ b/rules/build_sector.smk @@ -86,7 +86,7 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: rule build_gas_input_locations: input: lng=HTTP.remote( - "https://globalenergymonitor.org/wp-content/uploads/2022/09/Europe-Gas-Tracker-August-2022.xlsx", + "https://globalenergymonitor.org/wp-content/uploads/2023/07/Europe-Gas-Tracker-2023-03-v3.xlsx", keep_local=True, ), entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson", diff --git a/scripts/add_electricity.py b/scripts/add_electricity.py index 9897556f..82e9fc94 100755 --- a/scripts/add_electricity.py +++ b/scripts/add_electricity.py @@ -782,6 +782,30 @@ def estimate_renewable_capacities(n, year, tech_map, expansion_limit, countries) ) +def attach_line_rating( + n, rating, s_max_pu, correction_factor, max_voltage_difference, max_line_rating +): + # TODO: Only considers overhead lines + n.lines_t.s_max_pu = (rating / n.lines.s_nom[rating.columns]) * correction_factor + if max_voltage_difference: + x_pu = ( + n.lines.type.map(n.line_types["x_per_length"]) + * n.lines.length + / (n.lines.v_nom**2) + ) + # need to clip here as cap values might be below 1 + # -> would mean the line cannot be operated at actual given pessimistic ampacity + s_max_pu_cap = ( + np.deg2rad(max_voltage_difference) / (x_pu * n.lines.s_nom) + ).clip(lower=1) + n.lines_t.s_max_pu = n.lines_t.s_max_pu.clip( + lower=1, upper=s_max_pu_cap, axis=1 + ) + if max_line_rating: + n.lines_t.s_max_pu = n.lines_t.s_max_pu.clip(upper=max_line_rating) + n.lines_t.s_max_pu *= s_max_pu + + if __name__ == "__main__": if "snakemake" not in globals(): from _helpers import mock_snakemake @@ -881,6 +905,23 @@ if __name__ == "__main__": update_p_nom_max(n) + line_rating_config = snakemake.config["lines"]["dynamic_line_rating"] + if line_rating_config["activate"]: + rating = xr.open_dataarray(snakemake.input.line_rating).to_pandas().transpose() + s_max_pu = snakemake.config["lines"]["s_max_pu"] + correction_factor = line_rating_config["correction_factor"] + max_voltage_difference = line_rating_config["max_voltage_difference"] + max_line_rating = line_rating_config["max_line_rating"] + + attach_line_rating( + n, + rating, + s_max_pu, + correction_factor, + max_voltage_difference, + max_line_rating, + ) + sanitize_carriers(n, snakemake.config) n.meta = snakemake.config diff --git a/scripts/build_line_rating.py b/scripts/build_line_rating.py new file mode 100755 index 00000000..7ece1c9d --- /dev/null +++ b/scripts/build_line_rating.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: : 2017-2020 The PyPSA-Eur Authors +# +# SPDX-License-Identifier: MIT + +# coding: utf-8 +""" +Adds dynamic line rating timeseries to the base network. + +Relevant Settings +----------------- + +.. code:: yaml + + lines: + cutout: + line_rating: + + +.. seealso:: + Documentation of the configuration file ``config.yaml` +Inputs +------ + +- ``data/cutouts``: +- ``networks/base.nc``: confer :ref:`base` + +Outputs +------- + +- ``resources/line_rating.nc`` + + +Description +----------- + +The rule :mod:`build_line_rating` calculates the line rating for transmission lines. +The line rating provides the maximal capacity of a transmission line considering the heat exchange with the environment. + +The following heat gains and losses are considered: + +- heat gain through resistive losses +- heat gain through solar radiation +- heat loss through radiation of the trasnmission line +- heat loss through forced convection with wind +- heat loss through natural convection + + +With a heat balance considering the maximum temperature threshold of the transmission line, +the maximal possible capacity factor "s_max_pu" for each transmission line at each time step is calculated. +""" + +import logging +import re + +import atlite +import geopandas as gpd +import numpy as np +import pandas as pd +import pypsa +import xarray as xr +from _helpers import configure_logging +from shapely.geometry import LineString as Line +from shapely.geometry import Point + + +def calculate_resistance(T, R_ref, T_ref=293, alpha=0.00403): + """ + Calculates the resistance at other temperatures than the reference + temperature. + + Parameters + ---------- + T : Temperature at which resistance is calculated in [°C] or [K] + R_ref : Resistance at reference temperature in [Ohm] or [Ohm/Per Length Unit] + T_ref : Reference temperature in [°C] or [K] + alpha: Temperature coefficient in [1/K] + Defaults are: + * T_ref : 20 °C + * alpha : 0.00403 1/K + + Returns + ------- + Resistance of at given temperature. + """ + R = R_ref * (1 + alpha * (T - T_ref)) + return R + + +def calculate_line_rating(n, cutout): + """ + Calculates the maximal allowed power flow in each line for each time step + considering the maximal temperature. + + Parameters + ---------- + n : pypsa.Network object containing information on grid + + Returns + ------- + xarray DataArray object with maximal power. + """ + relevant_lines = n.lines[(n.lines["underground"] == False)] + buses = relevant_lines[["bus0", "bus1"]].values + x = n.buses.x + y = n.buses.y + shapes = [Line([Point(x[b0], y[b0]), Point(x[b1], y[b1])]) for (b0, b1) in buses] + shapes = gpd.GeoSeries(shapes, index=relevant_lines.index) + if relevant_lines.r_pu.eq(0).all(): + # Overwrite standard line resistance with line resistance obtained from line type + r_per_length = n.line_types["r_per_length"] + R = ( + relevant_lines.join(r_per_length, on=["type"])["r_per_length"] / 1000 + ) # in meters + # If line type with bundles is given retrieve number of conductors per bundle + relevant_lines["n_bundle"] = ( + relevant_lines["type"] + .where(relevant_lines["type"].str.contains("bundle")) + .dropna() + .apply(lambda x: int(re.findall(r"(\d+)-bundle", x)[0])) + ) + # Set default number of bundles per line + relevant_lines["n_bundle"].fillna(1, inplace=True) + R *= relevant_lines["n_bundle"] + R = calculate_resistance(T=353, R_ref=R) + Imax = cutout.line_rating(shapes, R, D=0.0218, Ts=353, epsilon=0.8, alpha=0.8) + line_factor = relevant_lines.eval("v_nom * n_bundle * num_parallel") / 1e3 # in mW + da = xr.DataArray( + data=np.sqrt(3) * Imax * line_factor.values.reshape(-1, 1), + attrs=dict( + description="Maximal possible power in MW for given line considering line rating" + ), + ) + return da + + +if __name__ == "__main__": + if "snakemake" not in globals(): + from _helpers import mock_snakemake + + snakemake = mock_snakemake( + "build_line_rating", + network="elec", + simpl="", + clusters="5", + ll="v1.0", + opts="Co2L-4H", + ) + configure_logging(snakemake) + + n = pypsa.Network(snakemake.input.base_network) + cutout = atlite.Cutout(snakemake.input.cutout) + + da = calculate_line_rating(n, cutout) + da.to_netcdf(snakemake.output[0]) diff --git a/scripts/solve_network.py b/scripts/solve_network.py index c88615d3..8eccef19 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -596,6 +596,7 @@ def extra_functionality(n, snapshots): def solve_network(n, config, solving, opts="", **kwargs): set_of_options = solving["solver"]["options"] cf_solving = solving["options"] + kwargs["solver_options"] = ( solving["solver_options"][set_of_options] if set_of_options else {} ) @@ -605,6 +606,7 @@ def solve_network(n, config, solving, opts="", **kwargs): kwargs["linearized_unit_commitment"] = cf_solving.get( "linearized_unit_commitment", False ) + kwargs["assign_all_duals"] = cf_solving.get("assign_all_duals", False) rolling_horizon = cf_solving.pop("rolling_horizon", False) skip_iterations = cf_solving.pop("skip_iterations", False)