📄 maxim.cpp
字号:
/* 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 ANSIPROTO
void ErrorStop(char *Msg);
void ErrorHalt(char *Msg);
int main(int argc,char **argv);
#else
void ErrorStop();
void ErrorHalt();
int main();
#endif
/* ---------------------- Global Variables ---------------- */
Data *DataPtr;
/* ---------------------- ErrorStop ------------------------------------ */
#ifdef ANSIPROTO
void ErrorStop(char *Msg)
#else
void 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 ANSIPROTO
void ErrorHalt(char *Msg)
#else
void ErrorHalt(Msg)
char *Msg;
#endif
{
fprintf(stderr,"Error: %s\n",Msg);
exit(ERROREXIT);
}
/* --------------------------- Main Program ------------------------------ */
#ifdef ANSIPROTO
int main(int argc,char **argv)
#else
int 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 + -