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

📄 updatefa.cpp

📁 用于电力系统潮流计算 c++程序
💻 CPP
字号:
/* 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 ANSIPROTO
void 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);
#else
void 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 ANSIPROTO
void UpdateSVCvar(VALUETYPE cons,INDEX j)
#else
void 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 ANSIPROTO
BOOLEAN ChangeSVCmode()
#else
BOOLEAN 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;
    fprintf(stderr,"***Warning: %s SVC firing angle is at its maximum limit.\n",SVCptr->Name);
    fprintf(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;
    fprintf(stderr,"***Warning: %s SVC firing angle is at its minimum limit.\n",SVCptr->Name);
    fprintf(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;
    fprintf(stderr,"***Warning: %s SVC firing angle is within limits.\n",SVCptr->Name);
    fprintf(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;
    fprintf(stderr,"***Warning: %s SVC firing angle is within limits.\n",SVCptr->Name);
    fprintf(stderr,"            The SVC voltage is now within controllable range.\n");
    flag=TRUE;
  }
  i=i+3;
 }
 return(flag);
}


#ifdef ANSIPROTO
void UpdateTCSCvar(VALUETYPE cons,INDEX j)
#else
void 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 ANSIPROTO
BOOLEAN ChangeTCSCmode()
#else
BOOLEAN 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;
      fprintf(stderr,"***Warning: %s TCSC firing angle is at its maximum limit.\n",TCSCptr->Name);
      fprintf(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;
      fprintf(stderr,"***Warning: %s TCSC firing angle is at its minimum limit.\n",TCSCptr->Name);
      fprintf(stderr,"            The TCSC will be treated as a fixed series capacitor.\n");
      flag=TRUE;
    }
  }
  return(flag);
}

#ifdef ANSIPROTO
void UpdateSTATCOMvar(VALUETYPE cons,INDEX j)
#else
void 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 ANSIPROTO
BOOLEAN ChangeSTATCOMmode()
#else
BOOLEAN 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;
    fprintf(stderr,"***Warning: %s STATCOM current is at its maximum limit.\n",STATCOMptr->Name);
    fprintf(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;
    fprintf(stderr,"***Warning: %s STATCOM current is at its minimum limit.\n",STATCOMptr->Name);
    fprintf(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;
    fprintf(stderr,"***Warning: %s STATCOM current is within limits.\n",STATCOMptr->Name);
    fprintf(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;
    fprintf(stderr,"***Warning: %s STATCOM current is within limits.\n",STATCOMptr->Name);
    fprintf(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 + -