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

📄 readdc.c

📁 电力系统分析计算 学习调试程序 UNIX / LINUX / CYGWIN 系统使用
💻 C
字号:
/* Read DC data in WSCC/EPRI/BPA format   */#include "readdata.h"/* --------- Global Input File --------- */extern FILE *InputDataFile;/* ---------------- ReadEPRIdc ----------------------------- */#ifdef ANSIPROTOvoid ReadEPRIdc(const char *Line)#elsevoid ReadEPRIdc(Line)char *Line;#endif/* Read DC Bus and Element data in ETMSP format. */{  ACbusData *ACptr;  DClist *ptr;  DCbusData *DCptr,*DCptrp;  char Name[13],Mode[2];  VALUETYPE KV,KVp,Set1,Set2,R,L,P,V,alpha,gamma;  BOOLEAN flag=FALSE,flagEPRI=TRUE;  int i;  /* --------------- DC bus data -------------------------------- */    if (!strncmp(Line,"BD ",3)) {      GetStr(Line,51,8,8,Name);      for (i=0;i<8;i++) if (isalpha(Name[i])) {        flagEPRI=FALSE;        break;      }    /* ------------ EPRI Format Multiterminal Format ------------- */      if (flagEPRI) {        flag=FALSE;        for(i=4;i<=12;i+=8) {          GetStr(Line,i,8,8,Name);          if(strncmp(Name,"GROUND",6)){            DCptr=(DCbusData *) DCbusInList(Name,Ndc);            if (DCptr->Nbr!=0) {              fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);              ErrorHalt("The DC bus was previously defined (check BD cards).");            }            if (DCptr->N==0) { Ndc++; DCptr->N=Ndc;}          } else flag=TRUE;        }        if (!flag){          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("One of the DC buses must be GROUND (2 terminal HVDC links).");        }        GetStr(Line,20,12,12,Name);        KV=GetValue(Line,28,4,0);        ACptr=ACbusInList(0,Name,KV,Nac,1);        if (ACptr->N==0) { Nac++; ACptr->Num=ACptr->N=Nac;}        DCptr->Vn=KV;        ptr=ACptr->DC;#ifdef WINDOWS        ACptr->DC= new DClist;#else        ACptr->DC=(DClist *) malloc(sizeof(DClist));        if(ACptr->DC==NULL) {          fclose(InputDataFile);          ErrorHalt("Insufficient memory to allocate DC elemet data");          stopExecute(ERROREXIT);        }#endif        ACptr->DC->DC=DCptr;        ACptr->DC->Next=ptr;        DCptr->AC=ACptr;        GetStr(Line,36,2,2,DCptr->Zone);        DCptr->Nbr=GetValue(Line,38,2,0);        DCptr->Xc=GetValue(Line,40,5,3);        DCptr->Ntrf=GetValue(Line,45,5,4);        if (DCptr->Nbr<1 || DCptr->Ntrf<0.0001) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("Wrong number of AC/DC bridges or transf. ratio too small.");        }        DCptr->Xc=DCptr->Xc*DCptr->Nbr;        DCptr->Ntrf=DCptr->Ntrf*DCptr->Nbr;        DCptr->TapMin=GetValue(Line,55,5,3);        if (DCptr->TapMin<=0) DCptr->TapMin=0.9;        DCptr->TapMax=GetValue(Line,60,5,3);        if (DCptr->TapMax<=DCptr->TapMin) DCptr->TapMax=1.1;        DCptr->AlfaMin=GetValue(Line,65,4,1);        if (DCptr->AlfaMin<0) DCptr->AlfaMin=0.;        DCptr->AlfaMax=GetValue(Line,69,4,1);        if (DCptr->AlfaMax<=DCptr->AlfaMin) DCptr->AlfaMax=90.;        DCptr->GammaMin=GetValue(Line,73,4,1);        if (DCptr->GammaMin<0) DCptr->GammaMin=0.;      }    /* ---------------- WSC/BPA 2 Terminal Format ---------------- */      else {        GetStr(Line,7,12,12,Name);        KVp=GetValue(Line,15,4,0);        ACptr=ACbusInList(0,Name,KVp,Nac,1);        if (ACptr->N==0) {          Nac++;          ACptr->Num=ACptr->N=Nac;          ACptr->V=1.;          GetStr(Line,19,2,2,ACptr->Zone);          GetStr(Line,4,3,3,ACptr->Owner);        }        DCptr=(DCbusData *) DCbusInList(Name,Ndc);        if (DCptr->Nbr!=0) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("The DC bus was previously defined (check BD cards).");        }        if (DCptr->N==0) { Ndc++; DCptr->N=Ndc;}        GetStr(Line,19,2,2,DCptr->Zone);        DCptr->Nbr=GetValue(Line,24,2,0);        GetStr(Line,51,12,12,Name);        KV=GetValue(Line,59,4,0);        DCptr->Ntrf=(KVp/KV)*DCptr->Nbr;        if (DCptr->Nbr<1 || DCptr->Ntrf<0.0001) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("Wrong number of AC/DC bridges or transf. ratio too small.");        }        ACptr=ACbusInList(0,Name,KV,Nac,1);        if (ACptr->N==0) { Nac++; ACptr->Num=ACptr->N=Nac;}        DCptr->Vn=KV;        ptr=ACptr->DC;#ifdef WINDOWS        ACptr->DC= new DClist;#else        ACptr->DC=(DClist *) malloc(sizeof(DClist));        if(ACptr->DC==NULL) {          fclose(InputDataFile);          ErrorHalt("Insufficient memory to allocate DC elemet data");          stopExecute(ERROREXIT);        }#endif        ACptr->DC->DC=DCptr;        ACptr->DC->Next=ptr;        DCptr->AC=ACptr;        DCptr->Ld+=GetValue(Line,26,5,1)/1000.;        DCptr->AlfaMin=GetValue(Line,31,5,1);        if (DCptr->AlfaMin<0) DCptr->AlfaMin=0.;        DCptr->GammaMin=GetValue(Line,36,5,1);        if (DCptr->GammaMin<0) DCptr->GammaMin=0.;      }    }    /* ------------ EPRI Format Multiterminal Format ------------- */    else if (!strncmp(Line,"BZ ",3)) {      flag=FALSE;      for(i=4;i<=12;i+=8) {        GetStr(Line,i,8,8,Name);        if(strncmp(Name,"GROUND",6)){          DCptr=(DCbusData *) DCbusInList(Name,Ndc);          if (strcmp(DCptr->Type,"")) {            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);            ErrorHalt("The DC bus was previously defined (check BD cards).");          }          if (DCptr->N==0) { Ndc++; DCptr->N=Ndc;}        } else flag=TRUE;      }      if (!flag){        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);        ErrorHalt("One of the DC buses must be GROUND (2 terminal HVDC links).");      }      GetStr(Line,33,2,2,DCptr->Cont1);      GetStr(Line,35,2,2,DCptr->Cont2);      GetStr(Line,49,1,1,DCptr->Type);      if ((strcmp(DCptr->Cont1,"ID") && strcmp(DCptr->Cont1,"VD") &&           strcmp(DCptr->Cont1,"PA") && strcmp(DCptr->Cont1,"QA") &&           strcmp(DCptr->Cont1,"AL") && strcmp(DCptr->Cont1,"GA") &&           strcmp(DCptr->Cont1,"AT"))||          (strcmp(DCptr->Cont2,"ID") && strcmp(DCptr->Cont2,"VD") &&           strcmp(DCptr->Cont2,"PA") && strcmp(DCptr->Cont2,"QA") &&           strcmp(DCptr->Cont2,"AL") && strcmp(DCptr->Cont2,"GA") &&           strcmp(DCptr->Cont2,"AT"))||          (strcmp(DCptr->Type,"R") && strcmp(DCptr->Type,"I"))){        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);        ErrorHalt("DC link has invalid type and/or control modes.");      }      if ((!strcmp(DCptr->Cont1,"ID") && !strcmp(DCptr->Cont2,"VD")) ||          (!strcmp(DCptr->Cont1,"VD") && !strcmp(DCptr->Cont2,"ID"))){        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);        ErrorHalt("DC link has an invalid control mode: ID VD.");      }      if ((!strcmp(DCptr->Cont1,"PA") && !strcmp(DCptr->Cont2,"VD")) ||          (!strcmp(DCptr->Cont1,"VD") && !strcmp(DCptr->Cont2,"PA"))){        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);        ErrorHalt("DC link has an invalid control mode: VD PA.");      }      if ((!strcmp(DCptr->Cont1,"ID") && !strcmp(DCptr->Cont2,"PA")) ||          (!strcmp(DCptr->Cont1,"PA") && !strcmp(DCptr->Cont2,"ID"))){        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);        ErrorHalt("DC link has an invalid control mode: ID PA.");      }      Set1=fabs(GetValue(Line,37,6,2));      Set2=fabs(GetValue(Line,43,6,2));      if (Set1==0 || Set2==0){        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);        ErrorHalt("Zero DC control set point.");      }      if (!strcmp(DCptr->Cont1,"ID")) DCptr->Id=Set1;      if (!strcmp(DCptr->Cont2,"ID")) DCptr->Id=Set2;      if (!strcmp(DCptr->Cont1,"VD")) DCptr->Vd=Set1;      if (!strcmp(DCptr->Cont2,"VD")) DCptr->Vd=Set2;      if (!strcmp(DCptr->Cont1,"AL")) DCptr->Alfa=Set1;      if (!strcmp(DCptr->Cont2,"AL")) DCptr->Alfa=Set2;      if (!strcmp(DCptr->Cont1,"GA")) DCptr->Gamma=Set1;      if (!strcmp(DCptr->Cont2,"GA")) DCptr->Gamma=Set2;      if (!strcmp(DCptr->Cont1,"PA")) DCptr->P=Set1;      if (!strcmp(DCptr->Cont2,"PA")) DCptr->P=Set2;      if (!strcmp(DCptr->Cont1,"QA")) DCptr->Q=Set1;      if (!strcmp(DCptr->Cont2,"QA")) DCptr->Q=Set2;      if (!strcmp(DCptr->Cont1,"AT")) DCptr->Tap=Set1;      if (!strcmp(DCptr->Cont2,"AT")) DCptr->Tap=Set2;      DCptr->MVA=GetValue(Line,50,5,1);    }  /* --------------- DC element data -------------------------------- */    else if (!strncmp(Line,"LD ",3)) {      P=GetValue(Line,57,5,1);      if (P!=0) flagEPRI=FALSE;    /* ------------ EPRI Format Multiterminal Format ------------- */      if (flagEPRI) {        NdcEl++;        GetStr(Line,4,8,8,Name);        DCptr=(DCbusData *) DCbusInList(Name,Ndc);        if (DCptr->N==0) { Ndc++; DCptr->N=Ndc;}        GetStr(Line,12,8,8,Name);        DCptrp=(DCbusData *) DCbusInList(Name,Ndc);        if (DCptrp->N==0) { Ndc++; DCptrp->N=Ndc;}        if (DCptr->N==DCptrp->N){          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("Both DC line buses are the same.");        }        R=GetValue(Line,29,6,2);        L=GetValue(Line,35,6,2)/1000.;        if (R<0.01) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("DC line is a short circuit or has negative R.");        }        if (ExistParameter('O') && L<=0) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("Program needs a DC L>0 to calculate ac/dc TEF.");        }        DCptr->Rd=DCptrp->Rd=R;        DCptr->Ld=DCptrp->Ld=L;        DCptr->To=DCptrp;        DCptrp->To=DCptr;        GetStr(Line,24,2,2,DCptr->Lzone);        strcpy(DCptrp->Lzone,DCptr->Lzone);        if (strcmp(DCptr->Zone,DCptr->Lzone)) DCptr->Meter=DCptrp->Meter=DCptr;        else DCptr->Meter=DCptrp->Meter=DCptrp;      }    /* ---------------- WSC/BPA 2 Terminal Format ---------------- */      else {        NdcEl++;        GetStr(Line,7,12,12,Name);        DCptr=(DCbusData *) DCbusInList(Name,Ndc);        if (DCptr->N==0) { Ndc++; DCptr->N=Ndc;}        GetStr(Line,20,12,12,Name);        DCptrp=(DCbusData *) DCbusInList(Name,Ndc);        if (DCptrp->N==0) { Ndc++; DCptrp->N=Ndc;}        if (DCptr->N==DCptrp->N){          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("Both DC line buses are the same.");        }        R=GetValue(Line,38,6,2);        L=GetValue(Line,44,6,2)/1000.;        if (R<0.01) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("DC line is a short circuit or has negative R.");        }        if (ExistParameter('O') && L<=0) {          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);          ErrorHalt("Program needs a DC L>0 to calculate ac/dc TEF.");        }        DCptr->Rd=DCptrp->Rd=R;        DCptrp->Ld+=L;        DCptr->Ld=DCptrp->Ld;        V=GetValue(Line,62,5,1);        alpha=GetValue(Line,67,4,1);        gamma=GetValue(Line,71,4,1);        GetStr(Line,56,1,1,Mode);        if (Mode[0]=='R' && P>0) {          strcpy(DCptr->Type,"R");          strcpy(DCptrp->Type,"I");          strcpy(DCptr->Cont1,"PA");          strcpy(DCptr->Cont2,"AL");          strcpy(DCptrp->Cont1,"VD");          strcpy(DCptrp->Cont2,"GA");          DCptr->P=P;          DCptr->Alfa=alpha;          DCptrp->Vd=V-(P/V)*R;          DCptrp->Gamma=gamma;          DCptr->Meter=DCptrp->Meter=DCptr;          DCptr->AlfaMax=90.;          DCptrp->AlfaMax=180.;        }        else if (Mode[0]=='I' && P>0) {          strcpy(DCptr->Type,"R");          strcpy(DCptrp->Type,"I");          strcpy(DCptr->Cont1,"VD");          strcpy(DCptr->Cont2,"AL");          strcpy(DCptrp->Cont1,"PA");          strcpy(DCptrp->Cont2,"GA");          DCptr->Vd=V;          DCptr->Alfa=alpha;          DCptrp->P=P;          DCptrp->Gamma=gamma;          DCptr->Meter=DCptrp->Meter=DCptrp;          DCptr->AlfaMax=90.;          DCptrp->AlfaMax=180.;        }        else if (Mode[0]=='R' && P<0) {          strcpy(DCptr->Type,"I");          strcpy(DCptrp->Type,"R");          strcpy(DCptrp->Cont1,"PA");          strcpy(DCptrp->Cont2,"AL");          strcpy(DCptr->Cont1,"VD");          strcpy(DCptr->Cont2,"GA");          DCptrp->P=-P;          DCptrp->Alfa=alpha;          DCptr->Vd=V+(P/V)*R;          DCptr->Gamma=gamma;          DCptr->Meter=DCptrp->Meter=DCptr;          DCptrp->AlfaMax=90.;          DCptr->AlfaMax=180.;        }        else if (Mode[0]=='I' && P<0) {          strcpy(DCptr->Type,"I");          strcpy(DCptrp->Type,"R");          strcpy(DCptrp->Cont1,"VD");          strcpy(DCptrp->Cont2,"AL");          strcpy(DCptr->Cont1,"PA");          strcpy(DCptr->Cont2,"GA");          DCptrp->Vd=V;          DCptrp->Alfa=alpha;          DCptr->P=-P;          DCptr->Gamma=gamma;          DCptr->Meter=DCptrp->Meter=DCptrp;          DCptrp->AlfaMax=90.;          DCptr->AlfaMax=180.;        }        DCptr->To=DCptrp;        DCptrp->To=DCptr;        strcpy(DCptr->Lzone,"  ");        strcpy(DCptrp->Lzone,DCptr->Lzone);      }    }}

⌨️ 快捷键说明

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