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

📄 readdc.cpp

📁 用于潮流计算的程序请让我下载我需要的吧感谢了啊
💻 CPP
字号:
/* Read DC data in WSCC/EPRI/BPA format   */

#include "readdata.h"

/* --------- Global Input File --------- */
extern FILE *InputDataFile;

/* ---------------- ReadEPRIdc ----------------------------- */
#ifdef ANSIPROTO
void ReadEPRIdc(const char *Line)
#else
void 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 + -