/***************************************************/ /* gccSTA.c */ /***************************************************/ #include #include #include #include #define NDmax 1000 void main_part(char fnameR[50],char fnameW[50]); double COC(int nd,double datat[NDmax],double datay[NDmax]); void GUM_COEF(int nd,double datat[NDmax],double *a_gum,double *c_gum); void GEV_COEF(int nd,double datat[NDmax],double *k_gev,double *a_gev,double *c_gev); void SQR_COEF(int nd,double datat[NDmax],double *a_sqr,double *b_sqr); void LN3_COEF(int nd,double datat[NDmax],double *a_ln3,double *my_ln3,double *sy_ln3); void LP3_COEF(int nd,double datat[NDmax],double *a_lp3,double *b_lp3,double *c_lp3); double XP_GUM(double p,double a_gum,double c_gum); double XP_GEV(double p,double k_gev,double a_gev,double c_gev); double XP_SQR(double p,double a_sqr,double b_sqr,double xmax); double XP_LN3(double p,double a_ln3,double my_ln3,double sy_ln3); double XP_LP3(double p,double a_lp3,double b_lp3,double c_lp3); double XP_LP3_SP(int nd,double datat[NDmax],double p); double FSQR(int nd,double datat[NDmax],double bb,double *a1,double *a2); double GAMMAL(double x); double TODA(double rx); double GDISTPP(double eta,double p); double LGAMMA1(double xx); double LGAMMA2(double x); double LINCGF(double y1,double z1); /*---------------------------------------------------------------------------*/ int main(int argc,char *argv[]) { char fnameR[50]; /*Input file name*/ char fnameW[50]; /*Output file name*/ char fnameP[50]; /*Plotting file name*/ strcpy(fnameR,argv[1]); strcpy(fnameW,argv[2]); /* strcpy(fnameP,argv[3]);*/ main_part(fnameR,fnameW); return 0; } /*---------------------------------------------------------------------------*/ void main_part(char fnameR[50],char fnameW[50]) { int i,j,nd,nnn; double datax[NDmax+1],datay[NDmax+1]; double alpha; double p,yy1,yy2,yy3,yy4,yy5,work; double rr1,rr2,rr3,rr4,rr5; double a_gum,c_gum; double a_gev,c_gev,k_gev; double a_ln3,my_ln3,sy_ln3; double a_lp3,b_lp3,c_lp3; double a_sqr,b_sqr; char dat[256]=""; char fnameT[50]="_temp.txt"; FILE *fin,*fout; for(i=0;i<=NDmax;i++){datax[i]=0.0;datay[i]=0.0;} /*============*/ /* Data input */ /*============*/ fin=fopen(fnameR,"r"); fgets(dat,sizeof dat,fin); i=0; while(fgets(dat,sizeof dat,fin)!=NULL){i=i+1;datax[i]=atof(dat);} fclose(fin); nd=i; /*========================*/ /* Sorting in small order */ /*========================*/ for(i=1;i<=nd;i++){ for(j=i+1;j<=nd;j++){ if(datax[i]>datax[j]){ work=datax[i];datax[i]=datax[j];datax[j]=work; } } } /*----------------------------------*/ /* Non-exceeding probability */ /* Plotting and positioned formula */ /* Weibull : alpha=0 */ /* Cunnane : alpha=0.4 */ /* Hazen : alpha=0.5 */ /*----------------------------------*/ alpha=0.4; for(i=1;i<=nd;i++){datay[i]=(i-alpha)/(nd+1-2.0*alpha);} /*=============================*/ /* Calculation of coefficients */ /*=============================*/ GUM_COEF(nd,datax,&a_gum,&c_gum); GEV_COEF(nd,datax,&k_gev,&a_gev,&c_gev); SQR_COEF(nd,datax,&a_sqr,&b_sqr); LN3_COEF(nd,datax,&a_ln3,&my_ln3,&sy_ln3); LP3_COEF(nd,datax,&a_lp3,&b_lp3,&c_lp3); /*===============================*/ /* Calculation of quantile value */ /*===============================*/ fout=fopen(fnameT,"w"); for(i=1;i<=nd;i++){ p=datay[i]; yy1=XP_GUM(p,a_gum,c_gum); yy2=XP_GEV(p,k_gev,a_gev,c_gev); yy3=XP_SQR(p,a_sqr,b_sqr,datax[nd]); yy4=XP_LN3(p,a_ln3,my_ln3,sy_ln3); if(b_lp3<1e4){ yy5=XP_LP3(p,a_lp3,b_lp3,c_lp3); }else{ yy5=XP_LP3_SP(nd,datax,p); } fprintf(fout,"%.4f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\n",p,datax[i],yy1,yy2,yy3,yy4,yy5); printf("%.4f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f\n",p,datax[i],yy1,yy2,yy3,yy4,yy5); } fclose(fout); /*============================*/ /* Calculation of correlation */ /*============================*/ for(nnn=1;nnn<=5;nnn++){ fin=fopen(fnameT,"r"); i=0; while(fgets(dat,sizeof dat,fin)!=NULL){ i=i+1; work=atof(strtok(dat,",")); datax[i]=atof(strtok(NULL,",")); yy1=atof(strtok(NULL,",")); yy2=atof(strtok(NULL,",")); yy3=atof(strtok(NULL,",")); yy4=atof(strtok(NULL,",")); yy5=atof(strtok(NULL,",")); switch(nnn){ case 1:datay[i]=yy1;break; case 2:datay[i]=yy2;break; case 3:datay[i]=yy3;break; case 4:datay[i]=yy4;break; case 5:datay[i]=yy5;break; } } fclose(fin); nd=i; switch(nnn){ case 1:rr1=COC(nd,datax,datay);break; case 2:rr2=COC(nd,datax,datay);break; case 3:rr3=COC(nd,datax,datay);break; case 4:rr4=COC(nd,datax,datay);break; case 5:rr5=COC(nd,datax,datay);break; } } fout=fopen(fnameW,"w"); fprintf(fout,"Input file : %s\n",fnameR); fprintf(fout,"Gumbel(a,c)=(%.4f,%.4f)\n",a_gum,c_gum); fprintf(fout,"GEV(k,a,c)=(%.4f,%.4f %.4f)\n",k_gev,a_gev,c_gev); fprintf(fout,"SQRT-ET(a,b)=(%.4f,%.4f)\n",a_sqr,b_sqr); fprintf(fout,"LN3(a,mu,sig)=(%.4f,%.4f,%.4f)\n",a_ln3,my_ln3,sy_ln3); fprintf(fout,"LP3(a,b,c)=(%.4f,%.4f,%.4f)\n",a_lp3,b_lp3,c_lp3); fprintf(fout,"Prob,Obs,Gumbel,GEV,SQRT-ET,LN3,LP3\n"); fprintf(fout,"rr,%d,%.3f,%.3f,%.3f,%.3f,%.3f\n",nd,rr1,rr2,rr3,rr4,rr5); fin=fopen(fnameT,"r"); while(fgets(dat,sizeof dat,fin)!=NULL){fprintf(fout,"%s",dat);} fclose(fin); fclose(fout); } /*---------------------------------------------------------------------------*/ double COC(int nd,double datax[NDmax],double datay[NDmax]) { /*Coefficient of correlation*/ int i; double x1,y1,x2,y2,xy,xm,ym,sx,sy,cv,rr; x1=0.0;y1=0.0;x2=0.0;y2=0.0;xy=0.0; for(i=1;i<=nd;i++){ x1=x1+datax[i]; y1=y1+datay[i]; x2=x2+datax[i]*datax[i]; y2=y2+datay[i]*datay[i]; xy=xy+datax[i]*datay[i]; } xm=x1/(double)nd; ym=y1/(double)nd; sx=sqrt(x2/(double)nd-xm*xm); sy=sqrt(y2/(double)nd-ym*ym); cv=xy/(double)nd-xm*ym; return cv/sx/sy; } /*---------------------------------------------------------------------------*/ void GUM_COEF(int nd,double datat[NDmax],double *a_gum,double *c_gum) { /* Gumbel distribution */ int i; double b0,b1,b2; double lam1,lam2,lam3; /* datat[] is sorted data */ b0=0;b1=0;b2=0; for(i=1;i<=nd;i++){ b0=b0+datat[i]; b1=b1+(double)(i-1)*datat[i]; b2=b2+(double)((i-1)*(i-2))*datat[i]; } b0=b0/(double)nd; /*Average*/ b1=b1/(double)(nd*(nd-1)); b2=b2/(double)(nd*(nd-1)*(nd-2)); lam1=b0; lam2=2.0*b1-b0; lam3=6.0*b2-6.0*b1+b0; /*Gumbel F(x)=exp{-exp[-(x-c)/a]} T=1/[1-F(x)] */ *a_gum=lam2/log(2.0); *c_gum=lam1-0.5772*(*a_gum); } /*---------------------------------------------------------------------------*/ void GEV_COEF(int nd,double datat[NDmax],double *k_gev,double *a_gev,double *c_gev) { /* Generalized Extreme Value distribution */ int i; double b0,b1,b2,d; double lam1,lam2,lam3; /* datat[] is sorted data */ b0=0;b1=0;b2=0; for(i=1;i<=nd;i++){ b0=b0+datat[i]; b1=b1+(double)(i-1)*datat[i]; b2=b2+(double)((i-1)*(i-2))*datat[i]; } b0=b0/(double)nd; /*Average*/ b1=b1/(double)(nd*(nd-1)); b2=b2/(double)(nd*(nd-1)*(nd-2)); lam1=b0; lam2=2.0*b1-b0; lam3=6.0*b2-6.0*b1+b0; /*GEV F(x)=exp{-[1-k*(x-c)/a]^(1/k)} T=1/[1-F(x)] */ d=2.0*lam2/(lam3+3.0*lam2)-log(2.0)/log(3.0); *k_gev=7.8590*d+2.9554*d*d; *a_gev=(*k_gev)*lam2/(1.0-pow(2.0,-(*k_gev)))/GAMMAL(1.0+(*k_gev)); *c_gev=lam1-((*a_gev)/(*k_gev))*(1.0-GAMMAL(1.0+(*k_gev))); } /*---------------------------------------------------------------------------*/ void SQR_COEF(int nd,double datat[NDmax],double *a_sqr,double *b_sqr) { int i; double a1,a2,b1,b2,bb,f1,f2,ff; /* Condition for a1>0 */ bb=0.0; for(i=1;i<=nd;i++){bb=bb+sqrt(datat[i]);} bb=(2.0*(double)nd/bb)*(2.0*(double)nd/bb)+0.001; /* Bisection method */ b1=bb; b2=b1+0.5; bb=0.5*(b1+b2); f1=FSQR(nd,datat,b1,&a1,&a2); f2=FSQR(nd,datat,b2,&a1,&a2); ff=FSQR(nd,datat,bb,&a1,&a2); do{ if(f1*ff<0.0)b2=bb; if(ff*f2<0.0)b1=bb; if(ff==0.0)break; if(0.0