📄 maxim.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 + -