def test_add_element_and_init_results(): net = simple_four_bus_system() pp.runpp(net, init="flat") pp.create_bus(net, vn_kv=20.) pp.create_line(net, from_bus=2, to_bus=3, length_km=1, name="new line" + str(1), std_type="NAYY 4x150 SE") pp.runpp(net, init="results")
def test_ow_index(): net = simple_four_bus_system() steps = [3, 5, 7] p_data = pd.DataFrame(index=steps, columns=["0", "1"], data=[ [0.01, 0.02], [0.03, 0.04], [0.05, 0.06], ]) v_data = pd.DataFrame(index=steps, columns=["0"], data=[1.01, 1.03, 1.02]) ds_p = DFData(p_data) ds_v = DFData(v_data) ct.ConstControl(net, element='load', variable='p_mw', element_index=net.load.index.tolist(), data_source=ds_p, profile_name=p_data.columns) ct.ConstControl(net, element='ext_grid', variable='vm_pu', element_index=0, data_source=ds_v, profile_name='0') ow = OutputWriter(net) ow.log_variable('res_bus', 'vm_pu') ow.log_variable('res_line', 'loading_percent') run_timeseries(net, time_steps=p_data.index, verbose=False) assert np.all(ow.output["res_line.loading_percent"].index == p_data.index)
def test_pm_dc_powerflow_tap(): net = nw.simple_four_bus_system() net.trafo.loc[0, "shift_degree"] = 0. assert_pf(net, dc=True) net.trafo.loc[0, "shift_degree"] = 30. net.trafo.loc[0, "tap_pos"] = -2. assert_pf(net, dc=True)
def test_discrete_tap_control_lv(): # --- load system and run power flow net = nw.simple_four_bus_system() pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- initial tap data net.trafo.tap_side = 'lv' net.trafo.tap_neutral = 0 net.trafo.tap_min = -2 net.trafo.tap_max = 2 net.trafo.tap_step_percent = 1.25 net.trafo.tap_pos = 0 # --- run loadflow pp.runpp(net) DiscreteTapControl(net, tid=0, side='lv', vm_lower_pu=0.95, vm_upper_pu=0.99) logger.info("case1: low voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == -1 # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 1.03 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == -2 # reduce voltage from 1.03 pu to 0.949 pu net.ext_grid.vm_pu = 0.949 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == 1
def test_create_generic_coordinates_igraph_custom_table_index(): net = nw.simple_four_bus_system() for buses in [[0, 1], [0, 2], [0, 1, 2]]: create_generic_coordinates(net, buses=buses, geodata_table="test", overwrite=True) assert np.all(net.test.index == buses)
def test_write_to_object_attribute(): net = nw.simple_four_bus_system() ds = pp.timeseries.DFData(pd.DataFrame(data=[1.01, 1.02, 1.03])) c1 = pp.control.ContinuousTapControl(net, 0, 1.) c2 = pp.control.ConstControl(net, 'controller', 'object.vm_set_pu', element_index=0, profile_name=0, data_source=ds) for t in range(2): c2.time_step(net, t) c2.control_step(net) assert net.controller.object.at[0].vm_set_pu == ds.df.at[t, 0]
def test_simple_four_bus_system(): net = pn.simple_four_bus_system() assert len(net.bus) == 4 assert len(net.ext_grid) == 1 assert len(net.trafo) == 1 assert len(net.line) == 2 assert len(net.sgen) == 2 assert len(net.load) == 2 pp.runpp(net) assert net.converged
def test_timeseries_powermodels(): profiles = pd.DataFrame() n_timesteps = 3 profiles['load1'] = np.random.random(n_timesteps) * 2e1 ds = pp.timeseries.DFData(profiles) net = nw.simple_four_bus_system() time_steps = range(3) pp.control.ConstControl(net, 'load', 'p_mw', element_index=0, data_source=ds, profile_name='load1', scale_factor=0.85) net.load['controllable'] = False pp.timeseries.run_timeseries(net, time_steps, continue_on_divergence=True, verbose=False, recycle=False, run=pp.runpm_dc_opf)
def test_json_different_nets(): net = networks.mv_oberrhein() net2 = networks.simple_four_bus_system() control.ContinuousTapControl(net, 114, 1.02) net.tuple = (1, "4") net.mg = topology.create_nxgraph(net) json_string = json.dumps([net, net2], cls=PPJSONEncoder) [net_out, net2_out] = json.loads(json_string, cls=PPJSONDecoder) assert_net_equal(net_out, net) assert_net_equal(net2_out, net2) pp.runpp(net_out, run_control=True) pp.runpp(net, run_control=True) assert_net_equal(net, net_out)
def test_write(): net = nw.simple_four_bus_system() ds = pp.timeseries.DFData(pd.DataFrame(data=[[0., 1., 2.], [2., 3., 4.]])) c1 = pp.control.ConstControl(net, 'sgen', 'p_mw', element_index=[0, 1], profile_name=[0, 1], data_source=ds) pp.create_sgen(net, 0, 0) c2 = pp.control.ConstControl(net, 'sgen', 'p_mw', element_index=[2], profile_name=[2], data_source=ds, scale_factor=0.5) for t in range(2): c1.time_step(net, t) c1.control_step(net) c2.time_step(net, t) c2.control_step(net) assert np.all(net.sgen.p_mw.values == ds.df.loc[t].values * np.array([1, 1, 0.5]))
def test_repl_to_line(): net = nw.simple_four_bus_system() idx = 0 std_type = "NAYY 4x150 SE" new_idx = tb.repl_to_line(net, idx, std_type, in_service=True) pp.runpp(net) vm1 = net.res_bus.vm_pu.values va1 = net.res_bus.va_degree.values net.line.at[new_idx, "in_service"] = False pp.change_std_type(net, idx, std_type) pp.runpp(net) vm0 = net.res_bus.vm_pu.values va0 = net.res_bus.va_degree.values assert np.allclose(vm1, vm0) assert np.allclose(va1, va0)
def test_write(): net = nw.simple_four_bus_system() ds = pp.timeseries.DFData(pd.DataFrame(data=[[0., 1., 2.], [2., 3., 4.]])) c1 = pp.control.ConstControl(net, 'sgen', 'p_mw', element_index=[0, 1], profile_name=[0, 1], data_source=ds) pp.create_sgen(net, 0, 0) c2 = pp.control.ConstControl(net, 'sgen', 'p_mw', element_index=[2], profile_name=[2], data_source=ds) c1.time_step(0) c1.control_step() c2.time_step(0) c2.control_step()
def test_continuous_tap_control_hv(): # --- load system and run power flow net = nw.simple_four_bus_system() # --- initial tap data net.trafo.tap_side = 'hv' net.trafo.tap_neutral = 0 net.trafo.tap_min = -2 net.trafo.tap_max = 2 net.trafo.tap_step_percent = 1.25 net.trafo.tap_pos = 0 # --- run loadflow pp.runpp(net) tid = 0 ContinuousTapControl(net, tid=tid, vm_set_pu=0.99, side='lv') # td = control.DiscreteTapControl(net, tid=0, side='lv', vm_lower_pu=0.95, vm_upper_pu=0.99) logger.info("case1: low voltage") logger.info( "before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) pp.runpp(net) logger.info( "after ContinuousTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) assert np.isclose(net.res_trafo.vm_lv_pu.at[tid], 0.99, atol=1e-3) assert np.isclose(net.trafo.tap_pos.values, 0.528643) # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 1.03 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info( "before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) pp.runpp(net) logger.info( "after ContinuousTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) assert np.isclose(net.trafo.tap_pos.values, 2) # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 0.98 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info( "before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) pp.runpp(net) logger.info( "after ContinuousTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_trafo.vm_lv_pu.at[tid], net.trafo.tap_pos.values)) assert np.isclose(net.res_trafo.vm_lv_pu.at[tid], 0.99, atol=1e-3) assert np.isclose(net.trafo.tap_pos.values, -1.07765621)
def test_discrete_tap_control_hv_from_tap_step_percent(): # --- load system and run power flow net = nw.simple_four_bus_system() pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- initial tap data net.trafo.tap_side = 'hv' net.trafo.tap_neutral = 0 net.trafo.tap_min = -2 net.trafo.tap_max = 2 net.trafo.tap_step_percent = 1.25 net.trafo.tap_pos = 0 # --- run loadflow pp.runpp(net) DiscreteTapControl.from_tap_step_percent(net, tid=0, side='lv', vm_set_pu=0.98) logger.info("case1: low voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == 1 # check if it changes the lower and upper limits net.controller.object.at[0].vm_set_pu = 1 pp.runpp(net, run_control=True) assert abs(net.controller.object.at[0].vm_upper_pu - 1.00725) < 1e-6 assert abs(net.controller.object.at[0].vm_lower_pu - 0.99275) < 1e-6 net.controller.object.at[0].vm_set_pu = 0.98 pp.runpp(net, run_control=True) assert abs(net.controller.object.at[0].vm_upper_pu - 0.98725) < 1e-6 assert abs(net.controller.object.at[0].vm_lower_pu - 0.97275) < 1e-6 # increase voltage from 1.0 pu to 1.03 pu net.ext_grid.vm_pu = 1.03 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == 2 # reduce voltage from 1.03 pu to 0.969 pu net.ext_grid.vm_pu = 0.969 # switch back tap position net.trafo.tap_pos.at[0] = 0 pp.runpp(net) logger.info("case2: high voltage") logger.info("before control: trafo voltage at low voltage bus is %f, tap position is %u" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) # run control pp.runpp(net, run_control=True) logger.info( "after DiscreteTapControl: trafo voltage at low voltage bus is %f, tap position is %f" % (net.res_bus.vm_pu[net.trafo.lv_bus].values, net.trafo.tap_pos.values)) assert net.trafo.tap_pos.at[0] == -1
def four_bus_net(): net = simple_four_bus_system() net.sgen.drop(index=1, inplace=True) net.load.drop(index=1, inplace=True) return net
import pandapower.networks as nw import pandapower as pp net = nw.simple_four_bus_system() pp.runpp(net) print(net.res_bus) print(net)
def test_pm_ac_powerflow_simple(): net = nw.simple_four_bus_system() net.trafo.loc[0, "shift_degree"] = 0. assert_pf(net)
def test_pm_dc_powerflow_shunt(): net = nw.simple_four_bus_system() pp.create_shunt(net, 2, q_mvar=-0.5) net.trafo.loc[0, "shift_degree"] = 0. assert_pf(net, dc=True)