Source code for egon.data.datasets.power_etrago.match_ocgt
# -*- coding: utf-8 -*-
"""
Module containing the definition of the open cycle gas turbine links
"""
from geoalchemy2.types import Geometry
from scipy.spatial import cKDTree
import numpy as np
import pandas as pd
from egon.data import db
from egon.data.datasets.etrago_setup import link_geom_from_buses
from egon.data.datasets.scenario_parameters import get_sector_parameters
[docs]def insert_open_cycle_gas_turbines(scn_name="eGon2035"):
"""Insert gas turbine links in egon_etrago_link table.
Parameters
----------
scn_name : str
Name of the scenario.
Returns
----------
None
"""
# Connect to local database
engine = db.engine()
# create bus connections
gdf = map_buses(scn_name)
if gdf is None:
return
# create topology column (linestring)
gdf = link_geom_from_buses(gdf, scn_name)
gdf["p_nom_extendable"] = False
carrier = "OCGT"
gdf["carrier"] = carrier
buses = tuple(
db.select_dataframe(
f"""SELECT bus_id FROM grid.egon_etrago_bus
WHERE scn_name = '{scn_name}' AND country = 'DE';
"""
)["bus_id"]
)
# Delete old entries
db.execute_sql(
f"""
DELETE FROM grid.egon_etrago_link WHERE "carrier" = '{carrier}'
AND scn_name = '{scn_name}'
AND bus0 IN {buses} AND bus1 IN {buses};
"""
)
# read carrier information from scnario parameter data
scn_params = get_sector_parameters("gas", scn_name)
gdf["efficiency"] = scn_params["efficiency"][carrier]
gdf["marginal_cost"] = (
scn_params["marginal_cost"][carrier]
/ scn_params["efficiency"][carrier]
)
# Adjust p_nom
gdf["p_nom"] = gdf["p_nom"] / scn_params["efficiency"][carrier]
# Select next id value
new_id = db.next_etrago_id("link")
gdf["link_id"] = range(new_id, new_id + len(gdf))
# Insert data to db
gdf.to_postgis(
"egon_etrago_link",
engine,
schema="grid",
index=False,
if_exists="append",
dtype={"topo": Geometry()},
)
[docs]def map_buses(scn_name):
"""Map OCGT AC buses to nearest CH4 bus.
Parameters
----------
scn_name : str
Name of the scenario.
Returns
-------
gdf : geopandas.GeoDataFrame
GeoDataFrame with connected buses.
"""
# Create dataframes containing all gas buses and all the HV power buses
sql_AC = f"""SELECT bus_id, el_capacity as p_nom, geom
FROM supply.egon_power_plants
WHERE carrier = 'gas' AND scenario = '{scn_name}';
"""
sql_gas = f"""SELECT bus_id, scn_name, geom
FROM grid.egon_etrago_bus
WHERE carrier = 'CH4' AND scn_name = '{scn_name}'
AND country = 'DE';"""
gdf_AC = db.select_geodataframe(sql_AC, epsg=4326)
if gdf_AC.size == 0:
return
gdf_gas = db.select_geodataframe(sql_gas, epsg=4326)
# Associate each power plant AC bus to nearest CH4 bus
n_gas = np.array(list(gdf_gas.geometry.apply(lambda x: (x.x, x.y))))
n_AC = np.array(list(gdf_AC.geometry.apply(lambda x: (x.x, x.y))))
btree = cKDTree(n_gas)
dist, idx = btree.query(n_AC, k=1)
gd_gas_nearest = (
gdf_gas.iloc[idx]
.rename(columns={"bus_id": "bus0", "geom": "geom_gas"})
.reset_index(drop=True)
)
gdf = pd.concat(
[
gdf_AC.reset_index(drop=True),
gd_gas_nearest,
],
axis=1,
)
return gdf.rename(columns={"bus_id": "bus1"}).drop(
columns=["geom", "geom_gas"]
)