📄 nflow_sub.cpp
字号:
{
// printf("map_ACun[%d].vset_ind==%d\n",I,map_ACun[I].vset_ind);
if(map_bs[map_nd[map_ACun[I].ind].ibs-1].AC_island==NOWISLAND)
{//
if(map_ACun[I].vset_ind>-1)//以后考虑人工设定
{
/* OLD
NOV++;
REGS[NOV]=map_nd[map_ACun[I].vset_ind].ibs-1;//PV节点与母线关系,指定vset_ind为PV节点
*/
//MOD BY DHW BEGIN 07.06.21
REGS[NOV]=map_nd[map_ACun[I].ind].ibs-1;//PV节点与母线关系
//MOD BY DHW END 07.06.21
//ADD BY DHW BEGIN
pv_rel_un[NOV][lv_pv_rel_un[NOV]]=I;//pv_rel_un[NOV]:从0开始
lv_pv_rel_un[NOV]++;
//ADD BY DHW END
map_bs[map_nd[map_ACun[I].ind].ibs-1].bs_type=BS_TYPE_PV;//MOD BY DHW typ_bs[map_nd[map_ACun[I].ind].ibs-1]=1
// printf("444:bs==%d,bs_type==%d\n",map_nd[map_ACun[I].ind].ibs-1,map_bs[map_nd[map_ACun[I].ind].ibs-1].bs_type);
// typ_bs[map_nd[map_ACun[I].ind].ibs-1]=BS_TYPE_PV;//MOD BY DHW typ_bs[map_nd[map_ACun[I].ind].ibs-1]=1
NOV++;
}
}
}
}
// printf("555:NOV= %d \n",NOV);
map_bs[ref_bs].ibus=lv_bus-1;
map_bus[lv_bus-1].ibs=ref_bs;
IBS[IV[ref_bs]+1]=IBS[IV[ref_bs]+1]-1;
IV[ref_bs]=0;
for(I=0;I<NOV;I++)
{
if(IV[REGS[I]]>0)
{
map_bs[REGS[I]].ibus=lv_bus-1-I-1;
map_bus[lv_bus-2-I].ibs=REGS[I];
IBS[IV[REGS[I]]+1]=IBS[IV[REGS[I]]+1]-1;
IV[REGS[I]]=0;
}
}
for(I=1;I<39;I++)
{
IBS[I+1]=IBS[I+1]+IBS[I];
}
for(I=0;I<lv_bs;I++)
{
if(IV[I]>0)
{
map_bus[IBS[IV[I]]-1].ibs=I;//map_bus[].ibs:实际序号
map_bs[I].ibus=IBS[IV[I]]-1;
IBS[IV[I]]=IBS[IV[I]]+1;
}
}
// for(I=0;I<lv_bus;I++)
// printf("bus_no=%d bs_no=%d\n",I+1,map_bus[I].ibs+1);
// for(I=0;I<lv_bs;I++)
// printf("bs_no=%d bus_no=%d\n",I+1,map_bs[I].ibus+1);//map_bs[I].ibus:实际序号
return(0);
}
int pf_build_y_matrix(int NOWISLAND)
{
int i1,i2,I,J,pos;
float T1,C1;
//初始化
for(i1=0;i1<lv_bus;i1++)
{
Ym[i1].lv_nz=0;
Ym[i1].x.val=0.0;
Ym[i1].g.val=0.0;
Ym[i1].b.val=0.0;
for(i2=0;i2<MX_NZ;i2++)
{
Ym[i1].nz[i2].x.val=0.0;
Ym[i1].nz[i2].g.val=0.0;
Ym[i1].nz[i2].b.val=0.0;
}
}
printf("lv_map_AClnbrh==%d\n",lv_map_AClnbrh);
for(i1=0;i1<lv_map_AClnbrh;i1++)
{
if(map_nd[map_AClnbrh[i1].ind].ibs>0)
{
if(map_bs[map_nd[map_AClnbrh[i1].ind].ibs-1].AC_island==NOWISLAND)
{
I=map_bs[map_nd[map_AClnbrh[i1].ind].ibs-1].ibus;
J=map_bs[map_nd[map_AClnbrh[i1].znd].ibs-1].ibus;
//printf("240:lnbrh=%s ibus=%d, zbus=%d, r=%f x=%f bch=%f g=%f b=%f\n",map_ACln[map_AClnbrh[i1].ACln_no].name,I,J,map_AClnbrh[i1].r,map_AClnbrh[i1].x,map_AClnbrh[i1].bch,map_AClnbrh[i1].g,map_AClnbrh[i1].b);
if(J<I)
{
pos=J;
J=I;
I=pos;
}
pos=-1;
for(i2=0;i2<Ym[I].lv_nz;i2++)
{
if(Ym[I].nz[i2].j==J)
{
pos=i2;
}
}
if(pos==-1)
{
pos=Ym[I].lv_nz;
Ym[I].nz[pos].j=J;
Ym[I].lv_nz++;
}
// printf("211:AClnbrh_no=%d ibus=%d zbus=%d pos=%d lv_nz=%d\n",i1+1,I,J,pos,Ym[I].lv_nz);
// if(fabs(map_AClnbrh[i1].x)<0.00001)
// printf("321:ln_name==%s, x==%f\n",map_ACln[map_AClnbrh[i1].ACln_no].name,map_AClnbrh[i1].x);
Ym[I].x.val=Ym[I].x.val-1.0/map_AClnbrh[i1].x;
Ym[I].g.val=Ym[I].g.val+map_AClnbrh[i1].g;
Ym[I].b.val=Ym[I].b.val+map_AClnbrh[i1].b+0.5*map_AClnbrh[i1].bch;
Ym[J].x.val=Ym[J].x.val-1.0/map_AClnbrh[i1].x;
Ym[J].g.val=Ym[J].g.val+map_AClnbrh[i1].g;
Ym[J].b.val=Ym[J].b.val+map_AClnbrh[i1].b+0.5*map_AClnbrh[i1].bch;
Ym[I].nz[pos].x.val=Ym[I].nz[pos].x.val+1.0/map_AClnbrh[i1].x;
Ym[I].nz[pos].g.val=Ym[I].nz[pos].g.val-map_AClnbrh[i1].g;
Ym[I].nz[pos].b.val=Ym[I].nz[pos].b.val-map_AClnbrh[i1].b;
}
}
}
// printf("\n");
for(i1=0;i1<lv_map_ACxfbrh;i1++)
{//K:1模型,变比在I侧,高等电力网络p12
if(map_nd[map_ACxfbrh[i1].ind].ibs>0)
{
if(map_bs[map_nd[map_ACxfbrh[i1].ind].ibs-1].AC_island==NOWISLAND)
{
I=map_bs[map_nd[map_ACxfbrh[i1].ind].ibs-1].ibus;
J=map_bs[map_nd[map_ACxfbrh[i1].znd].ibs-1].ibus;
C1=1.0/map_ACxfbrh[i1].x;
T1=1.0/map_ACxfbrh[i1].k;
// printf("C1==%f,T1==%f,\n",C1,T1);
//
// printf("Ym[%d].x==%f, Ym[%d].g==%f, Ym[%d].b==%f\n",I,Ym[I].x.val,I,Ym[I].g.val,I,Ym[I].b.val);
// printf("Ym[%d].x==%f, Ym[%d].g==%f, Ym[%d].b==%f\n",J,Ym[J].x.val,J,Ym[J].g.val,J,Ym[J].b.val);
Ym[I].x.val=Ym[I].x.val-C1;
Ym[I].g.val=Ym[I].g.val+map_ACxfbrh[i1].g*T1*T1;
Ym[I].b.val=Ym[I].b.val+map_ACxfbrh[i1].b*T1*T1;
Ym[J].x.val=Ym[J].x.val-C1;
Ym[J].g.val=Ym[J].g.val+map_ACxfbrh[i1].g;
Ym[J].b.val=Ym[J].b.val+map_ACxfbrh[i1].b;
// printf("Ym[%d].x==%f, Ym[%d].g==%f, Ym[%d].b==%f\n",I,Ym[I].x.val,I,Ym[I].g.val,I,Ym[I].b.val);
// printf("Ym[%d].x==%f, Ym[%d].g==%f, Ym[%d].b==%f\n",J,Ym[J].x.val,J,Ym[J].g.val,J,Ym[J].b.val);
if(J<I)
{
pos=J;
J=I;
I=pos;
}
pos=-1;
for(i2=0;i2<Ym[I].lv_nz;i2++)
{
if(Ym[I].nz[i2].j==J)
{
pos=i2;
}
}
if(pos==-1)
{
pos=Ym[I].lv_nz;
Ym[I].nz[pos].j=J;
Ym[I].lv_nz++;
}
// printf("Ym[%d].nz[%d].x==%f, Ym[%d].nz[%d].g==%f, Ym[%d].nz[%d].b==%f\n",I,pos,Ym[I].nz[pos].x.val,I,pos,Ym[I].nz[pos].g.val,I,pos,Ym[I].nz[pos].b.val);
Ym[I].nz[pos].x.val=Ym[I].nz[pos].x.val+C1;
Ym[I].nz[pos].g.val=Ym[I].nz[pos].g.val-map_ACxfbrh[i1].g*T1;
Ym[I].nz[pos].b.val=Ym[I].nz[pos].b.val-map_ACxfbrh[i1].b*T1;
// printf("Ym[%d].nz[%d].x==%f, Ym[%d].nz[%d].g==%f, Ym[%d].nz[%d].b==%f\n",I,pos,Ym[I].nz[pos].x.val,I,pos,Ym[I].nz[pos].g.val,I,pos,Ym[I].nz[pos].b.val);
}
}
}
printf("lv_map_ACcpbrh==%d\n",lv_map_ACcpbrh);
for(i1=0;i1<lv_map_ACcpbrh;i1++)
{
if(map_nd[map_ACcpbrh[i1].ind].ibs>0)
{
if(map_bs[map_nd[map_ACcpbrh[i1].ind].ibs-1].AC_island==NOWISLAND)
{
I=map_bs[map_nd[map_ACcpbrh[i1].ind].ibs-1].ibus;
J=map_bs[map_nd[map_ACcpbrh[i1].znd].ibs-1].ibus;
if(J<I)
{
pos=J;
J=I;
I=pos;
}
pos=-1;
for(i2=0;i2<Ym[I].lv_nz;i2++)
{
if(Ym[I].nz[i2].j==J)
{
pos=i2;
}
}
if(pos==-1)
{
pos=Ym[I].lv_nz;
Ym[I].nz[pos].j=J;
Ym[I].lv_nz++;
}
//MOD BY DHW 07.07.05 C1=100.0/map_ACcp[i1].mvar;
C1=map_ACcpbrh[i1].b;//MOD BY DHW 07.07.05
Ym[I].x.val=Ym[I].x.val-C1;
Ym[I].b.val=Ym[I].b.val+C1;
Ym[J].x.val=Ym[J].x.val-C1;
Ym[J].b.val=Ym[J].b.val+C1;
Ym[I].nz[pos].x.val=Ym[I].nz[pos].x.val+C1;
Ym[I].nz[pos].b.val=Ym[I].nz[pos].b.val-C1;
}
}
}
printf("lv_map_ACcpin==%d\n",lv_map_ACcpin);
//mod by dhw 08.04.16 begin
//并联容抗器的处理
for(i1=0;i1<lv_map_ACcpin;i1++)
{
if(map_nd[map_ACcpin[i1].ind].ibs>0)
{
if(map_bs[map_nd[map_ACcpin[i1].ind].ibs-1].AC_island==NOWISLAND)
{
I=map_bs[map_nd[map_ACcpin[i1].ind].ibs-1].ibus;
// C1=100.0/map_ACcp[map_ACcpin[i1].ACcp_no].mvar;
// Ym[I].b.val=Ym[I].b.val+C1;
}
}
}
//mod by dhw 08.04.16 end
//#ifdef _DEBUG
// for(I=0;I<lv_bus;I++)
// {
//
// printf("300:bus_no=%d Ym_b=%f Ym_g=%f lv_nz=%d\n",I,Ym[I].b.val,Ym[I].g.val,Ym[I].lv_nz);
// for(J=0;J<Ym[I].lv_nz;J++)
// {
//
// printf("800:G[%d][%d]=%f B[%d][%d]=%f\n",I,Ym[I].nz[J].j,Ym[I].nz[J].g.val,I,Ym[I].nz[J].j,Ym[I].nz[J].b.val);
// }
// }
//#endif
return(0);
}
int powerflow(int NOWISLAND)
{
int ret;
printf("******************************* cal-flow of island %d% begin*************\n",NOWISLAND);
powerflow_com(NOWISLAND);
if(NEWT_FLAG==0)
{
ret=powerflow_pq(NOWISLAND);
}
if(NEWT_FLAG==1)
{
ret=powerflow_newton(NOWISLAND);
}
printf("******************************* cal-flow of island %d% end *************\n",NOWISLAND);
if(ret==RET_OK)
{
// print_debug_info(11);
pf_bus_to_bs(NOWISLAND);
//岛加速功率
map_AC_island[NOWISLAND-1].p_acc=map_AC_island[NOWISLAND-1].p_acc-map_AC_island[NOWISLAND-1].p_loss;
printf("333:ISLAND[%d].p_acc==%f, p_loss==%f\n",NOWISLAND,map_AC_island[NOWISLAND-1].p_acc,map_AC_island[NOWISLAND-1].p_loss);
return RET_OK;
}
else
{
return RET_FA;
}
}
///////////////////////////////////
int powerflow_newton(int NOWISLAND)
{//计算指定岛潮流
// powerflow_com(NOWISLAND);
while(IT<MAX_ITER)
{
printf("#####################NEWTON:iter_num: %d#################################\n",IT+1);
cjpq_newton(NOWISLAND);
// print_debug_info(8);
if(DYN_FLAG==1)
{
dy_xi_dpx(NOWISLAND);
dy_dpl(NOWISLAND);
}
printf("111:max_dp==%f , max_dq==%f\n",MXP_ITER[IT],MXQ_ITER[IT]);
if(fabs(MXP_ITER[IT])>eps_max||fabs(MXQ_ITER[IT])>eps_max)
{
printf("cal flow fail end!, iter_num: %d !\n\n",IT+1);
// print_debug_info(11);
return RET_FA;
}
else if(fabs(MXP_ITER[IT])>eps_set||fabs(MXQ_ITER[IT])>eps_set)
{
fact_newton(NOWISLAND);//牛顿法雅可比矩阵因子表分解,07.04.28
qjj_newton(NOWISLAND);//牛顿法前代回代运算
print_debug_info(11);
}
else
{
// print_debug_info(11);
printf("cal flow success end!!!!, iter_num: %d !\n\n",IT+1);
break;
}
IT++;
}
// print_debug_info(11);
// pf_bus_to_bs(NOWISLAND);
//
// //岛加速功率
// map_AC_island[NOWISLAND-1].p_acc=map_AC_island[NOWISLAND-1].p_acc-map_AC_island[NOWISLAND-1].p_loss;
//
// printf("333:ISLAND[%d].p_acc==%f, p_loss==%f\n",NOWISLAND,map_AC_island[NOWISLAND-1].p_acc,map_AC_island[NOWISLAND-1].p_loss);
return RET_OK;
}
int powerflow_com(int NOWISLAND)
{
// print_debug_info(16);
// print_debug_info(17);
// print_debug_info(18);
pf_busordering(NOWISLAND);
map_AC_island[NOWISLAND-1].p_swm=0.0;
map_AC_island[NOWISLAND-1].p_acc=0.0;
// print_debug_info(19);
print_debug_info(1);
// print_debug_info(20);
// print_debug_info(6);
// print_debug_info(5);
// print_debug_info(14);
pf_build_y_matrix(NOWISLAND);
// print_debug_info(4);
pf_businjections(NOWISLAND);
pf_clear_iter(NOWISLAND);
// print_debug_info(11);
// print_debug_info(22);
return RET_OK;
}
int calc_dev_I()
{
//计算节点和支路电流
// for(i=0;i<MX$BS;i++){
// if(netbus_->I$ISLAND_BS[i]<1)
// netbus_->KV_BS[i]=0.0;
// }
//
// for(i=0;i<netmom_->LV$UN;i++) {
// netbus_->I_UN[i]=0.0;
// if(netbus_->I$BS_ND[netparm_->I$ND_UN[i]-1]>0){
// if(netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_UN[i]-1]-1]>3.0){
// if(fabs(netbus_->W_UN[i])>0.01||fabs(netbus_->R_UN[i])>0.01){
// netbus_->I_UN[i]=(1000.0/1.732)*sqrt(netbus_->W_UN[i]*netbus_->W_UN[i]+netbus_->R_UN[i]*netbus_->R_UN[i])/netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_UN[i]-1]-1];
// }
// }
// }
// }
//
// for(i=0;i<netmom_->LV$LD;i++) {
// netbus_->I_LD[i]=0.0;
// if(netbus_->I$BS_ND[netparm_->I$ND_LD[i]-1]>0){
// if(netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_LD[i]-1]-1]>3.0){
// if(fabs(netbus_->W_LD[i])>0.01||fabs(netbus_->R_LD[i])>0.01){
// netbus_->I_LD[i]=(1000.0/1.732)*sqrt(netbus_->W_LD[i]*netbus_->W_LD[i]+netbus_->R_LD[i]*netbus_->R_LD[i])/netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_LD[i]-1]-1];
// }
// }
// }
// }
//
// for(i=0;i<netmom_->LV$LN;i++) {
// j=netparm_->I$LN2_LN[i]-1;
// k=netparm_->Z$LN2_LN[i]-1;
// netbus_->PLAST_LN2[j]=0.0;
// netbus_->PLAST_LN2[k]=0.0;
// if(netbus_->KV_BS[netbus_->I$BS_ND[netparm_->I$ND_LN[i]-1]-1]>20.001){
// if(fabs(netbus_->W_LN2[j])>0.01||fabs(netbus_->R_LN2[j])>0.01){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -