def calc_islands(circuit: CalculationInputs, C_bus_bus, C_branch_bus, C_gen_bus, C_batt_bus, nbus, nbr, time_idx=None) -> List[CalculationInputs]: """ Partition the circuit in islands for the designated time intervals :param circuit: CalculationInputs instance with all the data regardless of the islands and the branch states :param C_bus_bus: bus-bus connectivity matrix :param C_branch_bus: branch-bus connectivity matrix :param C_gen_bus: gen-bus connectivity matrix :param C_batt_bus: battery-bus connectivity matrix :param nbus: number of buses :param nbr: number of branches :param time_idx: array with the time indices where this set of islands belongs to (if None all the time series are kept) :return: list of CalculationInputs instances """ # find the islands of the circuit islands = Graph(csc_matrix(C_bus_bus)).find_islands() # clear the list of circuits calculation_islands = list() # find the branches that belong to each island island_branches = list() if len(islands) > 1: # there are islands, pack the islands into sub circuits for island_bus_idx in islands: # get the branch indices of the island island_br_idx = get_branches_of_the_island(island_bus_idx, C_branch_bus) island_br_idx = np.sort(island_br_idx) # sort island_branches.append(island_br_idx) # indices of batteries and controlled generators that belong to this island gen_idx = np.where(C_gen_bus[:, island_bus_idx].sum(axis=0) > 0)[0] bat_idx = np.where( C_batt_bus[:, island_bus_idx].sum(axis=0) > 0)[0] # Get the island circuit (the bus types are computed automatically) # The island original indices are generated within the get_island function circuit_island = circuit.get_island(island_bus_idx, island_br_idx, gen_idx, bat_idx) if time_idx is not None: circuit_island.trim_profiles(time_idx=time_idx) # store the island calculation_islands.append(circuit_island) else: # Only one island # compile bus types circuit.consolidate() # only one island, no need to split anything calculation_islands.append(circuit) island_bus_idx = np.arange(start=0, stop=nbus, step=1, dtype=int) island_br_idx = np.arange(start=0, stop=nbr, step=1, dtype=int) # set the indices in the island too circuit.original_bus_idx = island_bus_idx circuit.original_branch_idx = island_br_idx if time_idx is not None: circuit.trim_profiles(time_idx=time_idx) # append a list with all the branch indices for completeness island_branches.append(island_br_idx) # return the list of islands return calculation_islands
def calc_islands( circuit: "StaticSnapshotIslandInputs", bus_active, C_bus_bus, C_branch_bus, C_bus_gen, C_bus_batt, nbus, nbr, time_idx=None, ignore_single_node_islands=False ) -> List["StaticSnapshotIslandInputs"]: """ Partition the circuit in islands for the designated time intervals :param circuit: CalculationInputs instance with all the data regardless of the islands and the branch states :param C_bus_bus: bus-bus connectivity matrix :param C_branch_bus: branch-bus connectivity matrix :param C_bus_gen: gen-bus connectivity matrix :param C_bus_batt: battery-bus connectivity matrix :param nbus: number of buses :param nbr: number of branches :param time_idx: array with the time indices where this set of islands belongs to (if None all the time series are kept) :param ignore_single_node_islands: Ignore the single node islands :return: list of CalculationInputs instances """ # find the islands of the circuit g = Graph(C_bus_bus=sp.csc_matrix(C_bus_bus), C_branch_bus=sp.csc_matrix(C_branch_bus), bus_states=bus_active) islands = g.find_islands() # clear the list of circuits calculation_islands = list() # find the branches that belong to each island island_branches = list() if len(islands) > 1: # there are islands, pack the islands into sub circuits for island_bus_idx in islands: if ignore_single_node_islands and len(island_bus_idx) <= 1: keep = False else: keep = True if keep: # get the branch indices of the island island_br_idx = g.get_branches_of_the_island(island_bus_idx) island_br_idx = np.sort(island_br_idx) # sort island_branches.append(island_br_idx) # indices of batteries and controlled generators that belong to this island gen_idx = np.where( C_bus_gen[island_bus_idx, :].sum(axis=0) > 0)[0] bat_idx = np.where( C_bus_batt[island_bus_idx, :].sum(axis=0) > 0)[0] # Get the island circuit (the bus types are computed automatically) # The island original indices are generated within the get_island function circuit_island = circuit.get_island(island_bus_idx, island_br_idx, gen_idx, bat_idx) # store the island calculation_islands.append(circuit_island) else: # Only one island # compile bus types circuit.consolidate() # only one island, no need to split anything calculation_islands.append(circuit) island_bus_idx = np.arange(start=0, stop=nbus, step=1, dtype=int) island_br_idx = np.arange(start=0, stop=nbr, step=1, dtype=int) # set the indices in the island too circuit.original_bus_idx = island_bus_idx circuit.original_branch_idx = island_br_idx # append a list with all the branch indices for completeness island_branches.append(island_br_idx) # return the list of islands return calculation_islands