diff --git a/test/constraints/constraint_node.jl b/test/constraints/constraint_node.jl index a6aabe3bc5..c223dbb4d4 100644 --- a/test/constraints/constraint_node.jl +++ b/test/constraints/constraint_node.jl @@ -138,8 +138,8 @@ function test_constraint_nodal_balance() end end -function test_constraint_nodal_balance_reactive() - @testset "constraint_nodal_balance_reactive" begin +function test_constraint_node_voltage() + @testset "constraint_node_voltage" begin nl_solver_options = Map(["solver", "options"], ["SCS.jl", Map(["verbose"],[0])] ) @@ -170,8 +170,8 @@ function test_constraint_nodal_balance_reactive() ["unit__to_node", ["unit_ab", "node_b"], "vom_cost_reactive", 2.0], ["connection__node__node", ["connection_bc", "node_b", "node_c"], "connection_has_ac_flow", true] - ] + SpineInterface.import_data( url_in; relationships=relationships, @@ -181,12 +181,6 @@ function test_constraint_nodal_balance_reactive() m = run_spineopt(url_in; log_level=0, optimize=true) - #factory = () -> Base.invokelatest(SCS.Optimizer) - #nl_solver = optimizer_with_attributes(factory, "verbose"=>0, "eps_abs"=>1e-6) - #nl_solver = optimizer_with_attributes(SCS.Optimizer, "verbose"=>0, "eps_abs"=>1e-6) - #set_optimizer(m,optimizer_with_attributes(Juniper.Optimizer, "nl_solver"=>nl_solver, "atol"=>1e-4)) - #optimize!(m) - time_slices = time_slice(m; temporal_block=temporal_block(:hourly)) # aliases for the model OPF variables @@ -194,7 +188,64 @@ function test_constraint_nodal_balance_reactive() vsin = m.ext[:spineopt].variables[:node_voltageproduct_sine] vcos = m.ext[:spineopt].variables[:node_voltageproduct_cosine] connflow = m.ext[:spineopt].variables[:connection_flow] + + @test value( vsq[node(:node_c), stochastic_scenario(:parent), time_slices[1]] ) ≈ 0.9165 atol=0.001 + + end +end + +function test_constraint_unit_flow_reactive() + @testset "constraint_unit_flow_reactive" begin + + nl_solver_options = Map(["solver", "options"], ["SCS.jl", Map(["verbose"],[0])] ) + + #solver_options = unparse_db_value(Map(["Juniper.jl"], [Map(["nl_solver"], ["solver:SCS.jl"])])) + solver_options = unparse_db_value(Map(["Juniper.jl"], [Map(["nl_solver"], [nl_solver_options])])) + + url_in = _test_constraint_node_setup() + object_parameter_values = [ + ["model", "instance", "db_mip_solver", "Juniper.jl"], + ["model", "instance", "db_lp_solver", "Juniper.jl"], + ["model", "instance", "db_mip_solver_options", solver_options], + ["model", "instance", "db_lp_solver_options", solver_options], + ["node", "node_b", "has_voltage", true], + ["node", "node_b", "demand_reactive", 0.0], + ["node", "node_b", "min_voltage", 0.7], + ["node", "node_c", "has_voltage", true], + ["node", "node_c", "min_voltage", 0.7], + ["node", "node_c", "demand", 0.0], + ["node", "node_c", "demand_reactive", 0.2], + ["connection","connection_bc","connection_resistance",0.2], + ["connection","connection_bc","connection_reactance",0.2], + ["connection","connection_bc","connection_current_max",1.0] + + ] + relationships = [["connection__node__node", [ "connection_bc", "node_b", "node_c"]]] + relationship_parameter_values = [ + ["unit__to_node", ["unit_ab", "node_b"], "vom_cost", 10.0], + ["unit__to_node", ["unit_ab", "node_b"], "vom_cost_reactive", 2.0], + ["connection__node__node", + ["connection_bc", "node_b", "node_c"], "connection_has_ac_flow", true] + ] + + SpineInterface.import_data( + url_in; + relationships=relationships, + object_parameter_values=object_parameter_values, + relationship_parameter_values=relationship_parameter_values, + ) + + m = run_spineopt(url_in; log_level=0, optimize=true) + + time_slices = time_slice(m; temporal_block=temporal_block(:hourly)) + # aliases for the model OPF variables + vsq = m.ext[:spineopt].variables[:node_voltage_squared] + vsin = m.ext[:spineopt].variables[:node_voltageproduct_sine] + vcos = m.ext[:spineopt].variables[:node_voltageproduct_cosine] + connflow = m.ext[:spineopt].variables[:connection_flow] + var_unit_flow_reactive = m.ext[:spineopt].variables[:unit_flow_reactive] + println("voltage") println(value( vsq[node(:node_b), stochastic_scenario(:parent), time_slices[1]] ) ) println(value( vsq[node(:node_c), stochastic_scenario(:parent), time_slices[1]] ) ) @@ -213,31 +264,14 @@ function test_constraint_nodal_balance_reactive() direction(:to_node), stochastic_scenario(:parent), time_slices[1]] ) ) - println("conductance") - println(SpineOpt.connection_conductance(connection = connection(:connection_bc))) - println(SpineOpt.connection_conductance(connection = connection(:connection_ca))) - println("susceptance") - println(SpineOpt.connection_susceptance(connection = connection(:connection_bc))) - println(SpineOpt.connection_susceptance(connection = connection(:connection_ca))) - @test value( vsq[node(:node_c), stochastic_scenario(:parent), time_slices[1]] ) ≈ 0.9165 atol=0.001 + @test value( var_unit_flow_reactive[unit(:unit_ab), node(:node_b), + direction(:to_node), stochastic_scenario(:parent), time_slices[1]] ) ≈ 0.2087 atol=0.0001 - #= - var_unit_flow_reactive = m.ext[:spineopt].variables[:unit_flow_reactive] - var_conn_flow_reactive = m.ext[:spineopt].variables[:connection_flow_reactive] - - - - #println(value(var_unit_flow_reactive[unit(:unit_ab), node(:node_b), - # direction(:to_node), stochastic_scenario(:parent), time_slices[1]]) - # ) - @test value(var_unit_flow_reactive[unit(:unit_ab), node(:node_b), - direction(:to_node), stochastic_scenario(:parent), time_slices[1]]) == 0.1 - =# + end end - function test_constraint_nodal_balance_group() @testset "constraint_nodal_balance_group" begin url_in = _test_constraint_node_setup() @@ -1035,7 +1069,8 @@ end @testset "node-based constraints" begin #test_constraint_nodal_balance() - test_constraint_nodal_balance_reactive() + test_constraint_node_voltage() + test_constraint_unit_flow_reactive() #=test_constraint_nodal_balance_group() test_constraint_node_injection() test_constraint_node_state_capacity() @@ -1053,4 +1088,4 @@ end test_constraint_storages_invested_transition_mp() test_constraint_storage_lifetime() test_constraint_storage_lifetime_mp()=# -end \ No newline at end of file +end