add ammonia as carrier: with Haber-Bosch, crackers, store, load
This commit is contained in:
parent
8dfd8b5a7f
commit
6cfee1f98a
@ -244,6 +244,7 @@ sector:
|
|||||||
# - onshore # more than 50 km from sea
|
# - onshore # more than 50 km from sea
|
||||||
- nearshore # within 50 km of sea
|
- nearshore # within 50 km of sea
|
||||||
# - offshore
|
# - offshore
|
||||||
|
ammonia: false
|
||||||
use_fischer_tropsch_waste_heat: true
|
use_fischer_tropsch_waste_heat: true
|
||||||
use_fuel_cell_waste_heat: true
|
use_fuel_cell_waste_heat: true
|
||||||
electricity_distribution_grid: true
|
electricity_distribution_grid: true
|
||||||
@ -291,6 +292,7 @@ industry:
|
|||||||
# 2040: 0.3
|
# 2040: 0.3
|
||||||
# 2045: 0.25
|
# 2045: 0.25
|
||||||
# 2050: 0.2
|
# 2050: 0.2
|
||||||
|
MWh_NH3_per_tNH3: 5.166 # LHV
|
||||||
MWh_CH4_per_tNH3_SMR: 10.8 # 2012's demand from https://ec.europa.eu/docsroom/documents/4165/attachments/1/translations/en/renditions/pdf
|
MWh_CH4_per_tNH3_SMR: 10.8 # 2012's demand from https://ec.europa.eu/docsroom/documents/4165/attachments/1/translations/en/renditions/pdf
|
||||||
MWh_elec_per_tNH3_SMR: 0.7 # same source, assuming 94-6% split methane-elec of total energy demand 11.5 MWh/tNH3
|
MWh_elec_per_tNH3_SMR: 0.7 # same source, assuming 94-6% split methane-elec of total energy demand 11.5 MWh/tNH3
|
||||||
MWh_H2_per_tNH3_electrolysis: 6.5 # from https://doi.org/10.1016/j.joule.2018.04.017, around 0.197 tH2/tHN3 (>3/17 since some H2 lost and used for energy)
|
MWh_H2_per_tNH3_electrolysis: 6.5 # from https://doi.org/10.1016/j.joule.2018.04.017, around 0.197 tH2/tHN3 (>3/17 since some H2 lost and used for energy)
|
||||||
|
@ -65,6 +65,8 @@ def industrial_energy_demand_per_country(country):
|
|||||||
|
|
||||||
df = df_dict[sheet][year].groupby(fuels).sum()
|
df = df_dict[sheet][year].groupby(fuels).sum()
|
||||||
|
|
||||||
|
df["ammonia"] = 0.
|
||||||
|
|
||||||
df['other'] = df['all'] - df.loc[df.index != 'all'].sum()
|
df['other'] = df['all'] - df.loc[df.index != 'all'].sum()
|
||||||
|
|
||||||
return df
|
return df
|
||||||
@ -89,18 +91,21 @@ def add_ammonia_energy_demand(demand):
|
|||||||
fn = snakemake.input.ammonia_production
|
fn = snakemake.input.ammonia_production
|
||||||
ammonia = pd.read_csv(fn, index_col=0)[str(year)] / 1e3
|
ammonia = pd.read_csv(fn, index_col=0)[str(year)] / 1e3
|
||||||
|
|
||||||
def ammonia_by_fuel(x):
|
def get_ammonia_by_fuel(x):
|
||||||
|
|
||||||
fuels = {'gas': config['MWh_CH4_per_tNH3_SMR'],
|
fuels = {'gas': config['MWh_CH4_per_tNH3_SMR'],
|
||||||
'electricity': config['MWh_elec_per_tNH3_SMR']}
|
'electricity': config['MWh_elec_per_tNH3_SMR']}
|
||||||
|
|
||||||
return pd.Series({k: x*v for k,v in fuels.items()})
|
return pd.Series({k: x*v for k,v in fuels.items()})
|
||||||
|
|
||||||
ammonia = ammonia.apply(ammonia_by_fuel).T
|
ammonia_by_fuel = ammonia.apply(get_ammonia_by_fuel).T
|
||||||
|
ammonia_by_fuel = ammonia_by_fuel.unstack().reindex(index=demand.index, fill_value=0.)
|
||||||
|
|
||||||
|
ammonia = pd.DataFrame({"ammonia": ammonia * config['MWh_NH3_per_tNH3']}).T
|
||||||
|
|
||||||
demand['Ammonia'] = ammonia.unstack().reindex(index=demand.index, fill_value=0.)
|
demand['Ammonia'] = ammonia.unstack().reindex(index=demand.index, fill_value=0.)
|
||||||
|
|
||||||
demand['Basic chemicals (without ammonia)'] = demand["Basic chemicals"] - demand["Ammonia"]
|
demand['Basic chemicals (without ammonia)'] = demand["Basic chemicals"] - ammonia_by_fuel
|
||||||
|
|
||||||
demand['Basic chemicals (without ammonia)'].clip(lower=0, inplace=True)
|
demand['Basic chemicals (without ammonia)'].clip(lower=0, inplace=True)
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ if __name__ == '__main__':
|
|||||||
'build_industrial_energy_demand_per_node',
|
'build_industrial_energy_demand_per_node',
|
||||||
simpl='',
|
simpl='',
|
||||||
clusters=48,
|
clusters=48,
|
||||||
|
planning_horizons=2030,
|
||||||
)
|
)
|
||||||
|
|
||||||
# import EU ratios df as csv
|
# import EU ratios df as csv
|
||||||
|
@ -60,6 +60,7 @@ index = [
|
|||||||
"hydrogen",
|
"hydrogen",
|
||||||
"heat",
|
"heat",
|
||||||
"naphtha",
|
"naphtha",
|
||||||
|
"ammonia",
|
||||||
"process emission",
|
"process emission",
|
||||||
"process emission from feedstock",
|
"process emission from feedstock",
|
||||||
]
|
]
|
||||||
@ -432,8 +433,11 @@ def chemicals_industry():
|
|||||||
|
|
||||||
sector = "Ammonia"
|
sector = "Ammonia"
|
||||||
df[sector] = 0.0
|
df[sector] = 0.0
|
||||||
df.loc["hydrogen", sector] = config["MWh_H2_per_tNH3_electrolysis"]
|
if snakemake.config["sector"].get("ammonia", False):
|
||||||
df.loc["elec", sector] = config["MWh_elec_per_tNH3_electrolysis"]
|
df.loc["ammonia", sector] = config["MWh_NH3_per_tNH3"]
|
||||||
|
else:
|
||||||
|
df.loc["hydrogen", sector] = config["MWh_H2_per_tNH3_electrolysis"]
|
||||||
|
df.loc["elec", sector] = config["MWh_elec_per_tNH3_electrolysis"]
|
||||||
|
|
||||||
# Chlorine
|
# Chlorine
|
||||||
|
|
||||||
|
@ -654,6 +654,59 @@ def add_generation(n, costs):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def add_ammonia(n, costs):
|
||||||
|
|
||||||
|
logger.info("adding ammonia carrier")
|
||||||
|
|
||||||
|
nodes = pop_layout.index
|
||||||
|
|
||||||
|
n.add("Carrier", "NH3")
|
||||||
|
|
||||||
|
n.madd("Bus",
|
||||||
|
nodes + " NH3",
|
||||||
|
location=nodes,
|
||||||
|
carrier="NH3"
|
||||||
|
)
|
||||||
|
|
||||||
|
n.madd("Link",
|
||||||
|
nodes,
|
||||||
|
suffix=" Haber-Bosch",
|
||||||
|
bus0=nodes,
|
||||||
|
bus1=nodes + " NH3",
|
||||||
|
bus2=nodes + " H2",
|
||||||
|
p_nom_extendable=True,
|
||||||
|
carrier="Haber-Bosch",
|
||||||
|
efficiency=+0.221, #MWh_e/MWh_NH3 0.247 https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv
|
||||||
|
efficiency2=-1.226, #MWh_H2/MWh_NH3 1.148 https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv
|
||||||
|
capital_cost=costs.at["Haber-Bosch synthesis", "fixed"],
|
||||||
|
lifetime=costs.at["Haber-Bosch synthesis", 'lifetime']
|
||||||
|
)
|
||||||
|
|
||||||
|
n.madd("Link",
|
||||||
|
nodes,
|
||||||
|
suffix=" ammonia cracker",
|
||||||
|
bus0=nodes + " NH3",
|
||||||
|
bus1=nodes + " H2",
|
||||||
|
p_nom_extendable=True,
|
||||||
|
carrier ="ammonia cracker",
|
||||||
|
efficiency=0.685, #MWh_H2/MWh_NH3 https://github.com/euronion/trace/blob/44a5ff8401762edbef80eff9cfe5a47c8d3c8be4/data/efficiencies.csv
|
||||||
|
capital_cost=costs.at["Ammonia cracker", "fixed"] * 0.685, # given per MWh_H2
|
||||||
|
lifetime=costs.at['Ammonia cracker', 'lifetime']
|
||||||
|
)
|
||||||
|
|
||||||
|
# Ammonia Storage
|
||||||
|
n.madd("Store",
|
||||||
|
nodes,
|
||||||
|
suffix=" ammonia store",
|
||||||
|
bus=nodes + " NH3",
|
||||||
|
e_nom_extendable=True,
|
||||||
|
e_cyclic=True,
|
||||||
|
carrier="ammonia store",
|
||||||
|
capital_cost=costs.at["NH3 (l) storage tank incl. liquefaction", "fixed"],
|
||||||
|
lifetime=costs.at['NH3 (l) storage tank incl. liquefaction', 'lifetime']
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def add_wave(n, wave_cost_factor):
|
def add_wave(n, wave_cost_factor):
|
||||||
|
|
||||||
# TODO: handle in Snakefile
|
# TODO: handle in Snakefile
|
||||||
@ -2148,6 +2201,15 @@ def add_industry(n, costs):
|
|||||||
lifetime=costs.at['cement capture', 'lifetime']
|
lifetime=costs.at['cement capture', 'lifetime']
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if options["ammonia"]:
|
||||||
|
n.madd("Load",
|
||||||
|
nodes,
|
||||||
|
suffix=" NH3",
|
||||||
|
bus=nodes + " NH3",
|
||||||
|
carrier="NH3",
|
||||||
|
p_set=industrial_demand.loc[nodes, "ammonia"] / 8760
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def add_waste_heat(n):
|
def add_waste_heat(n):
|
||||||
# TODO options?
|
# TODO options?
|
||||||
@ -2377,6 +2439,9 @@ if __name__ == "__main__":
|
|||||||
if options['dac']:
|
if options['dac']:
|
||||||
add_dac(n, costs)
|
add_dac(n, costs)
|
||||||
|
|
||||||
|
if options['ammonia']:
|
||||||
|
add_ammonia(n, costs)
|
||||||
|
|
||||||
if "decentral" in opts:
|
if "decentral" in opts:
|
||||||
decentral(n)
|
decentral(n)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user