diff --git a/Snakefile b/Snakefile index 45cc654d..6f3c118f 100644 --- a/Snakefile +++ b/Snakefile @@ -229,6 +229,7 @@ rule prepare_sector_network: timezone_mappings='data/timezone_mappings.csv', heat_profile="data/heat_load_profile_BDEW.csv", costs=config['costs_dir'] + "costs_{planning_horizons}.csv", + h2_cavern = "data/hydrogen_salt_cavern_potentials.csv", co2_budget="data/co2_budget.csv", profile_offwind_ac=pypsaeur("resources/profile_offwind-ac.nc"), profile_offwind_dc=pypsaeur("resources/profile_offwind-dc.nc"), diff --git a/data/hydrogen_salt_cavern_potentials.csv b/data/hydrogen_salt_cavern_potentials.csv new file mode 100644 index 00000000..e9d269af --- /dev/null +++ b/data/hydrogen_salt_cavern_potentials.csv @@ -0,0 +1,31 @@ +,,TWh +AT,False, +BA,False, +BE,False, +BG,False, +CH,False, +CZ,False, +DE,True,4500 +DK,True,700 +EE,False, +ES,True,350 +FI,False, +FR,False, +GB,True,1050 +GR,True,120 +HR,False, +HU,False, +IE,False, +IT,False, +LT,False, +LU,False, +LV,False, +NL,True,150 +NO,False, +PL,True,120 +PT,True,400 +RO,False, +RS,False, +SE,False, +SI,False, +SK,False, diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index 7c219918..d993c341 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -795,21 +795,42 @@ def add_storage(network): capital_cost=costs.at["fuel cell","fixed"]*costs.at["fuel cell","efficiency"], #NB: fixed cost is per MWel lifetime=costs.at['fuel cell','lifetime']) + cavern_nodes = pd.DataFrame() + if options['hydrogen_underground_storage']: - h2_capital_cost = costs.at["gas storage","fixed"] - #TODO: change gas storage to hydrogen underground storage when cost database is updated - #h2_capital_cost = costs.at["hydrogen underground storage","fixed"] - else: - h2_capital_cost = costs.at["hydrogen storage","fixed"] + h2_salt_cavern_potential = pd.read_csv(snakemake.input.h2_cavern, + index_col=0, skiprows=[0], + names=["potential", "TWh"]) + h2_cavern_ct = h2_salt_cavern_potential[h2_salt_cavern_potential.potential] + cavern_nodes = pop_layout[pop_layout.ct.isin(h2_cavern_ct.index)] + + h2_capital_cost = costs.at["hydrogen storage underground", "fixed"] + + # assumptions: weight storage potential in a country by population + h2_pot = (h2_cavern_ct.loc[cavern_nodes.ct, "TWh"].astype(float) + .reset_index().set_index(cavern_nodes.index)) + h2_pot = h2_pot.TWh * cavern_nodes.fraction + + network.madd("Store", + cavern_nodes.index + " H2 Store", + bus=cavern_nodes.index + " H2", + e_nom_extendable=True, + e_nom_max=h2_pot.values, + e_cyclic=True, + carrier="H2 Store", + capital_cost=h2_capital_cost) + + # hydrogen stored overground + h2_capital_cost = costs.at["hydrogen storage tank", "fixed"] + nodes_overground = nodes ^ cavern_nodes.index network.madd("Store", - nodes + " H2 Store", - bus=nodes + " H2", + nodes_overground + " H2 Store", + bus=nodes_overground + " H2", e_nom_extendable=True, e_cyclic=True, carrier="H2 Store", - capital_cost=h2_capital_cost, - lifetime=costs.at['gas storage','lifetime']) + capital_cost=h2_capital_cost) h2_links = pd.DataFrame(columns=["bus0","bus1","length"]) prefix = "H2 pipeline "