mirror of
https://github.com/ANL-CEEESA/UnitCommitment.jl.git
synced 2025-12-06 00:08:52 -06:00
storage units
This commit is contained in:
BIN
test/fixtures/case14-storage.json.gz
vendored
Normal file
BIN
test/fixtures/case14-storage.json.gz
vendored
Normal file
Binary file not shown.
@@ -139,20 +139,20 @@ function instance_read_test()
|
||||
sc = instance.scenarios[1]
|
||||
@test length(sc.profiled_units) == 2
|
||||
|
||||
first_pu = sc.profiled_units[1]
|
||||
@test first_pu.name == "g7"
|
||||
@test first_pu.bus.name == "b4"
|
||||
@test first_pu.cost == [100.0 for t in 1:4]
|
||||
@test first_pu.min_power == [60.0 for t in 1:4]
|
||||
@test first_pu.max_power == [100.0 for t in 1:4]
|
||||
pu1 = sc.profiled_units[1]
|
||||
@test pu1.name == "g7"
|
||||
@test pu1.bus.name == "b4"
|
||||
@test pu1.cost == [100.0 for t in 1:4]
|
||||
@test pu1.min_power == [60.0 for t in 1:4]
|
||||
@test pu1.max_power == [100.0 for t in 1:4]
|
||||
@test sc.profiled_units_by_name["g7"].name == "g7"
|
||||
|
||||
second_pu = sc.profiled_units[2]
|
||||
@test second_pu.name == "g8"
|
||||
@test second_pu.bus.name == "b5"
|
||||
@test second_pu.cost == [50.0 for t in 1:4]
|
||||
@test second_pu.min_power == [0.0 for t in 1:4]
|
||||
@test second_pu.max_power == [120.0 for t in 1:4]
|
||||
pu2 = sc.profiled_units[2]
|
||||
@test pu2.name == "g8"
|
||||
@test pu2.bus.name == "b5"
|
||||
@test pu2.cost == [50.0 for t in 1:4]
|
||||
@test pu2.min_power == [0.0 for t in 1:4]
|
||||
@test pu2.max_power == [120.0 for t in 1:4]
|
||||
@test sc.profiled_units_by_name["g8"].name == "g8"
|
||||
end
|
||||
|
||||
@@ -166,4 +166,64 @@ function instance_read_test()
|
||||
@test sc.thermal_units[6].commitment_status ==
|
||||
[false, nothing, true, nothing]
|
||||
end
|
||||
|
||||
@testset "read_benchmark storage" begin
|
||||
instance = UnitCommitment.read(fixture("case14-storage.json.gz"))
|
||||
sc = instance.scenarios[1]
|
||||
@test length(sc.storage_units) == 4
|
||||
|
||||
su1 = sc.storage_units[1]
|
||||
@test su1.name == "su1"
|
||||
@test su1.bus.name == "b2"
|
||||
@test su1.min_level == [0.0 for t in 1:4]
|
||||
@test su1.max_level == [100.0 for t in 1:4]
|
||||
@test su1.simultaneous_charge_and_discharge == [true for t in 1:4]
|
||||
@test su1.charge_cost == [2.0 for t in 1:4]
|
||||
@test su1.discharge_cost == [2.5 for t in 1:4]
|
||||
@test su1.charge_efficiency == [1.0 for t in 1:4]
|
||||
@test su1.discharge_efficiency == [1.0 for t in 1:4]
|
||||
@test su1.loss_factor == [0.0 for t in 1:4]
|
||||
@test su1.min_charge_rate == [0.0 for t in 1:4]
|
||||
@test su1.max_charge_rate == [10.0 for t in 1:4]
|
||||
@test su1.min_discharge_rate == [0.0 for t in 1:4]
|
||||
@test su1.max_discharge_rate == [8.0 for t in 1:4]
|
||||
@test su1.initial_level == 0.0
|
||||
@test su1.min_ending_level == 0.0
|
||||
@test su1.max_ending_level == 100.0
|
||||
@test sc.storage_units_by_name["su1"].name == "su1"
|
||||
|
||||
su2 = sc.storage_units[2]
|
||||
@test su2.name == "su2"
|
||||
@test su2.bus.name == "b2"
|
||||
@test su2.min_level == [10.0 for t in 1:4]
|
||||
@test su2.simultaneous_charge_and_discharge == [false for t in 1:4]
|
||||
@test su2.charge_cost == [3.0 for t in 1:4]
|
||||
@test su2.discharge_cost == [3.5 for t in 1:4]
|
||||
@test su2.charge_efficiency == [0.8 for t in 1:4]
|
||||
@test su2.discharge_efficiency == [0.85 for t in 1:4]
|
||||
@test su2.loss_factor == [0.01 for t in 1:4]
|
||||
@test su2.min_charge_rate == [5.0 for t in 1:4]
|
||||
@test su2.min_discharge_rate == [2.0 for t in 1:4]
|
||||
@test su2.initial_level == 70.0
|
||||
@test su2.min_ending_level == 80.0
|
||||
@test su2.max_ending_level == 85.0
|
||||
@test sc.storage_units_by_name["su2"].name == "su2"
|
||||
|
||||
su3 = sc.storage_units[3]
|
||||
@test su3.bus.name == "b9"
|
||||
@test su3.min_level == [10.0, 11.0, 12.0, 13.0]
|
||||
@test su3.max_level == [100.0, 110.0, 120.0, 130.0]
|
||||
@test su3.charge_cost == [2.0, 2.1, 2.2, 2.3]
|
||||
@test su3.discharge_cost == [1.0, 1.1, 1.2, 1.3]
|
||||
@test su3.charge_efficiency == [0.8, 0.81, 0.82, 0.82]
|
||||
@test su3.discharge_efficiency == [0.85, 0.86, 0.87, 0.88]
|
||||
@test su3.min_charge_rate == [5.0, 5.1, 5.2, 5.3]
|
||||
@test su3.max_charge_rate == [10.0, 10.1, 10.2, 10.3]
|
||||
@test su3.min_discharge_rate == [4.0, 4.1, 4.2, 4.3]
|
||||
@test su3.max_discharge_rate == [8.0, 8.1, 8.2, 8.3]
|
||||
|
||||
su4 = sc.storage_units[4]
|
||||
@test su4.simultaneous_charge_and_discharge ==
|
||||
[false, false, true, true]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -102,5 +102,28 @@ function transform_randomize_XavQiuAhm2021_test()
|
||||
test_approx(pu1.cost[1], 98.039)
|
||||
test_approx(pu2.cost[1], 48.385)
|
||||
end
|
||||
|
||||
@testset "storage unit cost" begin
|
||||
sc = UnitCommitment.read(
|
||||
fixture("case14-storage.json.gz"),
|
||||
).scenarios[1]
|
||||
# Check original costs
|
||||
su1 = sc.storage_units[1]
|
||||
su3 = sc.storage_units[3]
|
||||
test_approx(su1.charge_cost[4], 2.0)
|
||||
test_approx(su1.discharge_cost[1], 2.5)
|
||||
test_approx(su3.charge_cost[2], 2.1)
|
||||
test_approx(su3.discharge_cost[3], 1.2)
|
||||
randomize!(
|
||||
sc,
|
||||
XavQiuAhm2021.Randomization(randomize_load_profile = false),
|
||||
rng = MersenneTwister(42),
|
||||
)
|
||||
# Check randomized costs
|
||||
test_approx(su1.charge_cost[4], 1.961)
|
||||
test_approx(su1.discharge_cost[1], 2.451)
|
||||
test_approx(su3.charge_cost[2], 2.196)
|
||||
test_approx(su3.discharge_cost[3], 1.255)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -65,4 +65,34 @@ function transform_slice_test()
|
||||
variable_names = true,
|
||||
)
|
||||
end
|
||||
|
||||
@testset "slice storage units" begin
|
||||
instance = UnitCommitment.read(fixture("case14-storage.json.gz"))
|
||||
modified = UnitCommitment.slice(instance, 2:4)
|
||||
sc = modified.scenarios[1]
|
||||
|
||||
# Should update all time-dependent fields
|
||||
for su in sc.storage_units
|
||||
@test length(su.min_level) == 3
|
||||
@test length(su.max_level) == 3
|
||||
@test length(su.simultaneous_charge_and_discharge) == 3
|
||||
@test length(su.charge_cost) == 3
|
||||
@test length(su.discharge_cost) == 3
|
||||
@test length(su.charge_efficiency) == 3
|
||||
@test length(su.discharge_efficiency) == 3
|
||||
@test length(su.loss_factor) == 3
|
||||
@test length(su.min_charge_rate) == 3
|
||||
@test length(su.max_charge_rate) == 3
|
||||
@test length(su.min_discharge_rate) == 3
|
||||
@test length(su.max_discharge_rate) == 3
|
||||
end
|
||||
|
||||
# Should be able to build model without errors
|
||||
optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
|
||||
model = UnitCommitment.build_model(
|
||||
instance = modified,
|
||||
optimizer = optimizer,
|
||||
variable_names = true,
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user