diff --git a/Snakefile b/Snakefile index 2861a6b4..d428db45 100644 --- a/Snakefile +++ b/Snakefile @@ -101,7 +101,7 @@ rule build_simplified_population_layouts: script: "scripts/build_clustered_population_layouts.py" -if config["sector"]["gas_network"]: +if config["sector"]["gas_network"] or config["sector"]["H2_retrofit"]: datafiles = [ "IGGIELGN_LNGs.geojson", diff --git a/config.default.yaml b/config.default.yaml index 33cc2d38..da9f0928 100644 --- a/config.default.yaml +++ b/config.default.yaml @@ -256,7 +256,7 @@ sector: # https://gasforclimate2050.eu/wp-content/uploads/2020/07/2020_European-Hydrogen-Backbone_Report.pdf # 60% of original natural gas capacity could be used in cost-optimal case as H2 capacity H2_retrofit_capacity_per_CH4: 0.6 # ratio for H2 capacity per original CH4 capacity of retrofitted pipelines - gas_network_connectivity_upgrade: 3 # https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation.html#networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation + gas_network_connectivity_upgrade: 1 # https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation.html#networkx.algorithms.connectivity.edge_augmentation.k_edge_augmentation gas_distribution_grid: true gas_distribution_grid_cost_factor: 1.0 #multiplies cost in data/costs.csv biomass_transport: false # biomass transport between nodes diff --git a/doc/release_notes.rst b/doc/release_notes.rst index c7ddea98..59dc7ecc 100644 --- a/doc/release_notes.rst +++ b/doc/release_notes.rst @@ -41,13 +41,14 @@ incorporates retrofitting options to hydrogen. the gas network is activated, all the gas demands are regionally disaggregated as well. -* New constraint allows retrofitting of gas pipelines to hydrogen pipelines. +* New constraint allows endogenous retrofitting of gas pipelines to hydrogen pipelines. This option is activated via the setting ``sector: H2_retrofit:``. For every unit of gas pipeline capacity dismantled, ``sector: H2_retrofit_capacity_per_CH4`` units are made available as hydrogen pipeline capacity in the corresponding corridor. These repurposed hydrogen pipelines have lower costs than new hydrogen pipelines. Both new and repurposed pipelines - can be built simultaneously. + can be built simultaneously. The retrofitting option ``sector: H2_retrofit:`` also works + with a copperplated methane infrastructure, i.e. when ``sector: gas_network: false``. * New hydrogen pipelines can now be built where there are already power or gas transmission routes. Previously, only the electricity transmission routes were diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 86fd3c8c..834a41e1 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -1078,17 +1078,20 @@ def add_storage_and_grids(n, costs): capital_cost=h2_capital_cost ) - if options["gas_network"]: - - logger.info("Add gas network") + if options["gas_network"] or options["H2_retrofit"]: fn = snakemake.input.clustered_gas_network gas_pipes = pd.read_csv(fn, index_col=0) + if options["gas_network"]: + + logger.info("Add gas infrastructure, incl. LNG terminals, production and entry-points.") + if options["H2_retrofit"]: gas_pipes["p_nom_max"] = gas_pipes.p_nom gas_pipes["p_nom_min"] = 0. - gas_pipes["capital_cost"] = 0. + # 0.1 EUR/MWkm/a to prefer decommissioning to address degeneracy + gas_pipes["capital_cost"] = 0.1 * gas_pipes.length else: gas_pipes["p_nom_max"] = np.inf gas_pipes["p_nom_min"] = gas_pipes.p_nom @@ -1163,13 +1166,13 @@ def add_storage_and_grids(n, costs): lifetime=costs.at['CH4 (g) pipeline', 'lifetime'] ) - # retroftting existing CH4 pipes to H2 pipes - if options["gas_network"] and options["H2_retrofit"]: + if options["H2_retrofit"]: - gas_pipe_i = n.links[n.links.carrier == "gas pipeline"].index - n.links.loc[gas_pipe_i, "p_nom_extendable"] = True - h2_pipes = gas_pipes.rename(index=lambda x: - x.replace("gas pipeline", "H2 pipeline retrofitted")) + logger.info("Add retrofitting options of existing CH4 pipes to H2 pipes.") + + fr = "gas pipeline" + to = "H2 pipeline retrofitted" + h2_pipes = gas_pipes.rename(index=lambda x: x.replace(fr, to)) n.madd("Link", h2_pipes.index, @@ -1187,6 +1190,8 @@ def add_storage_and_grids(n, costs): if options.get("H2_network", True): + logger.info("Add options for new hydrogen pipelines.") + h2_pipes = create_network_topology(n, "H2 pipeline ", carriers=["DC", "gas pipeline"]) # TODO Add efficiency losses diff --git a/scripts/solve_network.py b/scripts/solve_network.py index c784c913..30cf62b2 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -200,8 +200,10 @@ def add_pipe_retrofit_constraint(n): CH4_per_H2 = 1 / n.config["sector"]["H2_retrofit_capacity_per_CH4"] + fr = "H2 pipeline retrofitted" + to = "gas pipeline" lhs = linexpr( - (CH4_per_H2, link_p_nom.loc[h2_retrofitted_i].rename(index=lambda x: x.replace("H2 pipeline retrofitted", "gas pipeline"))), + (CH4_per_H2, link_p_nom.loc[h2_retrofitted_i].rename(index=lambda x: x.replace(fr, to))), (1, link_p_nom.loc[gas_pipes_i]) )