📄 pointac.cpp
字号:
/* Point of Collapse: AC Hessian. */
#include "pointl.h"
/* ------------------ ACFunHes ----------------------------- */
#ifdef ANSIPROTO
void ACFunHes(BOOLEAN flagF,BOOLEAN flagJ)
#else
void ACFunHes(flagF,flagJ)
BOOLEAN flagF,flagJ;
#endif
/* Construct the AC part of the PoC Jacobian. */
{
SparseMatrixElement *Jptr;
ACbusData *ACptr,*To,*From,*BEptr,*BSptr;
AClist *ALptr;
ElementList *ELptr;
ElementData *Eptr;
VALUETYPE Vi,Vj,di,dj,gij,bij,gsij,bsij,gji,bji;
VALUETYPE v1,dv1,v2,dv2,v3,dv3,v4,dv4,v5,v6,dv6,v7,v8,dv8,v9,v10,dv10,v11;
VALUETYPE Ddi,Dvi,Ddip,Dvip,Ddj,Dvj,Dval,a,b,Dlambda,DPg;
VALUETYPE Ra,Xd,Xq,dg,Vd,Vq,Vr,Vim,Iq,Id,Ir,Iim,Ia;
INDEX N,i,j,k,l;
N=NacVar+11*Ndc/2+3*Nsvc+NtcscVar+7*Nstatcom; /* FACTS */
for(v1=0,i=1+N;i<Jac->n1;i++) {
if (fabs(x0[i-N])>v1) {
k=i-N;
v1=fabs(x0[k]);
if(x0[k]>0) v2=1.0;
else v2= -1.0;
}
if (flagJ) JacElement(Jac,Jac->n1,i,0.);
if (flagF) dF[i]=0;
}
if (flagF) dF[Jac->n1]=v1-1;
if (flagJ) JacElement(Jac,Jac->n1,k+N,v2);
if (flagJ) for(i=1;i<=Jac->n1;i++) {
Jptr=Jac->ColHead[i];
while(Jptr!=NULL) {
j=Jptr->Col;
if (OldCol->p[j]) j=OldCol->p[j];
l=Jptr->Row;
if (OldRow->p[l]) l=OldRow->p[l];
if (flagJ && j<=N && l<=N) JacElement(Jac,j+N,l+N,Jptr->Value);
Jptr=Jptr->ColNext;
}
}
for(ALptr=dataPtr->KGbus;ALptr!=NULL;ALptr=ALptr->Next) {
BSptr=ALptr->AC;
if(strpbrk(ALptr->AC->Type,"S")) break;
}
for(ACptr=dataPtr->ACbus;ACptr!=NULL;ACptr=ACptr->Next){
if (ACptr->Area!=NULL) BSptr=ACptr->Area->Slack;
i=ACvar[ACptr->N];
Vi=ACptr->V;
di=ACptr->Ang;
a=ACptr->a;
b=ACptr->b;
From=ACptr;
Ddi=Dvi=Ddip=Dvip=0;
/*if (flagF) dF[Jac->n1]+=-ACptr->DPl*x0[i]-ACptr->DQl*x0[i+1];*/
for(ELptr=ACptr->Elem; ELptr!=NULL; ELptr=ELptr->Next) {
Eptr=ELptr->Eptr;
if (Eptr->From==ACptr) To=Eptr->To;
else To=Eptr->From;
j=ACvar[To->N];
Vj=To->V;
dj=To->Ang;
if(Eptr->From==From) {
gij=(Eptr->G*cos(Eptr->Ang)-Eptr->B*sin(Eptr->Ang))*Eptr->Tap;
bij=(Eptr->G*sin(Eptr->Ang)+Eptr->B*cos(Eptr->Ang))*Eptr->Tap;
gsij=(Eptr->G1+Eptr->G)*Eptr->Tap*Eptr->Tap-gij;
bsij=(Eptr->B1+Eptr->B)*Eptr->Tap*Eptr->Tap-bij;
gji=(Eptr->G*cos(Eptr->Ang)+Eptr->B*sin(Eptr->Ang))*Eptr->Tap;
bji=(-Eptr->G*sin(Eptr->Ang)+Eptr->B*cos(Eptr->Ang))*Eptr->Tap;
} else {
gij=(Eptr->G*cos(Eptr->Ang)+Eptr->B*sin(Eptr->Ang))*Eptr->Tap;
bij=(-Eptr->G*sin(Eptr->Ang)+Eptr->B*cos(Eptr->Ang))*Eptr->Tap;
gsij=Eptr->G+Eptr->G2-gij;
bsij=Eptr->B+Eptr->B2-bij;
gji=(Eptr->G*cos(Eptr->Ang)-Eptr->B*sin(Eptr->Ang))*Eptr->Tap;
bji=(Eptr->G*sin(Eptr->Ang)+Eptr->B*cos(Eptr->Ang))*Eptr->Tap;
}
v1=sin(di-dj)*(gij*x0[i]+gji*x0[j]);
dv1=cos(di-dj)*(gij*x0[i]+gji*x0[j]);
v2=cos(di-dj)*(bij*x0[i]-bji*x0[j]);
dv2= -sin(di-dj)*(bij*x0[i]-bji*x0[j]);
v3=cos(di-dj)*(gij*x0[i+1]-gji*x0[j+1]);
dv3= -sin(di-dj)*(gij*x0[i+1]-gji*x0[j+1]);
v4=sin(di-dj)*(bij*x0[i+1]+bji*x0[j+1]);
dv4=cos(di-dj)*(bij*x0[i+1]+bji*x0[j+1]);
v5= -2*((gij+gsij)*x0[i]-(bij+bsij)*x0[i+1]);
if (Acont && From->Area!=To->Area) {
BEptr=From->Area->Slack;
if(!strpbrk(BEptr->Type,"S")) {
k=ACvar[BEptr->N]+2;
if (Eptr->Meter==From) {
v6= -(gij*sin(di-dj)-bij*cos(di-dj))*x0[k];
dv6= -(gij*cos(di-dj)+bij*sin(di-dj))*x0[k];
v7= -2*(gij+gsij)*x0[k];
} else {
v6= -(gji*sin(dj-di)-bji*cos(dj-di))*x0[k];
dv6=(gji*cos(dj-di)+bji*sin(dj-di))*x0[k];
v7=0;
}
} else v6=dv6=v7=0;
BEptr=To->Area->Slack;
if(!strpbrk(BEptr->Type,"S")) {
k=ACvar[BEptr->N]+2;
if (Eptr->Meter==From) {
v8=(gij*sin(di-dj)-bij*cos(di-dj))*x0[k];
dv8=(gij*cos(di-dj)+bij*sin(di-dj))*x0[k];
v9=2*(gij+gsij)*x0[k];
} else {
v8=(gji*sin(dj-di)-bji*cos(dj-di))*x0[k];
dv8= -(gji*cos(dj-di)+bji*sin(dj-di))*x0[k];
v9=0;
}
} else v8=dv8=v9=0;
} else v6=dv6=v7=v8=dv8=v9=0;
if (PQcont && strpbrk(Eptr->Type,"PM")){
k=ACvar[Eptr->Cont->N]+1+Eptr->Cont->Ncont-Eptr->Ncont;
if (Acont && strpbrk(Eptr->Cont->Type,"A")) k++;
if (Eptr->Cont==From) {
v10= -(gij*sin(di-dj)-bij*cos(di-dj))*x0[k];
dv10= -(gij*cos(di-dj)+bij*sin(di-dj))*x0[k];
v11= -2*(gij+gsij)*x0[k];
} else {
v10=(gji*sin(dj-di)-bji*cos(dj-di))*x0[k];
dv10= -(gji*cos(dj-di)+bji*sin(dj-di))*x0[k];
v11=0;
}
} else if (PQcont && strpbrk(Eptr->Type,"QN")){
k=ACvar[Eptr->Cont->N]+1+Eptr->Cont->Ncont-Eptr->Ncont;
if (Acont && strpbrk(Eptr->Cont->Type,"A")) k++;
if (Eptr->Cont==From) {
v10=(gij*cos(di-dj)+bij*sin(di-dj))*x0[k];
dv10= -(gij*sin(di-dj)-bij*cos(di-dj))*x0[k];
v11=2*(bij+bsij)*x0[k];
} else {
v10= -(gji*cos(dj-di)+bji*sin(dj-di))*x0[k];
dv10= -(gji*sin(dj-di)-bji*cos(dj-di))*x0[k];
v11=0;
}
} else v10=dv10=v11=0;
if(flagF){
if (!strpbrk(From->Type,"S")) dF[i+N]+=Vi*Vj*(-v1+v2+v3+v4+v6+v8+v10);
if (From->Cont!=NULL) dF[i+N+1]+=Vj*(dv1-dv2-dv3-dv4-dv6-dv8-dv10)+Vi*(v5+v7+v9+v11);
}
if(flagJ){
if (!strpbrk(From->Type,"S")){
Ddj=Vi*Vj*(dv1-dv2-dv3-dv4-dv6-dv8-dv10);
Ddi=Ddi-Ddj;
Dvj=Vi*(-v1+v2+v3+v4+v6+v8+v10);
Dvi=Dvi+Vj*(-v1+v2+v3+v4+v6+v8+v10);
if (!strpbrk(To->Type,"S")) JacElement(Jac,i+N,j,Ddj);
if (To->Cont!=NULL) JacElement(Jac,i+N,j+1,Dvj);
else JacElement(Jac,i+N,j+1,0.);
if (PQcont && strpbrk(Eptr->Type,"PQMN")){
k=ACvar[Eptr->Cont->N]+1+Eptr->Cont->Ncont-Eptr->Ncont;
if (Acont && strpbrk(Eptr->Cont->Type,"A")) k++;
if(!strcmp(Eptr->Type,"RQ"))
Dval=Vi*Vj/Eptr->Tap*(-v1+v2+v3+v4+v6+v8+v10);
else if(!strcmp(Eptr->Type,"RP"))
Dval=Vi*Vj*(-dv2+dv1-dv4-dv3-dv6-dv8-dv10);
else Dval=0;
JacElement(Jac,i+N,k,Dval);
}
else if(Rcont && Eptr->Cont!=NULL) {
k=ACvar[Eptr->Cont->N]+1;
if(!strcmp(Eptr->Type,"R"))
Dval=Vi*Vj/Eptr->Tap*(-v1+v2+v3+v4+v6+v8+v10);
else Dval=0;
JacElement(Jac,i+N,k,Dval);
}
}
if (From->Cont!=NULL) {
Ddj= -Vj*(-v1+v2+v3+v4+v6+v8+v10);
Ddip=Ddip-Ddj;
Dvj=dv1-dv2-dv3-dv4-dv6-dv8-dv10;
Dvip=Dvip+v5+v7+v9+v11;
if (!strpbrk(To->Type,"S")) JacElement(Jac,i+1+N,j,Ddj);
if (To->Cont!=NULL) JacElement(Jac,i+1+N,j+1,Dvj);
else JacElement(Jac,i+1+N,j+1,0.);
if (PQcont && strpbrk(Eptr->Type,"PQMN")){
k=ACvar[Eptr->Cont->N]+1+Eptr->Cont->Ncont-Eptr->Ncont;
if (Acont && strpbrk(Eptr->Cont->Type,"A")) k++;
if(!strcmp(Eptr->Type,"RQ")) {
Dval=Vj/Eptr->Tap*(dv1-dv2-dv3-dv4-dv6-dv8-dv10);
if(Eptr->From==From) Dval=Dval+2*Vi/Eptr->Tap*(v5+v7+v9+v11);}
else if(!strcmp(Eptr->Type,"RP"))
Dval=Vj*(-v2+v1-v4-v3-v6-v8-v10);
else Dval=0;
JacElement(Jac,i+1+N,k,Dval);
} else if(Rcont && Eptr->Cont!=NULL) {
k=ACvar[Eptr->Cont->N]+1;
if(!strcmp(Eptr->Type,"R")) {
Dval=Vj/Eptr->Tap*(dv1-dv2-dv3-dv4-dv6-dv8-dv10);
if(Eptr->From==From) Dval=Dval+2*Vi/Eptr->Tap*(v5+v7+v9+v11);}
else Dval=0;
JacElement(Jac,i+1+N,k,Dval);
}
} else {
JacElement(Jac,i+1+N,j,0.);
JacElement(Jac,i+1+N,j+1,0.);
if (PQcont && strpbrk(Eptr->Type,"PQMN")){
k=ACvar[Eptr->Cont->N]+1+Eptr->Cont->Ncont-Eptr->Ncont;
if (Acont && strpbrk(Eptr->Cont->Type,"A")) k++;
JacElement(Jac,i+1+N,k,0.);
} else if(Rcont && Eptr->Cont!=NULL) {
k=ACvar[Eptr->Cont->N]+1;
JacElement(Jac,i+1+N,k,0.);
}
}
}
}
if (flagF) {
DPg=ACptr->DPG;
if(DPg) {
k=ACvar[BSptr->N];
if (strpbrk(BSptr->Type,"S")) dF[k+N]+=DPg*x0[i];
else if(Acont) dF[k+N+2]+=DPg*x0[i];
}
if (ACptr->Cont!=NULL)
dF[i+N+1]+=-2*Vi*(ACptr->G*x0[i]-ACptr->B*x0[i+1])
-2*Vi*(ACptr->Pz+ACptr->Pzl*lambda)*x0[i]
-a*pow(Vi,a-1)*(ACptr->Pn+ACptr->Pnl*lambda)*x0[i]
-2*Vi*(ACptr->Qz+ACptr->Qzl*lambda)*x0[i+1]
-b*pow(Vi,b-1)*(ACptr->Qn+ACptr->Qnl*lambda)*x0[i+1];
if(QRcont && strpbrk(ACptr->Type,"G")) {
j=ACvar[ACptr->Cont->N];
if (strpbrk(ACptr->cont,"V")) dF[j+N+1]+=ACptr->Kbg*x0[i+1];
else if (ACptr->Gen!=NULL) {
j=ACptr->Gen->Nvar;
if (strpbrk(ACptr->cont,"E")) dF[j+N+1]+=x0[i+1];
else dF[j+N+11]+=x0[i+1];
}
}
else if(strpbrk(ACptr->Type,"V,Q,S,Z") || (!QRcont && strpbrk(ACptr->Type,"G")) ) {
if (strpbrk(ACptr->cont,"V")) dF[i+N+1]+=x0[i+1];
else if (ACptr->Gen!=NULL) {
j=ACptr->Gen->Nvar;
if (strpbrk(ACptr->cont,"E")) dF[j+N+1]+=x0[i+1];
else dF[j+N+11]+=x0[i+1];
}
}
}
if (flagJ){
if (!strpbrk(From->Type,"S")) JacElement(Jac,i+N,i,Ddi);
if (From->Cont!=NULL) {
Dvip=Dvip-2*(ACptr->G*x0[i]-ACptr->B*x0[i+1])
-2*(ACptr->Pz+ACptr->Pzl*lambda)*x0[i]
-a*(a-1)*pow(Vi,a-2)*(ACptr->Pn+ACptr->Pnl*lambda)*x0[i]
-2*(ACptr->Qz+ACptr->Qzl*lambda)*x0[i+1]
-b*(b-1)*pow(Vi,b-2)*(ACptr->Qn+ACptr->Qnl*lambda)*x0[i+1];
JacElement(Jac,i+N,i+1,Dvi);
JacElement(Jac,i+1+N,i,Ddip);
JacElement(Jac,i+1+N,i+1,Dvip);
Dlambda=-(2*Vi*ACptr->Pzl+a*pow(Vi,a-1)*ACptr->Pnl)*x0[i]
-(2*Vi*ACptr->Qzl+b*pow(Vi,b-1)*ACptr->Qnl)*x0[i+1];
if (Dlambda) {
JacElement(Jac,i+1+N,Jac->n1,Dlambda);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -