Skip to content

Commit

Permalink
Merge pull request #899 from openego/fix/#871-gas-load-allocation
Browse files Browse the repository at this point in the history
Fix/#871 gas load allocation
  • Loading branch information
AmeliaNadal committed Sep 29, 2022
2 parents 7c19553 + 4a176df commit 864b086
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 126 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -581,6 +581,8 @@ Bug Fixes
`#888 <https://github.com/openego/eGon-data/issues/888>`_
* Temporarily set upper version limit for pandas
`#829 <https://github.com/openego/eGon-data/issues/829>`_
* Change industrial gas load modelling
`#871 <https://github.com/openego/eGon-data/issues/871>`_
* Delete eMob MIT data from eTraGo tables on init
`#878 <https://github.com/openego/eGon-data/issues/878>`_
* Fix model id issues in DSM potentials for CTS and industry
Expand Down
2 changes: 1 addition & 1 deletion src/egon/data/datasets/etrago_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,9 +566,9 @@ def insert_carriers():
"CH4_to_H2",
"dsm",
"H2_feedin",
"H2_ind_load",
"H2_to_CH4",
"H2_to_power",
"H2_retrofit",
"rural_heat_pump",
"industrial_biomass_CHP",
"industrial_gas_CHP",
Expand Down
161 changes: 36 additions & 125 deletions src/egon/data/datasets/industrial_gas_demand.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class IndustrialGasDemandeGon2035(Dataset):
def __init__(self, dependencies):
super().__init__(
name="IndustrialGasDemandeGon2035",
version="0.0.1",
version="0.0.2",
dependencies=dependencies,
tasks=(insert_industrial_gas_demand_egon2035),
)
Expand All @@ -47,7 +47,7 @@ class IndustrialGasDemandeGon100RE(Dataset):
def __init__(self, dependencies):
super().__init__(
name="IndustrialGasDemandeGon100RE",
version="0.0.1",
version="0.0.2",
dependencies=dependencies,
tasks=(insert_industrial_gas_demand_egon100RE),
)
Expand Down Expand Up @@ -150,26 +150,34 @@ def read_industrial_demand(scn_name, carrier):
).set_geometry("geom", crs=4326)


def read_industrial_CH4_demand(scn_name="eGon2035"):
"""Download the CH4 industrial demand in Germany from the FfE open data portal
def read_and_process_demand(scn_name="eGon2035", carrier=None, grid_carrier=None):
"""Assign the industrial demand in Germany to buses
Parameters
----------
scn_name : str
Name of the scenario
carrier : str
Name of the carrier, the demand should hold
grid_carrier : str
Carrier name of the buses, the demand should be assigned to
Returns
-------
CH4_industrial_demand :
Dataframe containing the CH4 industrial demand in Germany
industrial_demand :
Dataframe containing the industrial demand in Germany
"""
carrier = "CH4"
if grid_carrier is None:
grid_carrier = carrier
industrial_loads_list = read_industrial_demand(scn_name, carrier)
number_loads = len(industrial_loads_list)

# Match to associated gas bus
industrial_loads_list = db.assign_gas_bus_id(
industrial_loads_list, scn_name, carrier
industrial_loads_list, scn_name, grid_carrier
)

# Add carrier
Expand All @@ -180,119 +188,14 @@ def read_industrial_CH4_demand(scn_name="eGon2035"):
columns=["geom", "NUTS0", "NUTS1", "bus_id"], errors="ignore"
)

return industrial_loads_list


def read_industrial_H2_demand(scn_name="eGon2035"):
"""Download the H2 industrial demand in Germany from the FfE open data portal
Parameters
----------
scn_name : str
Name of the scenario
Returns
-------
H2_industrial_demand :
Dataframe containing the H2 industrial demand in Germany
"""
industrial_loads_list = read_industrial_demand(scn_name, "H2")
industrial_loads_list_copy = industrial_loads_list.copy()
# Match to associated gas bus
industrial_loads_list = db.assign_gas_bus_id(
industrial_loads_list, scn_name, "H2_grid"
)
industrial_loads_saltcavern = db.assign_gas_bus_id(
industrial_loads_list_copy, scn_name, "H2_saltcavern"
)

saltcavern_buses = (
db.select_geodataframe(
f"""
SELECT * FROM grid.egon_etrago_bus WHERE carrier = 'H2_saltcavern'
AND scn_name = '{scn_name}'
"""
)
.to_crs(epsg=3035)
.set_index("bus_id")
)

nearest_saltcavern_buses = saltcavern_buses.loc[
industrial_loads_saltcavern["bus_id"]
].geometry

industrial_loads_saltcavern[
"distance"
] = industrial_loads_saltcavern.to_crs(epsg=3035).distance(
nearest_saltcavern_buses, align=False
)

new_connections = industrial_loads_saltcavern[
industrial_loads_saltcavern["distance"] <= 10000
]
num_new_connections = len(new_connections)

if num_new_connections > 0:

carrier = "H2_ind_load"
target = {"schema": "grid", "table": "egon_etrago_bus"}
bus_gdf = initialise_bus_insertion(carrier, target, scenario=scn_name)

bus_gdf["geom"] = new_connections["geom"]

bus_gdf = finalize_bus_insertion(
bus_gdf, carrier, target, scenario=scn_name
)

# Delete existing buses
db.execute_sql(
f"""
DELETE FROM grid.egon_etrago_link
WHERE scn_name = '{scn_name}'
AND carrier = '{carrier}'
"""
)

# initalize dataframe for new buses
grid_links = pd.DataFrame(
columns=["scn_name", "link_id", "bus0", "bus1", "carrier"]
msg = (
"The number of load changed when assigning to the respective buses."
f"It should be {number_loads} loads, but only"
f"{len(industrial_loads_list)} got assigned to buses."
f"scn_name: {scn_name}, load carrier: {carrier}, carrier of buses to"
f"connect loads to: {grid_carrier}"
)

grid_links["bus0"] = industrial_loads_list.loc[bus_gdf.index]["bus_id"]
grid_links["bus1"] = bus_gdf["bus_id"]
grid_links["p_nom"] = 1e9
grid_links["carrier"] = carrier
grid_links["scn_name"] = scn_name

cavern_links = grid_links.copy()

cavern_links["bus0"] = new_connections["bus_id"]

engine = db.engine()
for table in [grid_links, cavern_links]:
new_id = db.next_etrago_id("link")
table["link_id"] = range(new_id, new_id + len(table))

link_geom_from_buses(table, scn_name).to_postgis(
"egon_etrago_link",
engine,
schema="grid",
index=False,
if_exists="append",
dtype={"topo": Geometry()},
)

industrial_loads_list.loc[bus_gdf.index, "bus"] = bus_gdf["bus_id"]

# Add carrier
c = {"carrier": "H2"}
industrial_loads_list = industrial_loads_list.assign(**c)

# Remove useless columns
industrial_loads_list = industrial_loads_list.drop(
columns=["geom", "NUTS0", "NUTS1", "bus_id"], errors="ignore"
)
assert len(industrial_loads_list) == number_loads, msg

return industrial_loads_list

Expand Down Expand Up @@ -393,8 +296,10 @@ def insert_industrial_gas_demand_egon2035():

industrial_gas_demand = pd.concat(
[
read_industrial_CH4_demand(scn_name=scn_name),
read_industrial_H2_demand(scn_name=scn_name),
read_and_process_demand(scn_name=scn_name, carrier="CH4"),
read_and_process_demand(
scn_name=scn_name, carrier="H2", grid_carrier="H2_grid"
),
]
)

Expand Down Expand Up @@ -424,9 +329,13 @@ def insert_industrial_gas_demand_egon100RE():
scn_name = "eGon100RE"
delete_old_entries(scn_name)

# concatenate loads
industrial_gas_demand_CH4 = read_industrial_CH4_demand(scn_name=scn_name)
industrial_gas_demand_H2 = read_industrial_H2_demand(scn_name=scn_name)
# read demands
industrial_gas_demand_CH4 = read_and_process_demand(
scn_name=scn_name, carrier="CH4"
)
industrial_gas_demand_H2 = read_and_process_demand(
scn_name=scn_name, carrier="H2", grid_carrier="H2_grid"
)

# adjust H2 and CH4 total demands (values from PES)
# CH4 demand = 0 in 100RE, therefore scale H2 ts
Expand All @@ -442,6 +351,7 @@ def insert_industrial_gas_demand_egon100RE():
)
except KeyError:
H2_total_PES = 42090000
print("Could not find data from PES-run, assigning fallback number.")

try:
CH4_total_PES = (
Expand All @@ -452,6 +362,7 @@ def insert_industrial_gas_demand_egon100RE():
)
except KeyError:
CH4_total_PES = 105490000
print("Could not find data from PES-run, assigning fallback number.")

boundary = settings()["egon-data"]["--dataset-boundary"]
if boundary != "Everything":
Expand Down

0 comments on commit 864b086

Please sign in to comment.