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

📄 initfact.cpp

📁 用于电力系统潮流计算 c++程序
💻 CPP
字号:
#include <stdlib.h>
#ifndef WINDOWS
#include <stdio.h>
#else
#include "pfwstdio.h"
#endif
#include <math.h>
#include <string.h>
#include <ctype.h>
#include "constant.h"
#include "param.h"
#include "sparse.h"
#include "pflow.h"


#ifdef ANSIPROTO
void SVCinit(void);
void TCSCinit(void);
void STATCOMinit(void);
#else
void SVCinit();
void TCSCinit();
void STATCOMinit();
#endif

extern Data *dataPtr;
extern VALUETYPE Sn,K3;

/* --------------------------- SVCinit ------------------------------------ */
/* Initialize the SVC variables and transform them to the system p.u. base. */
#ifdef ANSIPROTO
void SVCinit(void)
#else
void SVCinit()
#endif
{
 SVCbusData *SVCptr;
 INDEX i,j;
 VALUETYPE Vc,V,Vref,Xsl,Bv,Xl,Xc,Be,Ssvc,I,alpha,x,dx,dxp,k,f,df;

 for(SVCptr=dataPtr->SVCbus;SVCptr!=NULL;SVCptr=SVCptr->Next) {
   Vc=SVCptr->Ctrl->V;
   V=SVCptr->From->V;
   Vref=SVCptr->Vref;
   Ssvc=SVCptr->SVC_base;
   Xsl=SVCptr->slope/100.0*Sn/Ssvc;
   if (Xsl!=0) I=(Vc-Vref)/Xsl;
   else        I=0;
   Be=-I/V;
   Xl=SVCptr->Xl*Sn/Ssvc;
   Xc=SVCptr->Xc*Sn/Ssvc;
   Bv=1.0/Xc-Be;
   alpha=SVCptr->alpha_svc=SVCptr->alpha_svc*K3;
   SVCptr->AlphaMin=SVCptr->AlphaMin*K3;
   SVCptr->AlphaMax=SVCptr->AlphaMax*K3;
   if (alpha==0.) {
     x=PI;
     for(i=0;i<=10;i=i+1) {
       f=sin(x)-x+2.0*PI-PI*Xl*Bv;
       if (fabs(f)<=0.001) break;
       df=cos(x)-1.0;
       if (df!=0.) {
         dx=-f/df;
         k=1/2.0;
         if (i==0) dxp=dx;
         else {
           if (fabs(dx)>fabs(dxp))
             for (j=0;j<=10;j=j+1) {
                dx=k*dx;
                if (fabs(dx)<fabs(dxp)) break;
                k=k/2.0;
             }
         }
         x=x+dx;
         dxp=dx;
         if (k<0.001) break;
       }
       else break;
     }
     alpha=x/2.0;
   }
   if (alpha <= SVCptr->AlphaMin) {
     alpha=SVCptr->alpha_svc=SVCptr->AlphaMin;
     strcpy(SVCptr->Cont,"MN");
     fprintf(stderr,"***Warning: SVC %s initial firing angle is at its minimum limit.\n",SVCptr->Name);
     fprintf(stderr,"            The SVC will be treated as a fixed inductive reactance.\n");
   }
   else if (alpha >= SVCptr->AlphaMax) {
     alpha=SVCptr->alpha_svc=SVCptr->AlphaMax;
     strcpy(SVCptr->Cont,"MX");
     fprintf(stderr,"***Warning: SVC %s initial firing angle is at its maximum limit.\n",SVCptr->Name);
     fprintf(stderr,"            The SVC will be treated as a fixed capacitive reactance.\n");
   }
   Bv=(2.0*(PI-alpha)+sin(2.0*alpha))/(PI*Xl);
   SVCptr->alpha_svc=alpha;
   SVCptr->Bv=Bv;
   SVCptr->Qsvc=V*V/Xc-V*V*Bv;
   SVCptr->slope=Xsl;
   SVCptr->Xc=Xc;
   SVCptr->Xl=Xl;
   SVCptr->Vvar=SVCptr->Vref;
 }
}


/* --------------------------- TCSCinit ------------------------------------ */
#ifdef ANSIPROTO
void TCSCinit(void)
#else
void TCSCinit()
#endif
{
 TCSCbusData *TCSCptr;
 VALUETYPE Stcsc,Vn,Max,Ctrl,Kf;
 VALUETYPE Vk,thk,Vm,thm,Xc,Xl,Ptcsc,Qtcsck,Qtcscm,Be,alpha,Itcsc,delta_t;

  for(TCSCptr=dataPtr->TCSCbus;TCSCptr!=NULL;TCSCptr=TCSCptr->Next) {
  /* --------------- Initialize the TCSC system variables ---------------------- */
    if(TCSCptr->To->Ang==0.0)TCSCptr->To->Ang=0.01;
    Vk=TCSCptr->From->V;
    thk=TCSCptr->From->Ang;
    Vm=TCSCptr->To->V;
    thm=TCSCptr->To->Ang;
    /* ----------------- Per unit conversion ------------------------------------ */
    Stcsc=TCSCptr->TCSC_base;
    if(Stcsc==0) Stcsc=TCSCptr->TCSC_base=Sn;
    Vn=TCSCptr->From->KV;
    TCSCptr->Xc=TCSCptr->Xc*Sn/Stcsc;
    TCSCptr->Xl=TCSCptr->Xl*Sn/Stcsc;
    TCSCptr->AlphaMin=TCSCptr->AlphaMin*K3;
    TCSCptr->AlphaMax=TCSCptr->AlphaMax*K3;
    Xc=TCSCptr->Xc;
    Xl=TCSCptr->Xl;
    Kf=sqrt(Xc/Xl);
    Max=TCSCptr->Max;
    Ctrl=TCSCptr->Control;
    /* --------------- Initialize the TCSC system variables ---------------------- */
    alpha=TCSCptr->alpha_tcsc;
    if(alpha==0) alpha=2.8;
    else if (alpha < TCSCptr->AlphaMin) {
      TCSCptr->alpha_tcsc=alpha=2.8;
      fprintf(stderr,"***Warning: %s TCSC firing angle is below its minimum limit.\n",TCSCptr->Name);
      fprintf(stderr,"            The TCSC will be initialized with a flat start.\n");
    } else if (alpha > TCSCptr->AlphaMax) {
      TCSCptr->alpha_tcsc=alpha=2.8;
      fprintf(stderr,"***Warning: %s TCSC firing angle is above its maximum limit.\n",TCSCptr->Name);
      fprintf(stderr,"            The TCSC will be initialized with a flat start.\n");
    }
    if(!strcmp(TCSCptr->Cont,"X")) {
      Be=100.0/(Ctrl*Max*Xc);
      TCSCptr->Bset = Be;
      TCSCptr->Control = Be;
    /* } else Be=1.0/Xc-(2.0*PI-2.0*alpha+sin(2.0*alpha))/(PI*Xl); */
    } else {
      Be = PI*cos(Kf*(-PI+alpha))*(pow(Kf,4.0)-2.0*Kf*Kf+1.0)/Xc/(-PI*pow(Kf,4.0)*
           cos(Kf*(-PI+alpha))+PI*cos(Kf*(-PI+alpha))+2.0*pow(Kf,4.0)*alpha*
           cos(Kf*(-PI+alpha))-2.0*alpha*Kf*Kf*cos(Kf*(-PI+alpha))+pow(Kf,4.0)*
           sin(-2.0*PI+2.0*alpha)*cos(Kf*(-PI+alpha))-sin(-2.0*PI+2.0*alpha)*
           Kf*Kf*cos(Kf*(-PI+alpha))-4.0*Kf*Kf*Kf*pow(cos(-PI+alpha),2.0)*
           sin(Kf*(-PI+alpha))+4.0*Kf*Kf*cos(-PI+alpha)*sin(-PI+alpha)*
           cos(Kf*(-PI+alpha)));
    }
    if(!strcmp(TCSCptr->Cont,"P")) {
      Ptcsc=Ctrl/Sn;
      TCSCptr->Control = Ptcsc;
    } else Ptcsc=-Vk*Vm*Be*sin(thk-thm);
    Qtcsck=-Vk*Vk*Be+Vk*Vm*Be*cos(thk-thm);
    Qtcscm=-Vm*Vm*Be+Vk*Vm*Be*cos(thk-thm);
    if(!strcmp(TCSCptr->Cont,"I")) {
      Itcsc=Ctrl*(sqrt(3)*Vn)/Sn;
      TCSCptr->Control = Itcsc;
    } else {
      if (Ptcsc >= 0) Itcsc=(sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck))/Vk;
      else Itcsc=-(sqrt(Ptcsc*Ptcsc+Qtcsck*Qtcsck))/Vk;
    }
    if(!strcmp(TCSCptr->Cont,"D")) {
      delta_t=Ctrl*K3;
      TCSCptr->Control = delta_t;
    } else delta_t=thk-thm;
    TCSCptr->Ptcsc=Ptcsc;
    TCSCptr->Qtcsck=Qtcsck;
    TCSCptr->Qtcscm=Qtcscm;
    TCSCptr->Be=Be;
    TCSCptr->alpha_tcsc=alpha;
    TCSCptr->Itcsc=Itcsc;
    TCSCptr->delta_t=delta_t;
  }
}


/* ----------------------------- STATCOMinit ---------------------------------- */
/* Initialize the STATCOM variables assuming Vc and V are known and neglecting  */
/* losses, i.e., R and Rc are assumed to be zero to simplify the equations, and */
/* transform variables to the system p.u. base.                                 */
#ifdef ANSIPROTO
void STATCOMinit(void)
#else
void STATCOMinit()
#endif
{
 STATCOMbusData *STATCOMptr;
 VALUETYPE Sb,Vco,Vo,deltao,Io,thetao,Imin,Imax,R,G,B,Gc,Xsl,Ko,Vdco,Vref,Cref,Qo;

 for(STATCOMptr=dataPtr->STATCOMbus;STATCOMptr!=NULL;STATCOMptr=STATCOMptr->Next) {
    Sb=STATCOMptr->MVA;
    Vo=STATCOMptr->From->V;
    deltao=STATCOMptr->From->Ang;
    Xsl=STATCOMptr->slope/100.0*Sn/Sb;
    R=STATCOMptr->R*Sn/Sb;
    G=STATCOMptr->G*Sb/Sn;
    B=STATCOMptr->B*Sb/Sn;
    Gc=STATCOMptr->Gc*Sb/Sn;
    Imin=STATCOMptr->Imin*Sb/Sn;
    Imax=STATCOMptr->Imax*Sb/Sn;
    Vref=STATCOMptr->Vref;
    Vco=STATCOMptr->Ctrl->V;
    Cref=STATCOMptr->Contref;
    if (Xsl!=0) Io=(Vco-Vref)/Xsl;
    else        Io=0;
    if (Io<-Imin) {
       Io=-Imin;
       strcpy(STATCOMptr->Cont,"MN");
       fprintf(stderr,"***Warning: STATCOM %s has been initialized at its minimum current limit.\n",STATCOMptr->Name);
       fprintf(stderr,"            It will be treated as a fixed capacitive current source. \n");
    }
    else if (Io>Imax) {
       Io=Imax;
       strcpy(STATCOMptr->Cont,"MX");
       fprintf(stderr,"***Warning: STATCOM %s has been initialized at its maximum current limit.\n",STATCOMptr->Name);
       fprintf(stderr,"            It will be treated as a fixed inductive current source. \n");
    }
    if (Io<=0) thetao=STATCOMptr->theta=deltao+PI/2.0;       /* capacitive */
    else       thetao=STATCOMptr->theta=deltao-PI/2.0;        /* inductive  */
    Io=fabs(Io);
    if (Io==0) Io=0.0001;
    STATCOMptr->I=Io;
    STATCOMptr->Imin=Imin;
    STATCOMptr->Imax=Imax;
    Qo=STATCOMptr->Q=Vo*Io*sin(deltao-thetao);
    STATCOMptr->alpha=deltao;
    if (!strcmp(STATCOMptr->Cont1,"PW")) {
      Vdco=STATCOMptr->Vdc=Cref;
      Ko=STATCOMptr->k=1.0/Vdco*(Qo/(Vo*B)+Vo);
    }
    else {
      Ko=STATCOMptr->k=Cref;
      Vdco=STATCOMptr->Vdc=1.0/Ko*(Qo/(Vo*B)+Vo);
    }
    STATCOMptr->P=Gc*Vdco*Vdco+R*Io*Io;
    STATCOMptr->slope=Xsl;
    STATCOMptr->R=R;
    STATCOMptr->G=G;
    STATCOMptr->Gc=Gc;
    STATCOMptr->B=B;
    STATCOMptr->Vvar=STATCOMptr->Vref;
 }
}


⌨️ 快捷键说明

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