Merge remote-tracking branch 'origin/eu-energy-security' into results-dir

This commit is contained in:
Fabian Neumann 2022-04-08 15:46:37 +02:00
commit 8af21f3355
3 changed files with 47 additions and 5 deletions

View File

@ -64,7 +64,30 @@ electricity:
powerplants_filter: (DateOut >= 2022 or DateOut != DateOut)
# use pandas query strings here, e.g. Country in ['Germany']
custom_powerplants: false
conventional_carriers: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]
conventional_carriers:
technologies: [nuclear, oil, OCGT, CCGT, coal, lignite, geothermal, biomass]
# Limit energy availability from these sources -> p_max_pu
# syntax:
# <technology name>: <fixed value> or <country>: <value>
energy_availability_factors:
# From IAEA
# https://pris.iaea.org/PRIS/WorldStatistics/ThreeYrsEnergyAvailabilityFactor.aspx (2022-04-08)
nuclear:
BE: 0.65
BG: 0.89
CZ: 0.82
FI: 0.92
FR: 0.70
DE: 0.88
HU: 0.90
NL: 0.86
RO: 0.92
SK: 0.89
SI: 0.94
ES: 0.89
SE: 0.82
CH: 0.86
GB: 0.67
renewable_capacities_from_OPSD: [] # onwind, offwind, solar
estimate_renewable_capacities:

View File

@ -25,7 +25,10 @@ Energy Security Release (April 2022)
* Add operational reserve margin constraint analogous to `GenX implementation <https://genxproject.github.io/GenX/dev/core/#Reserves>`_.
Can be activated with config setting ``electricity: operational_reserve:``.
* Add function to add global constraint on use of gas in :mod:`prepare_network`. This can be activated with `electricity: gaslimit:` given in MWh.
* Add function to add global constraint on use of gas in :mod:`prepare_network`. This can be activated with `electricity: gaslimit:` given in MWh.
* Add configuration option to implement Energy Availability Factors (EAFs) for conventional generation technologies.
* Implement country-specific EAFs for nuclear power plants based on IAEA 2018-2020 reported country averages.
* The powerplants that have been shut down before 2021 are filtered out.

View File

@ -290,8 +290,9 @@ def attach_wind_and_solar(n, costs, input_profiles, technologies, line_length_fa
p_max_pu=ds['profile'].transpose('time', 'bus').to_pandas())
def attach_conventional_generators(n, costs, ppl, carriers):
def attach_conventional_generators(n, costs, ppl, conventional_carriers):
carriers = conventional_carriers["technologies"]
_add_missing_carriers_from_costs(n, costs, carriers)
ppl = (ppl.query('carrier in @carriers').join(costs, on='carrier')
@ -309,6 +310,22 @@ def attach_conventional_generators(n, costs, ppl, carriers):
capital_cost=0)
logger.warning(f'Capital costs for conventional generators put to 0 EUR/MW.')
for k,v in conventional_carriers["energy_availability_factors"].items():
# Generators with technology affected
idx = n.generators.query("carrier == @k").index
if isinstance(v, float):
# Single value affecting all generators of technology k indiscriminantely of country
n.generators.loc[idx, "p_max_pu"] = v
elif isinstance(v, dict):
v = pd.Series(v)
# Values affecting generators of technology k country-specific
# First map generator buses to countries; then map countries to p_max_pu
n.generators["p_max_pu"] = n.generators.loc[idx]["bus"].replace(n.buses["country"]).replace(v)
def attach_hydro(n, costs, ppl, profile_hydro, hydro_capacities, carriers, **config):
@ -556,8 +573,7 @@ if __name__ == "__main__":
update_transmission_costs(n, costs, snakemake.config['lines']['length_factor'])
carriers = snakemake.config['electricity']['conventional_carriers']
attach_conventional_generators(n, costs, ppl, carriers)
attach_conventional_generators(n, costs, ppl, snakemake.config["electricity"]["conventional_carriers"])
carriers = snakemake.config['renewable']
attach_wind_and_solar(n, costs, snakemake.input, carriers, snakemake.config['lines']['length_factor'])