📄 updatefa.c
字号:
/* Update FACTS 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 UpdateSVCvar(VALUETYPE cons,INDEX j);void UpdateTCSCvar(VALUETYPE cons,INDEX j);void UpdateSTATCOMvar(VALUETYPE cons,INDEX j);BOOLEAN ChangeSVCmode(void);BOOLEAN ChangeTCSCmode(void);BOOLEAN ChangeSTATCOMmode(void);#elsevoid UpdateSVCvar();void UpdateTCSCvar();void UpdateSTATCOMvar();BOOLEAN ChangeSVCmode();BOOLEAN ChangeTCSCmode();BOOLEAN ChangeSTATCOMmode();#endif/* ------- Global Variables ------ */extern Data *dataPtr;extern SparseMatrix *Jac;extern INDEX MaxIter,Nac,NacEl,NregPQ,NregV,Ndc,Nslack,Nvolt,Narea,NacVar,Bl, Nsvc,Ntcsc,NtcscVar,Nstatcom; /* FACTS */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,PQlim,Tlim,Qlim,Vlim,flagH,flagPoC,flagL,flagR,flagBS;#ifdef ANSIPROTOvoid UpdateSVCvar(VALUETYPE cons,INDEX j)#elsevoid UpdateSVCvar(cons,j)VALUETYPE cons;INDEX j;#endif{ SVCbusData *SVCptr; INDEX i; i=NacVar+11*Ndc/2; for(SVCptr=dataPtr->SVCbus;SVCptr!=NULL;SVCptr=SVCptr->Next){ SVCptr->Qsvc=SVCptr->Qsvc+cons*dx[i+1]; SVCptr->Bv=SVCptr->Bv+cons*dx[i+2]; if(!strcmp(SVCptr->Cont,"AL")){ if (j==0) SVCptr->val=SVCptr->alpha_svc; SVCptr->val=SVCptr->val+cons*dx[i+3]; if(SVCptr->val>=SVCptr->AlphaMax) SVCptr->alpha_svc=SVCptr->AlphaMax; else if(SVCptr->val<=SVCptr->AlphaMin) SVCptr->alpha_svc=SVCptr->AlphaMin; else SVCptr->alpha_svc=SVCptr->val; } else if(!strcmp(SVCptr->Cont,"MN")){ if (j==0) SVCptr->val=SVCptr->Vvar; SVCptr->val=SVCptr->val+cons*dx[i+3]; if(SVCptr->val<=SVCptr->Vref) SVCptr->Vvar=SVCptr->Vref; else SVCptr->Vvar=SVCptr->val; } else { if (j==0) SVCptr->val=SVCptr->Vvar; SVCptr->val=SVCptr->val+cons*dx[i+3]; if(SVCptr->val>=SVCptr->Vref) SVCptr->Vvar=SVCptr->Vref; else SVCptr->Vvar=SVCptr->val; } i=i+3; }}#ifdef ANSIPROTOBOOLEAN ChangeSVCmode()#elseBOOLEAN ChangeSVCmode()#endif{ SVCbusData *SVCptr; BOOLEAN flag=FALSE; INDEX i; i=NacVar+11*Ndc/2; for(SVCptr=dataPtr->SVCbus;SVCptr!=NULL;SVCptr=SVCptr->Next){ if(!strcmp(SVCptr->Cont,"AL") && SVCptr->alpha_svc>=SVCptr->AlphaMax){ strcpy(SVCptr->Cont,"MX"); SVCptr->alpha_svc=SVCptr->AlphaMax; SVCptr->Vvar=SVCptr->Vref; if (flagH) x0[i+3]=SVCptr->Vvar; fCustomPrint(stderr,"***Warning: %s SVC firing angle is at its maximum limit.\n",SVCptr->Name); fCustomPrint(stderr," The SVC will be treated as a fixed capacitive reactance.\n"); flag=TRUE; } else if(!strcmp(SVCptr->Cont,"AL") && SVCptr->alpha_svc<=SVCptr->AlphaMin){ strcpy(SVCptr->Cont,"MN"); SVCptr->alpha_svc=SVCptr->AlphaMin; SVCptr->Vvar=SVCptr->Vref; if (flagH) x0[i+3]=SVCptr->Vvar; fCustomPrint(stderr,"***Warning: %s SVC firing angle is at its minimum limit.\n",SVCptr->Name); fCustomPrint(stderr," The SVC will be treated as a fixed inductive reactance.\n"); flag=TRUE; } else if(!strcmp(SVCptr->Cont,"MX") && SVCptr->Vvar>=SVCptr->Vref){ strcpy(SVCptr->Cont,"AL"); SVCptr->alpha_svc=SVCptr->AlphaMax; SVCptr->Vvar=SVCptr->Vref; if (flagH) x0[i+3]=SVCptr->alpha_svc; fCustomPrint(stderr,"***Warning: %s SVC firing angle is within limits.\n",SVCptr->Name); fCustomPrint(stderr," The SVC voltage is now within controllable range.\n"); flag=TRUE; } else if(!strcmp(SVCptr->Cont,"MN") && SVCptr->Vvar<=SVCptr->Vref){ strcpy(SVCptr->Cont,"AL"); SVCptr->alpha_svc=SVCptr->AlphaMin; SVCptr->Vvar=SVCptr->Vref; if (flagH) x0[i+3]=SVCptr->alpha_svc; fCustomPrint(stderr,"***Warning: %s SVC firing angle is within limits.\n",SVCptr->Name); fCustomPrint(stderr," The SVC voltage is now within controllable range.\n"); flag=TRUE; } i=i+3; } return(flag);}#ifdef ANSIPROTOvoid UpdateTCSCvar(VALUETYPE cons,INDEX j)#elsevoid UpdateTCSCvar(cons,j)VALUETYPE cons;INDEX j;#endif{ TCSCbusData *TCSCptr; INDEX i; i=NacVar+11*Ndc/2+3*Nsvc; for(TCSCptr=dataPtr->TCSCbus;TCSCptr!=NULL;TCSCptr=TCSCptr->Next){ TCSCptr->Ptcsc=TCSCptr->Ptcsc+cons*dx[i+1]; TCSCptr->Qtcsck=TCSCptr->Qtcsck+cons*dx[i+2]; TCSCptr->Qtcscm=TCSCptr->Qtcscm+cons*dx[i+3]; TCSCptr->Be=TCSCptr->Be+cons*dx[i+4]; if (j==0) TCSCptr->val=TCSCptr->alpha_tcsc; TCSCptr->val=TCSCptr->val+cons*dx[i+5]; if(TCSCptr->val>=TCSCptr->AlphaMax) TCSCptr->alpha_tcsc=TCSCptr->AlphaMax; else if(TCSCptr->val<=TCSCptr->AlphaMin) TCSCptr->alpha_tcsc=TCSCptr->AlphaMin; else TCSCptr->alpha_tcsc=TCSCptr->val; TCSCptr->Itcsc=TCSCptr->Itcsc+cons*dx[i+6]; TCSCptr->delta_t=TCSCptr->delta_t+cons*dx[i+7]; i=i+7; }}#ifdef ANSIPROTOBOOLEAN ChangeTCSCmode()#elseBOOLEAN ChangeTCSCmode()#endif{ TCSCbusData *TCSCptr; VALUETYPE alpha,Xc,Xl,Be; BOOLEAN flag=FALSE; for(TCSCptr=dataPtr->TCSCbus;TCSCptr!=NULL;TCSCptr=TCSCptr->Next){ alpha=TCSCptr->alpha_tcsc; Xc=TCSCptr->Xc; Xl=TCSCptr->Xl; if(!strpbrk(TCSCptr->Cont,"X")&& TCSCptr->alpha_tcsc>=TCSCptr->AlphaMax){ strcpy(TCSCptr->Cont,"X"); Be=1.0/Xc-(2.0*PI-2.0*alpha+sin(2.0*alpha))/(PI*Xl); TCSCptr->Bset=Be; fCustomPrint(stderr,"***Warning: %s TCSC firing angle is at its maximum limit.\n",TCSCptr->Name); fCustomPrint(stderr," The TCSC will be treated as a fixed series capacitor.\n"); flag=TRUE; } else if(!strpbrk(TCSCptr->Cont,"X")&& TCSCptr->alpha_tcsc<=TCSCptr->AlphaMin){ strcpy(TCSCptr->Cont,"X"); Be=1.0/Xc-(2.0*PI-2.0*alpha+sin(2.0*alpha))/(PI*Xl); TCSCptr->Bset=Be; fCustomPrint(stderr,"***Warning: %s TCSC firing angle is at its minimum limit.\n",TCSCptr->Name); fCustomPrint(stderr," The TCSC will be treated as a fixed series capacitor.\n"); flag=TRUE; } } return(flag);}#ifdef ANSIPROTOvoid UpdateSTATCOMvar(VALUETYPE cons,INDEX j)#elsevoid UpdateSTATCOMvar(cons,j)VALUETYPE cons;INDEX j;#endif{ STATCOMbusData *STATCOMptr; VALUETYPE Q,theta,vals; INDEX i; i=NacVar+11*Ndc/2+3*Nsvc+NtcscVar; for(STATCOMptr=dataPtr->STATCOMbus;STATCOMptr!=NULL;STATCOMptr=STATCOMptr->Next){ Q=STATCOMptr->Q; if(!strcmp(STATCOMptr->Cont,"PW") || !strcmp(STATCOMptr->Cont,"AL") ){ if (j==0) STATCOMptr->val=STATCOMptr->I; STATCOMptr->val=STATCOMptr->val+cons*dx[i+1]; if(STATCOMptr->val<=0) STATCOMptr->I=0.0001; else if(STATCOMptr->val>=STATCOMptr->Imax && Q>0) STATCOMptr->I=STATCOMptr->Imax; else if(STATCOMptr->val>=STATCOMptr->Imin && Q<0) STATCOMptr->I=STATCOMptr->Imin; else STATCOMptr->I=STATCOMptr->val; } else if(!strcmp(STATCOMptr->Cont,"MX")){ if (j==0) STATCOMptr->val=STATCOMptr->Vvar; STATCOMptr->val=STATCOMptr->val+cons*dx[i+1]; if(STATCOMptr->val<=STATCOMptr->Vref) STATCOMptr->Vvar=STATCOMptr->Vref; else STATCOMptr->Vvar=STATCOMptr->val; } else { if (j==0) STATCOMptr->val=STATCOMptr->Vvar; STATCOMptr->val=STATCOMptr->val+cons*dx[i+1]; if(STATCOMptr->val>=STATCOMptr->Vref) STATCOMptr->Vvar=STATCOMptr->Vref; else STATCOMptr->Vvar=STATCOMptr->val; } theta=STATCOMptr->theta+cons*dx[i+2]; if (theta>=0) vals=1.00; else vals=-1.00; if (fabs(theta)>2*PI) theta=theta-vals*floor(fabs(theta)/(2*PI))*2*PI; if (fabs(theta)>PI) theta=theta-vals*2*PI; STATCOMptr->theta=theta; STATCOMptr->Vdc=STATCOMptr->Vdc+cons*dx[i+3]; STATCOMptr->k=STATCOMptr->k+cons*dx[i+4]; STATCOMptr->alpha=STATCOMptr->alpha+cons*dx[i+5]; STATCOMptr->P=STATCOMptr->P+cons*dx[i+6]; STATCOMptr->Q=STATCOMptr->Q+cons*dx[i+7]; i=i+7; }}#ifdef ANSIPROTOBOOLEAN ChangeSTATCOMmode()#elseBOOLEAN ChangeSTATCOMmode()#endif{ STATCOMbusData *STATCOMptr; BOOLEAN flag=FALSE; VALUETYPE Q; INDEX i; i=NacVar+11*Ndc/2+3*Nsvc+NtcscVar; for(STATCOMptr=dataPtr->STATCOMbus;STATCOMptr!=NULL;STATCOMptr=STATCOMptr->Next){ Q=STATCOMptr->Q; if((!strcmp(STATCOMptr->Cont,"PW") || !strcmp(STATCOMptr->Cont,"AL"))&& STATCOMptr->I>=STATCOMptr->Imax && Q>0){ strcpy(STATCOMptr->Cont,"MX"); STATCOMptr->I=STATCOMptr->Imax; STATCOMptr->Vvar=STATCOMptr->Vref; if (flagH) x0[i+1]=STATCOMptr->Vvar; fCustomPrint(stderr,"***Warning: %s STATCOM current is at its maximum limit.\n",STATCOMptr->Name); fCustomPrint(stderr," The STATCOM will be treated as a fixed inductive current source.\n"); flag=TRUE; } else if((!strcmp(STATCOMptr->Cont,"PW") || !strcmp(STATCOMptr->Cont,"AL"))&& STATCOMptr->I>=STATCOMptr->Imin && Q<0){ strcpy(STATCOMptr->Cont,"MN"); STATCOMptr->I=STATCOMptr->Imin; STATCOMptr->Vvar=STATCOMptr->Vref; if (flagH) x0[i+1]=STATCOMptr->Vvar; fCustomPrint(stderr,"***Warning: %s STATCOM current is at its minimum limit.\n",STATCOMptr->Name); fCustomPrint(stderr," The STATCOM will be treated as a fixed capacitive current source.\n"); flag=TRUE; } else if(!strcmp(STATCOMptr->Cont,"MN") && STATCOMptr->Vvar>=STATCOMptr->Vref){ strcpy(STATCOMptr->Cont,STATCOMptr->Cont1); STATCOMptr->I=STATCOMptr->Imax; STATCOMptr->Vvar=STATCOMptr->Vref; if (flagH) x0[i+1]=STATCOMptr->I; fCustomPrint(stderr,"***Warning: %s STATCOM current is within limits.\n",STATCOMptr->Name); fCustomPrint(stderr," The STATCOM voltage is now within controllable range.\n"); flag=TRUE; } else if(!strcmp(STATCOMptr->Cont,"MX") && STATCOMptr->Vvar<=STATCOMptr->Vref){ strcpy(STATCOMptr->Cont,STATCOMptr->Cont1); STATCOMptr->I=STATCOMptr->Imin; STATCOMptr->Vvar=STATCOMptr->Vref; if (flagH) x0[i+1]=STATCOMptr->I; fCustomPrint(stderr,"***Warning: %s STATCOM current is within limits.\n",STATCOMptr->Name); fCustomPrint(stderr," The STATCOM voltage is now within controllable range.\n"); flag=TRUE; } i=i+7; } return(flag);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -