Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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)
Пример #6
0
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
Пример #7
0
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)
Пример #9
0
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())
Пример #10
0
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)
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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
Пример #14
0
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)
Пример #15
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
Пример #16
0
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)
Пример #17
0
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)
Пример #18
0
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)
Пример #19
0
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}
Пример #20
0
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
Пример #21
0
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
Пример #22
0
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
Пример #23
0
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)
Пример #24
0
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
Пример #25
0
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
Пример #27
0
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