Fix solve_network.py to use nomopyomo for LV > 1.0
This commit is contained in:
parent
8982147706
commit
066f1b0bb5
@ -2,12 +2,12 @@ logging_level: INFO
|
||||
|
||||
results_dir: 'results/'
|
||||
summary_dir: results
|
||||
run: '191127-nomopyomo'
|
||||
run: '191202-nomopyomo'
|
||||
|
||||
scenario:
|
||||
sectors: [E] # ,E+EV,E+BEV,E+BEV+V2G] # [ E+EV, E+BEV, E+BEV+V2G ]
|
||||
simpl: ['']
|
||||
lv: [1.0]#, 1.125, 1.25, 1.5, 2.0]# or opt
|
||||
lv: [1.0,1.25]#, 1.125, 1.25, 1.5, 2.0]# or opt
|
||||
clusters: [50] #[90, 128, 181] #[45, 64, 90, 128, 181, 256] #, 362] # (2**np.r_[5.5:9:.5]).astype(int) minimum is 37
|
||||
opts: [''] #for pypsa-eur
|
||||
sector_opts: [Co2L0-3H-T-H-B-I]#,Co2L0p1-3H-T-H-B-I,Co2L0p25-3H-T-H-B-I,Co2L0p5-3H-T-H-B-I]#[Co2L0-3H-T-H-B-I-onwind0-solar3,Co2L0-3H-T-H-B-I-onwind0p125-solar3,Co2L0-3H-T-H-B-I-onwind0p25-solar3,Co2L0-3H-T-H-B-I-onwind0p50-solar3,Co2L0-3H-T-H-B-I-solar3]#,Co2L0-3H-T-H-B-I-onwind0p25-solar3]#,Co2L0p05-3H-T-H-B-I,Co2L0p10-3H-T-H-B-I,Co2L0p20-3H-T-H-B-I,Co2L0p30-3H-T-H-B-I,Co2L0p50-3H-T-H-B-I]#[Co2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0-3H-T-H,Co2L0p20-3H-T-H] #Co2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0p20-3H-T-HCo2L-3H-T-H,Co2L0p10-3H-T-H,Co2L0p30-3H-T-H,Co2L0p50-3H-T-H] #Co2L-3H,Co2L-3H-T,, LC-FL, LC-T, Ep-T, Co2L-T]
|
||||
|
@ -113,18 +113,6 @@ def add_opts_constraints(n, opts=None):
|
||||
ext_gens_i = n.generators.index[n.generators.carrier.isin(conv_techs) & n.generators.p_nom_extendable]
|
||||
n.model.safe_peakdemand = pypsa.opt.Constraint(expr=sum(n.model.generator_p_nom[gen] for gen in ext_gens_i) >= peakdemand - exist_conv_caps)
|
||||
|
||||
def add_lv_constraint(n):
|
||||
line_volume = getattr(n, 'line_volume_limit', None)
|
||||
if line_volume is not None and not np.isinf(line_volume):
|
||||
n.model.line_volume_constraint = pypsa.opt.Constraint(
|
||||
expr=((sum(n.model.passive_branch_s_nom["Line",line]*n.lines.at[line,"length"]
|
||||
for line in n.lines.index[n.lines.s_nom_extendable]) +
|
||||
sum(n.model.link_p_nom[link]*n.links.at[link,"length"]
|
||||
for link in n.links.index[(n.links.carrier=='DC') &
|
||||
n.links.p_nom_extendable]))
|
||||
<= line_volume)
|
||||
)
|
||||
|
||||
def add_eps_storage_constraint(n):
|
||||
if not hasattr(n, 'epsilon'):
|
||||
n.epsilon = 1e-5
|
||||
@ -190,7 +178,6 @@ def add_chp_constraints(n):
|
||||
|
||||
def extra_functionality(n, snapshots):
|
||||
#add_opts_constraints(n, opts)
|
||||
#add_lv_constraint(n)
|
||||
#add_eps_storage_constraint(n)
|
||||
add_chp_constraints(n)
|
||||
add_battery_constraints(n)
|
||||
@ -199,16 +186,11 @@ def extra_functionality(n, snapshots):
|
||||
|
||||
def fix_branches(n, lines_s_nom=None, links_p_nom=None):
|
||||
if lines_s_nom is not None and len(lines_s_nom) > 0:
|
||||
for l, s_nom in lines_s_nom.iteritems():
|
||||
n.model.passive_branch_s_nom["Line", l].fix(s_nom)
|
||||
if isinstance(n.opt, pypsa.opf.PersistentSolver):
|
||||
n.opt.update_var(n.model.passive_branch_s_nom)
|
||||
|
||||
n.lines.loc[lines_s_nom.index,"s_nom"] = lines_s_nom.values
|
||||
n.lines.loc[lines_s_nom.index,"s_nom_extendable"] = False
|
||||
if links_p_nom is not None and len(links_p_nom) > 0:
|
||||
for l, p_nom in links_p_nom.iteritems():
|
||||
n.model.link_p_nom[l].fix(p_nom)
|
||||
if isinstance(n.opt, pypsa.opf.PersistentSolver):
|
||||
n.opt.update_var(n.model.link_p_nom)
|
||||
n.links.loc[links_p_nom.index,"p_nom"] = links_p_nom.values
|
||||
n.links.loc[links_p_nom.index,"p_nom_extendable"] = False
|
||||
|
||||
def solve_network(n, config=None, solver_log=None, opts=None):
|
||||
if config is None:
|
||||
@ -234,19 +216,19 @@ def solve_network(n, config=None, solver_log=None, opts=None):
|
||||
fix_branches(n,
|
||||
lines_s_nom=n.lines.loc[n.lines.s_nom_extendable, 's_nom_opt'],
|
||||
links_p_nom=n.links.loc[(n.links.carrier=='DC') & n.links.p_nom_extendable, 'p_nom_opt'])
|
||||
|
||||
|
||||
if not fix_ext_lines and hasattr(n.model, 'line_volume_constraint'):
|
||||
|
||||
def extra_postprocessing(n, snapshots, duals):
|
||||
index = list(n.model.line_volume_constraint.keys())
|
||||
cdata = pd.Series(list(n.model.line_volume_constraint.values()),
|
||||
index=index)
|
||||
n.line_volume_limit_dual = -cdata.map(duals).sum()
|
||||
print("line volume limit dual:",n.line_volume_limit_dual)
|
||||
|
||||
if "line_volume_constraint" in n.global_constraints.index:
|
||||
n.global_constraints.drop("line_volume_constraint",inplace=True)
|
||||
else:
|
||||
extra_postprocessing = None
|
||||
if "line_volume_constraint" not in n.global_constraints.index:
|
||||
line_volume = getattr(n, 'line_volume_limit', None)
|
||||
if line_volume is not None and not np.isinf(line_volume):
|
||||
n.add("GlobalConstraint",
|
||||
"line_volume_constraint",
|
||||
type="transmission_volume_expansion_limit",
|
||||
carrier_attribute="AC,DC",
|
||||
sense="<=",
|
||||
constant=line_volume)
|
||||
|
||||
|
||||
# Firing up solve will increase memory consumption tremendously, so
|
||||
# make sure we freed everything we can
|
||||
@ -274,6 +256,10 @@ def solve_network(n, config=None, solver_log=None, opts=None):
|
||||
"and termination_condition={}"
|
||||
.format(status, termination_condition))
|
||||
|
||||
if not fix_ext_lines and "line_volume_constraint" in n.global_constraints.index:
|
||||
n.line_volume_limit_dual = n.global_constraints.at["line_volume_constraint","mu"]
|
||||
print("line volume limit dual:",n.line_volume_limit_dual)
|
||||
|
||||
return status, termination_condition
|
||||
|
||||
lines_ext_b = n.lines.s_nom_extendable
|
||||
@ -308,21 +294,6 @@ def solve_network(n, config=None, solver_log=None, opts=None):
|
||||
)
|
||||
logger.debug("lines.num_parallel={}".format(n.lines.loc[lines_ext_typed_b, 'num_parallel']))
|
||||
|
||||
if isinstance(n.opt, pypsa.opf.PersistentSolver):
|
||||
n.calculate_dependent_values()
|
||||
|
||||
assert solve_opts['formulation'] == 'kirchhoff', \
|
||||
"Updating persistent solvers has only been implemented for the kirchhoff formulation for now"
|
||||
|
||||
n.opt.remove_constraint(n.model.cycle_constraints)
|
||||
del n.model.cycle_constraints_index
|
||||
del n.model.cycle_constraints_index_0
|
||||
del n.model.cycle_constraints_index_1
|
||||
del n.model.cycle_constraints
|
||||
|
||||
pypsa.opf.define_passive_branch_flows_with_kirchhoff(n, n.snapshots, skip_vars=True)
|
||||
n.opt.add_constraint(n.model.cycle_constraints)
|
||||
|
||||
iteration = 1
|
||||
|
||||
lines['s_nom_opt'] = lines['s_nom'] * n.lines['num_parallel'].where(n.lines.type != '', 1.)
|
||||
|
Loading…
Reference in New Issue
Block a user