diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0289293e..62b09692 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,9 +13,9 @@ jobs: fail-fast: false matrix: version: - - '1.5' + - '1.8' + - '1.6' - '1' - - 'nightly' os: - ubuntu-latest - macOS-latest diff --git a/Project.toml b/Project.toml index 719c1e55..3a8f32ce 100644 --- a/Project.toml +++ b/Project.toml @@ -2,7 +2,7 @@ name = "PowerModelsACDC" uuid = "ff45984e-d068-5f4c-9e32-c4133509d236" autors = ["Hakan Ergun", "Frederik Geth", "Jay Dave"] repo = "https://github.com/Electa-Git/PowerModelsACDC.jl" -version = "0.5.3" +version = "0.6.0" [deps] InfrastructureModels = "2030c09a-7f63-5d83-885d-db604e0e9cc0" @@ -11,22 +11,21 @@ Memento = "f28f55f0-a522-5efc-85c2-fe41dfb9b2d9" PowerModels = "c36e90e8-916a-50a6-bd94-075b64ef4655" [compat] -Cbc = ">= 0.9" +HiGHS = "~0.3, ~1" InfrastructureModels = "~0.6, ~0.7" -Ipopt = ">= 0.8" -JuMP = "~0.22.0" -Juniper = ">= 0.8" -Memento = "~1.0, ~1.1, ~1.2, ~1.3" -PowerModels = "0.19.1" -SCS = ">= 0.8" -julia = "^1" +Ipopt = "~0.8, ~0.9, 1" +JuMP = "~0.22.0, ~0.23, ~1" +Juniper = "~0.8, ~0.9" +Memento = "~1.0, ~1.1, ~1.2, ~1.3, ~1.4" +PowerModels = "~0.19" +julia = "~1.6, ~1.7, ~1.8" [extras] Cbc = "9961bab8-2fa3-5c5a-9d89-47fab24efd76" +HiGHS = "87dc4568-4c63-4d18-b0c0-bb2238e4078b" Ipopt = "b6b21f68-93f8-5de0-b562-5493be1d77c9" Juniper = "2ddba703-00a4-53a7-87a5-e8b9971dde84" -SCS = "c946c3f1-0d1f-5ce8-9dea-7daa1f7e2d13" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] -test = ["Test", "Ipopt", "SCS", "Cbc", "Juniper"] \ No newline at end of file +test = ["Test", "Ipopt", "HiGHS", "Juniper"] \ No newline at end of file diff --git a/src/PowerModelsACDC.jl b/src/PowerModelsACDC.jl index 9dc40920..f5d6e7ac 100644 --- a/src/PowerModelsACDC.jl +++ b/src/PowerModelsACDC.jl @@ -27,13 +27,9 @@ include("prob/acdcpf.jl") include("prob/acdcopf_bf.jl") include("prob/acdcopf_iv.jl") include("prob/tnepopf.jl") -include("prob/acdctnepopf.jl") include("prob/tnepopf_bf.jl") -include("prob/acdctnepopf_bf.jl") include("prob/mp_tnepopf.jl") -include("prob/mp_acdctnepopf.jl") include("prob/mp_tnepopf_bf.jl") -include("prob/mp_acdctnepopf_bf.jl") diff --git a/src/core/base.jl b/src/core/base.jl index 99f545d3..877e073a 100644 --- a/src/core/base.jl +++ b/src/core/base.jl @@ -1,35 +1,46 @@ function add_ref_dcgrid!(ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any}) for (n, nw_ref) in ref[:it][:pm][:nw] - if haskey(nw_ref, :convdc) - #Filter converters & DC branches with status 0 as well as wrong bus numbers - nw_ref[:convdc] = Dict([x for x in nw_ref[:convdc] if (x.second["status"] == 1 && x.second["busdc_i"] in keys(nw_ref[:busdc]) && x.second["busac_i"] in keys(nw_ref[:bus]))]) + if haskey(nw_ref, :branchdc) nw_ref[:branchdc] = Dict([x for x in nw_ref[:branchdc] if (x.second["status"] == 1 && x.second["fbusdc"] in keys(nw_ref[:busdc]) && x.second["tbusdc"] in keys(nw_ref[:busdc]))]) - # DC grid arcs for DC grid branches nw_ref[:arcs_dcgrid_from] = [(i,branch["fbusdc"],branch["tbusdc"]) for (i,branch) in nw_ref[:branchdc]] nw_ref[:arcs_dcgrid_to] = [(i,branch["tbusdc"],branch["fbusdc"]) for (i,branch) in nw_ref[:branchdc]] nw_ref[:arcs_dcgrid] = [nw_ref[:arcs_dcgrid_from]; nw_ref[:arcs_dcgrid_to]] - nw_ref[:arcs_conv_acdc] = [(i,conv["busac_i"],conv["busdc_i"]) for (i,conv) in nw_ref[:convdc]] #bus arcs of the DC grid bus_arcs_dcgrid = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc]]) for (l,i,j) in nw_ref[:arcs_dcgrid] push!(bus_arcs_dcgrid[i], (l,i,j)) end nw_ref[:bus_arcs_dcgrid] = bus_arcs_dcgrid + else + nw_ref[:branchdc] = Dict{String, Any}() + nw_ref[:arcs_dcgrid] = Dict{String, Any}() + nw_ref[:arcs_dcgrid_from] = Dict{String, Any}() + nw_ref[:arcs_dcgrid_to] = Dict{String, Any}() + nw_ref[:arcs_conv_acdc] = Dict{String, Any}() + if haskey(nw_ref, :busdc) + nw_ref[:bus_arcs_dcgrid] = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc]]) + else + nw_ref[:bus_arcs_dcgrid] = Dict{String, Any}() + end + + end + if haskey(nw_ref, :convdc) + #Filter converters & DC branches with status 0 as well as wrong bus numbers + nw_ref[:convdc] = Dict([x for x in nw_ref[:convdc] if (x.second["status"] == 1 && x.second["busdc_i"] in keys(nw_ref[:busdc]) && x.second["busac_i"] in keys(nw_ref[:bus]))]) + + nw_ref[:arcs_conv_acdc] = [(i,conv["busac_i"],conv["busdc_i"]) for (i,conv) in nw_ref[:convdc]] - # bus_convs for AC side power injection of DC converters + + # Bus converters for existing ac buses bus_convs_ac = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) - for (i,conv) in nw_ref[:convdc] - push!(bus_convs_ac[conv["busac_i"]], i) - end - nw_ref[:bus_convs_ac] = bus_convs_ac + nw_ref[:bus_convs_ac] = assign_bus_converters!(nw_ref[:convdc], bus_convs_ac, "busac_i") - # bus_convs for AC side power injection of DC converters + # Bus converters for existing ac buses bus_convs_dc = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc]]) - for (i,conv) in nw_ref[:convdc] - push!(bus_convs_dc[conv["busdc_i"]], i) - end - nw_ref[:bus_convs_dc] = bus_convs_dc + nw_ref[:bus_convs_dc]= assign_bus_converters!(nw_ref[:convdc], bus_convs_dc, "busdc_i") + + # Add DC reference buses ref_buses_dc = Dict{String, Any}() for (k,v) in nw_ref[:convdc] @@ -75,21 +86,12 @@ function add_ref_dcgrid!(ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any}) else nw_ref[:convdc] = Dict{String, Any}() nw_ref[:busdc] = Dict{String, Any}() - nw_ref[:branchdc] = Dict{String, Any}() - # DC grid arcs for DC grid branches - nw_ref[:arcs_dcgrid] = Dict{String, Any}() - nw_ref[:arcs_dcgrid_from] = Dict{String, Any}() - nw_ref[:arcs_dcgrid_to] = Dict{String, Any}() - nw_ref[:arcs_conv_acdc] = Dict{String, Any}() - nw_ref[:bus_arcs_dcgrid] = Dict{String, Any}() - bus_convs_ac = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) - for (i,conv) in nw_ref[:convdc] - push!(bus_convs_ac[conv["busac_i"]], i) - end - nw_ref[:bus_convs_ac] = bus_convs_ac nw_ref[:bus_convs_dc] = Dict{String, Any}() nw_ref[:ref_buses_dc] = Dict{String, Any}() nw_ref[:buspairsdc] = Dict{String, Any}() + # Bus converters for existing ac buses + bus_convs_ac = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) + nw_ref[:bus_convs_ac] = assign_bus_converters!(nw_ref[:convdc], bus_convs_ac, "busac_i") end end end @@ -188,12 +190,16 @@ end function add_candidate_dcgrid!(ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any}) for (n, nw_ref) in ref[:it][:pm][:nw] - if haskey(nw_ref, :convdc_ne) + if !haskey(nw_ref, :busdc_ne) + nw_ref[:busdc_ne] = Dict{String, Any}() + nw_ref[:ref_buses_dc_ne] = Dict{String, Any}() + else + nw_ref[:ref_buses_dc_ne] = Dict{String, Any}() + end + if haskey(nw_ref, :branchdc_ne) nw_ref[:arcs_dcgrid_from_ne] = [(i,branch["fbusdc"],branch["tbusdc"]) for (i,branch) in nw_ref[:branchdc_ne]] nw_ref[:arcs_dcgrid_to_ne] = [(i,branch["tbusdc"],branch["fbusdc"]) for (i,branch) in nw_ref[:branchdc_ne]] nw_ref[:arcs_dcgrid_ne] = [nw_ref[:arcs_dcgrid_from_ne]; nw_ref[:arcs_dcgrid_to_ne]] - nw_ref[:arcs_conv_acdc_ne] = [(i,conv["busac_i"],conv["busdc_i"]) for (i,conv) in nw_ref[:convdc_ne]] - nw_ref[:arcs_conv_acdc_acbus_ne] = [(i,conv["busac_i"]) for (i,conv) in nw_ref[:convdc_ne]] #bus arcs of the DC grid bus_arcs_dcgrid_ne = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc_ne]]) for (l,i,j) in nw_ref[:arcs_dcgrid_ne] @@ -207,48 +213,46 @@ function add_candidate_dcgrid!(ref::Dict{Symbol,<:Any}, data::Dict{String,<:Any} end end nw_ref[:bus_arcs_dcgrid_ne] = bus_arcs_dcgrid_ne - # bus_convs for AC side power injection of DC converters - bus_convs_ac = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) - for (i,conv) in nw_ref[:convdc_ne] - push!(bus_convs_ac[conv["busac_i"]], i) + nw_ref[:buspairsdc_ne] = buspair_parameters_dc_ne(nw_ref[:arcs_dcgrid_from_ne], nw_ref[:branchdc_ne], nw_ref[:busdc_ne], nw_ref[:busdc]) + else + nw_ref[:branchdc_ne] = Dict{String, Any}() + nw_ref[:arcs_dcgrid_from_ne] = Dict{String, Any}() + nw_ref[:arcs_dcgrid_to_ne] = Dict{String, Any}() + nw_ref[:arcs_dcgrid_ne] = Dict{String, Any}() + nw_ref[:buspairsdc_ne] = Dict{String, Any}() + if haskey(nw_ref, :busdc_ne) + nw_ref[:bus_arcs_dcgrid_ne] = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc_ne]]) + else + nw_ref[:bus_arcs_dcgrid_ne] = Dict{String, Any}() end - nw_ref[:bus_convs_ac_ne] = bus_convs_ac - - - # add new converters to existting DC buses + end + if haskey(nw_ref, :convdc_ne) + nw_ref[:arcs_conv_acdc_ne] = [(i,conv["busac_i"],conv["busdc_i"]) for (i,conv) in nw_ref[:convdc_ne]] + nw_ref[:arcs_conv_acdc_acbus_ne] = [(i,conv["busac_i"]) for (i,conv) in nw_ref[:convdc_ne]] + + # Bus converters for existing ac buses + bus_convs_ac_ne = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) + nw_ref[:bus_convs_ac_ne] = assign_bus_converters!(nw_ref[:convdc_ne], bus_convs_ac_ne, "busac_i") + # Bus converters forexisting DC buses bus_convs_dc_ne = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc]]) - for (i,conv) in nw_ref[:convdc_ne] - if haskey(bus_convs_dc_ne, conv["busdc_i"]) - push!(bus_convs_dc_ne[conv["busdc_i"]], i) - end - end - nw_ref[:bus_convs_dc_ne] = bus_convs_dc_ne + nw_ref[:bus_convs_dc_ne] = assign_bus_converters!(nw_ref[:convdc_ne], bus_convs_dc_ne, "busdc_i") # Bus converters for candidate DC buses bus_ne_convs_dc_ne = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc_ne]]) - for (i,conv) in nw_ref[:convdc_ne] - if haskey(bus_ne_convs_dc_ne, conv["busdc_i"]) - push!(bus_ne_convs_dc_ne[conv["busdc_i"]], i) - end - end - nw_ref[:bus_ne_convs_dc_ne] = bus_ne_convs_dc_ne - nw_ref[:ref_buses_dc_ne] = Dict{String, Any}() - nw_ref[:buspairsdc_ne] = buspair_parameters_dc_ne(nw_ref[:arcs_dcgrid_from_ne], nw_ref[:branchdc_ne], nw_ref[:busdc_ne], nw_ref[:busdc]) + nw_ref[:bus_ne_convs_dc_ne] = assign_bus_converters!(nw_ref[:convdc_ne], bus_ne_convs_dc_ne, "busdc_i") else nw_ref[:convdc_ne] = Dict{String, Any}() - nw_ref[:busdc_ne] = Dict{String, Any}() - nw_ref[:branchdc_ne] = Dict{String, Any}() - # DC grid arcs for DC grid branches - nw_ref[:arcs_dcgrid_ne] = Dict{String, Any}() nw_ref[:arcs_conv_acdc_ne] = Dict{String, Any}() - nw_ref[:bus_arcs_dcgrid_ne] = Dict{String, Any}() - bus_convs_ac = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) - for (i,conv) in nw_ref[:convdc_ne] - push!(bus_convs_ac[conv["busac_i"]], i) - end - nw_ref[:bus_convs_ac_ne] = bus_convs_ac - nw_ref[:bus_convs_dc_ne] = Dict{String, Any}() - nw_ref[:ref_buses_dc_ne] = Dict{String, Any}() - nw_ref[:buspairsdc_ne] = Dict{String, Any}() + nw_ref[:arcs_conv_acdc_acbus_ne] = Dict{String, Any}() + + # Bus converters for existing ac buses + bus_convs_ac_ne = Dict([(i, []) for (i,bus) in nw_ref[:bus]]) + nw_ref[:bus_convs_ac_ne] = assign_bus_converters!(nw_ref[:convdc_ne], bus_convs_ac_ne, "busac_i") + # Bus converters forexisting DC buses + bus_convs_dc_ne = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc]]) + nw_ref[:bus_convs_dc_ne] = assign_bus_converters!(nw_ref[:convdc_ne], bus_convs_dc_ne, "busdc_i") + # Bus converters for candidate DC buses + bus_ne_convs_dc_ne = Dict([(bus["busdc_i"], []) for (i,bus) in nw_ref[:busdc_ne]]) + nw_ref[:bus_ne_convs_dc_ne] = assign_bus_converters!(nw_ref[:convdc_ne], bus_ne_convs_dc_ne, "busdc_i") end end end @@ -298,3 +302,13 @@ function buspair_parameters_dc_ne(arcs_dcgrid_from, branches, busesdc_ne, busesd return buspairs end + + +function assign_bus_converters!(convs, dict, key) + for (i,conv) in convs + if haskey(dict, conv[key]) + push!(dict[conv[key]], i) + end + end + return dict +end diff --git a/src/formconv/dcp.jl b/src/formconv/dcp.jl index 4ac326fa..7781d62f 100644 --- a/src/formconv/dcp.jl +++ b/src/formconv/dcp.jl @@ -147,7 +147,7 @@ function constraint_converter_losses_ne(pm::_PM.AbstractDCPModel, n::Int, i::Int JuMP.@constraint(pm.model, pconv_ac + pconv_dc == a * z + b*cm_conv_ac ) else JuMP.@constraint(pm.model, pconv_ac + pconv_dc >= a * z + b*cm_conv_ac ) - JuMP.@constraint(pm.model, pconv_ac + pconv_dc >= -(a * z - b*cm_conv_ac) ) + JuMP.@constraint(pm.model, pconv_ac + pconv_dc >= a * z - b*cm_conv_ac ) JuMP.@constraint(pm.model, pconv_ac + pconv_dc <= plmax) end end diff --git a/src/prob/acdcopf.jl b/src/prob/acdcopf.jl index 05bf7948..5eb9d031 100644 --- a/src/prob/acdcopf.jl +++ b/src/prob/acdcopf.jl @@ -9,7 +9,7 @@ end "" function run_acdcopf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) - return _PM.run_model(data, model_type, solver, post_acdcopf; ref_extensions = [add_ref_dcgrid!], kwargs...) + return _PM.solve_model(data, model_type, solver, post_acdcopf; ref_extensions = [add_ref_dcgrid!], kwargs...) end "" diff --git a/src/prob/acdcopf_bf.jl b/src/prob/acdcopf_bf.jl index dd288dcb..33f6053e 100644 --- a/src/prob/acdcopf_bf.jl +++ b/src/prob/acdcopf_bf.jl @@ -9,7 +9,7 @@ end "" function run_acdcopf_bf(data::Dict{String,Any}, model_type::Type{T}, solver; kwargs...) where T <: _PM.AbstractBFModel - return _PM.run_model(data, model_type, solver, post_acdcopf_bf; ref_extensions = [add_ref_dcgrid!], kwargs...) + return _PM.solve_model(data, model_type, solver, post_acdcopf_bf; ref_extensions = [add_ref_dcgrid!], kwargs...) end function post_acdcopf_bf(pm::_PM.AbstractPowerModel) diff --git a/src/prob/acdcopf_iv.jl b/src/prob/acdcopf_iv.jl index 573debf9..bbf5444d 100644 --- a/src/prob/acdcopf_iv.jl +++ b/src/prob/acdcopf_iv.jl @@ -6,7 +6,7 @@ function run_acdcopf_iv(file::String, model_type, optimizer; kwargs...) end function run_acdcopf_iv(data::Dict{String,Any}, model_type::Type, optimizer; kwargs...) - return _PM.run_model(data, model_type, optimizer, build_acdcopf_iv; ref_extensions = [add_ref_dcgrid!], kwargs...) + return _PM.solve_model(data, model_type, optimizer, build_acdcopf_iv; ref_extensions = [add_ref_dcgrid!], kwargs...) end "" diff --git a/src/prob/acdcpf.jl b/src/prob/acdcpf.jl index e2c1fe5e..489cb84c 100644 --- a/src/prob/acdcpf.jl +++ b/src/prob/acdcpf.jl @@ -9,7 +9,7 @@ end "" function run_acdcpf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) - return _PM.run_model(data, model_type, solver, post_acdcpf; ref_extensions = [add_ref_dcgrid!], kwargs...) + return _PM.solve_model(data, model_type, solver, post_acdcpf; ref_extensions = [add_ref_dcgrid!], kwargs...) end "" diff --git a/src/prob/acdctnepopf.jl b/src/prob/acdctnepopf.jl deleted file mode 100644 index 4f4af885..00000000 --- a/src/prob/acdctnepopf.jl +++ /dev/null @@ -1,102 +0,0 @@ -export run_acdctnepopf - -"" -function run_acdctnepopf(file::String, model_type::Type, solver; kwargs...) - data = _PM.parse_file(file) - process_additional_data!(data) - return run_acdctnepopf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) -end - -"" -function run_acdctnepopf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) - return _PM.run_model(data, model_type, solver, post_acdctnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) -end - -"" -function post_acdctnepopf(pm::_PM.AbstractPowerModel) - # PowerModelsACDC.add_ref_dcgrid!(pm) - # add_candidate_dcgrid!(pm) - _PM.variable_bus_voltage(pm) - _PM.variable_gen_power(pm) - _PM.variable_branch_power(pm) - - variable_voltage_slack(pm) - variable_active_dcbranch_flow(pm) - variable_dc_converter(pm) - variable_dcbranch_current(pm) - variable_dcgrid_voltage_magnitude(pm) - - # new variables for TNEP problem - _PM.variable_ne_branch_indicator(pm) - _PM.variable_ne_branch_power(pm) - _PM.variable_ne_branch_voltage(pm) - variable_active_dcbranch_flow_ne(pm) - variable_branch_ne(pm) - variable_dc_converter_ne(pm) - variable_dcbranch_current_ne(pm) - variable_dcgrid_voltage_magnitude_ne(pm) - objective_min_cost_acdc(pm) - - _PM.constraint_model_voltage(pm) - _PM.constraint_ne_model_voltage(pm) - constraint_voltage_dc(pm) - constraint_voltage_dc_ne(pm) - for i in _PM.ids(pm, :ref_buses) - _PM.constraint_theta_ref(pm, i) - end - for i in _PM.ids(pm, :bus) - constraint_power_balance_acne_dcne(pm, i) - end - for i in _PM.ids(pm, :branch) - _PM.constraint_ohms_yt_from(pm, i) - _PM.constraint_ohms_yt_to(pm, i) - _PM.constraint_voltage_angle_difference(pm, i) - _PM.constraint_thermal_limit_from(pm, i) - _PM.constraint_thermal_limit_to(pm, i) - end - for i in _PM.ids(pm, :ne_branch) - _PM.constraint_ne_ohms_yt_from(pm, i) - _PM.constraint_ne_ohms_yt_to(pm, i) - _PM.constraint_ne_voltage_angle_difference(pm, i) - _PM.constraint_ne_thermal_limit_from(pm, i) - _PM.constraint_ne_thermal_limit_to(pm, i) - end - - for i in _PM.ids(pm, :busdc) - constraint_power_balance_dc_dcne(pm, i) - end - for i in _PM.ids(pm, :busdc_ne) - constraint_power_balance_dcne_dcne(pm, i) - end - - for i in _PM.ids(pm, :branchdc) - constraint_ohms_dc_branch(pm, i) - end - for i in _PM.ids(pm, :branchdc_ne) - constraint_ohms_dc_branch_ne(pm, i) - constraint_branch_limit_on_off(pm, i) - end - - for i in _PM.ids(pm, :convdc) - constraint_converter_losses(pm, i) - constraint_converter_current(pm, i) - constraint_conv_transformer(pm, i) - constraint_conv_reactor(pm, i) - constraint_conv_filter(pm, i) - if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc][i]["islcc"] == 1 - constraint_conv_firing_angle(pm, i) - end - end - - for i in _PM.ids(pm, :convdc_ne) - constraint_converter_losses_ne(pm, i) - constraint_converter_current_ne(pm, i) - constraint_converter_limit_on_off(pm, i) - constraint_conv_transformer_ne(pm, i) - constraint_conv_reactor_ne(pm, i) - constraint_conv_filter_ne(pm, i) - if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc_ne][i]["islcc"] == 1 - constraint_conv_firing_angle_ne(pm, i) - end - end -end diff --git a/src/prob/acdctnepopf_bf.jl b/src/prob/acdctnepopf_bf.jl deleted file mode 100644 index 8f591919..00000000 --- a/src/prob/acdctnepopf_bf.jl +++ /dev/null @@ -1,105 +0,0 @@ -export run_acdctnepopf_bf - -"" -function run_acdctnepopf_bf(file::String, model_type::Type, solver; kwargs...) - data = _PM.parse_file(file) - process_additional_data!(data) - return run_acdctnepopf_bf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) -end - -"" -function run_acdctnepopf_bf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) - return _PM.run_model(data, model_type, solver, post_acdctnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) -end - -"" -function post_acdctnepopf_bf(pm::_PM.AbstractPowerModel) - # PowerModelsACDC.add_ref_dcgrid!(pm) - # add_candidate_dcgrid!(pm) - _PM.variable_bus_voltage(pm) - _PM.variable_gen_power(pm) - _PM.variable_branch_power(pm) - - _PM.variable_branch_current(pm) - variable_voltage_slack(pm) - _PM.constraint_model_current(pm) - - variable_active_dcbranch_flow(pm) - variable_dc_converter(pm) - variable_dcbranch_current(pm) - variable_dcgrid_voltage_magnitude(pm) - - # new variables for TNEP problem - _PM.variable_ne_branch_indicator(pm) - _PM.variable_ne_branch_power(pm) - _PM.variable_ne_branch_current(pm) - variable_active_dcbranch_flow_ne(pm) - variable_branch_ne(pm) - variable_dc_converter_ne(pm) - variable_dcbranch_current_ne(pm) - variable_dcgrid_voltage_magnitude_ne(pm) - objective_min_cost_acdc(pm) - - _PM.constraint_model_voltage(pm) - _PM.constraint_ne_model_voltage(pm) - constraint_voltage_dc(pm) - constraint_voltage_dc_ne(pm) - for i in _PM.ids(pm, :ref_buses) - _PM.constraint_theta_ref(pm, i) - end - for i in _PM.ids(pm, :bus) - constraint_power_balance_acne_dcne(pm, i) - end - for i in _PM.ids(pm, :branch) - _PM.constraint_ohms_yt_from(pm, i) - _PM.constraint_ohms_yt_to(pm, i) - _PM.constraint_voltage_angle_difference(pm, i) - _PM.constraint_thermal_limit_from(pm, i) - _PM.constraint_thermal_limit_to(pm, i) - end - for i in _PM.ids(pm, :ne_branch) - _PM.constraint_ne_ohms_yt_from(pm, i) - _PM.constraint_ne_ohms_yt_to(pm, i) - _PM.constraint_ne_voltage_angle_difference(pm, i) - _PM.constraint_ne_thermal_limit_from(pm, i) - _PM.constraint_ne_thermal_limit_to(pm, i) - end - - for i in _PM.ids(pm, :busdc) - constraint_power_balance_dc_dcne(pm, i) - end - for i in _PM.ids(pm, :busdc_ne) - constraint_power_balance_dcne_dcne(pm, i) - end - - for i in _PM.ids(pm, :branchdc) - constraint_ohms_dc_branch(pm, i) - end - for i in _PM.ids(pm, :branchdc_ne) - constraint_ohms_dc_branch_ne(pm, i) - constraint_branch_limit_on_off(pm, i) - end - - for i in _PM.ids(pm, :convdc) - constraint_converter_losses(pm, i) - constraint_converter_current(pm, i) - constraint_conv_transformer(pm, i) - constraint_conv_reactor(pm, i) - constraint_conv_filter(pm, i) - if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc][i]["islcc"] == 1 - constraint_conv_firing_angle(pm, i) - end - end - - for i in _PM.ids(pm, :convdc_ne) - constraint_converter_losses_ne(pm, i) - constraint_converter_current_ne(pm, i) - constraint_converter_limit_on_off(pm, i) - constraint_conv_transformer_ne(pm, i) - constraint_conv_reactor_ne(pm, i) - constraint_conv_filter_ne(pm, i) - if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc_ne][i]["islcc"] == 1 - constraint_conv_firing_angle_ne(pm, i) - end - end -end diff --git a/src/prob/mp_acdctnepopf.jl b/src/prob/mp_acdctnepopf.jl deleted file mode 100644 index 91f2437d..00000000 --- a/src/prob/mp_acdctnepopf.jl +++ /dev/null @@ -1,119 +0,0 @@ -export run_mp_acdctnepopf - -"" -function run_mp_acdctnepopf(file::String, model_type::Type, solver; kwargs...) - data = _PM.parse_file(file) - return run_mp_acdctnepopf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) -end - -"" -function run_mp_acdctnepopf(data::Dict{String,Any}, model_type::Type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], setting = s, kwargs...) - if setting["process_data_internally"] == true - # PowerModelsACDC.process_additional_data!(data) - process_additional_data!(data) - end - s = setting - return _PM.run_model(data, model_type, solver, post_mp_acdctnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], setting = s, kwargs...) - # pm = _PM.build_model(data, model_type, post_mp_tnepopf; setting = s, kwargs...) - # return _PM.optimize_model!(pm, solver; solution_builder = get_solution_acdc_ne) -end - -"" -function post_mp_acdctnepopf(pm::_PM.AbstractPowerModel) - for (n, networks) in pm.ref[:it][:pm][:nw] - _PM.variable_bus_voltage(pm; nw = n) - _PM.variable_gen_power(pm; nw = n) - _PM.variable_branch_power(pm; nw = n) - - variable_voltage_slack(pm; nw = n) - variable_active_dcbranch_flow(pm; nw = n) - variable_dc_converter(pm; nw = n) - variable_dcbranch_current(pm; nw = n) - variable_dcgrid_voltage_magnitude(pm; nw = n) - - # new variables for TNEP problem - _PM.variable_ne_branch_indicator(pm; nw = n) - _PM.variable_ne_branch_power(pm; nw = n) - _PM.variable_ne_branch_voltage(pm; nw = n) - variable_active_dcbranch_flow_ne(pm; nw = n) - variable_branch_ne(pm; nw = n) - variable_dc_converter_ne(pm; nw = n) - variable_dcbranch_current_ne(pm; nw = n) - variable_dcgrid_voltage_magnitude_ne(pm; nw = n) - end - objective_min_cost_acdc(pm) - for (n, networks) in pm.ref[:it][:pm][:nw] - _PM.constraint_model_voltage(pm; nw = n) - _PM.constraint_ne_model_voltage(pm; nw = n) - constraint_voltage_dc(pm; nw = n) - constraint_voltage_dc_ne(pm; nw = n) - for i in _PM.ids(pm, n, :ref_buses) - _PM.constraint_theta_ref(pm, i, nw = n) - end - - for i in _PM.ids(pm, n, :bus) - constraint_power_balance_acne_dcne(pm, i; nw = n) - end - - for i in _PM.ids(pm, n, :branch) - _PM.constraint_ohms_yt_from(pm, i; nw = n) - _PM.constraint_ohms_yt_to(pm, i; nw = n) - _PM.constraint_voltage_angle_difference(pm, i; nw = n) - _PM.constraint_thermal_limit_from(pm, i; nw = n) - _PM.constraint_thermal_limit_to(pm, i; nw = n) - end - for i in _PM.ids(pm, n, :ne_branch) - _PM.constraint_ne_ohms_yt_from(pm, i; nw = n) - _PM.constraint_ne_ohms_yt_to(pm, i; nw = n) - _PM.constraint_ne_voltage_angle_difference(pm, i; nw = n) - _PM.constraint_ne_thermal_limit_from(pm, i; nw = n) - _PM.constraint_ne_thermal_limit_to(pm, i; nw = n) - if n > 1 - constraint_candidate_acbranches_mp(pm, n, i) - end - end - - for i in _PM.ids(pm, n, :busdc) - constraint_power_balance_dc_dcne(pm, i; nw = n) - end - for i in _PM.ids(pm, n, :busdc_ne) - constraint_power_balance_dcne_dcne(pm, i; nw = n) - end - - for i in _PM.ids(pm, n, :branchdc) - constraint_ohms_dc_branch(pm, i; nw = n) - end - for i in _PM.ids(pm, n, :branchdc_ne) - constraint_ohms_dc_branch_ne(pm, i; nw = n) - constraint_branch_limit_on_off(pm, i; nw = n) - if n > 1 - constraint_candidate_dcbranches_mp(pm, n, i) - end - end - - for i in _PM.ids(pm, n, :convdc) - constraint_converter_losses(pm, i; nw = n) - constraint_converter_current(pm, i; nw = n) - constraint_conv_transformer(pm, i; nw = n) - constraint_conv_reactor(pm, i; nw = n) - constraint_conv_filter(pm, i; nw = n) - if pm.ref[:it][:pm][:nw][n][:convdc][i]["islcc"] == 1 - constraint_conv_firing_angle(pm, i; nw = n) - end - end - for i in _PM.ids(pm, n, :convdc_ne) - constraint_converter_losses_ne(pm, i; nw = n) - constraint_converter_current_ne(pm, i; nw = n) - constraint_converter_limit_on_off(pm, i; nw = n) - if n > 1 - constraint_candidate_converters_mp(pm, n, i) - end - constraint_conv_transformer_ne(pm, i; nw = n) - constraint_conv_reactor_ne(pm, i; nw = n) - constraint_conv_filter_ne(pm, i; nw = n) - if pm.ref[:it][:pm][:nw][n][:convdc_ne][i]["islcc"] == 1 - constraint_conv_firing_angle_ne(pm, i; nw = n) - end - end - end -end diff --git a/src/prob/mp_acdctnepopf_bf.jl b/src/prob/mp_acdctnepopf_bf.jl deleted file mode 100644 index 1d9e5e65..00000000 --- a/src/prob/mp_acdctnepopf_bf.jl +++ /dev/null @@ -1,121 +0,0 @@ -export run_mp_acdctnepopf_bf - -"" -function run_mp_acdctnepopf_bf(file::String, model_type::Type, solver; kwargs...) - data = _PM.parse_file(file) - return run_mp_acdctnepopf_bf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) -end - -"" -function run_mp_acdctnepopf_bf(data::Dict{String,Any}, model_type::Type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], setting = s, kwargs...) - if setting["process_data_internally"] == true - # PowerModelsACDC.process_additional_data!(data) - process_additional_data!(data) - end - s = setting - return _PM.run_model(data, model_type, solver, post_mp_acdctnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], setting = s, kwargs...) - # pm = _PM.build_model(data, model_type, post_mp_tnepopf; setting = s, kwargs...) - # return _PM.optimize_model!(pm, solver; solution_builder = get_solution_acdc_ne) -end - -"" -function post_mp_acdctnepopf_bf(pm::_PM.AbstractPowerModel) - for (n, networks) in pm.ref[:it][:pm][:nw] - _PM.variable_bus_voltage(pm; nw = n) - _PM.variable_gen_power(pm; nw = n) - _PM.variable_branch_power(pm; nw = n) - _PM.variable_branch_current(pm; nw = n) - variable_voltage_slack(pm; nw = n) - _PM.constraint_model_current(pm; nw = n) - - variable_active_dcbranch_flow(pm; nw = n) - variable_dc_converter(pm; nw = n) - variable_dcbranch_current(pm; nw = n) - variable_dcgrid_voltage_magnitude(pm; nw = n) - # new variables for TNEP problem - _PM.variable_ne_branch_indicator(pm; nw = n) - _PM.variable_ne_branch_power(pm; nw = n) - _PM.variable_ne_branch_voltage(pm; nw = n) - variable_active_dcbranch_flow_ne(pm; nw = n) - variable_branch_ne(pm; nw = n) - variable_dc_converter_ne(pm; nw = n) # add more variables in variableconv.jl - variable_dcbranch_current_ne(pm; nw = n) - variable_dcgrid_voltage_magnitude_ne(pm; nw = n) - end - objective_min_cost_acdc(pm) - for (n, networks) in pm.ref[:it][:pm][:nw] - _PM.constraint_model_voltage(pm; nw = n) - _PM.constraint_ne_model_voltage(pm; nw = n) - constraint_voltage_dc(pm; nw = n) - constraint_voltage_dc_ne(pm; nw = n) - for i in _PM.ids(pm, n, :ref_buses) - _PM.constraint_theta_ref(pm, i, nw = n) - end - - for i in _PM.ids(pm, n, :bus) - constraint_power_balance_acne_dcne(pm, i; nw = n) - end - - for i in _PM.ids(pm, n, :branch) - _PM.constraint_ohms_yt_from(pm, i; nw = n) - _PM.constraint_ohms_yt_to(pm, i; nw = n) - _PM.constraint_voltage_angle_difference(pm, i; nw = n) - _PM.constraint_thermal_limit_from(pm, i; nw = n) - _PM.constraint_thermal_limit_to(pm, i; nw = n) - end - - for i in _PM.ids(pm, n, :ne_branch) - _PM.constraint_ne_ohms_yt_from(pm, i; nw = n) - _PM.constraint_ne_ohms_yt_to(pm, i; nw = n) - _PM.constraint_ne_voltage_angle_difference(pm, i; nw = n) - _PM.constraint_ne_thermal_limit_from(pm, i; nw = n) - _PM.constraint_ne_thermal_limit_to(pm, i; nw = n) - if n > 1 - constraint_candidate_acbranches_mp(pm, n, i) - end - end - - for i in _PM.ids(pm, n, :busdc) - constraint_power_balance_dc_dcne(pm, i; nw = n) - end - for i in _PM.ids(pm, n, :busdc_ne) - constraint_power_balance_dcne_dcne(pm, i; nw = n) - end - - for i in _PM.ids(pm, n, :branchdc) - PowerModelsACDC.constraint_ohms_dc_branch(pm, i; nw = n) - end - for i in _PM.ids(pm, n, :branchdc_ne) - constraint_ohms_dc_branch_ne(pm, i; nw = n) - constraint_branch_limit_on_off(pm, i; nw = n) - if n > 1 - constraint_candidate_dcbranches_mp(pm, n, i) - end - end - - for i in _PM.ids(pm, n, :convdc) - constraint_converter_losses(pm, i; nw = n) - constraint_converter_current(pm, i; nw = n) - constraint_conv_transformer(pm, i; nw = n) - constraint_conv_reactor(pm, i; nw = n) - constraint_conv_filter(pm, i; nw = n) - if pm.ref[:it][:pm][:nw][n][:convdc][i]["islcc"] == 1 - constraint_conv_firing_angle(pm, i; nw = n) - end - end - for i in _PM.ids(pm, n, :convdc_ne) - constraint_converter_losses_ne(pm, i; nw = n) - constraint_converter_current_ne(pm, i; nw = n) - constraint_converter_limit_on_off(pm, i; nw = n) - if n > 1 - constraint_candidate_converters_mp(pm, n, i) - end - constraint_conv_transformer_ne(pm, i; nw = n) - constraint_conv_reactor_ne(pm, i; nw = n) - constraint_conv_filter_ne(pm, i; nw = n) - if pm.ref[:it][:pm][:nw][n][:convdc_ne][i]["islcc"] == 1 - constraint_conv_firing_angle_ne(pm, i; nw = n) - end - end - end -end diff --git a/src/prob/mp_tnepopf.jl b/src/prob/mp_tnepopf.jl index f5910134..120c52b2 100644 --- a/src/prob/mp_tnepopf.jl +++ b/src/prob/mp_tnepopf.jl @@ -9,21 +9,18 @@ end "" function run_mp_tnepopf(data::Dict{String,Any}, model_type::Type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], setting = s, kwargs...) if setting["process_data_internally"] == true - # PowerModelsACDC.process_additional_data!(data) process_additional_data!(data) end s = setting - return _PM.run_model(data, model_type, solver, post_mp_tnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], setting = s, kwargs...) - # pm = _PM.build_model(data, model_type, post_mp_tnepopf; setting = s, kwargs...) - # return _PM.optimize_model!(pm, solver; solution_builder = get_solution_acdc_ne) + if haskey(data, "nw") && haskey(data["nw"]["1"], "ne_branch") # combined AC and DC TNEP + return _PM.solve_model(data, model_type, solver, post_mp_acdctnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], setting = s, kwargs...) + else + return _PM.solve_model(data, model_type, solver, post_mp_tnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], setting = s, kwargs...) + end end "" function post_mp_tnepopf(pm::_PM.AbstractPowerModel) - # for (n, networks) in pm.ref[:it][:pm][:nw] - # PowerModelsACDC.add_ref_dcgrid!(pm, n) - # add_candidate_dcgrid!(pm, n) - # end for (n, networks) in pm.ref[:it][:pm][:nw] _PM.variable_bus_voltage(pm; nw = n) _PM.variable_gen_power(pm; nw = n) @@ -106,3 +103,103 @@ function post_mp_tnepopf(pm::_PM.AbstractPowerModel) end end end + +"" +function post_mp_acdctnepopf(pm::_PM.AbstractPowerModel) + for (n, networks) in pm.ref[:it][:pm][:nw] + _PM.variable_bus_voltage(pm; nw = n) + _PM.variable_gen_power(pm; nw = n) + _PM.variable_branch_power(pm; nw = n) + + variable_voltage_slack(pm; nw = n) + variable_active_dcbranch_flow(pm; nw = n) + variable_dc_converter(pm; nw = n) + variable_dcbranch_current(pm; nw = n) + variable_dcgrid_voltage_magnitude(pm; nw = n) + + # new variables for TNEP problem + _PM.variable_ne_branch_indicator(pm; nw = n) + _PM.variable_ne_branch_power(pm; nw = n) + _PM.variable_ne_branch_voltage(pm; nw = n) + variable_active_dcbranch_flow_ne(pm; nw = n) + variable_branch_ne(pm; nw = n) + variable_dc_converter_ne(pm; nw = n) + variable_dcbranch_current_ne(pm; nw = n) + variable_dcgrid_voltage_magnitude_ne(pm; nw = n) + end + objective_min_cost_acdc(pm) + for (n, networks) in pm.ref[:it][:pm][:nw] + _PM.constraint_model_voltage(pm; nw = n) + _PM.constraint_ne_model_voltage(pm; nw = n) + constraint_voltage_dc(pm; nw = n) + constraint_voltage_dc_ne(pm; nw = n) + for i in _PM.ids(pm, n, :ref_buses) + _PM.constraint_theta_ref(pm, i, nw = n) + end + + for i in _PM.ids(pm, n, :bus) + constraint_power_balance_acne_dcne(pm, i; nw = n) + end + + for i in _PM.ids(pm, n, :branch) + _PM.constraint_ohms_yt_from(pm, i; nw = n) + _PM.constraint_ohms_yt_to(pm, i; nw = n) + _PM.constraint_voltage_angle_difference(pm, i; nw = n) + _PM.constraint_thermal_limit_from(pm, i; nw = n) + _PM.constraint_thermal_limit_to(pm, i; nw = n) + end + for i in _PM.ids(pm, n, :ne_branch) + _PM.constraint_ne_ohms_yt_from(pm, i; nw = n) + _PM.constraint_ne_ohms_yt_to(pm, i; nw = n) + _PM.constraint_ne_voltage_angle_difference(pm, i; nw = n) + _PM.constraint_ne_thermal_limit_from(pm, i; nw = n) + _PM.constraint_ne_thermal_limit_to(pm, i; nw = n) + if n > 1 + constraint_candidate_acbranches_mp(pm, n, i) + end + end + + for i in _PM.ids(pm, n, :busdc) + constraint_power_balance_dc_dcne(pm, i; nw = n) + end + for i in _PM.ids(pm, n, :busdc_ne) + constraint_power_balance_dcne_dcne(pm, i; nw = n) + end + + for i in _PM.ids(pm, n, :branchdc) + constraint_ohms_dc_branch(pm, i; nw = n) + end + for i in _PM.ids(pm, n, :branchdc_ne) + constraint_ohms_dc_branch_ne(pm, i; nw = n) + constraint_branch_limit_on_off(pm, i; nw = n) + if n > 1 + constraint_candidate_dcbranches_mp(pm, n, i) + end + end + + for i in _PM.ids(pm, n, :convdc) + constraint_converter_losses(pm, i; nw = n) + constraint_converter_current(pm, i; nw = n) + constraint_conv_transformer(pm, i; nw = n) + constraint_conv_reactor(pm, i; nw = n) + constraint_conv_filter(pm, i; nw = n) + if pm.ref[:it][:pm][:nw][n][:convdc][i]["islcc"] == 1 + constraint_conv_firing_angle(pm, i; nw = n) + end + end + for i in _PM.ids(pm, n, :convdc_ne) + constraint_converter_losses_ne(pm, i; nw = n) + constraint_converter_current_ne(pm, i; nw = n) + constraint_converter_limit_on_off(pm, i; nw = n) + if n > 1 + constraint_candidate_converters_mp(pm, n, i) + end + constraint_conv_transformer_ne(pm, i; nw = n) + constraint_conv_reactor_ne(pm, i; nw = n) + constraint_conv_filter_ne(pm, i; nw = n) + if pm.ref[:it][:pm][:nw][n][:convdc_ne][i]["islcc"] == 1 + constraint_conv_firing_angle_ne(pm, i; nw = n) + end + end + end +end diff --git a/src/prob/mp_tnepopf_bf.jl b/src/prob/mp_tnepopf_bf.jl index 6bda2182..6bfe0f74 100644 --- a/src/prob/mp_tnepopf_bf.jl +++ b/src/prob/mp_tnepopf_bf.jl @@ -13,15 +13,15 @@ function run_mp_tnepopf_bf(data::Dict{String,Any}, model_type::Type{T}, solver; process_additional_data!(data) end s = setting - return _PM.run_model(data, model_type, solver, post_mp_tnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], setting = s, kwargs...) + if haskey(data, "nw") && haskey(data["nw"]["1"], "ne_branch") # combined AC and DC TNEP + return _PM.solve_model(data, model_type, solver, post_mp_acdctnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], setting = s, kwargs...) + else + return _PM.solve_model(data, model_type, solver, post_mp_tnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], setting = s, kwargs...) + end end "" function post_mp_tnepopf_bf(pm::_PM.AbstractPowerModel) - # for (n, networks) in pm.ref[:it][:pm][:nw] - # PowerModelsACDC.add_ref_dcgrid!(pm, n) - # add_candidate_dcgrid!(pm, n) - # end for (n, networks) in pm.ref[:it][:pm][:nw] _PM.variable_bus_voltage(pm; nw = n) _PM.variable_gen_power(pm; nw = n) @@ -107,3 +107,106 @@ function post_mp_tnepopf_bf(pm::_PM.AbstractPowerModel) end end end + + +"" +function post_mp_acdctnepopf_bf(pm::_PM.AbstractPowerModel) + for (n, networks) in pm.ref[:it][:pm][:nw] + _PM.variable_bus_voltage(pm; nw = n) + _PM.variable_gen_power(pm; nw = n) + _PM.variable_branch_power(pm; nw = n) + _PM.variable_branch_current(pm; nw = n) + variable_voltage_slack(pm; nw = n) + _PM.constraint_model_current(pm; nw = n) + + variable_active_dcbranch_flow(pm; nw = n) + variable_dc_converter(pm; nw = n) + variable_dcbranch_current(pm; nw = n) + variable_dcgrid_voltage_magnitude(pm; nw = n) + # new variables for TNEP problem + _PM.variable_ne_branch_indicator(pm; nw = n) + _PM.variable_ne_branch_power(pm; nw = n) + _PM.variable_ne_branch_voltage(pm; nw = n) + variable_active_dcbranch_flow_ne(pm; nw = n) + variable_branch_ne(pm; nw = n) + variable_dc_converter_ne(pm; nw = n) # add more variables in variableconv.jl + variable_dcbranch_current_ne(pm; nw = n) + variable_dcgrid_voltage_magnitude_ne(pm; nw = n) + end + objective_min_cost_acdc(pm) + for (n, networks) in pm.ref[:it][:pm][:nw] + _PM.constraint_model_voltage(pm; nw = n) + _PM.constraint_ne_model_voltage(pm; nw = n) + constraint_voltage_dc(pm; nw = n) + constraint_voltage_dc_ne(pm; nw = n) + for i in _PM.ids(pm, n, :ref_buses) + _PM.constraint_theta_ref(pm, i, nw = n) + end + + for i in _PM.ids(pm, n, :bus) + constraint_power_balance_acne_dcne(pm, i; nw = n) + end + + for i in _PM.ids(pm, n, :branch) + _PM.constraint_ohms_yt_from(pm, i; nw = n) + _PM.constraint_ohms_yt_to(pm, i; nw = n) + _PM.constraint_voltage_angle_difference(pm, i; nw = n) + _PM.constraint_thermal_limit_from(pm, i; nw = n) + _PM.constraint_thermal_limit_to(pm, i; nw = n) + end + + for i in _PM.ids(pm, n, :ne_branch) + _PM.constraint_ne_ohms_yt_from(pm, i; nw = n) + _PM.constraint_ne_ohms_yt_to(pm, i; nw = n) + _PM.constraint_ne_voltage_angle_difference(pm, i; nw = n) + _PM.constraint_ne_thermal_limit_from(pm, i; nw = n) + _PM.constraint_ne_thermal_limit_to(pm, i; nw = n) + if n > 1 + constraint_candidate_acbranches_mp(pm, n, i) + end + end + + for i in _PM.ids(pm, n, :busdc) + constraint_power_balance_dc_dcne(pm, i; nw = n) + end + for i in _PM.ids(pm, n, :busdc_ne) + constraint_power_balance_dcne_dcne(pm, i; nw = n) + end + + for i in _PM.ids(pm, n, :branchdc) + PowerModelsACDC.constraint_ohms_dc_branch(pm, i; nw = n) + end + for i in _PM.ids(pm, n, :branchdc_ne) + constraint_ohms_dc_branch_ne(pm, i; nw = n) + constraint_branch_limit_on_off(pm, i; nw = n) + if n > 1 + constraint_candidate_dcbranches_mp(pm, n, i) + end + end + + for i in _PM.ids(pm, n, :convdc) + constraint_converter_losses(pm, i; nw = n) + constraint_converter_current(pm, i; nw = n) + constraint_conv_transformer(pm, i; nw = n) + constraint_conv_reactor(pm, i; nw = n) + constraint_conv_filter(pm, i; nw = n) + if pm.ref[:it][:pm][:nw][n][:convdc][i]["islcc"] == 1 + constraint_conv_firing_angle(pm, i; nw = n) + end + end + for i in _PM.ids(pm, n, :convdc_ne) + constraint_converter_losses_ne(pm, i; nw = n) + constraint_converter_current_ne(pm, i; nw = n) + constraint_converter_limit_on_off(pm, i; nw = n) + if n > 1 + constraint_candidate_converters_mp(pm, n, i) + end + constraint_conv_transformer_ne(pm, i; nw = n) + constraint_conv_reactor_ne(pm, i; nw = n) + constraint_conv_filter_ne(pm, i; nw = n) + if pm.ref[:it][:pm][:nw][n][:convdc_ne][i]["islcc"] == 1 + constraint_conv_firing_angle_ne(pm, i; nw = n) + end + end + end +end diff --git a/src/prob/tnepopf.jl b/src/prob/tnepopf.jl index c5d170b2..4dac1e36 100644 --- a/src/prob/tnepopf.jl +++ b/src/prob/tnepopf.jl @@ -4,12 +4,17 @@ export run_tnepopf function run_tnepopf(file::String, model_type::Type, solver; kwargs...) data = _PM.parse_file(file) process_additional_data!(data) - return run_tnepopf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) + + if haskey(data, "ne_branch") # combined AC and DC TNEP + return run_acdctnepopf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) + else + return run_tnepopf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) + end end "" function run_tnepopf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) - return _PM.run_model(data, model_type, solver, post_tnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) + return _PM.solve_model(data, model_type, solver, post_tnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) end "" @@ -88,3 +93,96 @@ function post_tnepopf(pm::_PM.AbstractPowerModel) end end end + + +### AC and DC TNEP combined + +function run_acdctnepopf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) + return _PM.solve_model(data, model_type, solver, post_acdctnepopf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) +end + +function post_acdctnepopf(pm::_PM.AbstractPowerModel) + _PM.variable_bus_voltage(pm) + _PM.variable_gen_power(pm) + _PM.variable_branch_power(pm) + + variable_voltage_slack(pm) + variable_active_dcbranch_flow(pm) + variable_dc_converter(pm) + variable_dcbranch_current(pm) + variable_dcgrid_voltage_magnitude(pm) + + # new variables for TNEP problem + _PM.variable_ne_branch_indicator(pm) + _PM.variable_ne_branch_power(pm) + _PM.variable_ne_branch_voltage(pm) + variable_active_dcbranch_flow_ne(pm) + variable_branch_ne(pm) + variable_dc_converter_ne(pm) + variable_dcbranch_current_ne(pm) + variable_dcgrid_voltage_magnitude_ne(pm) + objective_min_cost_acdc(pm) + + _PM.constraint_model_voltage(pm) + _PM.constraint_ne_model_voltage(pm) + constraint_voltage_dc(pm) + constraint_voltage_dc_ne(pm) + for i in _PM.ids(pm, :ref_buses) + _PM.constraint_theta_ref(pm, i) + end + for i in _PM.ids(pm, :bus) + constraint_power_balance_acne_dcne(pm, i) + end + for i in _PM.ids(pm, :branch) + _PM.constraint_ohms_yt_from(pm, i) + _PM.constraint_ohms_yt_to(pm, i) + _PM.constraint_voltage_angle_difference(pm, i) + _PM.constraint_thermal_limit_from(pm, i) + _PM.constraint_thermal_limit_to(pm, i) + end + for i in _PM.ids(pm, :ne_branch) + _PM.constraint_ne_ohms_yt_from(pm, i) + _PM.constraint_ne_ohms_yt_to(pm, i) + _PM.constraint_ne_voltage_angle_difference(pm, i) + _PM.constraint_ne_thermal_limit_from(pm, i) + _PM.constraint_ne_thermal_limit_to(pm, i) + end + + for i in _PM.ids(pm, :busdc) + constraint_power_balance_dc_dcne(pm, i) + end + for i in _PM.ids(pm, :busdc_ne) + constraint_power_balance_dcne_dcne(pm, i) + end + + for i in _PM.ids(pm, :branchdc) + constraint_ohms_dc_branch(pm, i) + end + for i in _PM.ids(pm, :branchdc_ne) + constraint_ohms_dc_branch_ne(pm, i) + constraint_branch_limit_on_off(pm, i) + end + + for i in _PM.ids(pm, :convdc) + constraint_converter_losses(pm, i) + constraint_converter_current(pm, i) + constraint_conv_transformer(pm, i) + constraint_conv_reactor(pm, i) + constraint_conv_filter(pm, i) + if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc][i]["islcc"] == 1 + constraint_conv_firing_angle(pm, i) + end + end + + for i in _PM.ids(pm, :convdc_ne) + constraint_converter_losses_ne(pm, i) + constraint_converter_current_ne(pm, i) + constraint_converter_limit_on_off(pm, i) + constraint_conv_transformer_ne(pm, i) + constraint_conv_reactor_ne(pm, i) + constraint_conv_filter_ne(pm, i) + if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc_ne][i]["islcc"] == 1 + constraint_conv_firing_angle_ne(pm, i) + end + end +end diff --git a/src/prob/tnepopf_bf.jl b/src/prob/tnepopf_bf.jl index 54a83942..33fcc6a2 100644 --- a/src/prob/tnepopf_bf.jl +++ b/src/prob/tnepopf_bf.jl @@ -4,12 +4,16 @@ export run_tnepopf_bf function run_tnepopf_bf(file::String, model_type::Type{T}, solver; kwargs...) where T <: _PM.AbstractBFModel data = _PM.parse_file(file) process_additional_data!(data) - return run_tnepopf_bf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) + if haskey(data, "ne_branch") # combined AC and DC TNEP + return run_acdctnepopf_bf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) + else + return run_tnepopf_bf(data, model_type, solver; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) + end end "" function run_tnepopf_bf(data::Dict{String,Any}, model_type::Type{T}, solver; kwargs...) where T <: _PM.AbstractBFModel - return _PM.run_model(data, model_type, solver, post_tnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) + return _PM.solve_model(data, model_type, solver, post_tnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!], kwargs...) end "" @@ -92,3 +96,103 @@ function post_tnepopf_bf(pm::_PM.AbstractPowerModel) end end end + +# COMBINED AC and DC TNEP + +"" +function run_acdctnepopf_bf(data::Dict{String,Any}, model_type::Type, solver; kwargs...) + return _PM.solve_model(data, model_type, solver, post_acdctnepopf_bf; ref_extensions = [add_ref_dcgrid!, add_candidate_dcgrid!, _PM.ref_add_on_off_va_bounds!, _PM.ref_add_ne_branch!], kwargs...) +end + +"" +function post_acdctnepopf_bf(pm::_PM.AbstractPowerModel) + # PowerModelsACDC.add_ref_dcgrid!(pm) + # add_candidate_dcgrid!(pm) + _PM.variable_bus_voltage(pm) + _PM.variable_gen_power(pm) + _PM.variable_branch_power(pm) + + _PM.variable_branch_current(pm) + variable_voltage_slack(pm) + _PM.constraint_model_current(pm) + + variable_active_dcbranch_flow(pm) + variable_dc_converter(pm) + variable_dcbranch_current(pm) + variable_dcgrid_voltage_magnitude(pm) + + # new variables for TNEP problem + _PM.variable_ne_branch_indicator(pm) + _PM.variable_ne_branch_power(pm) + _PM.variable_ne_branch_current(pm) + variable_active_dcbranch_flow_ne(pm) + variable_branch_ne(pm) + variable_dc_converter_ne(pm) + variable_dcbranch_current_ne(pm) + variable_dcgrid_voltage_magnitude_ne(pm) + objective_min_cost_acdc(pm) + + _PM.constraint_model_voltage(pm) + _PM.constraint_ne_model_voltage(pm) + constraint_voltage_dc(pm) + constraint_voltage_dc_ne(pm) + for i in _PM.ids(pm, :ref_buses) + _PM.constraint_theta_ref(pm, i) + end + for i in _PM.ids(pm, :bus) + constraint_power_balance_acne_dcne(pm, i) + end + for i in _PM.ids(pm, :branch) + _PM.constraint_ohms_yt_from(pm, i) + _PM.constraint_ohms_yt_to(pm, i) + _PM.constraint_voltage_angle_difference(pm, i) + _PM.constraint_thermal_limit_from(pm, i) + _PM.constraint_thermal_limit_to(pm, i) + end + for i in _PM.ids(pm, :ne_branch) + _PM.constraint_ne_ohms_yt_from(pm, i) + _PM.constraint_ne_ohms_yt_to(pm, i) + _PM.constraint_ne_voltage_angle_difference(pm, i) + _PM.constraint_ne_thermal_limit_from(pm, i) + _PM.constraint_ne_thermal_limit_to(pm, i) + end + + for i in _PM.ids(pm, :busdc) + constraint_power_balance_dc_dcne(pm, i) + end + for i in _PM.ids(pm, :busdc_ne) + constraint_power_balance_dcne_dcne(pm, i) + end + + for i in _PM.ids(pm, :branchdc) + constraint_ohms_dc_branch(pm, i) + end + for i in _PM.ids(pm, :branchdc_ne) + constraint_ohms_dc_branch_ne(pm, i) + constraint_branch_limit_on_off(pm, i) + end + + for i in _PM.ids(pm, :convdc) + constraint_converter_losses(pm, i) + constraint_converter_current(pm, i) + constraint_conv_transformer(pm, i) + constraint_conv_reactor(pm, i) + constraint_conv_filter(pm, i) + if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc][i]["islcc"] == 1 + constraint_conv_firing_angle(pm, i) + end + end + + for i in _PM.ids(pm, :convdc_ne) + constraint_converter_losses_ne(pm, i) + constraint_converter_current_ne(pm, i) + constraint_converter_limit_on_off(pm, i) + constraint_conv_transformer_ne(pm, i) + constraint_conv_reactor_ne(pm, i) + constraint_conv_filter_ne(pm, i) + if pm.ref[:it][:pm][:nw][_PM.nw_id_default][:convdc_ne][i]["islcc"] == 1 + constraint_conv_firing_angle_ne(pm, i) + end + end +end + diff --git a/test/data/tnep/case6_acdc_test.m b/test/data/tnep/case6_acdc_tnep.m similarity index 100% rename from test/data/tnep/case6_acdc_test.m rename to test/data/tnep/case6_acdc_tnep.m diff --git a/test/data/tnep/case6_dc_tnep.m b/test/data/tnep/case6_dc_tnep.m new file mode 100644 index 00000000..9a484d08 --- /dev/null +++ b/test/data/tnep/case6_dc_tnep.m @@ -0,0 +1,81 @@ +% Garver system - Transmission Network Estimation Using Linear Programming, IEEE trans. on power appratus and sys +% Power system transmission network expansion planning using AC model by Rider, MJ and Garcia, AV and Romero, R +%modification: gen cost is changed. A low value is set to penalize power losses but not dominate the objective. +function mpc = case6 +mpc.version = '2'; +mpc.baseMVA = 100.0; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 1 3 80 16 0.0 0.0 1 1.10000 -0.00000 240.0 1 1.05000 0.95000; + 2 1 240 48 0.0 0.0 1 0.92617 7.25883 240.0 1 1.05000 0.95000; + 3 2 40 8 0.0 0.0 1 0.90000 -17.26710 240.0 1 1.05000 0.95000; + 4 1 160 32 0.0 0.0 1 1.10000 -0.00000 240.0 1 1.05000 0.95000; + 5 1 240 48 0.0 0.0 1 0.92617 7.25883 240.0 1 1.05000 0.95000; + 6 2 0 0 0.0 0.0 1 0.90000 -17.26710 240.0 1 1.05000 0.95000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin pc1 pc2 qlcmin qlcmax qc2min qc2max ramp_agc ramp_10 ramp_30 ramp_q apf +mpc.gen = [ + 1 148 54 48.0 -10.0 1.1 100.0 1 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; + 3 170 -8 101.0 -10.0 0.92617 100.0 1 360.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; + 6 0.0 -4 183.0 -10.0 0.9 100.0 1 600.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; +]; + +mpc.gencost = [ + 2 0.0 0.0 3 0 0.01 0; + 2 0.0 0.0 3 0 0.01 0; + 2 0.0 0.0 3 0 0.01 0; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle +% status angmin angmax +mpc.branch = [ + 1 2 0.040 0.400 0.00 100 100 100 0 0 1 -60 60; + 1 4 0.060 0.600 0.00 80 80 80 0 0 1 -60 60; + 1 5 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; + 2 3 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; + 2 4 0.040 0.400 0.00 100 100 100 0 0 1 -60 60; + 3 5 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; +]; + +%% candidate dc bus data +%column_names% busdc_i grid Pdc Vdc basekVdc Vdcmax Vdcmin Cdc +mpc.busdc_ne = [ +1 1 0 1 345 1.1 0.9 0; +2 1 0 1 345 1.1 0.9 0; +3 1 0 1 345 1.1 0.9 0; +4 1 0 1 345 1.1 0.9 0; +5 1 0 1 345 1.1 0.9 0; +6 1 0 1 345 1.1 0.9 0; +]; + +%% candidate branches +%column_names% fbusdc tbusdc r l c rateA rateB rateC status cost +mpc.branchdc_ne = [ + 2 5 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.3; + 2 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.4; + 2 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.4; + 3 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.6; + 3 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.6; + 4 5 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.7; + 4 5 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.7; + 4 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.8; + 4 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.8; + 5 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.9; + 5 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.9; + ]; + +%% candidate converters +%column_names% busdc_i busac_i type_dc type_ac P_g Q_g islcc Vtar rtf xtf transformer tm bf filter rc xc reactor basekVac Vmmax Vmmin Imax status LossA LossB LossCrec LossCinv droop Pdcset Vdcset dVdcset Pacmax Pacmin Qacmax Qacmin cost +mpc.convdc_ne = [ +1 1 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 3; +2 2 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 3.5; +3 3 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 2.5; +4 4 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 4; +5 5 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 4.5; +6 6 2 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 5; +]; diff --git a/test/data/tnep/case6acdc_dc_branch_tnep.m b/test/data/tnep/case6acdc_dc_branch_tnep.m new file mode 100644 index 00000000..b5baa65d --- /dev/null +++ b/test/data/tnep/case6acdc_dc_branch_tnep.m @@ -0,0 +1,82 @@ +% Garver system - Transmission Network Estimation Using Linear Programming, IEEE trans. on power appratus and sys +% Power system transmission network expansion planning using AC model by Rider, MJ and Garcia, AV and Romero, R +%modification: gen cost is changed. A low value is set to penalize power losses but not dominate the objective. +function mpc = case6 +mpc.version = '2'; +mpc.baseMVA = 100.0; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 1 3 80 16 0.0 0.0 1 1.10000 -0.00000 240.0 1 1.05000 0.95000; + 2 1 240 48 0.0 0.0 1 0.92617 7.25883 240.0 1 1.05000 0.95000; + 3 2 40 8 0.0 0.0 1 0.90000 -17.26710 240.0 1 1.05000 0.95000; + 4 1 160 32 0.0 0.0 1 1.10000 -0.00000 240.0 1 1.05000 0.95000; + 5 1 240 48 0.0 0.0 1 0.92617 7.25883 240.0 1 1.05000 0.95000; + 6 2 0 0 0.0 0.0 1 0.90000 -17.26710 240.0 1 1.05000 0.95000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin pc1 pc2 qlcmin qlcmax qc2min qc2max ramp_agc ramp_10 ramp_30 ramp_q apf +mpc.gen = [ + 1 148 54 48.0 -10.0 1.1 100.0 1 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; + 3 170 -8 101.0 -10.0 0.92617 100.0 1 360.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; + 6 0.0 -4 183.0 -10.0 0.9 100.0 1 600.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; +]; + +mpc.gencost = [ + 2 0.0 0.0 3 0 0.01 0; + 2 0.0 0.0 3 0 0.01 0; + 2 0.0 0.0 3 0 0.01 0; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle +% status angmin angmax +mpc.branch = [ + 1 2 0.040 0.400 0.00 100 100 100 0 0 1 -60 60; + 1 4 0.060 0.600 0.00 80 80 80 0 0 1 -60 60; + 1 5 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; + 2 3 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; + 2 4 0.040 0.400 0.00 100 100 100 0 0 1 -60 60; + 3 5 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; +]; + +%% existing dc bus data +%column_names% busdc_i grid Pdc Vdc basekVdc Vdcmax Vdcmin Cdc +mpc.busdc = [ +1 1 0 1 345 1.1 0.9 0; +2 1 0 1 345 1.1 0.9 0; +3 1 0 1 345 1.1 0.9 0; +4 1 0 1 345 1.1 0.9 0; +5 1 0 1 345 1.1 0.9 0; +6 1 0 1 345 1.1 0.9 0; +]; + +%% existing converters +%column_names% busdc_i busac_i type_dc type_ac P_g Q_g islcc Vtar rtf xtf transformer tm bf filter rc xc reactor basekVac Vmmax Vmmin Imax status LossA LossB LossCrec LossCinv droop Pdcset Vdcset dVdcset Pacmax Pacmin Qacmax Qacmin +mpc.convdc = [ +1 1 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700; +2 2 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700; +3 3 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700; +4 4 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700; +5 5 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700; +6 6 2 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700; +]; + + +%% candidate branches +%column_names% fbusdc tbusdc r l c rateA rateB rateC status cost +mpc.branchdc_ne = [ + 2 5 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.3; + 2 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.4; + 2 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.4; + 3 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.6; + 3 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.6; + 4 5 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.7; + 4 5 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.7; + 4 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.8; + 4 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.8; + 5 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.9; + 5 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.9; + ]; diff --git a/test/data/tnep/case6acdc_dc_tnep.m b/test/data/tnep/case6acdc_dc_tnep.m new file mode 100644 index 00000000..c52cc7bf --- /dev/null +++ b/test/data/tnep/case6acdc_dc_tnep.m @@ -0,0 +1,99 @@ +% Garver system - Transmission Network Estimation Using Linear Programming, IEEE trans. on power appratus and sys +% Power system transmission network expansion planning using AC model by Rider, MJ and Garcia, AV and Romero, R +%modification: gen cost is changed. A low value is set to penalize power losses but not dominate the objective. +function mpc = case6 +mpc.version = '2'; +mpc.baseMVA = 100.0; + +%% bus data +% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin +mpc.bus = [ + 1 3 80 16 0.0 0.0 1 1.10000 -0.00000 240.0 1 1.05000 0.95000; + 2 1 240 48 0.0 0.0 1 0.92617 7.25883 240.0 1 1.05000 0.95000; + 3 2 40 8 0.0 0.0 1 0.90000 -17.26710 240.0 1 1.05000 0.95000; + 4 1 160 32 0.0 0.0 1 1.10000 -0.00000 240.0 1 1.05000 0.95000; + 5 1 240 48 0.0 0.0 1 0.92617 7.25883 240.0 1 1.05000 0.95000; + 6 2 0 0 0.0 0.0 1 0.90000 -17.26710 240.0 1 1.05000 0.95000; +]; + +%% generator data +% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin pc1 pc2 qlcmin qlcmax qc2min qc2max ramp_agc ramp_10 ramp_30 ramp_q apf +mpc.gen = [ + 1 148 54 48.0 -10.0 1.1 100.0 1 150.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; + 3 170 -8 101.0 -10.0 0.92617 100.0 1 360.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; + 6 0.0 -4 183.0 -10.0 0.9 100.0 1 600.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0; +]; + +mpc.gencost = [ + 2 0.0 0.0 3 0 0.01 0; + 2 0.0 0.0 3 0 0.01 0; + 2 0.0 0.0 3 0 0.01 0; +]; + +%% branch data +% fbus tbus r x b rateA rateB rateC ratio angle +% status angmin angmax +mpc.branch = [ + 1 2 0.040 0.400 0.00 100 100 100 0 0 1 -60 60; + 1 4 0.060 0.600 0.00 80 80 80 0 0 1 -60 60; + 1 5 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; + 2 3 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; + 2 4 0.040 0.400 0.00 100 100 100 0 0 1 -60 60; + 3 5 0.020 0.200 0.00 100 100 100 0 0 1 -60 60; +]; + +%% existing dc bus data +%column_names% busdc_i grid Pdc Vdc basekVdc Vdcmax Vdcmin Cdc +mpc.busdc = [ +1 1 0 1 345 1.1 0.9 0; +2 1 0 1 345 1.1 0.9 0; +]; + +%% existing converters +%column_names% busdc_i busac_i type_dc type_ac P_g Q_g islcc Vtar rtf xtf transformer tm bf filter rc xc reactor basekVac Vmmax Vmmin Imax status LossA LossB LossCrec LossCinv droop Pdcset Vdcset dVdcset Pacmax Pacmin Qacmax Qacmin +mpc.convdc = [ +1 1 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 200 -200 200 -200; +2 2 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 200 -200 200 -200; +]; + +%% existing dc branches +%column_names% fbusdc tbusdc r l c rateA rateB rateC status +mpc.branchdc = [ + 1 2 0.01 0.00 0.00 200.0 0.0 0.0 1.0; + ]; + +%% candidate dc bus data +%column_names% busdc_i grid Pdc Vdc basekVdc Vdcmax Vdcmin Cdc +mpc.busdc_ne = [ +3 1 0 1 345 1.1 0.9 0; +4 1 0 1 345 1.1 0.9 0; +5 1 0 1 345 1.1 0.9 0; +6 1 0 1 345 1.1 0.9 0; +]; + +%% candidate branches +%column_names% fbusdc tbusdc r l c rateA rateB rateC status cost +mpc.branchdc_ne = [ + 2 5 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.3; + 2 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.4; + 2 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.4; + 3 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.6; + 3 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.6; + 4 5 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.7; + 4 5 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.7; + 4 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.8; + 4 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.8; + 5 6 0.01 0.00 0.00 200.0 0.0 0.0 1.0 2.9; + 5 6 0.01 0.00 0.00 400.0 0.0 0.0 1.0 3.9; + ]; + +%% candidate converters +%column_names% busdc_i busac_i type_dc type_ac P_g Q_g islcc Vtar rtf xtf transformer tm bf filter rc xc reactor basekVac Vmmax Vmmin Imax status LossA LossB LossCrec LossCinv droop Pdcset Vdcset dVdcset Pacmax Pacmin Qacmax Qacmin cost +mpc.convdc_ne = [ +1 1 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 3; +2 2 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 3.5; +3 3 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 2.5; +4 4 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 4; +5 5 1 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 4.5; +6 6 2 1 -360 -1.66 0 1.0 0.01 0.01 1 1 0.01 1 0.01 0.01 1 345 1.1 0.9 15 1 1.1033 0.887 2.885 2.885 0.0050 -52.7 1.0079 0 700 -700 700 -700 5; +]; diff --git a/test/pf.jl b/test/pf.jl index f7e97b5b..910a9569 100644 --- a/test/pf.jl +++ b/test/pf.jl @@ -41,19 +41,19 @@ s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true) # REMOVED for TRAVIS, otherwise case ok # @testset "24-bus rts ac dc case with three zones" begin # result = run_acdcpf("../test/data/case24_3zones_acdc.m", ACPPowerModel, ipopt_solver; setting = s) - # + # @test result["termination_status"] == LOCALLY_SOLVED # @test isapprox(result["objective"], 0; atol = 1e-2) - # + # @test isapprox(result["solution"]["gen"]["65"]["pg"], 1.419; atol = 2e-3) # @test isapprox(result["solution"]["gen"]["65"]["qg"], -1.29648; atol = 2e-3) - # - # + + # @test isapprox(result["solution"]["bus"]["101"]["vm"], 1.035; atol = 2e-3) # @test isapprox(result["solution"]["bus"]["101"]["va"], -0.1389; atol = 2e-3) # @test isapprox(result["solution"]["bus"]["205"]["vm"], 1.0318; atol = 2e-3) # @test isapprox(result["solution"]["bus"]["301"]["vm"], 1.026266; atol = 2e-3) - # + # @test isapprox(result["solution"]["convdc"]["2"]["pgrid"], -0.753; atol = 2e-3) # @test isapprox(result["solution"]["convdc"]["3"]["pdc"], -1.37301; atol = 2e-3) # @test isapprox(result["solution"]["busdc"]["5"]["vm"], 1.01731; atol = 2e-3) diff --git a/test/runtests.jl b/test/runtests.jl index 3090627d..c25783fc 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -4,24 +4,22 @@ using Memento using InfrastructureModels using JuMP + # Suppress warnings during testing. Memento.setlevel!(Memento.getlogger(InfrastructureModels), "error") Memento.setlevel!(Memento.getlogger(PowerModelsACDC), "error") Memento.setlevel!(Memento.getlogger(PowerModels), "error") using Ipopt -using SCS -using Cbc using Juniper - +using HiGHS using Test local_test = false # as some tests require Mosek, only limited set sent to CI. ipopt_solver = JuMP.optimizer_with_attributes(Ipopt.Optimizer, "tol" => 1e-6, "print_level" => 0) -scs_solver = JuMP.optimizer_with_attributes(SCS.Optimizer, "verbose" => 0) -cbc = JuMP.optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0) -juniper = JuMP.optimizer_with_attributes(Juniper.Optimizer, "nl_solver" => ipopt_solver, "mip_solver" => cbc, "time_limit" => 7200) +highs = JuMP.optimizer_with_attributes(HiGHS.Optimizer) +juniper = JuMP.optimizer_with_attributes(Juniper.Optimizer, "nl_solver" => ipopt_solver, "mip_solver" => highs, "time_limit" => 7200) if local_test == true diff --git a/test/tnep.jl b/test/tnep.jl index b7577821..567c659d 100644 --- a/test/tnep.jl +++ b/test/tnep.jl @@ -1,31 +1,32 @@ s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true) @testset "test dc tnep" begin @testset "6-bus case" begin - resultDC = run_tnepopf("../test/data/tnep/case6_test.m", DCPPowerModel, cbc; setting = s) + resultDC = run_tnepopf("../test/data/tnep/case6_test.m", DCPPowerModel, highs; setting = s) @test isapprox(resultDC["objective"], 26.3331; atol = 1e-1) @test isapprox(resultDC["solution"]["convdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDC["solution"]["convdc_ne"]["5"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDC["solution"]["convdc_ne"]["6"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDC["solution"]["branchdc_ne"]["2"]["isbuilt"], 0; atol = 1e-2) @test isapprox(resultDC["solution"]["branchdc_ne"]["10"]["isbuilt"], 0; atol = 1e-2) - @test isapprox(resultDC["solution"]["branchdc_ne"]["1"]["pf"], 1.3737; atol = 1e-2) + @test isapprox(resultDC["solution"]["branchdc_ne"]["1"]["pf"], 1.77384; atol = 1e-2) + @test isapprox(resultDC["solution"]["branchdc_ne"]["1"]["pt"], -1.77384; atol = 1e-2) end @testset "9-bus case" begin - resultDC = run_tnepopf("../test/data/tnep/case9_test.m", DCPPowerModel, cbc; setting = s) + resultDC = run_tnepopf("../test/data/tnep/case9_test.m", DCPPowerModel, highs; setting = s) @test isapprox(resultDC["objective"], 10.7; atol = 1e-1) @test isapprox(resultDC["solution"]["convdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) end # @testset "14-bus case" begin - resultDC = run_tnepopf("../test/data/tnep/case14_test.m", DCPPowerModel, cbc, setting = s) + resultDC = run_tnepopf("../test/data/tnep/case14_test.m", DCPPowerModel, highs, setting = s) @test isapprox(resultDC["objective"], 15.6921; atol = 1e-1) @test isapprox(resultDC["solution"]["convdc_ne"]["6"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDC["solution"]["convdc_ne"]["7"]["isbuilt"], 0; atol = 1e-2) end # @testset "39-bus case" begin - resultDC = run_tnepopf("../test/data/tnep/case39_test.m", DCPPowerModel, cbc, setting = s) + resultDC = run_tnepopf("../test/data/tnep/case39_test.m", DCPPowerModel, highs, setting = s) @test isapprox(resultDC["objective"], 25.1605; atol = 1e-1) @test isapprox(resultDC["solution"]["convdc_ne"]["1"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDC["solution"]["convdc_ne"]["4"]["isbuilt"], 1; atol = 1e-2) @@ -184,7 +185,7 @@ end @testset "ACDC tnep" begin @testset "DCP" begin - resultDCP = run_acdctnepopf("../test/data/tnep/case4_acdc.m", DCPPowerModel, cbc; setting = s) + resultDCP = run_tnepopf("../test/data/tnep/case4_acdc.m", DCPPowerModel, highs; setting = s) @test isapprox(resultDCP["objective"], 329.95456; atol = 1e-1) @test isapprox(resultDCP["solution"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDCP["solution"]["branchdc_ne"]["3"]["pf"], -1.009; atol = 1e-2) @@ -194,7 +195,7 @@ end @test isapprox(resultDCP["solution"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) end @testset "ACP" begin - resultACP = run_acdctnepopf("../test/data/tnep/case4_acdc.m", ACPPowerModel, juniper; setting = s) + resultACP = run_tnepopf("../test/data/tnep/case4_acdc.m", ACPPowerModel, juniper; setting = s) @test isapprox(resultACP["objective"], 348.0219; atol = 1e-1) @test isapprox(resultACP["solution"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultACP["solution"]["branchdc_ne"]["3"]["pf"], -0.631; atol = 1e-2) @@ -204,7 +205,7 @@ end @test isapprox(resultACP["solution"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) end @testset "LPAC" begin - resultLPAC = run_acdctnepopf("../test/data/tnep/case4_acdc.m", LPACCPowerModel, juniper; setting = s) + resultLPAC = run_tnepopf("../test/data/tnep/case4_acdc.m", LPACCPowerModel, juniper; setting = s) @test isapprox(resultLPAC["objective"], 333.095; atol = 1e-1) @test isapprox(resultLPAC["solution"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultLPAC["solution"]["branchdc_ne"]["3"]["pf"], -1.009; atol = 1e-2) @@ -212,10 +213,10 @@ end @test isapprox(resultLPAC["solution"]["convdc_ne"]["1"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultLPAC["solution"]["convdc_ne"]["1"]["pconv"], -1; atol = 1e-2) @test isapprox(resultLPAC["solution"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) - end + end if local_test == true @testset "SOCWR" begin - resultSOCWR = run_acdctnepopf("../test/data/tnep/case4_acdc.m", SOCWRPowerModel, gurobi; setting = s) + resultSOCWR = run_tnepopf("../test/data/tnep/case4_acdc.m", SOCWRPowerModel, gurobi; setting = s) @test isapprox(resultSOCWR["objective"], 348.021; atol = 1e-1) @test isapprox(resultSOCWR["solution"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultSOCWR["solution"]["branchdc_ne"]["3"]["pf"], -0.631; atol = 1e-2) @@ -227,13 +228,51 @@ end end end +@testset "AC and DC Candidates" begin + result = run_tnepopf("../test/data/tnep/case6_dc_tnep.m", DCPPowerModel, highs; setting = s) + @test isapprox(result["objective"], 26.3331; atol = 1e-1) + @test isapprox(result["solution"]["branchdc_ne"]["1"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["1"]["pf"], 1.77384; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["1"]["pt"], -1.77384; atol = 1e-2) + @test isapprox(result["solution"]["convdc_ne"]["5"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["convdc_ne"]["5"]["pconv"], -1.76543; atol = 1e-2) + + result = run_tnepopf("../test/data/tnep/case6_acdc_tnep.m", DCPPowerModel, highs; setting = s) + @test isapprox(result["objective"], 25.4221; atol = 1e-1) + @test isapprox(result["solution"]["branchdc_ne"]["9"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["9"]["pf"], -3.00658; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["9"]["pt"], 3.00658; atol = 1e-2) + @test isapprox(result["solution"]["convdc_ne"]["6"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["convdc_ne"]["6"]["pconv"], 3.0221; atol = 1e-2) + @test isapprox(result["solution"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) + + result = run_tnepopf("../test/data/tnep/case6acdc_dc_tnep.m", DCPPowerModel, highs; setting = s) + @test isapprox(result["objective"], 22.8442; atol = 1e-1) + @test isapprox(result["solution"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["3"]["pf"], -3.72760; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["3"]["pt"], 3.72760; atol = 1e-2) + @test isapprox(result["solution"]["convdc_ne"]["6"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["convdc_ne"]["6"]["pconv"], 3.74419; atol = 1e-2) + + result = run_tnepopf("../test/data/tnep/case6acdc_dc_branch_tnep.m", DCPPowerModel, highs; setting = s) + @test isapprox(result["objective"], 13.3663; atol = 1e-1) + @test isapprox(result["solution"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["3"]["pf"], -3.738639; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["3"]["pt"], 3.738639; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["4"]["isbuilt"], 0; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["1"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["1"]["pf"], 1.382799; atol = 1e-2) + @test isapprox(result["solution"]["branchdc_ne"]["1"]["pt"], -1.382799; atol = 1e-2) + +end + s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true, "process_data_internally" => false) @testset "mp-tnep" begin @testset "dc tnep" begin @testset "DCP" begin data_dc = build_mn_data("../test/data/tnep/case4_original.m") - resultDCP = run_mp_tnepopf(data_dc, DCPPowerModel, cbc, multinetwork=true; setting = s) + resultDCP = run_mp_tnepopf(data_dc, DCPPowerModel, highs, multinetwork=true; setting = s) @test isapprox(resultDCP["objective"], 8.2; atol = 1e-1) @test isapprox(resultDCP["solution"]["nw"]["1"]["branchdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDCP["solution"]["nw"]["1"]["branchdc_ne"]["2"]["pf"], -2.0013; atol = 1e-2) @@ -252,16 +291,16 @@ s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true, "pr @test isapprox(resultLPAC["solution"]["nw"]["1"]["convdc_ne"]["2"]["pconv"], -2.15833; atol = 1e-2) end if local_test == true - # @testset "ACP" begin #Normally fine, but fails on travis. - # data_dc = build_mn_data("../test/data/tnep/case4_original.m") - # resultACP = run_mp_tnepopf(data_dc, ACPPowerModel, juniper, multinetwork=true; setting = s) - # @test isapprox(resultACP["objective"], 10.2; atol = 1e-1) - # @test isapprox(resultACP["solution"]["nw"]["1"]["branchdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) - # @test isapprox(resultACP["solution"]["nw"]["1"]["branchdc_ne"]["2"]["pf"], -1.07017; atol = 1e-2) - # @test isapprox(resultACP["solution"]["nw"]["2"]["branchdc_ne"]["2"]["pf"], -1.07057; atol = 1e-2) - # @test isapprox(resultACP["solution"]["nw"]["2"]["convdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) - # @test isapprox(resultACP["solution"]["nw"]["1"]["convdc_ne"]["2"]["pconv"], -2.08104; atol = 1e-2) - # end + @testset "ACP" begin + data_dc = build_mn_data("../test/data/tnep/case4_original.m") + resultACP = run_mp_tnepopf(data_dc, ACPPowerModel, juniper, multinetwork=true; setting = s) + @test isapprox(resultACP["objective"], 10.2; atol = 1e-1) + @test isapprox(resultACP["solution"]["nw"]["1"]["branchdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(resultACP["solution"]["nw"]["1"]["branchdc_ne"]["2"]["pf"], -1.07017; atol = 1e-2) + @test isapprox(resultACP["solution"]["nw"]["2"]["branchdc_ne"]["2"]["pf"], -1.07057; atol = 1e-2) + @test isapprox(resultACP["solution"]["nw"]["2"]["convdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) + @test isapprox(resultACP["solution"]["nw"]["1"]["convdc_ne"]["2"]["pconv"], -2.08104; atol = 1e-2) + end @testset "SOCWR" begin data_dc = build_mn_data("../test/data/tnep/case4_original.m") resultSOCWR = run_mp_tnepopf(data_dc, SOCWRPowerModel, gurobi, multinetwork=true; setting = s) @@ -287,7 +326,7 @@ s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true, "pr @testset "acdc tnep" begin @testset "DCP" begin data_acdc = build_mn_data("../test/data/tnep/case4_acdc.m") - resultDCP = run_mp_acdctnepopf(data_acdc, DCPPowerModel, cbc, multinetwork=true; setting = s) + resultDCP = run_mp_tnepopf(data_acdc, DCPPowerModel, highs, multinetwork=true; setting = s) @test isapprox(resultDCP["objective"], 659.90; atol = 1e-1) @test isapprox(resultDCP["solution"]["nw"]["1"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultDCP["solution"]["nw"]["1"]["branchdc_ne"]["3"]["pf"], -1.009; atol = 1e-2) @@ -296,21 +335,21 @@ s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true, "pr @test isapprox(resultDCP["solution"]["nw"]["1"]["convdc_ne"]["1"]["pconv"], -1; atol = 1e-2) @test isapprox(resultDCP["solution"]["nw"]["1"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) end - #@testset "LPAC" begin - # data_acdc = build_mn_data("../test/data/tnep/case4_acdc.m") - # resultLPAC = run_mp_acdctnepopf(data_acdc, LPACCPowerModel, juniper, multinetwork=true; setting = s) - # @test isapprox(resultLPAC["objective"], 614.15; atol = 1e-1) - # @test isapprox(resultLPAC["solution"]["nw"]["1"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) - # @test isapprox(resultLPAC["solution"]["nw"]["1"]["branchdc_ne"]["3"]["pf"], -1.2466; atol = 1e-2) - # @test isapprox(resultLPAC["solution"]["nw"]["2"]["branchdc_ne"]["3"]["pf"], -1.2466; atol = 1e-2) - # @test isapprox(resultLPAC["solution"]["nw"]["2"]["convdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) - # @test isapprox(resultLPAC["solution"]["nw"]["1"]["convdc_ne"]["2"]["pconv"], -1.2355; atol = 1e-2) - # @test isapprox(resultLPAC["solution"]["nw"]["1"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) - #end + # @testset "LPAC" begin + # data_acdc = build_mn_data("../test/data/tnep/case4_acdc.m") + # resultLPAC = run_mp_tnepopf(data_acdc, LPACCPowerModel, juniper, multinetwork=true; setting = s) + # @test isapprox(resultLPAC["objective"], 614.15; atol = 1e-1) + # @test isapprox(resultLPAC["solution"]["nw"]["1"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) + # @test isapprox(resultLPAC["solution"]["nw"]["1"]["branchdc_ne"]["3"]["pf"], -1.2466; atol = 1e-2) + # @test isapprox(resultLPAC["solution"]["nw"]["2"]["branchdc_ne"]["3"]["pf"], -1.2466; atol = 1e-2) + # @test isapprox(resultLPAC["solution"]["nw"]["2"]["convdc_ne"]["2"]["isbuilt"], 1; atol = 1e-2) + # @test isapprox(resultLPAC["solution"]["nw"]["1"]["convdc_ne"]["2"]["pconv"], -1.2355; atol = 1e-2) + # @test isapprox(resultLPAC["solution"]["nw"]["1"]["ne_branch"]["1"]["built"], 1; atol = 1e-2) + # end if local_test == true - @testset "ACP" begin # Normally fine but fails on travis + @testset "ACP" begin data_acdc = build_mn_data("../test/data/tnep/case4_acdc.m") - resultACP = run_mp_acdctnepopf(data_acdc, ACPPowerModel, juniper, multinetwork=true; setting = s) + resultACP = run_mp_tnepopf(data_acdc, ACPPowerModel, juniper, multinetwork=true; setting = s) @test isapprox(resultACP["objective"], 696.043; atol = 1e-1) @test isapprox(resultACP["solution"]["nw"]["1"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultACP["solution"]["nw"]["1"]["branchdc_ne"]["3"]["pf"], -0.631; atol = 1e-2) @@ -321,7 +360,7 @@ s = Dict("output" => Dict("branch_flows" => true), "conv_losses_mp" => true, "pr end @testset "SOCWR" begin data_acdc = build_mn_data("../test/data/tnep/case4_acdc.m") - resultSOCWR = run_mp_acdctnepopf(data_acdc, SOCWRPowerModel, gurobi, multinetwork=true; setting = s) + resultSOCWR = run_mp_tnepopf(data_acdc, SOCWRPowerModel, gurobi, multinetwork=true; setting = s) @test isapprox(resultSOCWR["objective"], 696.04; atol = 1e-1) @test isapprox(resultSOCWR["solution"]["nw"]["2"]["branchdc_ne"]["3"]["isbuilt"], 1; atol = 1e-2) @test isapprox(resultSOCWR["solution"]["nw"]["1"]["branchdc_ne"]["3"]["pf"], -0.631; atol = 1e-2)