fix bugs in reserve constraint
This commit is contained in:
parent
d0c86a7f29
commit
27dc9cedfd
@ -43,6 +43,7 @@ from vresutils.benchmark import memory_logger
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
pypsa.pf.logger.setLevel(logging.WARNING)
|
pypsa.pf.logger.setLevel(logging.WARNING)
|
||||||
|
from pypsa.descriptors import get_switchable_as_dense as get_as_dense
|
||||||
|
|
||||||
|
|
||||||
def add_land_use_constraint(n, config):
|
def add_land_use_constraint(n, config):
|
||||||
@ -414,7 +415,7 @@ def add_operational_reserve_margin(n, sns, config):
|
|||||||
0, np.inf, coords=[sns, n.generators.index], name="Generator-r"
|
0, np.inf, coords=[sns, n.generators.index], name="Generator-r"
|
||||||
)
|
)
|
||||||
reserve = n.model["Generator-r"]
|
reserve = n.model["Generator-r"]
|
||||||
lhs = reserve.sum("Generator")
|
summed_reserve = reserve.sum("Generator")
|
||||||
|
|
||||||
# Share of extendable renewable capacities
|
# Share of extendable renewable capacities
|
||||||
ext_i = n.generators.query("p_nom_extendable").index
|
ext_i = n.generators.query("p_nom_extendable").index
|
||||||
@ -426,10 +427,10 @@ def add_operational_reserve_margin(n, sns, config):
|
|||||||
.loc[vres_i.intersection(ext_i)]
|
.loc[vres_i.intersection(ext_i)]
|
||||||
.rename({"Generator-ext": "Generator"})
|
.rename({"Generator-ext": "Generator"})
|
||||||
)
|
)
|
||||||
lhs = lhs + (p_nom_vres * (-EPSILON_VRES * capacity_factor)).sum()
|
lhs = summed_reserve + (p_nom_vres * (-EPSILON_VRES * capacity_factor)).sum("Generator")
|
||||||
|
|
||||||
# Total demand per t
|
# Total demand per t
|
||||||
demand = n.loads_t.p_set.sum(axis=1)
|
demand = get_as_dense(n, "Load", "p_set").sum(axis=1)
|
||||||
|
|
||||||
# VRES potential of non extendable generators
|
# VRES potential of non extendable generators
|
||||||
capacity_factor = n.generators_t.p_max_pu[vres_i.difference(ext_i)]
|
capacity_factor = n.generators_t.p_max_pu[vres_i.difference(ext_i)]
|
||||||
@ -441,17 +442,24 @@ def add_operational_reserve_margin(n, sns, config):
|
|||||||
|
|
||||||
n.model.add_constraints(lhs >= rhs, name="reserve_margin")
|
n.model.add_constraints(lhs >= rhs, name="reserve_margin")
|
||||||
|
|
||||||
|
# additional contraint that capacity is not exceeded
|
||||||
|
gen_i = n.generators.index
|
||||||
|
ext_i = n.generators.query('p_nom_extendable').index
|
||||||
|
fix_i = n.generators.query('not p_nom_extendable').index
|
||||||
|
|
||||||
|
dispatch = n.model["Generator-p"]
|
||||||
reserve = n.model["Generator-r"]
|
reserve = n.model["Generator-r"]
|
||||||
|
|
||||||
lhs = n.model.constraints["Generator-fix-p-upper"].lhs
|
capacity_variable = n.model["Generator-p_nom"].rename({"Generator-ext": "Generator"})
|
||||||
lhs = lhs + reserve.loc[:, lhs.coords["Generator-fix"]].drop("Generator")
|
capacity_fixed = n.generators.p_nom[fix_i]
|
||||||
rhs = n.model.constraints["Generator-fix-p-upper"].rhs
|
|
||||||
n.model.add_constraints(lhs <= rhs, name="Generator-fix-p-upper-reserve")
|
|
||||||
|
|
||||||
lhs = n.model.constraints["Generator-ext-p-upper"].lhs
|
p_max_pu = get_as_dense(n, 'Generator', 'p_max_pu')
|
||||||
lhs = lhs + reserve.loc[:, lhs.coords["Generator-ext"]].drop("Generator")
|
|
||||||
rhs = n.model.constraints["Generator-ext-p-upper"].rhs
|
lhs = dispatch + reserve - capacity_variable * p_max_pu[ext_i]
|
||||||
n.model.add_constraints(lhs >= rhs, name="Generator-ext-p-upper-reserve")
|
|
||||||
|
rhs = (p_max_pu[fix_i] * capacity_fixed).reindex(columns=gen_i, fill_value=0)
|
||||||
|
|
||||||
|
n.model.add_constraints(lhs <= rhs, name="updated_capacity_constraint")
|
||||||
|
|
||||||
|
|
||||||
def add_battery_constraints(n):
|
def add_battery_constraints(n):
|
||||||
|
Loading…
Reference in New Issue
Block a user