Allink  v0.1
UsaMatematica.cpp
00001 #include "../../include/Matematica.h"
00002 #include "../../include/VarDatFile.h"
00003 
00004 #include <iostream>
00005 using namespace std;
00006 
00007 int main(int argc,char **argv){
00008   FILE *SEGNALE;
00009   char Uscita[256];
00010   char Comando[50];
00011   char Executex[60];
00012   char Executey[60];
00013   double *Dis = new double;
00014   int CoordX = 0;
00015   int NBin = 200;
00016   int NMax=0;
00017   int NVar =0;
00018   int CoordY = 1;
00019   int CoordY1 = 1;
00020   int CoordX1 = 1;
00021   int NMedia=10;
00022   int LogLog = 0;
00023   int IfNorm = 0;
00024   int IfBorder = 0;
00025   int NSample = 10;
00026   double *Intervalli;
00027   double *dInter;
00028   //vector <double> st;
00029   double *sp;
00030   double *sw;
00031   double Border[4] = {0.,0.,0.,0.};
00032   double Param = 1.;
00033   VarDatFile *v1;
00034   Matematica *m1 = new Matematica();
00035   MOMENTI Mom;
00036   sprintf(Uscita,"Risposta.dat");
00037   //  for(int i=0;i<argc;i++){
00038   int NFile = 0;
00039   int *ArgFile = (int *)calloc(argc,sizeof(int));
00040   int IfUser = 1;
00041   int NElMin = 0;
00042   int NElMax = 0;
00043   for(int i=1;i<argc;i++){
00044     if(!strcmp(*(argv+i),"--col")){
00045       if(i<argc-1){
00046    i+=1;
00047       }  
00048     }
00049     else if(!strcmp(*(argv+i),"--exec")){
00050       if(i<argc-1){
00051    sprintf(Executex,"%s",*(argv+i+1));
00052    sprintf(Executey,"%s",*(argv+i+2));
00053    i+=2;
00054    sprintf(Comando,"exec");
00055    IfUser = 0;
00056       }  
00057     }
00058     else if(!strncmp(*(argv+i),"--Border",8)){
00059       if(argc < i){printf("How many values?\n");return 0;}
00060       sscanf(argv[i+1],"%lf",Border);
00061       sscanf(argv[i+2],"%lf",Border+1);
00062       IfBorder=1;
00063       i+=2;
00064     }
00065     else if(!strncmp(*(argv+i),"-l",2)){
00066       if(argc < i){printf("Whic log scale?\n");return 0;}
00067       char LogScale[12];
00068       sscanf(argv[i+1],"%s",LogScale);
00069       LogLog = 0;
00070       if(!strcmp(LogScale,"logx"))
00071    DIS_ADD_TYPE(LogLog,DIS_LOGX);
00072       else if(!strcmp(LogScale,"logy"))
00073    DIS_ADD_TYPE(LogLog,DIS_LOGY);
00074       else if(!strcmp(LogScale,"loglog"))
00075    DIS_ADD_TYPE(LogLog,DIS_LOGLOG);
00076       else{
00077    printf("Log scale not recognized\n");
00078       }
00079       i+=1;
00080     }
00081     else if(!strncmp(*(argv+i),"--NElMin",8)){
00082       if(argc < i){printf("How many values?\n");return 0;}
00083       sscanf(argv[i+1],"%d",&NElMin);
00084       i+=1;
00085     }
00086     else if(!strncmp(*(argv+i),"--NElMax",8)){
00087       if(argc < i){printf("How many values?\n");return 0;}
00088       sscanf(argv[i+1],"%d",&NElMax);
00089       i+=1;
00090     }
00091     else if(!strncmp(*(argv+i),"-m",2)){
00092       if(argc < i){printf("which interval for the running average?\n");return 0;}
00093       sscanf(argv[i+1],"%d",&NMedia);
00094       i+=1;
00095     }
00096     else if(!strncmp(*(argv+i),"--norm",6)){
00097       IfNorm = 1;
00098     }
00099     else if(!strncmp(*(argv+i),"--NSample",8)){
00100       if(argc < i){printf("How many samples?\n");return 0;}
00101       sscanf(argv[i+1],"%d",&NSample);
00102       i+=1;
00103     }
00104     else if(!strncmp(*(argv+i),"-o",2)){
00105       if(argc < i){printf("which output file?\n");return 0;}
00106       sscanf(argv[i+1],"%s",Uscita);
00107       i+=1;
00108     }
00109     else if(!strncmp(*(argv+i),"-p",2)){
00110       if(argc < i){printf("what parameter?\n");return 0;}
00111       sscanf(argv[i+1],"%lf",&Param);
00112       i+=1;
00113     }
00114     else if(!strncmp(*(argv+i),"-v",2)){
00115       if(argc < i){printf("How many values?\n");return 0;}
00116       sscanf(argv[i+1],"%d",&NBin);
00117       i+=1;
00118     }
00119     else if(!strncmp(*(argv+i),"-x",2)){
00120       i+=1;
00121     }
00122     else if(!strncmp(*(argv+i),"-y",2)){
00123       i+=1;
00124     }
00125     else if(!strncmp(*(argv+i),"--",2)){
00126       sprintf(Comando,"%s",argv[i]+2);
00127       IfUser = 0;
00128     }
00129     else if(strncmp(*(argv+i),"-",1)){
00130       ArgFile[NFile] = i;
00131       NFile++;
00132     }
00133   }
00134   if(NFile == 0){
00135     printf("File arguments are missing\n");
00136     //return 0;
00137   }
00138   v1 = new VarDatFile(argv,ArgFile,NFile,NBin);
00139   for(int i=1;i<argc;i++){
00140     if(!strncmp(*(argv+i),"-a",2)){
00141       v1->ImpSequence();
00142       }
00143     if(!strncmp(*(argv+i),"--col",5)){
00144       if(argc < i){printf("Which column?\n");return 0;}
00145       sscanf(argv[i+1],"%d",&CoordY);
00146       v1->Punta(CoordY);
00147       i+=1;
00148     }
00149     else if(!strncmp(*(argv+i),"-l",2)){
00150       if(argc < i){printf("Which coord for the  log scale?\n");return 0;}
00151       char LogScale[12];
00152       sscanf(argv[i+1],"%s",LogScale);
00153       LogLog = 0;
00154       if(!strcmp(LogScale,"logx"))
00155    DIS_ADD_TYPE(LogLog,DIS_LOGX);
00156       else if(!strcmp(LogScale,"logy"))
00157    DIS_ADD_TYPE(LogLog,DIS_LOGY);
00158       else if(!strcmp(LogScale,"loglog"))
00159    DIS_ADD_TYPE(LogLog,DIS_LOGLOG);
00160       else{
00161    printf("Log scale not recognized\n");
00162       }
00163       i+=1;
00164     }
00165     else if(!strncmp(*(argv+i),"-y1",3)){
00166       if(argc < i){printf("Which column?\n");return 0;}
00167       sscanf(argv[i+1],"%d",&CoordY1);
00168       i+=1;
00169     }
00170     else if(!strncmp(*(argv+i),"-x1",3)){
00171       if(argc < i){printf("Which column?\n");return 0;}
00172       sscanf(argv[i+1],"%d",&CoordX1);
00173       i+=1;
00174     }
00175     else if(!strncmp(*(argv+i),"-x",2)){
00176       if(argc < i){printf("which x coord?\n");return 0;}
00177       sscanf(argv[i+1],"%d",&CoordX);
00178       v1->ImpCoordX(CoordX);
00179       i+=1;
00180     }
00181     else if(!strncmp(*(argv+i),"-y",2)){
00182       if(argc < i){printf("Which column?\n");return 0;}
00183       sscanf(argv[i+1],"%d",&CoordY);
00184       v1->ImpCoordY(CoordY);
00185       i+=1;
00186     }
00187   }
00188   NMax = v1->pNMax();
00189   if(NElMax == 0 || NElMax > NMax) NElMax = NMax;
00190   if(NElMin > NMax || NElMin < 0) NElMin = 0;
00191   NVar = v1->pNVar();
00192   sp = new double;
00193   sw = new double[NMax];
00194   Intervalli = new double[NBin];
00195   dInter = new double[NBin];
00196   printf("Loaded a file of %d points %d cols from %d files: %s ... to write on %s\n",NMax,NVar,NFile,argv[ArgFile[0]],Uscita);
00197   //goto vet;
00198   v1->pMinMaxGlob(NElMin,NElMax);
00199   while(strcmp(Comando,"q") ){
00200     if(IfUser){
00201       printf("Matematica> ");
00202       scanf("%s",Comando);
00203     }
00204     else if(!strcmp(Comando,"agg")){
00205       char NomeFile[120];
00206       printf("Nome file :");
00207       scanf("%s",NomeFile);
00208       v1->Aggiungi(NomeFile);
00209       if(!IfUser) return 0;
00210     }
00211     else if(!strcmp(Comando,"create")){
00212       FILE *Ciccia = fopen(Uscita,"w");
00213       if(Ciccia == NULL){printf("%s could not be created\n",Uscita);exit(0);}
00214       int NPassi = 100;
00215       double InvNPassi = 1./(double)NPassi;
00216       double Freq1 = 32.;
00217       double Freq2 = 4.;
00218       for(int px=0;px<NPassi;px++){
00219    double x = px*InvNPassi*DUE_PI;
00220    fprintf(Ciccia,"%lf %lf\n",x,sin(x*Freq1));
00221       }
00222     }
00223     else if(!strcmp(Comando,"create2d")){
00224       FILE *Ciccia = fopen(Uscita,"w");
00225       int NPassi = 100;
00226       double InvNPassi = 1./(double)NPassi;
00227       double Freq1 = 32.;
00228       double Freq2 = 4.;
00229       int IfOctave = 1;
00230       if(!IfOctave){
00231    for(int px=0;px<NPassi;px++){
00232      for(int py=0;py<NPassi;py++){
00233        double x = px*InvNPassi*DUE_PI;
00234        double y = py*InvNPassi*DUE_PI;
00235        fprintf(Ciccia,"%lf %lf %lf\n",x,y,sin(x*y*Freq1));
00236      }
00237    }
00238       }
00239       else{
00240    fprintf(Ciccia,"# Created by ElPoly\n");
00241    fprintf(Ciccia,"# name: tz\n");
00242    fprintf(Ciccia,"# type: matrix\n");
00243    fprintf(Ciccia,"# rows: %d\n",NPassi); 
00244    fprintf(Ciccia,"# columns: %d\n",NPassi); 
00245    for(int px=0;px<NPassi;px++){
00246      for(int py=0;py<NPassi;py++){
00247        double x = px*InvNPassi*DUE_PI;
00248        double y = py*InvNPassi*DUE_PI;
00249        fprintf(Ciccia,"%lf ",sin(x*y*Freq2));
00250      }
00251      fprintf(Ciccia,"\n");
00252    }
00253       }
00254       fclose(Ciccia);
00255       if(!IfUser) return 0;
00256     }
00257     else if(!strcmp(Comando,"dis")){
00258       Mom = v1->DistrGaussSegnale(NElMin,NElMax,IfNorm);
00259       FILE *USCITA;
00260       if((USCITA = fopen(Uscita,"w"))==0){
00261    printf("Non s'apre %s\n Permessi?\n",Uscita);
00262       }
00263       fprintf(USCITA,"# %lf %lf %lf\n",Mom.Uno,Mom.Due,Mom.Tre);
00264       for(int i=0;i<NBin;i++){
00265    double x = Mom.Delta*i+Mom.Min;
00266    fprintf(USCITA,"%lf %g\n",x,v1->pInter(i));
00267       }
00268       fclose(USCITA);
00269       printf("Media %lf Scarto %lf N %d\n",Mom.Uno,Mom.Due,Mom.Num);
00270       if(!IfUser) return 0;
00271     }
00272     else if(!strcmp(Comando,"disErr")){
00273       Mom = v1->DistrSignErr(NElMin,NElMax,Border,IfNorm);
00274       FILE *USCITA;
00275       if((USCITA = fopen(Uscita,"w"))==0){
00276    printf("Non s'apre %s\n Permessi?\n",Uscita);
00277       }
00278       fprintf(USCITA,"# %lf %lf %lf\n",Mom.Uno,Mom.Due,Mom.Tre);
00279       for(int i=0;i<NBin;i++){
00280    double x = Mom.Delta*i+Mom.Min;
00281    fprintf(USCITA,"%lf %g %g\n",x,v1->pInter(i),v1->pError(i));
00282       }
00283       fclose(USCITA);
00284       printf("Media %lf Scarto %lf N %d\n",Mom.Uno,Mom.Due,Mom.Num);
00285       if(!IfUser) return 0;
00286     }
00287     else if(!strcmp(Comando,"disB")){
00288       Mom = v1->DistrSegnale(NElMin,NElMax,Border,IfNorm);
00289       FILE *USCITA;
00290       if((USCITA = fopen(Uscita,"w"))==0){
00291    printf("Non s'apre %s\n Permessi?\n","Distribuzione.dat");
00292       }
00293       fprintf(USCITA,"# %lf %lf %lf\n",Mom.Uno,Mom.Due,Mom.Tre);
00294       for(int i=0;i<NBin;i++){
00295    double x = Mom.Delta*i+Mom.Min;
00296    fprintf(USCITA,"%lf %g\n",x,v1->pInter(i));
00297       }
00298       fclose(USCITA);
00299       printf("Media %lf Scarto %lf N %d\n",Mom.Uno,Mom.Due,Mom.Num);
00300       if(!IfUser) return 0;
00301     }
00302     else if(!strcmp(Comando,"disLog")){
00303       Mom = v1->DistrLogSegnale(NElMin,NElMax,IfNorm);
00304       FILE *USCITA;
00305       if((USCITA = fopen(Uscita,"w"))==0){
00306    printf("Non s'apre %s\n Permessi?\n","Distribuzione.dat");
00307       }
00308       fprintf(USCITA,"# %lf %lf %lf\n",Mom.Uno,Mom.Due,Mom.Tre);
00309       for(int i=0;i<NBin;i++){
00310    double x = Mom.Delta*i+Mom.Min;
00311    fprintf(USCITA,"%lf %g\n",x,v1->pInter(i));
00312       }
00313       fclose(USCITA);
00314       printf("Media %lf Scarto %lf N %d\n",Mom.Uno,Mom.Due,Mom.Num);
00315       if(!IfUser) return 0;
00316     }
00317     else if(!strcmp(Comando,"disExp")){
00318       Mom = v1->DistrExpSegnale(NElMin,NElMax,IfNorm);
00319       FILE *USCITA;
00320       if((USCITA = fopen(Uscita,"w"))==0){
00321    printf("Non s'apre %s\n Permessi?\n","Distribuzione.dat");
00322       }
00323       fprintf(USCITA,"# %lf %lf %lf\n",Mom.Uno,Mom.Due,Mom.Tre);
00324       for(int i=0;i<NBin;i++){
00325    double x = Mom.Delta*i+Mom.Min;
00326    fprintf(USCITA,"%lf %g\n",x,v1->pInter(i));
00327       }
00328       fclose(USCITA);
00329       printf("Media %lf Scarto %lf N %d\n",Mom.Uno,Mom.Due,Mom.Num);
00330       if(!IfUser) return 0;
00331     }
00332     else if(!strcmp(Comando,"disSample")){
00333       double xBound[2] = {Border[0],Border[1]};
00334       double **Distr;
00335       Distr = new double*[NSample];
00336       for(int s=0;s<NSample;s++){
00337    Distr[s] = new double[NBin];
00338       }
00339       v1->DistrSignSample(NElMin,NElMax,Distr,NSample,IfNorm,xBound);
00340       FILE *USCITA;
00341       if((USCITA = fopen(Uscita,"w"))==0){
00342    printf("Non s'apre %s\n Permessi?\n","Distribuzione.dat");
00343       }
00344       fprintf(USCITA,"# distribution per sample\n");
00345       for(int b=0;b<NBin;b++){
00346    double x = b/(double)NBin*(xBound[1]-xBound[0]) + xBound[0];
00347    fprintf(USCITA,"%lf ",x);
00348    for(int s=0;s<NSample;s++){
00349      fprintf(USCITA,"%lf ",Distr[s][b]);
00350    }
00351    fprintf(USCITA,"\n");
00352       }
00353       fclose(USCITA);
00354       if(!IfUser) return 0;
00355     }
00356     else if(!strcmp(Comando,"DrawEq")){
00357       FILE *FWrite = fopen(Uscita,"w");
00358       if(!IfBorder){
00359    Border[0] = v1->pxMinGlob(NElMin,NElMax);
00360    Border[1] = v1->pxMaxGlob(NElMin,NElMax);
00361       }
00362       double Dx = (Border[1]-Border[0])/(double)NBin;
00363       for(int i=0;i<NBin;i++){
00364    double x = i*Dx+Border[0];
00365    fprintf(FWrite,"%lf %lf\n",x,v1->fProva(x));
00366       }
00367       fclose(FWrite);
00368       if(!IfUser) return 0;
00369     }    
00370     else if(!strcmp(Comando,"coord")){
00371       printf("Number of coordinate: ");
00372       int NCoord = 0;
00373       scanf("%d",&NCoord);
00374       if(NCoord >= 0 && NCoord<NVar)
00375    v1->Punta(NCoord);
00376       if(!IfUser) return 0;
00377     }
00378     else if(!strcmp(Comando,"MatchCoord")){
00379       double *st = (double *)calloc(NMax,sizeof(double));
00380       double tInit = v1->Val(CoordX1,0);
00381       int mOld = 0;
00382       for(int n=NElMin,m=0;n<NElMax;n++){
00383    mOld = m-1;
00384    do {
00385      double t = tInit + v1->Val(CoordX,m);
00386      //printf("%d %d %lf <= %lf < %lf -> %lf\n",n,m,v1->Val(CoordX1,n),t,v1->Val(CoordX1,n+1),st[n]);
00387      if(v1->Val(CoordX1,n) <= t && t < v1->Val(CoordX1,n+1))
00388        break;
00389      m++;
00390      if(m >= NMax){
00391        m = mOld;
00392        break;
00393      }
00394    } while(1==1);
00395    st[n] = v1->Val(CoordY,m);
00396    //printf("%d %d %lf <= %lf < %lf -> %lf\n",n,m,v1->Val(CoordX1,n),v1->Val(CoordX,m)+tInit,v1->Val(CoordX1,n+1),st[n]);
00397    m++;
00398       }
00399       FILE *USCITA;
00400       if((USCITA = fopen(Uscita,"w"))==0)
00401    printf("Non s'apre %s\n Permessi?\n",Uscita);
00402       for(int i=NElMin;i<NElMax;i++){
00403    fprintf(USCITA,"%lf %.5g %.5g\n",st[i],v1->Val(CoordY1,i),v1->Val(CoordY1+1,i));
00404       }
00405       fclose(USCITA);
00406       free(st);
00407       if(!IfUser) return 0;
00408     }
00409     else if(!strcmp(Comando,"norm")){
00410       FILE *USCITA;
00411       if((USCITA = fopen(Uscita,"w"))==0)
00412    printf("Non s'apre %s\n Permessi?\n",Uscita);
00413       v1->NormalizzaSegnale(NElMin,NElMax);
00414       for(int i=NElMin;i<NElMax;i++){
00415    fprintf(USCITA,"%lf %.5g\n",v1->Abscissa(CoordY,i),v1->Val(CoordY,i));
00416       }
00417       fclose(USCITA);
00418       if(!IfUser) return 0;
00419     }
00420     else if(!strcmp(Comando,"sin")){
00421       FILE *USCITA;
00422       if((USCITA = fopen(Uscita,"w"))==0){
00423    printf("Non s'apre %s\n Permessi?\n",Uscita);
00424       }
00425       for(int i=0;i<100;i++){
00426    double x = i*DUE_PI*.01;
00427    fprintf(USCITA,"%g\n",sin(x));
00428       }
00429       fclose(USCITA);
00430       if(!IfUser) return 0;
00431     }
00432     else if(!strcmp(Comando,"sum")){
00433       double Sum = 0.;
00434       for(int i=NElMin;i<NElMax;i++){
00435    Sum += v1->Val(CoordY,i);
00436       }
00437       printf("Sum: %lf\n",Sum);
00438       if(!IfUser) return 0;
00439     }
00440     else if(!strcmp(Comando,"SpD")){
00441       printf("Calcolo lo spettro \n");
00442       m1->Spettro(sp,sw,NMax);
00443       FILE *USCITA;
00444       if((USCITA = fopen(Uscita,"w"))==0){
00445    printf("Non s'apre %s\n Permessi?\n",Uscita);
00446    return 0;
00447       }
00448       for(int i=0;i<NMax/2;i++){
00449    fprintf(USCITA,"%g\n",sw[i]);
00450       }
00451       fclose(USCITA);
00452       if(!IfUser) return 0;
00453     }
00454     else if(!strcmp(Comando,"sort")){
00455       v1->Punta(0);
00456       v1->Sort();
00457       v1->ScriviTutto(Uscita,0,NElMin,NElMax);
00458       if(!IfUser) return 0;
00459     }
00460     else if(!strcmp(Comando,"Cas")){
00461       printf("Proviamo il generatore di numeri casuali \n");
00462       FILE *USCITA;
00463       if((USCITA = fopen(Uscita,"w"))==0){
00464    printf("Non s'apre %s\n Permessi?\n",Uscita);
00465       }
00466       for(int i=0;i<10000;i++){
00467    fprintf(USCITA,"%lf\n",m1->Casuale());
00468       }
00469       fclose(USCITA);
00470        if(!IfUser) return 0;
00471     }
00472     else if(!strcmp(Comando,"Func")){
00473       FILE *USCITA;
00474       printf("Proviamo una funzione \n");
00475       if((USCITA = fopen(Uscita,"w"))==0){
00476    printf("Non s'apre %s\n Permessi?\n",Uscita);
00477       }
00478       for(double x=0.,Dx=.001,Max=5.;x<Max;x+=Dx){
00479    printf("%lf\n",x/Max);
00480    fprintf(USCITA,"%lf %g %g %g\n",x,m1->QuasiBessel(x,0),m1->QuasiBessel(x,1),m1->Bessel(x,0));
00481    //fprintf(USCITA,"%lf %g %g %g\n",x,m1->Neumann(x,0),m1->Neumann(x,1),m1->Neumann(x,-1));
00482    x += Dx;
00483       }
00484       fclose(USCITA);
00485       if(!IfUser) return 0;
00486     }
00487     else if(!strcmp(Comando,"SpeLine")){
00488       int NBin = NElMax-NElMin;
00489       double InvNVar = .5/(double)(NVar);
00490       double InvNBin = 1./(double)(NMax);
00491       double *Spe = (double *)calloc(NBin,sizeof(double));
00492       v1->SpeLine(NElMin,NElMax,NBin,Spe);
00493       FILE *FWrite = fopen("StalkLineSpectrum.dat","w");
00494       fprintf(FWrite,"# q=2\\pi n/N <h(q)^2>\n");
00495       char FName[120];
00496       for(int n=0;n<NBin;n++){
00497    fprintf(FWrite,"%lf %g \n",DUE_PI*InvNBin*n,Spe[n]*InvNVar*InvNBin);
00498       }
00499       fclose(FWrite);
00500       free(Spe);
00501       if(!IfUser) return 0;
00502     }
00503     else if(!strcmp(Comando,"spe") ){
00504       FILE *USCITA;
00505       m1->Spettro(v1->sp,sw,NMax);
00506       if((USCITA = fopen(Uscita,"w"))==0){
00507    printf("Non s'apre %s\n Permessi?\n",Uscita);
00508       }
00509       for(int i=0;i<NMax;i++){
00510    fprintf(USCITA,"%g\n",sw[i]);
00511       }
00512       fclose(USCITA);
00513       break;
00514       if(!IfUser) return 0;
00515     }
00516     else if(!strcmp(Comando,"RadTens") ){
00517       if(NFile != 4){
00518    printf("I need the three components of the radial pressure\n");
00519    if(!IfUser) return 0;   
00520       }
00521       FILE *RadTens = fopen(Uscita,"w");
00522       double Vol1 = 0.;
00523       double Vol2 = 0.;
00524       for(int n=0;n<NMax-1;n++){
00525    Vol1 = DUE_PI*SQR(v1->Abscissa(CoordY,n+1));
00526    double Prr = sqrt( SQR(v1->Val(1,n)) + SQR(v1->Val(6,n)));
00527    double Pzz = v1->Val(11,n);
00528    double PTrace = v1->Val(1,n)+v1->Val(5,n)+v1->Val(11,n);
00529    double Ptt = .5*(PTrace - Prr);
00530    double SurfTens = (Prr - .5*(Ptt+Pzz))/(Vol1-Vol2);
00531    fprintf(RadTens,"%lf %lf\n",v1->Abscissa(CoordY,n),SurfTens);
00532    Vol2 = Vol1;
00533       }
00534       fclose(RadTens);
00535       if(!IfUser) return 0;
00536     }
00537     else if(!strcmp(Comando,"perm") ){
00538       int NMax = 16;
00539       PERMUTE *Perm = (PERMUTE *)calloc(NMax,sizeof(PERMUTE));
00540       m1->PermuteRandomAll(Perm,NMax);
00541       if(!IfUser) return 0;
00542     }
00543     else if(!strcmp(Comando,"solve") ){
00544       Matrice *A = new Matrice(4,4);
00545 //       Matrice Pasquale(4);
00546 //       Matrice Romualdo(4);
00547 //       Matrice Adalgiso(4);
00548 //       Matrice Goffredo(4);
00549 //       Pasquale.RandomFill(1.);
00550 //       Romualdo.RandomFill(1.);
00551 //       //Pasquale = Romualdo;
00552 //       Adalgiso.Mult(Pasquale,Romualdo);
00553 //       Adalgiso.Print();
00554 //       exit(0);
00555       A->Set(0,0,1.);A->Set(0,1,6.);A->Set(0,2,5.);A->Set(0,3,8.);
00556       A->Set(1,0,5.);A->Set(1,1,2.);A->Set(1,2,5.);A->Set(1,3,5.);
00557       A->Set(2,0,6.);A->Set(2,1,3.);A->Set(2,2,7.);A->Set(2,3,1.);
00558       A->Set(3,0,8.);A->Set(3,1,7.);A->Set(3,2,2.);A->Set(3,3,6.);
00559 
00560 //       A->Set(0,0,1.);A->Set(0,1,0.);A->Set(0,2,0.);A->Set(0,3,1.);
00561 //       A->Set(1,0,0.);A->Set(1,1,1.);A->Set(1,2,0.);A->Set(1,3,0.);
00562 //       A->Set(2,0,0.);A->Set(2,1,0.);A->Set(2,2,1.);A->Set(2,3,0.);
00563 //       A->Set(3,0,2.);A->Set(3,1,0.);A->Set(3,2,0.);A->Set(3,3,1.);
00564       //      A->RandomFill(20.);
00565       A->Print();
00566       double *Known = (double *)calloc(4,sizeof(double));
00567       Known[0] = 1.; Known[1] = 4.; Known[2] = 3.; Known[3] = 2.;
00568       double *UnKnown = (double *)calloc(4,sizeof(double));
00569       A->Solve(Known,UnKnown);
00570       for(int i=0;i<4;i++){
00571    printf("%lf %lf\n",Known[i],UnKnown[i]);
00572       }
00573       if(!IfUser) return 0;
00574     }
00575     else if(!strcmp(Comando,"zeri") ){
00576       double a=0.,b=0.;
00577       int rad;
00578 //       printf("Minimo valore: ");
00579 //       scanf("%lf",&a);
00580 //       printf("Massimo valore: ");
00581 //       scanf("%lf",&b);
00582 //%% 2.5 
00583 //%% 2.0
00584 //%% 1.5 23.376860  3817.700000
00585 //%% 1.0 21.643605  3817.700000
00586       int NRadici = 4;
00587       double *Radici;
00588       m1->Ypsilon = 23.37;
00589       m1->PreFact = 3817.7;;
00590       m1->Func = &Matematica::ContactAngle;
00591       Radici = (double *)malloc(NRadici*sizeof(double));
00592       rad = m1->Zeri(0.,DUE_PI/2.,Radici,NRadici);
00593       if(!IfUser) return 0;
00594     }
00595     else if(!strcmp(Comando,"fal") ){
00596       double a=0.,b=0.;
00597       RADICE Zero;
00598 //       printf("Minimo valore: ");
00599 //       scanf("%lf",&a);
00600 //       printf("Massimo valore: ");
00601 //       scanf("%lf",&b);
00602       Zero = m1->RegulaFalsi(.1,3.);
00603       printf("Lo Zero e in x %lf\n",Zero.Zero);
00604       if(!IfUser) return 0;
00605     }
00606     else if(!strcmp(Comando,"new") ){
00607       double a=0.;
00608       RADICE Zero;
00609       printf("Punto iniziale: ");
00610       scanf("%lf",&a);
00611       Zero = m1->Newton(a);
00612       printf("Lo Zero e in x %lf\n",Zero.Zero);
00613       if(!IfUser) return 0;
00614     }
00615     else if(!strcmp(Comando,"fun") ){
00616       FILE *USCITA;
00617       USCITA = fopen("Funzione.dat","w");
00618       double A = 0.;
00619       double B = DUE_PI;
00620       int NPunti = 10000;
00621       double Delta = (B-A)/(double)NPunti; 
00622       m1->Ypsilon = 3.814;
00623       m1->PreFact = 0.169370;
00624       m1->Func = &Matematica::ContactAngle;
00625       for(int i=0;i<NPunti;i++){
00626    fprintf(USCITA,"%g  %g\n",Delta*(double)i,m1->Evalx(Delta*(double)i));
00627       }
00628       fclose(USCITA);
00629       if(!IfUser) return 0;
00630     }
00631     else if(!strcmp(Comando,"FitLin") ){
00632       FILE *USCITA = fopen(Uscita,"w");
00633       RETTA r1 = v1->InterRettSegnale(CoordY,NElMin,NElMax,LogLog);
00634       printf("y = (%lf +- %lf)x + (%lf +- %lf)\n",r1.m,r1.ErrM,r1.q,r1.ErrQ);
00635       fprintf(USCITA,"#y = (%lf +- %lf)x + (%lf +- %lf)\n",r1.m,r1.ErrM,r1.q,r1.ErrQ);
00636       if(!LogLog){
00637    for(int i=0;i<NMax;i++){
00638      fprintf(USCITA,"%lf %lf %lf\n",v1->Abscissa(CoordY,i),v1->Val(CoordY,i),v1->Abscissa(CoordY,i)*r1.m+r1.q);
00639    }
00640       }
00641       else{
00642    for(int i=0;i<NMax;i++){
00643      if(v1->Abscissa(CoordY,i) <= 0.) continue;
00644      if(v1->Val(CoordY,i) <= 0.) continue;
00645      fprintf(USCITA,"%lf %lf %lf\n",log10(v1->Abscissa(CoordY,i)),log10(v1->Val(CoordY,i)),log10(v1->Abscissa(CoordY,i))*r1.m+r1.q);
00646    }
00647       }
00648       fclose(USCITA);
00649       if(!IfUser) return 0;
00650     }
00651     else if(!strcmp(Comando,"FitPara") ){
00652       FILE *USCITA = fopen(Uscita,"w");
00653       PARABOLA p1 = v1->ParabolaSegnale(CoordY,NElMin,NElMax,LogLog);
00654       printf("%.2g + %.2g x + %.2g x^2\n",p1.a0,p1.a1,p1.a2);
00655       printf("Minimum %.2g \n",p1.Minimo);
00656       fprintf(USCITA,"#%.2g + %.2g x + %.2g x^2\n",p1.a0,p1.a1,p1.a2);
00657       fprintf(USCITA,"#Minimum %.2g \n",p1.Minimo);
00658       for(int i=0;i<NMax;i++){
00659    fprintf(USCITA,"%lf %lf %lf\n",v1->Abscissa(CoordY,i),v1->Val(CoordY,i),v1->Abscissa(CoordY,i)*p1.a1+v1->Abscissa(CoordY,i)*v1->Abscissa(CoordY,i)*p1.a2+p1.a0);
00660       }
00661       fclose(USCITA);
00662       if(!IfUser) return 0;
00663     }
00664     else if(!strcmp(Comando,"FitExp") ){
00665       FILE *USCITA = fopen(Uscita,"w");
00666       RETTA r1 = v1->InterExpSegnale(CoordY,NElMin,NElMax,LogLog);
00667       printf("y=(%.3g+-%.3g)exp(x/(%.3g+-%.3g))\n",log10(r1.q),log10(r1.ErrQ),1./r1.m,r1.ErrM/SQR(r1.m));
00668       printf("decay t_d = %.4g +- %.4g\n",1./r1.m,r1.ErrM/SQR(r1.m));
00669       fprintf(USCITA,"#y=(%.3g+-%.3g)exp(x/(%.3g+-%.3g))\n",log10(r1.q),log10(r1.ErrQ),1./r1.m,r1.ErrM/SQR(r1.m));
00670       fprintf(USCITA,"#decay t_d = %.4g +- %.4g\n",1./r1.m,r1.ErrM/SQR(r1.m));
00671       for(int i=0;i<NMax;i++){
00672    fprintf(USCITA,"%lf %lf %lf\n",v1->Abscissa(CoordY,i),v1->Val(CoordY,i),exp(r1.q+r1.m*v1->Abscissa(CoordY,i)));
00673       }
00674       fclose(USCITA);
00675       if(!IfUser) return 0;
00676     }
00677     else if(!strcmp(Comando,"Prob2Nrg") ){
00678       FILE *File2Write = fopen(Uscita,"w");
00679       if(File2Write == NULL){
00680    printf("Could not open %s\n",Uscita);
00681    return 1;
00682       }
00683       MOMENTI Mom = v1->DistrSegnale(NElMin,NElMax,IfNorm);
00684       v1->NormalizzaInter();
00685       for(int v=0;v<NBin;v++){
00686    double x = Mom.Min + v*Mom.Delta;
00687    if(v1->pInter(v) > 0.)
00688      fprintf(File2Write,"%lf %lf\n",x,-log(v1->pInter(v)));
00689       }
00690       fclose(File2Write);
00691       if(!IfUser) return 0;
00692     }
00693     else if(!strcmp(Comando,"min") ){
00694       double Min = v1->Val(CoordY,0);
00695       int nMin = 0;
00696       for(int n=0;n<NMax;n++){
00697    if(Min > v1->Val(CoordY,n)){
00698      Min = v1->Val(CoordY,n);
00699      nMin = n;
00700    }
00701       }
00702       printf("%lf %lf\n",v1->Val(CoordX,nMin),v1->Val(CoordY,nMin));
00703       if(!IfUser) return 0;
00704     }
00705     else if(!strcmp(Comando,"mm") ){
00706       printf("Number of points per sample: %d\n",NMedia);
00707       int NSample = v1->MediaMobSegnale(NMedia);
00708       double Deltax = 1.;//(v1->pxMax()-v1->pxMin())/(double)NSample;
00709       FILE *USCITA;
00710       if((USCITA = fopen(Uscita,"w"))==0)
00711    printf("Non s'apre %s\n Permessi?\n",Uscita);
00712       for(int i=0;i<NSample;i++){
00713    fprintf(USCITA,"%lf %lf %lf\n",v1->Abscissa(CoordY,i*NMedia)+Deltax,v1->pPunti(i),v1->pPuntiErr(i));
00714       }
00715       fclose(USCITA);
00716       if(!IfUser) return 0;
00717     }
00718     else if(!strcmp(Comando,"WeightHisto") ){
00719       v1->WeightHistoSign(NFile);
00720       // FILE *USCITA;
00721       // if((USCITA = fopen(Uscita,"w"))==0)
00722       //    printf("Non s'apre %s\n Permessi?\n",Uscita);
00723       // for(int i=0;i<NSample;i++){
00724       //    fprintf(USCITA,"%lf %lf %lf\n",v1->Abscissa(CoordY,i*NMedia)+Deltax,v1->pPunti(i),v1->pPuntiErr(i));
00725       // }
00726       // fclose(USCITA);
00727       if(!IfUser) return 0;
00728     }
00729     else if(!strcmp(Comando,"int")){
00730       double Int = v1->IntSegnale();
00731       FILE *USCITA;
00732       if((USCITA = fopen(Uscita,"w"))==0)
00733    printf("Non s'apre %s\n Permessi?\n",Uscita);
00734       printf("%d %d %d\n",NElMin,NElMax,v1->pNMax());
00735       for(int i=NElMin;i<NElMax;i++){
00736    fprintf(USCITA,"%lf %lf\n",v1->Abscissa(CoordY,i),v1->pPunti(i));
00737       }
00738       printf("%lf\n",Int);
00739       if(!IfUser) return 0;
00740     }
00741     else if(!strcmp(Comando,"mom")){
00742       for(int v=0;v<NVar;v++){
00743    v1->Punta(v);
00744    Mom = v1->DistrGaussSegnale(NElMin,NElMax,IfNorm);
00745    printf("%d) %lf pm %lf\n",v,Mom.Uno,Mom.Due);
00746       }
00747       if(!IfUser) return 0;
00748     }
00749     else if(!strcmp(Comando,"exec")){
00750       if(IfUser){
00751    printf("Inserire la formula per x: ");
00752    scanf("%s",Executex);
00753    printf("Inserire la formula per y: ");
00754    scanf("%s",Executey);
00755       }
00756       FILE *Ciccia = fopen(Uscita,"w");
00757       for(int i=NElMin;i<NElMax;i++){
00758    for(int v=0;v<NVar;v++){
00759      double Val = v1->Val(v,i);
00760      if(v==CoordX) 
00761        Val = v1->ExecFormula(v1->Val(CoordX,i),v1->Val(CoordY,i),Executex);
00762      else if(v==CoordY) 
00763        Val = v1->ExecFormula(v1->Val(CoordX,i),v1->Val(CoordY,i),Executey);
00764      fprintf(Ciccia,"%.5g ",Val);
00765    }
00766    fprintf(Ciccia,"\n");
00767       }
00768       fclose(Ciccia);
00769       if(!IfUser) return 0;
00770     }
00771     else if(!strcmp(Comando,"widom")){
00772       FILE *Widom = fopen(Uscita,"w");
00773       for(int i=NElMin;i<NElMax;i++){
00774    if(v1->Val(3,i)*v1->Val(1,i) > 0.){
00775      double Arg = v1->Val(3,i)/(v1->Val(1,i));
00776      double ChemPot = v1->Val(0,i) + log(Arg);
00777      fprintf(Widom,"%lf %lf\n",v1->Val(0,i),ChemPot);
00778    }
00779       }
00780       fclose(Widom);
00781       if(!IfUser) return 0;
00782     }
00783     else if(!strcmp(Comando,"DecayTime")){
00784       double *st = new double[NVar];
00785       double *sw = new double[NVar];
00786       FILE *DecayTime = fopen(Uscita,"w");
00787       for(int f=0;f<NVar;f++){
00788    for(int i=NElMin;i<NElMax;i++){
00789      st[f] = v1->Val(0,i)*v1->Val(f,i);
00790    }
00791    st[f] /= (double)v1->pNMax();
00792       }
00793       m1->Spettro(st,sw,NVar);
00794       for(int f=0;f<NVar;f++){
00795    fprintf(DecayTime,"%d %g %g\n",f,sw[f],st[f]);
00796       }
00797       fclose(DecayTime);
00798       if(!IfUser) return 0;
00799     }
00800     else if(!strcmp(Comando,"reverse") ){
00801       v1->Reverse();
00802       v1->ScriviTutto(Uscita,0,NElMin,NElMax);
00803       if(!IfUser) return 0;
00804     }
00805     else if(!strcmp(Comando,"DoubleDist") ){
00806       v1->DoubleDistFluct();
00807       v1->ScriviPunti(Uscita);
00808       if(!IfUser) return 0;
00809     }
00810     else if(!strcmp(Comando,"smooth") ){
00811       v1->Smooth(Param,CoordY,NElMin,NElMax);
00812       v1->Smooth(Param,CoordY,NElMin,NElMax);
00813       v1->Smooth(Param,CoordY,NElMin,NElMax);
00814       v1->ScriviPunti(Uscita);
00815       if(!IfUser) return 0;
00816     }
00817     else if(!strcmp(Comando,"smoothGauss") ){
00818       v1->SmoothGauss(Param,CoordY,NElMin,NElMax);
00819       v1->ScriviTutto(Uscita,0,NElMin,NElMax);
00820       if(!IfUser) return 0;
00821     }
00822     else if(!strcmp(Comando,"salva") ){
00823       v1->ScriviTutto(Uscita,0,NElMin,NElMax);
00824       if(!IfUser) return 0;
00825     }
00826     else if(!strcmp(Comando,"tecplot") ){
00827       v1->TecPlot(Uscita);
00828       if(!IfUser) return 0;
00829     }
00830     else if(!strcmp(Comando,"txvl") ){
00831       v1->ExportTxvl(Uscita,NElMin,NElMax);
00832       if(!IfUser) return 0;
00833     }
00834     else if(!strcmp(Comando,"ResBulk") ){
00835       v1->RescaleToBulk(Uscita);
00836       if(!IfUser) return 0;
00837     }
00838     else if(!strcmp(Comando,"conv") ){
00839       FILE *FWrite = fopen(Uscita,"w");
00840       double x = 0.;
00841       for(int n=0;n<NMax;n++){
00842    x += .1;
00843    fprintf(FWrite,"%lf %lf\n",x,v1->Val(0,n)*1e12);
00844       }
00845       fclose(FWrite);
00846       if(!IfUser) return 0;
00847     }
00848     else if(!strcmp(Comando,"salvacol") ){
00849       v1->ScriviFile(Uscita,CoordY,0,NElMin,NElMax);
00850       if(!IfUser) return 0;
00851     }
00852     else if(!strcmp(Comando,"col") ){
00853       printf("Number of column: ");
00854       int NCol=0;
00855       scanf("%d",&NCol);
00856       v1->Punta(NCol);
00857       if(!IfUser) return 0;
00858     }
00859     else if(!strcmp(Comando,"print") ){
00860       v1->Print();
00861       if(!IfUser) return 0;
00862     }
00863     else if(!strcmp(Comando,"vet")){
00864       Vettore v(1.,0.,1.);
00865       Vettore u(0.,1.,0.);
00866       Vettore w(0.,0.,1.);
00867       Vettore n(3);
00868       v.VetV(&u);
00869       //printf("%lf %lf %lf\n",n.Angle(v,u)*RAD_DEG,n.SinAngle(v,u),n.CosAngle(v,u));
00870       n.Print();
00871       break;
00872        if(!IfUser) return 0;
00873     }
00874     else if(!strcmp(Comando,"OrdAv")){
00875       double *Distr = new double[NBin];
00876       if(!IfBorder){
00877    v1->pMinMaxGlob(NElMin,NElMax);
00878    v1->pGlobBorder(Border,Border+1,Border+2,Border+3);
00879    printf("%lf %lf\n",Border[0],Border[1]);
00880    Border[1] = Border[1] - Border[0];
00881    Border[1] = 1./(1.001*Border[1]);
00882       }
00883       else{
00884    Border[1] = Border[1] - Border[0];
00885    Border[1] = 1./(1.001*Border[1]);
00886       }
00887       printf("%lf %lf\n",Border[0],Border[1]);
00888       v1->AverageOrdinate(NElMin,NElMax,Distr,Border);
00889       FILE *WFile = fopen(Uscita,"w");
00890       for(int b=0;b<NBin;b++){
00891    double x = b/(Border[1]*NBin) + Border[0];
00892    fprintf(WFile,"%lf %lf\n",x,Distr[b]);
00893       }
00894       free(Distr);
00895       fclose(WFile);
00896       if(!IfUser) return 0;
00897     }
00898     else if(!strcmp(Comando,"WAv")){
00899       MOMENTI m1 = v1->WeightAverageSet(CoordY,NElMin,NElMax);
00900       printf("Mean %lf +- %lf\n",m1.Uno,m1.Due);
00901       if(!IfUser) return 0;
00902     }
00903     else if(!strcmp(Comando,"q") ){}
00904     else{
00905       printf("Comando sbagliato, riprovare\n");
00906       IfUser = 1;
00907     }
00908   }
00909   printf("Te se qe ve be te ne?\n");
00910   delete m1;
00911   return 0;
00912 }