Merge branch 'master' into complete-losses
This commit is contained in:
commit
1245c93264
@ -50,7 +50,7 @@ repos:
|
|||||||
- id: blackdoc
|
- id: blackdoc
|
||||||
|
|
||||||
# Formatting with "black" coding style
|
# Formatting with "black" coding style
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black-pre-commit-mirror
|
||||||
rev: 23.12.1
|
rev: 23.12.1
|
||||||
hooks:
|
hooks:
|
||||||
# Format Python files
|
# Format Python files
|
||||||
|
@ -480,11 +480,15 @@ sector:
|
|||||||
- nearshore # within 50 km of sea
|
- nearshore # within 50 km of sea
|
||||||
# - offshore
|
# - offshore
|
||||||
ammonia: false
|
ammonia: false
|
||||||
min_part_load_fischer_tropsch: 0.9
|
min_part_load_fischer_tropsch: 0.7
|
||||||
min_part_load_methanolisation: 0.5
|
min_part_load_methanolisation: 0.3
|
||||||
|
min_part_load_methanation: 0.3
|
||||||
use_fischer_tropsch_waste_heat: true
|
use_fischer_tropsch_waste_heat: true
|
||||||
|
use_haber_bosch_waste_heat: true
|
||||||
|
use_methanolisation_waste_heat: true
|
||||||
|
use_methanation_waste_heat: true
|
||||||
use_fuel_cell_waste_heat: true
|
use_fuel_cell_waste_heat: true
|
||||||
use_electrolysis_waste_heat: false
|
use_electrolysis_waste_heat: true
|
||||||
electricity_distribution_grid: true
|
electricity_distribution_grid: true
|
||||||
electricity_distribution_grid_cost_factor: 1.0
|
electricity_distribution_grid_cost_factor: 1.0
|
||||||
electricity_grid_connection: true
|
electricity_grid_connection: true
|
||||||
|
@ -51,8 +51,18 @@ Upcoming Release
|
|||||||
network has been moved from ``focus_weights:`` to ``clustering:
|
network has been moved from ``focus_weights:`` to ``clustering:
|
||||||
focus_weights:``. Backwards compatibility to old config files is maintained.
|
focus_weights:``. Backwards compatibility to old config files is maintained.
|
||||||
|
|
||||||
|
* Extend options for waste usage from Haber-Bosch, methanolisation and methanation.
|
||||||
|
|
||||||
|
* Use electrolysis waste heat by default.
|
||||||
|
|
||||||
|
* Add new ``sector_opts`` wildcard option "nowasteheat" to disable all waste heat usage.
|
||||||
|
|
||||||
|
* Set minimum part loads for PtX processes to 30% for methanolisation and methanation, and to 70% for Fischer-Tropsch synthesis.
|
||||||
|
|
||||||
* Add VOM as marginal cost to PtX processes.
|
* Add VOM as marginal cost to PtX processes.
|
||||||
|
|
||||||
|
* Add pelletizing costs for biomass boilers.
|
||||||
|
|
||||||
* The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument.
|
* The ``mock_snakemake`` function can now be used with a Snakefile from a different directory using the new ``root_dir`` argument.
|
||||||
|
|
||||||
* Switch to using hydrogen and electricity inputs for Haber-Bosch from https://github.com/PyPSA/technology-data.
|
* Switch to using hydrogen and electricity inputs for Haber-Bosch from https://github.com/PyPSA/technology-data.
|
||||||
@ -72,6 +82,9 @@ Upcoming Release
|
|||||||
* Validate downloads from Zenodo using MD5 checksums. This identifies corrupted
|
* Validate downloads from Zenodo using MD5 checksums. This identifies corrupted
|
||||||
or incomplete downloads.
|
or incomplete downloads.
|
||||||
|
|
||||||
|
* Add locations, capacities and costs of existing gas storage using Global
|
||||||
|
Energy Monitor's `Europe Gas Tracker
|
||||||
|
<https://globalenergymonitor.org/projects/europe-gas-tracker>`_.
|
||||||
|
|
||||||
**Bugs and Compatibility**
|
**Bugs and Compatibility**
|
||||||
|
|
||||||
|
@ -85,12 +85,12 @@ if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]:
|
|||||||
|
|
||||||
rule build_gas_input_locations:
|
rule build_gas_input_locations:
|
||||||
input:
|
input:
|
||||||
lng=HTTP.remote(
|
gem=HTTP.remote(
|
||||||
"https://globalenergymonitor.org/wp-content/uploads/2023/07/Europe-Gas-Tracker-2023-03-v3.xlsx",
|
"https://globalenergymonitor.org/wp-content/uploads/2023/07/Europe-Gas-Tracker-2023-03-v3.xlsx",
|
||||||
keep_local=True,
|
keep_local=True,
|
||||||
),
|
),
|
||||||
entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson",
|
entry="data/gas_network/scigrid-gas/data/IGGIELGN_BorderPoints.geojson",
|
||||||
production="data/gas_network/scigrid-gas/data/IGGIELGN_Productions.geojson",
|
storage="data/gas_network/scigrid-gas/data/IGGIELGN_Storages.geojson",
|
||||||
regions_onshore=RESOURCES
|
regions_onshore=RESOURCES
|
||||||
+ "regions_onshore_elec_s{simpl}_{clusters}.geojson",
|
+ "regions_onshore_elec_s{simpl}_{clusters}.geojson",
|
||||||
regions_offshore=RESOURCES
|
regions_offshore=RESOURCES
|
||||||
|
@ -169,6 +169,7 @@ if config["enable"]["retrieve"] and (
|
|||||||
"IGGIELGN_LNGs.geojson",
|
"IGGIELGN_LNGs.geojson",
|
||||||
"IGGIELGN_BorderPoints.geojson",
|
"IGGIELGN_BorderPoints.geojson",
|
||||||
"IGGIELGN_Productions.geojson",
|
"IGGIELGN_Productions.geojson",
|
||||||
|
"IGGIELGN_Storages.geojson",
|
||||||
"IGGIELGN_PipeSegments.geojson",
|
"IGGIELGN_PipeSegments.geojson",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -23,11 +23,10 @@ def read_scigrid_gas(fn):
|
|||||||
return df
|
return df
|
||||||
|
|
||||||
|
|
||||||
def build_gem_lng_data(lng_fn):
|
def build_gem_lng_data(fn):
|
||||||
df = pd.read_excel(lng_fn[0], sheet_name="LNG terminals - data")
|
df = pd.read_excel(fn[0], sheet_name="LNG terminals - data")
|
||||||
df = df.set_index("ComboID")
|
df = df.set_index("ComboID")
|
||||||
|
|
||||||
remove_status = ["Cancelled"]
|
|
||||||
remove_country = ["Cyprus", "Turkey"]
|
remove_country = ["Cyprus", "Turkey"]
|
||||||
remove_terminal = ["Puerto de la Luz LNG Terminal", "Gran Canaria LNG Terminal"]
|
remove_terminal = ["Puerto de la Luz LNG Terminal", "Gran Canaria LNG Terminal"]
|
||||||
|
|
||||||
@ -42,9 +41,50 @@ def build_gem_lng_data(lng_fn):
|
|||||||
return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326")
|
return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326")
|
||||||
|
|
||||||
|
|
||||||
def build_gas_input_locations(lng_fn, entry_fn, prod_fn, countries):
|
def build_gem_prod_data(fn):
|
||||||
|
df = pd.read_excel(fn[0], sheet_name="Gas extraction - main")
|
||||||
|
df = df.set_index("GEM Unit ID")
|
||||||
|
|
||||||
|
remove_country = ["Cyprus", "Türkiye"]
|
||||||
|
remove_fuel_type = ["oil"]
|
||||||
|
|
||||||
|
df = df.query(
|
||||||
|
"Status != 'shut in' \
|
||||||
|
& 'Fuel type' != 'oil' \
|
||||||
|
& Country != @remove_country \
|
||||||
|
& ~Latitude.isna() \
|
||||||
|
& ~Longitude.isna()"
|
||||||
|
).copy()
|
||||||
|
|
||||||
|
p = pd.read_excel(fn[0], sheet_name="Gas extraction - production")
|
||||||
|
p = p.set_index("GEM Unit ID")
|
||||||
|
p = p[p["Fuel description"] == "gas"]
|
||||||
|
|
||||||
|
capacities = pd.DataFrame(index=df.index)
|
||||||
|
for key in ["production", "production design capacity", "reserves"]:
|
||||||
|
cap = (
|
||||||
|
p.loc[p["Production/reserves"] == key, "Quantity (converted)"]
|
||||||
|
.groupby("GEM Unit ID")
|
||||||
|
.sum()
|
||||||
|
.reindex(df.index)
|
||||||
|
)
|
||||||
|
# assume capacity such that 3% of reserves can be extracted per year (25% quantile)
|
||||||
|
annualization_factor = 0.03 if key == "reserves" else 1.0
|
||||||
|
capacities[key] = cap * annualization_factor
|
||||||
|
|
||||||
|
df["mcm_per_year"] = (
|
||||||
|
capacities["production"]
|
||||||
|
.combine_first(capacities["production design capacity"])
|
||||||
|
.combine_first(capacities["reserves"])
|
||||||
|
)
|
||||||
|
|
||||||
|
geometry = gpd.points_from_xy(df["Longitude"], df["Latitude"])
|
||||||
|
return gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326")
|
||||||
|
|
||||||
|
|
||||||
|
def build_gas_input_locations(gem_fn, entry_fn, sto_fn, countries):
|
||||||
# LNG terminals
|
# LNG terminals
|
||||||
lng = build_gem_lng_data(lng_fn)
|
lng = build_gem_lng_data(gem_fn)
|
||||||
|
|
||||||
# Entry points from outside the model scope
|
# Entry points from outside the model scope
|
||||||
entry = read_scigrid_gas(entry_fn)
|
entry = read_scigrid_gas(entry_fn)
|
||||||
@ -55,25 +95,30 @@ def build_gas_input_locations(lng_fn, entry_fn, prod_fn, countries):
|
|||||||
| (entry.from_country == "NO") # malformed datapoint # entries from NO to GB
|
| (entry.from_country == "NO") # malformed datapoint # entries from NO to GB
|
||||||
]
|
]
|
||||||
|
|
||||||
|
sto = read_scigrid_gas(sto_fn)
|
||||||
|
remove_country = ["RU", "UA", "TR", "BY"]
|
||||||
|
sto = sto.query("country_code != @remove_country")
|
||||||
|
|
||||||
# production sites inside the model scope
|
# production sites inside the model scope
|
||||||
prod = read_scigrid_gas(prod_fn)
|
prod = build_gem_prod_data(gem_fn)
|
||||||
prod = prod.loc[
|
|
||||||
(prod.geometry.y > 35) & (prod.geometry.x < 30) & (prod.country_code != "DE")
|
|
||||||
]
|
|
||||||
|
|
||||||
mcm_per_day_to_mw = 437.5 # MCM/day to MWh/h
|
mcm_per_day_to_mw = 437.5 # MCM/day to MWh/h
|
||||||
|
mcm_per_year_to_mw = 1.199 # MCM/year to MWh/h
|
||||||
mtpa_to_mw = 1649.224 # mtpa to MWh/h
|
mtpa_to_mw = 1649.224 # mtpa to MWh/h
|
||||||
lng["p_nom"] = lng["CapacityInMtpa"] * mtpa_to_mw
|
mcm_to_gwh = 11.36 # MCM to GWh
|
||||||
entry["p_nom"] = entry["max_cap_from_to_M_m3_per_d"] * mcm_per_day_to_mw
|
lng["capacity"] = lng["CapacityInMtpa"] * mtpa_to_mw
|
||||||
prod["p_nom"] = prod["max_supply_M_m3_per_d"] * mcm_per_day_to_mw
|
entry["capacity"] = entry["max_cap_from_to_M_m3_per_d"] * mcm_per_day_to_mw
|
||||||
|
prod["capacity"] = prod["mcm_per_year"] * mcm_per_year_to_mw
|
||||||
|
sto["capacity"] = sto["max_cushionGas_M_m3"] * mcm_to_gwh
|
||||||
|
|
||||||
lng["type"] = "lng"
|
lng["type"] = "lng"
|
||||||
entry["type"] = "pipeline"
|
entry["type"] = "pipeline"
|
||||||
prod["type"] = "production"
|
prod["type"] = "production"
|
||||||
|
sto["type"] = "storage"
|
||||||
|
|
||||||
sel = ["geometry", "p_nom", "type"]
|
sel = ["geometry", "capacity", "type"]
|
||||||
|
|
||||||
return pd.concat([prod[sel], entry[sel], lng[sel]], ignore_index=True)
|
return pd.concat([prod[sel], entry[sel], lng[sel], sto[sel]], ignore_index=True)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
@ -83,7 +128,7 @@ if __name__ == "__main__":
|
|||||||
snakemake = mock_snakemake(
|
snakemake = mock_snakemake(
|
||||||
"build_gas_input_locations",
|
"build_gas_input_locations",
|
||||||
simpl="",
|
simpl="",
|
||||||
clusters="37",
|
clusters="128",
|
||||||
)
|
)
|
||||||
|
|
||||||
logging.basicConfig(level=snakemake.config["logging"]["level"])
|
logging.basicConfig(level=snakemake.config["logging"]["level"])
|
||||||
@ -104,9 +149,9 @@ if __name__ == "__main__":
|
|||||||
countries = regions.index.str[:2].unique().str.replace("GB", "UK")
|
countries = regions.index.str[:2].unique().str.replace("GB", "UK")
|
||||||
|
|
||||||
gas_input_locations = build_gas_input_locations(
|
gas_input_locations = build_gas_input_locations(
|
||||||
snakemake.input.lng,
|
snakemake.input.gem,
|
||||||
snakemake.input.entry,
|
snakemake.input.entry,
|
||||||
snakemake.input.production,
|
snakemake.input.storage,
|
||||||
countries,
|
countries,
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -117,8 +162,8 @@ if __name__ == "__main__":
|
|||||||
gas_input_nodes.to_file(snakemake.output.gas_input_nodes, driver="GeoJSON")
|
gas_input_nodes.to_file(snakemake.output.gas_input_nodes, driver="GeoJSON")
|
||||||
|
|
||||||
gas_input_nodes_s = (
|
gas_input_nodes_s = (
|
||||||
gas_input_nodes.groupby(["bus", "type"])["p_nom"].sum().unstack()
|
gas_input_nodes.groupby(["bus", "type"])["capacity"].sum().unstack()
|
||||||
)
|
)
|
||||||
gas_input_nodes_s.columns.name = "p_nom"
|
gas_input_nodes_s.columns.name = "capacity"
|
||||||
|
|
||||||
gas_input_nodes_s.to_csv(snakemake.output.gas_input_nodes_simplified)
|
gas_input_nodes_s.to_csv(snakemake.output.gas_input_nodes_simplified)
|
||||||
|
@ -454,10 +454,11 @@ def add_carrier_buses(n, carrier, nodes=None):
|
|||||||
n.add("Carrier", carrier)
|
n.add("Carrier", carrier)
|
||||||
|
|
||||||
unit = "MWh_LHV" if carrier == "gas" else "MWh_th"
|
unit = "MWh_LHV" if carrier == "gas" else "MWh_th"
|
||||||
|
# preliminary value for non-gas carriers to avoid zeros
|
||||||
|
capital_cost = costs.at["gas storage", "fixed"] if carrier == "gas" else 0.02
|
||||||
|
|
||||||
n.madd("Bus", nodes, location=location, carrier=carrier, unit=unit)
|
n.madd("Bus", nodes, location=location, carrier=carrier, unit=unit)
|
||||||
|
|
||||||
# capital cost could be corrected to e.g. 0.2 EUR/kWh * annuity and O&M
|
|
||||||
n.madd(
|
n.madd(
|
||||||
"Store",
|
"Store",
|
||||||
nodes + " Store",
|
nodes + " Store",
|
||||||
@ -465,8 +466,7 @@ def add_carrier_buses(n, carrier, nodes=None):
|
|||||||
e_nom_extendable=True,
|
e_nom_extendable=True,
|
||||||
e_cyclic=True,
|
e_cyclic=True,
|
||||||
carrier=carrier,
|
carrier=carrier,
|
||||||
capital_cost=0.2
|
capital_cost=capital_cost,
|
||||||
* costs.at[carrier, "discount rate"], # preliminary value to avoid zeros
|
|
||||||
)
|
)
|
||||||
|
|
||||||
n.madd(
|
n.madd(
|
||||||
@ -1162,7 +1162,7 @@ def add_storage_and_grids(n, costs):
|
|||||||
|
|
||||||
if options["gas_network"]:
|
if options["gas_network"]:
|
||||||
logger.info(
|
logger.info(
|
||||||
"Add natural gas infrastructure, incl. LNG terminals, production and entry-points."
|
"Add natural gas infrastructure, incl. LNG terminals, production, storage and entry-points."
|
||||||
)
|
)
|
||||||
|
|
||||||
if options["H2_retrofit"]:
|
if options["H2_retrofit"]:
|
||||||
@ -1207,10 +1207,25 @@ def add_storage_and_grids(n, costs):
|
|||||||
remove_i = n.generators[gas_i & internal_i].index
|
remove_i = n.generators[gas_i & internal_i].index
|
||||||
n.generators.drop(remove_i, inplace=True)
|
n.generators.drop(remove_i, inplace=True)
|
||||||
|
|
||||||
p_nom = gas_input_nodes.sum(axis=1).rename(lambda x: x + " gas")
|
input_types = ["lng", "pipeline", "production"]
|
||||||
|
p_nom = gas_input_nodes[input_types].sum(axis=1).rename(lambda x: x + " gas")
|
||||||
n.generators.loc[gas_i, "p_nom_extendable"] = False
|
n.generators.loc[gas_i, "p_nom_extendable"] = False
|
||||||
n.generators.loc[gas_i, "p_nom"] = p_nom
|
n.generators.loc[gas_i, "p_nom"] = p_nom
|
||||||
|
|
||||||
|
# add existing gas storage capacity
|
||||||
|
gas_i = n.stores.carrier == "gas"
|
||||||
|
e_nom = (
|
||||||
|
gas_input_nodes["storage"]
|
||||||
|
.rename(lambda x: x + " gas Store")
|
||||||
|
.reindex(n.stores.index)
|
||||||
|
.fillna(0.0)
|
||||||
|
* 1e3
|
||||||
|
) # MWh_LHV
|
||||||
|
e_nom.clip(
|
||||||
|
upper=e_nom.quantile(0.98), inplace=True
|
||||||
|
) # limit extremely large storage
|
||||||
|
n.stores.loc[gas_i, "e_nom_min"] = e_nom
|
||||||
|
|
||||||
# add candidates for new gas pipelines to achieve full connectivity
|
# add candidates for new gas pipelines to achieve full connectivity
|
||||||
|
|
||||||
G = nx.Graph()
|
G = nx.Graph()
|
||||||
@ -1345,6 +1360,7 @@ def add_storage_and_grids(n, costs):
|
|||||||
bus2=spatial.co2.nodes,
|
bus2=spatial.co2.nodes,
|
||||||
p_nom_extendable=True,
|
p_nom_extendable=True,
|
||||||
carrier="Sabatier",
|
carrier="Sabatier",
|
||||||
|
p_min_pu=options.get("min_part_load_methanation", 0),
|
||||||
efficiency=costs.at["methanation", "efficiency"],
|
efficiency=costs.at["methanation", "efficiency"],
|
||||||
efficiency2=-costs.at["methanation", "efficiency"]
|
efficiency2=-costs.at["methanation", "efficiency"]
|
||||||
* costs.at["gas", "CO2 intensity"],
|
* costs.at["gas", "CO2 intensity"],
|
||||||
@ -2331,6 +2347,7 @@ def add_biomass(n, costs):
|
|||||||
efficiency=costs.at["biomass boiler", "efficiency"],
|
efficiency=costs.at["biomass boiler", "efficiency"],
|
||||||
capital_cost=costs.at["biomass boiler", "efficiency"]
|
capital_cost=costs.at["biomass boiler", "efficiency"]
|
||||||
* costs.at["biomass boiler", "fixed"],
|
* costs.at["biomass boiler", "fixed"],
|
||||||
|
marginal_cost=costs.at["biomass boiler", "pelletizing cost"],
|
||||||
lifetime=costs.at["biomass boiler", "lifetime"],
|
lifetime=costs.at["biomass boiler", "lifetime"],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -2973,8 +2990,13 @@ def add_waste_heat(n):
|
|||||||
if not urban_central.empty:
|
if not urban_central.empty:
|
||||||
urban_central = urban_central.str[: -len(" urban central heat")]
|
urban_central = urban_central.str[: -len(" urban central heat")]
|
||||||
|
|
||||||
|
link_carriers = n.links.carrier.unique()
|
||||||
|
|
||||||
# TODO what is the 0.95 and should it be a config option?
|
# TODO what is the 0.95 and should it be a config option?
|
||||||
if options["use_fischer_tropsch_waste_heat"]:
|
if (
|
||||||
|
options["use_fischer_tropsch_waste_heat"]
|
||||||
|
and "Fischer-Tropsch" in link_carriers
|
||||||
|
):
|
||||||
n.links.loc[urban_central + " Fischer-Tropsch", "bus3"] = (
|
n.links.loc[urban_central + " Fischer-Tropsch", "bus3"] = (
|
||||||
urban_central + " urban central heat"
|
urban_central + " urban central heat"
|
||||||
)
|
)
|
||||||
@ -2982,8 +3004,48 @@ def add_waste_heat(n):
|
|||||||
0.95 - n.links.loc[urban_central + " Fischer-Tropsch", "efficiency"]
|
0.95 - n.links.loc[urban_central + " Fischer-Tropsch", "efficiency"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if options["use_methanation_waste_heat"] and "Sabatier" in link_carriers:
|
||||||
|
n.links.loc[urban_central + " Sabatier", "bus3"] = (
|
||||||
|
urban_central + " urban central heat"
|
||||||
|
)
|
||||||
|
n.links.loc[urban_central + " Sabatier", "efficiency3"] = (
|
||||||
|
0.95 - n.links.loc[urban_central + " Sabatier", "efficiency"]
|
||||||
|
)
|
||||||
|
|
||||||
|
# DEA quotes 15% of total input (11% of which are high-value heat)
|
||||||
|
if options["use_haber_bosch_waste_heat"] and "Haber-Bosch" in link_carriers:
|
||||||
|
n.links.loc[urban_central + " Haber-Bosch", "bus3"] = (
|
||||||
|
urban_central + " urban central heat"
|
||||||
|
)
|
||||||
|
total_energy_input = (
|
||||||
|
cf_industry["MWh_H2_per_tNH3_electrolysis"]
|
||||||
|
+ cf_industry["MWh_elec_per_tNH3_electrolysis"]
|
||||||
|
) / cf_industry["MWh_NH3_per_tNH3"]
|
||||||
|
electricity_input = (
|
||||||
|
cf_industry["MWh_elec_per_tNH3_electrolysis"]
|
||||||
|
/ cf_industry["MWh_NH3_per_tNH3"]
|
||||||
|
)
|
||||||
|
n.links.loc[urban_central + " Haber-Bosch", "efficiency3"] = (
|
||||||
|
0.15 * total_energy_input / electricity_input
|
||||||
|
)
|
||||||
|
|
||||||
|
if (
|
||||||
|
options["use_methanolisation_waste_heat"]
|
||||||
|
and "methanolisation" in link_carriers
|
||||||
|
):
|
||||||
|
n.links.loc[urban_central + " methanolisation", "bus4"] = (
|
||||||
|
urban_central + " urban central heat"
|
||||||
|
)
|
||||||
|
n.links.loc[urban_central + " methanolisation", "efficiency4"] = (
|
||||||
|
costs.at["methanolisation", "heat-output"]
|
||||||
|
/ costs.at["methanolisation", "hydrogen-input"]
|
||||||
|
)
|
||||||
|
|
||||||
# TODO integrate usable waste heat efficiency into technology-data from DEA
|
# TODO integrate usable waste heat efficiency into technology-data from DEA
|
||||||
if options.get("use_electrolysis_waste_heat", False):
|
if (
|
||||||
|
options.get("use_electrolysis_waste_heat", False)
|
||||||
|
and "H2 Electrolysis" in link_carriers
|
||||||
|
):
|
||||||
n.links.loc[urban_central + " H2 Electrolysis", "bus2"] = (
|
n.links.loc[urban_central + " H2 Electrolysis", "bus2"] = (
|
||||||
urban_central + " urban central heat"
|
urban_central + " urban central heat"
|
||||||
)
|
)
|
||||||
@ -2991,7 +3053,7 @@ def add_waste_heat(n):
|
|||||||
0.84 - n.links.loc[urban_central + " H2 Electrolysis", "efficiency"]
|
0.84 - n.links.loc[urban_central + " H2 Electrolysis", "efficiency"]
|
||||||
)
|
)
|
||||||
|
|
||||||
if options["use_fuel_cell_waste_heat"]:
|
if options["use_fuel_cell_waste_heat"] and "H2 Fuel Cell" in link_carriers:
|
||||||
n.links.loc[urban_central + " H2 Fuel Cell", "bus2"] = (
|
n.links.loc[urban_central + " H2 Fuel Cell", "bus2"] = (
|
||||||
urban_central + " urban central heat"
|
urban_central + " urban central heat"
|
||||||
)
|
)
|
||||||
@ -3478,6 +3540,15 @@ if __name__ == "__main__":
|
|||||||
if "nodistrict" in opts:
|
if "nodistrict" in opts:
|
||||||
options["district_heating"]["progress"] = 0.0
|
options["district_heating"]["progress"] = 0.0
|
||||||
|
|
||||||
|
if "nowasteheat" in opts:
|
||||||
|
logger.info("Disabling waste heat.")
|
||||||
|
options["use_fischer_tropsch_waste_heat"] = False
|
||||||
|
options["use_methanolisation_waste_heat"] = False
|
||||||
|
options["use_haber_bosch_waste_heat"] = False
|
||||||
|
options["use_methanation_waste_heat"] = False
|
||||||
|
options["use_fuel_cell_waste_heat"] = False
|
||||||
|
options["use_electrolysis_waste_heat"] = False
|
||||||
|
|
||||||
if "T" in opts:
|
if "T" in opts:
|
||||||
add_land_transport(n, costs)
|
add_land_transport(n, costs)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user