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

📄 factor.c

📁 电力系统分析计算 学习调试程序 UNIX / LINUX / CYGWIN 系统使用
💻 C
字号:
#include <stdlib.h>//#ifndef WINDOWS//#include <stdio.h>//#else#include "pfwstdio.h"//#endif#include <math.h>#ifdef ANSIPROTO#include <float.h>#endif#include "constant.h"#include "param.h"#include "sparse.h"#ifdef ANSIPROTOvoid InitializeWorkingRow(void);void LoadUnloadWorkingRow1(SparseMatrixElement *Ptr2,BOOLEAN SetReset);void Normalize(INDEX I);int DoFactorization(void);int factor(SparseMatrix *Mptr);#elsevoid InitializeWorkingRow();void LoadUnloadWorkingRow1();void Normalize();int DoFactorization();int factor();#endif/* Global variable definitions */  SparseMatrix *Matrix2;  INDEX Nstop2;  LONGINT Nmult2;  ELEMENTVALUETYPE DiagVal2;  ELEMENTVALUETYPE *Swr2;  SparseMatrixElement **DiagPtr2;/* ============================ InitializeWorkingRow ==================== */    void InitializeWorkingRow()    {      INDEX I,J;      SparseMatrixElement *Ptr1;      /* BEGIN */#ifdef WINDOWS     Swr2 = new ELEMENTVALUETYPE[Matrix2->n1+1];     DiagPtr2 = new SparseMatrixElement*[Matrix2->n1+1];#else     Swr2 = (ELEMENTVALUETYPE *) calloc((Matrix2->n1+1),sizeof(ELEMENTVALUETYPE));     DiagPtr2 = (struct SparseMatrixElement **)             calloc((Matrix2->n1+1),sizeof(struct SparseMatrixElement *));#endif     for (I=1; I<=Matrix2->n1; I++) {      Ptr1 = Matrix2->RowHead[I];      while (Ptr1 != NULL) {        J = Ptr1->Col;        if (I == J) DiagPtr2[I] = Ptr1;        Ptr1 = Ptr1->RowNext;      }     }     for (I=1; I<=Matrix2->n1; I++) {      if (DiagPtr2[I] == NULL) {        fCustomPrint(stderr,"\nError: Diagonal element missing in the Jacobian.\n");        stopExecute(ERROREXIT);      }     }    }/* ========================== LoadUnloadWorkingRow ====================== */#ifdef ANSIPROTO    void LoadUnloadWorkingRow1(SparseMatrixElement *Ptr2,BOOLEAN SetReset)#else    void LoadUnloadWorkingRow1(Ptr2,SetReset)    SparseMatrixElement *Ptr2;    BOOLEAN SetReset;#endif    {      /* BEGIN */      while (Ptr2 != NULL) {        if (SetReset) {        Swr2[Ptr2->Col] = Ptr2->Value;        } else {        Ptr2->Value = Swr2[Ptr2->Col];        Swr2[Ptr2->Col] = 0.0;        }        Ptr2 = Ptr2->RowNext;      }    }/* ========================= Normalize ================================ */#ifdef ANSIPROTO    void Normalize(INDEX I)#else    void Normalize(I)    INDEX I;#endif    {      struct SparseMatrixElement *Ptr1;      INDEX J;      /* BEGIN */      Ptr1 = Matrix2->RowHead[I];      while (Ptr1 != NULL) {        J = Ptr1->Col;        if (J == I) {        Ptr1->Value = DiagVal2;        /* DiagPtr2[I] = Ptr1; */        } else if (Ptr1->Col > I) {        Ptr1->Value = DiagVal2 * Ptr1->Value;        Nmult2++;        }        Ptr1 = Ptr1->RowNext;      }    }/* ========================== DoFactorization ========================== */int DoFactorization()  {    INDEX I,J,K;    struct SparseMatrixElement *Ptr1, *Ptr2;    /* BEGIN {DoFactorization} */    InitializeWorkingRow();    for (I=1; I<=Matrix2->n1; I++) {      Ptr1 = Matrix2->RowHead[I];      LoadUnloadWorkingRow1(Ptr1,TRUE);      while (Ptr1 != NULL) {        J = Ptr1->Col;      if ((J < I) && (J <= Nstop2)) {        Ptr2 = Matrix2->RowHead[J];          while (Ptr2 != NULL) {            K = Ptr2->Col;            if (K > J) {            Swr2[K] = Swr2[K] - Swr2[J]*Ptr2->Value;              /*            MultiplyValues(TempVal,Swr2[J],Ptr2^.Value);            SubtractValues(Swr2[K],Swr2[K],TempVal);              */            }            Ptr2 = Ptr2->RowNext;          }        Swr2[J] = Swr2[J] * DiagPtr2[J]->Value;        Nmult2++;          /*        MultiplyValues(Swr2[J],Swr2[J],DiagPtr2[J]^.Value);          */      } else if (J == I) DiagPtr2[I] = Ptr1;        Ptr1 = Ptr1->RowNext;      }      LoadUnloadWorkingRow1(Matrix2->RowHead[I],FALSE);      DiagVal2 = DiagPtr2[I]->Value;      /*      EquateValues(DiagVal2,DiagPtr2[I]^.Value);      */      if (I <= Nstop2) {      if (NearZero(DiagVal2)) return(WARNINGEXIT);      DiagVal2 = 1.0 / DiagVal2;      Normalize(I);      }    }    return(0);  } /* END {DoFactorization} *//* ============================== factor ================================= */#ifdef ANSIPROTOint factor(SparseMatrix *Mptr)#elseint factor(Mptr)SparseMatrix *Mptr;#endif{  /* BEGIN FactorMatrix2 */  Matrix2 = Mptr;  Nmult2 = 0;  Nstop2 = Matrix2->n1;   if (DoFactorization()==WARNINGEXIT) return(WARNINGEXIT);#ifdef WINDOWS  delete[] Swr2;  delete[] DiagPtr2;#else  free(Swr2);  free(DiagPtr2);#endif  return(0);}

⌨️ 快捷键说明

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