added flexible operation

This commit is contained in:
LukasFrankenQ 2023-11-12 20:14:04 +00:00
parent 52c6ce922c
commit bf79b4a817
3 changed files with 43 additions and 0 deletions

View File

@ -513,6 +513,8 @@ sector:
enhanced_geothermal_performant: true # if true, adds only the cheapest patch of EGS potential to each region enhanced_geothermal_performant: true # if true, adds only the cheapest patch of EGS potential to each region
enhanced_geothermal_flexible: true # if true, adds a storage unit simulating flexible operation of EGS, see Ricks et al. 2023 enhanced_geothermal_flexible: true # if true, adds a storage unit simulating flexible operation of EGS, see Ricks et al. 2023
enhanced_geothermal_var_cf: true # if true, adds time-dependent capacity factor to EGS, see Ricks et al. 2023 enhanced_geothermal_var_cf: true # if true, adds time-dependent capacity factor to EGS, see Ricks et al. 2023
enhanced_geothermal_reservoir_max_hours: 240 # relavant for flexible EGS, see Ricks et al. 2023
enhanced_geothermal_reservoir_max_boost: 0.25 # share of generation that can be added by flexible EGS, see Ricks et al. 2023
# docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#industry # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#industry
industry: industry:

View File

@ -3468,6 +3468,28 @@ def add_enhanced_geothermal(
efficiency=efficiency_dh * 2., efficiency=efficiency_dh * 2.,
p_nom_extendable=True, p_nom_extendable=True,
) )
else:
n.links.at[bus + " geothermal organic rankine cycle", "efficiency"] = efficiency_orc
if snakemake.params.sector["enhanced_geothermal_flexible"]:
# this StorageUnit represents flexible operation using the geothermal reservoir.
# Hence, it is intuitively wrong to install it at the surface bus,
# this is however the more lean and computationally efficient solution.
max_hours = snakemake.params.sector["enhanced_geothermal_reservoir_max_hours"]
boost = snakemake.params.sector["enhanced_geothermal_reservoir_max_boost"]
max_hours = max_hours * boost
n.add(
"StorageUnit",
bus + ' geothermal reservoir',
bus=f"geothermal heat surface {bus}",
carrier="geothermal heat",
p_nom_extendable=True,
p_min_pu=-1. - boost,
max_hours=max_hours,
)

View File

@ -777,6 +777,23 @@ def add_geothermal_chp_constraint(n):
) )
def add_flexible_egs_constraint(n):
well_index = n.links.loc[n.links.carrier == 'geothermal heat'].index
storage_index = n.storage_units.loc[n.storage_units.carrier == 'geothermal heat '].index
p_nom_rhs = (
n.model["Link-p_nom"].loc[well_index]
)
p_nom_lhs = (
n.model["StorageUnit-p_nom"].loc[storage_index]
)
n.model.add_constraints(
p_nom_lhs <= p_nom_rhs,
name="Upper bounds the charging capacity of the storage unit",
)
def extra_functionality(n, snapshots): def extra_functionality(n, snapshots):
""" """
Collects supplementary constraints which will be passed to Collects supplementary constraints which will be passed to
@ -808,6 +825,8 @@ def extra_functionality(n, snapshots):
add_retrofit_gas_boiler_constraint(n, snapshots) add_retrofit_gas_boiler_constraint(n, snapshots)
if "geothermal district heat" in n.links.carrier: if "geothermal district heat" in n.links.carrier:
add_geothermal_chp_constraint(n) add_geothermal_chp_constraint(n)
if config["sector"]["enhanced_geothermal_flexible"]:
add_flexible_egs_constraint(n)
def solve_network(n, config, solving, opts="", **kwargs): def solve_network(n, config, solving, opts="", **kwargs):