📄 homotjac.cpp
字号:
/* Homotopy Continuation Method: Jacobian */
#include "homot.h"
/* ------- Global Variables ------ */
extern VALUETYPE *Dx,Dparam,param0,*x0,*x0p,Kh,Htol,SD0,AngTr,
VoltageSum,VoltageSum0,DxiMax,VSF,SF,ZeroDx,Tol;
extern INDEX NewNumEq,CountSteps,NumSteps;
extern AClist *Vlist,*Vlistp;
extern BOOLEAN flagReducedContinuation,flagReduceSystem,*DxZero;
/* ------------------ HFunJac ----------------------------- */
#ifdef ANSIPROTO
int HFunJac(BOOLEAN FlagFunction,BOOLEAN FlagJacobian,AreaData *Aptr,VALUETYPE *vec)
#else
int HFunJac(FlagFunction,FlagJacobian,Aptr,vec)
BOOLEAN FlagFunction,FlagJacobian;
AreaData *Aptr;
VALUETYPE *vec;
#endif
/* Add a row to the Jacobian. */
{
ACbusData *ACptr,*ACptrp;
DCbusData *DCptrR,*DCptrI,*DCptr;
SVCbusData *SVCptr; /* FACTS */
TCSCbusData *TCSCptr; /* FACTS */
STATCOMbusData *STATCOMptr; /* FACTS */
ElementData *Eptr;
ElementList *ELptr;
INDEX i,j,l;
VALUETYPE valp;
int val;
val=0;
l=Jac->n1;
if (FlagFunction) {
if (Bl) dF[l]=0;
else dF[l]=Dparam*(lambda-param0-Dparam);
}
if (FlagJacobian) {
if (Dparam) JacElement(Jac,l,l,Dparam);
else JacElement(Jac,l,l,1.0);
}
for(ACptr=dataPtr->ACbus;ACptr!=NULL;ACptr=ACptr->Next){
if (ACptr->Cont!=NULL) {
i=ACvar[ACptr->N];
if (strpbrk(ACptr->Type,"S")) {
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Kg-x0[i]-vec[i]);
}
if (FlagJacobian) {
if (Aptr==NULL && fabs(vec[i])<1e-6) val=-1;
JacElement(Jac,l,i,vec[i]);
}
} else {
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Ang-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i+1]) dF[i+1]=0;
dF[l] +=vec[i+1]*(ACptr->V-x0[i+1]-vec[i+1]);
}
if (FlagJacobian) JacElement(Jac,l,i+1,vec[i+1]);
}
else if(strpbrk(ACptr->Type,"L")) {
i=ACvar[ACptr->N];
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Ang-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
if (FlagFunction) dF[l] +=vec[i+1]*(lambda-x0[i+1]-vec[i+1]);
if (FlagJacobian) JacElement(Jac,l,i+1,vec[i+1]);
if (FlagFunction) dF[l] +=Dparam*(ACptr->V-param0-Dparam);
}
else if(QRcont && strpbrk(ACptr->Type,"C")){
i=ACvar[ACptr->N];
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Ang-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i+1]) dF[i+1]=0;
dF[l] +=vec[i+1]*(ACptr->Qr-x0[i+1]-vec[i+1]);
}
if (FlagJacobian) JacElement(Jac,l,i+1,vec[i+1]);
}
else if(Rcont && strpbrk(ACptr->Type,"T")){
i=ACvar[ACptr->N];
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Ang-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
for(ELptr=ACptr->Reg;ELptr!=NULL;ELptr=ELptr->Next){
Eptr=ELptr->Eptr;
if(!strcmp(Eptr->Type,"R")) break;
}
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i+1]) dF[i+1]=0;
dF[l] +=vec[i+1]*(Eptr->Tap-x0[i+1]-vec[i+1]);
}
if (FlagJacobian) JacElement(Jac,l,i+1,vec[i+1]);
}
else if(strpbrk(ACptr->Type,"Q,S,V,Z")|| (!QRcont && strpbrk(ACptr->Type,"G"))){
i=ACvar[ACptr->N];
if (strpbrk(ACptr->Type,"S")) {
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Kg-x0[i]-vec[i]);
}
if (FlagJacobian) {
if (Aptr==NULL && fabs(vec[i])<1e-6) val=-1;
JacElement(Jac,l,i,vec[i]);
}
} else {
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Ang-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i+1]) dF[i+1]=0;
dF[l] +=vec[i+1]*(ACptr->Qg-x0[i+1]-vec[i+1]);
}
if (FlagJacobian) JacElement(Jac,l,i+1,vec[i+1]);
}
if(Acont && strpbrk(ACptr->Type,"A")){
i=ACvar[ACptr->N]+2;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Kg-x0[i]-vec[i]);
}
if (FlagJacobian) {
if (Aptr!=NULL && ACptr->Area==Aptr && fabs(vec[i])<1e-6) val=-1;
JacElement(Jac,l,i,vec[i]);
}
}
if (PQcont) for(ELptr=ACptr->Reg;ELptr!=NULL;ELptr=ELptr->Next) {
Eptr=ELptr->Eptr;
if(strpbrk(Eptr->Type,"PQNM")) {
i=ACvar[ACptr->N]+1+ACptr->Ncont-Eptr->Ncont;
if (Acont && strpbrk(ACptr->Type,"A")) i++;
if(!strcmp(Eptr->Type,"RP")){
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(Eptr->Ang-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
else if(!strcmp(Eptr->Type,"RQ")){
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(Eptr->Tap-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
else {
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(Eptr->Cvar-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
}
}
if (ACptr->Gen!=NULL) {
i=ACptr->Gen->Nvar+1;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
if (!strpbrk(ACptr->cont,"E")) dF[l] +=vec[i]*(ACptr->Gen->Eq-x0[i]-vec[i]);
else dF[l] +=vec[i]*(ACptr->Qg-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->dg-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Vr-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Vi-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Ir-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Ii-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Vq-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Vd-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Iq-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
dF[l] +=vec[i]*(ACptr->Gen->Id-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
i++;
if (FlagFunction) {
if (flagReducedContinuation && DxZero[i]) dF[i]=0;
if (!strpbrk(ACptr->cont,"I")) dF[l] +=vec[i]*(ACptr->Gen->Ia-x0[i]-vec[i]);
else dF[l] +=vec[i]*(ACptr->Qg-x0[i]-vec[i]);
}
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
}
i=NacVar;
for(DCptrR=dataPtr->DCbus;DCptrR!=NULL;DCptrR=DCptrR->Next){
DCptrI=DCptrR->To;
if(!strcmp(DCptrR->Type,"R")){
for (j=1;j<=2;j++) {
if (j==1) DCptr=DCptrR;
else DCptr=DCptrI;
if(strcmp(DCptr->Cont1,"VD")&&strcmp(DCptr->Cont2,"VD")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(DCptr->Vd-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
if(strcmp(DCptr->Cont1,"AT")&&strcmp(DCptr->Cont2,"AT")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(DCptr->Tap*DCptr->Ntrf-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
if(strcmp(DCptr->Cont1,"AL")&&strcmp(DCptr->Cont2,"AL")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(cos(DCptr->Alfa)-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
if(strcmp(DCptr->Cont1,"GA")&&strcmp(DCptr->Cont2,"GA")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(cos(DCptr->Gamma)-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
i++; if (FlagFunction) dF[l] +=vec[i]*(DCptr->MVA-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
if(strcmp(DCptr->Cont1,"PA")&&strcmp(DCptr->Cont2,"PA")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(DCptr->P-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
if(strcmp(DCptr->Cont1,"QA")&&strcmp(DCptr->Cont2,"QA")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(DCptr->Q-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
}
if(strcmp(DCptrR->Cont1,"ID")&&strcmp(DCptrR->Cont2,"ID")&&
strcmp(DCptrI->Cont1,"ID")&&strcmp(DCptrI->Cont2,"ID")) {
i++; if (FlagFunction) dF[l] +=vec[i]*(DCptrR->Id-x0[i]-vec[i]);
if (FlagJacobian) JacElement(Jac,l,i,vec[i]);
}
}
}
/* FACTS */
i=NacVar+11*Ndc/2;
for(SVCptr=dataPtr->SVCbus;SVCptr!=NULL;SVCptr=SVCptr->Next){
i++; if(FlagFunction) dF[l] +=vec[i]*(SVCptr->Qsvc-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(SVCptr->Bv-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
if(!strcmp(SVCptr->Cont,"AL")){
i++; if(FlagFunction) dF[l] +=vec[i]*(SVCptr->alpha_svc-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
} else {
i++; if(FlagFunction) dF[l] +=vec[i]*(SVCptr->Vvar-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
}
}
i=NacVar+11*Ndc/2+3*Nsvc;
for(TCSCptr=dataPtr->TCSCbus;TCSCptr!=NULL;TCSCptr=TCSCptr->Next){
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->Ptcsc-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->Qtcsck-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->Qtcscm-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->Be-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->alpha_tcsc-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->Itcsc-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(TCSCptr->delta_t-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
}
i=NacVar+11*Ndc/2+3*Nsvc+NtcscVar;
for(STATCOMptr=dataPtr->STATCOMbus;STATCOMptr!=NULL;STATCOMptr=STATCOMptr->Next){
if (!strcmp(STATCOMptr->Cont,"PW") || !strcmp(STATCOMptr->Cont,"AL")) {
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->I-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
} else {
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->Vvar-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
}
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->theta-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->Vdc-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->k-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->alpha-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->P-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
i++; if(FlagFunction) dF[l] +=vec[i]*(STATCOMptr->Q-x0[i]-vec[i]);
if(FlagJacobian)JacElement(Jac,l,i,vec[i]);
}
/* END FACTS */
return(val);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -