From b29e1c196eb71896559f7235bdaa6864ff616cb7 Mon Sep 17 00:00:00 2001 From: millingermarkus Date: Thu, 30 May 2024 14:28:34 +0200 Subject: [PATCH] Added msw incineration --- scripts/prepare_sector_network.py | 97 +++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 9f53e317..a0b36286 100755 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -61,13 +61,18 @@ def define_spatial(nodes, options): spatial.biomass.locations = nodes spatial.biomass.industry = nodes + " solid biomass for industry" spatial.biomass.industry_cc = nodes + " solid biomass for industry CC" + spatial.msw.nodes = nodes + " municipal solid waste" + spatial.msw.locations = nodes else: spatial.biomass.nodes = ["EU solid biomass"] spatial.biomass.locations = ["EU"] spatial.biomass.industry = ["solid biomass for industry"] spatial.biomass.industry_cc = ["solid biomass for industry CC"] + spatial.msw.nodes = ["EU municipal solid waste"] + spatial.msw.locations = ["EU"] spatial.biomass.df = pd.DataFrame(vars(spatial.biomass), index=nodes) + spatial.msw.df = pd.DataFrame(vars(spatial.msw), index=nodes) # co2 @@ -2161,11 +2166,16 @@ def add_biomass(n, costs): solid_biomass_potentials_spatial = biomass_potentials["solid biomass"].rename( index=lambda x: x + " solid biomass" ) + msw_biomass_potentials_spatial = biomass_potentials["municipal solid waste"].rename( + index=lambda x: x + " municipal solid waste" + ) else: solid_biomass_potentials_spatial = biomass_potentials["solid biomass"].sum() + msw_biomass_potentials_spatial = biomass_potentials["municipal solid waste"].sum() n.add("Carrier", "biogas") n.add("Carrier", "solid biomass") + n.add("Carrier", "municipal solid waste") n.madd( "Bus", @@ -2183,6 +2193,11 @@ def add_biomass(n, costs): unit="MWh_LHV", ) + n.madd("Bus", + spatial.msw.nodes, + location=spatial.msw.locations, + carrier="municipal solid waste") + n.madd( "Store", spatial.gas.biogas, @@ -2203,6 +2218,15 @@ def add_biomass(n, costs): e_initial=solid_biomass_potentials_spatial, ) + n.madd("Store", + spatial.msw.nodes, + bus=spatial.msw.nodes, + carrier="municipal solid waste", + e_nom=msw_biomass_potentials_spatial, + marginal_cost=0,#costs.at["municipal solid waste", "fuel"], + e_initial=msw_biomass_potentials_spatial, + ) + n.madd( "Link", spatial.gas.biogas_to_gas, @@ -2274,6 +2298,18 @@ def add_biomass(n, costs): carrier="solid biomass transport", ) + n.madd( + "Link", + biomass_transport.index, + bus0=biomass_transport.bus0 + " municipal solid waste", + bus1=biomass_transport.bus1 + " municipal solid waste", + p_nom_extendable=False, + p_nom=5e4, + length=biomass_transport.length.values, + marginal_cost=biomass_transport.costs * biomass_transport.length.values, + carrier="municipal solid waste transport", + ) + elif options["biomass_spatial"]: # add artificial biomass generators at nodes which include transport costs transport_costs = pd.read_csv( @@ -2303,6 +2339,25 @@ def add_biomass(n, costs): type="operational_limit", ) + #Add municipal solid waste + n.madd( + "Generator", + spatial.msw.nodes, + bus=spatial.msw.nodes, + carrier="municipal solid waste", + p_nom=10000, + marginal_cost=0#costs.at["municipal solid waste", "fuel"] + + bus_transport_costs * average_distance, + ) + n.add( + "GlobalConstraint", + "msw limit", + carrier_attribute="municipal solid waste", + sense="<=", + constant=biomass_potentials["municipal solid waste"].sum(), + type="operational_limit", + ) + # AC buses with district heating urban_central = n.buses.index[n.buses.carrier == "urban central heat"] if not urban_central.empty and options["chp"]: @@ -2359,6 +2414,48 @@ def add_biomass(n, costs): lifetime=costs.at[key, "lifetime"], ) + if options['waste_chp']: + print('Adding waste CHPs') + n.madd("Link", + urban_central + " waste CHP", + bus0=urban_central + " municipal solid waste", + bus1=urban_central, + bus4=urban_central + " urban central heat", + bus3="co2 atmosphere", + carrier="urban central waste incineration", + p_nom_extendable=True, + # p_nom=biomass_potential['municipal solid waste'] / 8760, + capital_cost=costs.at['waste CHP', 'fixed'] * costs.at['waste CHP', 'efficiency'], + marginal_cost=costs.at['waste CHP', 'VOM'], + efficiency=costs.at['waste CHP', 'efficiency'], + efficiency4=costs.at['waste CHP', 'efficiency-heat'], + efficiency3=costs.at['solid biomass', 'CO2 intensity']-costs.at['solid biomass', 'CO2 intensity'], + lifetime=costs.at['waste CHP', 'lifetime']) + + if beccs: + n.madd("Link", + urban_central + " waste CHP CC", + bus0=urban_central + " municipal solid waste", + bus1=urban_central, + bus4=urban_central + " urban central heat", + bus3="co2 atmosphere", + bus2="co2 stored", + carrier="urban central waste incineration CC", + p_nom_extendable=True, + # p_nom=costs.at['waste CHP CC', 'efficiency'] * biomass_potential['municipal solid waste'] / 8760, + capital_cost=costs.at['waste CHP CC', 'fixed'] * costs.at['waste CHP CC', 'efficiency'] + + costs.at['biomass CHP capture', 'fixed'] * costs.at['solid biomass', 'CO2 intensity'], + marginal_cost=costs.at['waste CHP CC', 'VOM'], + efficiency=costs.at['waste CHP CC', 'efficiency'], + efficiency4=costs.at['waste CHP CC', 'efficiency-heat'], + #Assuming same CO2 intensity as solid biomass + efficiency3=costs.at['solid biomass', 'CO2 intensity'] * (1 - options["cc_fraction"])-costs.at['solid biomass', 'CO2 intensity'], + efficiency2=costs.at['solid biomass', 'CO2 intensity'] * options["cc_fraction"], + c_b=costs.at['waste CHP CC', 'c_b'], + c_v=costs.at['waste CHP CC', 'c_v'], + lifetime=costs.at['waste CHP CC', 'lifetime']) + + if options["biomass_boiler"]: # TODO: Add surcharge for pellets nodes = pop_layout.index