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

📄 pflow.c

📁 电力系统分析计算 学习调试程序 UNIX / LINUX / CYGWIN 系统使用
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifdef WINDOWS      delete Jptr;#else      free(Jptr);#endif      Jptr=Jptrp;    }    Mptr->ColHead[k]=Mptr->RowHead[k]=NULL;    P1Row->p[k]=P1Col->p[k]=0;    P2Row->p[k]=P2Col->p[k]=0;  }}/* --------------------------- Pflow --------------------------------- */#ifdef ANSIPROTOint Pflow(int iter,BOOLEAN flagDCLimits,BOOLEAN flagLimits,BOOLEAN flagFirst)#elseint Pflow(iter,flagDCLimits,flagLimits,flagFirst)int iter;BOOLEAN flagDCLimits,flagLimits,flagFirst;#endif/* Power Flow Routine. */{  SparseMatrixElement *Jptr;  AreaData *Aptr;  int i,m=0,PgMax,PgMaxH;  INDEX j,k,N,N1,N2,N3,MaxIterRun;  VALUETYPE MaxdFi1,cons,val;  BOOLEAN flag=FALSE,flagp=FALSE,flags=FALSE;  N3=iter;  if (flagH) MaxIterRun=MaxIter+iter-1;  else MaxIterRun=MaxIter;  RowPer=NewRow; ColPer=NewCol;  NewtonRapson:	  ACFunJac(Jac,&PgMax,TRUE,FALSE,flagFirst);  if(DCFunJac(Jac,TRUE,FALSE)) return(-iter);  SVCFunJac(Jac,TRUE,FALSE);                  /*  FACTS  */  TCSCFunJac(Jac,TRUE,FALSE);                 /*  FACTS  */  STATCOMFunJac(Jac,TRUE,FALSE);              /*  FACTS  */  if (flagH) HFunJac(TRUE,FALSE,NULL,Dx);  else if (iter!=1 && flagPoC) {    ACFunHes(TRUE,FALSE);    if(DCFunHes(TRUE,FALSE)) return(-iter);    SVCFunHes(TRUE,FALSE);                   /* FACTS  */    TCSCFunHes(TRUE,FALSE);                  /* FACTS  */    STATCOMFunHes(TRUE,FALSE);               /* FACTS  */  }  MaxdFi=Norm(dF,Jac->n1,&N1);  fCustomPrint(stderr,"\nIteration: %2d  ",N3);  PrintMismatch(MaxdFi,0,N1);  for (i=N3;i<=MaxIterRun;i++){    N=Jac->n1;    /* if (ExistParameter('d')) fCustomPrint(stderr,"i %d   MaxdFi %lf   Tol %lf\n",i,MaxdFi,Tol); */    if ((MaxdFi>Tol) || flagDCLimits) {      if ((i>1 || flagR || flagL) && !flagDCLimits && (flagLimits || (i==N3))) {        if(ExistParameter('d')) fCustomPrint(stderr,"Factor Jacobian.\n");        for(k=1; k<=N; k++) for(Jptr=Jac->RowHead[k];Jptr!=NULL;Jptr->Value=0,Jptr=Jptr->RowNext);        Aptr=ACFunJac(Jac,&PgMax,TRUE,TRUE,flagFirst);        if(DCFunJac(Jac,TRUE,TRUE)) return(-iter);        SVCFunJac(Jac,TRUE,TRUE);                    /* FACTS */        TCSCFunJac(Jac,TRUE,TRUE);                   /* FACTS */        STATCOMFunJac(Jac,TRUE,TRUE);                /* FACTS */        if (flagH) PgMaxH=HFunJac(TRUE,TRUE,Aptr,Dx);        else if (iter!=1 && flagPoC) {           ACFunHes(TRUE,TRUE);           if(DCFunHes(TRUE,TRUE)) return(-iter);           SVCFunHes(TRUE,FALSE);                   /* FACTS  */           TCSCFunHes(TRUE,FALSE);                  /* FACTS  */           STATCOMFunHes(TRUE,FALSE);               /* FACTS  */        }        if (PgMax<0 && (!flagH || (flagH && PgMaxH<0)) ) {           if (Aptr!=NULL) {              fCustomPrint(stderr,"\nError: Area %d %s does not have any spinning reserves.\n",Aptr->N,Aptr->Name);              fCustomPrint(stderr,"       Increase the maximum P generation in this area, otherwise\n");           } else {              fCustomPrint(stderr,"\nError: The system does not have any spinning reserves.\n");              fCustomPrint(stderr,"       Increase the maximum P generation in this system, otherwise\n");           }           fCustomPrint(stderr,"       the Jacobian matrix becomes singular.\n");           if (flagFirst) InitializeLoad();           WriteSolution(--i,TrueParamStr(2),"Pg Max. Problems:");           stopExecute(1);        }        m=factor(Jac);      }      if ((i==1 && !flagR && !flagL) || m==WARNINGEXIT || flagDCLimits) {        if(ExistParameter('d')) fCustomPrint(stderr,"Order and factor Jacobian.\n");        flagDCLimits=FALSE;        if (i>1 || flagR || flagL) DeleteJac(Jac,NewRow,NewCol,OldRow,OldCol);        Aptr=ACFunJac(Jac,&PgMax,TRUE,TRUE,flagFirst);        if(DCFunJac(Jac,TRUE,TRUE)) return(-iter);        SVCFunJac(Jac,TRUE,TRUE);                    /* FACTS */        TCSCFunJac(Jac,TRUE,TRUE);                   /* FACTS */        STATCOMFunJac(Jac,TRUE,TRUE);                /* FACTS */        if (flagH) PgMaxH=HFunJac(TRUE,TRUE,Aptr,Dx);        else if (iter!=1 && flagPoC) {           ACFunHes(TRUE,TRUE);           if(DCFunHes(TRUE,TRUE)) return(-iter);           SVCFunHes(TRUE,FALSE);                   /* FACTS  */           TCSCFunHes(TRUE,FALSE);                  /* FACTS  */           STATCOMFunHes(TRUE,FALSE);               /* FACTS  */        }        if (PgMax<0 && (!flagH || (flagH && PgMaxH<0)) ) {           if (Aptr!=NULL) {              fCustomPrint(stderr,"\nError: Area %d %s does not have any spinning reserves.\n",Aptr->N,Aptr->Name);              fCustomPrint(stderr,"       Increase the maximum P generation in this area, otherwise\n");           } else {              fCustomPrint(stderr,"\nError: The system does not have any spinning reserves.\n");              fCustomPrint(stderr,"       Increase the maximum P generation in this system, otherwise\n");           }           fCustomPrint(stderr,"       the Jacobian matrix becomes singular.\n");           if (flagFirst) InitializeLoad();           WriteSolution(--i,TrueParamStr(2),"Pg Max. Problems:");           stopExecute(1);        }        SortRowsColumns(Jac);        if(factorns(Jac,alpha,RowPartition,ColPartition,NewRow,NewCol,OldRow,OldCol)){           fCustomPrint(stderr,"*** Singular Jacobian (possible voltage collapse, contol or limit problems).\n");           fCustomPrint(stderr,"    Try changing the load levels, controls or limits, or use the -F option.\n");           if (flagFirst) InitializeLoad();           WriteSolution(--i,TrueParamStr(2),"Singular Jacobian:");           stopExecute(1);        }        SortRowsColumns(Jac);      }      fCustomPrint(stderr,"Iteration: %2d  ",i);      for(j=1;j<=N;j++) dx[j]=dF[j];      repsolp(Jac,dx,OldRow,NewCol);      if (m==WARNINGEXIT) SD0=0;      N2=10; k=j=0;      while(j<=N2){        cons= j;        if(j==0) cons= -1; else cons=1.0/pow(2.0,cons);        UpdateACvar(cons,j,TRUE,!ExistParameter('G'));        UpdateDCvar(cons,j,!flag);        UpdateSVCvar(cons,j);                        /* FACTS */        UpdateTCSCvar(cons,j);                       /* FACTS */        UpdateSTATCOMvar(cons,j);                    /* FACTS */        if (iter!=1 && flagPoC) UpdateEvector(cons);        ACFunJac(Jac,&PgMax,TRUE,FALSE,flagFirst);        flags=DCFunJac(Jac,TRUE,FALSE);        SVCFunJac(Jac,TRUE,FALSE);                   /* FACTS */        TCSCFunJac(Jac,TRUE,FALSE);                  /* FACTS */        STATCOMFunJac(Jac,TRUE,FALSE);               /* FACTS */        if(!flags) {            if (flagH) HFunJac(TRUE,FALSE,NULL,Dx);            else if (iter!=1 && flagPoC) {              ACFunHes(TRUE,FALSE);              flags=DCFunHes(TRUE,FALSE);              SVCFunHes(TRUE,FALSE);                   /* FACTS  */              TCSCFunHes(TRUE,FALSE);                  /* FACTS  */              STATCOMFunHes(TRUE,FALSE);               /* FACTS  */           }        }        if (!flags) {           val=Norm(dF,N,&N1);           PrintMismatch(val,k++,N1);           if (j==10 && val>2*MaxdFi) N2=20;           else if (MaxdFi>val) {              MaxdFi1=MaxdFi;              MaxdFi=val;              break;           }        }        j++;      }      /* if (ExistParameter('d')) fCustomPrint(stderr,"j %d   MaxdFi %lf   Tol %lf   MaxdFi1 %lf   tol %lf\n",j,MaxdFi,Tol,MaxdFi1,tol); */      if ((MaxdFi>Tol) && (j>N2 || (fabs(MaxdFi1-MaxdFi)/MaxdFi)<=tol)) {        if (flagL) return(-(++i));        if (!flagR) {          flagp=CheckRlimits();          /*  Apply Q limits after convergence          if (!ExistParameter('G') && !flagp) flagp=CheckQlimits();          */          if (!flagp) flagp=CheckVlimits();          if (!flagp) flagp=CheckQlimits();          if (!flagp) flagp=flag=CheckDClimits();          if (!flagp) flagp=flagDCLimits=ChangeSVCmode();       /* FACTS */          if (!flagp) flagp=flagDCLimits=ChangeTCSCmode();      /* FACTS */          if (!flagp) flagp=flagDCLimits=ChangeSTATCOMmode();  /* FACTS */        } else {          flagp=CheckRlimits();          if (!flagp) flagp=CheckVlimits(); else CheckVlimits();          if (!flagp) flagp=CheckQlimits(); else CheckQlimits();          if (!flagp) flagp=flagDCLimits=ChangeDCmode(); else flagDCLimits=ChangeDCmode();          if (!flagp) flagp=flagDCLimits=ChangeSVCmode(); else flagDCLimits=ChangeSVCmode();          /* FACTS */          if (!flagp) flagp=flagDCLimits=ChangeTCSCmode(); else flagDCLimits=ChangeTCSCmode();        /* FACTS */          if (!flagp) flagp=flagDCLimits=ChangeSTATCOMmode(); else flagDCLimits=ChangeSTATCOMmode();  /* FACTS */          flagL=TRUE;       }       if(!flagp) {          if (flagR) return(-(++i));          MaxdFi=val;          fCustomPrint(stderr,"\n *** The case diverges (possible voltage collapse or AC/DC/FACTS control\n");          fCustomPrint(stderr,"     problems).  Try changing the load levels or AC/DC/FACTS controls, or\n");          fCustomPrint(stderr,"     use the -F option or decrease the tolerance between two\n");          fCustomPrint(stderr,"     consecutive iterations with the -t option.\n");          if (flagFirst) InitializeLoad();          WriteSolution(i,TrueParamStr(2),"Divergence:");          stopExecute(1);        }      }    } else break;  }  /* if (ExistParameter('d')) fCustomPrint(stderr,"i %d   MaxdFi %lf   Tol %lf\n",i,MaxdFi,Tol); */  if (i>MaxIterRun && MaxdFi>Tol) {     if (flagR) return(-i);     fCustomPrint(stderr,"\n *** The case has not been solved (possible voltage collapse, AC/DC/FACTS control\n");     fCustomPrint(stderr,"     problems, or too few iterations).  Try running the case using the -F\n");     fCustomPrint(stderr,"     option, or change load levels, AC/DC/FACTS controls, or increase the maximum\n");     fCustomPrint(stderr,"     number of iterations with the -M option.\n");     if (flagFirst) InitializeLoad();     WriteSolution(--i,TrueParamStr(2),"Unsolved case:");     stopExecute(1);  }  /*    Apply Q limits after convergence  N3=i;  if (ExistParameter('G') && !flagR) {     flagp=CheckQlimits();     if (flagp) goto NewtonRapson;  }  */  if (flagFirst) InitializeLoad();  return(i);}

⌨️ 快捷键说明

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