You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.7 KiB
77 lines
2.7 KiB
# 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.
|
|
|
|
"""
|
|
slice(instance, range)
|
|
|
|
Creates a new instance, with only a subset of the time periods.
|
|
This function does not modify the provided instance. The initial
|
|
conditions are also not modified.
|
|
|
|
Example
|
|
-------
|
|
|
|
```julia
|
|
# Build a 2-hour UC instance
|
|
instance = UnitCommitment.read_benchmark("matpower/case118/2017-02-01")
|
|
modified = UnitCommitment.slice(instance, 1:2)
|
|
```
|
|
"""
|
|
function slice(
|
|
instance::UnitCommitmentInstance,
|
|
range::UnitRange{Int},
|
|
)::UnitCommitmentInstance
|
|
modified = deepcopy(instance)
|
|
modified.time = length(range)
|
|
for sc in modified.scenarios
|
|
sc.power_balance_penalty = sc.power_balance_penalty[range]
|
|
for r in sc.reserves
|
|
r.amount = r.amount[range]
|
|
end
|
|
for u in sc.thermal_units
|
|
u.max_power = u.max_power[range]
|
|
u.min_power = u.min_power[range]
|
|
u.must_run = u.must_run[range]
|
|
u.min_power_cost = u.min_power_cost[range]
|
|
for s in u.cost_segments
|
|
s.mw = s.mw[range]
|
|
s.cost = s.cost[range]
|
|
end
|
|
end
|
|
for pu in sc.profiled_units
|
|
pu.max_power = pu.max_power[range]
|
|
pu.min_power = pu.min_power[range]
|
|
pu.cost = pu.cost[range]
|
|
end
|
|
for b in sc.buses
|
|
b.load = b.load[range]
|
|
end
|
|
for l in sc.lines
|
|
l.normal_flow_limit = l.normal_flow_limit[range]
|
|
l.emergency_flow_limit = l.emergency_flow_limit[range]
|
|
l.flow_limit_penalty = l.flow_limit_penalty[range]
|
|
end
|
|
for ps in sc.price_sensitive_loads
|
|
ps.demand = ps.demand[range]
|
|
ps.revenue = ps.revenue[range]
|
|
end
|
|
for su in sc.storage_units
|
|
su.min_level = su.min_level[range]
|
|
su.max_level = su.max_level[range]
|
|
su.simultaneous_charge_and_discharge =
|
|
su.simultaneous_charge_and_discharge[range]
|
|
su.charge_cost = su.charge_cost[range]
|
|
su.discharge_cost = su.discharge_cost[range]
|
|
su.charge_efficiency = su.charge_efficiency[range]
|
|
su.discharge_efficiency = su.discharge_efficiency[range]
|
|
su.loss_factor = su.loss_factor[range]
|
|
su.min_charge_rate = su.min_charge_rate[range]
|
|
su.max_charge_rate = su.max_charge_rate[range]
|
|
su.min_discharge_rate = su.min_discharge_rate[range]
|
|
su.max_discharge_rate = su.max_discharge_rate[range]
|
|
end
|
|
end
|
|
return modified
|
|
end
|