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

📄 pointl.c

📁 电力系统分析计算 学习调试程序 UNIX / LINUX / CYGWIN 系统使用
💻 C
字号:
/* Point of Collapse: -Build the AC/DC Hessian.                      -Find initial guess for the left e-vector,        Main. */#include "pointl.h"#ifdef ANSIPROTOvoid InitializeLoad(void);void PrintLeftEvector(INDEX N,FILE *Out);#elsevoid InitializeLoad();void PrintLeftEvector();#endifextern BOOLEAN flagVloads;/* -----------------UpdateEvector ---------------------------- */#ifdef ANSIPROTOvoid UpdateEvector(VALUETYPE cons)#elsevoid UpdateEvector(cons)VALUETYPE cons;#endif{  INDEX i,N;  N=NacVar+11*Ndc/2+3*Nsvc+NtcscVar+7*Nstatcom;   /* FACTS */  for(i=1;i<=N;i++) x0[i]=x0[i]+cons*dx[i+N];  Dparam=Dparam+cons*dx[Jac->n1];  lambda=param0+Dparam;}/* ----------------- Evector ---------------------------- */#ifdef ANSIPROTOint Evector(int M,int iter,VALUETYPE tol,BOOLEAN RightEvector,VALUETYPE *EigenValue)#elseint Evector(M,iter,tol,RightEvector,EigenValue)int M,iter;VALUETYPE tol;BOOLEAN RightEvector;VALUETYPE *EigenValue;#endif/* Find an inital guess for the left eigenvector. */{  AreaData *Aptr;  VALUETYPE val,Nx0;  INDEX i,N,count;  int PgMax;  FILE *Out;  if(ExistParameter('d')) fCustomPrint(stderr,"Order and factor Jacobian.\n");  DeleteJac(Jac,NewRow,NewCol,OldRow,OldCol);  N=Jac->n2=Jac->n1=NacVar+11*Ndc/2+3*Nsvc+NtcscVar+7*Nstatcom;    /* FACTS */  NewRow->N=NewCol->N=N;  OldRow->N=OldCol->N=N;  RowPartition->N=ColPartition->N=1;  RowPartition->p[1]=ColPartition->p[1]=N;  Aptr=ACFunJac(Jac,&PgMax,FALSE,TRUE,FALSE);  if(DCFunJac(Jac,FALSE,TRUE)) return(-iter);  SVCFunJac(Jac,FALSE,TRUE);      /*  FACTS  */  TCSCFunJac(Jac,FALSE,TRUE);     /*  FACTS  */  STATCOMFunJac(Jac,FALSE,TRUE);  /*  FACTS  */  if (PgMax<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");    WriteSolution(--iter,TrueParamStr(2),"Pg Max. Problems:");    stopExecute(1);  }  if (!RightEvector) TransposeMatrix(Jac);  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");    WriteSolution(--iter,TrueParamStr(2),"Singular Jacobian:");    stopExecute(1);  }  SortRowsColumns(Jac);  for(i=1;i<=N;i++) x0[i]=dF[i]=1;  Nx0=1;  val=0;  count=0;  while(fabs((Nx0-val)/Nx0)>tol) {    val=Nx0;    repsolp(Jac,x0,OldRow,NewCol);    for(Nx0=0,i=1;i<=N;i++) {      if(x0[i]==dF[i]) x0[i]=0;      dF[i]=x0[i];      if(fabs(x0[i])>Nx0) Nx0=fabs(x0[i]);    }    for(i=1;i<=N;i++) x0[i]=x0[i]/Nx0;    count++;    if(ExistParameter('d')) fCustomPrint(stderr,"Evect iter.=%d  Max_x0i=%lf  E_value=%lf\n",count,Nx0,1./Nx0);    if(count>M) break;  }  *EigenValue=1./Nx0;  if (ExistParameter('d')) {    Out=OpenOutput("evect.dat");    fCustomPrint(Out,"%d 1\n",N);    for(i=1;i<=N;i++) fCustomPrint(Out,"%d 1 %-lg\n",i,x0[i]);    fCustomPrint(Out,"0 0 0.0\n");    fclose(Out);  }  return(iter);}/* --------------------------- PrintLeftEvector --------------------------------- */#ifdef ANSIPROTOvoid PrintLeftEvector(INDEX N,FILE *Out)#elsevoid PrintLeftEvector(N,Out)INDEX N;FILE *Out;#endif/* Print "zero" left e-vector */{  INDEX i,l,k,I,J;  ACbusData *ACptr;  DCbusData *DCptrR;  SVCbusData *SVCptr;                  /* FACTS */  TCSCbusData *TCSCptr;                /* FACTS */  STATCOMbusData *STATCOMptr;          /* FACTS */  ElementData *Eptr;  ElementList *ELptr;  char str[80];  fCustomPrint(Out,"%d 1\n",N);  for (i=0,ACptr=dataPtr->ACbus; ACptr!=NULL; ACptr=ACptr->Next){    sprintf(str,"dP%-d",ACptr->Num); i++;    fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    sprintf(str,"dQ%-d",ACptr->Num);  i++;    fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    if(Acont && strpbrk(ACptr->Type,"A")){      sprintf(str,"dPA%-d",ACptr->Area->N); i++;      fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    }    if (PQcont) for(ELptr=ACptr->Reg;ELptr!=NULL;ELptr=ELptr->Next) {      Eptr=ELptr->Eptr;      if(strpbrk(Eptr->Type,"PQNM")) {         if (Eptr->From==ACptr) {           I=Eptr->From->Num;           J=Eptr->To->Num;         } else {           J=Eptr->From->Num;           I=Eptr->To->Num;         }         if(!strcmp(Eptr->Type,"RP") || strpbrk(Eptr->Type,"PM")){           sprintf(str,"dP%-d_%-d",I,J); i++;           fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);         } else {           sprintf(str,"dQ%-d_%-d",I,J); i++;           fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);         }      }    }    if (ACptr->Gen!=NULL) {      i=ACptr->Gen->Nvar;      sprintf(str,"dPg%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dQg%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dEq%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dEd%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dVd%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dVq%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dId%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dIq%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dVr%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dVi%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);      sprintf(str,"dIa%-d",ACptr->Num); fCustomPrint(Out,"%4d %8s %-11.5g\n",++i,str,x0[i]);    }  }  for(k=0,DCptrR=dataPtr->DCbus;DCptrR!=NULL;DCptrR=DCptrR->Next) if(!strcmp(DCptrR->Type,"R")){    for (k++,l=1;l<=11;l++){      sprintf(str,"Fdc%-d_%-d",k,l); i++;      fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    }  }                                       /* FACTS */  for(k=0,SVCptr=dataPtr->SVCbus;SVCptr!=NULL;SVCptr=SVCptr->Next){    for (k++,l=1;l<=3;l++){      sprintf(str,"Fsvc%-d_%-d",k,l); i++;      fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    }  }  for(k=0,TCSCptr=dataPtr->TCSCbus;TCSCptr!=NULL;TCSCptr=TCSCptr->Next){    for (k++,l=1;l<=7;l++){      sprintf(str,"Ftcsc%-d_%-d",k,l); i++;      fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    }  }  for(k=0,STATCOMptr=dataPtr->STATCOMbus;STATCOMptr!=NULL;STATCOMptr=STATCOMptr->Next){    for (k++,l=1;l<=7;l++){      sprintf(str,"Fstat%-d_%-d",k,l); i++;      fCustomPrint(Out,"%4d %8s %-11.5g\n",i,str,x0[i]);    }  }                                    /* END OF FACTS */  fCustomPrint(Out,"%4d %8s %-11.5g\n",0,"0",0.);  fclose(Out);}/* ------------------- PoCPoint --------------------- */#ifdef ANSIPROTOint PoCPoint(void)#elseint PoCPoint()#endif/* Find PoC. */{  int count,iter,M;  INDEX i,N,J;  FILE *Out;  BOOLEAN flag,flagp,flags,flagD;  VALUETYPE NDx,Nlim,Nlimp,EigenValue;  RealParameter('L',&lambda,-1e6,1e6);  param0=lambda;  if ((ExistParameter('D') && (!NullName(NameParameter('D')))) || flagVloads) flagD=TRUE;  else flagD=FALSE;  /* Solve base load  */  if (lambda!=0 && !flagD) {    InitializeLoad();    iter=Pflow(1,FALSE,TRUE,FALSE);    fCustomPrint(stderr,"Loading factor -> %-10.6lg  ",lambda);  } else {    iter=Pflow(1,FALSE,TRUE,TRUE);    fCustomPrint(stderr,"Loading factor -> %-10.6lg  ",0.);  }  if(iter<0) return(iter);  fCustomPrint(stderr,"**** Base Case Solved ****\n\n");  flagp=DCsetup();  /* Initial loading of system to get it closer to bifurcation */  if(Direction(Jac,Dx,flagp)<0) return(-iter);  for(NDx=0,i=1;i<=Jac->n1;i++) if(fabs(Dx[i])>NDx) NDx=fabs(Dx[i]);  flagR=TRUE;  if (NDx) {    if (Nvolt!=0) Dparam=sqrt((double) Nvolt)/NDx;    else Dparam=1/NDx;    for(i=1;i<=Jac->n1;i++) Dx[i]=Dparam*Dx[i];    Nlim=LoadX0(TRUE,TRUE,FALSE);    if (ExistParameter('d')) fCustomPrint(stderr,"Dparam=%lf   Nlim=%lf\n",Dparam,Nlim);    Nlimp=0;    if (Qlim) Nlimp+=Nvolt;    if (Zlim) Nlimp+=NZvolt;    if (Tlim) Nlimp+=NregV;    if (PQlim) Nlimp+=NregPQ;    while((Nlim-1)>Nlimp*0.1) {      Dparam=0.8*Dparam;      for(i=1;i<=Jac->n1;i++) Dx[i]=0.8*Dx[i];      Nlim=LoadX0(FALSE,TRUE,FALSE);      if (ExistParameter('d')) fCustomPrint(stderr,"Dparam=%lf   Nlim=%lf\n",Dparam,Nlim);    }    iter=Pflow(1,flagp,TRUE,FALSE);    if(iter<0) iter= -iter;    else { param0=lambda; Dparam=0;}    fCustomPrint(stderr,"****  Initial Loading  ****   ");    fCustomPrint(stderr,"Loading factor -> %-10.6lg\n\n",lambda);  }  J=4;  Evector(J,iter,0.001,FALSE,&EigenValue);  /* Direct method */  for(flagL=flags=TRUE,M=5,count=0;;) {    N=Jac->n2=Jac->n1=2*(NacVar+11*Ndc/2+3*Nsvc+NtcscVar+7*Nstatcom)+1;    /* FACTS */    NewRow->N=NewCol->N=N;    OldRow->N=OldCol->N=N;    RowPartition->p[1]=ColPartition->p[1]=N;    iter=Pflow(iter,TRUE,TRUE,FALSE);    if(ExistParameter('d')) fCustomPrint(stderr,"Loading factor -> %-10.6lg\n",lambda);    if (count==M) break;    /* If no convergence, recalculate e-vector */    if (iter<0) {      iter= -iter;      if (iter>MaxIter) {        fCustomPrint(stderr,"\n *** The PoC case has not been solved (possible initial guess problems, or\n");        fCustomPrint(stderr,"     AC/DC/FACTS problems, or too few iterations). Try running the case using\n");        fCustomPrint(stderr,"     the -F option, or change load levels, AC/DC controls, or increase the\n");        fCustomPrint(stderr,"     maximum number of iterations with the -M option.\n");        fCustomPrint(stderr,"Loading factor -> %-10.6lg\n\n",lambda);        WriteSolution(iter,TrueParamStr(2),"Unsolved PoC case:");        stopExecute(1);      }      flag=ChangeDCmode();      if (!flag) flag=ChangeSVCmode(); else ChangeSVCmode();            /* FACTS */      if (!flag) flag=ChangeTCSCmode(); else ChangeTCSCmode();          /* FACTS */      if (!flag) flag=ChangeSTATCOMmode(); else ChangeSTATCOMmode();    /* FACTS */      if (!flag) {        flag=CheckRlimits();        if(!flag) flag=CheckVlimits(); else CheckVlimits();        if(!flag) flag=CheckQlimits(); else CheckQlimits(); }      if (flag) count=0;      if (count>0 && flags) {J=0; flags=FALSE;}      else {J=4; flags=TRUE;}      if((iter=Evector(J,iter,0.001,FALSE,&EigenValue))<0) return(-iter);    } else { count=0; break;}    if (!flag) count++;  }  /* -------------------------- Print left e-vector ----------------------- */  if (!NullName(NameParameter('C'))) {    Out=OpenOutput(NameParameter('C'));    N=NacVar+11*Ndc/2+3*Nsvc+NtcscVar+7*Nstatcom;     /* FACTS */    PrintLeftEvector(N,Out);  }  if (count==M) {    fCustomPrint(stderr,"\n *** The PoC case has not been solved (possible initial guess problems, or\n");    fCustomPrint(stderr,"     AC/DC/FACTS problems, or too few iterations). Try running the case using\n");    fCustomPrint(stderr,"     the -F option, or change load levels, AC/DC controls, or increase the\n");    fCustomPrint(stderr,"     maximum number of iterations with the -M option.\n");    fCustomPrint(stderr,"Loading factor -> %-10.6lg\n\n",lambda);    WriteSolution(iter,TrueParamStr(2),"Unsolved PoC case:");    stopExecute(1);  }  return(iter);}

⌨️ 快捷键说明

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