diff --git a/config/config.validation.yaml b/config/config.validation.yaml index 0ffdb864..5bcd5c31 100644 --- a/config/config.validation.yaml +++ b/config/config.validation.yaml @@ -1,22 +1,21 @@ # SPDX-FileCopyrightText: : 2017-2023 The PyPSA-Eur Authors # # SPDX-License-Identifier: CC0-1.0 - run: - name: "validation" # use this to keep track of runs with different settings + name: "validation" scenario: - ll: # allowed transmission line volume expansion, can be any float >= 1.0 with a prefix v|c (today) or "copt" + ll: - v1.0 - clusters: # number of nodes in Europe, any integer between 37 (1 node per country-zone) and several hundred + clusters: - 37 - opts: # only relevant for PyPSA-Eur + opts: - 'Ept' snapshots: start: "2019-01-01" end: "2020-01-01" - inclusive: 'left' # include start, not end + inclusive: 'left' enable: retrieve_cutout: false @@ -26,11 +25,10 @@ electricity: extendable_carriers: Generator: [] - StorageUnit: [] # battery, H2 + StorageUnit: [] Store: [] - Link: [] # H2 pipeline + Link: [] - # use pandas query strings here, e.g. Country not in ['Germany'] powerplants_filter: not (DateOut < 2019) conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass] @@ -39,22 +37,17 @@ electricity: estimate_renewable_capacities: year: 2019 - atlite: default_cutout: europe-2019-era5 cutouts: - # use 'base' to determine geographical bounds and time span from config - # base: - # module: era5 europe-2019-era5: - module: era5 # in priority order + module: era5 x: [-12., 35.] y: [33., 72] dx: 0.3 dy: 0.3 time: ['2019', '2019'] - renewable: onwind: cutout: europe-2019-era5 @@ -69,29 +62,26 @@ renewable: flatten_dispatch: 0.01 conventional: - unit_commitment: true + unit_commitment: false dynamic_fuel_price: true nuclear: - p_max_pu: "data/nuclear_p_max_pu.csv" # float of file name + p_max_pu: "data/nuclear_p_max_pu.csv" biomass: p_max_pu: 0.65 - load: - power_statistics: false # only for files from <2019; set false in order to get ENTSOE transparency data - + power_statistics: false lines: s_max_pu: 0.23 - under_construction: 'remove' # 'zero': set capacity to zero, 'remove': remove, 'keep': with full capacity - + under_construction: 'remove' links: include_tyndp: false costs: year: 2020 - emission_prices: # in currency per tonne emission, only used with the option Ep + emission_prices: co2: 25 clustering: @@ -100,9 +90,7 @@ clustering: cluster_network: consider_efficiency_classes: true - solving: - #tmpdir: "path/to/tmp" options: load_shedding: true rolling_horizon: false diff --git a/doc/index.rst b/doc/index.rst index c5d92e87..1552729c 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -280,6 +280,7 @@ The PyPSA-Eur workflow is continuously tested for Linux, macOS and Windows (WSL release_notes licenses + validation limitations contributing support diff --git a/doc/validation.rst b/doc/validation.rst new file mode 100644 index 00000000..cc64495b --- /dev/null +++ b/doc/validation.rst @@ -0,0 +1,53 @@ +.. + SPDX-FileCopyrightText: 2019-2023 The PyPSA-Eur Authors + + SPDX-License-Identifier: CC-BY-4.0 + +########################################## +Validation +########################################## + +The PyPSA-Eur model workflow provides a built-in mechanism for validation. This allows users to contrast the outcomes of network optimization against the historical performance of the European power system. The snakemake rule ``validate_elec_networks`` enables this by generating comparative figures that encapsulate key data points such as dispatch carrier, cross-border flows, and market prices per price zone. + +These comparisons utilize data from the 2019 ENTSO-E Transparency Platform. To enable this, an ENTSO-E API key must be inserted into the ``config.yaml`` file. Detailed steps for this process can be found in the user guide `here `_. + +Once the API key is set, the validation workflow can be triggered by running the following command: + + snakemake validate_elec_networks --configfile config/config.validation.yaml -c8 + + +The configuration file `config/config.validation.yaml` contains the following parameters: + +.. literalinclude:: ../config/config.validation.yaml + :language: yaml + +The setup uses monthly varying fuel prices for gas, lignite, coal and oil as well as CO2 prices, which are created by the script ``build_monthly_prices``. Upon completion of the validation process, the resulting network and generated figures will be stored in the ``results/validation`` directory for further analysis. + + +Results +======= + +By the time of writing the comparison with the historical data shows partially accurate, partially improvable results. The following figures show the comparison of the dispatch of the different carriers. + +.. image:: ../graphics/validation_seasonal_operation_area_elec_s_37_ec_lv1.0_Ept.png + :width: 100% + :align: center + +.. image:: ../graphics/validation_production_bar_elec_s_37_ec_lv1.0_Ept.png + :width: 100% + :align: center + + + +Issues and possible improvements +-------------------------------- + +**Overestimated dispatch of wind and solar:** Renewable potentials of wind and solar are slightly overestimated in the model. This leads to a higher dispatch of these carriers than in the historical data. In particular, the solar dispatch during winter is overestimated. + +**Coal - Lignite fuel switch:** The model has a fuel switch from coal to lignite. This might result from non-captured subsidies for lignite and coal in the model. In order to fix the fuel switch from coal to lignite, a manual cost correction was added to the script ``build_monthly_prices``. + +**Planned outages of nuclear power plants:** Planned outages of nuclear power plants are not captured in the model. This leads to a underestimated dispatch of nuclear power plants in winter and a overestimated dispatch in summer. This point is hard to fix, since the planned outages are not published in the ENTSO-E Transparency Platform. + +**False classification of run-of-river power plants:** Some run-of-river power plants are classified as hydro power plants in the model. This leads to a general overestimation of the hydro power dispatch. In particular, Swedish hydro power plants are overestimated. + +**Load shedding:** Due to constraint NTC's (crossborder capacities), the model has to shed load in some regions. This leads to a high market prices in the regions which drive the average market price up. Further fine-tuning of the NTC's is needed to avoid load shedding. diff --git a/graphics/validation_production_bar_elec_s_37_ec_lv1.0_Ept.png b/graphics/validation_production_bar_elec_s_37_ec_lv1.0_Ept.png new file mode 100644 index 00000000..1954b715 Binary files /dev/null and b/graphics/validation_production_bar_elec_s_37_ec_lv1.0_Ept.png differ diff --git a/graphics/validation_seasonal_operation_area_elec_s_37_ec_lv1.0_Ept.png b/graphics/validation_seasonal_operation_area_elec_s_37_ec_lv1.0_Ept.png new file mode 100644 index 00000000..19c3ed98 Binary files /dev/null and b/graphics/validation_seasonal_operation_area_elec_s_37_ec_lv1.0_Ept.png differ diff --git a/matplotlibrc b/matplotlibrc index f00ed5cd..8d8a0a93 100644 --- a/matplotlibrc +++ b/matplotlibrc @@ -5,3 +5,4 @@ font.family: sans-serif font.sans-serif: Ubuntu, DejaVu Sans image.cmap: viridis figure.autolayout : True +figure.dpi: 300