📄 writesol.c
字号:
/* Write solution in files: -Printed output. -Bus voltages and angles. -IEEE common format for SSSP or other P.F. programs. */#include "write.h"#include <string.h> /* FACTS *//* --------------- Output ----------------- */#ifdef ANSIPROTOvoid Output(INDEX Iter,char *File1,char *str)#elsevoid Output(Iter,File1,str)INDEX Iter;char *File1,*str;#endif{ ACbusData *ACptr,*From,*To; AClist *ACLptr; DClist *DCLptr; DCbusData *DCptrR,*DCptrI,*DCptr,*DCptrp; ElementData *Eptr; ElementList *ELptr; AreaData *Aptr; VALUETYPE P,Q,Pl,Ql,Pij,Qij,Pji,Qji,Vi,di,Vj,dj,Iij,Iji,I,ratio; VALUETYPE G,B,Gp,Bp,Gi,Bi,Gj,Bj,Pg,KVi,KVj,KV,Qm,delta,theta,vals; FILE *OutFile; INDEX i,j; SVCbusData *SVCptr; /* FACTS */ TCSCbusData *TCSCptr; /* FACTS */ STATCOMbusData *STATCOMptr; /* FACTS */ VALUETYPE Xc,Max,Vn; /* FACTS */ OutFile=OpenOutput(File1); fCustomPrint(OutFile,"\n%s\n",str); i=0; while(i<=2 && dataPtr->Title[0][0]!='\0'){ fCustomPrint(OutFile,"%s",dataPtr->Title[i]); i++; } if (!flagH) lambda_o=0; fCustomPrint(OutFile," Loading factor -> %-10.6lg\n",lambda+lambda_o); fCustomPrint(OutFile," AC buses -> %d\n",Nac); fCustomPrint(OutFile," PV buses -> %d\n",Nvolt); fCustomPrint(OutFile," X buses -> %d\n",NXvolt); fCustomPrint(OutFile," Z buses -> %d\n",NZvolt); fCustomPrint(OutFile," AC elem. -> %d\n",NacEl); fCustomPrint(OutFile," V Reg. Trf. -> %d\n",NregV); fCustomPrint(OutFile," PQ Reg. Trf. -> %d\n",NregPQ); fCustomPrint(OutFile," DC buses -> %d\n",Ndc); fCustomPrint(OutFile," DC lines -> %d\n",Ndc/2); fCustomPrint(OutFile," SVCs -> %d\n",Nsvc); /* FACTS */ fCustomPrint(OutFile," TCSCs -> %d\n",Ntcsc); /* FACTS */ fCustomPrint(OutFile," STATCOMs -> %d\n",Nstatcom); /* FACTS */ fCustomPrint(OutFile," No. Areas -> %d\n",Narea); fCustomPrint(OutFile," Iterations -> %d (Maximum = %d)\n",Iter,MaxIter); fCustomPrint(OutFile," Max. p.u. mismatch -> %-8.4lg (Tolerance = %-8.4lg)\n",MaxdFi,Tol); fCustomPrint(OutFile," Reference Bus(es) -> "); i=0; for (ACptr=dataPtr->ACbus;ACptr!=NULL;ACptr=ACptr->Next) if(strpbrk(ACptr->Type,"S")){ if (i>0) fCustomPrint(OutFile," "); fCustomPrint(OutFile,"%d %s (Angle=%6.2lf deg.)\n",ACptr->Num,ACptr->Name,ACptr->Ang/K3); i++; } if (i==0) fCustomPrint(OutFile,"\n"); fCustomPrint(OutFile,"\n"); if (Narea<2) ACptr=dataPtr->ACbus; else { Aptr=dataPtr->Area; ACLptr=Aptr->AC; ACptr=ACLptr->AC; } fCustomPrint(OutFile,"\n ***** AC RESULTS *****\n"); fCustomPrint(OutFile," L=lower limit H=higher limit O=over limit U=under limit\n"); fCustomPrint(OutFile,"--|----|------------|------|-------|--------|--------|--------|----|------------|-|--------|--------|--------|-------|-|-----------------\n"); fCustomPrint(OutFile," A i Bus V(pu) V(kV) Pg(MW) Pload Pshunt| j Bus C Pij Plosses |Iij|(A) kVi/kVj T Controlled Bus \n"); fCustomPrint(OutFile," n Name d(deg) d(rad) Qg(MVAR) Qload Qshunt| Name r Qij Qlosses a(deg) k Name \n"); while(ACptr!=NULL){ fCustomPrint(OutFile,"--|----|------------|------|-------|--------|--------|--------|----|------------|-|--------|--------|--------|-------|-|----|------------\n"); if(ACptr->Area!=NULL) { fCustomPrint(OutFile,"%2d ",ACptr->Area->N); } else fCustomPrint(OutFile,"%2d ",0); fCustomPrint(OutFile,"%4d ",ACptr->Num); fCustomPrint(OutFile,"%12s ",ACptr->Name); fCustomPrint(OutFile,"%6.4lf ",ACptr->V); KVi=ACptr->KV; if (KVi > 0) fCustomPrint(OutFile,"%7.2lf",KVi*ACptr->V); else fCustomPrint(OutFile,"%7s",""); if(ACptr->Vmax==ACptr->Vmin) { if(ACptr->Vlmax==ACptr->Vlmin) fCustomPrint(OutFile," "); else if(ACptr->V==ACptr->Vlmin) fCustomPrint(OutFile,"L"); else if(ACptr->V==ACptr->Vlmax) fCustomPrint(OutFile,"H"); else if(ACptr->V<ACptr->Vlmin) fCustomPrint(OutFile,"U"); else if(ACptr->V>ACptr->Vlmax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); } else if(ACptr->V==ACptr->Vmin) fCustomPrint(OutFile,"L"); else if(ACptr->V==ACptr->Vmax) fCustomPrint(OutFile,"H"); else if(ACptr->V<ACptr->Vmin) fCustomPrint(OutFile,"U"); else if(ACptr->V>ACptr->Vmax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); Pg=ACptr->PG; fCustomPrint(OutFile,"%8.2lf",Pg*Sn); if(Pg==ACptr->Pmax) fCustomPrint(OutFile,"H"); else if(Pg>ACptr->Pmax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); Pl=(ACptr->Pn+lambda*ACptr->Pnl)*pow(ACptr->V,ACptr->a)+ (ACptr->Pz+lambda*ACptr->Pzl)*ACptr->V*ACptr->V; Ql=(ACptr->Qn+lambda*ACptr->Qnl)*pow(ACptr->V,ACptr->b)+ (ACptr->Qz+lambda*ACptr->Qzl)*ACptr->V*ACptr->V; fCustomPrint(OutFile,"%8.2lf ",Pl*Sn); fCustomPrint(OutFile,"%8.2lf|",ACptr->G*ACptr->V*ACptr->V*Sn); i=0; /* -------------------------------------- DC element results ------------------------------------------- */ for (DCLptr=ACptr->DC;DCLptr!=NULL;DCLptr=DCLptr->Next) { if (i!=0) fCustomPrint(OutFile,"%62s|",""); DCptr=DCLptr->DC; fCustomPrint(OutFile," DC %-12s %1s ",DCptr->Name,DCptr->Type); fCustomPrint(OutFile,"%8.2lf ",-DCptr->P*Sn); fCustomPrint(OutFile," Alpha=%6.2lf",DCptr->Alfa/K3); if(DCptr->Alfa<=DCptr->AlfaMin) fCustomPrint(OutFile,"L"); else if(DCptr->Alfa>=DCptr->AlfaMax) fCustomPrint(OutFile,"H"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile," Tap=%6.4lf",DCptr->Tap); if(DCptr->Tap==DCptr->TapMin) fCustomPrint(OutFile,"L"); else if(DCptr->Tap==DCptr->TapMax) fCustomPrint(OutFile,"H"); else if(DCptr->Tap<DCptr->TapMin) fCustomPrint(OutFile,"U"); else if(DCptr->Tap>DCptr->TapMax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile,"\n"); if (i==0) { Qm=ACptr->Smax*ACptr->Smax-Pg*Pg; if (!flagSmax && Qm>0) { Qm=sqrt(Qm); if (ACptr->Qmax<Qm) ACptr->Max=ACptr->Qmax; else ACptr->Max=Qm; if (ACptr->Qmin>-Qm) ACptr->Min=ACptr->Qmin; else ACptr->Min=-Qm; } else { ACptr->Max=ACptr->Qmax; ACptr->Min=ACptr->Qmin; } i++; fCustomPrint(OutFile,"%21s",""); delta=ACptr->Ang; if (delta>=0) vals=1.00; else vals=-1.00; if (fabs(delta)>2*PI) delta=delta-vals*floor(fabs(delta)/(2*PI))*2*PI; if (fabs(delta)>PI) delta=delta-vals*2*PI; ACptr->Ang=delta; fCustomPrint(OutFile,"%6.2lf ",ACptr->Ang/K3); fCustomPrint(OutFile,"%7.4lf ",ACptr->Ang); fCustomPrint(OutFile,"%8.2lf",ACptr->Qg*Sn); if(ACptr->Max==ACptr->Min) fCustomPrint(OutFile," "); else if(ACptr->Qg==ACptr->Min) fCustomPrint(OutFile,"L"); else if(ACptr->Qg==ACptr->Max) fCustomPrint(OutFile,"H"); else if(ACptr->Qg<ACptr->Min) fCustomPrint(OutFile,"U"); else if(ACptr->Qg>ACptr->Max) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile,"%8.2lf ",Ql*Sn); fCustomPrint(OutFile,"%8.2lf|",ACptr->B*ACptr->V*ACptr->V*Sn); } else fCustomPrint(OutFile,"%62s|",""); fCustomPrint(OutFile,"%19s ",""); fCustomPrint(OutFile,"%8.2lf ",-DCptr->Q*Sn); fCustomPrint(OutFile," Gamma=%6.2lf",DCptr->Gamma/K3); if(DCptr->Gamma<=DCptr->GammaMin) fCustomPrint(OutFile,"L"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile,"\n"); } /* --------------------------------------- AC element results -------------------------------------------- */ for (ELptr=ACptr->Elem;ELptr!=NULL;ELptr=ELptr->Next) { Eptr=ELptr->Eptr; Vi=Eptr->From->V; di=Eptr->From->Ang; KVi=Eptr->From->KV; Vj=Eptr->To->V; dj=Eptr->To->Ang; KVj=Eptr->To->KV; if (KVi>0 && KVj>0) ratio=KVi/KVj/Eptr->Tap; else ratio=1/Eptr->Tap; G=(Eptr->G*cos(Eptr->Ang)-Eptr->B*sin(Eptr->Ang))*Eptr->Tap; B=(Eptr->G*sin(Eptr->Ang)+Eptr->B*cos(Eptr->Ang))*Eptr->Tap; Gi=(Eptr->G1+Eptr->G)*pow(Eptr->Tap,2.0)-G; Bi=(Eptr->B1+Eptr->B)*pow(Eptr->Tap,2.0)-B; Gp=(Eptr->G*cos(Eptr->Ang)+Eptr->B*sin(Eptr->Ang))*Eptr->Tap; Bp=(-Eptr->G*sin(Eptr->Ang)+Eptr->B*cos(Eptr->Ang))*Eptr->Tap; Gj=Eptr->G+Eptr->G2-Gp; Bj=Eptr->B+Eptr->B2-Bp; Pij=Vi*Vi*(Gi+G)-Vi*Vj*(G*cos(di-dj)+B*sin(di-dj)); Qij= -Vi*Vi*(Bi+B)-Vi*Vj*(G*sin(di-dj)-B*cos(di-dj)); Iij=sqrt(Pij*Pij+Qij*Qij)/Vi; Pji=Vj*Vj*(Gj+Gp)-Vi*Vj*(Gp*cos(dj-di)+Bp*sin(dj-di)); Qji= -Vj*Vj*(Bj+Bp)-Vi*Vj*(Gp*sin(dj-di)-Bp*cos(dj-di)); Iji=sqrt(Pji*Pji+Qji*Qji)/Vj; if(Eptr->From==ACptr) To=Eptr->To; else { To=Eptr->From; P=Pij; Pij=Pji; Pji=P; Q=Qij; Qij=Qji; Qji=Q; I=Iij; Iij=Iji; Iji=I; KV=KVi; KVi=KVj; KVj=KV; ratio=1/ratio; } if (i!=0) fCustomPrint(OutFile,"%62s|",""); fCustomPrint(OutFile,"%4d ",To->Num); fCustomPrint(OutFile,"%12s ",To->Name); fCustomPrint(OutFile,"%1s ",Eptr->Ckt); fCustomPrint(OutFile,"%8.2lf",Pij*Sn); if(ACptr!=Eptr->Cont || strcmp(Eptr->Ctype,"P") || Eptr->Max==Eptr->Min) fCustomPrint(OutFile," "); else if(Pij==Eptr->Min) fCustomPrint(OutFile,"L"); else if(Pij==Eptr->Max) fCustomPrint(OutFile,"H"); else if(Pij<Eptr->Min) fCustomPrint(OutFile,"U"); else if(Pij>Eptr->Max) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile,"%8.2lf ",(Pij+Pji)*Sn); if (KVi > 0) fCustomPrint(OutFile,"%8.2lf",Iij*1000*Sn/(sqrt(3.0)*KVi)); else fCustomPrint(OutFile,"%8s",""); if(Eptr->Imax<=0) fCustomPrint(OutFile," "); else if(Iij==Eptr->Imax) fCustomPrint(OutFile,"H"); else if(Iij>Eptr->Imax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); if (strpbrk(Eptr->Type,"TR")) { fCustomPrint(OutFile,"%7.4lf",ratio); if(!strcmp(Eptr->Ctype,"P")||Eptr->Tmax==Eptr->Tmin) fCustomPrint(OutFile," "); else if(Eptr->Tap==1/Eptr->Tmin) fCustomPrint(OutFile,"L"); else if(Eptr->Tap==1/Eptr->Tmax) fCustomPrint(OutFile,"H"); else if(Eptr->Tap>1/Eptr->Tmin) fCustomPrint(OutFile,"U"); else if(Eptr->Tap<1/Eptr->Tmax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); } else fCustomPrint(OutFile,"%8s",""); fCustomPrint(OutFile,"%1s ",Eptr->Ctype); if (Eptr->Cont!=NULL) { fCustomPrint(OutFile,"%4d ",Eptr->Cont->Num); fCustomPrint(OutFile,"%12s ",Eptr->Cont->Name); } fCustomPrint(OutFile,"\n"); if (i==0) { i++; fCustomPrint(OutFile,"%21s",""); delta=ACptr->Ang; if (delta>=0) vals=1.00; else vals=-1.00; if (fabs(delta)>2*PI) delta=delta-vals*floor(fabs(delta)/(2*PI))*2*PI; if (fabs(delta)>PI) delta=delta-vals*2*PI; ACptr->Ang=delta; fCustomPrint(OutFile,"%6.2lf ",ACptr->Ang/K3); fCustomPrint(OutFile,"%7.4lf ",ACptr->Ang); fCustomPrint(OutFile,"%8.2lf",ACptr->Qg*Sn); if(ACptr->Qmax==ACptr->Qmin) fCustomPrint(OutFile," "); else if(ACptr->Qg==ACptr->Qmin) fCustomPrint(OutFile,"L"); else if(ACptr->Qg==ACptr->Qmax) fCustomPrint(OutFile,"H"); else if(ACptr->Qg<ACptr->Qmin) fCustomPrint(OutFile,"U"); else if(ACptr->Qg>ACptr->Qmax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile,"%8.2lf ",Ql*Sn); fCustomPrint(OutFile,"%8.2lf|",ACptr->B*ACptr->V*ACptr->V*Sn); } else fCustomPrint(OutFile,"%62s|",""); fCustomPrint(OutFile,"%19s ",""); fCustomPrint(OutFile,"%8.2lf",Qij*Sn); if(ACptr!=Eptr->Cont || strcmp(Eptr->Ctype,"Q") || Eptr->Max==Eptr->Min) fCustomPrint(OutFile," "); else if(Qij==Eptr->Min) fCustomPrint(OutFile,"L"); else if(Qij==Eptr->Max) fCustomPrint(OutFile,"H"); else if(Qij<Eptr->Min) fCustomPrint(OutFile,"U"); else if(Qij>Eptr->Max) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); fCustomPrint(OutFile,"%8.2lf ",(Qij+Qji)*Sn); fCustomPrint(OutFile,"%9s",""); if (strpbrk(Eptr->Type,"TR")) { fCustomPrint(OutFile,"%7.3lf",Eptr->Ang/K3); if(strpbrk(Eptr->Ctype,"QV")||Eptr->Tmax==Eptr->Tmin) fCustomPrint(OutFile," "); else if(Eptr->Ang==Eptr->Tmin) fCustomPrint(OutFile,"L"); else if(Eptr->Ang==Eptr->Tmax) fCustomPrint(OutFile,"H"); else if(Eptr->Ang<Eptr->Tmin) fCustomPrint(OutFile,"U"); else if(Eptr->Ang>Eptr->Tmax) fCustomPrint(OutFile,"O"); else fCustomPrint(OutFile," "); } fCustomPrint(OutFile,"\n"); } if (i==0) { i++; fCustomPrint(OutFile,"%21s",""); delta=ACptr->Ang; if (delta>=0) vals=1.00; else vals=-1.00; if (fabs(delta)>2*PI) delta=delta-vals*floor(fabs(delta)/(2*PI))*2*PI; if (fabs(delta)>PI) delta=delta-vals*2*PI; ACptr->Ang=delta; fCustomPrint(OutFile,"%6.2lf ",ACptr->Ang/K3); fCustomPrint(OutFile,"%7.4lf ",ACptr->Ang);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -