industry: separate HVC, methanol and chlorine from basic chemicals

This commit is contained in:
Tom Brown 2021-09-24 13:00:58 +02:00
parent c4d4e88ba2
commit fbccd5fbc0
6 changed files with 74 additions and 30 deletions

View File

@ -270,10 +270,18 @@ industry:
MWh_elec_per_tNH3_electrolysis: 1.17 # from https://doi.org/10.1016/j.joule.2018.04.017 Table 13 (air separation and HB) MWh_elec_per_tNH3_electrolysis: 1.17 # from https://doi.org/10.1016/j.joule.2018.04.017 Table 13 (air separation and HB)
NH3_process_emissions: 24.5 # in MtCO2/a from SMR for H2 production for NH3 from UNFCCC for 2015 for EU28 NH3_process_emissions: 24.5 # in MtCO2/a from SMR for H2 production for NH3 from UNFCCC for 2015 for EU28
petrochemical_process_emissions: 25.5 # in MtCO2/a for petrochemical and other from UNFCCC for 2015 for EU28 petrochemical_process_emissions: 25.5 # in MtCO2/a for petrochemical and other from UNFCCC for 2015 for EU28
HVC_primary_fraction: 1.0 #fraction of current non-ammonia basic chemicals produced via primary route HVC_primary_fraction: 1. # fraction of today's HVC produced via primary route
HVC_production_today: 52. # MtHVC/a from DECHEMA (2017), Figure 16, page 107; includes ethylene, propylene and BTX
chlorine_production_today: 9.58 # MtCl/a from DECHEMA (2017), Table 7, page 43
MWh_elec_per_tCl: 3.6 # DECHEMA (2017), Table 6, page 43
MWh_H2_per_tCl: -0.9372 # DECHEMA (2017), page 43; negative since hydrogen produced in chloralkali process
methanol_production_today: 1.5 # MtMeOH/a from DECHEMA (2017), page 62
MWh_elec_per_tMeOH: 0.167 # DECHEMA (2017), Table 14, page 65
MWh_CH4_per_tMeOH: 10.25 # DECHEMA (2017), Table 14, page 65
hotmaps_locate_missing: false hotmaps_locate_missing: false
reference_year: 2015 reference_year: 2015
# references:
# DECHEMA (2017): https://dechema.de/dechema_media/Downloads/Positionspapiere/Technology_study_Low_carbon_energy_and_feedstock_for_the_European_chemical_industry-p-20002750.pdf
costs: costs:
lifetime: 25 #default lifetime lifetime: 25 #default lifetime

View File

@ -114,6 +114,11 @@ def add_non_eu28_industrial_energy_demand(demand):
fn = snakemake.input.industrial_production_per_country fn = snakemake.input.industrial_production_per_country
production = pd.read_csv(fn, index_col=0) / 1e3 production = pd.read_csv(fn, index_col=0) / 1e3
#recombine HVC, Chlorine and Methanol to Basic chemicals (without ammonia)
chemicals = ["HVC", "Chlorine", "Methanol"]
production["Basic chemicals (without ammonia)"] = production[chemicals].sum(axis=1)
production.drop(columns=chemicals, inplace=True)
eu28_production = production.loc[eu28].sum() eu28_production = production.loc[eu28].sum()
eu28_energy = demand.groupby(level=1).sum() eu28_energy = demand.groupby(level=1).sum()
eu28_averages = eu28_energy / eu28_production eu28_averages = eu28_energy / eu28_production

View File

@ -179,8 +179,8 @@ def industry_production(countries):
return demand return demand
def add_ammonia_demand_separately(demand): def separate_basic_chemicals(demand):
"""Include ammonia demand separately and remove ammonia from basic chemicals.""" """Remove ammonia, chlorine and methanol from basic chemicals to get HVC."""
ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0) ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0)
@ -198,9 +198,16 @@ def add_ammonia_demand_separately(demand):
# EE, HR and LT got negative demand through subtraction - poor data # EE, HR and LT got negative demand through subtraction - poor data
demand['Basic chemicals'].clip(lower=0., inplace=True) demand['Basic chemicals'].clip(lower=0., inplace=True)
to_rename = {"Basic chemicals": "Basic chemicals (without ammonia)"} demand.insert(2, "HVC", 0.)
demand.rename(columns=to_rename, inplace=True) demand.insert(3, "Chlorine", 0.)
demand.insert(4, "Methanol", 0.)
# assume HVC, methanol, chlorine production proportional to non-ammonia basic chemicals
demand["HVC"] = config["HVC_production_today"]*1e3/demand["Basic chemicals"].sum()*demand["Basic chemicals"]
demand["Chlorine"] = config["chlorine_production_today"]*1e3/demand["Basic chemicals"].sum()*demand["Basic chemicals"]
demand["Methanol"] = config["methanol_production_today"]*1e3/demand["Basic chemicals"].sum()*demand["Basic chemicals"]
demand.drop(columns=["Basic chemicals"], inplace=True)
if __name__ == '__main__': if __name__ == '__main__':
if 'snakemake' not in globals(): if 'snakemake' not in globals():
@ -211,12 +218,14 @@ if __name__ == '__main__':
year = snakemake.config['industry']['reference_year'] year = snakemake.config['industry']['reference_year']
config = snakemake.config["industry"]
jrc_dir = snakemake.input.jrc jrc_dir = snakemake.input.jrc
eurostat_dir = snakemake.input.eurostat eurostat_dir = snakemake.input.eurostat
demand = industry_production(countries) demand = industry_production(countries)
add_ammonia_demand_separately(demand) separate_basic_chemicals(demand)
fn = snakemake.output.industrial_production_per_country fn = snakemake.output.industrial_production_per_country
demand.to_csv(fn, float_format='%.2f') demand.to_csv(fn, float_format='%.2f')

View File

@ -43,7 +43,7 @@ if __name__ == '__main__':
production[key_pri] = fraction_persistent_primary * production[key_pri] production[key_pri] = fraction_persistent_primary * production[key_pri]
production[key_sec] = total_aluminium - production[key_pri] production[key_sec] = total_aluminium - production[key_pri]
production["Basic chemicals (without ammonia)"] *= config['HVC_primary_fraction'] production["HVC"] *= config['HVC_primary_fraction']
fn = snakemake.output.industrial_production_per_country_tomorrow fn = snakemake.output.industrial_production_per_country_tomorrow
production.to_csv(fn, float_format='%.2f') production.to_csv(fn, float_format='%.2f')

View File

@ -9,7 +9,9 @@ sector_mapping = {
'Integrated steelworks': 'Iron and steel', 'Integrated steelworks': 'Iron and steel',
'DRI + Electric arc': 'Iron and steel', 'DRI + Electric arc': 'Iron and steel',
'Ammonia': 'Chemical industry', 'Ammonia': 'Chemical industry',
'Basic chemicals (without ammonia)': 'Chemical industry', 'HVC': 'Chemical industry',
'Methanol': 'Chemical industry',
'Chlorine': 'Chemical industry',
'Other chemicals': 'Chemical industry', 'Other chemicals': 'Chemical industry',
'Pharmaceutical products etc.': 'Chemical industry', 'Pharmaceutical products etc.': 'Chemical industry',
'Cement': 'Cement', 'Cement': 'Cement',

View File

@ -279,7 +279,7 @@ def chemicals_industry():
df = pd.DataFrame(index=index) df = pd.DataFrame(index=index)
# Basid chemicals # Basic chemicals
sector = "Basic chemicals" sector = "Basic chemicals"
@ -374,52 +374,72 @@ def chemicals_industry():
# putting in ammonia demand for H2 and electricity separately # putting in ammonia demand for H2 and electricity separately
s_emi = idees["emi"][3:57] s_emi = idees["emi"][3:57]
s_out = idees["out"][8:9]
assert s_emi.index[0] == sector assert s_emi.index[0] == sector
assert sector in str(s_out.index)
ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0) # convert from MtHVC/a to ktHVC/a
s_out = config["HVC_production_today"]*1e3
# ktNH3/a
ammonia_total = ammonia.loc[ammonia.index.intersection(eu28), str(year)].sum()
s_out -= ammonia_total
# tCO2/t material # tCO2/t material
df.loc["process emission", sector] += ( df.loc["process emission", sector] += (
s_emi["Process emissions"] s_emi["Process emissions"]
- config["petrochemical_process_emissions"] * 1e3 - config["petrochemical_process_emissions"] * 1e3
- config["NH3_process_emissions"] * 1e3 - config["NH3_process_emissions"] * 1e3
) / s_out.values ) / s_out
# emissions originating from feedstock, could be non-fossil origin # emissions originating from feedstock, could be non-fossil origin
# tCO2/t material # tCO2/t material
df.loc["process emission from feedstock", sector] += ( df.loc["process emission from feedstock", sector] += (
config["petrochemical_process_emissions"] * 1e3 config["petrochemical_process_emissions"] * 1e3
) / s_out.values ) / s_out
# convert from ktoe/a to GWh/a # convert from ktoe/a to GWh/a
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"] sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
df.loc[sources, sector] *= toe_to_MWh df.loc[sources, sector] *= toe_to_MWh
# subtract ammonia energy demand
ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0)
# ktNH3/a
ammonia_total = ammonia.loc[ammonia.index.intersection(eu28), str(year)].sum()
df.loc["methane", sector] -= ammonia_total * config["MWh_CH4_per_tNH3_SMR"] df.loc["methane", sector] -= ammonia_total * config["MWh_CH4_per_tNH3_SMR"]
df.loc["elec", sector] -= ammonia_total * config["MWh_elec_per_tNH3_SMR"] df.loc["elec", sector] -= ammonia_total * config["MWh_elec_per_tNH3_SMR"]
# MWh/t material # subtract chlorine demand
df.loc[sources, sector] = df.loc[sources, sector] / s_out.values chlorine_total = config["chlorine_production_today"]
df.loc["hydrogen", sector] -= chlorine_total * config["MWh_H2_per_tCl"]
df.loc["elec", sector] -= chlorine_total * config["MWh_elec_per_tCl"]
to_rename = {sector: f"{sector} (without ammonia)"} # subtract methanol demand
methanol_total = config["methanol_production_today"]
df.loc["methane", sector] -= methanol_total * config["MWh_CH4_per_tMeOH"]
df.loc["elec", sector] -= methanol_total * config["MWh_elec_per_tMeOH"]
# MWh/t material
df.loc[sources, sector] = df.loc[sources, sector] / s_out
to_rename = {sector: "HVC"}
df.rename(columns=to_rename, inplace=True) df.rename(columns=to_rename, inplace=True)
# Ammonia # Ammonia
sector = "Ammonia" sector = "Ammonia"
df[sector] = 0.0 df[sector] = 0.0
df.loc["hydrogen", sector] = config["MWh_H2_per_tNH3_electrolysis"] df.loc["hydrogen", sector] = config["MWh_H2_per_tNH3_electrolysis"]
df.loc["elec", sector] = config["MWh_elec_per_tNH3_electrolysis"] df.loc["elec", sector] = config["MWh_elec_per_tNH3_electrolysis"]
# Chlorine
sector = "Chlorine"
df[sector] = 0.0
df.loc["hydrogen", sector] = config["MWh_H2_per_tCl"]
df.loc["elec", sector] = config["MWh_elec_per_tCl"]
# Methanol
sector = "Methanol"
df[sector] = 0.0
df.loc["methane", sector] = config["MWh_CH4_per_tMeOH"]
df.loc["elec", sector] = config["MWh_elec_per_tMeOH"]
# Other chemicals # Other chemicals
sector = "Other chemicals" sector = "Other chemicals"