def get_nx_ppc(net): _init_nx_options(net) ppc = _init_ppc(net) _build_bus_ppc(net, ppc) return ppc
def _pd2ppc(net, is_elems, calculate_voltage_angles=False, enforce_q_lims=False, trafo_model="pi", init_results=False): """ Converter Flow: 1. Create an empty pypower datatructure 2. Calculate loads and write the bus matrix 3. Build the gen (Infeeder)- Matrix 4. Calculate the line parameter and the transformer parameter, and fill it in the branch matrix. Order: 1st: Line values, 2nd: Trafo values INPUT: **net** - The Pandapower format network **is_elems** - In service elements from the network (see _select_is_elements()) RETURN: **ppc** - The simple matpower format network. Which consists of: ppc = { "baseMVA": 1., *float* "version": 2, *int* "bus": np.array([], dtype=float), "branch": np.array([], dtype=np.complex128), "gen": np.array([], dtype=float) **ppci** - The "internal" pypower format network for PF calculations **bus_lookup** - Lookup Pandapower -> ppc / ppci indices """ # init empty ppc ppc = {"baseMVA": 1., "version": 2, "bus": np.array([], dtype=float), "branch": np.array([], dtype=np.complex128), "gen": np.array([], dtype=float)} # generate ppc['bus'] and the bus lookup bus_lookup = _build_bus_ppc(net, ppc, is_elems, init_results) # generate ppc['gen'] and fills ppc['bus'] with generator values (PV, REF nodes) _build_gen_ppc(net, ppc, is_elems, bus_lookup, enforce_q_lims, calculate_voltage_angles) # generate ppc['branch'] and directly generates branch values _build_branch_ppc(net, ppc, is_elems, bus_lookup, calculate_voltage_angles, trafo_model) # adds P and Q for loads / sgens in ppc['bus'] (PQ nodes) _calc_loads_and_add_on_ppc(net, ppc, is_elems, bus_lookup) # adds P and Q for shunts, wards and xwards (to PQ nodes) _calc_shunts_and_add_on_ppc(net, ppc, is_elems, bus_lookup) # adds auxilary buses for open switches at branches _switch_branches(net, ppc, is_elems, bus_lookup) # add auxilary buses for out of service buses at in service lines. # Also sets lines out of service if they are connected to two out of service buses _branches_with_oos_buses(net, ppc, is_elems, bus_lookup) # sets buses out of service, which aren't connected to branches / REF buses _set_isolated_buses_out_of_service(net, ppc) # generates "internal" ppci format (for powerflow calc) from "external" ppc format and updates the bus lookup # Note: Also reorders buses and gens in ppc ppci, bus_lookup = _ppc2ppci(ppc, bus_lookup) # add lookup with indices before any busses were fused bus_lookup["before_fuse"] = dict( zip(net["bus"].index.values, np.arange(len(net["bus"].index.values)))) return ppc, ppci, bus_lookup
def _pd2ppc(net): """ Converter Flow: 1. Create an empty pypower datatructure 2. Calculate loads and write the bus matrix 3. Build the gen (Infeeder)- Matrix 4. Calculate the line parameter and the transformer parameter, and fill it in the branch matrix. Order: 1st: Line values, 2nd: Trafo values 5. if opf: make opf objective (gencost) 6. convert internal ppci format for pypower powerflow / opf without out of service elements and rearanged buses INPUT: **net** - The pandapower format network OUTPUT: **ppc** - The simple matpower format network. Which consists of: ppc = { "baseMVA": 1., *float* "version": 2, *int* "bus": np.array([], dtype=float), "branch": np.array([], dtype=np.complex128), "gen": np.array([], dtype=float), "gencost" = np.array([], dtype=float), only for OPF "internal": { "Ybus": np.array([], dtype=np.complex128) , "Yf": np.array([], dtype=np.complex128) , "Yt": np.array([], dtype=np.complex128) , "branch_is": np.array([], dtype=bool) , "gen_is": np.array([], dtype=bool) } **ppci** - The "internal" pypower format network for PF calculations """ # select elements in service (time consuming, so we do it once) net["_is_elements"] = aux._select_is_elements_numba(net) # get options mode = net["_options"]["mode"] check_connectivity = net["_options"]["check_connectivity"] ppc = _init_ppc(net) if mode == "opf": # additional fields in ppc ppc["gencost"] = np.array([], dtype=float) # init empty ppci ppci = copy.deepcopy(ppc) # generate ppc['bus'] and the bus lookup _build_bus_ppc(net, ppc) # generate ppc['gen'] and fills ppc['bus'] with generator values (PV, REF nodes) _build_gen_ppc(net, ppc) # generate ppc['branch'] and directly generates branch values _build_branch_ppc(net, ppc) # adds P and Q for loads / sgens in ppc['bus'] (PQ nodes) if mode == "sc": _add_gen_impedances_ppc(net, ppc) _add_motor_impedances_ppc(net, ppc) else: _calc_loads_and_add_on_ppc(net, ppc) # adds P and Q for shunts, wards and xwards (to PQ nodes) _calc_shunts_and_add_on_ppc(net, ppc) # adds auxilary buses for open switches at branches _switch_branches(net, ppc) # add auxilary buses for out of service buses at in service lines. # Also sets lines out of service if they are connected to two out of service buses _branches_with_oos_buses(net, ppc) if check_connectivity: # sets islands (multiple isolated nodes) out of service isolated_nodes, _, _ = aux._check_connectivity(ppc) net["_is_elements"] = aux._select_is_elements_numba(net, isolated_nodes) # sets buses out of service, which aren't connected to branches / REF buses aux._set_isolated_buses_out_of_service(net, ppc) # generates "internal" ppci format (for powerflow calc) from "external" ppc format and updates the bus lookup # Note: Also reorders buses and gens in ppc ppci = _ppc2ppci(ppc, ppci, net) if mode == "opf": # make opf objective ppci = _make_objective(ppci, net) return ppc, ppci
def _pd2ppc(net, sequence=None): """ Converter Flow: 1. Create an empty pypower datatructure 2. Calculate loads and write the bus matrix 3. Build the gen (Infeeder)- Matrix 4. Calculate the line parameter and the transformer parameter, and fill it in the branch matrix. Order: 1st: Line values, 2nd: Trafo values 5. if opf: make opf objective (gencost) 6. convert internal ppci format for pypower powerflow / opf without out of service elements and rearanged buses INPUT: **net** - The pandapower format network **sequence** - Used for three phase analysis ( 0 - Zero Sequence 1 - Positive Sequence 2 - Negative Sequence ) OUTPUT: **ppc** - The simple matpower format network. Which consists of: ppc = { "baseMVA": 1., *float* "version": 2, *int* "bus": np.array([], dtype=float), "branch": np.array([], dtype=np.complex128), "gen": np.array([], dtype=float), "gencost" = np.array([], dtype=float), only for OPF "internal": { "Ybus": np.array([], dtype=np.complex128) , "Yf": np.array([], dtype=np.complex128) , "Yt": np.array([], dtype=np.complex128) , "branch_is": np.array([], dtype=bool) , "gen_is": np.array([], dtype=bool) } **ppci** - The "internal" pypower format network for PF calculations """ # select elements in service (time consuming, so we do it once) net["_is_elements"] = aux._select_is_elements_numba(net, sequence=sequence) # Gets network configurations mode = net["_options"]["mode"] check_connectivity = net["_options"]["check_connectivity"] calculate_voltage_angles = net["_options"]["calculate_voltage_angles"] ppc = _init_ppc(net, mode=mode, sequence=sequence) # generate ppc['bus'] and the bus lookup _build_bus_ppc(net, ppc) if sequence == 0: from pandapower.pd2ppc_zero import _add_ext_grid_sc_impedance_zero, _build_branch_ppc_zero # Adds external grid impedance for 3ph and sc calculations in ppc0 _add_ext_grid_sc_impedance_zero(net, ppc) # Calculates ppc0 branch impedances from branch elements _build_branch_ppc_zero(net, ppc) else: # Calculates ppc1/ppc2 branch impedances from branch elements _build_branch_ppc(net, ppc) # Adds P and Q for loads / sgens in ppc['bus'] (PQ nodes) if mode == "sc": _add_gen_impedances_ppc(net, ppc) _add_motor_impedances_ppc(net, ppc) else: _calc_pq_elements_and_add_on_ppc(net, ppc, sequence=sequence) # adds P and Q for shunts, wards and xwards (to PQ nodes) _calc_shunts_and_add_on_ppc(net, ppc) # adds auxilary buses for open switches at branches _switch_branches(net, ppc) # Adds auxilary buses for in service lines with out of service buses. # Also deactivates lines if they are connected to two out of service buses _branches_with_oos_buses(net, ppc) if check_connectivity: if sequence in [None, 1, 2]: # sets islands (multiple isolated nodes) out of service if "opf" in mode: net["_isolated_buses"], _, _ = aux._check_connectivity_opf(ppc) else: net["_isolated_buses"], _, _ = aux._check_connectivity(ppc) net["_is_elements_final"] = aux._select_is_elements_numba( net, net._isolated_buses, sequence) else: ppc["bus"][net._isolated_buses, BUS_TYPE] = NONE net["_is_elements"] = net["_is_elements_final"] else: # sets buses out of service, which aren't connected to branches / REF buses aux._set_isolated_buses_out_of_service(net, ppc) _build_gen_ppc(net, ppc) if "pf" in mode: _check_for_reference_bus(ppc) aux._replace_nans_with_default_limits(net, ppc) # generates "internal" ppci format (for powerflow calc) # from "external" ppc format and updates the bus lookup # Note: Also reorders buses and gens in ppc ppci = _ppc2ppci(ppc, net) if mode == "pf": # check if any generators connected to the same bus have different voltage setpoints _check_voltage_setpoints_at_same_bus(ppc) if calculate_voltage_angles: _check_voltage_angles_at_same_bus(net, ppci) if mode == "opf": # make opf objective ppci = _make_objective(ppci, net) return ppc, ppci