diff --git a/config/config.default.yaml b/config/config.default.yaml index e3637c77..5229c385 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -355,7 +355,6 @@ biomass: - Secondary Forestry residues - woodchips - Sawdust - Residues from landscape care - - Municipal waste not included: - Sugar from sugar beet - Rape seed @@ -369,6 +368,8 @@ biomass: biogas: - Manure solid, liquid - Sludge + municipal solid waste: + - Municipal waste # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#solar-thermal solar_thermal: @@ -615,6 +616,7 @@ sector: biomass_to_liquid: false electrobiofuels: false biosng: false + municipal_solid_waste: false limit_max_growth: enable: false # allowing 30% larger than max historic growth @@ -642,6 +644,7 @@ sector: max_amount: 1390 # TWh upstream_emissions_factor: .1 #share of solid biomass CO2 emissions at full combustion + # docs in https://pypsa-eur.readthedocs.io/en/latest/configuration.html#industry industry: St_primary_fraction: @@ -1038,6 +1041,7 @@ plotting: biogas: '#e3d37d' biomass: '#baa741' solid biomass: '#baa741' + municipal solid waste: '#91ba41' solid biomass import: '#d5ca8d' solid biomass transport: '#baa741' solid biomass for industry: '#7a6d26' diff --git a/data/links_p_nom.csv b/data/links_p_nom.csv index bd7a4c95..56a99e52 100644 --- a/data/links_p_nom.csv +++ b/data/links_p_nom.csv @@ -5,7 +5,7 @@ Cross-Channel,France - Echingen 50°41′48″N 1°38′21″E / 50.69667 Volgograd-Donbass,Russia - Volzhskaya 48°49′34″N 44°40′20″E / 48.82611°N 44.67222°E,Ukraine - Mikhailovskaya 48°39′13″N 38°33′56″E / 48.65361°N 38.56556°E,475(0/475),400,750.0,1965,Merc/Thyr,Shut down in 2014,[1],44.672222222222224,48.82611111111111,38.565555555555555,48.65361111111111 Konti-Skan 1,Denmark - Vester Hassing 57°3′46″N 10°5′24″E / 57.06278°N 10.09000°E,Sweden - Stenkullen 57°48′15″N 12°19′13″E / 57.80417°N 12.32028°E,176(87/89),250,250.0,1965,Merc,Replaced in August 2006 by modern converters using thyristors,[1],10.09,57.062777777777775,12.320277777777777,57.80416666666667 SACOI 1a,Italy - Suvereto 43°3′10″N 10°41′42″E / 43.05278°N 10.69500°E ( before 1992: Italy - San Dalmazio 43°15′43″N 10°55′05″E / 43.26194°N 10.91806°E),"France- Lucciana 42°31′40″N 9°26′59″E / 42.52778°N 9.44972°E",483(365/118),200,200.0,1965,Merc,"Replaced in 1986 by Thyr- multiterminal scheme",[1],10.695,43.05277777777778,9.449722222222222,42.52777777777778 -SACOI 1b,"France- Lucciana 42°31′40″N 9°26′59″E / 42.52778°N 9.44972°E", "Codrongianos- Italy 40°39′7″N 8°42′48″E / 40.65194°N 8.71333°E",483(365/118),200,200.0,1965,Merc,"Replaced in 1986 by Thyr- multiterminal scheme",[1],9.449722222222222,42.52777777777778,8.679351,40.65765 +SACOI 1b,"France- Lucciana 42°31′40″N 9°26′59″E / 42.52778°N 9.44972°E","Codrongianos- Italy 40°39′7″N 8°42′48″E / 40.65194°N 8.71333°E",483(365/118),200,200.0,1965,Merc,"Replaced in 1986 by Thyr- multiterminal scheme",[1],9.449722222222222,42.52777777777778,8.679351,40.65765 Kingsnorth,UK - Kingsnorth 51°25′11″N 0°35′46″E / 51.41972°N 0.59611°E,UK - London-Beddington 51°22′23″N 0°7′38″W / 51.37306°N 0.12722°W,85(85/0),266,320.0,1975,Merc,Bipolar scheme Supplier: English Electric Shut down in 1987,[33],0.5961111111111111,51.41972222222222,-0.1272222222222222,51.37305555555555 Skagerrak 1 + 2,Denmark - Tjele 56°28′44″N 9°34′1″E / 56.47889°N 9.56694°E,Norway - Kristiansand 58°15′36″N 7°53′55″E / 58.26000°N 7.89861°E,230(130/100),250,500.0,1977,Thyr,Supplier: STK(Nexans) Control system upgrade by ABB in 2007,[34][35][36],9.566944444444445,56.47888888888889,7.898611111111111,58.26 Gotland 2,Sweden - Västervik 57°43′41″N 16°38′51″E / 57.72806°N 16.64750°E,Sweden - Yigne 57°35′13″N 18°11′44″E / 57.58694°N 18.19556°E,99.5(92.9/6.6),150,130.0,1983,Thyr,Supplier: ABB,,16.6475,57.72805555555556,18.195555555555554,57.58694444444444 @@ -23,7 +23,7 @@ Visby-Nas,Sweden - Nas 57°05′58″N 18°14′27″E / 57.09944°N 18.24 SwePol,Poland - Wierzbięcin 54°30′8″N 16°53′28″E / 54.50222°N 16.89111°E,Sweden - Stärnö 56°9′11″N 14°50′29″E / 56.15306°N 14.84139°E,245(245/0),450,600.0,2000,Thyr,Supplier: ABB,[38],16.891111111111112,54.50222222222222,14.841388888888888,56.153055555555554 Tjæreborg,Denmark - Tjæreborg/Enge 55°26′52″N 8°35′34″E / 55.44778°N 8.59278°E,Denmark - Tjæreborg/Substation 55°28′07″N 8°33′36″E / 55.46861°N 8.56000°E,4.3(4.3/0),9,7.0,2000,IGBT,Interconnection to wind power generating stations,,8.592777777777778,55.44777777777778,8.56,55.46861111111111 Italy-Greece,Greece - Arachthos 39°11′00″N 20°57′48″E / 39.18333°N 20.96333°E,Italy - Galatina 40°9′53″N 18°7′49″E / 40.16472°N 18.13028°E,310(200/110),400,500.0,2001,Thyr,,,20.963333333333335,39.18333333333333,18.130277777777778,40.164722222222224 -Moyle,UK - Auchencrosh 55°04′10″N 4°58′50″W / 55.06944°N 4.98056°W,UK - N. Ireland- Ballycronan More 54°50′34″N 5°46′11″W / 54.84278°N 5.76972°W,63.5(63.5/0),250,2501.0,2001,Thyr,"Supplier: Siemens- Nexans",[39],-4.980555555555556,55.06944444444444,-5.769722222222223,54.842777777777776 +Moyle,UK - Auchencrosh 55°04′10″N 4°58′50″W / 55.06944°N 4.98056°W,UK - N. Ireland- Ballycronan More 54°50′34″N 5°46′11″W / 54.84278°N 5.76972°W,63.5(63.5/0),250,500.0,2001,Thyr,"Supplier: Siemens- Nexans",[39],-4.980555555555556,55.06944444444444,-5.769722222222223,54.842777777777776 HVDC Troll,Norway - Kollsnes 60°33′01″N 4°50′26″E / 60.55028°N 4.84056°E,Norway - Offshore platform Troll A 60°40′00″N 3°40′00″E / 60.66667°N 3.66667°E,70(70/0),60,80.0,2004,IGBT,Power supply for offshore gas compressor Supplier: ABB,[40],4.8405555555555555,60.55027777777778,3.6666666666666665,60.666666666666664 Estlink,Finland - Espoo 60°12′14″N 24°33′06″E / 60.20389°N 24.55167°E,Estonia - Harku 59°23′5″N 24°33′37″E / 59.38472°N 24.56028°E,105(105/0),150,350.0,2006,IGBT,Supplier: ABB,[40],24.551666666666666,60.20388888888889,24.560277777777777,59.38472222222222 NorNed,Netherlands - Eemshaven 53°26′4″N 6°51′57″E / 53.43444°N 6.86583°E,Norway - Feda 58°16′58″N 6°51′55″E / 58.28278°N 6.86528°E,580(580/0),450,700.0,2008,Thyr,"Supplier: ABB- Nexans",[40],6.865833333333334,53.434444444444445,6.865277777777778,58.28277777777778 diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index e97c4230..e0deb8ca 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -84,7 +84,7 @@ boilers,--,"{true, false}",Add option for transforming gas into heat using gas b resistive_heaters,--,"{true, false}",Add option for transforming electricity into heat using resistive heaters (independently from gas boilers) oil_boilers,--,"{true, false}",Add option for transforming oil into heat using boilers biomass_boiler,--,"{true, false}",Add option for transforming biomass into heat using boilers -overdimension_individual_heating,--,"float",Add option for overdimensioning individual heating systems by a certain factor. This allows them to cover heat demand peaks e.g. 10% higher than those in the data with a setting of 1.1. +overdimension_individual_heating,--,float,Add option for overdimensioning individual heating systems by a certain factor. This allows them to cover heat demand peaks e.g. 10% higher than those in the data with a setting of 1.1. chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) micro_chp,--,"{true, false}",Add option for using Combined Heat and Power (CHP) for decentral areas. solar_thermal,--,"{true, false}",Add option for using solar thermal to generate heat. @@ -151,6 +151,7 @@ biogas_upgrading_cc,--,"{true, false}",Add option to capture CO2 from biomass up conventional_generation,,,Add a more detailed description of conventional carriers. Any power generation requires the consumption of fuel from nodes representing that fuel. biomass_to_liquid,--,"{true, false}",Add option for transforming solid biomass into liquid fuel with the same properties as oil biosng,--,"{true, false}",Add option for transforming solid biomass into synthesis gas with the same properties as natural gas +municipal_solid_waste,--,"{true, false}",Add option for municipal solid waste limit_max_growth,,, -- enable,--,"{true, false}",Add option to limit the maximum growth of a carrier -- factor,p.u.,float,The maximum growth factor of a carrier (e.g. 1.3 allows 30% larger than max historic growth) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index c481e34c..9ce418b2 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -11,9 +11,12 @@ Upcoming Release ================ * Changed heat pump COP approximation for central heating to be based on `Jensen et al. (2018) `__ and a default forward temperature of 90C. This is more realistic for district heating than the previously used approximation method. + +* split solid biomass potentials into solid biomass and municipal solid waste. Add option to use municipal solid waste. This option is only activated in combination with the flag ``waste_to_energy`` + * Add option to import solid biomass -* Add option to produce electrobiofuels (flag ``electrobiofuels`) from solid biomass and hydrogen, as a combination of BtL and Fischer-Tropsch to make more use of the biogenic carbon +* Add option to produce electrobiofuels (flag ``electrobiofuels``) from solid biomass and hydrogen, as a combination of BtL and Fischer-Tropsch to make more use of the biogenic carbon * Add flag ``sector: fossil_fuels`` in config to remove the option of importing fossil fuels diff --git a/scripts/base_network.py b/scripts/base_network.py index 118e7dba..8172b332 100644 --- a/scripts/base_network.py +++ b/scripts/base_network.py @@ -808,7 +808,7 @@ def voronoi(points, outline, crs=4326): voronoi = gpd.GeoDataFrame(geometry=voronoi) joined = gpd.sjoin_nearest(pts, voronoi, how="right") - return joined.dissolve(by="Bus").squeeze() + return joined.dissolve(by="Bus").reindex(points.index).squeeze() def build_bus_shapes(n, country_shapes, offshore_shapes, countries): diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 9ea69dfb..83b76bb9 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -60,19 +60,25 @@ def define_spatial(nodes, options): # biomass spatial.biomass = SimpleNamespace() + spatial.msw = SimpleNamespace() if options.get("biomass_spatial", options["biomass_transport"]): spatial.biomass.nodes = nodes + " solid biomass" 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 @@ -2252,12 +2258,54 @@ 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") + if ( + options["municipal_solid_waste"] + and not options["industry"] + and cf_industry["waste_to_energy"] + or cf_industry["waste_to_energy_cc"] + ): + logger.warning( + "Flag municipal_solid_waste can be only used with industry " + "sector waste to energy." + "Setting municipal_solid_waste=False." + ) + options["municipal_solid_waste"] = False + + if options["municipal_solid_waste"]: + + n.add("Carrier", "municipal solid waste") + + n.madd( + "Bus", + spatial.msw.nodes, + location=spatial.msw.locations, + carrier="municipal solid waste", + ) + + e_max_pu = pd.Series([1] * (len(n.snapshots) - 1) + [0], index=n.snapshots) + 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_max_pu=e_max_pu, + e_initial=msw_biomass_potentials_spatial, + ) + n.madd( "Bus", spatial.gas.biogas, @@ -2413,6 +2461,19 @@ def add_biomass(n, costs): carrier="solid biomass transport", ) + if options["municipal_solid_waste"]: + 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( @@ -2442,6 +2503,26 @@ def add_biomass(n, costs): type="operational_limit", ) + if options["municipal_solid_waste"]: + # 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"]: @@ -3147,6 +3228,17 @@ def add_industry(n, costs): efficiency3=process_co2_per_naphtha, ) + if options.get("biomass", True) and options["municipal_solid_waste"]: + n.madd( + "Link", + spatial.msw.locations, + bus0=spatial.msw.nodes, + bus1=non_sequestered_hvc_locations, + carrier="municipal solid waste", + p_nom_extendable=True, + efficiency=1.0, + ) + n.madd( "Link", spatial.oil.demand_locations, @@ -4039,7 +4131,7 @@ if __name__ == "__main__": "prepare_sector_network", simpl="", opts="", - clusters="1", + clusters="37", ll="vopt", sector_opts="", planning_horizons="2050",