def test_results_for_line_temperature(): net = pp.create_empty_network() pp.create_bus(net, 0.4) pp.create_buses(net, 2, 0.4) pp.create_ext_grid(net, 0) pp.create_load(net, 1, 5e-3, 10e-3) pp.create_load(net, 2, 5e-3, 10e-3) pp.create_line_from_parameters(net, 0, 1, 0.5, 0.642, 0.083, 210, 1, alpha=0.00403) pp.create_line_from_parameters(net, 1, 2, 0.5, 0.642, 0.083, 210, 1, alpha=0.00403) vm_res_20 = [1, 0.9727288676, 0.95937328755] va_res_20 = [0, 2.2103403814, 3.3622612327] vm_res_80 = [1, 0.96677572771, 0.95062498477] va_res_80 = [0, 2.7993156134, 4.2714451629] pp.runpp(net) assert np.allclose(net.res_bus.vm_pu, vm_res_20, rtol=0, atol=1e-6) assert np.allclose(net.res_bus.va_degree, va_res_20, rtol=0, atol=1e-6) net.line["temperature_degree_celsius"] = 80 pp.set_user_pf_options(net, consider_line_temperature=True) pp.runpp(net) assert np.allclose(net.res_bus.vm_pu, vm_res_80, rtol=0, atol=1e-6) assert np.allclose(net.res_bus.va_degree, va_res_80, rtol=0, atol=1e-6)
def test_impedance_line_replacement(): # create test net net1 = pp.create_empty_network(sn_kva=1.1e3) pp.create_buses(net1, 2, 10) pp.create_ext_grid(net1, 0) pp.create_impedance(net1, 0, 1, 0.1, 0.1, 8.7) pp.create_load(net1, 1, 7, 2) # validate loadflow results pp.runpp(net1) net2 = copy.deepcopy(net1) pp.replace_impedance_by_line(net2) pp.runpp(net2) assert pp.nets_equal(net1, net2, exclude_elms={"line", "impedance"}) # Todo: exclude_elms cols = [ "p_from_kw", "q_from_kvar", "p_to_kw", "q_to_kvar", "pl_kw", "ql_kvar", "i_from_ka", "i_to_ka" ] assert np.allclose(net1.res_impedance[cols].values, net2.res_line[cols].values) net3 = copy.deepcopy(net2) pp.replace_line_by_impedance(net3) pp.runpp(net3) assert pp.nets_equal(net2, net3, exclude_elms={"line", "impedance"}) assert np.allclose(net3.res_impedance[cols].values, net2.res_line[cols].values)
def _net_for_testing(): net = pp.create_empty_network() pp.create_buses(net, 17, 10, name=["Bus %i" % i for i in range(17)]) pp.create_buses(net, 2, 0.4, name=["Bus %i" % i for i in range(17, 19)]) pp.create_switch(net, 0, 1, "b", closed=True) pp.create_switch(net, 2, 3, "b", closed=False) pp.create_switch(net, 4, 5, "b", closed=False) pp.create_switch(net, 5, 6, "b", closed=True) pp.create_line(net, 7, 8, 1, 'NAYY 4x50 SE', name="Line 0") pp.create_switch(net, 7, 0, "l", closed=True) pp.create_switch(net, 8, 0, "l", closed=True) pp.create_line(net, 9, 10, 1, 'NAYY 4x50 SE', name="Line 1") pp.create_switch(net, 9, 1, "l", closed=False) pp.create_switch(net, 10, 1, "l", closed=True) pp.create_line(net, 11, 12, 1, 'NAYY 4x50 SE', name="Line 2") pp.create_switch(net, 11, 2, "l", closed=True) pp.create_switch(net, 12, 2, "l", closed=False) pp.create_line(net, 13, 14, 1, 'NAYY 4x50 SE', name="Line 3") pp.create_switch(net, 13, 3, "l", closed=False) pp.create_switch(net, 14, 3, "l", closed=False) pp.create_transformer(net, 15, 17, std_type="0.4 MVA 10/0.4 kV", name="Trafo 0") pp.create_switch(net, 15, 0, "t", closed=True) pp.create_switch(net, 17, 0, "t", closed=False) pp.create_transformer(net, 16, 18, std_type="0.4 MVA 10/0.4 kV", name="Trafo 1") pp.create_switch(net, 16, 1, "t", closed=False) pp.create_switch(net, 18, 1, "t", closed=True) return net
def small_example_grid(): net = pp.create_empty_network() pp.create_buses(net, 3, 20) pp.create_gen(net, 0, p_mw=100, vm_pu=1, slack=True, slack_weight=1) # pp.create_ext_grid(net, 0) pp.create_load(net, 1, p_mw=100, q_mvar=100) pp.create_line_from_parameters(net, 0, 1, length_km=3, r_ohm_per_km=0.01, x_ohm_per_km=0.1, c_nf_per_km=0, max_i_ka=1) pp.create_line_from_parameters(net, 1, 2, length_km=2, r_ohm_per_km=0.01, x_ohm_per_km=0.1, c_nf_per_km=0, max_i_ka=1) pp.create_line_from_parameters(net, 2, 0, length_km=1, r_ohm_per_km=0.01, x_ohm_per_km=0.1, c_nf_per_km=0, max_i_ka=1) return net
def test_wye_delta(): from pandapower.pypower.idx_brch import BR_R, BR_X, BR_B net = pp.create_empty_network() pp.create_bus(net, vn_kv=110) pp.create_buses(net, nr_buses=4, vn_kv=20) trafo = pp.create_transformer(net, hv_bus=0, lv_bus=1, std_type='25 MVA 110/20 kV') pp.create_line(net, 1, 2, length_km=2.0, std_type="NAYY 4x50 SE") pp.create_line(net, 2, 3, length_km=6.0, std_type="NAYY 4x50 SE") pp.create_line(net, 3, 4, length_km=10.0, std_type="NAYY 4x50 SE") pp.create_ext_grid(net, 0) pp.create_load(net, 4, p_mw=0.1) pp.create_sgen(net, 2, p_mw=4.) pp.create_sgen(net, 3, p_mw=4.) pp.runpp(net, trafo_model="pi") f, t = net._pd2ppc_lookups["branch"]["trafo"] assert np.isclose(net.res_trafo.p_hv_mw.at[trafo], -7.560996, rtol=1e-7) assert np.allclose(net._ppc["branch"][f:t, [BR_R, BR_X, BR_B]].flatten(), np.array([0.0001640 + 0.j, 0.0047972 + 0.j, -0.0105000 - 0.014j]), rtol=1e-7) pp.runpp(net, trafo_model="t") assert np.allclose(net._ppc["branch"][f:t, [BR_R, BR_X, BR_B]].flatten(), np.array([0.00016392 + 0.j, 0.00479726 + 0.j, -0.01050009 - 0.01399964j])) assert np.isclose(net.res_trafo.p_hv_mw.at[trafo], -7.561001, rtol=1e-7)
def mixed_network(): net = pp.create_empty_network() pp.create_buses(net, nr_buses=5, vn_kv=20.) connections = [(0, 1), (1, 2), (2, 3), (2, 4)] for fb, tb in connections: pp.create_line(net, fb, tb, length_km=1, std_type="NA2XS2Y 1x185 RM/25 12/20 kV") for b in [1, 4, 3]: pp.create_ext_grid(net, b) return net
def test_convert_parallel_branches(): # create test grid net = pp.create_empty_network() pp.create_bus(net, 110) pp.create_buses(net, 4, 20) pp.create_ext_grid(net, 0) pp.create_load(net, 4, 1e3, 4e2) pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="sd", parallel=3) pp.create_switch(net, 1, 0, "t", name="dfjk") pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="sdh", parallel=2) pp.create_switch(net, 2, 0, "l", name="dfsdf") pp.create_line(net, 2, 3, 1.11, "94-AL1/15-ST1A 20.0", name="swed", parallel=1) pp.create_line(net, 3, 4, 1.11, "94-AL1/15-ST1A 20.0", name="sdhj", parallel=3) pp.create_switch(net, 3, 2, "l", name="dfdfg") pp.create_switch(net, 4, 2, "l", False, name="dfhgj") # check test grid assert net.trafo.shape[0] == 1 assert net.line.shape[0] == 3 assert net.switch.shape[0] == 4 convert_parallel_branches(net) # test parallelisation assert net.trafo.shape[0] == 3 assert net.line.shape[0] == 6 assert net.switch.shape[0] == 11 net1 = deepcopy(net) net1.switch.closed.loc[4] = False convert_parallel_branches(net, multiple_entries=False) convert_parallel_branches(net1, multiple_entries=False) # test sum up of parallels assert net.trafo.shape[0] == 1 assert net.line.shape[0] == 3 assert net.switch.shape[0] == 4 assert net1.trafo.shape[0] == 1 assert net1.line.shape[0] == 4 assert net1.switch.shape[0] == 5
def test_avoid_duplicates_in_column(): net = pp.create_empty_network() pp.create_buses(net, 3, 10, name="test") expected = net.bus.name.values + [ " (%i)" % i for i in range(net.bus.shape[0]) ] sb.avoid_duplicates_in_column(net, "bus", 'name') assert all(net.bus.name.values == expected) expected = net.bus.type.values + [ " (%i)" % i for i in range(net.bus.shape[0]) ] sb.avoid_duplicates_in_column(net, "bus", 'type') assert all(net.bus.type.values == expected)
def test_create_line_alpha_temperature(): net = pp.create_empty_network() b = pp.create_buses(net, 5, 110) l1 = pp.create_line(net, 0, 1, 10, "48-AL1/8-ST1A 10.0") l2 = pp.create_line(net, 1, 2, 10, "48-AL1/8-ST1A 10.0", alpha=4.03e-3, temperature_degree_celsius=80) l3 = pp.create_line(net, 2, 3, 10, "48-AL1/8-ST1A 10.0") l4 = pp.create_line_from_parameters(net, 3, 4, 10, 1, 1, 1, 100) l5 = pp.create_line_from_parameters(net, 3, 4, 10, 1, 1, 1, 100, alpha=4.03e-3) assert 'alpha' in net.line.columns assert all(net.line.loc[[l2, l3, l5], 'alpha'] == 4.03e-3) assert all(net.line.loc[[l1, l4], 'alpha'].isnull()) assert net.line.loc[l2, 'temperature_degree_celsius'] == 80 assert all(net.line.loc[[l1, l3, l4, l5], 'temperature_degree_celsius'].isnull())
def test_close_to_gen_simple(): # from pandapower.shortcircuit import calc_sc # vars = {name: getattr(calc_sc, name) for name in # dir(calc_sc) if not name.startswith('__')} # globals().update(vars) # del vars, calc_sc # WIP net = pp.create_empty_network() b1, b2, b3, b4, b5 = pp.create_buses(net, 5, 20) # skss = np.sqrt(3) * 400 * 40 # we assume 40 kA sc current in the 400-kV EHV grid # pp.create_ext_grid(net, b1, s_sc_max_mva=skss, s_sc_min_mva=0.8 * skss, rx_min=0.2, rx_max=0.4) pp.create_gen(net, b3, vn_kv=20, xdss_pu=0.2, rdss_pu=0.2 * 0.07, cos_phi=0.8, p_mw=5, sn_mva=5) pp.create_gen(net, b5, vn_kv=20, xdss_pu=0.2, rdss_pu=0.2 * 0.07, cos_phi=0.8, p_mw=10, sn_mva=10) pp.create_line(net, b1, b2, std_type="305-AL1/39-ST1A 110.0", length_km=10) pp.create_line(net, b2, b3, std_type="305-AL1/39-ST1A 110.0", length_km=10) pp.create_line(net, b3, b4, std_type="305-AL1/39-ST1A 110.0", length_km=50) pp.create_line(net, b4, b5, std_type="305-AL1/39-ST1A 110.0", length_km=10) # sc.calc_single_sc(net, b5) sc.calc_sc(net, tk_s=5e-2)
def _opf_net(): net = pp.create_empty_network() pp.create_bus(net, 20, min_vm_pu=0.85, max_vm_pu=1.15) pp.create_buses(net, 3, 0.4, min_vm_pu=0.85, max_vm_pu=1.15) pp.create_transformer(net, 0, 1, "0.25 MVA 20/0.4 kV") pp.create_line(net, 1, 2, 1, "48-AL1/8-ST1A 0.4") pp.create_ext_grid(net, 0) pp.create_dcline(net, 1, 3, -5, 1, 1, 1, 1.02, max_p_kw=10, min_q_from_kvar=-5, min_q_to_kvar=-5, max_q_from_kvar=5, max_q_to_kvar=5) pp.create_load(net, 2, 15, controllable=True, max_p_kw=25, min_p_kw=0, max_q_kvar=5, min_q_kvar=-5) pp.create_gen(net, 1, -2, 1.002, controllable=True, max_p_kw=0, min_p_kw=-25, max_q_kvar=25, min_q_kvar=-25) pp.create_sgen(net, 2, -1, controllable=True, max_p_kw=0, min_p_kw=-3, max_q_kvar=1, min_q_kvar=-1) return net
def _opf_net(): net = pp.create_empty_network() pp.create_bus(net, 20, min_vm_pu=0.85, max_vm_pu=1.15) pp.create_buses(net, 3, 0.4, min_vm_pu=0.85, max_vm_pu=1.15) pp.create_transformer(net, 0, 1, "0.25 MVA 20/0.4 kV") pp.create_line(net, 1, 2, 1, "48-AL1/8-ST1A 0.4") pp.create_ext_grid(net, 0) pp.create_dcline(net, 1, 3, -5, 1, 1, 1, 1.02, max_p_mw=0.01, min_q_from_mvar=-.005, min_q_to_mvar=-0.005, max_q_from_mvar=.005, max_q_to_mvar=.005) pp.create_load(net, bus=2, p_mw=0.015, controllable=True, max_p_mw=0.025, min_p_mw=0, max_q_mvar=0.005, min_q_mvar=-0.005) pp.create_gen(net, bus=1, p_mw=0.002, vm_pu=1.002, controllable=True, max_p_mw=0, min_p_mw=-0.025, max_q_mvar=0.025, min_q_mvar=-0.025) pp.create_sgen(net, bus=2, p_mw=0.001, controllable=True, max_p_mw=0.003, min_p_mw=0, max_q_mvar=.001, min_q_mvar=-.001) return net
def case9_simplified(): net = pp.create_empty_network() pp.create_buses(net, 9, vn_kv=345.) lines = [[0, 3], [3, 4], [4, 5], [2, 5], [5, 6], [6, 7], [7, 1], [7, 8], [8, 3]] for i, (fb, tb) in enumerate(lines): pp.create_line_from_parameters(net, fb, tb, 1, 20, 100, 0, 1) pp.create_gen(net, 0, 0, slack=True, slack_weight=1) pp.create_gen(net, 1, 163, slack_weight=1) pp.create_gen(net, 2, 85, slack_weight=1) pp.create_load(net, 4, 90, 30) pp.create_load(net, 6, 100, 35) pp.create_load(net, 8, 125, 50) return net
def test_continuous_tap_control_vectorized_hv(): # --- load system and run power flow net = pp.create_empty_network() pp.create_buses(net, 6, 110) pp.create_buses(net, 5, 20) pp.create_ext_grid(net, 0) pp.create_lines(net, np.zeros(5), np.arange(1, 6), 10, "243-AL1/39-ST1A 110.0") for hv, lv in zip(np.arange(1, 6), np.arange(6, 11)): pp.create_transformer(net, hv, lv, "63 MVA 110/20 kV") pp.create_load(net, lv, 25 * (lv - 8), 25 * (lv - 8) * 0.4) pp.set_user_pf_options(net, init='dc', calculate_voltage_angles=True) # --- run loadflow pp.runpp(net) net_ref = net.deepcopy() # create with individual controllers for comparison tol = 1e-4 for tid in net.trafo.index.values: ContinuousTapControl(net_ref, tid=tid, side='hv', vm_set_pu=1.02, tol=tol) # run control reference pp.runpp(net_ref, run_control=True) # now create the vectorized version ContinuousTapControl(net, tid=net.trafo.index.values, side='hv', vm_set_pu=1.02, tol=tol) pp.runpp(net, run_control=True) assert np.allclose(net_ref.trafo.tap_pos, net.trafo.tap_pos, atol=1e-2, rtol=0)
def replace_branch_switches(net, reserved_aux_node_names=None): """ Instead of directly connect branch elements (trafo and line) to nodes which connection is done by switches, this function creates an auxiliary node in between of the branch on the one hand and the switch and node on the other hand. """ # --- determine indices idx_t_sw = net.switch.index[net.switch.et == "t"] idx_l_sw = net.switch.index[net.switch.et == "l"] n_branch_switches = len(idx_t_sw)+len(idx_l_sw) idx_bus = net.switch.bus[idx_t_sw | idx_l_sw] # --- create auxiliary nodes names, reserved_aux_node_names = append_str_by_underline_count( net.bus.name[idx_bus], reserved_strings=reserved_aux_node_names) if "subnet" in net.switch.columns: # if replace_branch_switches() is called by pp2csv_data(), "subnet" is available subnets = net.switch.subnet.loc[idx_t_sw | idx_l_sw].values else: # if replace_branch_switches() is called out of pp2csv_data(), this else statement is given subnets = net.bus.zone[idx_bus].values geodata = net.bus_geodata.loc[idx_bus, ["x", "y"]].values if net["bus_geodata"].shape[0] else \ np.empty((len(idx_bus), 2)) aux_buses = pp.create_buses( net, n_branch_switches, net.bus.vn_kv[idx_bus].values, name=names.values, type="auxiliary", geodata=geodata, zone=subnets) for col in ["min_vm_pu", "max_vm_pu", "substation", "voltLvl"]: if col in net.bus.columns: net.bus[col].loc[aux_buses] = net.bus[col][idx_bus].values if "subnet" in net.bus.columns: net.bus.subnet.loc[aux_buses] = subnets assert len(idx_bus) == len(aux_buses) # --- replace branch bus by new auxiliary node for idx_b_sw, branch, bus_types in zip([idx_t_sw, idx_l_sw], ["trafo", "line"], [["hv_bus", "lv_bus"], ["from_bus", "to_bus"]]): idx_elm = net.switch.element[idx_b_sw] is_first_bus_type = net[branch][bus_types[0]].loc[idx_elm].values == idx_bus.loc[ idx_b_sw].values # is_first_bus_type == hv_bus resp. from_bus pos_in_aux_buses = idx_in_2nd_array(np.array(idx_b_sw[is_first_bus_type]), np.array(idx_t_sw | idx_l_sw)) net[branch][bus_types[0]].loc[idx_elm[is_first_bus_type]] = aux_buses[pos_in_aux_buses] # ~is_first_bus_type == lv_bus resp. to_bus pos_in_aux_buses = idx_in_2nd_array(np.array(idx_b_sw[~is_first_bus_type]), np.array(idx_t_sw | idx_l_sw)) net[branch][bus_types[1]].loc[idx_elm[~is_first_bus_type]] = aux_buses[pos_in_aux_buses] # --- replace switch element by new auxiliary nodes net.switch.element.loc[idx_t_sw | idx_l_sw] = aux_buses net.switch.et.loc[idx_t_sw | idx_l_sw] = "b" return reserved_aux_node_names
def test_create_buses(): net = pp.create_empty_network() # standard b1 = pp.create_buses(net, 3, 110) # with geodata b2 = pp.create_buses(net, 3, 110, geodata=(10, 20)) # with geodata as array geodata = np.array([[10, 20], [20, 30], [30, 40]]) b3 = pp.create_buses(net, 3, 110, geodata=geodata) assert len(net.bus) == 9 assert len(net.bus_geodata) == 6 for i in b2: assert net.bus_geodata.at[i, 'x'] == 10 assert net.bus_geodata.at[i, 'y'] == 20 assert (net.bus_geodata.loc[b3, ['x', 'y']].values == geodata).all() # no way of creating buses with not matching shape with pytest.raises(ValueError): pp.create_buses(net, 2, 110, geodata=geodata)
def test_power_station_unit(): net = pp.create_empty_network() b1, b2, b3, b4 = pp.create_buses(net, 4, 20) b5 = pp.create_bus(net, 10) pp.create_ext_grid(net, b1, s_sc_max_mva=250, rx_max=0.1) pp.create_line(net, b1, b2, std_type="305-AL1/39-ST1A 110.0", length_km=10) pp.create_line(net, b2, b3, std_type="305-AL1/39-ST1A 110.0", length_km=10) pp.create_line(net, b3, b4, std_type="305-AL1/39-ST1A 110.0", length_km=50) pp.create_transformer_from_parameters(net, b4, b5, 25, 20, 10, 0.41104, 10.3, 0.1, 0.1) pp.create_gen(net, b5, vn_kv=10, xdss_pu=0.12, cos_phi=0.8, p_mw=0, sn_mva=10) sc.calc_sc(net)
def test_separate_zones(): net = small_example_grid() b1, b2 = pp.create_buses(net, 2, 110) pp.create_line_from_parameters(net, b1, b2, length_km=1, r_ohm_per_km=0.01, x_ohm_per_km=0.1, c_nf_per_km=0, max_i_ka=1) pp.create_ext_grid(net, b1) pp.create_load(net, b2, 100) # distributed slack not implemented for separate zones with pytest.raises(NotImplementedError): pp.runpp(net, distributed_slack=True, numba=False)
def test_unsupplied_buses_with_switches(): net = pp.create_empty_network() pp.create_buses(net, 8, 20) pp.create_buses(net, 5, 0.4) pp.create_ext_grid(net, 0) pp.create_line(net, 0, 1, 1.2, "NA2XS2Y 1x185 RM/25 12/20 kV") pp.create_switch(net, 0, 0, "l", closed=True) pp.create_switch(net, 1, 0, "l", closed=False) pp.create_line(net, 0, 2, 1.2, "NA2XS2Y 1x185 RM/25 12/20 kV") pp.create_switch(net, 0, 1, "l", closed=False) pp.create_switch(net, 2, 1, "l", closed=True) pp.create_line(net, 0, 3, 1.2, "NA2XS2Y 1x185 RM/25 12/20 kV") pp.create_switch(net, 0, 2, "l", closed=False) pp.create_switch(net, 3, 2, "l", closed=False) pp.create_line(net, 0, 4, 1.2, "NA2XS2Y 1x185 RM/25 12/20 kV") pp.create_switch(net, 0, 3, "l", closed=True) pp.create_switch(net, 4, 3, "l", closed=True) pp.create_line(net, 0, 5, 1.2, "NA2XS2Y 1x185 RM/25 12/20 kV") pp.create_switch(net, 0, 6, "b", closed=True) pp.create_switch(net, 0, 7, "b", closed=False) pp.create_transformer(net, 0, 8, "0.63 MVA 20/0.4 kV") pp.create_switch(net, 0, 0, "t", closed=True) pp.create_switch(net, 8, 0, "t", closed=False) pp.create_transformer(net, 0, 9, "0.63 MVA 20/0.4 kV") pp.create_switch(net, 0, 1, "t", closed=False) pp.create_switch(net, 9, 1, "t", closed=True) pp.create_transformer(net, 0, 10, "0.63 MVA 20/0.4 kV") pp.create_switch(net, 0, 2, "t", closed=False) pp.create_switch(net, 10, 2, "t", closed=False) pp.create_transformer(net, 0, 11, "0.63 MVA 20/0.4 kV") pp.create_switch(net, 0, 3, "t", closed=True) pp.create_switch(net, 11, 3, "t", closed=True) pp.create_transformer(net, 0, 12, "0.63 MVA 20/0.4 kV") pp.create_buses(net, 2, 20) pp.create_impedance(net, 0, 13, 1, 1, 10) pp.create_impedance(net, 0, 14, 1, 1, 10, in_service=False) ub = top.unsupplied_buses(net) assert ub == {1, 2, 3, 7, 8, 9, 10, 14} ub = top.unsupplied_buses(net, respect_switches=False) assert ub == {14}
def Sist5Bus(): # Sbase = 1 [MW] to match p.u. values net = pp.create_empty_network(name="5bus", f_hz=50, sn_kva=1e3) # barras pp.create_buses(net, nr_buses=5, vn_kv=1) # lineas pp.create_line_from_parameters(net, from_bus=0, to_bus=1, length_km=1, r_ohm_per_km=0.02, x_ohm_per_km=0.06, c_nf_per_km=0, max_i_ka=1000) pp.create_line_from_parameters(net, from_bus=0, to_bus=2, length_km=1, r_ohm_per_km=0.08, x_ohm_per_km=0.24, c_nf_per_km=0, max_i_ka=1000) pp.create_line_from_parameters(net, from_bus=1, to_bus=2, length_km=1, r_ohm_per_km=0.06, x_ohm_per_km=0.18, c_nf_per_km=0, max_i_ka=1000) pp.create_line_from_parameters(net, from_bus=1, to_bus=3, length_km=1, r_ohm_per_km=0.06, x_ohm_per_km=0.18, c_nf_per_km=0, max_i_ka=1000) pp.create_line_from_parameters(net, from_bus=1, to_bus=4, length_km=1, r_ohm_per_km=0.04, x_ohm_per_km=0.12, c_nf_per_km=0, max_i_ka=1000) pp.create_line_from_parameters(net, from_bus=2, to_bus=3, length_km=1, r_ohm_per_km=0.01, x_ohm_per_km=0.03, c_nf_per_km=0, max_i_ka=1000) pp.create_line_from_parameters(net, from_bus=3, to_bus=4, length_km=1, r_ohm_per_km=0.08, x_ohm_per_km=0.24, c_nf_per_km=0, max_i_ka=1000) # cargas pp.create_load(net, bus=0, p_kw=1e3) pp.create_load(net, bus=1, p_kw=20e3) pp.create_load(net, bus=2, p_kw=45e3) pp.create_load(net, bus=3, p_kw=40e3) pp.create_load(net, bus=4, p_kw=60e3) # gen pp.create_gen(net, bus=0, p_kw=-80e3, max_p_kw=-100e3, min_p_kw=0) pp.create_ext_grid(net, bus=1, max_q_kvar=1e3, max_p_kw=-100e3, min_p_kw=0) pp.create_gen(net, bus=4, p_kw=-34.6e3, max_p_kw=-100e3, min_p_kw=0) return net
def create_synthetic_voltage_control_lv_network(network_class="rural_1"): """ This function creates a LV network from M. Lindner, C. Aigner, R. Witzmann, F. Wirtz, \ I. Berber, M. Gödde and R. Frings. "Aktuelle Musternetze zur Untersuchung von \ Spannungsproblemen in der Niederspannung". 14. Symposium Energieinnovation TU Graz. 2014 which are representative, synthetic grids for voltage control analysis. According to Lindner \ the household loads are 5.1 kW and the special loads are 7.9 kW. The user is suggested to \ assume load distribution and load profile generation. OPTIONAL: **network_class** (str, 'rural_1') - specify which type of network will be created. Must \ be in ['rural_1', 'rural_2', 'village_1', 'village_2', 'suburb_1']. OUTPUT: **net** - returns the required synthetic voltage control lv network EXAMPLE: import pandapower.networks as nw net = nw.create_synthetic_voltage_control_lv_network() """ # process network choosing input data if network_class not in [ 'rural_1', 'rural_2', 'village_1', 'village_2', 'suburb_1' ]: raise ValueError( "network_class is not in ['rural_1', 'rural_2', 'village_1', 'village_2'," " 'suburb_1']") n_feeder = { 'rural_1': [1, 4, 7], 'rural_2': [1, 3, 3, 1], 'village_1': [9, 16, 5, 9], 'village_2': [9, 12, 5, 10], 'suburb_1': [9, 17, 5, 13, 8, 1, 9, 17, 5, 13, 4] } l_lines = { 'rural_1': [0.26, 0.133, 0.068], 'rural_2': [3e-3, 0.076, 0.076, 0.076], 'village_1': [0.053, 0.034, 0.08, 0.04], 'village_2': [0.021, 0.033, 0.023, 0.052], 'suburb_1': [ 0.041, 0.017, 0.056, 0.018, 0.035, 0.103, 0.046, 0.019, 0.065, 0.026, 0.031 ] } line_types = { 'rural_1': ['NAYY 4x150 SE'] * 2 + [('NAYY 4x150 SE', 'NAYY 4x120 SE')], 'rural_2': ['NAYY 4x35'] + ['NF 4x70'] * 3, 'village_1': ['NAYY 4x150 SE'] * 4, 'village_2': [('NAYY 4x70', 'NF 4x50'), ('NAYY 4x120 SE', 'NF 4x95'), ('NAYY 4x95', 'NF 4x70'), ('NAYY 4x150 SE', 'NF 4x120')], 'suburb_1': [('NAYY 4x150 SE', 'NAYY 4x120 SE')] * 3 + [('NAYY 4x120 SE', 'NAYY 4x95'), 'NAYY 4x150 SE', 'NAYY 4x95'] + ['NAYY 4x150 SE'] * 5 } line_type_change_at = { 'rural_1': [nan] * 2 + [5], 'rural_2': [nan] * 4, 'village_1': [nan] * 4, 'village_2': [8, 3, 4, 5], 'suburb_1': [5, 10, 3, 6] + [nan] * 7 } trafo_type = { 'rural_1': '0.16 MVA 20/0.4 kV vc', 'rural_2': '0.25 MVA 20/0.4 kV vc', 'village_1': '0.25 MVA 20/0.4 kV vc', 'village_2': '0.4 MVA 20/0.4 kV vc', 'suburb_1': '0.4 MVA 20/0.4 kV vc' } house_connection_length = { 'rural_1': 29e-3, 'rural_2': 4e-3, 'village_1': 21e-3, 'village_2': 17e-3, 'suburb_1': 18e-3 } house_connection_type = { 'rural_1': 'NAYY 4x50 SE', 'rural_2': 'NAYY 4x35', 'village_1': 'NAYY 4x50 SE', 'village_2': 'NAYY 4x35', 'suburb_1': 'NAYY 4x35' } # create network net = pp.create_empty_network( name='synthetic_voltage_control_lv_network: ' + network_class) # create std_types # cable data (r, x, i_max) from www.faberkabel.de if network_class in ["rural_2", "village_2", "suburb_1"]: pp.create_std_type(net, { "c_nf_per_km": 202, "r_ohm_per_km": 0.869, "x_ohm_per_km": 0.085, "max_i_ka": 0.123, "type": "cs", "q_mm2": 35 }, name="NAYY 4x35", element="line") if network_class != "suburb_1": pp.create_std_type(net, { "c_nf_per_km": 17.8, "r_ohm_per_km": 0.439, "x_ohm_per_km": 0.295, "max_i_ka": 0.28, "type": "ol", "q_mm2": 70 }, name="NF 4x70", element="line") if network_class == "village_2": pp.create_std_type(net, { "c_nf_per_km": 230, "r_ohm_per_km": 0.443, "x_ohm_per_km": 0.0823, "max_i_ka": 0.179, "type": "cs", "q_mm2": 70 }, name="NAYY 4x70", element="line") data = net.std_types['line']['48-AL1/8-ST1A 0.4'] data['q_mm2'] = 50 pp.create_std_type(net, data, name="NF 4x50", element="line") data = net.std_types['line']['94-AL1/15-ST1A 0.4'] data['q_mm2'] = 95 pp.create_std_type(net, data, name="NF 4x95", element="line") pp.create_std_type(net, { "c_nf_per_km": 16.2, "r_ohm_per_km": 0.274, "x_ohm_per_km": 0.31, "max_i_ka": 0.4, "type": "ol", "q_mm2": 120 }, name="NF 4x120", element="line") if network_class != "rural_2": pp.create_std_type(net, { "c_nf_per_km": 240, "r_ohm_per_km": 0.32, "x_ohm_per_km": 0.082, "max_i_ka": 0.215, "type": "cs", "q_mm2": 95 }, name="NAYY 4x95", element="line") # trafos if network_class == "rural_1": data = net.std_types['trafo']['0.25 MVA 20/0.4 kV'] data['sn_kva'] = 160 data['pfe_kw'] = 0.62 data['i0_percent'] = 0.31 data['vscr_percent'] = data['vscr_percent'] * 4 / data['vsc_percent'] data['vsc_percent'] = 4 pp.create_std_type(net, data, name=trafo_type[network_class], element="trafo") elif network_class in ["rural_2", "village_1"]: data = net.std_types['trafo']['0.25 MVA 20/0.4 kV'] data['vscr_percent'] = data['vscr_percent'] * 4 / data['vsc_percent'] data['vsc_percent'] = 4 pp.create_std_type(net, data, name=trafo_type[network_class], element="trafo") elif network_class in ["suburb_1", "village_2"]: data = net.std_types['trafo']['0.4 MVA 20/0.4 kV'] data['vscr_percent'] = data['vscr_percent'] * 4 / data['vsc_percent'] data['vsc_percent'] = 4 pp.create_std_type(net, data, name=trafo_type[network_class], element="trafo") # create mv connection mv_bus = pp.create_bus(net, 20, name='mv bus') bb = pp.create_bus(net, 0.4, name='busbar') pp.create_ext_grid(net, mv_bus) pp.create_transformer(net, mv_bus, bb, std_type=trafo_type[network_class]) # create lv network idx_feeder = range(len(n_feeder[network_class])) lv_buses = {} house_buses = {} for i in idx_feeder: # buses lv_buses[i] = pp.create_buses(net, n_feeder[network_class][i], 0.4, zone='Feeder' + str(i + 1), type='m') house_buses[i] = pp.create_buses(net, n_feeder[network_class][i], 0.4, zone='Feeder' + str(i + 1), type='n') # lines lines = pd.DataFrame() lines['from_bus'] = append(bb, append(lv_buses[i][:-1], lv_buses[i])) lines['to_bus'] = append(lv_buses[i], house_buses[i]) if line_type_change_at[network_class][i] is nan: lines['std_type'] = [line_types[network_class][i]]*n_feeder[network_class][i] + \ [house_connection_type[network_class]]*n_feeder[network_class][i] else: lines['std_type'] = \ [line_types[network_class][i][0]]*line_type_change_at[network_class][i] + \ [line_types[network_class][i][1]]*(n_feeder[network_class][i] - line_type_change_at[network_class][i]) + \ [house_connection_type[network_class]]*n_feeder[network_class][i] lines['length'] = [l_lines[network_class][i]]*n_feeder[network_class][i] + \ [house_connection_length[network_class]]*n_feeder[network_class][i] for _, lines in lines.iterrows(): pp.create_line(net, lines.from_bus, lines.to_bus, length_km=lines.length, std_type=lines.std_type) # load for i in house_buses[i]: pp.create_load(net, i, p_kw=5.1) # direct loads and DEA if network_class == "rural_1": special_load = [(2, 4), (3, 2)] DER = [(2, 1, 6.9), (2, 2, 15.3), (2, 4, 29.6), (3, 4, 15.8), (3, 5, 25.3)] elif network_class == "rural_2": special_load = [(1, 1), (2, 3), (3, 2)] DER = [(1, 1, 29.6), (2, 3, 25.4), (3, 2, 25), (3, 3, 10)] elif network_class == "village_1": special_load = [(2, 9), (2, 12), (2, 14), (2, 16), (3, 5), (4, 3), (4, 6), (4, 8)] DER = [(1, 6, 29.8), (1, 8, 22.8), (2, 3, 7.9), (2, 5, 4.2), (2, 11, 16.7), (2, 15, 7.3), (3, 1, 31.9), (3, 3, 17.4), (3, 5, 15), (4, 1, 8.8), (4, 3, 19.6), (4, 5, 9.3), (4, 6, 13)] elif network_class == "village_2": special_load = [] DER = [(1, 6, 29.8), (1, 2, 16), (1, 3, 4.6), (1, 6, 19), (1, 8, 29), (2, 1, 16), (2, 2, 5.2), (2, 3, 19), (2, 5, 12), (2, 10, 10), (2, 12, 8), (3, 1, 12.63), (3, 2, 30), (4, 3, 10), (4, 4, 33), (4, 10, 8)] elif network_class == "suburb_1": special_load = [(6, 1), (1, 4), (2, 17), (3, 5), (4, 5), (6, 1), (7, 7), (8, 17)] DER = [(1, 1, 9.36), (1, 2, 79.12), (7, 7, 30), (8, 7, 18.47), (8, 15, 9.54), (10, 10, 14.4)] for i in special_load: pp.create_load(net, lv_buses[i[0] - 1][i[1] - 1], p_kw=7.9) for i in DER: pp.create_sgen(net, house_buses[i[0] - 1][i[1] - 1], p_kw=-i[2]) # set bus geo data bus_geo = { "rural_1": '{"x":{"0":0.0,"1":0.0,"2":-1.6666666667,"3":-1.6666666667,"4":-0.1666666667,"5":-0.6666666667,"6":-1.1666666667,"7":-1.6666666667,"8":0.3333333333,"9":-0.1666666667,"10":-0.6666666667,"11":-1.6666666667,"12":1.8333333333,"13":1.3333333333,"14":0.8333333333,"15":0.3333333333,"16":-0.1666666667,"17":-0.6666666667,"18":-1.1666666667,"19":2.3333333333,"20":1.8333333333,"21":1.3333333333,"22":0.8333333333,"23":0.3333333333,"24":-0.1666666667,"25":-1.1666666667},"y":{"0":0.0,"1":1.0,"2":2.0,"3":3.0,"4":2.0,"5":3.0,"6":4.0,"7":5.0,"8":3.0,"9":4.0,"10":5.0,"11":6.0,"12":2.0,"13":3.0,"14":4.0,"15":5.0,"16":6.0,"17":7.0,"18":8.0,"19":3.0,"20":4.0,"21":5.0,"22":6.0,"23":7.0,"24":8.0,"25":9.0}}', "rural_2": '{"x":{"0":0.0,"1":0.0,"2":-2.5,"3":-2.5,"4":-1.0,"5":-1.5,"6":-2.0,"7":-0.5,"8":-1.0,"9":-2.0,"10":1.0,"11":0.5,"12":0.0,"13":1.5,"14":1.0,"15":0.0,"16":2.5,"17":2.5},"y":{"0":0.0,"1":1.0,"2":2.0,"3":3.0,"4":2.0,"5":3.0,"6":4.0,"7":3.0,"8":4.0,"9":5.0,"10":2.0,"11":3.0,"12":4.0,"13":3.0,"14":4.0,"15":5.0,"16":2.0,"17":3.0}}', "village_1": '{"x":{"0":0.0,"1":0.0,"2":-3.0,"3":-3.5,"4":-4.0,"5":-4.5,"6":-5.0,"7":-5.5,"8":-6.0,"9":-6.5,"10":-7.0,"11":-2.5,"12":-3.0,"13":-3.5,"14":-4.0,"15":-4.5,"16":-5.0,"17":-5.5,"18":-6.0,"19":-7.0,"20":-1.0,"21":-1.5,"22":-2.0,"23":-2.5,"24":-3.0,"25":-3.5,"26":-4.0,"27":-4.5,"28":-5.0,"29":-5.5,"30":-6.0,"31":-6.5,"32":-7.0,"33":-7.5,"34":-8.0,"35":-8.5,"36":-0.5,"37":-1.0,"38":-1.5,"39":-2.0,"40":-2.5,"41":-3.0,"42":-3.5,"43":-4.0,"44":-4.5,"45":-5.0,"46":-5.5,"47":-6.0,"48":-6.5,"49":-7.0,"50":-7.5,"51":-8.5,"52":1.0,"53":0.5,"54":0.0,"55":-0.5,"56":-1.0,"57":1.5,"58":1.0,"59":0.5,"60":0.0,"61":-1.0,"62":3.0,"63":2.5,"64":2.0,"65":1.5,"66":1.0,"67":0.5,"68":0.0,"69":-0.5,"70":-1.0,"71":3.5,"72":3.0,"73":2.5,"74":2.0,"75":1.5,"76":1.0,"77":0.5,"78":0.0,"79":-1.0},"y":{"0":0.0,"1":1.0,"2":2.0,"3":3.0,"4":4.0,"5":5.0,"6":6.0,"7":7.0,"8":8.0,"9":9.0,"10":10.0,"11":3.0,"12":4.0,"13":5.0,"14":6.0,"15":7.0,"16":8.0,"17":9.0,"18":10.0,"19":11.0,"20":2.0,"21":3.0,"22":4.0,"23":5.0,"24":6.0,"25":7.0,"26":8.0,"27":9.0,"28":10.0,"29":11.0,"30":12.0,"31":13.0,"32":14.0,"33":15.0,"34":16.0,"35":17.0,"36":3.0,"37":4.0,"38":5.0,"39":6.0,"40":7.0,"41":8.0,"42":9.0,"43":10.0,"44":11.0,"45":12.0,"46":13.0,"47":14.0,"48":15.0,"49":16.0,"50":17.0,"51":18.0,"52":2.0,"53":3.0,"54":4.0,"55":5.0,"56":6.0,"57":3.0,"58":4.0,"59":5.0,"60":6.0,"61":7.0,"62":2.0,"63":3.0,"64":4.0,"65":5.0,"66":6.0,"67":7.0,"68":8.0,"69":9.0,"70":10.0,"71":3.0,"72":4.0,"73":5.0,"74":6.0,"75":7.0,"76":8.0,"77":9.0,"78":10.0,"79":11.0}}', "village_2": '{"x":{"0":0.0,"1":0.0,"2":-3.0,"3":-3.5,"4":-4.0,"5":-4.5,"6":-5.0,"7":-5.5,"8":-6.0,"9":-6.5,"10":-7.0,"11":-2.5,"12":-3.0,"13":-3.5,"14":-4.0,"15":-4.5,"16":-5.0,"17":-5.5,"18":-6.0,"19":-7.0,"20":-1.0,"21":-1.5,"22":-2.0,"23":-2.5,"24":-3.0,"25":-3.5,"26":-4.0,"27":-4.5,"28":-5.0,"29":-5.5,"30":-6.0,"31":-6.5,"32":-0.5,"33":-1.0,"34":-1.5,"35":-2.0,"36":-2.5,"37":-3.0,"38":-3.5,"39":-4.0,"40":-4.5,"41":-5.0,"42":-5.5,"43":-6.5,"44":1.0,"45":0.5,"46":0.0,"47":-0.5,"48":-1.0,"49":1.5,"50":1.0,"51":0.5,"52":0.0,"53":-1.0,"54":3.0,"55":2.5,"56":2.0,"57":1.5,"58":1.0,"59":0.5,"60":0.0,"61":-0.5,"62":-1.0,"63":-1.5,"64":3.5,"65":3.0,"66":2.5,"67":2.0,"68":1.5,"69":1.0,"70":0.5,"71":0.0,"72":-0.5,"73":-1.5},"y":{"0":0.0,"1":1.0,"2":2.0,"3":3.0,"4":4.0,"5":5.0,"6":6.0,"7":7.0,"8":8.0,"9":9.0,"10":10.0,"11":3.0,"12":4.0,"13":5.0,"14":6.0,"15":7.0,"16":8.0,"17":9.0,"18":10.0,"19":11.0,"20":2.0,"21":3.0,"22":4.0,"23":5.0,"24":6.0,"25":7.0,"26":8.0,"27":9.0,"28":10.0,"29":11.0,"30":12.0,"31":13.0,"32":3.0,"33":4.0,"34":5.0,"35":6.0,"36":7.0,"37":8.0,"38":9.0,"39":10.0,"40":11.0,"41":12.0,"42":13.0,"43":14.0,"44":2.0,"45":3.0,"46":4.0,"47":5.0,"48":6.0,"49":3.0,"50":4.0,"51":5.0,"52":6.0,"53":7.0,"54":2.0,"55":3.0,"56":4.0,"57":5.0,"58":6.0,"59":7.0,"60":8.0,"61":9.0,"62":10.0,"63":11.0,"64":3.0,"65":4.0,"66":5.0,"67":6.0,"68":7.0,"69":8.0,"70":9.0,"71":10.0,"72":11.0,"73":12.0}}', "suburb_1": '{"x":{"0":0.0,"1":0.0,"2":-9.5,"3":-10.0,"4":-10.5,"5":-11.0,"6":-11.5,"7":-12.0,"8":-12.5,"9":-13.0,"10":-13.5,"11":-9.0,"12":-9.5,"13":-10.0,"14":-10.5,"15":-11.0,"16":-11.5,"17":-12.0,"18":-12.5,"19":-13.5,"20":-7.5,"21":-8.0,"22":-8.5,"23":-9.0,"24":-9.5,"25":-10.0,"26":-10.5,"27":-11.0,"28":-11.5,"29":-12.0,"30":-12.5,"31":-13.0,"32":-13.5,"33":-14.0,"34":-14.5,"35":-15.0,"36":-15.5,"37":-7.0,"38":-7.5,"39":-8.0,"40":-8.5,"41":-9.0,"42":-9.5,"43":-10.0,"44":-10.5,"45":-11.0,"46":-11.5,"47":-12.0,"48":-12.5,"49":-13.0,"50":-13.5,"51":-14.0,"52":-14.5,"53":-15.5,"54":-5.5,"55":-6.0,"56":-6.5,"57":-7.0,"58":-7.5,"59":-5.0,"60":-5.5,"61":-6.0,"62":-6.5,"63":-7.5,"64":-3.5,"65":-4.0,"66":-4.5,"67":-5.0,"68":-5.5,"69":-6.0,"70":-6.5,"71":-7.0,"72":-7.5,"73":-8.0,"74":-8.5,"75":-9.0,"76":-9.5,"77":-3.0,"78":-3.5,"79":-4.0,"80":-4.5,"81":-5.0,"82":-5.5,"83":-6.0,"84":-6.5,"85":-7.0,"86":-7.5,"87":-8.0,"88":-8.5,"89":-9.5,"90":-1.5,"91":-2.0,"92":-2.5,"93":-3.0,"94":-3.5,"95":-4.0,"96":-4.5,"97":-5.0,"98":-1.0,"99":-1.5,"100":-2.0,"101":-2.5,"102":-3.0,"103":-3.5,"104":-4.0,"105":-5.0,"106":0.0,"107":0.0,"108":1.5,"109":1.0,"110":0.5,"111":0.0,"112":-0.5,"113":-1.0,"114":-1.5,"115":-2.0,"116":-2.5,"117":2.0,"118":1.5,"119":1.0,"120":0.5,"121":0.0,"122":-0.5,"123":-1.0,"124":-1.5,"125":-2.5,"126":3.5,"127":3.0,"128":2.5,"129":2.0,"130":1.5,"131":1.0,"132":0.5,"133":0.0,"134":-0.5,"135":-1.0,"136":-1.5,"137":-2.0,"138":-2.5,"139":-3.0,"140":-3.5,"141":-4.0,"142":-4.5,"143":4.0,"144":3.5,"145":3.0,"146":2.5,"147":2.0,"148":1.5,"149":1.0,"150":0.5,"151":0.0,"152":-0.5,"153":-1.0,"154":-1.5,"155":-2.0,"156":-2.5,"157":-3.0,"158":-3.5,"159":-4.5,"160":5.5,"161":5.0,"162":4.5,"163":4.0,"164":3.5,"165":6.0,"166":5.5,"167":5.0,"168":4.5,"169":3.5,"170":7.5,"171":7.0,"172":6.5,"173":6.0,"174":5.5,"175":5.0,"176":4.5,"177":4.0,"178":3.5,"179":3.0,"180":2.5,"181":2.0,"182":1.5,"183":8.0,"184":7.5,"185":7.0,"186":6.5,"187":6.0,"188":5.5,"189":5.0,"190":4.5,"191":4.0,"192":3.5,"193":3.0,"194":2.5,"195":1.5,"196":9.5,"197":9.0,"198":8.5,"199":8.0,"200":10.0,"201":9.5,"202":9.0,"203":8.0},"y":{"0":0.0,"1":1.0,"2":2.0,"3":3.0,"4":4.0,"5":5.0,"6":6.0,"7":7.0,"8":8.0,"9":9.0,"10":10.0,"11":3.0,"12":4.0,"13":5.0,"14":6.0,"15":7.0,"16":8.0,"17":9.0,"18":10.0,"19":11.0,"20":2.0,"21":3.0,"22":4.0,"23":5.0,"24":6.0,"25":7.0,"26":8.0,"27":9.0,"28":10.0,"29":11.0,"30":12.0,"31":13.0,"32":14.0,"33":15.0,"34":16.0,"35":17.0,"36":18.0,"37":3.0,"38":4.0,"39":5.0,"40":6.0,"41":7.0,"42":8.0,"43":9.0,"44":10.0,"45":11.0,"46":12.0,"47":13.0,"48":14.0,"49":15.0,"50":16.0,"51":17.0,"52":18.0,"53":19.0,"54":2.0,"55":3.0,"56":4.0,"57":5.0,"58":6.0,"59":3.0,"60":4.0,"61":5.0,"62":6.0,"63":7.0,"64":2.0,"65":3.0,"66":4.0,"67":5.0,"68":6.0,"69":7.0,"70":8.0,"71":9.0,"72":10.0,"73":11.0,"74":12.0,"75":13.0,"76":14.0,"77":3.0,"78":4.0,"79":5.0,"80":6.0,"81":7.0,"82":8.0,"83":9.0,"84":10.0,"85":11.0,"86":12.0,"87":13.0,"88":14.0,"89":15.0,"90":2.0,"91":3.0,"92":4.0,"93":5.0,"94":6.0,"95":7.0,"96":8.0,"97":9.0,"98":3.0,"99":4.0,"100":5.0,"101":6.0,"102":7.0,"103":8.0,"104":9.0,"105":10.0,"106":2.0,"107":3.0,"108":2.0,"109":3.0,"110":4.0,"111":5.0,"112":6.0,"113":7.0,"114":8.0,"115":9.0,"116":10.0,"117":3.0,"118":4.0,"119":5.0,"120":6.0,"121":7.0,"122":8.0,"123":9.0,"124":10.0,"125":11.0,"126":2.0,"127":3.0,"128":4.0,"129":5.0,"130":6.0,"131":7.0,"132":8.0,"133":9.0,"134":10.0,"135":11.0,"136":12.0,"137":13.0,"138":14.0,"139":15.0,"140":16.0,"141":17.0,"142":18.0,"143":3.0,"144":4.0,"145":5.0,"146":6.0,"147":7.0,"148":8.0,"149":9.0,"150":10.0,"151":11.0,"152":12.0,"153":13.0,"154":14.0,"155":15.0,"156":16.0,"157":17.0,"158":18.0,"159":19.0,"160":2.0,"161":3.0,"162":4.0,"163":5.0,"164":6.0,"165":3.0,"166":4.0,"167":5.0,"168":6.0,"169":7.0,"170":2.0,"171":3.0,"172":4.0,"173":5.0,"174":6.0,"175":7.0,"176":8.0,"177":9.0,"178":10.0,"179":11.0,"180":12.0,"181":13.0,"182":14.0,"183":3.0,"184":4.0,"185":5.0,"186":6.0,"187":7.0,"188":8.0,"189":9.0,"190":10.0,"191":11.0,"192":12.0,"193":13.0,"194":14.0,"195":15.0,"196":2.0,"197":3.0,"198":4.0,"199":5.0,"200":3.0,"201":4.0,"202":5.0,"203":6.0}}' } net.bus_geodata = pd.read_json(bus_geo[network_class]) # Match bus.index net.bus_geodata = net.bus_geodata.loc[net.bus.index] return net
import pandapower as pp net = pp.create_empty_network("mini") pp.create_buses(net, 3, 20, index=[0, 1, 2]) pp.create_line(net, 0, 1, 0.01, std_type="NAYY 4x50 SE") pp.create_line(net, 1, 2, 0.01, std_type="NAYY 4x50 SE") pp.create_line(net, 2, 0, 0.01, std_type="NAYY 4x50 SE") pp.create_load(net, bus=0, p_mw=100, q_mvar=100) pp.create_gen(net, bus=1, p_mw=-100, slack=True) #pp.runpp(net) net.res_bus
def _create_feeder(net, net_data, branching, idx_busbar, linetype, lv_vn_kv): """ This function creates the dickert lv network feeders by creating the buses and lines. In case \ of branching the right position of branching must be found with respect to sum of feeder nodes \ 'n_DP' and the number of 'branching'. """ n_DP = net_data[1] d_DP = net_data[0] buses = pp.create_buses(net, int(n_DP), lv_vn_kv, zone='Feeder B' + str(branching), type='m') from_bus = append(idx_busbar, buses[:-1]) # branch consideration if branching == 1: n_LS = int(ceil(n_DP / 3)) idx_B1 = 2 * n_LS if n_LS * 3 - n_DP == 2: idx_B1 -= 1 from_bus[idx_B1] = buses[n_LS - 1] elif branching == 2: n_LS = int(ceil(n_DP / 6)) idx_B1 = 3 * n_LS idx_B2 = 4 * n_LS if n_LS * 6 - n_DP >= 1: idx_B2 -= 1 if n_LS * 6 - n_DP >= 4: idx_B1 -= 1 idx_B2 -= 1 if n_LS * 6 - n_DP == 5: idx_B2 -= 1 from_bus[idx_B1] = buses[2 * n_LS - 1] from_bus[idx_B2] = buses[n_LS - 1] elif branching == 3: n_LS = int(ceil(n_DP / 10)) idx_B1 = 4 * n_LS idx_B2 = 5 * n_LS idx_B3 = 7 * n_LS if n_LS * 10 - n_DP >= 1: idx_B2 -= 1 idx_B3 -= 1 if n_LS * 10 - n_DP >= 2: idx_B3 -= 1 if n_LS * 10 - n_DP >= 3: idx_B3 -= 1 if n_LS * 10 - n_DP >= 7: idx_B1 -= 1 idx_B2 -= 1 idx_B3 -= 1 if n_LS * 10 - n_DP >= 8: idx_B2 -= 1 idx_B3 -= 1 if n_LS * 10 - n_DP == 9: idx_B3 -= 1 from_bus[idx_B1] = buses[3 * n_LS - 1] from_bus[idx_B2] = buses[2 * n_LS - 1] from_bus[idx_B3] = buses[n_LS - 1] elif branching != 0: raise ValueError("branching must be in (0, 1, 2, 3), but is %s" % str(branching)) # create lines new_lines = set() for i, f_bus in enumerate(from_bus): new_lines.add( pp.create_line(net, f_bus, buses[i], length_km=d_DP * 1e-3, std_type='NAYY 4x150 SE')) # line type consideration if linetype == 'C&OHL': _change_to_ohl(net, idx_busbar, new_lines, round(len(new_lines) * 0.4)) # create loads _create_loads_with_coincidence(net, buses)
def test_opf_task(): net = pp.create_empty_network() pp.create_buses(net, 6, [10, 10, 10, 0.4, 7, 7], min_vm_pu=[0.9, 0.9, 0.88, 0.9, np.nan, np.nan]) idx_ext_grid = 1 pp.create_ext_grid(net, 0, max_q_mvar=80, min_p_mw=0, index=idx_ext_grid) pp.create_gen(net, 1, 10, min_q_mvar=-50, max_q_mvar=-10, min_p_mw=0, max_p_mw=60) pp.create_gen(net, 2, 8) pp.create_gen(net, 3, 5) pp.create_load(net, 3, 120, max_p_mw=8) pp.create_sgen(net, 1, 8, min_q_mvar=-50, max_q_mvar=-10, controllable=False) pp.create_sgen(net, 2, 8) pp.create_storage(net, 3, 2, 100, min_q_mvar=-10, max_q_mvar=-50, min_p_mw=0, max_p_mw=60, controllable=True) pp.create_dcline(net, 4, 5, 0.3, 1e-4, 1e-2, 1.01, 1.02, min_q_from_mvar=-10, min_q_to_mvar=-10) pp.create_line(net, 3, 4, 5, "122-AL1/20-ST1A 10.0", max_loading_percent=50) pp.create_transformer(net, 2, 3, "0.25 MVA 10/0.4 kV") # --- run and check opf_task() out1 = pp.opf_task(net, keep=True) assert out1["flexibilities_without_costs"] == "all" assert sorted(out1["flexibilities"].keys()) == [i1 + i2 for i1 in ["P", "Q"] for i2 in [ "dcline", "ext_grid", "gen", "storage"]] for key, df in out1["flexibilities"].items(): assert df.shape[0] if "gen" in key: assert df.shape[0] > 1 assert out1["flexibilities"]["Pext_grid"].loc[0, "index"] == [1] assert np.isnan(out1["flexibilities"]["Pext_grid"].loc[0, "max"]) assert out1["flexibilities"]["Pext_grid"].loc[0, "min"] == 0 assert np.isnan(out1["flexibilities"]["Qext_grid"].loc[0, "min"]) assert out1["flexibilities"]["Qext_grid"].loc[0, "max"] == 80 assert sorted(out1["network_constraints"].keys()) == ["LOADINGline", "VMbus"] assert out1["network_constraints"]["VMbus"].shape[0] == 3 # check delta_pq net.gen.loc[0, "min_p_mw"] = net.gen.loc[0, "max_p_mw"] - 1e-5 out2 = pp.opf_task(net, delta_pq=1e-3, keep=True) assert out2["flexibilities"]["Pgen"].shape[0] == 1 net.gen.loc[0, "min_p_mw"] = net.gen.loc[0, "max_p_mw"] - 1e-1 out1["flexibilities"]["Pgen"].loc[0, "min"] = out1["flexibilities"]["Pgen"].loc[ 0, "max"] - 1e-1 out3 = pp.opf_task(net, delta_pq=1e-3, keep=True) for key in out3["flexibilities"]: assert pp.dataframes_equal(out3["flexibilities"][key], out1["flexibilities"][key]) # check costs pp.create_poly_cost(net, idx_ext_grid, "ext_grid", 2) pp.create_poly_cost(net, 1, "gen", 1.7) pp.create_poly_cost(net, 0, "dcline", 2) pp.create_pwl_cost(net, 2, "gen", [[-1e9, 1, 3.1], [1, 1e9, 0.5]], power_type="q") out4 = pp.opf_task(net) for dict_key in ["flexibilities", "network_constraints"]: for key in out4[dict_key]: assert pp.dataframes_equal(out4[dict_key][key], out1[dict_key][key]) assert isinstance(out4["flexibilities_without_costs"], dict) expected_elm_without_cost = ["gen", "storage"] assert sorted(out4["flexibilities_without_costs"].keys()) == expected_elm_without_cost for elm in expected_elm_without_cost: assert len(out4["flexibilities_without_costs"][elm]) == 1
def _net_to_test(): # create test grid net = pp.create_empty_network() # buses hv_bus = pp.create_bus(net, 110, index=8, name="HV Bus 0") lv_buses = pp.create_buses(net, 6, 20, index=[2, 0, 5, 4, 3, 1], name=["MV Bus %i" % i for i in range(6)]) # trafo t0 = pp.create_transformer(net, hv_bus, lv_buses[1], "40 MVA 110/20 kV", name="T0") t1 = pp.create_transformer(net, hv_bus, lv_buses[4], "40 MVA 110/20 kV", name="T1") # lines l0 = pp.create_line(net, lv_buses[1], lv_buses[2], 1.11, "94-AL1/15-ST1A 20.0", index=3, name="L0") l1 = pp.create_line(net, lv_buses[2], lv_buses[3], 1.11, "94-AL1/15-ST1A 20.0", index=7, name="L1") l2 = pp.create_line(net, lv_buses[3], lv_buses[0], 2, "94-AL1/15-ST1A 20.0", name="L2") l3 = pp.create_line(net, lv_buses[1], lv_buses[3], 2.4, "94-AL1/15-ST1A 20.0", name="L3") # bus-bus switch pp.create_switch(net, lv_buses[5], lv_buses[2], "b", index=3) # trafo switches pp.create_switch(net, hv_bus, t0, "t", name="dfdfg", index=4) pp.create_switch(net, lv_buses[1], t0, "t", False, name="dfhgjdf") pp.create_switch(net, lv_buses[4], t1, "t", False, name="dfhgj", index=2) # line switches pp.create_switch(net, lv_buses[0], l2, "l", False, name="klar") pp.create_switch(net, lv_buses[3], l3, "l", False, name="klar", index=8) pp.create_switch(net, lv_buses[1], l0, "l") pp.create_switch(net, lv_buses[2], l0, "l") pp.create_switch(net, lv_buses[3], l1, "l") create_generic_coordinates(net) return net
def test_convert_to_parallel_branches(): # create test grid net = pp.create_empty_network() pp.create_bus(net, 110) pp.create_buses(net, 2, 20) # --- transformers & corresponding switches pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 1") pp.create_switch(net, 1, 0, "t", name="Tr-Switch 1") # only name changed: pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 2") pp.create_switch(net, 1, 1, "t", name="Tr-Switch 2") # only max_loading changed: pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 1", max_loading_percent=50) pp.create_switch(net, 1, 2, "t", name="Tr-Switch 1") # only switch position changed: pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 1") pp.create_switch(net, 1, 3, "t", closed=False, name="Tr-Switch 1") # only switch missing: pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 1") # only name and std_type changed: pp.create_transformer(net, 0, 1, "25 MVA 110/20 kV", name="Trafo 3") pp.create_switch(net, 1, 5, "t", name="Tr-Switch 3") # only name changed and switch added: pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 4") pp.create_switch(net, 1, 6, "t", name="Tr-Switch 4a") pp.create_switch(net, 0, 6, "t", name="Tr-Switch 4b") # only name and parallel changed: pp.create_transformer(net, 0, 1, "40 MVA 110/20 kV", name="Trafo 5", parallel=2) pp.create_switch(net, 1, 7, "t", name="Tr-Switch 5") # --- lines & corresponding switches pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 1") pp.create_switch(net, 2, 0, "l", name="L-Switch 1") # only name changed: pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 2") pp.create_switch(net, 2, 1, "l", name="L-Switch 2") # only max_loading changed: pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 1", max_loading_percent=50) pp.create_switch(net, 2, 2, "l", name="L-Switch 1") # only switch position changed: pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 1") pp.create_switch(net, 2, 3, "l", closed=False, name="L-Switch 1") # only switch missing: pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 1") # only name and std_type changed: pp.create_line(net, 1, 2, 1.11, "48-AL1/8-ST1A 20.0", name="Line 3") pp.create_switch(net, 2, 5, "l", name="L-Switch 3") # only name changed and switch added: pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 4") pp.create_switch(net, 2, 6, "l", name="L-Switch 4a") pp.create_switch(net, 1, 6, "l", name="L-Switch 4b") # only name and parallel changed: pp.create_line(net, 1, 2, 1.11, "94-AL1/15-ST1A 20.0", name="Line 5", parallel=2) pp.create_switch(net, 2, 7, "l", name="L-Switch 5") # only name and from_bus <-> to_bus changed: pp.create_line(net, 2, 1, 1.11, "94-AL1/15-ST1A 20.0", name="Line 6") pp.create_switch(net, 2, 8, "l", name="L-Switch 6") net1 = deepcopy(net) net2 = deepcopy(net) net3 = deepcopy(net) # complete convert_parallel_branches(net1, multiple_entries=False) for elm in ["trafo", "line"]: assert sorted(net1[elm].index) == [0, 2, 3, 4, 5, 6] assert list(net1["trafo"].parallel.values) == [4] + [1]*5 assert list(net1["line"].parallel.values) == [5] + [1]*5 # only line convert_parallel_branches(net2, multiple_entries=False, elm_to_convert=["line"]) assert pp.dataframes_equal(net2.line, net1.line) assert pp.dataframes_equal(net2.trafo, net.trafo) # only exclude "max_loading_percent" convert_parallel_branches(net3, multiple_entries=False, exclude_cols_from_parallel_finding=[ "name", "parallel", "max_loading_percent"]) for elm in ["trafo", "line"]: assert sorted(net3[elm].index) == [0, 3, 4, 5, 6] assert list(net3["trafo"].parallel.values) == [5] + [1]*4 assert list(net3["line"].parallel.values) == [6] + [1]*4
def create_pp_grid(nodes, lines, tech, loads, n0, hv=True, ntrafos_hv=2, vn_kv=20, tanphi=0.3, hv_trafo_controller=True, verbose=True): """ """ if verbose: print('Starting!') # 0- empty grid net = pp.create_empty_network() # 1- std_types if verbose: print('\tTech types') add_tech_types(net, tech) # 2 - Create buses if verbose: print('\tBuses') idxs = pp.create_buses(net, len(nodes), vn_kv=vn_kv, name=nodes.index, geodata=list(nodes.xyGPS), type='b', zone=nodes.Geo.values) if 'Feeder' in nodes: add_extra(net.bus, idxs, nodes.Feeder.values, 'Feeder') # 3- Create lines if verbose: print('\tLines') for linetype in lines.Conductor.unique(): ls = lines[lines.Conductor == linetype] nis = pp.get_element_indices(net, "bus", ls.node_i) nes = pp.get_element_indices(net, "bus", ls.node_e) idxs = pp.create_lines(net, nis, nes, ls.Length.values / 1000, std_type=linetype, name=ls.index, geodata=list(ls.ShapeGPS), df=1., parallel=1, in_service=True) if 'Feeder' in lines: add_extra(net.line, idxs, ls.Feeder.values, 'Feeder') # 4- Create loads if verbose: print('\tLoads') nls = pp.get_element_indices(net, 'bus', loads.node) idxs = pp.create_loads(net, nls, name=loads.index, p_mw=loads.Pmax_MW.values, q_mvar=loads.Pmax_MW.values * tanphi) if 'type_load' in loads: add_extra(net.load, idxs, loads.type_load.values, 'type_load') else: add_extra(net.load, idxs, 'Base', 'type_load') if 'Geo' in loads: add_extra(net.load, idxs, loads.Geo, 'zone') # Adding external grid if verbose: print('\tExt Grid') if hv: # If HV, then add extra bus for HV and add trafo b0 = pp.create_bus(net, vn_kv=110, geodata=nodes.xyGPS[n0], name='HV_SS') # Adding HV-MV trafo (n x 40MW trafos) t = pp.create_transformer(net, hv_bus=b0, lv_bus=n0, std_type='40 MVA 110/20 kV', name='TrafoSS', parallel=ntrafos_hv) if hv_trafo_controller: # Add tap changer controller at MV side of SS trafo ppc.DiscreteTapControl(net, t, 0.99, 1.01, side='lv') else: b0 = n0 pp.create_ext_grid(net, bus=b0) if verbose: print('Finished!') return net