def pf_solution_single_slack(baseMVA, bus, gen, branch, Ybus, Yf, Yt, V, ref, ref_gens, Ibus=None): """ faster version of pfsoln for a grid with a single slack bus NOTE: Do not use in combination with shunts (check if ppc["bus"][:, GS/BS] are != 0.) NOTE: Do not use in combination with voltage dependend loads """ # ----- update bus voltages ----- _update_v(bus, V) # ----- update/compute branch power flows ----- branch = _update_branch_flows(Yf, Yt, V, baseMVA, branch) p_bus = bus[:, PD].sum() q_bus = bus[:, QD].sum() p_loss = branch[:, [PF, PT]].sum() q_loss = branch[:, [QF, QT]].sum() # slack p = sum of branch losses and p demand at all buses gen[:, PG] = p_loss.real + p_bus # branch p losses + p demand gen[:, QG] = q_loss.real + q_bus # branch q losses + q demand return bus, gen, branch
def pfsoln(baseMVA, bus, gen, branch, Ybus, Yf, Yt, V, ref, ref_gens, Ibus=None): """Updates bus, gen, branch data structures to match power flow soln. @author: Ray Zimmerman (PSERC Cornell) @author: Richard Lincoln """ # generator info on = find(gen[:, GEN_STATUS] > 0) # which generators are on? gbus = gen[on, GEN_BUS].astype(int) # what buses are they at? # xward: add ref buses that are not at the generators xbus = setdiff1d(ref, gbus) # compute total injected bus powers Ibus = zeros(len(V)) if Ibus is None else Ibus Sbus = V[gbus] * conj(Ybus[gbus, :] * V - Ibus[gbus]) Sbus_xw = V[xbus] * conj(Ybus[xbus, :] * V - Ibus[xbus]) _update_v(bus, V) # update gen results _update_q(baseMVA, bus, gen, gbus, Sbus, on) _update_p(baseMVA, bus, gen, ref, gbus, on, r_[Sbus, Sbus_xw], ref_gens) # ----- update/compute branch power flows ----- branch = _update_branch_flows(Yf, Yt, V, baseMVA, branch) return bus, gen, branch
def ppci_to_pfsoln(ppci, options): internal = ppci["internal"] if options["only_v_results"]: # time series relevant hack which ONLY saves V from ppci _update_v(internal["bus"], internal["V"]) return internal["bus"], internal["gen"], internal["branch"] else: # reads values from internal ppci storage to bus, gen, branch and returns it if options['distributed_slack']: # consider buses with non-zero slack weights as if they were slack buses, # and gens with non-zero slack weights as if they were reference machines # this way, the function pfsoln will extract results for distributed slack gens, too # also, the function pfsoln will extract results for the PQ buses for xwards gens_with_slack_weights = find(internal["gen"][:, SL_FAC] != 0) # gen_buses_with_slack_weights = internal["gen"][gens_with_slack_weights, GEN_BUS].astype(int32) buses_with_slack_weights = internal["bus"][find( internal["bus"][:, SL_FAC_BUS] != 0), BUS_I].astype(int32) # buses_with_slack_weights = union1d(gen_buses_with_slack_weights, buses_with_slack_weights) ref = union1d(internal["ref"], buses_with_slack_weights) ref_gens = union1d(internal["ref_gens"], gens_with_slack_weights) else: ref = internal["ref"] ref_gens = internal["ref_gens"] _, pfsoln = _get_numba_functions(ppci, options) result_pfsoln = pfsoln(internal["baseMVA"], internal["bus"], internal["gen"], internal["branch"], internal["Ybus"], internal["Yf"], internal["Yt"], internal["V"], ref, ref_gens) return result_pfsoln
def ppci_to_pfsoln(ppci, options): internal = ppci["internal"] if options["only_v_results"]: # time series relevant hack which ONLY saves V from ppci _update_v(internal["bus"], internal["V"]) return internal["bus"], internal["gen"], internal["branch"] else: # reads values from internal ppci storage to bus, gen, branch and returns it _, pfsoln = _get_numba_functions(ppci, options) return pfsoln(internal["baseMVA"], internal["bus"], internal["gen"], internal["branch"], internal["Ybus"], internal["Yf"], internal["Yt"], internal["V"], internal["ref"], internal["ref_gens"])
def pfsoln(baseMVA, bus, gen, branch, Ybus, Yf, Yt, V, ref, ref_gens, Ibus=None): """Updates bus, gen, branch data structures to match power flow soln. @author: Ray Zimmerman (PSERC Cornell) @author: Richard Lincoln """ ## generator info on = find(gen[:, GEN_STATUS] > 0) ## which generators are on? gbus = gen[on, GEN_BUS].astype(int) ## what buses are they at? ## compute total injected bus powers Ibus = zeros(len(V)) if Ibus is None else Ibus Sbus = V[gbus] * conj(Ybus[gbus, :] * V - Ibus[gbus]) _update_v(bus, V) _update_q(baseMVA, bus, gen, gbus, Sbus, on) _update_p(baseMVA, bus, gen, ref, gbus, on, Sbus, ref_gens) ##----- update/compute branch power flows ----- ## complex power at "from" bus Sf = V[real(branch[:, F_BUS]).astype(int)] * calc_branch_flows( Yf.data, Yf.indptr, Yf.indices, V, baseMVA, Yf.shape[0]) ## complex power injected at "to" bus St = V[real(branch[:, T_BUS]).astype(int)] * calc_branch_flows( Yt.data, Yt.indptr, Yt.indices, V, baseMVA, Yt.shape[0]) branch[:, [PF, QF, PT, QT]] = c_[Sf.real, Sf.imag, St.real, St.imag] return bus, gen, branch