mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-06 00:08:52 -06:00
89 lines
2.7 KiB
Julia
89 lines
2.7 KiB
Julia
# UnitCommitment.jl: Optimization Package for Security-Constrained Unit Commitment
|
|
# Copyright (C) 2020, UChicago Argonne, LLC. All rights reserved.
|
|
# Released under the modified BSD license. See COPYING.md for more details.
|
|
|
|
function _enforce_transmission(
|
|
model::JuMP.Model,
|
|
violations::Vector{_Violation},
|
|
sc::UnitCommitmentScenario,
|
|
)::Nothing
|
|
for v in violations
|
|
_enforce_transmission(
|
|
model = model,
|
|
sc = sc,
|
|
violation = v,
|
|
isf = sc.isf,
|
|
lodf = sc.lodf,
|
|
)
|
|
end
|
|
return
|
|
end
|
|
|
|
function _enforce_transmission(;
|
|
model::JuMP.Model,
|
|
sc::UnitCommitmentScenario,
|
|
violation::_Violation,
|
|
isf::Matrix{Float64},
|
|
lodf::Matrix{Float64},
|
|
)::Nothing
|
|
instance = model[:instance]
|
|
limit::Float64 = 0.0
|
|
overflow = model[:overflow]
|
|
net_injection = model[:net_injection]
|
|
|
|
if violation.outage_line === nothing
|
|
limit = violation.monitored_line.normal_flow_limit[violation.time]
|
|
@info @sprintf(
|
|
" %8.3f MW overflow in %-5s time %3d (pre-contingency, scenario %s)",
|
|
violation.amount,
|
|
violation.monitored_line.name,
|
|
violation.time,
|
|
sc.name,
|
|
)
|
|
else
|
|
limit = violation.monitored_line.emergency_flow_limit[violation.time]
|
|
@info @sprintf(
|
|
" %8.3f MW overflow in %-5s time %3d (outage: line %s, scenario %s)",
|
|
violation.amount,
|
|
violation.monitored_line.name,
|
|
violation.time,
|
|
violation.outage_line.name,
|
|
sc.name,
|
|
)
|
|
end
|
|
|
|
fm = violation.monitored_line.name
|
|
t = violation.time
|
|
flow = @variable(model, base_name = "flow[$fm,$t]")
|
|
|
|
v = overflow[sc.name, violation.monitored_line.name, violation.time]
|
|
@constraint(model, flow <= limit + v)
|
|
@constraint(model, -flow <= limit + v)
|
|
|
|
if violation.outage_line === nothing
|
|
@constraint(
|
|
model,
|
|
flow == sum(
|
|
net_injection[sc.name, b.name, violation.time] *
|
|
isf[violation.monitored_line.offset, b.offset] for
|
|
b in sc.buses if b.offset > 0
|
|
)
|
|
)
|
|
else
|
|
@constraint(
|
|
model,
|
|
flow == sum(
|
|
net_injection[sc.name, b.name, violation.time] * (
|
|
isf[violation.monitored_line.offset, b.offset] + (
|
|
lodf[
|
|
violation.monitored_line.offset,
|
|
violation.outage_line.offset,
|
|
] * isf[violation.outage_line.offset, b.offset]
|
|
)
|
|
) for b in sc.buses if b.offset > 0
|
|
)
|
|
)
|
|
end
|
|
return nothing
|
|
end
|