📄 enum_branch.cpp
字号:
#include<math.h>
#include<stdlib.h>
#include"datastruct.h"
#include"sub_flow.h"
//处理含线路故障的事件的函数
void enum_branch(struct Gendata *tempgendata,struct Busdata *tempbusdata,struct Branchdata *tempbranchdata,
int Busnum,int Branchnum,int Gennum,int *balanceno,int *igen)
{
double total_load=0;//总负荷
double total_PG=0; //总发电机功率
// for(int i=0;i<Busnum;i++)
// {
// tempbusdata[i].PG=0;//将各节点发电机出力清零
// tempbusdata[i].maxPG=0;
// }
for(int i=0;i<Gennum;i++)
{
if(igen[i]==1)
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempgendata[i].linkno)
{
if(tempbusdata[j].PG>tempgendata[i].maxP)
tempbusdata[j].PG-=tempgendata[i].maxP;//重新设置各节点发电机出力
else
tempbusdata[j].PG=0;
tempbusdata[j].maxPG-=tempgendata[i].maxP;
break;
}
}
}
/*判断系统是否解列,如果解列则形成子系统*/
int flag,flag1,flag2;//flag记录搜索到的支路数,flag1记录搜索到的节点数,flag2循环标志符
int *flag3,*flag4,*flag5,*flag6;
flag3=new int[Busnum];///记录搜索到的节点标志符,搜到置1,反之置0
flag4=new int[Busnum];///记录搜索到节点号
flag5=new int[Branchnum];///记录搜索到的支路标志符,搜到置1,反之置0
flag6=new int[Branchnum];////记录搜索到的支路号
int startfind;
for(i=0;i<Busnum;i++)
{
*(flag3+i)=0;
*(flag4+i)=-1;
}
for(i=0;i<Branchnum;i++)
{
*(flag5+i)=0;
*(flag6+i)=-1;
}
flag=0;
flag1=1;
flag2=0;
//////////////////////////////////////////////////////////
while(flag2!=Busnum)
{
if(flag2==0)
{
startfind=0;//从0节点开始搜索
*(flag3+startfind)=1;
*(flag4+0)=startfind;
}
else if(flag2>0&&*(flag4+flag2)!=-1)
startfind=*(flag4+flag2);
for(i=0;i<Branchnum;i++)
{
if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].to)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].from)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
}
if(*(flag4+flag2)==-1)
flag2=Busnum-1;
flag2++;
}
///////////////////////////////////////////////////////////////
//////////第一次搜索结束//////////////////////////////////////
//////////////////////////////////////////////////////////////
if(flag1!=Busnum)////所找到的节点数不等于总的节点数,说明系统解列
{//////2
//形成子系统
int sub_busnum1,sub_branchnum1;
sub_busnum1=flag1;
struct Busdata *sub_busdata1;
struct Branchdata *sub_branchdata1;
sub_branchnum1=flag;
sub_busdata1=new struct Busdata[sub_busnum1];
sub_branchdata1=new struct Branchdata[sub_branchnum1];
//形成新的节点参数矩阵1
int j=0;
for(i=0;i<sub_busnum1;i++)
{
if(*(flag3+*(flag4+i))==1)
{
sub_busdata1[j]=tempbusdata[*(flag4+i)];
j++;
}
}
//形成新的支路参数矩阵1
j=0;
for(i=0;i<sub_branchnum1;i++)
{
if(tempbranchdata[*(flag6+i)].alrnum>0&&*(flag5+*(flag6+i))==1)
{
sub_branchdata1[j]=tempbranchdata[*(flag6+i)];
j++;
}
}
//计算子系统潮流程序,并进行过载、线路过载判断,负荷削减等操作
sub_flow(tempbusdata,tempbranchdata,tempgendata,Busnum,Branchnum,Gennum,igen,
sub_busdata1,sub_branchdata1,sub_busnum1,sub_branchnum1);
delete []sub_busdata1;
delete []sub_branchdata1;
sub_busdata1=NULL;
sub_branchdata1=NULL;
//printf("sub_system1\n");
/////////////////////子系统1
flag2=0;
while(flag2<(Busnum-sub_busnum1))
{
if(flag2==0)
{
for(i=0;i<Busnum;i++)
{
if(*(flag3+i)==0)
{
startfind=i;//从还未搜索到的节点开始搜索
break;
}
}
*(flag3+startfind)=1;
*(flag4+flag1)=startfind;
flag1++;
}
else if(flag2>0&&*(flag4+flag2+sub_busnum1)!=-1)
startfind=*(flag4+flag2+sub_busnum1);
for(i=0;i<Branchnum;i++)
{
if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].to)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].from)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
}
if(*(flag4+flag2+sub_busnum1)==-1)
flag2=Busnum-sub_busnum1-1;
flag2++;
}
int sub_busnum2,sub_branchnum2;
struct Busdata *sub_busdata2;
struct Branchdata *sub_branchdata2;
sub_busnum2=flag1-sub_busnum1;
sub_branchnum2=flag-sub_branchnum1;
sub_branchdata2=new struct Branchdata[sub_branchnum2];
sub_busdata2=new struct Busdata[sub_busnum2];
//形成新的节点参数矩阵2
j=0;
for(i=sub_busnum1;i<flag1;i++)
{
if(*(flag3+*(flag4+i))==1)
{
sub_busdata2[j]=tempbusdata[*(flag4+i)];
j++;
}
}
//形成新的支路参数矩阵2
j=0;
for(i=sub_branchnum1;i<flag;i++)
{
sub_branchdata2[j]=tempbranchdata[*(flag6+i)];
j++;
}
//计算子系统潮流程序,并进行过载、线路过载判断,负荷削减等操作
sub_flow(tempbusdata,tempbranchdata,tempgendata,Busnum,Branchnum,Gennum,igen,
sub_busdata2,sub_branchdata2,sub_busnum2,sub_branchnum2);
//printf("sub_system2\n");
delete []sub_busdata2;
delete []sub_branchdata2;
sub_busdata2=NULL;
sub_branchdata2=NULL;
/////////////子系统2///////////////
if(flag1<Busnum)//如果还未搜索完,则继续
{//////3
flag2=0;
while(flag2<(Busnum-sub_busnum1-sub_busnum2))
{
if(flag2==0)
{
for(i=0;i<Busnum;i++)
{
if(*(flag3+i)==0)
{
startfind=i;
break;
}
}
*(flag3+startfind)=1;
*(flag4+flag1)=startfind;
flag1++;
}
else if(flag2>0&&*(flag4+flag2+sub_busnum1+sub_busnum2)!=-1)
startfind=*(flag4+flag2+sub_busnum1+sub_busnum2);
for(i=0;i<Branchnum;i++)
{
if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].from==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
flag++;
}
for(int j=0;j<Busnum;j++)
{
if(tempbusdata[j].busno==tempbranchdata[i].to)
{
if(*(flag3+j)==0)
{
*(flag3+j)=1;
*(flag4+flag1)=j;
flag1++;
}
break;
}
}
}
else if(tempbranchdata[i].alrnum>0&&tempbranchdata[i].to==tempbusdata[startfind].busno)
{
if(*(flag5+i)==0)
{
*(flag5+i)=1;
*(flag6+flag)=i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -