Merge remote-tracking branch 'origin/master' into dh-share
This commit is contained in:
commit
9d8827bf59
@ -181,7 +181,7 @@ sector:
|
|||||||
transport_fuel_cell_efficiency: 0.5
|
transport_fuel_cell_efficiency: 0.5
|
||||||
transport_internal_combustion_efficiency: 0.3
|
transport_internal_combustion_efficiency: 0.3
|
||||||
shipping_average_efficiency: 0.4 #For conversion of fuel oil to propulsion in 2011
|
shipping_average_efficiency: 0.4 #For conversion of fuel oil to propulsion in 2011
|
||||||
shipping_hydrogen_liquefaction: true # whether to consider liquefaction costs for shipping H2 demands
|
shipping_hydrogen_liquefaction: false # whether to consider liquefaction costs for shipping H2 demands
|
||||||
shipping_hydrogen_share: # 1 means all hydrogen FC
|
shipping_hydrogen_share: # 1 means all hydrogen FC
|
||||||
2020: 0
|
2020: 0
|
||||||
2025: 0
|
2025: 0
|
||||||
@ -278,9 +278,23 @@ 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_mechanical_recycling_fraction: 0. # fraction of today's HVC produced via mechanical recycling
|
||||||
|
HVC_chemical_recycling_fraction: 0. # fraction of today's HVC produced via chemical recycling
|
||||||
|
HVC_production_today: 52. # MtHVC/a from DECHEMA (2017), Figure 16, page 107; includes ethylene, propylene and BTX
|
||||||
|
MWh_elec_per_tHVC_mechanical_recycling: 0.547 # from SI of https://doi.org/10.1016/j.resconrec.2020.105010, Table S5, for HDPE, PP, PS, PET. LDPE would be 0.756.
|
||||||
|
MWh_elec_per_tHVC_chemical_recycling: 6.9 # Material Economics (2019), page 125; based on pyrolysis and electric steam cracking
|
||||||
|
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
|
||||||
|
# Material Economics (2019): https://materialeconomics.com/latest-updates/industrial-transformation-2050
|
||||||
|
|
||||||
costs:
|
costs:
|
||||||
lifetime: 25 #default lifetime
|
lifetime: 25 #default lifetime
|
||||||
|
@ -83,6 +83,8 @@ Future release
|
|||||||
in the new optional rule ``build_biomass_transport_costs``.
|
in the new optional rule ``build_biomass_transport_costs``.
|
||||||
Biomass transport can be activated with the setting ``sector: biomass_transport: true``.
|
Biomass transport can be activated with the setting ``sector: biomass_transport: true``.
|
||||||
* Compatibility with ``xarray`` version 0.19.
|
* Compatibility with ``xarray`` version 0.19.
|
||||||
|
* Separate basic chemicals into HVC, chlorine, methanol and ammonia [`#166 <https://github.com/PyPSA/PyPSA-Eur-Sec/pull/166>`_].
|
||||||
|
* Add option to specify reuse, primary production, and mechanical and chemical recycling fraction of platics [`#166 <https://github.com/PyPSA/PyPSA-Eur-Sec/pull/166>`_].
|
||||||
|
|
||||||
PyPSA-Eur-Sec 0.5.0 (21st May 2021)
|
PyPSA-Eur-Sec 0.5.0 (21st May 2021)
|
||||||
===================================
|
===================================
|
||||||
|
@ -103,6 +103,7 @@ def add_ammonia_energy_demand(demand):
|
|||||||
demand['Basic chemicals (without ammonia)'] = demand["Basic chemicals"] - demand["Ammonia"]
|
demand['Basic chemicals (without ammonia)'] = demand["Basic chemicals"] - demand["Ammonia"]
|
||||||
|
|
||||||
demand['Basic chemicals (without ammonia)'].clip(lower=0, inplace=True)
|
demand['Basic chemicals (without ammonia)'].clip(lower=0, inplace=True)
|
||||||
|
|
||||||
demand.drop(columns='Basic chemicals', inplace=True)
|
demand.drop(columns='Basic chemicals', inplace=True)
|
||||||
|
|
||||||
return demand
|
return demand
|
||||||
@ -114,6 +115,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
|
||||||
|
@ -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."""
|
"""Separate basic chemicals into ammonia, chlorine, methanol and HVC."""
|
||||||
|
|
||||||
ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0)
|
ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0)
|
||||||
|
|
||||||
@ -189,7 +189,7 @@ def add_ammonia_demand_separately(demand):
|
|||||||
|
|
||||||
print("Following countries have no ammonia demand:", missing)
|
print("Following countries have no ammonia demand:", missing)
|
||||||
|
|
||||||
demand.insert(2, "Ammonia", 0.)
|
demand["Ammonia"] = 0.
|
||||||
|
|
||||||
demand.loc[there, "Ammonia"] = ammonia.loc[there, str(year)]
|
demand.loc[there, "Ammonia"] = ammonia.loc[there, str(year)]
|
||||||
|
|
||||||
@ -198,9 +198,13 @@ 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)"}
|
# assume HVC, methanol, chlorine production proportional to non-ammonia basic chemicals
|
||||||
demand.rename(columns=to_rename, inplace=True)
|
distribution_key = demand["Basic chemicals"] / demand["Basic chemicals"].sum()
|
||||||
|
demand["HVC"] = config["HVC_production_today"] * 1e3 * distribution_key
|
||||||
|
demand["Chlorine"] = config["chlorine_production_today"] * 1e3 * distribution_key
|
||||||
|
demand["Methanol"] = config["methanol_production_today"] * 1e3 * distribution_key
|
||||||
|
|
||||||
|
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 +215,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')
|
||||||
|
@ -43,7 +43,10 @@ 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 (mechanical recycling)"] = get(config["HVC_mechanical_recycling_fraction"], investment_year) * production["HVC"]
|
||||||
|
production["HVC (chemical recycling)"] = get(config["HVC_chemical_recycling_fraction"], investment_year) * production["HVC"]
|
||||||
|
|
||||||
|
production["HVC"] *= get(config['HVC_primary_fraction'], investment_year)
|
||||||
|
|
||||||
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')
|
||||||
|
@ -9,7 +9,11 @@ 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',
|
||||||
|
'HVC (mechanical recycling)': 'Chemical industry',
|
||||||
|
'HVC (chemical recycling)': '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',
|
||||||
|
@ -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,82 @@ 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 (in ktNH3/a)
|
||||||
|
ammonia = pd.read_csv(snakemake.input.ammonia_production, index_col=0)
|
||||||
|
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
|
||||||
df.rename(columns=to_rename, inplace=True)
|
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
|
||||||
|
|
||||||
|
df.rename(columns={sector: "HVC"}, inplace=True)
|
||||||
|
|
||||||
|
# HVC mechanical recycling
|
||||||
|
|
||||||
|
sector = "HVC (mechanical recycling)"
|
||||||
|
df[sector] = 0.0
|
||||||
|
df.loc["elec", sector] = config["MWh_elec_per_tHVC_mechanical_recycling"]
|
||||||
|
|
||||||
|
# HVC chemical recycling
|
||||||
|
|
||||||
|
sector = "HVC (chemical recycling)"
|
||||||
|
df[sector] = 0.0
|
||||||
|
df.loc["elec", sector] = config["MWh_elec_per_tHVC_chemical_recycling"]
|
||||||
|
|
||||||
# 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"
|
||||||
|
Loading…
Reference in New Issue
Block a user