diff --git a/scripts/solve_network.py b/scripts/solve_network.py index 302f1be2..665274b7 100644 --- a/scripts/solve_network.py +++ b/scripts/solve_network.py @@ -230,79 +230,70 @@ def add_solar_potential_constraints(n, config): } rename = {"Generator-ext": "Generator"} - gen_index = n.generators[n.generators.p_nom_extendable].index - filters = [ - ("solar", True), - ("thermal", False), - ("rooftop", False), - ] ## filter all utility solar generation except solar thermal - solar = reduce( - lambda gen_index, f: gen_index[gen_index.str.contains(f[0]) == f[1]], - filters, - gen_index, - ) + solar_carriers = ["solar", "solar-hsat"] + solar = n.generators[n.generators.carrier.isin(solar_carriers) + & n.generators.p_nom_extendable].index + solar_today = n.generators[ (n.generators.carrier == "solar") & (n.generators.p_nom_extendable) ].index solar_hsat = n.generators[(n.generators.carrier == "solar-hsat")].index - if not solar.empty: + if solar.empty: return - land_use = pd.DataFrame(1, index=solar, columns=["land_use_factor"]) - for key in land_use_factors.keys(): - land_use = land_use.apply( - lambda x: (x * land_use_factors[key]) if key in x.name else x, axis=1 - ) - - if "m" in snakemake.wildcards.clusters: - location = pd.Series( - [" ".join(i.split(" ")[:2]) for i in n.generators.index], - index=n.generators.index, - ) - ggrouper = pd.Series( - n.generators.loc[solar].index.rename("bus").map(location), - index=n.generators.loc[solar].index, - ).to_xarray() - rhs = ( - n.generators.loc[solar_today, "p_nom_max"] - .groupby( - n.generators.loc[solar_today].index.rename("bus").map(location) - ) - .sum() - - n.generators.loc[solar_hsat, "p_nom_opt"] - .groupby(n.generators.loc[solar_hsat].index.rename("bus").map(location)) - .sum() - * land_use_factors["solar-hsat"] - ).clip(lower=0) - - else: - location = ( - n.buses.location - if "location" in n.buses.columns - else pd.Series(n.buses.index, index=n.buses.index) - ) - ggrouper = n.generators.loc[solar].bus - rhs = ( - n.generators.loc[solar_today, "p_nom_max"] - .groupby(n.generators.loc[solar_today].bus.map(location)) - .sum() - - n.generators.loc[solar_hsat, "p_nom_opt"] - .groupby(n.generators.loc[solar_hsat].bus.map(location)) - .sum() - * land_use_factors["solar-hsat"] - ).clip(lower=0) - - lhs = ( - ( - n.model["Generator-p_nom"].rename(rename).loc[solar] - * land_use.squeeze().values - ) - .groupby(ggrouper) - .sum() + land_use = pd.DataFrame(1, index=solar, columns=["land_use_factor"]) + for carrier, factor in land_use_factors.items(): + land_use = land_use.apply( + lambda x: (x * factor) if carrier in x.name else x, axis=1 ) - print("adding solar rooftop constraints...") - n.model.add_constraints(lhs <= rhs, name="solar_potential") + if "m" in snakemake.wildcards.clusters: + location = pd.Series( + [" ".join(i.split(" ")[:2]) for i in n.generators.index], + index=n.generators.index, + ) + ggrouper = pd.Series( + n.generators.loc[solar].index.rename("bus").map(location), + index=n.generators.loc[solar].index, + ).to_xarray() + rhs = ( + n.generators.loc[solar_today, "p_nom_max"] + .groupby( + n.generators.loc[solar_today].index.rename("bus").map(location) + ) + .sum() + - n.generators.loc[solar_hsat, "p_nom_opt"] + .groupby(n.generators.loc[solar_hsat].index.rename("bus").map(location)) + .sum() + * land_use_factors["solar-hsat"] + ).clip(lower=0) + + else: + location = ( + pd.Series(n.buses.index, index=n.buses.index) + ) + ggrouper = n.generators.loc[solar].bus + rhs = ( + n.generators.loc[solar_today, "p_nom_max"] + .groupby(n.generators.loc[solar_today].bus.map(location)) + .sum() + - n.generators.loc[solar_hsat, "p_nom_opt"] + .groupby(n.generators.loc[solar_hsat].bus.map(location)) + .sum() + * land_use_factors["solar-hsat"] + ).clip(lower=0) + + lhs = ( + ( + n.model["Generator-p_nom"].rename(rename).loc[solar] + * land_use.squeeze() + ) + .groupby(ggrouper) + .sum() + ) + + print("adding solar rooftop constraints...") + n.model.add_constraints(lhs <= rhs, name="solar_potential") def add_co2_sequestration_limit(n, limit=200): @@ -1053,13 +1044,13 @@ if __name__ == "__main__": from _helpers import mock_snakemake snakemake = mock_snakemake( - "solve_sector_network", - configfiles="../config/test/config.perfect.yaml", + "solve_network", + configfiles="../config/test/config.electricity.yaml", simpl="", opts="", - clusters="37", - ll="v1.0", - sector_opts="CO2L0-1H-T-H-B-I-A-dist1", + clusters="5", + ll="v1.5", + sector_opts="Co2L-24h", planning_horizons="2030", ) configure_logging(snakemake)