⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readepri.c

📁 电力系统分析计算 学习调试程序 UNIX / LINUX / CYGWIN 系统使用
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Read AC data in WSCC/EPRI/BPA/ANAREDE format   (EPRI's P.F. V 5.0 input data formats). */#include "readdata.h"/* ------- Global Variables ------ */VALUETYPE G,B,G1,B1,G2,B2,Tap,Ang;extern FILE *InputDataFile;/* ---------------- Multiply 2 Complex Numbers ----------------------------- */#ifdef ANSIPROTOvoid Multiply(VALUETYPE *a,VALUETYPE *b,VALUETYPE c,VALUETYPE d)#elsevoid Multiply(a,b,c,d)VALUETYPE *a,*b,c,d;#endif{  VALUETYPE r,i;  r=(*a)*c - (*b)*d;  i=(*b)*c + (*a)*d;  *a=r; *b=i;}/* ---------------- Divide 2 Complex Numbers ----------------------------- */#ifdef ANSIPROTOvoid Divide(VALUETYPE *a,VALUETYPE *b,VALUETYPE c,VALUETYPE d)#elsevoid Divide(a,b,c,d)VALUETYPE *a,*b,c,d;#endif{  VALUETYPE D;  D=c*c+d*d;  if (!D) { c=d=0; D=1;}  Multiply(a,b,c/D,-d/D);}/* ---------------- AddSection --------------------------- */#ifdef ANSIPROTOBOOLEAN AddSection(ACbusData *From,ACbusData *To,char *Line,char *Ckt,INDEX Sec)#elseBOOLEAN AddSection(From,To,Line,Ckt,Sec)ACbusData *From,*To;char *Line,*Ckt;INDEX Sec;#endif{  ElementList *ELptr;  ElementData *Eptr;  VALUETYPE Ge,Be,Ge1,Be1,Ge2,Be2,Gs,Bs;  for(ELptr=From->Elem;ELptr!=NULL;ELptr=ELptr->Next){    Eptr=ELptr->Eptr;    if (((From==Eptr->From&&To==Eptr->To)||(From==Eptr->To&&To==Eptr->From))        &&!strcmp(Ckt,Eptr->Ckt)&&strcmp(Eptr->Zone,"")){      if (!strncmp(Line,"T",1)&&!strpbrk(Eptr->Type,"RT")) strcpy(Eptr->Type,"T");      if(Sec<Eptr->Sec) {        Ge=Eptr->G;   Eptr->G=G/(Eptr->Tap*Eptr->Tap);   G=Ge;        Be=Eptr->B;   Eptr->B=B/(Eptr->Tap*Eptr->Tap);   B=Be;        Ge1=Eptr->G1; Eptr->G1=G1/(Eptr->Tap*Eptr->Tap); G1=Ge1;        Be1=Eptr->B1; Eptr->B1=B1/(Eptr->Tap*Eptr->Tap); B1=Be1;        Ge2=Eptr->G2; Eptr->G2=G2/(Eptr->Tap*Eptr->Tap); G2=Ge2;        Be2=Eptr->B2; Eptr->B2=B2/(Eptr->Tap*Eptr->Tap); B2=Be2;      } else {        Eptr->G=Eptr->G/(Tap*Tap);        Eptr->B=Eptr->B/(Tap*Tap);        Eptr->G1=Eptr->G1/(Tap*Tap);        Eptr->B1=Eptr->B1/(Tap*Tap);        Eptr->G2=Eptr->G2/(Tap*Tap);        Eptr->B2=Eptr->B2/(Tap*Tap);      }      if ((fabs(Eptr->G)<1e-7 && fabs(Eptr->B)<1e-7)||(fabs(G)<1e-7 && fabs(B)<1e-7)) {         fCustomPrint(stderr,"***Warning: A section of element %d %s - %d %s\n",                  Eptr->From->Num,Eptr->From->Name,Eptr->To->Num,Eptr->To->Name);         fCustomPrint(stderr,"            has a zero impedance.  Check the section data for this element.\n");      }      if (!strncmp(Line,"T",1)&&!strpbrk(Eptr->Type,"RT")) strcpy(Eptr->Type,"T");      Eptr->Tap*=Tap;      Eptr->Ang+=Ang;      Eptr->Sec=Sec;      Gs=Eptr->G+G+Eptr->G2+G1;      Bs=Eptr->B+B+Eptr->B2+B1;      Ge=Ge1=Eptr->G;  Be=Be1=Eptr->B;      Ge2=G;  Be2=B;      Multiply(&Ge,&Be,G,B);      Divide(&Ge,&Be,Gs,Bs);      Multiply(&Ge1,&Be1,Eptr->G2+G1,Eptr->B2+B1);      Divide(&Ge1,&Be1,Gs,Bs);      Ge1+=Eptr->G1;  Be1+=Eptr->B1;      Multiply(&Ge2,&Be2,Eptr->G2+G1,Eptr->B2+B1);      Divide(&Ge2,&Be2,Gs,Bs);      Ge2+=G2;       Be2+=B2;      Eptr->G=Ge;    Eptr->B=Be;      Eptr->G1=Ge1;  Eptr->B1=Be1;      Eptr->G2=Ge2;  Eptr->B2=Be2;      return(TRUE);    }  }  return(FALSE);}/* ---------------- ReadWSCC ----------------------------- */#ifdef ANSIPROTOvoid ReadWSCC()#elsevoid ReadWSCC()#endif/* Read Bus and Element data in WSCC format. */{  ACbusData *ACptr,*ACptrp,*ACptrs;  ElementData *Eptr;  AreaData *Aptr;  char Line[BUFLEN],Name[31],str[6];  VALUETYPE KV,KVp,KVs,R,X,Bx,Taps,Tap1,Tap2,Imax;  int i,j,k,s;  INDEX Sec;  BOOLEAN flag=FALSE,flagPrint=TRUE;  for(i=0;i<=2;strcpy(dataPtr->Title[i],"\n"),i++);  Sn=100.0;  RealParameter('$',&Sn,1.0,100000000.0);  ACptr=NULL;  for(;;){ /* Reading Loop */    if (fgets(Line,BUFLEN,InputDataFile)==NULL){      ErrorHalt("Missing END or Anarede's FIM card.");      break;    }    LineNum++;    if (!strncmp(Line,"C",1) || !strncmp(Line,"BAS",3)) continue;  /* ------------------------ Title ----------------------------- */    else if (!strncmp(Line,"HDG",3)||!strncmp(Line,"TITU",4)) {      i=0;      for(;;){ /* Title Reading Loop */        if (fgets(Line,BUFLEN,InputDataFile)==NULL){          ErrorHalt("Missing BAS or Anarede's D title cards.");          break;        }        LineNum++;        if (strncmp(Line,"BAS",3)&&strncmp(Line,"D",1)) {          strcpy(dataPtr->Title[i],Line);          i++;          if (i>2) break;        }        else break;      }    }  /* --------------- AC bus data -------------------------------- */    else if (!strncmp(Line,"B  ",3) || !strncmp(Line,"BQ ",3) ||        !strncmp(Line,"BV ",3) || !strncmp(Line,"BE ",3) ||        !strncmp(Line,"BC ",3) || !strncmp(Line,"BG ",3) ||        !strncmp(Line,"BT ",3) || !strncmp(Line,"BX ",3) ||        !strncmp(Line,"BA ",3) || !strncmp(Line,"BF ",3) ||        !strncmp(Line,"BJ ",3) || !strncmp(Line,"BK ",3) ||        !strncmp(Line,"BL ",3) || !strncmp(Line,"BS ",3)){      GetStr(Line,7,12,12,Name);      KV=GetValue(Line,15,4,0);      ACptr=ACbusInList(0,Name,KV,Nac,1);      if (ACptr->V>0) {         fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);         ErrorHalt("The AC bus was previously defined (check B cards).");      }      if (ACptr->N==0) { Nac++; ACptr->Num=ACptr->N=Nac;}      GetStr(Line,19,2,2,ACptr->Zone);      GetStr(Line,4,3,3,ACptr->Owner);      ACptr->V=GetValue(Line,58,4,3);      if (ACptr->V<=0) ACptr->V=1;      ACptr->VCont=ACptr->V;      ACptr->Pl=GetValue(Line,21,5,0)/Sn;      ACptr->Ql=GetValue(Line,26,5,0)/Sn;      ACptr->G=GetValue(Line,31,4,0)/Sn;      ACptr->B=GetValue(Line,35,4,0)/Sn;      ACptr->Pg=GetValue(Line,43,5,0)/Sn;      ACptr->PgMax=GetValue(Line,39,4,0)/Sn;      if (ACptr->PgMax==0) ACptr->PgMax=99999999.;      if (ACptr->PgMax<ACptr->Pg) {         ACptr->PgMax=99999999.;         fCustomPrint(stderr,"***Warning: Bus %d %s has its maximum generating power PgMax < Pg.\n",ACptr->N,ACptr->Name);         fCustomPrint(stderr,"            PgMax will be given value of 99999999.\n");      }      ACptr->Pmax=ACptr->PgMax;      ACptr->Qg=GetValue(Line,48,5,0)/Sn;      if ((!strncmp(Line,"B  ",3)||!strncmp(Line,"BJ ",3)||!strncmp(Line,"BF ",3))          && strcmp(ACptr->Type,"BC")) {         ACptr->Cont=ACptr;         if (!strncmp(Line,"BJ ",3)){            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            fCustomPrint(stderr,"***Warning: BJ bus has been transformed to a B bus.\n");         }         if (!strncmp(Line,"BF ",3)){            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            fCustomPrint(stderr,"***Warning: BF bus has been transformed to a B bus.\n");         }      }      else if (!strncmp(Line,"BC ",3)) strcpy(ACptr->Type,"BC");      else if (!strncmp(Line,"BT ",3)) strcpy(ACptr->Type,"BT");      else if (!strncmp(Line,"BE ",3) || !strncmp(Line,"BK ",3)){         Nvolt++;         ACptr->Qg=0;         strcpy(ACptr->Type,"BQ");         strcpy(ACptr->cont,"V");         ACptr->Qmax=99999999.;         ACptr->Qmin= -99999999.;         if (!strncmp(Line,"BK ",3)){            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            fCustomPrint(stderr,"***Warning: BK bus has been transformed to a BE bus.\n");         }      }      if (!strncmp(Line,"BQ ",3) || !strncmp(Line,"BK ",3)){         Nvolt++;         ACptr->Qg=0;         strcpy(ACptr->Type,"BQ");         strcpy(ACptr->cont,"V");         ACptr->Qmax=GetValue(Line,48,5,0)/Sn;         ACptr->Qmin=GetValue(Line,53,5,0)/Sn;         if (ACptr->Qmax<=ACptr->Qmin) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("AC bus Q limits are wrong: Qmin >= Qmax.");         }         if (!strncmp(Line,"BL ",3)){            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            fCustomPrint(stderr,"***Warning: BL bus has been transformed to a BQ bus.\n");         }      }      else if (!strncmp(Line,"BG ",3)){         Nvolt++;         ACptr->Qg=0;         strcpy(ACptr->Type,"BG");         strcpy(ACptr->cont,"V");         ACptr->Qmax=GetValue(Line,48,5,0)/Sn;         ACptr->Qmin=GetValue(Line,53,5,0)/Sn;         if (ACptr->Qmax<=ACptr->Qmin) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("AC bus Q limits are wrong: Qmin >= Qmax.");         }         GetStr(Line,66,12,12,Name);         KV=GetValue(Line,74,4,0);         if (!strcmp(Name,"            ")) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("The controlled bus has not been defined.");         }         ACptrp=ACbusInList(0,Name,KV,Nac,1);         if (ACptrp->N==0) { Nac++; ACptrp->Num=ACptrp->N=Nac;}         if (!strcmp(ACptr->Name,"            ")) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("The controlled bus has not been defined.");         }         if(!strcmp(ACptrp->Type,"B")) strcpy(ACptrp->Type,"BC");         else if(strcmp(ACptrp->Type,"BC")) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("The voltage controlled bus is not a PQ bus.");         }         ACptr->Cont=ACptrp;         ACptrp->Cont=NULL;         ACptrp->Kbg++;         ACptr->Kbg=GetValue(Line,78,3,0)/100;         if (flag2Vcontrol) {           ACptrp->Kbg1=ACptrp->Kbg1+ACptr->Qmax;           ACptrp->Kbg2=ACptrp->Kbg2+ACptr->Qmin;         }         if (ACptr->Kbg<=0) ACptr->Kbg=1.;      }      else if (!strncmp(Line,"BV ",3)||!strncmp(Line,"BA ",3)) {         strcpy(ACptr->Type,"BV");         strcpy(ACptr->cont,"Q");         ACptr->VCont=ACptr->Qg;         ACptr->Vmax=GetValue(Line,58,4,3);         if (ACptr->Vmax<=0) ACptr->Vmax=10.;         ACptr->Vmin=GetValue(Line,62,4,3);         if (ACptr->Vmin<=0) ACptr->Vmin=0.001;         if (ACptr->Vmax<=ACptr->Vmin) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("AC bus V limits are wrong: Vmin >= Vmax.");         }         ACptr->Qmax=99999999.;         ACptr->Qmin= -99999999.;         ACptr->Cont=ACptr;         if (!strncmp(Line,"BA ",3)){            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            fCustomPrint(stderr,"***Warning: BA bus has been transformed to a BV bus.\n");         }      }      else if (!strncmp(Line,"BX ",3)) {         ACptr->Vmax=GetValue(Line,58,4,3);         if (ACptr->Vmax<=0) ACptr->Vmax=10.;         ACptr->Vmin=GetValue(Line,62,4,3);         if (ACptr->Vmin<=0) ACptr->Vmin=0.001;         if (ACptr->Vmax<=ACptr->Vmin) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("AC bus V limits are wrong: Vmin >= Vmax.");         }         ACptr->Cont=ACptr;      }      else if (!strncmp(Line,"BS ",3)) {         strcat(ACptr->Type,"S");         strcpy(ACptr->cont,"V");         Nslack++;         ACptr->Qg=0;         AngSlack=0;         ACptr->Qmax=GetValue(Line,48,5,0)/Sn;         ACptr->Qmin=GetValue(Line,53,5,0)/Sn;         if (ACptr->Qmax<=ACptr->Qmin) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("AC bus Q limits are wrong: Qmin >= Qmax.");         }      }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -