From 84ddfea91ee97064df58eaa51b56bf95337e8b80 Mon Sep 17 00:00:00 2001 From: millingermarkus Date: Wed, 3 Jul 2024 12:38:16 +0200 Subject: [PATCH 1/8] Added electrobiofuels --- config/config.default.yaml | 2 ++ scripts/prepare_sector_network.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/config/config.default.yaml b/config/config.default.yaml index ee61d366..60eff164 100644 --- a/config/config.default.yaml +++ b/config/config.default.yaml @@ -606,6 +606,7 @@ sector: conventional_generation: OCGT: gas biomass_to_liquid: false + electrobiofuels: false biosng: false limit_max_growth: enable: false @@ -1030,6 +1031,7 @@ plotting: services rural biomass boiler: '#c6cf98' services urban decentral biomass boiler: '#dde5b5' biomass to liquid: '#32CD32' + electrobiofuels: 'red' BioSNG: '#123456' # power transmission lines: '#6c9459' diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index dfa06cac..1a1f97c0 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2505,6 +2505,36 @@ def add_biomass(n, costs): marginal_cost=costs.at["BtL", "efficiency"] * costs.at["BtL", "VOM"], ) + #Electrobiofuels (BtL with hydrogen addition to make more use of biogenic carbon). + #Combination of efuels and biomass to liquid, both based on Fischer-Tropsch. + #Experimental version - use with caution + if options['electrobiofuels'] and options.get("biomass_spatial", options["biomass_transport"]): + efuel_scale_factor = costs.at['BtL', 'C stored'] + n.madd( + "Link", + spatial.biomass.nodes, + suffix=" electrobiofuels", + bus0=spatial.biomass.nodes, + bus1=spatial.oil.nodes, + bus2=spatial.h2.nodes, + bus3="co2 atmosphere", + carrier="electrobiofuels", + lifetime=costs.at['electrobiofuels', 'lifetime'], + efficiency=costs.at['electrobiofuels', 'efficiency-biomass'], + efficiency2=-costs.at['electrobiofuels', 'efficiency-hydrogen'], + efficiency3=-costs.at['solid biomass', 'CO2 intensity'] + costs.at['BtL', 'CO2 stored'] + * (1 - costs.at['Fischer-Tropsch', 'capture rate']), + p_nom_extendable=True, + capital_cost=costs.at['BtL', 'fixed'] + * costs.at['BtL', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-biomass'] + + efuel_scale_factor * costs.at['Fischer-Tropsch', 'fixed'] + * costs.at['Fischer-Tropsch', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-hydrogen'], + marginal_cost=costs.at['BtL', 'VOM'] + * costs.at['BtL', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-biomass'] + + efuel_scale_factor * costs.at['Fischer-Tropsch', 'VOM'] + * costs.at['Fischer-Tropsch', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-hydrogen'] + ) + # BioSNG from solid biomass if options["biosng"]: n.madd( From b934653b65581b17ae462487f5cdcbed08c97b1d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:42:04 +0000 Subject: [PATCH 2/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 45 ++++++++++++++++++------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 1a1f97c0..50d8e134 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2505,11 +2505,13 @@ def add_biomass(n, costs): marginal_cost=costs.at["BtL", "efficiency"] * costs.at["BtL", "VOM"], ) - #Electrobiofuels (BtL with hydrogen addition to make more use of biogenic carbon). - #Combination of efuels and biomass to liquid, both based on Fischer-Tropsch. - #Experimental version - use with caution - if options['electrobiofuels'] and options.get("biomass_spatial", options["biomass_transport"]): - efuel_scale_factor = costs.at['BtL', 'C stored'] + # Electrobiofuels (BtL with hydrogen addition to make more use of biogenic carbon). + # Combination of efuels and biomass to liquid, both based on Fischer-Tropsch. + # Experimental version - use with caution + if options["electrobiofuels"] and options.get( + "biomass_spatial", options["biomass_transport"] + ): + efuel_scale_factor = costs.at["BtL", "C stored"] n.madd( "Link", spatial.biomass.nodes, @@ -2519,20 +2521,27 @@ def add_biomass(n, costs): bus2=spatial.h2.nodes, bus3="co2 atmosphere", carrier="electrobiofuels", - lifetime=costs.at['electrobiofuels', 'lifetime'], - efficiency=costs.at['electrobiofuels', 'efficiency-biomass'], - efficiency2=-costs.at['electrobiofuels', 'efficiency-hydrogen'], - efficiency3=-costs.at['solid biomass', 'CO2 intensity'] + costs.at['BtL', 'CO2 stored'] - * (1 - costs.at['Fischer-Tropsch', 'capture rate']), + lifetime=costs.at["electrobiofuels", "lifetime"], + efficiency=costs.at["electrobiofuels", "efficiency-biomass"], + efficiency2=-costs.at["electrobiofuels", "efficiency-hydrogen"], + efficiency3=-costs.at["solid biomass", "CO2 intensity"] + + costs.at["BtL", "CO2 stored"] + * (1 - costs.at["Fischer-Tropsch", "capture rate"]), p_nom_extendable=True, - capital_cost=costs.at['BtL', 'fixed'] - * costs.at['BtL', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-biomass'] - + efuel_scale_factor * costs.at['Fischer-Tropsch', 'fixed'] - * costs.at['Fischer-Tropsch', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-hydrogen'], - marginal_cost=costs.at['BtL', 'VOM'] - * costs.at['BtL', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-biomass'] - + efuel_scale_factor * costs.at['Fischer-Tropsch', 'VOM'] - * costs.at['Fischer-Tropsch', 'efficiency'] / costs.at['electrobiofuels', 'efficiency-hydrogen'] + capital_cost=costs.at["BtL", "fixed"] + * costs.at["BtL", "efficiency"] + / costs.at["electrobiofuels", "efficiency-biomass"] + + efuel_scale_factor + * costs.at["Fischer-Tropsch", "fixed"] + * costs.at["Fischer-Tropsch", "efficiency"] + / costs.at["electrobiofuels", "efficiency-hydrogen"], + marginal_cost=costs.at["BtL", "VOM"] + * costs.at["BtL", "efficiency"] + / costs.at["electrobiofuels", "efficiency-biomass"] + + efuel_scale_factor + * costs.at["Fischer-Tropsch", "VOM"] + * costs.at["Fischer-Tropsch", "efficiency"] + / costs.at["electrobiofuels", "efficiency-hydrogen"], ) # BioSNG from solid biomass From 270ce82b9f22dce831dfd87c03e5068eb07e0e07 Mon Sep 17 00:00:00 2001 From: Markus Millinger <50738187+millingermarkus@users.noreply.github.com> Date: Thu, 4 Jul 2024 09:30:22 +0200 Subject: [PATCH 3/8] Cost correction --- scripts/prepare_sector_network.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 50d8e134..b0155a99 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2530,18 +2530,14 @@ def add_biomass(n, costs): p_nom_extendable=True, capital_cost=costs.at["BtL", "fixed"] * costs.at["BtL", "efficiency"] - / costs.at["electrobiofuels", "efficiency-biomass"] + efuel_scale_factor * costs.at["Fischer-Tropsch", "fixed"] - * costs.at["Fischer-Tropsch", "efficiency"] - / costs.at["electrobiofuels", "efficiency-hydrogen"], + * costs.at["Fischer-Tropsch", "efficiency"], marginal_cost=costs.at["BtL", "VOM"] * costs.at["BtL", "efficiency"] - / costs.at["electrobiofuels", "efficiency-biomass"] + efuel_scale_factor * costs.at["Fischer-Tropsch", "VOM"] - * costs.at["Fischer-Tropsch", "efficiency"] - / costs.at["electrobiofuels", "efficiency-hydrogen"], + * costs.at["Fischer-Tropsch", "efficiency"], ) # BioSNG from solid biomass From 192a8eb14bb2fb03d81d04e4a10e7695fac03615 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Jul 2024 07:30:50 +0000 Subject: [PATCH 4/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index b0155a99..8132f343 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -2528,13 +2528,11 @@ def add_biomass(n, costs): + costs.at["BtL", "CO2 stored"] * (1 - costs.at["Fischer-Tropsch", "capture rate"]), p_nom_extendable=True, - capital_cost=costs.at["BtL", "fixed"] - * costs.at["BtL", "efficiency"] + capital_cost=costs.at["BtL", "fixed"] * costs.at["BtL", "efficiency"] + efuel_scale_factor * costs.at["Fischer-Tropsch", "fixed"] * costs.at["Fischer-Tropsch", "efficiency"], - marginal_cost=costs.at["BtL", "VOM"] - * costs.at["BtL", "efficiency"] + marginal_cost=costs.at["BtL", "VOM"] * costs.at["BtL", "efficiency"] + efuel_scale_factor * costs.at["Fischer-Tropsch", "VOM"] * costs.at["Fischer-Tropsch", "efficiency"], From 8bfca9ce696d930b823e4df784c665b8cab23aff Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 2 Aug 2024 14:05:42 +0200 Subject: [PATCH 5/8] enable electrobiofuels also without biomass spatially resolved --- scripts/prepare_sector_network.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 7ecdb836..81acb418 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -200,7 +200,7 @@ def define_spatial(nodes, options): spatial.geothermal_heat = SimpleNamespace() spatial.geothermal_heat.nodes = ["EU enhanced geothermal systems"] spatial.geothermal_heat.locations = ["EU"] - + return spatial @@ -2514,13 +2514,14 @@ def add_biomass(n, costs): # Electrobiofuels (BtL with hydrogen addition to make more use of biogenic carbon). # Combination of efuels and biomass to liquid, both based on Fischer-Tropsch. # Experimental version - use with caution - if options["electrobiofuels"] and options.get( - "biomass_spatial", options["biomass_transport"] - ): + if options["electrobiofuels"]: + efuel_scale_factor = costs.at["BtL", "C stored"] + name = (pd.Index(spatial.biomass.nodes) + " " + + pd.Index(spatial.h2.nodes.str.replace(" H2", ""))) n.madd( "Link", - spatial.biomass.nodes, + name, suffix=" electrobiofuels", bus0=spatial.biomass.nodes, bus1=spatial.oil.nodes, From c7a186863e6ca2ed336cc0fc19bf194914910a1b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 2 Aug 2024 12:07:16 +0000 Subject: [PATCH 6/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- scripts/prepare_sector_network.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 81acb418..37d1299c 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -200,7 +200,7 @@ def define_spatial(nodes, options): spatial.geothermal_heat = SimpleNamespace() spatial.geothermal_heat.nodes = ["EU enhanced geothermal systems"] spatial.geothermal_heat.locations = ["EU"] - + return spatial @@ -2517,8 +2517,11 @@ def add_biomass(n, costs): if options["electrobiofuels"]: efuel_scale_factor = costs.at["BtL", "C stored"] - name = (pd.Index(spatial.biomass.nodes) + " " - + pd.Index(spatial.h2.nodes.str.replace(" H2", ""))) + name = ( + pd.Index(spatial.biomass.nodes) + + " " + + pd.Index(spatial.h2.nodes.str.replace(" H2", "")) + ) n.madd( "Link", name, From 9c35a6716cf7763ed3a5f387ed414e39d86c5050 Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 2 Aug 2024 14:11:26 +0200 Subject: [PATCH 7/8] add documentation for new config option --- doc/configtables/sector.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/configtables/sector.csv b/doc/configtables/sector.csv index 89c0e55c..f6e52116 100644 --- a/doc/configtables/sector.csv +++ b/doc/configtables/sector.csv @@ -138,6 +138,7 @@ biomass_transport,--,"{true, false}",Add option for transporting solid biomass b biogas_upgrading_cc,--,"{true, false}",Add option to capture CO2 from biomass upgrading 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 +electrobiofuels,--,"{true, false}","Add option for transforming solid biomass and hydrogen into liquid fuel to make more use of biogenic carbon, as a combination of BtL and Fischer-Tropsch" biosng,--,"{true, false}",Add option for transforming solid biomass into synthesis gas with the same properties as natural gas limit_max_growth,,, -- enable,--,"{true, false}",Add option to limit the maximum growth of a carrier From 39c502f29a9b82b073c2b9f5d65bd36837c793cc Mon Sep 17 00:00:00 2001 From: lisazeyen Date: Fri, 2 Aug 2024 14:13:21 +0200 Subject: [PATCH 8/8] add release note --- doc/release_notes.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/release_notes.rst b/doc/release_notes.rst index 1908d739..4293541b 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -10,6 +10,8 @@ Release Notes Upcoming Release ================ +* Add option to produce 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 * Renamed the carrier of batteries in BEVs from `battery storage` to `EV battery` and the corresponding bus carrier from `Li ion` to `EV battery`. This is to avoid confusion with stationary battery storage.