diff --git a/config/config.default.yaml b/config/config.default.yaml index 8986d153..3d1292e3 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -42,7 +42,7 @@ scenario: ll: - vopt clusters: - - 37 + - 38 - 128 - 256 opts: @@ -665,6 +665,7 @@ sector: biomass_to_liquid: false electrobiofuels: false biosng: false + bioH2: false municipal_solid_waste: false limit_max_growth: enable: false @@ -1108,6 +1109,7 @@ plotting: unsustainable bioliquids: '#32CD32' electrobiofuels: 'red' BioSNG: '#123456' + solid biomass to hydrogen: '#654321' # power transmission lines: '#6c9459' transmission lines: '#6c9459' diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 9b8ed932..88f56abe 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -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 +bioH2,--,"{true, false}",Add option for transforming solid biomass into hydrogen with carbon capture 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 diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 09af066c..6fb6c51c 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -9,6 +9,9 @@ Release Notes Upcoming Release ================ + +* Add option to produce hydrogen from solid biomass (flag ``solid biomass to hydrogen``), combined with carbon capture + * Fixed PDF encoding in ``build_biomass_transport_costs`` with update of tabula-py and jpype1 * More modular and flexible handling of transmission projects. One can now add new transmission projects in a subfolder of `data/transmission projects` similar to the files in the template folder. After adding the new files and updating the config section `transmission_projects:`, transmission projects will be included if they are not duplicates of existing lines or other projects. diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 57fe675d..23863067 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2829,6 +2829,29 @@ def add_biomass(n, costs): marginal_cost=costs.at["BioSNG", "VOM"] * costs.at["BioSNG", "efficiency"], ) + if options["bioH2"]: + name = (pd.Index(spatial.biomass.nodes) + " " + + pd.Index(spatial.h2.nodes.str.replace(" H2", ""))) + n.madd( + "Link", + name, + suffix=" solid biomass to hydrogen CC", + bus0=spatial.biomass.nodes, + bus1=spatial.h2.nodes, + bus2=spatial.co2.nodes, + bus3="co2 atmosphere", + carrier="solid biomass to hydrogen", + efficiency=costs.at['solid biomass to hydrogen', 'efficiency'], + efficiency2=costs.at['solid biomass', 'CO2 intensity'] * options["cc_fraction"], + efficiency3=-costs.at['solid biomass', 'CO2 intensity'] * options["cc_fraction"], + p_nom_extendable=True, + capital_cost=costs.at['solid biomass to hydrogen', 'fixed'] * costs.at['solid biomass to hydrogen', 'efficiency'] + + costs.at['biomass CHP capture', 'fixed'] * costs.at['solid biomass', 'CO2 intensity'], + overnight_cost=costs.at['solid biomass to hydrogen', 'investment'] * costs.at['solid biomass to hydrogen', 'efficiency'] + + costs.at['biomass CHP capture', 'investment'] * costs.at['solid biomass', 'CO2 intensity'], + marginal_cost=0., + ) + def add_industry(n, costs): logger.info("Add industrial demand") diff --git a/scripts/simplify_network.py b/scripts/simplify_network.py index 66a5d119..9db3435b 100644 --- a/scripts/simplify_network.py +++ b/scripts/simplify_network.py @@ -301,7 +301,7 @@ def simplify_links( # Only span graph over the DC link components G = n.graph(branch_components=["Link"]) - def split_links(nodes, added_supernodes=None): + def split_links(nodes, added_supernodes): nodes = frozenset(nodes) seen = set() @@ -363,7 +363,9 @@ def simplify_links( added_supernodes.append(node_corsica) for lbl in labels.value_counts().loc[lambda s: s > 2].index: - for b, buses, links in split_links(labels.index[labels == lbl]): + for b, buses, links in split_links( + labels.index[labels == lbl], added_supernodes + ): if len(buses) <= 2: continue