Skip to content

Commit 48a2733

Browse files
authored
Merge pull request #1087 from NREL-Sienna/jd/improvements_to_interface
updates for transmission interface
2 parents f76fadd + e766959 commit 48a2733

File tree

3 files changed

+79
-10
lines changed

3 files changed

+79
-10
lines changed

src/core/optimization_container.jl

+12-10
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,7 @@ function build_impl!(
534534
ArgumentConstructStage(),
535535
get_service_models(template),
536536
get_device_models(template),
537+
transmission_model,
537538
)
538539
end
539540

@@ -555,16 +556,6 @@ function build_impl!(
555556
end
556557
end
557558

558-
TimerOutputs.@timeit BUILD_PROBLEMS_TIMER "Services" begin
559-
construct_services!(
560-
container,
561-
sys,
562-
ModelConstructStage(),
563-
get_service_models(template),
564-
get_device_models(template),
565-
)
566-
end
567-
568559
for device_model in values(template.devices)
569560
@debug "Building Model for $(get_component_type(device_model)) with $(get_formulation(device_model)) formulation" _group =
570561
LOG_GROUP_OPTIMIZATION_CONTAINER
@@ -610,6 +601,17 @@ function build_impl!(
610601
end
611602
end
612603

604+
TimerOutputs.@timeit BUILD_PROBLEMS_TIMER "Services" begin
605+
construct_services!(
606+
container,
607+
sys,
608+
ModelConstructStage(),
609+
get_service_models(template),
610+
get_device_models(template),
611+
transmission_model,
612+
)
613+
end
614+
613615
TimerOutputs.@timeit BUILD_PROBLEMS_TIMER "Objective" begin
614616
@debug "Building Objective" _group = LOG_GROUP_OPTIMIZATION_CONTAINER
615617
update_objective_function!(container)

src/services_models/services_constructor.jl

+22
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ function construct_services!(
1818
stage::ArgumentConstructStage,
1919
services_template::ServicesModelContainer,
2020
devices_template::DevicesModelContainer,
21+
network_model::NetworkModel{<:PM.AbstractPowerModel},
2122
)
2223
isempty(services_template) && return
2324
incompatible_device_types = get_incompatible_devices(devices_template)
@@ -37,6 +38,7 @@ function construct_services!(
3738
service_model,
3839
devices_template,
3940
incompatible_device_types,
41+
network_model,
4042
)
4143
end
4244
groupservice === nothing || construct_service!(
@@ -46,6 +48,7 @@ function construct_services!(
4648
services_template[groupservice],
4749
devices_template,
4850
incompatible_device_types,
51+
network_model,
4952
)
5053
return
5154
end
@@ -56,6 +59,7 @@ function construct_services!(
5659
stage::ModelConstructStage,
5760
services_template::ServicesModelContainer,
5861
devices_template::DevicesModelContainer,
62+
network_model::NetworkModel{<:PM.AbstractPowerModel},
5963
)
6064
isempty(services_template) && return
6165
incompatible_device_types = get_incompatible_devices(devices_template)
@@ -74,6 +78,7 @@ function construct_services!(
7478
service_model,
7579
devices_template,
7680
incompatible_device_types,
81+
network_model,
7782
)
7883
end
7984
groupservice === nothing || construct_service!(
@@ -83,6 +88,7 @@ function construct_services!(
8388
services_template[groupservice],
8489
devices_template,
8590
incompatible_device_types,
91+
network_model,
8692
)
8793
return
8894
end
@@ -94,6 +100,7 @@ function construct_service!(
94100
model::ServiceModel{SR, RangeReserve},
95101
devices_template::Dict{Symbol, DeviceModel},
96102
incompatible_device_types::Set{<:DataType},
103+
::NetworkModel{<:PM.AbstractPowerModel},
97104
) where {SR <: PSY.Reserve}
98105
name = get_service_name(model)
99106
service = PSY.get_component(SR, sys, name)
@@ -119,6 +126,7 @@ function construct_service!(
119126
model::ServiceModel{SR, RangeReserve},
120127
devices_template::Dict{Symbol, DeviceModel},
121128
incompatible_device_types::Set{<:DataType},
129+
::NetworkModel{<:PM.AbstractPowerModel},
122130
) where {SR <: PSY.Reserve}
123131
name = get_service_name(model)
124132
service = PSY.get_component(SR, sys, name)
@@ -148,6 +156,7 @@ function construct_service!(
148156
model::ServiceModel{SR, RangeReserve},
149157
devices_template::Dict{Symbol, DeviceModel},
150158
incompatible_device_types::Set{<:DataType},
159+
::NetworkModel{<:PM.AbstractPowerModel},
151160
) where {SR <: PSY.StaticReserve}
152161
name = get_service_name(model)
153162
service = PSY.get_component(SR, sys, name)
@@ -172,6 +181,7 @@ function construct_service!(
172181
model::ServiceModel{SR, RangeReserve},
173182
devices_template::Dict{Symbol, DeviceModel},
174183
incompatible_device_types::Set{<:DataType},
184+
::NetworkModel{<:PM.AbstractPowerModel},
175185
) where {SR <: PSY.StaticReserve}
176186
name = get_service_name(model)
177187
service = PSY.get_component(SR, sys, name)
@@ -200,6 +210,7 @@ function construct_service!(
200210
model::ServiceModel{SR, StepwiseCostReserve},
201211
devices_template::Dict{Symbol, DeviceModel},
202212
incompatible_device_types::Set{<:DataType},
213+
::NetworkModel{<:PM.AbstractPowerModel},
203214
) where {SR <: PSY.Reserve}
204215
name = get_service_name(model)
205216
service = PSY.get_component(SR, sys, name)
@@ -224,6 +235,7 @@ function construct_service!(
224235
model::ServiceModel{SR, StepwiseCostReserve},
225236
devices_template::Dict{Symbol, DeviceModel},
226237
incompatible_device_types::Set{<:DataType},
238+
::NetworkModel{<:PM.AbstractPowerModel},
227239
) where {SR <: PSY.Reserve}
228240
name = get_service_name(model)
229241
service = PSY.get_component(SR, sys, name)
@@ -246,6 +258,7 @@ function construct_service!(
246258
model::ServiceModel{S, T},
247259
devices_template::Dict{Symbol, DeviceModel},
248260
::Set{<:DataType},
261+
::NetworkModel{<:PM.AbstractPowerModel},
249262
) where {S <: PSY.AGC, T <: AbstractAGCFormulation}
250263
services = get_available_components(S, sys)
251264
agc_areas = PSY.get_area.(services)
@@ -299,6 +312,7 @@ function construct_service!(
299312
model::ServiceModel{S, T},
300313
devices_template::Dict{Symbol, DeviceModel},
301314
::Set{<:DataType},
315+
::NetworkModel{<:PM.AbstractPowerModel},
302316
) where {S <: PSY.AGC, T <: AbstractAGCFormulation}
303317
areas = PSY.get_components(PSY.Area, sys)
304318
services = get_available_components(S, sys)
@@ -340,6 +354,7 @@ function construct_service!(
340354
model::ServiceModel{SR, GroupReserve},
341355
::Dict{Symbol, DeviceModel},
342356
::Set{<:DataType},
357+
::NetworkModel{<:PM.AbstractPowerModel},
343358
) where {SR <: PSY.StaticReserveGroup}
344359
name = get_service_name(model)
345360
service = PSY.get_component(SR, sys, name)
@@ -357,6 +372,7 @@ function construct_service!(
357372
model::ServiceModel{SR, GroupReserve},
358373
::Dict{Symbol, DeviceModel},
359374
::Set{<:DataType},
375+
::NetworkModel{<:PM.AbstractPowerModel},
360376
) where {SR <: PSY.StaticReserveGroup}
361377
name = get_service_name(model)
362378
service = PSY.get_component(SR, sys, name)
@@ -381,6 +397,7 @@ function construct_service!(
381397
model::ServiceModel{SR, RampReserve},
382398
devices_template::Dict{Symbol, DeviceModel},
383399
incompatible_device_types::Set{<:DataType},
400+
::NetworkModel{<:PM.AbstractPowerModel},
384401
) where {SR <: PSY.Reserve}
385402
name = get_service_name(model)
386403
service = PSY.get_component(SR, sys, name)
@@ -406,6 +423,7 @@ function construct_service!(
406423
model::ServiceModel{SR, RampReserve},
407424
devices_template::Dict{Symbol, DeviceModel},
408425
incompatible_device_types::Set{<:DataType},
426+
::NetworkModel{<:PM.AbstractPowerModel},
409427
) where {SR <: PSY.Reserve}
410428
name = get_service_name(model)
411429
service = PSY.get_component(SR, sys, name)
@@ -436,6 +454,7 @@ function construct_service!(
436454
model::ServiceModel{SR, NonSpinningReserve},
437455
devices_template::Dict{Symbol, DeviceModel},
438456
incompatible_device_types::Set{<:DataType},
457+
::NetworkModel{<:PM.AbstractPowerModel},
439458
) where {SR <: PSY.ReserveNonSpinning}
440459
name = get_service_name(model)
441460
service = PSY.get_component(SR, sys, name)
@@ -460,6 +479,7 @@ function construct_service!(
460479
model::ServiceModel{SR, NonSpinningReserve},
461480
devices_template::Dict{Symbol, DeviceModel},
462481
incompatible_device_types::Set{<:DataType},
482+
::NetworkModel{<:PM.AbstractPowerModel},
463483
) where {SR <: PSY.ReserveNonSpinning}
464484
name = get_service_name(model)
465485
service = PSY.get_component(SR, sys, name)
@@ -497,6 +517,7 @@ function construct_service!(
497517
model::ServiceModel{T, ConstantMaxInterfaceFlow},
498518
devices_template::Dict{Symbol, DeviceModel},
499519
incompatible_device_types::Set{<:DataType},
520+
network_model::NetworkModel{<:PM.AbstractPowerModel},
500521
) where {T <: PSY.TransmissionInterface}
501522
interfaces = get_available_components(T, sys)
502523
if get_use_slacks(model)
@@ -524,6 +545,7 @@ function construct_service!(
524545
model::ServiceModel{T, ConstantMaxInterfaceFlow},
525546
devices_template::Dict{Symbol, DeviceModel},
526547
incompatible_device_types::Set{<:DataType},
548+
network_model::NetworkModel{<:PM.AbstractActivePowerModel},
527549
) where {T <: PSY.TransmissionInterface}
528550
name = get_service_name(model)
529551
service = PSY.get_component(T, sys, name)

test/test_services_constructor.jl

+45
Original file line numberDiff line numberDiff line change
@@ -400,3 +400,48 @@ end
400400

401401
@test found_constraints == 2
402402
end
403+
404+
@testset "Test Transmission Interface" begin
405+
c_sys5_uc = PSB.build_system(PSITestSystems, "c_sys5_uc"; add_reserves = true)
406+
interface = TransmissionInterface(;
407+
name = "west_east",
408+
available = true,
409+
active_power_flow_limits = (min = 0.0, max = 400.0),
410+
)
411+
interface_lines = [
412+
get_component(Line, c_sys5_uc, "1"),
413+
get_component(Line, c_sys5_uc, "2"),
414+
get_component(Line, c_sys5_uc, "6"),
415+
]
416+
add_service!(c_sys5_uc, interface, interface_lines)
417+
418+
template = get_thermal_dispatch_template_network(DCPPowerModel)
419+
set_service_model!(
420+
template,
421+
ServiceModel(TransmissionInterface, ConstantMaxInterfaceFlow; use_slacks = true),
422+
)
423+
424+
model = DecisionModel(template, c_sys5_uc)
425+
@test build!(model; output_dir = mktempdir(; cleanup = true)) == PSI.BuildStatus.BUILT
426+
moi_tests(model, 432, 144, 288, 288, 288, false)
427+
428+
template = get_thermal_dispatch_template_network(PTDFPowerModel)
429+
set_service_model!(
430+
template,
431+
ServiceModel(TransmissionInterface, ConstantMaxInterfaceFlow; use_slacks = true),
432+
)
433+
model = DecisionModel(template, c_sys5_uc)
434+
@test build!(model; output_dir = mktempdir(; cleanup = true)) == PSI.BuildStatus.BUILT
435+
moi_tests(model, 312, 0, 288, 288, 168, false)
436+
437+
#= TODO: Fix this test
438+
template = get_thermal_dispatch_template_network(ACPPowerModel; use_slacks = true) where
439+
set_service_model!(
440+
template,
441+
ServiceModel(TransmissionInterface, ConstantMaxInterfaceFlow; use_slacks = true),
442+
)
443+
model = DecisionModel(template, c_sys5_uc)
444+
@test build!(model; output_dir = mktempdir(; cleanup = true)) == PSI.BuildStatus.BUILT
445+
moi_tests(model, 312, 0, 288, 288, 168, false)
446+
=#
447+
end

0 commit comments

Comments
 (0)