📄 update.c
字号:
/* Update AC/DC variables. */#include <stdlib.h>//#ifndef WINDOWS//#include <stdio.h>//#else#include "pfwstdio.h"//#endif#include <math.h>#include <string.h>#include "constant.h"#include "param.h"#include "sparse.h"#include "pflow.h"#ifdef ANSIPROTOvoid UpdateACvar(VALUETYPE cons,INDEX j,BOOLEAN Limits,BOOLEAN Recover);void UpdateDCvar(VALUETYPE cons,INDEX j,BOOLEAN Limits);#elsevoid UpdateACvar();void UpdateDCvar();#endif/* ------- Global Variables ------ */extern Data *dataPtr;extern SparseMatrix *Jac;extern INDEX MaxIter,Nac,NacEl,NregPQ,NregV,Ndc,Nslack,Nvolt,Narea,NacVar,Bl,NZbuses,NXbuses;extern INDEX *ACvar;extern VALUETYPE *dx,*dF,tol,Tol,Sn,lambda,*x0;extern VALUETYPE K1,K2,MaxdFi,alpha;extern IntegerVector *NewRow,*OldRow,*NewCol,*OldCol,*RowPartition,*ColPartition;extern IntegerVector *RowPer,*ColPer;extern BOOLEAN Acont,PQcont,QRcont,Rcont,Xcont, PQlim,Tlim,Qlim,Vlim,Elim,Ilim,Zlim,Xlim, flagH,flagPoC,flagL,flagR,flagBS,flagPgMax,flagSmax;/* -----------------UpdateACvar ---------------------------- */#ifdef ANSIPROTOvoid UpdateACvar(VALUETYPE cons,INDEX j,BOOLEAN Limits,BOOLEAN Recover)#elsevoid UpdateACvar(cons,j,Limits,Recover)VALUETYPE cons;INDEX j;BOOLEAN Limits,Recover;#endif{ ACbusData *ACptr,*ACptrp,*BEptr; AClist *ALptr; ElementList *ELptr; ElementData *Eptr; VALUETYPE Pg,DPg,Qm,Pmax,PgMax; INDEX k; for(ALptr=dataPtr->KGbus;ALptr!=NULL;ALptr=ALptr->Next) { ACptr=ALptr->AC; k=ACvar[ACptr->N]; if (strpbrk(ACptr->Type,"S")) { ACptr->Kg=ACptr->Kg+cons*dx[k]; BEptr=ACptr; } else if (Acont) ACptr->Kg=ACptr->Kg+cons*dx[k+2]; } for (ACptr=dataPtr->ACbus; ACptr!=NULL; ACptr=ACptr->Next){ if (ACptr->Area!=NULL) BEptr=ACptr->Area->Slack; DPg=ACptr->DPg; if (flagBS) { if (ACptr!=BEptr) Pg=ACptr->Pg+lambda*DPg; else Pg=ACptr->Pg+BEptr->Kg; } else Pg=ACptr->Pg+BEptr->Kg*DPg; Pmax=ACptr->Smax*ACptr->Smax-ACptr->Qg*ACptr->Qg; if (Pmax>0) Pmax=sqrt(Pmax); else Pmax=99999999.; if (!flagSmax && Pmax<ACptr->PgMax) PgMax=Pmax; else if (!flagPgMax) PgMax=ACptr->PgMax; else PgMax=99999999.; if (Pg>PgMax) { Pg=PgMax; DPg=0; if (ACptr->flagPgMax!=1) ACptr->flagPgMax++; } else ACptr->flagPgMax=0; ACptr->PG=Pg; ACptr->DPG=DPg; ACptr->Pmax=PgMax; Qm=ACptr->Smax*ACptr->Smax-Pg*Pg; if (!flagSmax && Qm>0) { Qm=sqrt(Qm); if (ACptr->Qmax<Qm) ACptr->Max=ACptr->Qmax; else ACptr->Max=Qm; if (ACptr->Qmin>-Qm) ACptr->Min=ACptr->Qmin; else ACptr->Min=-Qm; } else { ACptr->Max=ACptr->Qmax; ACptr->Min=ACptr->Qmin; } if (!strcmp(ACptr->Type,"B") || !strcmp(ACptr->Type,"BA")) { k=ACvar[ACptr->N]; ACptr->Ang=ACptr->Ang+cons*dx[k]; if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; if (ACptr->val<=0) ACptr->V=0.00001; else ACptr->V=ACptr->val; } else if (strpbrk(ACptr->Type,"V")) { k=ACvar[ACptr->N]; ACptr->Ang=ACptr->Ang+cons*dx[k]; if (!strpbrk(ACptr->cont,"V")) { if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; if (Vlim && ACptr->val>ACptr->Vmax && Limits) ACptr->V=ACptr->Vmax; else if (Vlim && ACptr->val<ACptr->Vmin && Limits) ACptr->V=ACptr->Vmin; else if (ACptr->val<=0) ACptr->V=0.00001; else ACptr->V=ACptr->val; } else { if (j==0) ACptr->val=ACptr->Qg; ACptr->val=ACptr->val+cons*dx[k+1]; if (Recover && ACptr->V>=ACptr->Vmax && ACptr->val>ACptr->VCont && Limits) ACptr->Qg=ACptr->VCont; else if (Recover && ACptr->V<=ACptr->Vmin && ACptr->val<ACptr->VCont && Limits) ACptr->Qg=ACptr->VCont; else ACptr->Qg=ACptr->val; } } else if (strpbrk(ACptr->Type,"L")){ k=ACvar[ACptr->N]; ACptr->Ang=ACptr->Ang+cons*dx[k]; lambda=lambda+cons*dx[k+1]; if (flagH) { if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[Jac->n1]; if (ACptr->val<=0) ACptr->V=0.00001; else ACptr->V=ACptr->val; } } else if (QRcont && strpbrk(ACptr->Type,"G")){ k=ACvar[ACptr->N]; if (!strpbrk(ACptr->Type,"S")) ACptr->Ang=ACptr->Ang+cons*dx[k]; if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; if (ACptr->val<=0) ACptr->V=0.00001; else ACptr->V=ACptr->val; } else if (strpbrk(ACptr->Type,"Q,S") || (!QRcont && strpbrk(ACptr->Type,"G"))){ k=ACvar[ACptr->N]; if (!strpbrk(ACptr->Type,"S")) ACptr->Ang=ACptr->Ang+cons*dx[k]; if (strpbrk(ACptr->cont,"V")) { if (j==0) ACptr->val=ACptr->Qg; ACptr->val=ACptr->val+cons*dx[k+1]; if (Qlim && ACptr->val>ACptr->Max && Limits) ACptr->Qg=ACptr->Max; else if (Qlim && ACptr->val<ACptr->Min && Limits) ACptr->Qg=ACptr->Min; else ACptr->Qg=ACptr->val; } else { if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; if (ACptr->val<=0) ACptr->V=0.00001; else if (strpbrk(ACptr->cont,"Q")) { if (Recover && ACptr->Qg>=ACptr->Max && ACptr->val>ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else if (Recover && ACptr->Qg<=ACptr->Min && ACptr->val<ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else ACptr->V=ACptr->val; } else if (strpbrk(ACptr->cont,"E")) { if (Recover && ACptr->Gen->Eq>=ACptr->Gen->EqMax && ACptr->val>ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else if (Recover && ACptr->Gen->Eq<=ACptr->Gen->EqMin && ACptr->val<ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else ACptr->V=ACptr->val; } else if (strpbrk(ACptr->cont,"I")) { if (Recover && ACptr->Gen->Ia>=ACptr->Gen->IaMax && ACptr->val>ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else ACptr->V=ACptr->val; } else ACptr->V=ACptr->val; } } else if (strpbrk(ACptr->Type,"X")) { k=ACvar[ACptr->N]; ACptr->Ang=ACptr->Ang+cons*dx[k]; if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; if (ACptr->val<=0) ACptr->V=0.00001; else if (strpbrk(ACptr->cont,"X")) { if (Xlim && ACptr->val>ACptr->Vmax && Limits) ACptr->V=ACptr->Vmax; else if (Xlim && ACptr->val<ACptr->Vmin && Limits) ACptr->V=ACptr->Vmin; else ACptr->V=ACptr->val; } else if (strpbrk(ACptr->cont,"M")) { if (Recover && ACptr->val<ACptr->Vmax && Limits) ACptr->V=ACptr->Vmax; else ACptr->V=ACptr->val; } else { if (Recover && ACptr->val>ACptr->Vmin && Limits) ACptr->V=ACptr->Vmin; else ACptr->V=ACptr->val; } } else if (strpbrk(ACptr->Type,"Z")){ k=ACvar[ACptr->N]; ACptr->Ang=ACptr->Ang+cons*dx[k]; if (strpbrk(ACptr->cont,"V")) { if (j==0) ACptr->val=ACptr->Qg; ACptr->val=ACptr->val+cons*dx[k+1]; if (Zlim && ACptr->val>ACptr->Qmax && Limits) ACptr->Qg=ACptr->Qmax; else if (Zlim && ACptr->val<ACptr->Qmin && Limits) ACptr->Qg=ACptr->Qmin; else ACptr->Qg=ACptr->val; } else { if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; ACptr->Qg=ACptr->val*ACptr->val*ACptr->Bz; if (ACptr->val<=0) ACptr->V=0.00001; else if (Recover && ACptr->Qg>=ACptr->Qmax && ACptr->val>ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else if (Recover && ACptr->Qg<=ACptr->Qmin && ACptr->val<ACptr->VCont && Limits) ACptr->V=ACptr->VCont; else ACptr->V=ACptr->val; ACptr->Qg=ACptr->V*ACptr->V*ACptr->Bz; } } else if (strpbrk(ACptr->Type,"C")) { k=ACvar[ACptr->N]; ACptr->Ang=ACptr->Ang+cons*dx[k]; if (!QRcont) { if (j==0) ACptr->val=ACptr->V; ACptr->val=ACptr->val+cons*dx[k+1]; if (ACptr->val<=0) ACptr->V=0.00001; else ACptr->V=ACptr->val; } else if (ACptr->Kbg<1) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -