📄 jacob.c
字号:
/* Initialize variables. */#include "jacob.h"/* ------- Global Variables ------ */IntegerVector *RowPer,*ColPer;/* -------------------- JacElement ---------------------- */#ifdef ANSIPROTOvoid JacElement(SparseMatrix *Mptr,INDEX I,INDEX J,VALUETYPE val)#elsevoid JacElement(Mptr,I,J,val)SparseMatrix *Mptr; INDEX I,J;VALUETYPE val;#endif/* Jacobian Element */{ SparseMatrixElement *Ptr; INDEX i,j;/* if (val==0) return;*/ i=I; j=J; if (RowPer->p[I]!=0) I=RowPer->p[I]; if (ColPer->p[J]!=0) J=ColPer->p[J]; for(Ptr=Mptr->RowHead[I];Ptr!=NULL;Ptr=Ptr->RowNext) if(Ptr->Row==I && Ptr->Col==J) { if (flagReducedContinuation && (DxZero[i] || DxZero[j])) { if (i==j) Ptr->Value=1.; else Ptr->Value=0; } else Ptr->Value=Ptr->Value+val; break; } if (Ptr==NULL && (i==j || !(flagReducedContinuation && (DxZero[i] || DxZero[j])))) {#ifdef WINDOWS Ptr=new SparseMatrixElement;#else Ptr=(SparseMatrixElement *) malloc(sizeof(SparseMatrixElement)); if(Ptr==NULL) {ErrorHalt("Insufficient memory to allocate Jacobian."); stopExecute(ERROREXIT);}#endif Ptr->Row=I; Ptr->Col=J; Ptr->RowNext=Mptr->RowHead[I]; Mptr->RowHead[I]=Ptr; Ptr->ColNext=Mptr->ColHead[J]; Mptr->ColHead[J]=Ptr; if (flagReducedContinuation && (DxZero[i] || DxZero[j])) Ptr->Value=1.; else Ptr->Value=val; }}/* ------------------- Jacobian --------------------- */#ifdef ANSIPROTOvoid Jacobian(void)#elsevoid Jacobian()#endif/* Allocate memory for the Jacobian. */{ ACbusData *ACptr; INDEX i,N,N1,N2; Dx=x0=x0p=dx=dF=NULL; DxZero=NULL; Vlist=Vlistp=NULL;#ifdef WINDOWS ACvar= new INDEX[Nac+1];#else ACvar=(INDEX *) calloc(Nac+1,sizeof(INDEX)); if (ACvar==NULL) {ErrorHalt("Insufficient memory to allocate AC variable vector."); stopExecute(ERROREXIT);}#endif N=1; for(ACptr=dataPtr->ACbus;ACptr!=NULL;ACptr=ACptr->Next){ ACvar[ACptr->N]=N; if (PQcont) N1=ACptr->Ncont; else N1=0; if (Acont && strpbrk(ACptr->Type,"A")) N=N+3+N1; else N=N+2+N1; if (ACptr->Gen!=NULL) { ACptr->Gen->Nvar=N-1; N=N+11; } } NacVar=N-1; N1=NacVar+11*Ndc/2 +3*Nsvc+NtcscVar+7*Nstatcom; /* FACTS */#ifdef WINDOWS RowPartition= new IntegerVector; ColPartition= new IntegerVector;#else RowPartition=(IntegerVector *) malloc(sizeof(IntegerVector)); ColPartition=(IntegerVector *) malloc(sizeof(IntegerVector)); if (ColPartition==NULL) {ErrorHalt("Insufficient memory to allocate partition vectors."); stopExecute(ERROREXIT);}#endif if (flagH) { N1++; N2=N1; RowPartition->N=2; ColPartition->N=1;#ifdef WINDOWS RowPartition->p= new INDEX[3]; ColPartition->p= new INDEX[3];#else RowPartition->p=(INDEX *) calloc(3,sizeof(INDEX)); ColPartition->p=(INDEX *) calloc(3,sizeof(INDEX)); if (ColPartition->p==NULL) {ErrorHalt("Insufficient memory to allocate partition vectors."); stopExecute(ERROREXIT);}#endif RowPartition->p[1]=N1-1; RowPartition->p[2]=N1; ColPartition->p[1]=N1; RowPartition->p[0]=ColPartition->p[0]=ColPartition->p[2]=0;#ifdef WINDOWS Dx= new VALUETYPE[N1+1]; x0= new VALUETYPE[N1+1]; x0p= new VALUETYPE[N1+1];#else Dx=(VALUETYPE *) calloc(N1+1,sizeof(VALUETYPE)); x0=(VALUETYPE *) calloc(N1+1,sizeof(VALUETYPE)); x0p=(VALUETYPE *) calloc(N1+1,sizeof(VALUETYPE)); if (x0p==NULL) {ErrorHalt("Insufficient memory to allocate Homotopy vectors."); stopExecute(ERROREXIT);}#endif for(i=0;i<N1+1;i++) Dx[i]=x0[i]=x0p[i]=0.; } else if (flagPoC) { N2=N1; N1=2*N1+1; RowPartition->N=ColPartition->N=1;#ifdef WINDOWS RowPartition->p= new INDEX[2]; ColPartition->p= new INDEX[2];#else RowPartition->p=(INDEX *) calloc(2,sizeof(INDEX)); ColPartition->p=(INDEX *) calloc(2,sizeof(INDEX)); if (ColPartition->p==NULL) {ErrorHalt("Insufficient memory to allocate partition vectors."); stopExecute(ERROREXIT);}#endif RowPartition->p[1]=ColPartition->p[1]=N2; RowPartition->p[0]=ColPartition->p[0]=0;#ifdef WINDOWS Dx= new VALUETYPE[N2+1]; x0= new VALUETYPE[N2+1];#else Dx=(VALUETYPE *) calloc(N2+1,sizeof(VALUETYPE)); x0=(VALUETYPE *) calloc(N2+1,sizeof(VALUETYPE)); if (x0==NULL) {ErrorHalt("Insufficient memory to allocate left Eigenvector."); stopExecute(ERROREXIT);}#endif for(i=0;i<N2+1;i++) Dx[i]=x0[i]=0.; } else { N2=N1; RowPartition->N=ColPartition->N=1;#ifdef WINDOWS RowPartition->p= new INDEX[2]; ColPartition->p= new INDEX[2];#else RowPartition->p=(INDEX *) calloc(2,sizeof(INDEX)); ColPartition->p=(INDEX *) calloc(2,sizeof(INDEX)); if (ColPartition->p==NULL) {ErrorHalt("Insufficient memory to allocate partition vectors."); stopExecute(ERROREXIT);}#endif RowPartition->p[1]=ColPartition->p[1]=N2; RowPartition->p[0]=ColPartition->p[0]=0; }#ifdef WINDOWS dx= new VALUETYPE[N1+2]; dF= new VALUETYPE[N1+2]; Jac= new SparseMatrix;#else dx=(VALUETYPE *) calloc(N1+2,sizeof(VALUETYPE)); dF=(VALUETYPE *) calloc(N1+2,sizeof(VALUETYPE)); if (dF==NULL) {ErrorHalt("Insufficient memory to allocate AC/DC/FACTS mismatches."); stopExecute(ERROREXIT);} Jac=(SparseMatrix *) malloc(sizeof(SparseMatrix)); if (Jac==NULL) {ErrorHalt("Insufficient memory to allocate P.F. Jacobian."); stopExecute(ERROREXIT);}#endif for(i=0;i<N1+2;i++) dx[i]=dF[i]=0.; Jac->n1=N2; Jac->n2=N2;#ifdef WINDOWS Jac->RowHead= new SparseMatrixElement*[N1+2]; Jac->ColHead= new SparseMatrixElement*[N1+2];#else Jac->RowHead=(SparseMatrixElement **) calloc(N1+2,sizeof(SparseMatrixElement *)); Jac->ColHead=(SparseMatrixElement **) calloc(N1+2,sizeof(SparseMatrixElement *)); if(Jac->ColHead==NULL) {ErrorHalt("Insufficient memory to allocate Jacobian."); stopExecute(ERROREXIT);}#endif for(i=0;i<N1+2;i++) Jac->RowHead[i]=Jac->ColHead[i]=NULL; NewRow=AllocatePermutation(N1); OldRow=AllocatePermutation(N1); NewCol=AllocatePermutation(N1); OldCol=AllocatePermutation(N1); NewRow->N=NewCol->N=N2; OldRow->N=OldCol->N=N2;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -