for today's industry energy demand, separate MeOH, Cl and HVC

I.e. split basic chemicals (without ammonia) into MeOH, Cl and HVC.

This now agrees with scheme for industrial sectors tomorrow.
This commit is contained in:
Tom Brown 2024-02-14 10:09:13 +01:00 committed by Fabian Neumann
parent 9c592d9f73
commit cbf7ed0d38
2 changed files with 26 additions and 25 deletions

View File

@ -636,6 +636,7 @@ industry:
2040: 0.12
2045: 0.16
2050: 0.20
basic_chemicals_without_NH3_energy_demand_today: 1138. #TWh/a
HVC_production_today: 52.
MWh_elec_per_tHVC_mechanical_recycling: 0.547
MWh_elec_per_tHVC_chemical_recycling: 6.9

View File

@ -73,7 +73,7 @@ def industrial_energy_demand_per_country(country, year, jrc_dir):
def get_subsector_data(sheet):
df = df_dict[sheet][year].groupby(fuels).sum()
df["ammonia"] = 0.0
df["hydrogen"] = 0.0
df["other"] = df["all"] - df.loc[df.index != "all"].sum()
@ -94,36 +94,41 @@ def industrial_energy_demand_per_country(country, year, jrc_dir):
return df
def add_ammonia_energy_demand(demand):
def separate_basic_chemicals(demand):
# MtNH3/a
fn = snakemake.input.ammonia_production
ammonia = pd.read_csv(fn, index_col=0)[str(year)] / 1e3
def get_ammonia_by_fuel(x):
fuels = {
"gas": params["MWh_CH4_per_tNH3_SMR"],
"electricity": params["MWh_elec_per_tNH3_SMR"],
}
return pd.Series({k: x * v for k, v in fuels.items()})
ammonia_by_fuel = ammonia.apply(get_ammonia_by_fuel).T
ammonia_by_fuel = ammonia_by_fuel.unstack().reindex(
index=demand.index, fill_value=0.0
)
ammonia = pd.DataFrame({"ammonia": ammonia * params["MWh_NH3_per_tNH3"]}).T
ammonia = pd.DataFrame({"gas": ammonia * params["MWh_CH4_per_tNH3_SMR"],
"electricity" : ammonia * params["MWh_elec_per_tNH3_SMR"]}).T
demand["Ammonia"] = ammonia.unstack().reindex(index=demand.index, fill_value=0.0)
demand["Basic chemicals (without ammonia)"] = (
demand["Basic chemicals"] - ammonia_by_fuel
demand["Basic chemicals"] - demand["Ammonia"]
)
demand["Basic chemicals (without ammonia)"].clip(lower=0, inplace=True)
demand.drop(columns="Basic chemicals", inplace=True)
distribution = demand["Basic chemicals (without ammonia)"].groupby(level=0).sum()/params["basic_chemicals_without_NH3_energy_demand_today"]
chlorine = pd.DataFrame({"hydrogen": distribution * params["chlorine_production_today"] * params["MWh_H2_per_tCl"],
"electricity" : distribution * params["chlorine_production_today"] * params["MWh_elec_per_tCl"]}).T
methanol = pd.DataFrame({"gas": distribution * params["methanol_production_today"] * params["MWh_CH4_per_tMeOH"],
"electricity" : distribution * params["methanol_production_today"] * params["MWh_elec_per_tMeOH"]}).T
demand["Chlorine"] = chlorine.unstack().reindex(index=demand.index, fill_value=0.0)
demand["Methanol"] = methanol.unstack().reindex(index=demand.index, fill_value=0.0)
demand["HVC"] = (
demand["Basic chemicals (without ammonia)"] -demand["Methanol"] - demand["Chlorine"]
)
demand.drop(columns="Basic chemicals (without ammonia)", inplace=True)
demand["HVC"].clip(lower=0, inplace=True)
return demand
@ -135,11 +140,6 @@ def add_non_eu28_industrial_energy_demand(countries, demand):
fn = snakemake.input.industrial_production_per_country
production = pd.read_csv(fn, index_col=0) / 1e3
# recombine HVC, Chlorine and Methanol to Basic chemicals (without ammonia)
chemicals = ["HVC", "Chlorine", "Methanol"]
production["Basic chemicals (without ammonia)"] = production[chemicals].sum(axis=1)
production.drop(columns=chemicals, inplace=True)
eu28_production = production.loc[countries.intersection(eu28)].sum()
eu28_energy = demand.groupby(level=1).sum()
eu28_averages = eu28_energy / eu28_production
@ -182,7 +182,7 @@ if __name__ == "__main__":
demand = industrial_energy_demand(countries.intersection(eu28), year)
demand = add_ammonia_energy_demand(demand)
demand = separate_basic_chemicals(demand)
demand = add_non_eu28_industrial_energy_demand(countries, demand)