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

📄 homotpro.cpp

📁 用于电力系统潮流计算 c++程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* Homotopy Continuation Method:  Group 2. */

#include "homot.h"


/* ------- Global Variables ------ */
extern VALUETYPE *Dx,Dparam,param0,*x0,*x0p,Kh,Htol,SD0,AngTr,
                 DxiMax,VSFone,VSFinf,SF,TVI,lambda_o,
                 TotalPl,TotalQl,TotalPg,TotalQg;
extern INDEX TVIbus;
extern AClist *Vlist,*Vlistp;
extern int field;
extern BOOLEAN flagPrintTotalPl,flagPrintTotalQl,flagPrintTotalPg,flagPrintTotalQg;


/* --------------------------- InList --------------------------------- */
#ifdef ANSIPROTO
BOOLEAN InList(ACbusData *ACptr,AClist *Vptr)
#else
BOOLEAN InList(ACptr,Vptr)
ACbusData *ACptr;
AClist *Vptr;
#endif
/* Check whether bus in list for V profiles */
{
  AClist *Lptr;

  for(Lptr=Vptr;Lptr!=NULL;Lptr=Lptr->Next) {if(ACptr==Lptr->AC) return(TRUE);}
  return(FALSE);

}


/* --------------------------- MakeVlist --------------------------------- */
#ifdef ANSIPROTO
void MakeVlist(FILE *Out)
#else
void MakeVlist(Out)
FILE *Out;
#endif
/* Prepare list of buses/areas for voltage profiles. */
{
  ACbusData *ACptr,*ACptrM;
  AreaData *Aptr;
  AClist *Lptr,*Lptrp;
  DCbusData *DCptr;
  char Line[BUFLEN],BusName[BUFLEN],Type[BUFLEN],*ptr,*Name;
  FILE *Input;
  INDEX N,i,count,countp;
  VALUETYPE MaxV=0;

  Vlist=Vlistp=NULL;
  ACptrM=NULL;
  Name=NameParameter('i');
  flagPrintTotalPl=flagPrintTotalQl=flagPrintTotalPg=flagPrintTotalQg=FALSE;
  if (!NullName(Name) && (Input=fopen(Name,"rt"))!=NULL) {
    for (;;) {
      strcpy(Type,"");
      if (fgets(Line,BUFLEN,Input)==NULL) break;
      if ((count=sscanf(Line,"%d %s %s",&N,BusName,Type))>3 && strncmp(Line,"C",1)) {
        fprintf(stderr,"***Warning: Line-> %s",Line);
        fprintf(stderr,"            will be ignored in file %s.\n",Name);
      }
      else if (count>=2) {
        if (BusName[0]=='\"'||BusName[0]=='\'') {
          count=2;
          for(ptr=Line;*ptr!='\"'&&*ptr!='\'';ptr++); ptr++;
          for(i=0;*ptr!='\"'&&*ptr!='\''&&*ptr!='\n';BusName[i]= *ptr,i++,ptr++);
          BusName[i]='\0';
            ptr++;
          count+=sscanf(ptr,"%s",Type);
        }
        if (N==0 && !strcmp(BusName,"0") && !strcmp(Type,"PL"))      flagPrintTotalPl=TRUE;
        else if (N==0 && !strcmp(BusName,"0") && !strcmp(Type,"QL")) flagPrintTotalQl=TRUE;
        else if (N==0 && !strcmp(BusName,"0") && !strcmp(Type,"PG")) flagPrintTotalPg=TRUE;
        else if (N==0 && !strcmp(BusName,"0") && !strcmp(Type,"QG")) flagPrintTotalQg=TRUE;
        else {
          if (!strcmp(Type,"PA")){
            ACptr=NULL;
            for (Aptr=dataPtr->Area;Aptr!=NULL;Aptr=Aptr->Next)
              if(N==Aptr->N ||!strncmp(Aptr->Name,BusName,strlen(BusName))) break;
          }
          else {
            Aptr=NULL;
            for (ACptr=dataPtr->ACbus;ACptr!=NULL;ACptr=ACptr->Next)
              if(N==ACptr->Num||!strncmp(ACptr->Name,BusName,strlen(BusName))) break;
          }
          if(ACptr!=NULL || Aptr!=NULL){
            Lptr=Vlist;
#ifdef WINDOWS
            Vlist= new AClist;
#else
            Vlist=(AClist *) malloc(sizeof(AClist));
            if (Vlist==NULL) {
              fclose(Out);
              fclose(Input);
              ErrorHalt("Insufficient memory to allocate profile List.");
              exit(ERROREXIT);
            }
#endif
            Vlist->AC=ACptr;
            Vlist->Area=Aptr;
            if (ACptr!=NULL) Vlist->N=ACptr->Num;
            else             Vlist->N=Aptr->N;
            if (!strcmp(Type,"V") || !strcmp(Type,"D") || !strcmp(Type,"PL") || !strcmp(Type,"QL") ||
                !strcmp(Type,"PG") ||!strcmp(Type,"QG") ||!strcmp(Type,"PA")) strcpy(Vlist->Type,Type);
            else strcpy(Vlist->Type,"V");
            Vlist->Next=Lptr;
            Vlist->Prev=NULL;
            if(Lptr!=NULL) Lptr->Prev=Vlist;
          }
          else if (strncmp(Line,"C",1)) {
            fprintf(stderr,"***Warning: Line-> %s",Line);
            fprintf(stderr,"            will be ignored in file %s.\n",Name);
          }
        }
      }
    }
    Lptr=Vlist;
    while(Lptr!=NULL){
      Lptrp=Lptr->Next;
      Lptr->Next=Lptr->Prev;
      Lptr->Prev=Lptrp;
      if(Lptrp==NULL) Vlist=Lptr;
      Lptr=Lptrp;
    }
    fclose(Input);
  }
  if (Vlistp==NULL) {
    countp=1;
    while (countp<=8 && countp<=Nac) {
      MaxV=0;
      for (ACptr=dataPtr->ACbus;ACptr!=NULL;ACptr=ACptr->Next) {
        if(Nac<=8 && !InList(ACptr,Vlistp)) {
          ACptrM=ACptr;
          break;
        }
        else if((ACptr->Cont!=NULL &&(QRcont || !strpbrk(ACptr->Type,"G"))) ||
                (!Rcont && strpbrk(ACptr->Type,"T"))||
                (!QRcont && strpbrk(ACptr->Type,"C"))) {
          i=ACvar[ACptr->N]+1;
          if (fabs(Dx[i])>MaxV && !InList(ACptr,Vlistp)) {MaxV=fabs(Dx[i]); ACptrM=ACptr;}
        }
      }
      if(ACptrM!=NULL){
        Lptr=Vlistp;
#ifdef WINDOWS
        Vlistp= new AClist;
#else
        Vlistp=(AClist *) malloc(sizeof(AClist));
        if (Vlistp==NULL) {
          fclose(Out);
          ErrorHalt("Insufficient memory to allocate Voltage Profile Bus List.");
          exit(ERROREXIT);
        }
#endif
        Vlistp->AC=ACptrM;
        strcpy(Vlistp->Type,"V");
        Vlistp->N=ACptrM->Num;
        Vlistp->Area=NULL;
        Vlistp->Next=Lptr;
        Vlistp->Prev=NULL;
        if(Lptr!=NULL) Lptr->Prev=Vlistp;
        ACptrM=NULL;
        countp++;
      } else break;
    }
  }
  if (Vlist==NULL) Vlist=Vlistp;
  if (ExistParameter('m')){
    if (ExistParameter('O')) {
      for (DCptr=dataPtr->DCbus;DCptr!=NULL;DCptr=DCptr->Next) {
        for(Lptr=Vlist;Lptr!=NULL;Lptr=Lptr->Next) if(Lptr->AC==DCptr->AC && !strcmp(Lptr->Type,"V")) break;
        if (Lptr==NULL) {
          Lptr=Vlist;
#ifdef WINDOWS
          Vlist= new AClist;
#else
          Vlist=(AClist *) malloc(sizeof(AClist));
          if (Vlist==NULL) {
            fclose(Out);
            ErrorHalt("Insufficient memory to allocate Voltage Profile Bus List.");
            exit(ERROREXIT);
          }
#endif
          Vlist->AC=DCptr->AC;
          Vlist->Area=NULL;
          Vlist->N=DCptr->AC->Num;
          strcpy(Vlist->Type,"V");
          Vlist->Next=Lptr;
          Vlist->Prev=NULL;
          if(Lptr!=NULL) Lptr->Prev=Vlist;
        }
        for(Lptr=Vlist;Lptr!=NULL;Lptr=Lptr->Next) if(Lptr->AC==DCptr->AC && !strcmp(Lptr->Type,"D")) break;
        if (Lptr==NULL) {
          Lptr=Vlist;
#ifdef WINDOWS
          Vlist= new AClist;
#else
          Vlist=(AClist *) malloc(sizeof(AClist));
          if (Vlist==NULL) {
            fclose(Out);
            ErrorHalt("Insufficient memory to allocate Voltage Profile Bus List.");
            exit(ERROREXIT);
          }
#endif
          Vlist->AC=DCptr->AC;
          Vlist->Area=NULL;
          Vlist->N=DCptr->AC->Num;
          strcpy(Vlist->Type,"D");
          Vlist->Next=Lptr;
          Vlist->Prev=NULL;
          if(Lptr!=NULL) Lptr->Prev=Vlist;
        }
      }
    }
    fprintf(Out,"%c ",'%');
  }
  fprintf(Out,"L.F.\t");
  for(Lptr=Vlist;Lptr!=NULL;Lptr=Lptr->Next) fprintf(Out,"%s%-5d\t",Lptr->Type,Lptr->N);
  if (ExistParameter('e')) {
    for(Lptr=Vlist;Lptr!=NULL;Lptr=Lptr->Next) if (Lptr->AC!=NULL) {
      if (Lptr->AC->Gen!=NULL) {
        fprintf(Out,"Ia%-5d\t",Lptr->N);
        fprintf(Out,"Eq%-5d\t",Lptr->N);
        fprintf(Out,"dg%-5d\t",Lptr->N);
      }
    }
  }
  if (ExistParameter('O')) {
    fprintf(Out,"Vac\t");
    if (field>7) fprintf(Out,"\t");
  }
  if (ExistParameter('O') || ExistParameter('e')) {
    for (i=0,DCptr=dataPtr->DCbus;DCptr!=NULL;DCptr=DCptr->Next) if(!strcmp(DCptr->Type,"R")) {
      i+=2;
      if (ExistParameter('O')) {
        fprintf(Out,"a%1d\t",i-1); if (field>7) fprintf(Out,"\t");
        fprintf(Out,"b%1d\t",i-1); if (field>7) fprintf(Out,"\t");
        fprintf(Out,"d%1d\t",i-1); if (field>7) fprintf(Out,"\t");
        fprintf(Out,"a%1d\t",i);   if (field>7) fprintf(Out,"\t");
        fprintf(Out,"b%1d\t",i);   if (field>7) fprintf(Out,"\t");
        fprintf(Out,"d%1d\t",i);   if (field>7) fprintf(Out,"\t");
      } else if (ExistParameter('e')) {
        fprintf(Out,"alR_%1d\t",i);
        fprintf(Out,"gaI_%1d\t",i);
        fprintf(Out,"Id_%1d\t",i);
      }
    }
  }
  if (flagPrintTotalPl) fprintf(Out,"PL\t\t");
  if (flagPrintTotalQl) fprintf(Out,"QL\t\t");
  if (flagPrintTotalPg) fprintf(Out,"PG\t\t");
  if (flagPrintTotalQg) fprintf(Out,"QG\t\t");
  if (ExistParameter('f')) {
    fprintf(Out,"VSFone\t");
    fprintf(Out,"VSFbus\t");
    fprintf(Out,"VSFinf\t");
    fprintf(Out,"SF\t");
    if (TVI!=0) fprintf(Out,"TVI_%d\t%d_Rank",TVIbus,TVIbus);

⌨️ 快捷键说明

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