diff --git a/scripts/build_egs_potentials.py b/scripts/build_egs_potentials.py index 4a66f416..d0cc2acd 100644 --- a/scripts/build_egs_potentials.py +++ b/scripts/build_egs_potentials.py @@ -67,7 +67,12 @@ def prepare_egs_data(egs_file): for col in df.columns: country_df[col] = country_data[0][years.index(year)][col] - df = pd.concat((df, country_df.dropna()), axis=0, ignore_index=True) + if country_df.dropna().empty: + continue + elif df.empty: + df = country_df.dropna() + else: + df = pd.concat((df, country_df.dropna()), ignore_index=True) gdf = gpd.GeoDataFrame( df.drop(columns=["Lon", "Lat"]), geometry=gpd.points_from_xy(df.Lon, df.Lat) @@ -89,7 +94,12 @@ if __name__ == "__main__": clusters=37, ) - sustainability_factor = 0.0025 # factor sustainable p_nom vs p_nom + sustainability_factor = 0.0025 + # the share of heat that is replenished from the earth's core. + # we are not constraining ourselves to the sustainable share, but + # inversely apply it to our underlying data, which refers to the + # sustainable heat. + config = snakemake.config egs_data = prepare_egs_data(snakemake.input.egs_cost) @@ -97,7 +107,7 @@ if __name__ == "__main__": if config["sector"]["enhanced_geothermal_optimism"]: egs_data = egs_data[(year := config["costs"]["year"])] logger.info( - f"EGS optimism! Builing EGS potentials with costs estimated for {year}." + f"EGS optimism! Building EGS potentials with costs estimated for {year}." ) else: @@ -106,7 +116,7 @@ if __name__ == "__main__": f"No EGS optimism! Building EGS potentials with {default_year} costs." ) - egs_data.index = egs_data.geometry.astype(str) + egs_data = egs_data.loc[egs_data["PowerSust"] > 0].reset_index(drop=True) egs_shapes = egs_data.geometry network_shapes = ( @@ -117,7 +127,7 @@ if __name__ == "__main__": overlap_matrix = pd.DataFrame( index=network_shapes.index, - columns=(egs_shapes := egs_data.geometry).astype(str).values, + columns=egs_data.index, ) for name, polygon in network_shapes.geometry.items(): @@ -127,5 +137,7 @@ if __name__ == "__main__": overlap_matrix.to_csv(snakemake.output["egs_overlap"]) + # consider not only replenished heat egs_data["p_nom_max"] = egs_data["PowerSust"] / sustainability_factor + egs_data[["p_nom_max", "CAPEX"]].to_csv(snakemake.output["egs_potentials"]) diff --git a/scripts/prepare_sector_network.py b/scripts/prepare_sector_network.py index ad6ee6fa..f19d10ff 100644 --- a/scripts/prepare_sector_network.py +++ b/scripts/prepare_sector_network.py @@ -3303,6 +3303,7 @@ def add_enhanced_geothermal( config = snakemake.config overlap = pd.read_csv(egs_overlap, index_col=0) + overlap.columns = overlap.columns.astype(int) egs_potentials = pd.read_csv(egs_potentials, index_col=0) Nyears = n.snapshot_weightings.generators.sum() / 8760 @@ -3343,20 +3344,16 @@ def add_enhanced_geothermal( "EU geothermal heat", bus="EU geothermal heat", carrier="geothermal heat", - p_nom_max=np.inf, + p_nom_max=egs_potentials["p_nom_max"].sum() / efficiency, p_nom_extendable=True, ) - egs_potentials.index = np.arange(len(egs_potentials)).astype(str) - overlap.columns = egs_potentials.index - for bus, bus_overlap in overlap.iterrows(): if not bus_overlap.sum(): continue overlap = bus_overlap.loc[bus_overlap > 0.0] - - bus_egs = egs_potentials.loc[bus_overlap.loc[bus_overlap > 0.0].index] + bus_egs = egs_potentials.loc[overlap.index] if not len(bus_egs): continue @@ -3567,7 +3564,7 @@ if __name__ == "__main__": if options.get("cluster_heat_buses", False) and not first_year_myopic: cluster_heat_buses(n) - if options.get("enhanced_geothermal"): + if options.get("enhanced_geothermal", False): logger.info("Adding Enhanced Geothermal Potential.") add_enhanced_geothermal( n, snakemake.input["egs_potentials"], snakemake.input["egs_overlap"], costs