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

📄 readital.cpp

📁 用于潮流计算的程序请让我下载我需要的吧感谢了啊
💻 CPP
📖 第 1 页 / 共 3 页
字号:
      if (ACptr->N==0) {
        Nac++;
        ACptr->Num=ACptr->N=Nac;
        KV=Vlevels[KVl];
        sprintf(ACptr->Name,"%5s %6.0lf",Code,KV);
        Vlmax=Vmax[KVl];
        Vlmin=Vmin[KVl];
        if (KV==0){
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          ErrorHalt("Base voltage is zero.");
          KV=1;
        }
        else if (Vlmax>Vlmin && Vlmax>=KV && Vlmin<=KV) {
          ACptr->Vlmax=Vlmax/KV;
          ACptr->Vlmin=Vlmin/KV;
        }
        ACptr->KV=KV;
      }
      ACptr->Pg+=-GetValue(Line,14,6,0)/Sn;
      ACptr->PgMax+=-GetValue(Line,25,5,0)/Sn;
      if (ACptr->PgMax==0) ACptr->PgMax=99999999.;
      ACptr->Smax+=-GetValue(Line,30,5,0)/Sn;
      if (ACptr->Smax==0) ACptr->Smax=99999999.;
      if (ACptr->PgMax>ACptr->Smax) {
        ACptr->PgMax=ACptr->Smax;
        fCustomPrint(stderr,"***Warning: Bus %d %s has PgMax > Smax.\n",ACptr->N,ACptr->Name);
        fCustomPrint(stderr,"            PgMax will be set to Smax.\n");
      }
      if (ACptr->Pg>ACptr->PgMax) {
        ACptr->Pg=ACptr->PgMax;
        fCustomPrint(stderr,"***Warning: Bus %d %s has Pg > PgMax.\n",ACptr->N,ACptr->Name);
        fCustomPrint(stderr,"            Pg will be set to PgMax.\n");
      }
      ACptr->Qg+=-GetValue(Line,36,6,0)/Sn;
      ACptr->Qmax+=-GetValue(Line,47,5,0)/Sn;
      ACptr->Qmin+=-GetValue(Line,43,4,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.");
      }
    }

    /* Synchronous Condenser */
    else if (Line[79]=='S') {
      N=GetInt(Line,1,3);
      GetStr(Line,4,1,1,Zone);
      KVl=GetInt(Line,5,1);
      sprintf(Code,"%3d%1s%1d",N,Zone,KVl);
      ACptr=ACbusInList2(0,Code,Nac,1,TRUE);
      if (ACptr->N==0) {
        Nac++;
        ACptr->Num=ACptr->N=Nac;
        KV=Vlevels[KVl];
        sprintf(ACptr->Name,"%5s %6.0lf",Code,KV);
        Vlmax=Vmax[KVl];
        Vlmin=Vmin[KVl];
        if (KV==0){
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          ErrorHalt("Base voltage is zero.");
          KV=1;
        }
        else if (Vlmax>Vlmin && Vlmax>=KV && Vlmin<=KV) {
          ACptr->Vlmax=Vlmax/KV;
          ACptr->Vlmin=Vlmin/KV;
        }
        ACptr->KV=KV;
      }
      ACptr->Qg+=-GetValue(Line,36,6,0)/Sn;
      ACptr->Qmax+=-GetValue(Line,47,5,0)/Sn;
      ACptr->Qmin+=-GetValue(Line,43,4,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.");
      }
    }

    /* Shunt Capacitor */
    else if (Line[79]=='Q') {
      N=GetInt(Line,1,3);
      GetStr(Line,4,1,1,Zone);
      KVl=GetInt(Line,5,1);
      sprintf(Code,"%3d%1s%1d",N,Zone,KVl);
      ACptr=ACbusInList2(0,Code,Nac,1,TRUE);
      if (ACptr->N==0) {
        Nac++;
        ACptr->Num=ACptr->N=Nac;
        KV=Vlevels[KVl];
        sprintf(ACptr->Name,"%5s %6.0lf",Code,KV);
        Vlmax=Vmax[KVl];
        Vlmin=Vmin[KVl];
        if (KV==0){
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          ErrorHalt("Base voltage is zero.");
          KV=1;
        }
        else if (Vlmax>Vlmin && Vlmax>=KV && Vlmin<=KV) {
          ACptr->Vlmax=Vlmax/KV;
          ACptr->Vlmin=Vlmin/KV;
        }
        ACptr->KV=KV;
      } else KV=ACptr->KV;
      KV=GetValue(Line,43,4,0)/KV;
      if (KV!=0)  ACptr->B+=(-GetValue(Line,47,5,0)/Sn)/(KV*KV);
    }

  /* --------------- AC element data -------------------------------- */
    else if (Line[79]=='L' || Line[79]=='T') {
      N=GetInt(Line,1,3);
      GetStr(Line,4,1,1,Zone);
      KVl=GetInt(Line,5,1);
      sprintf(Code,"%3d%1s%1d",N,Zone,KVl);
      ACptr=ACbusInList2(0,Code,Nac,1,TRUE);
      if (ACptr->N==0) {
        Nac++;
        ACptr->Num=ACptr->N=Nac;
        KV=Vlevels[KVl];
        sprintf(ACptr->Name,"%5s %6.0lf",Code,KV);
        Vlmax=Vmax[KVl];
        Vlmin=Vmin[KVl];
        if (KV==0){
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          ErrorHalt("Base voltage is zero.");
          KV=1;
        }
        else if (Vlmax>Vlmin && Vlmax>=KV && Vlmin<=KV) {
          ACptr->Vlmax=Vlmax/KV;
          ACptr->Vlmin=Vlmin/KV;
        }
        ACptr->KV=KV;
      } else KV=ACptr->KV;
      N=GetInt(Line,7,3);
      GetStr(Line,10,1,1,Zone);
      KVl=GetInt(Line,11,1);
      sprintf(Code,"%3d%1s%1d",N,Zone,KVl);
      ACptrp=ACbusInList2(0,Code,Nac,1,TRUE);
      if (ACptrp->N==0) {
        Nac++;
        ACptrp->Num=ACptrp->N=Nac;
        KVp=Vlevels[KVl];
        sprintf(ACptrp->Name,"%5s %6.0lf",Code,KVp);
        Vlmax=Vmax[KVl];
        Vlmin=Vmin[KVl];
        if (KVp==0){
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          ErrorHalt("Base voltage is zero.");
          KVp=1;
        }
        else if (Vlmax>Vlmin && Vlmax>=KVp && Vlmin<=KVp) {
          ACptrp->Vlmax=Vlmax/KVp;
          ACptrp->Vlmin=Vlmin/KVp;
        }
        ACptrp->KV=KVp;
      } else KVp=ACptrp->KV;
      if (ACptr==ACptrp){
        fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
        ErrorHalt("Both AC element buses are the same.");
      }
      if (EstimatePl) {
        if (Line[20]=='T') {
          fCustomPrint(stderr,"***Warning: The P load estimate at bus %d %s may be incorrect\n",ACptrEstimate->N,ACptrEstimate->Name);
          fCustomPrint(stderr,"            due to lack of P flow information in the corresponding element data:\n");
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
        }
        else {
          if (ACptrEstimate==ACptr) ACptrEstimate->Pl+=-GetValue(Line,14,6,0)/Sn;
          else ACptrEstimate->Pl+=GetValue(Line,14,6,0)/Sn;
        }
      }
      if (EstimateQl) {
        if (Line[42]=='T') {
          fCustomPrint(stderr,"***Warning: The Q load estimate at bus %d %s may be incorrect\n",ACptrEstimate->N,ACptrEstimate->Name);
          fCustomPrint(stderr,"            due to lack of Q flow information in the corresponding element data:\n");
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
        }
        else {
          if (ACptrEstimate==ACptr) ACptrEstimate->Ql+=-GetValue(Line,36,6,0)/Sn;
          else ACptrEstimate->Ql+=GetValue(Line,36,6,0)/Sn;
        }
      }
      if (KV>KVp) {
        KVs=KV; KV=KVp; KVp=KVs;
        ACptrs=ACptr; ACptr=ACptrp; ACptrp=ACptrs;
      }
      if (Line[79]=='L') strcpy(Type,"L");
      else {
        Tmax=GetValue(Line,67,5,2);
        Tmin=GetValue(Line,72,5,2);
        /*
        if(Tmax>Tmin) strcpy(Type,"R");
        else strcpy(Type,"T");
        */
        strcpy(Type,"T");
      }
      GetStr(Line,13,1,1,Ckt);
      if(!strcmp(Ckt," ")) strcpy(Ckt,"0");
      Eptr=ElemInList2(ACptr,ACptrp,NacEl,Type,Ckt,TRUE);
      if (Eptr!=NULL) {
        Zb=KVp*KVp/Sn;
        R=GetValue(Line,45,7,5)/Zb;
        X=GetValue(Line,52,8,5)/Zb;
        if (fabs(R)<1e-10 && fabs(X)<1e-10) {
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          ErrorHalt("AC element is a short circuit. Try eliminating it.");
          G=B=0;
        } else {
          G=R/(R*R+X*X);
          B=-X/(R*R+X*X);
        }
        B2=B1=GetValue(Line,60,7,3)*Zb/1000000./2;
        if (Line[79]=='T') {
          Taps=KV/KVp;
          Tap=GetValue(Line,29,5,0)*Taps;
        }
        else Tap=Taps=1;
        Ang=0;
        Eptr->Imax=GetValue(Line,23,5,0)/(Sn*1000/(sqrt(3)*KVp));
        Eptr->G=G;
        Eptr->B=B;
        Eptr->B1=B1;
        Eptr->B2=B2;
        Eptr->Tap=Tap;
        Eptr->Taps=Taps;
        Eptr->Ang=Ang;
        GetStr(Line,4,1,1,Eptr->Zone);
        strcpy(Eptr->Owner,Eptr->Zone);
        NacEl++;
        Eptr->Meter=ACptr;
        strcpy(Eptr->Type,Type);
        /*
        if (!strcmp(Type,"R")) {
          Eptr->Tmax=Tmax*Taps;
          Eptr->Tmin=Tmin*Taps;
          NregV++;
          if (!strcmp(ACptrp->Type,"B")) strcpy(ACptrp->Type,"BT");
          ACptrp->Reg=AddElemToList(ACptrp->Reg,Eptr);
          Eptr->Cont=ACptrp;
        }
        */
      }
    }


  /* -------------------- DC data -------------------------------- */
    else if (!strncmp(Line,"BD ",3) || !strncmp(Line,"BZ ",3)||
             !strncmp(Line,"LD ",3)) ReadEPRIdc(Line);


                        /* FACTS */

 /* ---------------------- SVC data ------------------------ */
    else if (!strncmp(Line,"FS ",3)) ReadSVC(Line);

 /* ---------------------- TCSC data ------------------------ */
    else if (!strncmp(Line,"FC ",3)) ReadTCSC(Line);

 /* ---------------------- STATCOM data ------------------------ */
    else if (!strncmp(Line,"FT ",3)) ReadSTATCOM(Line);

                       /* END FACTS */

    else if (Line[79]=='F') break;
    else {
      fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
      fCustomPrint(stderr,"***Warning: The program will ignore this line.\n");
    }
  }
  fclose(InputDataFile);
  MaxIter=50;

  if (!ReadADDfile()) for (ACptr=dataPtr->ACbus; ACptr!=NULL; ACptr=ACptr->Next){
    Aptr=(AreaData *) AreaInList(0,ACptr->Zone,Narea);
    if (Aptr->N==0) {
      Narea++;
      Aptr->N=Narea;
      strcpy(Aptr->Zone[1],ACptr->Zone);
    }
    ACptr->Area=Aptr;
    if (strpbrk(ACptr->Type,"S")) Aptr->Slack=Aptr->BSptr=ACptr;
    else if (strpbrk(ACptr->Type,"Q") && Aptr->Slack==NULL) Aptr->Slack=Aptr->BSptr=ACptr;
  }

}


/* --------------- ReadADDfile ------------------- */
BOOLEAN ReadADDfile()
/* Read ADD COLAS file with new voltage information, areas, and
   generator and load data for voltage collapse studies. */
{
  FILE *InputFile;
  char *Name,Line[BUFLEN],Code[20],Ckt[2],Zone[5];
  ACbusData *ACptr,*ACptrp,*ACptrs;
  AreaData *Aptr;
  ElementList *ELptr;
  ElementData *Eptr;
  VALUETYPE KV,KVp,KVs,KVmax,KVmin,val,Tap,Taps,Tmax,Tmin,Q,Qmax,Qmin,Pn,Qn,Sum=0;
  BOOLEAN flagAreas=FALSE,flagPrint=TRUE,flagScards=FALSE;
  INDEX N,NJcard=0,N2SVCarea=0,KVl;



  Name=NameParameter('6');
  if (!NullName(Name) && (InputFile=OpenInput(Name))!=NULL) {
    LineNum=0;
    for (;;) {
      if (fgets(Line,BUFLEN,InputFile)==NULL) break;
      LineNum++;

      /* --------------- Comments ----------------------------- */
      if (Line[79]=='C') continue;

      /* --------------- AC buses ----------------------------- */
      else if (Line[79]=='K') {
        N=GetInt(Line,1,3);
        GetStr(Line,4,1,1,Zone);
        KVl=GetInt(Line,5,1);
        sprintf(Code,"%3d%1s%1d",N,Zone,KVl);
        ACptr=ACbusInList2(0,Code,Nac,1,FALSE);
        if (ACptr==NULL) {
          fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
          fCustomPrint(stderr,"***Warning: This bus has not been defined on the main input data file.\n");
          fCustomPrint(stderr,"            This line in the ADD file will be ignored.\n");
        } else {
          KV=GetValue(Line,6,7,0);
          if (KV==0){
            fCustomPrint(stderr,"Input Line-> %d\n%s",LineNum,Line);
            fCustomPrint(stderr,"***Warning: This bus has a zero base bus voltage.\n");
            fCustomPrint(stderr,"            This line in the ADD file will be ignored.\n");
          } else {
            sprintf(ACptr->Name,"%5s %6.0lf",Code,KV);
            KVp=ACptr->KV;
            val=KVp/KV;
            ACptr->VCont=ACptr->V=ACptr->V*val;
            ACptr->KV=KV;
            KVmin=GetValue(Line,13,7,0);
            KVmax=GetValue(Line,20,7,0);
            if (KVmax>KVmin && KVmax>=KV && KVmin<=KV) {
              ACptr->Vlmax=KVmax/KV;
              ACptr->Vlmin=KVmin/KV;
            }
            val=KV*KV/(KVp*KVp);
            ACptr->B=ACptr->B*val;
            for(ELptr=ACptr->Elem; ELptr!=NULL; ELptr=ELptr->Next) {
              Eptr=ELptr->Eptr;
              if (Eptr->To==ACptr) {
                val=KV*KV/(KVp*KVp);
                Eptr->G=Eptr->G*val;
                Eptr->B=Eptr->B*val;
                Eptr->B1=Eptr->B1*val;
                Eptr->B2=Eptr->B2*val;
                val=KVp/KV;
                Eptr->Imax=Eptr->Imax/val;
                Eptr->Tap=Eptr->Tap*val;
                Eptr->Taps=Eptr->Taps*val;
                Eptr->Tmax=Eptr->Tmax*val;
                Eptr->Tmin=Eptr->Tmin*val;
              } else {
                val=KV/KVp;
                Eptr->Tap=Eptr->Tap*val;
                Eptr->Taps=Eptr->Taps*val;
                Eptr->Tmax=Eptr->Tmax*val;
                Eptr->Tmin=Eptr->Tmin*val;
              }
            }
          }
          GetStr(Line,50,1,1,Code);

⌨️ 快捷键说明

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