def test_pmu_with_trafo3w(): net = pp.create_empty_network() bus_slack = pp.create_bus(net, vn_kv=110) pp.create_ext_grid(net, bus=bus_slack) bus_20_1 = pp.create_bus(net, vn_kv=20, name="b") pp.create_sgen(net, bus=bus_20_1, p_mw=0.03, q_mvar=0.02) bus_10_1 = pp.create_bus(net, vn_kv=10) pp.create_sgen(net, bus=bus_10_1, p_mw=0.02, q_mvar=0.02) bus_10_2 = pp.create_bus(net, vn_kv=10) pp.create_load(net, bus=bus_10_2, p_mw=0.06, q_mvar=0.01) pp.create_line(net, from_bus=bus_10_1, to_bus=bus_10_2, std_type="149-AL1/24-ST1A 10.0", length_km=2) pp.create_transformer3w(net, bus_slack, bus_20_1, bus_10_1, std_type="63/25/38 MVA 110/20/10 kV") pp.runpp(net) add_virtual_pmu_meas_from_loadflow(net, with_random_error=False) estimate(net, algorithm="lp", maximum_iterations=10) pp.runpp(net) assert np.allclose(net.res_bus.vm_pu, net.res_bus_est.vm_pu, atol=1e-2) assert np.allclose(net.res_bus.va_degree, net.res_bus_est.va_degree, atol=1e-1)
def test_pmu_with_trafo3w(): net = pp.create_empty_network() bus_slack = pp.create_bus(net, vn_kv=110) pp.create_ext_grid(net, bus=bus_slack) bus_20_1 = pp.create_bus(net, vn_kv=20, name="b") pp.create_sgen(net, bus=bus_20_1, p_mw=0.03, q_mvar=0.02) bus_10_1 = pp.create_bus(net, vn_kv=10) pp.create_sgen(net, bus=bus_10_1, p_mw=0.02, q_mvar=0.02) bus_10_2 = pp.create_bus(net, vn_kv=10) pp.create_load(net, bus=bus_10_2, p_mw=0.06, q_mvar=0.01) pp.create_line(net, from_bus=bus_10_1, to_bus=bus_10_2, std_type="149-AL1/24-ST1A 10.0", length_km=2) pp.create_transformer3w(net, bus_slack, bus_20_1, bus_10_1, std_type="63/25/38 MVA 110/20/10 kV") pp.runpp(net) add_virtual_pmu_meas_from_loadflow(net, with_random_error=False) run_se_lp_verify(net)
def test_trafo3w_loading(): net = pp.create_empty_network() b1, b2, l1 = add_grid_connection(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=20.) b4 = pp.create_bus(net, vn_kv=10.) tidx = pp.create_transformer3w(net, b2, b3, b4, std_type='63/25/38 MVA 110/20/10 kV', max_loading_percent=120) pp.create_load(net, b3, p_mw=5, controllable=False) load_id = pp.create_load(net, b4, p_mw=5, controllable=True, max_p_mw=50, min_p_mw=0, min_q_mvar=-1e6, max_q_mvar=1e6) pp.create_poly_cost(net, load_id, "load", cp1_eur_per_mw=-1000) # pp.create_xward(net, b4, 1000, 1000, 1000, 1000, 0.1, 0.1, 1.0) net.trafo3w.shift_lv_degree.at[tidx] = 120 net.trafo3w.shift_mv_degree.at[tidx] = 80 # pp.runopp(net, calculate_voltage_angles = True) >> Doesn't converge for init in ["pf", "flat"]: pp.runopp(net, calculate_voltage_angles=False, init=init) assert net["OPF_converged"] assert abs(net.res_trafo3w.loading_percent.values - 120) < 1e-3
def test_get_connected_buses(): net = pp.create_empty_network() bus0 = pp.create_bus(net, vn_kv=110) bus1 = pp.create_bus(net, vn_kv=20) bus2 = pp.create_bus(net, vn_kv=10) bus3 = pp.create_bus(net, vn_kv=0.4) bus4 = pp.create_bus(net, vn_kv=0.4) bus5 = pp.create_bus(net, vn_kv=20) trafo0 = pp.create_transformer3w(net, hv_bus=bus0, mv_bus=bus1, lv_bus=bus2, name='trafo0', std_type='63/25/38 MVA 110/20/10 kV') trafo1 = pp.create_transformer(net, hv_bus=bus2, lv_bus=bus3, std_type='0.4 MVA 10/0.4 kV') line1 = pp.create_line(net, from_bus=bus3, to_bus=bus4, length_km=20.1, std_type='24-AL1/4-ST1A 0.4', name='line1') # switch0=pp.create_switch(net, bus = bus0, element = trafo0, et = 't3') #~~~~~ not implementable switch1 = pp.create_switch(net, bus=bus1, element=bus5, et='b') switch2 = pp.create_switch(net, bus=bus2, element=trafo1, et='t') switch3 = pp.create_switch(net, bus=bus3, element=line1, et='l') assert list(tb.get_connected_buses(net, [bus0])) == [bus1, bus2] # trafo3w has not been implemented in the function assert list(tb.get_connected_buses(net, [bus1])) == [bus0, bus2, bus5] # trafo3w has not been implemented in the function assert list(tb.get_connected_buses(net, [bus2])) == [bus0, bus1, bus3] # trafo3w has not been implemented in the function assert list(tb.get_connected_buses(net, [bus3])) == [bus2, bus4] assert list(tb.get_connected_buses(net, [bus4])) == [bus3] assert list(tb.get_connected_buses(net, [bus5])) == [bus1] assert list(tb.get_connected_buses(net, [bus0, bus1])) == [bus2, bus5] assert list(tb.get_connected_buses(net, [bus2, bus3])) == [bus0, bus1, bus4]
def test_next_bus(): net = pp.create_empty_network() bus0 = pp.create_bus(net, vn_kv=110) bus1 = pp.create_bus(net, vn_kv=20) bus2 = pp.create_bus(net, vn_kv=10) bus3 = pp.create_bus(net, vn_kv=0.4) bus4 = pp.create_bus(net, vn_kv=0.4) bus5 = pp.create_bus(net, vn_kv=20) trafo0 = pp.create_transformer3w(net, hv_bus=bus0, mv_bus=bus1, lv_bus=bus2, name='trafo0', std_type='63/25/38 MVA 110/20/10 kV') trafo1 = pp.create_transformer(net, hv_bus=bus2, lv_bus=bus3, std_type='0.4 MVA 10/0.4 kV') line1 = pp.create_line(net, from_bus=bus3, to_bus=bus4, length_km=20.1, std_type='24-AL1/4-ST1A 0.4', name='line1') # switch0=pp.create_switch(net, bus = bus0, element = trafo0, et = 't3') #~~~~~ not implementable now switch1 = pp.create_switch(net, bus=bus1, element=bus5, et='b') switch2 = pp.create_switch(net, bus=bus2, element=trafo1, et='t') switch3 = pp.create_switch(net, bus=bus3, element=line1, et='l') # assert tb.next_bus(net,bus0,trafo0,et='trafo3w')==bus1 # not implemented in existing toolbox # assert tb.next_bus(net,bus0,trafo0,et='trafo3w',choice_for_trafo3w='lv')==bus2 # not implemented in existing toolbox assert tb.next_bus(net, bus1, switch1, et='switch') == bus5 # Switch with bus2bus connection # assert not tb.next_bus(net,bus2,switch2,et='switch')==bus3 # Switch with bus2trafo connection:- gives trasformer id instead of bus id assert tb.next_bus(net, bus2, trafo1, et='trafo') == bus3 # assert tb.next_bus(net,bus3,switch3,et='switch') ==bus4 # Switch with bus2line connection :- gives line id instead of bus id assert tb.next_bus(net, bus3, line1, et='line') == bus4
def test_drop_elements_at_buses(): net = pp.create_empty_network() bus0 = pp.create_bus(net, vn_kv=110) bus1 = pp.create_bus(net, vn_kv=20) bus2 = pp.create_bus(net, vn_kv=10) bus3 = pp.create_bus(net, vn_kv=0.4) bus4 = pp.create_bus(net, vn_kv=0.4) bus5 = pp.create_bus(net, vn_kv=20) trafo0 = pp.create_transformer3w(net, hv_bus=bus0, mv_bus=bus1, lv_bus=bus2, name='trafo0', std_type='63/25/38 MVA 110/20/10 kV') trafo1 = pp.create_transformer(net, hv_bus=bus2, lv_bus=bus3, std_type='0.4 MVA 10/0.4 kV') line1 = pp.create_line(net, from_bus=bus3, to_bus=bus4, length_km=20.1, std_type='24-AL1/4-ST1A 0.4', name='line1') #switch0=pp.create_switch(net, bus = bus0, element = trafo0, et = 't3') #~~~~~ not implementable now switch1 = pp.create_switch(net, bus=bus1, element=bus5, et='b') switch2 = pp.create_switch(net, bus=bus2, element=trafo1, et='t') switch3 = pp.create_switch(net, bus=bus3, element=line1, et='l') # bus id needs to be entered as iterable, not done in the function tb.drop_elements_at_buses(net, [bus5]) assert len( net.switch ) == 2 # it should be 2 since switch is connected to bus5 but if we add "element" column for switch it would delete this assert len(net.trafo) == 1 assert len(net.trafo3w) == 1 assert len(net.line) == 1 tb.drop_elements_at_buses(net, [bus4]) assert len(net.switch) == 1 assert len(net.line) == 0 assert len(net.trafo) == 1 assert len(net.trafo3w) == 1 tb.drop_elements_at_buses(net, [bus3]) assert len(net.switch) == 0 assert len(net.line) == 0 assert len(net.trafo) == 0 assert len(net.trafo3w) == 1 tb.drop_elements_at_buses(net, [bus2]) assert len(net.switch) == 0 assert len(net.line) == 0 assert len(net.trafo) == 0 assert len(net.trafo3w) == 0 tb.drop_elements_at_buses(net, [bus1]) assert len(net.switch) == 0 assert len(net.line) == 0 assert len(net.trafo) == 0 assert len(net.trafo3w) == 0
def test_trafo3w_loading(): net = pp.create_empty_network() b1, b2, l1 = add_grid_connection(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=20.) b4 = pp.create_bus(net, vn_kv=10.) tidx = pp.create_transformer3w(net, b2, b3, b4, std_type='63/25/38 MVA 110/20/10 kV', max_loading_percent=120) pp.create_load(net, b3, 5e3, controllable=False) id = pp.create_load(net, b4, 5e3, controllable=True, max_p_kw=5e4, min_p_kw=0) pp.create_polynomial_cost(net, id, "load", array([-1, 0])) #pp.create_xward(net, b4, 1000, 1000, 1000, 1000, 0.1, 0.1, 1.0) net.trafo3w.shift_lv_degree.at[tidx] = 120 net.trafo3w.shift_mv_degree.at[tidx] = 80 # pp.runopp(net, calculate_voltage_angles = True) >> Doesn't converge pp.runopp(net, calculate_voltage_angles=False) assert abs(net.res_trafo3w.loading_percent.values - 120) < 1e-3
def test_runpp_init_auxiliary_buses(): net = pp.create_empty_network() b1, b2, l1 = add_grid_connection(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=20.) b4 = pp.create_bus(net, vn_kv=10.) tidx = pp.create_transformer3w(net, b2, b3, b4, std_type='63/25/38 MVA 110/20/10 kV') pp.create_load(net, b3, 5e3) pp.create_load(net, b4, 5e3) pp.create_xward(net, b4, 1000, 1000, 1000, 1000, 0.1, 0.1, 1.0) net.trafo3w.shift_lv_degree.at[tidx] = 120 net.trafo3w.shift_mv_degree.at[tidx] = 80 pp.runpp(net) va = net.res_bus.va_degree.at[b2] pp.runpp(net, calculate_voltage_angles=True, init="dc") assert np.allclose(va - net.trafo3w.shift_mv_degree.at[tidx], net.res_bus.va_degree.at[b3], atol=2) assert np.allclose(va - net.trafo3w.shift_lv_degree.at[tidx], net.res_bus.va_degree.at[b4], atol=2) pp.runpp(net, calculate_voltage_angles=True, init="results") assert np.allclose(va - net.trafo3w.shift_mv_degree.at[tidx], net.res_bus.va_degree.at[b3], atol=2) assert np.allclose(va - net.trafo3w.shift_lv_degree.at[tidx], net.res_bus.va_degree.at[b4], atol=2)
def test_get_connected_buses(): net = pp.create_empty_network() bus0 = pp.create_bus(net, vn_kv=110) bus1 = pp.create_bus(net, vn_kv=20) bus2 = pp.create_bus(net, vn_kv=10) bus3 = pp.create_bus(net, vn_kv=0.4) bus4 = pp.create_bus(net, vn_kv=0.4) bus5 = pp.create_bus(net, vn_kv=20) trafo0 = pp.create_transformer3w(net, hv_bus=bus0, mv_bus=bus1, lv_bus=bus2, std_type='63/25/38 MVA 110/20/10 kV') trafo1 = pp.create_transformer(net, hv_bus=bus2, lv_bus=bus3, std_type='0.4 MVA 10/0.4 kV') line1 = pp.create_line(net, from_bus=bus3, to_bus=bus4, length_km=20.1, std_type='24-AL1/4-ST1A 0.4') switch0a = pp.create_switch(net, bus=bus0, element=trafo0, et='t3') switch0b = pp.create_switch(net, bus=bus2, element=trafo0, et='t3') switch1 = pp.create_switch(net, bus=bus1, element=bus5, et='b') switch2 = pp.create_switch(net, bus=bus2, element=trafo1, et='t') switch3 = pp.create_switch(net, bus=bus3, element=line1, et='l') assert list(tb.get_connected_buses(net, [bus0])) == [bus1, bus2] assert list(tb.get_connected_buses(net, [bus1])) == [bus0, bus2, bus5] assert list(tb.get_connected_buses(net, [bus2])) == [bus0, bus1, bus3] assert list(tb.get_connected_buses(net, [bus3])) == [bus2, bus4] assert list(tb.get_connected_buses(net, [bus4])) == [bus3] assert list(tb.get_connected_buses(net, [bus5])) == [bus1] assert list(tb.get_connected_buses(net, [bus0, bus1])) == [bus2, bus5] assert list(tb.get_connected_buses(net, [bus2, bus3])) == [bus0, bus1, bus4] net.switch.loc[[switch0b, switch1, switch2, switch3], 'closed'] = False assert list(tb.get_connected_buses(net, [bus0])) == [bus1] assert list(tb.get_connected_buses(net, [bus1])) == [bus0] assert list(tb.get_connected_buses(net, [bus3])) == [] assert list(tb.get_connected_buses(net, [bus4])) == []
def test_oos_buses_at_trafo3w(): net = pp.create_empty_network() b1 = pp.create_bus(net, vn_kv=110.) b2 = pp.create_bus(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=110., in_service=False) b4 = pp.create_bus(net, vn_kv=20., in_service=False) b5 = pp.create_bus(net, vn_kv=10., in_service=False) pp.create_ext_grid(net, b1) l1 = pp.create_line(net, b1, b2, 0.5, std_type="NAYY 4x50 SE", in_service=True) l2 = pp.create_line(net, b2, b3, 0.5, std_type="NAYY 4x50 SE", in_service=False) tidx = pp.create_transformer3w(net, b3, b4, b5, std_type='63/25/38 MVA 110/20/10 kV', in_service=True) pp.runpp(net, trafo3w_losses='star', trafo_model='pi', init='flat') assert net.res_line.loading_percent.at[l1] > 0 assert np.isnan(net.res_trafo3w.i_hv_ka.at[tidx])
def test_network_with_trafo3w_pq(): net = pp.create_empty_network() bus_slack = pp.create_bus(net, vn_kv=110) pp.create_ext_grid(net, bus=bus_slack) bus_20_1 = pp.create_bus(net, vn_kv=20,name="b") pp.create_sgen(net, bus=bus_20_1, p_mw=0.03, q_mvar=0.02) bus_10_1 = pp.create_bus(net, vn_kv=10) pp.create_sgen(net, bus=bus_10_1, p_mw=0.02, q_mvar=0.02) bus_10_2 = pp.create_bus(net, vn_kv=10) pp.create_load(net, bus=bus_10_2, p_mw=0.06, q_mvar=0.01) pp.create_line(net, from_bus=bus_10_1, to_bus=bus_10_2, std_type="149-AL1/24-ST1A 10.0", length_km=2) pp.create_transformer3w(net, bus_slack, bus_20_1, bus_10_1, std_type="63/25/38 MVA 110/20/10 kV") pp.runpp(net) pp.create_measurement(net, "p", "line", net.res_line.p_from_mw[0], 0.001, 0, 'from') pp.create_measurement(net, "q", "line", net.res_line.q_from_mvar[0], 0.001, 0, 'from') pp.create_measurement(net, "p", "line", net.res_line.p_to_mw[0], 0.001, 0, 'to') pp.create_measurement(net, "q", "line", net.res_line.q_to_mvar[0], 0.001, 0, 'to') pp.create_measurement(net, "p", "trafo3w", net.res_trafo3w.p_hv_mw[0], 0.001, 0, 'hv') pp.create_measurement(net, "q", "trafo3w", net.res_trafo3w.q_hv_mvar[0], 0.001, 0, 'hv') pp.create_measurement(net, "p", "trafo3w", net.res_trafo3w.p_mv_mw[0], 0.002, 0, 'mv') pp.create_measurement(net, "q", "trafo3w", net.res_trafo3w.q_mv_mvar[0], 0.002, 0, 'mv') pp.create_measurement(net, "p", "trafo3w", net.res_trafo3w.p_lv_mw[0], 0.001, 0, 'lv') pp.create_measurement(net, "q", "trafo3w", net.res_trafo3w.q_lv_mvar[0], 0.001, 0, 'lv') pp.create_measurement(net, "v", "bus", net.res_bus.vm_pu[0], 0.01, 0) pp.create_measurement(net, "v", "bus", net.res_bus.vm_pu[1], 0.01, 1) if not estimate(net): raise AssertionError("Estimation failed!") if not (np.nanmax(np.abs(net.res_bus.vm_pu.values - net.res_bus_est.vm_pu.values)) < 0.006) or\ not (np.nanmax(np.abs(net.res_bus.va_degree.values- net.res_bus_est.va_degree.values)) < 0.006): raise AssertionError("Estimation failed") #Try estimate with results initialization if not estimate(net, init="results"): raise AssertionError("Estimation failed!")
def test_network_with_trafo3w_with_disabled_branch(): net = pp.create_empty_network() bus_slack = pp.create_bus(net, vn_kv=110) pp.create_ext_grid(net, bus=bus_slack) bus_20_1 = pp.create_bus(net, vn_kv=20,name="b") pp.create_sgen(net, bus=bus_20_1, p_mw=0.03, q_mvar=0.02) bus_10_1 = pp.create_bus(net, vn_kv=10) pp.create_sgen(net, bus=bus_10_1, p_mw=0.02, q_mvar=0.02) bus_10_2 = pp.create_bus(net, vn_kv=10) pp.create_load(net, bus=bus_10_2, p_mw=0.06, q_mvar=0.01) pp.create_line(net, from_bus=bus_10_1, to_bus=bus_10_2, std_type="149-AL1/24-ST1A 10.0", length_km=2) disabled_line = pp.create_line(net, from_bus=bus_10_1, to_bus=bus_10_2, std_type="149-AL1/24-ST1A 10.0", length_km=2) net.line.at[disabled_line, 'in_service'] = False pp.create_transformer3w(net, bus_slack, bus_20_1, bus_10_1, std_type="63/25/38 MVA 110/20/10 kV") pp.runpp(net) pp.create_measurement(net, "p", "line", net.res_line.p_from_mw[0], 0.001, 0, 'from') pp.create_measurement(net, "q", "line", net.res_line.q_from_mvar[0], 0.001, 0, 'from') pp.create_measurement(net, "p", "line", net.res_line.p_to_mw[0], 0.001, 0, 'to') pp.create_measurement(net, "q", "line", net.res_line.q_to_mvar[0], 0.001, 0, 'to') pp.create_measurement(net, "p", "line", net.res_line.p_to_mw[1], 0.001, 1, 'to') pp.create_measurement(net, "q", "line", net.res_line.q_to_mvar[1], 0.001, 1, 'to') pp.create_measurement(net, "p", "trafo3w", net.res_trafo3w.p_hv_mw[0], 0.001, 0, 'hv') pp.create_measurement(net, "q", "trafo3w", net.res_trafo3w.q_hv_mvar[0], 0.001, 0, 'hv') pp.create_measurement(net, "p", "trafo3w", net.res_trafo3w.p_mv_mw[0], 0.002, 0, 'mv') pp.create_measurement(net, "q", "trafo3w", net.res_trafo3w.q_mv_mvar[0], 0.002, 0, 'mv') pp.create_measurement(net, "p", "trafo3w", net.res_trafo3w.p_lv_mw[0], 0.001, 0, 'lv') pp.create_measurement(net, "q", "trafo3w", net.res_trafo3w.q_lv_mvar[0], 0.001, 0, 'lv') pp.create_measurement(net, "v", "bus", net.res_bus.vm_pu[0], 0.01, 0) pp.create_measurement(net, "v", "bus", net.res_bus.vm_pu[1], 0.01, 1) success = estimate(net) assert success assert (np.nanmax(np.abs(net.res_bus.vm_pu.values - net.res_bus_est.vm_pu.values)) < 0.006) assert (np.nanmax(np.abs(net.res_bus.va_degree.values- net.res_bus_est.va_degree.values)) < 0.006)
def test_const_pq_out_of_service(simple_test_net): # allows to use recycle = {"bus_pq"} and fast output read net = simple_test_net for i in range(3): b = pp.create_bus(net, 20., in_service=False) pp.create_line(net, 2, b, std_type="149-AL1/24-ST1A 20.0", length_km=1., in_service=False) pp.create_transformer(net, 2, b, std_type="25 MVA 110/20 kV", in_service=False) pp.create_transformer3w(net, 1, 2, b, std_type="63/25/38 MVA 110/20/10 kV", in_service=False) _, ds = create_data_source(n_timesteps) # 1load c = add_const(net, ds, recycle=None) vm_pu, ll = _run_recycle(net) del c # calculate the same results without recycle c = add_const(net, ds, recycle=False) ow = _run_normal(net) in_service = net.bus.loc[net.bus.in_service].index assert np.allclose(vm_pu.loc[:, in_service], ow.output["res_bus.vm_pu"].loc[:, in_service]) in_service = net.line.loc[net.line.in_service].index assert np.allclose(ll.loc[:, in_service], ow.output["res_line.loading_percent"].loc[:, in_service])
def test_drop_inner_branches(): def check_elm_number(net1, net2, excerpt_elms=None): excerpt_elms = set() if excerpt_elms is None else set(excerpt_elms) for elm in set(pp.pp_elements()) - excerpt_elms: assert net1[elm].shape[0] == net2[elm].shape[0] net = nw.example_simple() new_bus = pp.create_bus(net, 10) pp.create_transformer3w(net, 2, 3, new_bus, "63/25/38 MVA 110/20/10 kV") net1 = copy.deepcopy(net) tb.drop_inner_branches(net1, [2, 3], branch_elements=["line"]) check_elm_number(net1, net) tb.drop_inner_branches(net1, [0, 1], branch_elements=["line"]) check_elm_number(net1, net, ["line"]) assert all(net.line.index.difference({0}) == net1.line.index) net2 = copy.deepcopy(net) tb.drop_inner_branches(net2, [2, 3, 4, 5]) assert all(net.line.index.difference({1}) == net2.line.index) assert all(net.trafo.index.difference({0}) == net2.trafo.index) assert all(net.switch.index.difference({1, 2, 3}) == net2.switch.index) check_elm_number(net2, net, ["line", "switch", "trafo"])
def test_drop_elements_at_buses(): net = pp.create_empty_network() bus0 = pp.create_bus(net, vn_kv=110) bus1 = pp.create_bus(net, vn_kv=20) bus2 = pp.create_bus(net, vn_kv=10) bus3 = pp.create_bus(net, vn_kv=0.4) bus4 = pp.create_bus(net, vn_kv=0.4) bus5 = pp.create_bus(net, vn_kv=20) pp.create_ext_grid(net, 0) trafo0 = pp.create_transformer3w(net, hv_bus=bus0, mv_bus=bus1, lv_bus=bus2, name='trafo0', std_type='63/25/38 MVA 110/20/10 kV') trafo1 = pp.create_transformer(net, hv_bus=bus2, lv_bus=bus3, std_type='0.4 MVA 10/0.4 kV') line1 = pp.create_line(net, from_bus=bus3, to_bus=bus4, length_km=20.1, std_type='24-AL1/4-ST1A 0.4', name='line1') pp.create_sgen(net, 1, 0) switch0a = pp.create_switch(net, bus=bus0, element=trafo0, et='t3') switch0b = pp.create_switch(net, bus=bus1, element=trafo0, et='t3') switch0c = pp.create_switch(net, bus=bus2, element=trafo0, et='t3') switch1 = pp.create_switch(net, bus=bus1, element=bus5, et='b') switch2a = pp.create_switch(net, bus=bus2, element=trafo1, et='t') switch2b = pp.create_switch(net, bus=bus3, element=trafo1, et='t') switch3a = pp.create_switch(net, bus=bus3, element=line1, et='l') switch3b = pp.create_switch(net, bus=bus4, element=line1, et='l') # bus id needs to be entered as iterable, not done in the function for b in net.bus.index.values: net1 = net.deepcopy() cd = tb.get_connected_elements_dict(net1, b, connected_buses=False) swt3w = set(net1.switch.loc[net1.switch.element.isin(cd.get('trafo3w', [1000])) & (net1.switch.et=='t3')].index) swt = set(net1.switch.loc[net1.switch.element.isin(cd.get('trafo', [1000])) & (net1.switch.et=='t')].index) swl = set(net1.switch.loc[net1.switch.element.isin(cd.get('line', [1000])) & (net1.switch.et=='l')].index) sw = swt3w | swt | swl tb.drop_elements_at_buses(net1, [b]) assert b not in net1.switch.bus.values assert b not in net1.switch.query("et=='b'").element.values assert sw.isdisjoint(set(net1.switch.index)) for elm, id in cd.items(): assert len(net1[elm].loc[net1[elm].index.isin(id)]) == 0
def test_voltage_angles(): net = pp.create_empty_network() b1, b2, l1 = add_grid_connection(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=20.) b4 = pp.create_bus(net, vn_kv=10.) b5 = pp.create_bus(net, vn_kv=10., in_service=False) tidx = pp.create_transformer3w(net, b2, b3, b4, std_type='63/25/38 MVA 110/20/10 kV', max_loading_percent=120) pp.create_load(net, b3, p_mw=5, controllable=False) load_id = pp.create_load(net, b4, p_mw=5, controllable=True, max_p_mw=50, min_p_mw=0, min_q_mvar=-1e6, max_q_mvar=1e6) pp.create_poly_cost(net, load_id, "load", cp1_eur_per_mw=-1000) net.trafo3w.shift_lv_degree.at[tidx] = 120 net.trafo3w.shift_mv_degree.at[tidx] = 80 custom_file = os.path.join( os.path.abspath(os.path.dirname(pp.test.__file__)), "test_files", "run_powermodels_custom.jl") # TODO: pp.runpm_dc gives does not seem to consider the voltage angles. Is this intended behaviour? for run in [pp.runpm_ac_opf, partial(pp.runpm, julia_file=custom_file)]: run(net) consistency_checks(net) print(net.res_bus.va_degree.at[b1] - net.res_bus.va_degree.at[b3]) print(net.res_bus.va_degree.at[b1]) print(net.res_bus.va_degree.at[b3]) assert 119.9 < net.res_trafo3w.loading_percent.at[tidx] <= 120 assert 85 < (net.res_bus.va_degree.at[b1] - net.res_bus.va_degree.at[b3]) % 360 < 86 assert 120 < (net.res_bus.va_degree.at[b1] - net.res_bus.va_degree.at[b4]) % 360 < 130 assert np.isnan(net.res_bus.va_degree.at[b5])
def test_voltage_angles(): net = pp.create_empty_network() b1, b2, l1 = add_grid_connection(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=20.) b4 = pp.create_bus(net, vn_kv=10.) b5 = pp.create_bus(net, vn_kv=10., in_service=False) tidx = pp.create_transformer3w( net, b2, b3, b4, std_type='63/25/38 MVA 110/20/10 kV', max_loading_percent=120) pp.create_load(net, b3, p_mw=5, controllable=False) load_id = pp.create_load(net, b4, p_mw=5, controllable=True, max_p_mw=25, min_p_mw=0, min_q_mvar=-1e-6, max_q_mvar=1e-6) pp.create_poly_cost(net, 0, "ext_grid", cp1_eur_per_mw=1) pp.create_poly_cost(net, load_id, "load", cp1_eur_per_mw=1000) net.trafo3w.shift_lv_degree.at[tidx] = 10 net.trafo3w.shift_mv_degree.at[tidx] = 30 net.bus.loc[:, "max_vm_pu"] = 1.1 net.bus.loc[:, "min_vm_pu"] = .9 custom_file = os.path.join(os.path.abspath(os.path.dirname(pp.test.__file__)), "test_files", "run_powermodels_custom.jl") # load is zero since costs are high. PF results should be the same as OPF net.load.loc[1, "p_mw"] = 0. pp.runpp(net, calculate_voltage_angles=True) va_degree = net.res_bus.loc[:, "va_degree"].values vm_pu = net.res_bus.loc[:, "vm_pu"].values loading3w = net.res_trafo3w.loc[:, "loading_percent"].values for run in [pp.runpm_ac_opf, partial(pp.runpm, julia_file=custom_file)]: run(net, calculate_voltage_angles=True) consistency_checks(net) assert 30. < (net.res_bus.va_degree.at[b1] - net.res_bus.va_degree.at[b3]) % 360 < 32. assert 10. < (net.res_bus.va_degree.at[b1] - net.res_bus.va_degree.at[b4]) % 360 < 11. assert np.isnan(net.res_bus.va_degree.at[b5]) assert np.allclose(net.res_bus.va_degree.values, va_degree, atol=1e-6, rtol=1e-6, equal_nan=True) assert np.allclose(net.res_bus.vm_pu.values, vm_pu, atol=1e-6, rtol=1e-6, equal_nan=True) assert np.allclose(net.res_trafo3w.loading_percent, loading3w, atol=1e-2, rtol=1e-2, equal_nan=True)
def test_voltage_angles(): net = pp.create_empty_network() b1, b2, l1 = add_grid_connection(net, vn_kv=110.) b3 = pp.create_bus(net, vn_kv=20.) b4 = pp.create_bus(net, vn_kv=10.) b5 = pp.create_bus(net, vn_kv=10., in_service=False) tidx = pp.create_transformer3w( net, b2, b3, b4, std_type='63/25/38 MVA 110/20/10 kV', max_loading_percent=120) pp.create_load(net, b3, p_mw=5, controllable=False) load_id = pp.create_load(net, b4, p_mw=5, controllable=True, max_p_mw=25, min_p_mw=0, min_q_mvar=-1e-6, max_q_mvar=1e-6) pp.create_poly_cost(net, 0, "ext_grid", cp1_eur_per_mw=1) pp.create_poly_cost(net, load_id, "load", cp1_eur_per_mw=1000) net.trafo3w.shift_lv_degree.at[tidx] = 10 net.trafo3w.shift_mv_degree.at[tidx] = 30 net.bus.loc[:, "max_vm_pu"] = 1.1 net.bus.loc[:, "min_vm_pu"] = .9 # load is zero since costs are high. PF results should be the same as OPF net.load.loc[1, "p_mw"] = 0. pp.runpp(net, calculate_voltage_angles=True) va_degree = net.res_bus.loc[:, "va_degree"].values vm_pu = net.res_bus.loc[:, "vm_pu"].values loading3w = net.res_trafo3w.loc[:, "loading_percent"].values net_opf = copy.deepcopy(net) pp.runpm_ac_opf(net_opf) assert 30. < (net_opf.res_bus.va_degree.at[b1] - net_opf.res_bus.va_degree.at[b3]) % 360 < 32. assert 10. < (net_opf.res_bus.va_degree.at[b1] - net_opf.res_bus.va_degree.at[b4]) % 360 < 11. assert np.isnan(net_opf.res_bus.va_degree.at[b5]) assert np.allclose(net_opf.res_bus.va_degree.values, va_degree, atol=1e-6, rtol=1e-6, equal_nan=True) assert np.allclose(net_opf.res_bus.vm_pu.values, vm_pu, atol=1e-6, rtol=1e-6, equal_nan=True) assert np.allclose(net_opf.res_trafo3w.loading_percent, loading3w, atol=1e-2, rtol=1e-2, equal_nan=True)