1561 lines
47 KiB
Python
1561 lines
47 KiB
Python
# -*- coding: utf-8 -*-
|
|
# SPDX-FileCopyrightText: : 2020-2024 The PyPSA-Eur Authors
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
"""
|
|
Build best case specific energy consumption by carrier and category.
|
|
|
|
Relevant Settings
|
|
-----------------
|
|
|
|
.. code:: yaml
|
|
|
|
industry:
|
|
ammonia:
|
|
..
|
|
|
|
Inputs
|
|
-------
|
|
- ``resources/ammonia_production.csv``
|
|
- ``data/bundle-sector/jrc-idees-2021``
|
|
|
|
Outputs
|
|
-------
|
|
|
|
- ``resources/industry_sector_ratios.csv``
|
|
|
|
Description
|
|
-------
|
|
|
|
This script uses the `JRC-IDEES <https://joint-research-centre.ec.europa.eu/potencia-policy-oriented-tool-energy-and-climate-change-impact-assessment/jrc-idees_en>` data to calculate an EU28 average specific energy consumption by carrier and industries.
|
|
The industries are according to the rule `industrial_production_per_country <https://pypsa-eur.readthedocs.io/en/latest/sector.html#module-build_industrial_production_per_country>`.
|
|
|
|
The following carriers are considered:
|
|
- elec
|
|
- coal
|
|
- coke
|
|
- biomass
|
|
- methane
|
|
- hydrogen
|
|
- heat
|
|
- naphtha
|
|
- process emission
|
|
- process emission from feedstock
|
|
- (ammonia)
|
|
|
|
If the `config["industry"]["ammonia"] <https://pypsa-eur.readthedocs.io/en/latest/configuration.html#industry>` is set to true the ammonia demand is not converted to hydrogen and electricity but is considered as a separate carrier.
|
|
|
|
The unit of the specific energy consumption is MWh/t material and tCO2/t material for process emissions.
|
|
"""
|
|
|
|
import country_converter as coco
|
|
import pandas as pd
|
|
from _helpers import mute_print, set_scenario_config
|
|
|
|
cc = coco.CountryConverter()
|
|
|
|
# GWh/ktoe OR MWh/toe
|
|
toe_to_MWh = 11.630
|
|
|
|
eu27 = cc.EU27as("ISO2").ISO2.tolist()
|
|
|
|
|
|
sheet_names = {
|
|
"Iron and steel": "ISI",
|
|
"Chemicals Industry": "CHI",
|
|
"Non-metallic mineral products": "NMM",
|
|
"Pulp, paper and printing": "PPA",
|
|
"Food, beverages and tobacco": "FBT",
|
|
"Non Ferrous Metals": "NFM",
|
|
"Transport equipment": "TRE",
|
|
"Machinery equipment": "MAE",
|
|
"Textiles and leather": "TEL",
|
|
"Wood and wood products": "WWP",
|
|
"Other industrial sectors": "OIS",
|
|
}
|
|
|
|
|
|
index = [
|
|
"elec",
|
|
"coal",
|
|
"coke",
|
|
"biomass",
|
|
"methane",
|
|
"hydrogen",
|
|
"heat",
|
|
"naphtha",
|
|
"ammonia",
|
|
"methanol",
|
|
"process emission",
|
|
"process emission from feedstock",
|
|
]
|
|
|
|
|
|
def load_idees_data(sector, country="EU27"):
|
|
suffixes = {"out": "", "fec": "_fec", "ued": "_ued", "emi": "_emi"}
|
|
sheets = {k: sheet_names[sector] + v for k, v in suffixes.items()}
|
|
|
|
def usecols(x):
|
|
return isinstance(x, str) or x == year
|
|
|
|
with mute_print():
|
|
idees = pd.read_excel(
|
|
f"{snakemake.input.idees}/{country}/JRC-IDEES-2021_Industry_{country}.xlsx",
|
|
sheet_name=list(sheets.values()),
|
|
index_col=0,
|
|
header=0,
|
|
usecols=usecols,
|
|
)
|
|
|
|
for k, v in sheets.items():
|
|
idees[k] = idees.pop(v).squeeze()
|
|
idees[k] = idees[k][year]
|
|
|
|
return idees
|
|
|
|
|
|
def iron_and_steel():
|
|
"""
|
|
This function calculates the energy consumption and emissions for different
|
|
approaches to producing iron and steel. The two primary approaches are
|
|
integrated steelworks and electric arc furnaces (EAF). The function assumes
|
|
that integrated steelworks will be replaced entirely by electric arc
|
|
furnaces due to their higher efficiency and greater reliance on
|
|
electricity.
|
|
|
|
Returns:
|
|
pd.DataFrame: A DataFrame containing the energy consumption (in MWh/t material)
|
|
and process emissions (in tCO2/t material) for different steel
|
|
production approaches, including electric arc, DRI + electric arc,
|
|
and integrated steelworks.
|
|
"""
|
|
|
|
sector = "Iron and steel"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
## Electric arc
|
|
|
|
sector = "Electric arc"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][52:68]
|
|
assert s_fec.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.at["elec", sector] += s_fec.loc[sel].sum()
|
|
|
|
df.at["heat", sector] += s_fec.loc["Low-enthalpy heat"]
|
|
|
|
subsector = "Steel: Smelters"
|
|
s_fec = idees["fec"][63:68]
|
|
s_ued = idees["ued"][63:68]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
# efficiency changes due to transforming all the smelters into methane
|
|
key = "Natural gas and biogas"
|
|
eff_met = s_ued.loc[key] / s_fec.loc[key]
|
|
|
|
df.at["methane", sector] += s_ued[subsector] / eff_met
|
|
|
|
subsector = "Steel: Electric arc"
|
|
s_fec = idees["fec"][69:70]
|
|
assert s_fec.index[0] == subsector
|
|
|
|
df.at["elec", sector] += s_fec[subsector]
|
|
|
|
subsector = "Steel: Furnaces, refining and rolling"
|
|
s_fec = idees["fec"][70:77]
|
|
s_ued = idees["ued"][70:77]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Steel: Furnaces, refining and rolling - Electric"
|
|
eff = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified, other processes scaled by used energy
|
|
df.at["elec", sector] += s_ued[subsector] / eff
|
|
|
|
subsector = "Steel: Product finishing"
|
|
s_fec = idees["fec"][77:95]
|
|
s_ued = idees["ued"][77:95]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Steel: Product finishing - Electric"
|
|
eff = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.at["elec", sector] += s_ued[subsector] / eff
|
|
|
|
# Process emissions (per physical output)
|
|
|
|
s_emi = idees["emi"][52:95]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][7:8]
|
|
assert s_out.index[0] == sector
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += s_emi["Process emissions"] / s_out[sector]
|
|
|
|
# final energy consumption MWh/t material
|
|
sel = ["elec", "heat", "methane"]
|
|
df.loc[sel, sector] = df.loc[sel, sector] * toe_to_MWh / s_out[sector]
|
|
|
|
## DRI + Electric arc
|
|
# For primary route: DRI with H2 + EAF
|
|
|
|
sector = "DRI + Electric arc"
|
|
|
|
df[sector] = df["Electric arc"]
|
|
|
|
# add H2 consumption for DRI at 1.7 MWh H2 /ton steel
|
|
df.at["hydrogen", sector] = params["H2_DRI"]
|
|
|
|
# add electricity consumption in DRI shaft (0.322 MWh/tSl)
|
|
df.at["elec", sector] += params["elec_DRI"]
|
|
|
|
## Integrated steelworks
|
|
# could be used in combination with CCS)
|
|
# Assume existing fuels are kept, except for furnaces, refining, rolling, finishing
|
|
# Ignore 'derived gases' since these are top gases from furnaces
|
|
|
|
sector = "Integrated steelworks"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:50]
|
|
assert s_fec.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
subsector = "Steel: Sinter/Pellet-making"
|
|
|
|
s_fec = idees["fec"][14:20]
|
|
s_ued = idees["ued"][14:20]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
df.loc["elec", sector] += s_fec["Electricity"]
|
|
|
|
sel = ["Natural gas and biogas", "Fuel oil"]
|
|
df.loc["methane", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["coal", sector] += s_fec["Solids"]
|
|
|
|
subsector = "Steel: Blast /Basic oxygen furnace"
|
|
|
|
s_fec = idees["fec"][20:26]
|
|
s_ued = idees["ued"][20:26]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
sel = ["Natural gas and biogas", "Fuel oil"]
|
|
df.loc["methane", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["coal", sector] += s_fec["Solids"]
|
|
|
|
df.loc["coke", sector] = s_fec["Coke"]
|
|
|
|
subsector = "Steel: Furnaces, refining and rolling"
|
|
|
|
s_fec = idees["fec"][26:33]
|
|
s_ued = idees["ued"][26:33]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Steel: Furnaces, refining and rolling - Electric"
|
|
eff = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified, other processes scaled by used energy
|
|
df.loc["elec", sector] += s_ued[subsector] / eff
|
|
|
|
subsector = "Steel: Product finishing"
|
|
|
|
s_fec = idees["fec"][33:50]
|
|
s_ued = idees["ued"][33:50]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Steel: Product finishing - Electric"
|
|
eff = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff
|
|
|
|
# Process emissions (per physical output)
|
|
|
|
s_emi = idees["emi"][3:51]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][6:7]
|
|
assert s_out.index[0] == sector
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] = s_emi["Process emissions"] / s_out[sector]
|
|
|
|
# final energy consumption MWh/t material
|
|
sel = ["elec", "heat", "methane", "coke", "coal"]
|
|
df.loc[sel, sector] = df.loc[sel, sector] * toe_to_MWh / s_out[sector]
|
|
|
|
return df
|
|
|
|
|
|
def chemicals_industry():
|
|
"""
|
|
This function calculates the energy consumption and emissions for the
|
|
chemicals industry, focusing on various subsectors such as basic chemicals,
|
|
steam processing, furnaces, and process cooling. The function also accounts
|
|
for specific processes in ammonia, chlorine, methanol production, and other
|
|
chemicals.
|
|
|
|
Returns:
|
|
pd.DataFrame: A DataFrame containing the energy consumption (in MWh/t material)
|
|
and process emissions (in tCO2/t material) for various subsectors
|
|
within the chemicals industry.
|
|
"""
|
|
sector = "Chemicals Industry"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
# Basic chemicals
|
|
|
|
sector = "Basic chemicals"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:9]
|
|
assert s_fec.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
subsector = "Chemicals: Feedstock (energy used as raw material)"
|
|
# There are Solids, Refinery gas, LPG, Diesel oil, Fuel oil,
|
|
# Other liquids, Naphtha, Natural gas for feedstock.
|
|
# Naphta represents 47%, methane 17%. LPG (18%) solids, refinery gas,
|
|
# diesel oil, Fuel oils and other liquids are assimilated to Naphtha
|
|
|
|
s_fec = idees["fec"][14:23]
|
|
assert s_fec.index[0] == subsector
|
|
|
|
df.loc["naphtha", sector] += s_fec["Naphtha"]
|
|
|
|
df.loc["methane", sector] += s_fec["Natural gas"]
|
|
|
|
# LPG and other feedstock materials are assimilated to naphtha
|
|
# since they will be produced through Fischer-Tropsch process
|
|
sel = [
|
|
"Solids",
|
|
"Refinery gas",
|
|
"LPG",
|
|
"Diesel oil",
|
|
"Fuel oil",
|
|
"Other liquids",
|
|
]
|
|
df.loc["naphtha", sector] += s_fec[sel].sum()
|
|
|
|
subsector = "Chemicals: Steam processing"
|
|
# All the final energy consumption in the steam processing is
|
|
# converted to methane, since we need >1000 C temperatures here.
|
|
# The current efficiency of methane is assumed in the conversion.
|
|
|
|
s_fec = idees["fec"][23:34]
|
|
s_ued = idees["ued"][23:34]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
# efficiency of natural gas
|
|
eff_ch4 = s_ued["Natural gas and biogas"] / s_fec["Natural gas and biogas"]
|
|
|
|
# replace all fec by methane
|
|
df.loc["methane", sector] += s_ued[subsector] / eff_ch4
|
|
|
|
subsector = "Chemicals: Furnaces"
|
|
|
|
s_fec = idees["fec"][34:42]
|
|
s_ued = idees["ued"][34:42]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
# efficiency of electrification
|
|
key = "Chemicals: Furnaces - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff_elec
|
|
|
|
subsector = "Chemicals: Process cooling"
|
|
|
|
s_fec = idees["fec"][42:56]
|
|
s_ued = idees["ued"][42:56]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Chemicals: Process cooling - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff_elec
|
|
|
|
subsector = "Chemicals: Generic electric process"
|
|
|
|
s_fec = idees["fec"][56:57]
|
|
assert s_fec.index[0] == subsector
|
|
|
|
df.loc["elec", sector] += s_fec[subsector]
|
|
|
|
# Process emissions
|
|
|
|
# Correct everything by subtracting 2019's ammonia demand and
|
|
# putting in ammonia demand for H2 and electricity separately
|
|
|
|
s_emi = idees["emi"][3:58]
|
|
assert s_emi.index[0] == sector
|
|
|
|
# convert from MtHVC/a to ktHVC/a
|
|
s_out = params["HVC_production_today"] * 1e3
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += (
|
|
s_emi["Process emissions"]
|
|
- params["petrochemical_process_emissions"] * 1e3
|
|
- params["NH3_process_emissions"] * 1e3
|
|
) / s_out
|
|
|
|
# emissions originating from feedstock, could be non-fossil origin
|
|
# tCO2/t material
|
|
df.loc["process emission from feedstock", sector] += (
|
|
params["petrochemical_process_emissions"] * 1e3
|
|
) / s_out
|
|
|
|
# convert from ktoe/a to GWh/a
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
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(eu27), str(max(2018, year))
|
|
].sum()
|
|
df.loc["methane", sector] -= ammonia_total * params["MWh_CH4_per_tNH3_SMR"]
|
|
df.loc["elec", sector] -= ammonia_total * params["MWh_elec_per_tNH3_SMR"]
|
|
|
|
# subtract chlorine demand (in MtCl/a)
|
|
chlorine_total = params["chlorine_production_today"]
|
|
df.loc["hydrogen", sector] -= chlorine_total * params["MWh_H2_per_tCl"] * 1e3
|
|
df.loc["elec", sector] -= chlorine_total * params["MWh_elec_per_tCl"] * 1e3
|
|
|
|
# subtract methanol demand (in MtMeOH/a)
|
|
methanol_total = params["methanol_production_today"]
|
|
df.loc["methane", sector] -= methanol_total * params["MWh_CH4_per_tMeOH"] * 1e3
|
|
df.loc["elec", sector] -= methanol_total * params["MWh_elec_per_tMeOH"] * 1e3
|
|
|
|
# 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] = params["MWh_elec_per_tHVC_mechanical_recycling"]
|
|
|
|
# HVC chemical recycling
|
|
|
|
sector = "HVC (chemical recycling)"
|
|
df[sector] = 0.0
|
|
df.loc["elec", sector] = params["MWh_elec_per_tHVC_chemical_recycling"]
|
|
|
|
# Ammonia
|
|
|
|
sector = "Ammonia"
|
|
df[sector] = 0.0
|
|
if snakemake.params.ammonia:
|
|
df.loc["ammonia", sector] = params["MWh_NH3_per_tNH3"]
|
|
else:
|
|
df.loc["hydrogen", sector] = params["MWh_H2_per_tNH3_electrolysis"]
|
|
df.loc["elec", sector] = params["MWh_elec_per_tNH3_electrolysis"]
|
|
|
|
# Chlorine
|
|
|
|
sector = "Chlorine"
|
|
df[sector] = 0.0
|
|
df.loc["hydrogen", sector] = params["MWh_H2_per_tCl"]
|
|
df.loc["elec", sector] = params["MWh_elec_per_tCl"]
|
|
|
|
# Methanol
|
|
|
|
sector = "Methanol"
|
|
df[sector] = 0.0
|
|
df.loc["methanol", sector] = params["MWh_MeOH_per_tMeOH"]
|
|
|
|
# Other chemicals
|
|
|
|
sector = "Other chemicals"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][59:65]
|
|
assert s_fec.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
subsector = "Chemicals: High-enthalpy heat processing"
|
|
|
|
s_fec = idees["fec"][70:83]
|
|
s_ued = idees["ued"][70:83]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "High-enthalpy heat processing - Electric (microwave)"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff_elec
|
|
|
|
subsector = "Chemicals: Furnaces"
|
|
|
|
s_fec = idees["fec"][83:92]
|
|
s_ued = idees["ued"][83:92]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Chemicals: Furnaces - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff_elec
|
|
|
|
subsector = "Chemicals: Process cooling"
|
|
|
|
s_fec = idees["fec"][91:105]
|
|
s_ued = idees["ued"][91:105]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Chemicals: Process cooling - Electric"
|
|
eff = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff
|
|
|
|
subsector = "Chemicals: Generic electric process"
|
|
|
|
s_fec = idees["fec"][105:106]
|
|
assert s_fec.index[0] == subsector
|
|
|
|
df.loc["elec", sector] += s_fec[subsector]
|
|
|
|
# Process emissions
|
|
|
|
s_emi = idees["emi"][59:107]
|
|
s_out = idees["out"][9:10]
|
|
assert s_emi.index[0] == sector
|
|
assert sector in str(s_out.index)
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += s_emi["Process emissions"] / s_out.values
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
# Pharmaceutical products
|
|
|
|
sector = "Pharmaceutical products etc."
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][108:114]
|
|
assert s_fec.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
subsector = "Chemicals: High-enthalpy heat processing"
|
|
|
|
s_fec = idees["fec"][119:132]
|
|
s_ued = idees["ued"][119:132]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "High-enthalpy heat processing - Electric (microwave)"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff_elec
|
|
|
|
subsector = "Chemicals: Furnaces"
|
|
|
|
s_fec = idees["fec"][132:140]
|
|
s_ued = idees["ued"][132:140]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Chemicals: Furnaces - Electric"
|
|
eff = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff
|
|
|
|
subsector = "Chemicals: Process cooling"
|
|
|
|
s_fec = idees["fec"][140:154]
|
|
s_ued = idees["ued"][140:154]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
key = "Chemicals: Process cooling - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
# assume fully electrified
|
|
df.loc["elec", sector] += s_ued[subsector] / eff_elec
|
|
|
|
subsector = "Chemicals: Generic electric process"
|
|
|
|
s_fec = idees["fec"][154:155]
|
|
s_out = idees["out"][10:11]
|
|
assert s_fec.index[0] == subsector
|
|
assert sector in str(s_out.index)
|
|
|
|
df.loc["elec", sector] += s_fec[subsector]
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += 0.0
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
return df
|
|
|
|
|
|
def nonmetalic_mineral_products():
|
|
"""
|
|
This function calculates the energy consumption and emissions for the non-
|
|
metallic mineral products industry, focusing on three main sectors: cement,
|
|
ceramics, and glass production. It takes into account the specific
|
|
processes and their associated energy types and emissions.
|
|
|
|
Returns:
|
|
pd.DataFrame: A DataFrame containing the energy consumption (in MWh/t material)
|
|
and process emissions (in tCO2/t material) for the cement, ceramics,
|
|
and glass production sectors.
|
|
"""
|
|
|
|
sector = "Non-metallic mineral products"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
# Cement
|
|
|
|
# This sector has process-emissions.
|
|
# Includes three subcategories:
|
|
# (a) Grinding, milling of raw material,
|
|
# (b) Pre-heating and pre-calcination,
|
|
# (c) clinker production (kilns),
|
|
# (d) Grinding, packaging.
|
|
# (b)+(c) represent 94% of fec. So (a) is joined to (b) and (d) is joined to (c).
|
|
# Temperatures above 1400C are required for processing limestone and sand into clinker.
|
|
# Everything (except current electricity and heat consumption and existing biomass)
|
|
# is transformed into methane for high T.
|
|
|
|
sector = "Cement"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:25]
|
|
s_ued = idees["ued"][3:25]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# pre-processing: keep existing elec and biomass, rest to methane
|
|
df.loc["elec", sector] += s_fec["Cement: Grinding, milling of raw material"]
|
|
df.loc["biomass", sector] += s_fec["Biomass and waste"]
|
|
df.loc["methane", sector] += (
|
|
s_fec["Cement: Pre-heating and pre-calcination"] - s_fec["Biomass and waste"]
|
|
)
|
|
|
|
subsector = "Cement: Clinker production (kilns)"
|
|
|
|
s_fec = idees["fec"][23:32]
|
|
s_ued = idees["ued"][23:32]
|
|
assert s_fec.index[0] == subsector
|
|
assert s_ued.index[0] == subsector
|
|
|
|
df.loc["biomass", sector] += s_fec["Biomass and waste"]
|
|
df.loc["methane", sector] += (
|
|
s_fec["Cement: Clinker production (kilns)"] - s_fec["Biomass and waste"]
|
|
)
|
|
df.loc["elec", sector] += s_fec["Cement: Grinding, packaging and precasting"]
|
|
|
|
# Process emissions
|
|
|
|
# come from calcination of limestone to chemically reactive calcium oxide (lime).
|
|
# Calcium carbonate -> lime + CO2
|
|
# CaCO3 -> CaO + CO2
|
|
|
|
s_emi = idees["emi"][3:45]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][7:8]
|
|
assert sector in str(s_out.index)
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += s_emi["Process emissions"] / s_out.values
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
# Ceramics & other NMM
|
|
|
|
# This sector has process emissions.
|
|
# Includes four subcategories:
|
|
# (a) Mixing of raw material,
|
|
# (b) Drying and sintering of raw material,
|
|
# (c) Primary production process,
|
|
# (d) Product finishing.
|
|
# (b) represents 65% of fec and (a) 4%. So (a) is joined to (b).
|
|
# Everything is electrified
|
|
|
|
sector = "Ceramics & other NMM"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][46:95]
|
|
s_ued = idees["ued"][46:95]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Ceramics: Microwave drying and sintering"
|
|
# the values are zero in new JRC-data -> assume here value from JRC-2015
|
|
# eff_elec = s_ued[key] / s_fec[key]
|
|
eff_elec = 11.6 / 26
|
|
|
|
sel = [
|
|
"Ceramics: Mixing of raw material",
|
|
"Ceramics: Drying and sintering of raw material",
|
|
]
|
|
df.loc["elec", sector] += s_ued[sel].sum() / eff_elec
|
|
|
|
key = "Ceramics: Electric kiln"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
df.loc["elec", sector] += s_ued["Ceramics: Primary production process"] / eff_elec
|
|
|
|
key = "Ceramics: Electric furnace"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
df.loc["elec", sector] += s_ued["Ceramics: Product finishing"] / eff_elec
|
|
|
|
s_emi = idees["emi"][46:96]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][8:9]
|
|
assert sector in str(s_out.index)
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += s_emi["Process emissions"] / s_out.values
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
# Glass production
|
|
|
|
# This sector has process emissions.
|
|
# Includes four subcategories:
|
|
# (a) Melting tank
|
|
# (b) Forming
|
|
# (c) Annealing
|
|
# (d) Finishing processes.
|
|
# (a) represents 73%. (b), (d) are joined to (c).
|
|
# Everything is electrified.
|
|
|
|
sector = "Glass production"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][97:126]
|
|
s_ued = idees["ued"][97:126]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Glass: Electric melting tank"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
df.loc["elec", sector] += s_ued["Glass: Melting tank"] / eff_elec
|
|
|
|
key = "Glass: Annealing - electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
sel = ["Glass: Forming", "Glass: Annealing", "Glass: Finishing processes"]
|
|
df.loc["elec", sector] += s_ued[sel].sum() / eff_elec
|
|
|
|
s_emi = idees["emi"][97:127]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][9:10]
|
|
assert sector in str(s_out.index)
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] += s_emi["Process emissions"] / s_out.values
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
return df
|
|
|
|
|
|
def pulp_paper_printing():
|
|
"""
|
|
Models the energy consumption for the pulp, paper, and printing sector,
|
|
assuming complete electrification of all processes. This sector does not
|
|
have any process emissions associated with it.
|
|
|
|
Returns:
|
|
pd.DataFrame: A DataFrame containing the energy consumption (in MWh/t material)
|
|
for the pulp, paper, and printing sector.
|
|
"""
|
|
|
|
sector = "Pulp, paper and printing"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
# Pulp production
|
|
|
|
# Includes three subcategories:
|
|
# (a) Wood preparation, grinding;
|
|
# (b) Pulping;
|
|
# (c) Cleaning.
|
|
#
|
|
# (b) Pulping is either biomass or electric; left like this (dominated by biomass).
|
|
# (a) Wood preparation, grinding and (c) Cleaning represent only 10% of their current
|
|
# energy consumption is assumed to be electrified without any change in efficiency
|
|
|
|
sector = "Pulp production"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:29]
|
|
s_ued = idees["ued"][3:29]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Industry-specific
|
|
sel = [
|
|
"Pulp: Wood preparation, grinding",
|
|
"Pulp: Cleaning",
|
|
"Pulp: Pulping electric",
|
|
]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
# Efficiency changes due to biomass
|
|
eff_bio = s_ued["Biomass and waste"] / s_fec["Biomass and waste"]
|
|
df.loc["biomass", sector] += s_ued["Pulp: Pulping thermal"] / eff_bio
|
|
|
|
s_out = idees["out"][8:9]
|
|
assert sector in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Pulp production (kt)"]
|
|
)
|
|
|
|
# Paper production
|
|
|
|
# Includes three subcategories:
|
|
# (a) Stock preparation;
|
|
# (b) Paper machine;
|
|
# (c) Product finishing.
|
|
#
|
|
# (b) Paper machine and (c) Product finishing are left electric
|
|
# and thermal is moved to biomass. The efficiency is calculated
|
|
# from the pulping process that is already biomass.
|
|
#
|
|
# (a) Stock preparation represents only 7% and its current energy
|
|
# consumption is assumed to be electrified without any change in efficiency.
|
|
|
|
sector = "Paper production"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][30:80]
|
|
s_ued = idees["ued"][30:80]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Industry-specific
|
|
df.loc["elec", sector] += s_fec["Paper: Stock preparation"]
|
|
|
|
# add electricity from process that is already electrified
|
|
df.loc["elec", sector] += s_fec["Paper: Paper machine - Electricity"]
|
|
|
|
# add electricity from process that is already electrified
|
|
df.loc["elec", sector] += s_fec["Paper: Product finishing - Electricity"]
|
|
|
|
s_fec = idees["fec"][55:66]
|
|
s_ued = idees["ued"][55:66]
|
|
assert s_fec.index[0] == "Paper: Paper machine - Steam use"
|
|
assert s_ued.index[0] == "Paper: Paper machine - Steam use"
|
|
|
|
# Efficiency changes due to biomass
|
|
eff_bio = s_ued["Biomass and waste"] / s_fec["Biomass and waste"]
|
|
df.loc["biomass", sector] += s_ued["Paper: Paper machine - Steam use"] / eff_bio
|
|
|
|
s_fec = idees["fec"][68:79]
|
|
s_ued = idees["ued"][68:79]
|
|
assert s_fec.index[0] == "Paper: Product finishing - Steam use"
|
|
assert s_ued.index[0] == "Paper: Product finishing - Steam use"
|
|
|
|
# Efficiency changes due to biomass
|
|
eff_bio = s_ued["Biomass and waste"] / s_fec["Biomass and waste"]
|
|
df.loc["biomass", sector] += s_ued["Paper: Product finishing - Steam use"] / eff_bio
|
|
|
|
s_out = idees["out"][9:10]
|
|
assert sector in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
# Printing and media reproduction
|
|
|
|
# (a) Printing and publishing is assumed to be
|
|
# electrified without any change in efficiency.
|
|
|
|
sector = "Printing and media reproduction"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][81:93]
|
|
s_ued = idees["ued"][81:93]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
df.loc["elec", sector] += s_ued[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
df.loc["heat", sector] += s_ued["Low-enthalpy heat"]
|
|
|
|
# Industry-specific
|
|
df.loc["elec", sector] += s_fec["Printing and publishing"]
|
|
df.loc["elec", sector] += s_ued["Printing and publishing"]
|
|
|
|
s_out = idees["out"][10:11]
|
|
assert sector in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = df.loc[sources, sector] * toe_to_MWh / s_out.values
|
|
|
|
return df
|
|
|
|
|
|
def food_beverages_tobacco():
|
|
"""
|
|
Calculates the energy consumption for the food, beverages, and tobacco
|
|
sector, assuming complete electrification of all processes. This sector
|
|
does not have any process emissions associated with it.
|
|
|
|
Returns:
|
|
pd.DataFrame: A DataFrame containing the energy consumption (in MWh/t material)
|
|
for the food, beverages, and tobacco sector.
|
|
"""
|
|
|
|
sector = "Food, beverages and tobacco"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:79]
|
|
s_ued = idees["ued"][3:79]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
|
|
key = "Food: Direct Heat - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Food: Oven (direct heat)"] / eff_elec
|
|
|
|
key = "Food: Process Heat - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Food: Specific process heat"] / eff_elec
|
|
|
|
key = "Food: Electric drying"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Food: Drying"] / eff_elec
|
|
|
|
key = "Food: Electric cooling"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += (
|
|
s_ued["Food: Process cooling and refrigeration"] / eff_elec
|
|
)
|
|
|
|
# Steam processing goes all to biomass without change in efficiency
|
|
df.loc["biomass", sector] += s_fec["Food: Steam processing"]
|
|
|
|
# add electricity from process that is already electrified
|
|
df.loc["elec", sector] += s_fec["Food: Electric machinery"]
|
|
|
|
s_out = idees["out"][3:4]
|
|
assert "Physical output" in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Physical output (index)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
def non_ferrous_metals():
|
|
sector = "Non Ferrous Metals"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
# Alumina
|
|
|
|
# High-enthalpy heat is converted to methane.
|
|
# Process heat at T>500C is required here.
|
|
# Refining is electrified.
|
|
# There are no process emissions associated to Alumina manufacturing.
|
|
|
|
sector = "Alumina production"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:31]
|
|
s_ued = idees["ued"][3:31]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# High-enthalpy heat is transformed into methane
|
|
|
|
s_fec = idees["fec"][14:25]
|
|
s_ued = idees["ued"][14:25]
|
|
assert s_fec.index[0] == "Alumina production: High-enthalpy heat"
|
|
assert s_ued.index[0] == "Alumina production: High-enthalpy heat"
|
|
|
|
eff_met = s_ued["Natural gas and biogas"] / s_fec["Natural gas and biogas"]
|
|
df.loc["methane", sector] += (
|
|
s_fec["Alumina production: High-enthalpy heat"] / eff_met
|
|
)
|
|
|
|
# Efficiency changes due to electrification
|
|
|
|
s_fec = idees["fec"][25:31]
|
|
s_ued = idees["ued"][25:31]
|
|
assert s_fec.index[0] == "Alumina production: Refining"
|
|
assert s_ued.index[0] == "Alumina production: Refining"
|
|
|
|
eff_elec = s_ued["Electricity"] / s_fec["Electricity"]
|
|
df.loc["elec", sector] += s_ued["Alumina production: Refining"] / eff_elec
|
|
|
|
s_out = idees["out"][9:10]
|
|
assert sector in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Alumina production (kt)"]
|
|
)
|
|
|
|
# Aluminium primary route
|
|
|
|
# Production through the primary route is divided into 50% remains
|
|
# as today and 50% is transformed into secondary route.
|
|
|
|
sector = "Aluminium - primary production"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][32:68]
|
|
s_ued = idees["ued"][32:68]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Add aluminium electrolysis (smelting
|
|
df.loc["elec", sector] += s_fec["Aluminium electrolysis (smelting)"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Aluminium processing - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
key = "Aluminium processing (metallurgy e.g. cast house, reheating)"
|
|
df.loc["elec", sector] += s_ued[key] / eff_elec
|
|
|
|
key = "Aluminium finishing - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Aluminium finishing"] / eff_elec
|
|
|
|
s_emi = idees["emi"][32:69]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][11:12]
|
|
assert sector in str(s_out.index)
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] = (
|
|
s_emi["Process emissions"] / s_out["Aluminium - primary production"]
|
|
)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Aluminium - primary production"]
|
|
)
|
|
|
|
# Aluminium secondary route
|
|
|
|
# All is converted into secondary route fully electrified.
|
|
|
|
sector = "Aluminium - secondary production"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][70:112]
|
|
s_ued = idees["ued"][70:112]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Secondary aluminium - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
key = "Secondary aluminium (incl. pre-treatment, remelting)"
|
|
df.loc["elec", sector] += s_ued[key] / eff_elec
|
|
|
|
key = "Aluminium processing - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
key = "Aluminium processing (metallurgy e.g. cast house, reheating)"
|
|
df.loc["elec", sector] += s_ued[key] / eff_elec
|
|
|
|
key = "Aluminium finishing - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Aluminium finishing"] / eff_elec
|
|
|
|
s_out = idees["out"][12:13]
|
|
assert sector in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Aluminium - secondary production"]
|
|
)
|
|
|
|
# Other non-ferrous metals
|
|
|
|
sector = "Other non-ferrous metals"
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][113:156]
|
|
s_ued = idees["ued"][113:156]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Metal production - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Other Metals: production"] / eff_elec
|
|
|
|
key = "Metal processing - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
key = "Metal processing (metallurgy e.g. cast house, reheating)"
|
|
df.loc["elec", sector] += s_ued[key] / eff_elec
|
|
|
|
key = "Metal finishing - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Metal finishing"] / eff_elec
|
|
|
|
s_emi = idees["emi"][113:157]
|
|
assert s_emi.index[0] == sector
|
|
|
|
s_out = idees["out"][13:14]
|
|
assert sector in str(s_out.index)
|
|
|
|
# tCO2/t material
|
|
df.loc["process emission", sector] = (
|
|
s_emi["Process emissions"] / s_out["Other non-ferrous metals (kt lead eq.)"]
|
|
)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector]
|
|
* toe_to_MWh
|
|
/ s_out["Other non-ferrous metals (kt lead eq.)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
def transport_equipment():
|
|
sector = "Transport equipment"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:46]
|
|
s_ued = idees["ued"][3:46]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Trans. Eq.: Electric Foundries"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Trans. Eq.: Foundries"] / eff_elec
|
|
|
|
key = "Trans. Eq.: Electric connection"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Trans. Eq.: Connection techniques"] / eff_elec
|
|
|
|
key = "Trans. Eq.: Heat treatment - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Trans. Eq.: Heat treatment"] / eff_elec
|
|
|
|
df.loc["elec", sector] += s_fec["Trans. Eq.: General machinery"]
|
|
df.loc["elec", sector] += s_fec["Trans. Eq.: Product finishing"]
|
|
|
|
# Steam processing is supplied with biomass
|
|
eff_biomass = s_ued["Biomass and waste"] / s_fec["Biomass and waste"]
|
|
df.loc["biomass", sector] += s_ued["Trans. Eq.: Steam processing"] / eff_biomass
|
|
|
|
s_out = idees["out"][3:4]
|
|
assert "Physical output" in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Physical output (index)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
def machinery_equipment():
|
|
sector = "Machinery equipment"
|
|
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:46]
|
|
s_ued = idees["ued"][3:46]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Mach. Eq.: Electric Foundries"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Mach. Eq.: Foundries"] / eff_elec
|
|
|
|
key = "Mach. Eq.: Electric connection"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Mach. Eq.: Connection techniques"] / eff_elec
|
|
|
|
key = "Mach. Eq.: Heat treatment - Electric"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
|
|
df.loc["elec", sector] += s_ued["Mach. Eq.: Heat treatment"] / eff_elec
|
|
|
|
df.loc["elec", sector] += s_fec["Mach. Eq.: General machinery"]
|
|
df.loc["elec", sector] += s_fec["Mach. Eq.: Product finishing"]
|
|
|
|
# Steam processing is supplied with biomass
|
|
eff_biomass = s_ued["Biomass and waste"] / s_fec["Biomass and waste"]
|
|
df.loc["biomass", sector] += s_ued["Mach. Eq.: Steam processing"] / eff_biomass
|
|
|
|
s_out = idees["out"][3:4]
|
|
assert "Physical output" in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Physical output (index)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
def textiles_and_leather():
|
|
sector = "Textiles and leather"
|
|
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:58]
|
|
s_ued = idees["ued"][3:58]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Textiles: Electric drying"
|
|
# in new JRC data zero assume old data
|
|
# eff_elec = s_ued[key] / s_fec[key]
|
|
eff_elec = 73.7 / 146.6
|
|
df.loc["elec", sector] += s_ued["Textiles: Drying"] / eff_elec
|
|
|
|
df.loc["elec", sector] += s_fec["Textiles: Electric general machinery"]
|
|
df.loc["elec", sector] += s_fec["Textiles: Finishing Electric"]
|
|
|
|
# Steam processing is supplied with biomass
|
|
eff_biomass = s_ued[15:26]["Biomass and waste"] / s_fec[15:26]["Biomass and waste"]
|
|
df.loc["biomass", sector] += (
|
|
s_ued["Textiles: Pretreatment with steam"] / eff_biomass
|
|
)
|
|
df.loc["biomass", sector] += (
|
|
s_ued["Textiles: Wet processing with steam"] / eff_biomass
|
|
)
|
|
|
|
s_out = idees["out"][3:4]
|
|
assert "Physical output" in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Physical output (index)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
def wood_and_wood_products():
|
|
sector = "Wood and wood products"
|
|
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:47]
|
|
s_ued = idees["ued"][3:47]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Wood: Electric drying"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Wood: Drying"] / eff_elec
|
|
|
|
df.loc["elec", sector] += s_fec["Wood: Electric mechanical processes"]
|
|
df.loc["elec", sector] += s_fec["Wood: Finishing Electric"]
|
|
|
|
# Steam processing is supplied with biomass
|
|
eff_biomass = s_ued[15:25]["Biomass and waste"] / s_fec[15:25]["Biomass and waste"]
|
|
df.loc["biomass", sector] += (
|
|
s_ued["Wood: Specific processes with steam"] / eff_biomass
|
|
)
|
|
|
|
s_out = idees["out"][3:4]
|
|
assert "Physical output" in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Physical output (index)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
def other_industrial_sectors():
|
|
|
|
sector = "Other industrial sectors"
|
|
idees = load_idees_data(sector)
|
|
|
|
df = pd.DataFrame(index=index)
|
|
|
|
df[sector] = 0.0
|
|
|
|
s_fec = idees["fec"][3:68]
|
|
s_ued = idees["ued"][3:68]
|
|
assert s_fec.index[0] == sector
|
|
assert s_ued.index[0] == sector
|
|
|
|
sel = ["Lighting", "Air compressors", "Motor drives", "Fans and pumps"]
|
|
df.loc["elec", sector] += s_fec[sel].sum()
|
|
|
|
df.loc["heat", sector] += s_fec["Low-enthalpy heat"]
|
|
|
|
# Efficiency changes due to electrification
|
|
key = "Other Industrial sectors: Electric processing"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += (
|
|
s_ued["Other Industrial sectors: Process heating"] / eff_elec
|
|
)
|
|
|
|
key = "Other Industries: Electric drying"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += s_ued["Other Industrial sectors: Drying"] / eff_elec
|
|
|
|
key = "Other Industries: Electric cooling"
|
|
eff_elec = s_ued[key] / s_fec[key]
|
|
df.loc["elec", sector] += (
|
|
s_ued["Other Industrial sectors: Process Cooling"] / eff_elec
|
|
)
|
|
|
|
# Diesel motors are electrified
|
|
key = "Other Industrial sectors: Diesel motors (incl. biofuels)"
|
|
df.loc["elec", sector] += s_fec[key]
|
|
key = "Other Industrial sectors: Electric machinery"
|
|
df.loc["elec", sector] += s_fec[key]
|
|
|
|
# Steam processing is supplied with biomass
|
|
eff_biomass = s_ued[15:25]["Biomass and waste"] / s_fec[15:25]["Biomass and waste"]
|
|
df.loc["biomass", sector] += (
|
|
s_ued["Other Industrial sectors: Steam processing"] / eff_biomass
|
|
)
|
|
|
|
s_out = idees["out"][3:4]
|
|
assert "Physical output" in str(s_out.index)
|
|
|
|
# MWh/t material
|
|
sources = ["elec", "biomass", "methane", "hydrogen", "heat", "naphtha"]
|
|
df.loc[sources, sector] = (
|
|
df.loc[sources, sector] * toe_to_MWh / s_out["Physical output (index)"]
|
|
)
|
|
|
|
return df
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if "snakemake" not in globals():
|
|
from _helpers import mock_snakemake
|
|
|
|
snakemake = mock_snakemake("build_industry_sector_ratios")
|
|
set_scenario_config(snakemake)
|
|
|
|
params = snakemake.params.industry
|
|
|
|
year = params["reference_year"]
|
|
|
|
df = pd.concat(
|
|
[
|
|
iron_and_steel(),
|
|
chemicals_industry(),
|
|
nonmetalic_mineral_products(),
|
|
pulp_paper_printing(),
|
|
food_beverages_tobacco(),
|
|
non_ferrous_metals(),
|
|
transport_equipment(),
|
|
machinery_equipment(),
|
|
textiles_and_leather(),
|
|
wood_and_wood_products(),
|
|
other_industrial_sectors(),
|
|
],
|
|
axis=1,
|
|
)
|
|
|
|
df.index.name = "MWh/tMaterial"
|
|
df.to_csv(snakemake.output.industry_sector_ratios)
|