# -*- 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 ` data to calculate an EU28 average specific energy consumption by carrier and industries. The industries are according to the rule `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"] ` 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)