You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
4.2 KiB

function [nIslands,islands,refs]=searchIslands(nodes,links)
% Search all islands in a system
%
% FUNCTION searchIslands
%
% Author: Rui Yao <ruiyao@ieee.org>
%
% Copyright (C) 2021, UChicago Argonne, LLC. All rights reserved.
%
% OPEN SOURCE LICENSE
%
% Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
%
% 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
% 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
% 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
%
%
% ******************************************************************************************************
% DISCLAIMER
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
% WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
% PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
% DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
% CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
% OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
% ***************************************************************************************************
%
% INPUT
% nodes - bus numbers
% linkes - from and to terminals of all the branches
%
% OUTPUT
% nIslands - number of islands
% islands - the index of the island that the bus is in
% refs - the indexes of reference buses
%
% islandCode=nodes;%assume that nodes are listed as 1:nBus.
%
% nLine=size(links,1);
% for i=1:nLine
% from=links(i,1);
% to=links(i,2);
%
% fromIsland=islandCode(from);
% toIsland=islandCode(to);
%
% if fromIsland<toIsland
% islandCode(islandCode==toIsland)=fromIsland;
% elseif fromIsland>toIsland
% islandCode(islandCode==fromIsland)=toIsland;
% end
% end
%
% cntIsland=islandCode-nodes;
% nIslands=sum(cntIsland==0);
% islands=islandCode;
% islandBusNumber=find(cntIsland==0);
%
% for i=1:nIslands
% islands(islandCode==islandBusNumber(i))=i;
% end
% [sislands,iislands]=sort(islands);
% if size(islands,1)>size(islands,2)
% refTag=sislands'-[0,sislands(1:(length(sislands)-1))'];
% else
% refTag=sislands-[0,sislands(1:(length(sislands)-1))];
% end
% refs=iislands(refTag~=0);
global IS_OCTAVE;
nNodes=max([links(:,1);links(:,2);nodes]);
A=sparse([links(:,1);links(:,2)],[links(:,2);links(:,1)],[ones(size(links(:,1)));ones(size(links(:,1)))],nNodes,nNodes);
if IS_OCTAVE
islands=conncompx(A);
else
G=graph(A);
[islands] = conncomp(G);
end
nIslands=max(islands);
if size(islands,1)<size(islands,2)
islands=islands';
end
[sislandsx,iislandsx]=sort(islands);
refTagx=sislandsx-[0;sislandsx(1:(length(sislandsx)-1))];
refs=iislandsx(refTagx~=0);
end
function islands=conncompx(adj)
nNodes=size(adj,1);
visited=zeros(nNodes,1);
islands=zeros(nNodes,1);
is=1;
while 1
s=find(visited==0,1);
if isempty(s)
break;
end
nb=s;
nbt=nb;
while 1
sz=length(nb);
szt=length(nbt);
nbx=mod(find(adj(:,nb(1:sz))~=0)-1,nNodes)+1;
% nbx=zeros(0,1);
% for i=1:sz
% nbx=[nbx;find(adj(:,nb(i))~=0)];
% end
nb=unique(nbx);
nbt=unique([nbt;nb]);
if length(nbt)==szt
break;
end
end
islands(nbt)=is;
visited(nbt)=1;
is=is+1;
end
end