Functions to add constraints and prepare the network for the solver.
Associated with the solve_network_myopic
rule in the Snakefile.
To be merged/consolidated with the solve_network
script.
add_battery_constraints(n)
Add constraint ensuring that charger = discharger, i.e. 1 * charger_size - efficiency * discharger_size = 0
Source code in workflow/scripts/solve_network_myopic.py
def add_battery_constraints(n):
"""
Add constraint ensuring that charger = discharger, i.e.
1 * charger_size - efficiency * discharger_size = 0
"""
if not n.links.p_nom_extendable.any():
return
discharger_bool = n.links.index.str.contains("battery discharger")
charger_bool = n.links.index.str.contains("battery charger")
dischargers_ext = n.links[discharger_bool].query("p_nom_extendable").index
chargers_ext = n.links[charger_bool].query("p_nom_extendable").index
eff = n.links.efficiency[dischargers_ext].values
lhs = n.model["Link-p_nom"].loc[chargers_ext] - n.model["Link-p_nom"].loc[dischargers_ext] * eff
n.model.add_constraints(lhs == 0, name="Link-charger_ratio")
add_transimission_constraints(n)
Add constraint ensuring that transmission lines p_nom are the same for both directions, i.e. p_nom positive = p_nom negative
Source code in workflow/scripts/solve_network_myopic.py
def add_transimission_constraints(n):
"""
Add constraint ensuring that transmission lines p_nom are the same for both directions, i.e.
p_nom positive = p_nom negative
"""
if not n.links.p_nom_extendable.any():
return
positive_bool = n.links.index.str.contains("positive")
negative_bool = n.links.index.str.contains("reversed")
positive_ext = n.links[positive_bool].query("p_nom_extendable").index
negative_ext = n.links[negative_bool].query("p_nom_extendable").index
lhs = n.model["Link-p_nom"].loc[positive_ext] - n.model["Link-p_nom"].loc[negative_ext]
n.model.add_constraints(lhs == 0, name="Link-transimission")
extra_functionality(n, snapshots)
Collects supplementary constraints which will be passed to pypsa.linopf.network_lopf
.
If you want to enforce additional custom constraints, this is a good location to add them.
The arguments opts
and snakemake.config
are expected to be attached to the network.
Source code in workflow/scripts/solve_network_myopic.py
def extra_functionality(n, snapshots):
"""
Collects supplementary constraints which will be passed to ``pypsa.linopf.network_lopf``.
If you want to enforce additional custom constraints, this is a good location to add them.
The arguments ``opts`` and ``snakemake.config`` are expected to be attached to the network.
"""
opts = n.opts
config = n.config
add_chp_constraints(n)
add_battery_constraints(n)
add_transimission_constraints(n)
if snakemake.wildcards.planning_horizons != "2020":
add_retrofit_constraints(n)