!**************************************************/ program f90_QQ !**************************************************/ implicit none integer,parameter::NDmax=1000 real(8)::data_org(1:NDmax) integer::i,nd,io,imethod real(8),allocatable::datax(:),datay(:) real(8)::alpha real(8)::p,yy real(8)::rr real(8)::a_gum,c_gum real(8)::k_gev,a_gev,c_gev real(8)::k_wgo,a_wgo,c_wgo real(8)::k_wls,a_wls,c_wls real(8)::k_wml,a_wml,c_wml real(8)::a_sqr,b_sqr real(8)::a_lp3,b_lp3,c_lp3 real(8)::a_lnq,m_lnq,s_lnq real(8)::a_lnm,m_lnm,s_lnm real(8)::a_lnt,m_lnt,s_lnt real(8)::a_exp,c_exp real(8)::k_gpd,a_gpd,c_gpd character(len=50)::fnameR,fnameW,fnameT character(len=100)::dat character(len=50)::dummy !Reading input file and output file from command line call getarg(1,dummy) !Method of analysis call getarg(2,fnameR) !Input data file call getarg(3,fnameW) !Output data file read(dummy,*) imethod !convert character 'dummy' to integer 'imethod' ! imethod ! 1 Gumbel Gumbel distribution ! 2 GEV Generalized Extreme Value distribution ! 3 Weibull (Goda) Weibull distribution (L-moments by GODA) ! 4 Weibull (LSM) Weibull distribution (Least Square Method) ! 5 Weibull (MLM) Weibull distribution (Maximum Likelihood Method) ! 6 SQRT-ET SQRT exponential-type distribution of maximum ! 7 LP3 Log Pearson type III distribution ! 8 LN3 (Iwai) Logarithmic Normal distribution with 3 variables (quantile) ! 9 LN3 (Moment) Logarithmic Normal distribution with 3 variables (moment) ! 10 LN3 (Trial) Logarithmic Normal distribution with 3 variables (trial) ! 11 Exponential Exponential distribution ! 12 GPD Generalized Pareto distribution open(11,file=fnameR,status='old') read(11,'()') do i=1,NDmax read(11,*,iostat=io) data_org(i) if(io<0)exit end do close(11) nd=i-1 allocate(datax(1:nd),datay(1:nd)) do i=1,nd datax(i)=data_org(i) end do !========================*/ ! Sorting in small order */ !========================*/ call SSORT(nd,datax) !------------------------------------------*/ ! Non-exceeding probability */ ! Plotting and positioned formula */ ! Weibull : alpha=0 (Mean Rank) */ ! (Median Rank : alpha=0.3 ) */ ! Cunnane : alpha=0.4 */ ! Hazen : alpha=0.5 (Symmetrical CDF) */ !------------------------------------------*/ alpha=0.4D0 do i=1,nd datay(i)=(dble(i)-alpha)/(dble(nd+1)-2.0D0*alpha) end do !=============================*/ ! Calculation of coefficients */ !=============================*/ select case(imethod) case(1) call GUM_COEF(nd,datax,a_gum,c_gum) case(2) call GEV_COEF(nd,datax,k_gev,a_gev,c_gev) case(3) call WGO_COEF(nd,datax,k_wgo,a_wgo,c_wgo) case(4) call WML_COEF(nd,datax,datay,k_wls,a_wls,c_wls,k_wml,a_wml,c_wml,0) case(5) call WML_COEF(nd,datax,datay,k_wls,a_wls,c_wls,k_wml,a_wml,c_wml,1) case(6) call SQR_COEF(nd,datax,a_sqr,b_sqr) case(7) call LP3_COEF(nd,datax,a_lp3,b_lp3,c_lp3) case(8) call LNQ_COEF(nd,datax,a_lnq,m_lnq,s_lnq) case(9) call LNM_COEF(nd,datax,a_lnm,m_lnm,s_lnm) case(10) call LNT_COEF(nd,datax,datay,a_lnt,m_lnt,s_lnt) case(11) call EXP_COEF(nd,datax,a_exp,c_exp) case(12) call GPD_COEF(nd,datax,k_gpd,a_gpd,c_gpd) end select !===============================*/ ! Calculation of quantile value */ !===============================*/ fnameT='_temp.txt' open(12,file=fnameT,status='replace') do i=1,nd p=datay(i) select case(imethod) case(1) yy=XP_GUM(p,a_gum,c_gum) case(2) yy=XP_GEV(p,k_gev,a_gev,c_gev) case(3) yy=XP_WEI(p,k_wgo,a_wgo,c_wgo) case(4) yy=XP_WEI(p,k_wls,a_wls,c_wls) case(5) yy=XP_WEI(p,k_wml,a_wml,c_wml) case(6) yy=XP_SQR(p,a_sqr,b_sqr,datax(nd)) case(7) if(b_lp3<1.0D4)then yy=XP_LP3(p,a_lp3,b_lp3,c_lp3) else yy=XP_LP3_SP(nd,datax,p) end if case(8) yy=XP_LN3(p,a_lnq,m_lnq,s_lnq) case(9) yy=XP_LN3(p,a_lnm,m_lnm,s_lnm) case(10) yy=XP_LN3(p,a_lnt,m_lnt,s_lnt) case(11) yy=XP_EXP(p,a_exp,c_exp) case(12) yy=XP_GPD(p,k_gpd,a_gpd,c_gpd) end select write(12,'(f10.4,2(",",f10.2))') p,datax(i),yy end do close(12) !============================*/ ! Calculation of correlation */ !============================*/ open(11,file=fnameT,status='old') do i=1,nd read(11,*) p,datax(i),datay(i) end do close(11) rr=COC(nd,datax,datay) open(12,file=fnameW,status='replace') write(12,'(a)') 'Input file : '//trim(adjustl(fnameR)) write(12,'("nd=,",i6)') nd select case(imethod) case(1) write(12,'("GUM,(*_a_b)_r=",4(",",f10.4))'),0.0D0,a_gum,c_gum,rr case(2) write(12,'("GEV,(k_a_b)_r=",4(",",f10.4))'),k_gev,a_gev,c_gev,rr case(3) write(12,'("WGO,(k_a_c)_r=",4(",",f10.4))'),k_wgo,a_wgo,c_wgo,rr case(4) write(12,'("WLS,(k_a_c)_r=",4(",",f10.4))'),k_wls,a_wls,c_wls,rr case(5) write(12,'("WML,(k_a_c)_r=",4(",",f10.4))'),k_wml,a_wml,c_wml,rr case(6) write(12,'("SQR,(a_b_*)_r=",4(",",f10.4))'),a_sqr,b_sqr,0.0D0,rr case(7) write(12,'("LP3,(a_b_c)_r=",4(",",f10.4))'),a_lp3,b_lp3,c_lp3,rr case(8) write(12,'("LNQ,(a_m_s)_r=",4(",",f10.4))'),a_lnq,m_lnq,s_lnq,rr case(9) write(12,'("LNM,(a_m_s)_r=",4(",",f10.4))'),a_lnm,m_lnm,s_lnm,rr case(10) write(12,'("LNT,(a_m_s)_r=",4(",",f10.4))'),a_lnt,m_lnt,s_lnt,rr case(11) write(12,'("EXP,(*_a_c)_r=",4(",",f10.4))'),0.0D0,a_exp,c_exp,rr case(12) write(12,'("GPD,(k_a_c)_r=",4(",",f10.4))'),k_gpd,a_gpd,c_gpd,rr end select write(12,'(a)') 'Prob.,Obs,Calc' open(11,file=fnameT,status='old') do i=1,nd read(11,'(a)') dat write(12,'(a)') trim(dat) end do close(11) close(12) stop contains !---------------------------------------------------------------------------*/ subroutine SSORT(nd,datat) integer,intent(in)::nd real(8),intent(inout)::datat(:) integer::i,kh,kv real(8)::temp kv=1 do kv=3*kv+1 if(ndtemp) datat(kh)=datat(kh-kv) kh=kh-kv if(kh0 */ bb=0.0D0 do i=1,nd bb=bb+sqrt(datat(i)) end do bb=(2.0D0*dble(nd)/bb)*(2.0D0*dble(nd)/bb)+0.001D0 ! Bisection method */ b1=bb b2=b1+0.5D0 bb=0.5D0*(b1+b2) f1=FSQR(nd,datat,b1,a1,a2) f2=FSQR(nd,datat,b2,a1,a2) ff=FSQR(nd,datat,bb,a1,a2) do while(0.001