/***************************************************/ /* gccBTS.c */ /***************************************************/ #include #include #include #include #include #define NDmax 1000 #define NED 10000 #define NYR 14 int COMP_IS(const void *a,const void *b); int COMP_DS(const void *a,const void *b); void IRND(int nd,int idata[NDmax]); void main_part(int nmethod,char fnameR[50],char fnameW[50],char fnameH[50]); 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 fnameH[50]; /*Output file name for histogram*/ int nmethod; nmethod=atoi(argv[1]); strcpy(fnameR,argv[2]); strcpy(fnameW,argv[3]); strcpy(fnameH,argv[4]); main_part(nmethod,fnameR,fnameW,fnameH); return 0; } /*---------------------------------------------------------------------------*/ void main_part(int nmethod,char fnameR[50],char fnameW[50],char fnameH[50]) { int i,j,iii,jjj,nd,kl,ku; int idata[NDmax+1]; double datax[NDmax+1],datay[NDmax+1],edata[NED+1]; double p,yy,eave; 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; int nnn=NYR; double Ty[]={0,2,5,10,20,30,50,100,200,300,500,1000,2000,3000,5000}; double res_org[NYR+1],wk[NYR+1]; char dat[500]=""; char sv[50]=""; char fnameT[]="_temp.csv"; FILE *fin,*fout,*fhis; srand((unsigned int)time(NULL)); for(i=0;i<=NDmax;i++){datax[i]=0.0;datay[i]=0.0;idata[i]=0;} for(i=0;i<=NED;i++){edata[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; for(i=0;i<=nd;i++){idata[i]=i;} /*========================*/ /* Sorting in small order */ /*========================*/ datax[0]=-99.9; qsort(datax,nd+1,sizeof(datax[0]),COMP_DS); /*========================*/ /* Calc. of Org.data */ /*========================*/ switch(nmethod){ case 1:GUM_COEF(nd,datax,&a_gum,&c_gum); break; case 2:GEV_COEF(nd,datax,&k_gev,&a_gev,&c_gev); break; case 3:SQR_COEF(nd,datax,&a_sqr,&b_sqr); break; case 4:LN3_COEF(nd,datax,&a_ln3,&my_ln3,&sy_ln3);break; case 5:LP3_COEF(nd,datax,&a_lp3,&b_lp3,&c_lp3); break; } for(iii=1;iii<=nnn;iii++){ p=1.0-1.0/Ty[iii]; switch(nmethod){ case 1:yy=XP_GUM(p,a_gum,c_gum); break; case 2:yy=XP_GEV(p,k_gev,a_gev,c_gev); break; case 3:yy=XP_SQR(p,a_sqr,b_sqr,datax[nd]);break; case 4:yy=XP_LN3(p,a_ln3,my_ln3,sy_ln3); break; case 5: if(b_lp3<1e4){ yy=XP_LP3(p,a_lp3,b_lp3,c_lp3); }else{ yy=XP_LP3_SP(nd,datax,p); } break; } res_org[iii]=yy; } /*========================*/ /* Calc. of BTS */ /*========================*/ fout=fopen(fnameT,"w"); for(i=1;i<=NED;i++){ IRND(nd,idata); for(j=1;j<=nd;j++){datay[j]=datax[idata[j]];} switch(nmethod){ case 1:GUM_COEF(nd,datay,&a_gum,&c_gum); break; case 2:GEV_COEF(nd,datay,&k_gev,&a_gev,&c_gev); break; case 3:SQR_COEF(nd,datay,&a_sqr,&b_sqr); break; case 4:LN3_COEF(nd,datay,&a_ln3,&my_ln3,&sy_ln3); break; case 5:LP3_COEF(nd,datay,&a_lp3,&b_lp3,&c_lp3); break; } sprintf(sv,"%d",i);strcpy(dat,sv); for(iii=1;iii<=nnn;iii++){ p=1.0-1.0/Ty[iii]; switch(nmethod){ case 1:yy=XP_GUM(p,a_gum,c_gum); break; case 2:yy=XP_GEV(p,k_gev,a_gev,c_gev); break; case 3:yy=XP_SQR(p,a_sqr,b_sqr,datax[nd]); break; case 4:yy=XP_LN3(p,a_ln3,my_ln3,sy_ln3); break; case 5: if(b_lp3<1e4){ yy=XP_LP3(p,a_lp3,b_lp3,c_lp3); }else{ yy=XP_LP3_SP(nd,datay,p); } break; } sprintf(sv,"%.3f",yy);strcat(dat,",");strcat(dat,sv); } strcat(dat,"\n");fputs(dat,fout); } fclose(fout); fout=fopen(fnameW,"w"); switch(nmethod){ case 1:fprintf(fout,"Gumbel\n");break; case 2:fprintf(fout,"GEV\n");break; case 3:fprintf(fout,"SQRT-ET\n");break; case 4:fprintf(fout,"LN3\n");break; case 5:fprintf(fout,"LP3\n");break; } fprintf(fout,"year,prob,org,bts,lcl,ucl\n"); for(iii=1;iii<=nnn;iii++){ edata[0]=-99.9; fin=fopen(fnameT,"r"); for(i=1;i<=NED;i++){ fgets(dat,sizeof dat,fin); yy=atof(strtok(dat,",")); for(jjj=1;jjj<=nnn;jjj++){ wk[jjj]=atof(strtok(NULL,",")); } edata[i]=wk[iii]; } fclose(fin); qsort(edata,NED+1,sizeof(edata[0]),COMP_DS); eave=0.0; for(i=1;i<=NED;i++){eave=eave+edata[i];} eave=eave/(double)NED; kl=(int)(0.025*(double)NED); ku=NED-kl; printf("%4.0f %7.5f %4.1f %4.1f %4.1f %4.1f\n",Ty[iii],p,res_org[iii],eave,edata[kl],edata[ku]); fprintf(fout,"%.0f,%.5f,%.3f,%.3f,%.3f,%.3f\n",Ty[iii],p,res_org[iii],eave,edata[kl],edata[ku]); /*========================*/ /* Output for histogram */ /*========================*/ if(iii==nnn){ fhis=fopen(fnameH,"w"); switch(nmethod){ case 1:fprintf(fhis,"Gumbel 5000year bootstrap\n");break; case 2:fprintf(fhis,"GEV 5000year bootstrap\n");break; case 3:fprintf(fhis,"SQRT-ET 5000year bootstrap\n");break; case 4:fprintf(fhis,"LN3 5000year bootstrap\n");break; case 5:fprintf(fhis,"LP3 5000year bootstrap\n");break; } for(i=1;i<=NED;i++){fprintf(fhis,"%g\n",edata[i]);} fclose(fhis); } } fclose(fout); } /*---------------------------------------------------------------------------*/ int COMP_IS(const void *a,const void *b) { /*小さい順*/ return *(int*)a-*(int*)b; } /*---------------------------------------------------------------------------*/ int COMP_DS(const void *a,const void *b) { /*比較関数は戻り値が整数型なので*/ /*整数値を返すようにする*/ /*小さい順*/ if(*(double*)a> *(double*)b)return 1; if(*(double*)a==*(double*)b)return 0; if(*(double*)a< *(double*)b)return -1; } /*---------------------------------------------------------------------------*/ void IRND(int nd,int idata[NDmax]) { int i; double r,a,b; idata[0]=0; a=1.0; b=(double)nd; for(i=1;i<=nd;i++){ r=a+(b-a)*(double)rand()/(double)RAND_MAX; idata[i]=(int)(r+0.5); } qsort(idata,nd+1,sizeof(idata[0]),COMP_IS); } /*---------------------------------------------------------------------------*/ 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