reforumlate constraint

This commit is contained in:
lisazeyen 2024-05-15 14:59:34 +02:00
parent 2d2b0338cc
commit a9be2825ec

View File

@ -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)