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

📄 maxim.c

📁 电力系统分析计算 学习调试程序 UNIX / LINUX / CYGWIN 系统使用
💻 C
字号:
/* Obtain N maximum values from e-vectors. */#ifndef WINDOWS#include <stdio.h>#else#include "pfwstdio.h"#endif#include <math.h>#include <stdlib.h>#include <string.h>#include "constant.h"#include "param.h"#include "maxim.h"#ifdef ANSIPROTOvoid ErrorStop(char *Msg);void ErrorHalt(char *Msg);int main(int argc,char **argv);#elsevoid ErrorStop();void ErrorHalt();int main();#endif/* ---------------------- Global Variables ---------------- */Data *DataPtr;/* ---------------------- ErrorStop ------------------------------------ */#ifdef ANSIPROTOvoid ErrorStop(char *Msg)#elsevoid ErrorStop(Msg)char *Msg;#endif{  if (!NullName(Msg)) fprintf(stdout,"Error: %s\n",Msg);  fprintf(stdout,"Usage: maxim [-ahnv] [<]input_file [>]output_file\n\n");  fprintf(stdout,"       Program to extract maximum values of a PoC vector.\n");  fprintf(stdout,"       The input_file is assumed to be either in I Var Value format\n");  fprintf(stdout,"       (default), or I Value (see -v option), which are based on the\n");  fprintf(stdout,"       standard SMMS I J Value format.\n");  fprintf(stdout,"       The output_file is optional; the program writes to standard output\n");  fprintf(stdout,"       by default.\n\n");  fprintf(stdout,"Options: -a     Force the program to take into account all the variables.\n");  fprintf(stdout,"                By default it only looks at angles d and voltages V in the\n");  fprintf(stdout,"                right e-vector or tangent vector, and P and Q mismatches\n");  fprintf(stdout,"                in the left e-vector.\n\n");  fprintf(stdout,"         -h     Prints this message.\n\n");  fprintf(stdout,"         -d     Prints debugging information.\n\n");  fprintf(stdout,"         -nnum  Extracts N='num' maximum values from iput_file.\n");  fprintf(stdout,"                N=5 by default.\n\n");  fprintf(stdout,"         -v     Read input data in I Val format.\n\n");  fprintf(stdout,"         -V     Only extract voltage information, i.e., V variables in\n");  fprintf(stdout,"                the right e-vector or tangent vector, and Q mismatches\n");  fprintf(stdout,"                in the left e-vector.\n");  if (!NullName(Msg)) exit(ERROREXIT); else exit(NORMALEXIT);}/* ===================== ErrorHalt ================================ */#ifdef ANSIPROTOvoid ErrorHalt(char *Msg)#elsevoid ErrorHalt(Msg)char *Msg;#endif{  fprintf(stderr,"Error: %s\n",Msg);  exit(ERROREXIT);}/* --------------------------- Main Program  ------------------------------ */#ifdef ANSIPROTOint main(int argc,char **argv)#elseint main(argc,argv)int argc;char **argv;#endif/* Extract 5 maximum PoC e-vector values */{  char *Name,var[20],Line[BUFLEN];  VALUETYPE val,Maxval=1;  FILE *In,*Out;  INDEX i=0,l,N,count;  BOOLEAN All=FALSE,Voltage=FALSE,flag=FALSE,Format=TRUE;  Data  *Ptr,*PtrMax,*PrevPtr,*PrevPtrMax;  fprintf(stderr,"Extract maximum PoC e-vector values (c)1992,1996 C. Canizares\n");  SetArguments(argc,argv);  if (HelpRequested()) ErrorStop("");  N=(INDEX) IntegerParameter('n',5,1,1e6);  All=ExistParameter('a');  Format=!ExistParameter('v');  Voltage=ExistParameter('V');  DataPtr=(Data *) malloc(sizeof(Data));  if (DataPtr==NULL) {ErrorHalt("Insufficient memory to allocate data."); exit(ERROREXIT);}  Ptr=NULL;  In=(FILE *) OpenInput(TrueParamStr(1));  Out=(FILE *) OpenOutput(TrueParamStr(2));  if (Format && fgets(Line,BUFLEN,In)==NULL) ErrorStop("Wrong input data.");  for (;;) {    if (fgets(Line,BUFLEN,In)==NULL) ErrorStop("Wrong input data: Check for 0 0 0 line.");    if (Format) {      if(sscanf(Line,"%d %s %lf",&i,var,&val)!=3) ErrorStop("Wrong input data:  Check input data format.");    } else {      strcpy(var,"");      if(sscanf(Line,"%d %lf",&i,&val)!=2) ErrorStop("Wrong input data:  Check input data format.");    }    if (i) {      if (All || (Voltage && ((!strncmp(var,"dQ",2) || !strncmp(var,"V",1)) && strncmp(var,"Vd",2))) ||          (!Voltage && (((!strncmp(var,"d",1) || !strncmp(var,"V",1)) && strncmp(var,"delta",5))))) {        if (flag) {          Ptr=DataPtr;          DataPtr=(Data *) malloc(sizeof(Data));          if (DataPtr==NULL) {ErrorHalt("Insufficient memory to allocate data."); exit(ERROREXIT);}        }        DataPtr->i=i;        strcpy(DataPtr->var,var);        DataPtr->val=val;        DataPtr->Next=Ptr;        flag=TRUE;      }    } else break;  }  if (Ptr==NULL) DataPtr=NULL;  for(l=1;l<=N;l++) {    val=-0.1;    if (DataPtr==NULL) break;    for(PrevPtr=Ptr=DataPtr,count=0;Ptr!=NULL;PrevPtr=Ptr,Ptr=Ptr->Next,count++) {      if (fabs(Ptr->val)>val) {        val=fabs(Ptr->val);        PtrMax=Ptr;        PrevPtrMax=PrevPtr;        if (ExistParameter('d')) {          fprintf(stderr,"Maximum: ");          if (Format) fprintf(stderr,"%4d %8s %-11.5g\n",PtrMax->i,PtrMax->var,PtrMax->val/Maxval);          else fprintf(stderr,"%4d %-11.5g\n",PtrMax->i,PtrMax->val/Maxval);        }      }     }     if (ExistParameter('d')) fprintf(stderr,"counter=%d\n",count);    if (l==1) Maxval=PtrMax->val;    if(PtrMax!=NULL) {      if (Format) fprintf(Out,"%4d %8s %-11.5g\n",PtrMax->i,PtrMax->var,PtrMax->val/Maxval);      else fprintf(Out,"%4d %-11.5g\n",PtrMax->i,PtrMax->val/Maxval);      if (PrevPtrMax!=PtrMax) PrevPtrMax->Next=PtrMax->Next;      else DataPtr=PtrMax->Next;      if (ExistParameter('d')) {        fprintf(stderr,"Answer: ");        if (Format) fprintf(stderr,"%4d %8s %-11.5g\n",PtrMax->i,PtrMax->var,PtrMax->val/Maxval);        else fprintf(stderr,"%4d %-11.5g\n",PtrMax->i,PtrMax->val/Maxval);      }      free(PtrMax);    }   }  fclose(Out);  return(0);}

⌨️ 快捷键说明

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