

    Use NetCDF
    Use neural

    type(network) :: Net

    Real, parameter    :: Miss=-99.0
    Integer, Parameter :: Yr1=1983, Yr2=2020
    Integer, Parameter :: Nmodel=2, Nmon=12, Nreg=7, Nlead=6, Dr_Lev=3, Nlen=3, Nidx=2
    Integer, Parameter :: Ncase=3            !  "mod","cli","ann","mlr"
    Character (Len=10) :: Model_nm(Nmodel)=(/"RegCM","clWRF"/)
    Character (Len=10) :: IDXname (Nidx)  =(/"spei", "spi"/)
    Integer, Parameter :: Len_SPI (Nlen)  =(/1,3,6/)
    !Character (Len=3), Parameter :: Cases(Ncase)=(/"mod","cli","ann","mlr"/)
    Character (Len=3), Parameter :: Cases(Ncase)=(/"cli","ann","mlr"/)
    !Character (Len=3), Parameter :: Cases(Ncase)=(/"ann","mlr"/)
    !-----------------------------------------------------------------------------
    Real, Allocatable :: Regs(:,:), Lon(:), Lat(:), xlon(:), xlat(:)
    Real, Allocatable :: SPEI_M1 (:,:,:,:,:,:)                    ! Nlon,Nlat,Nlead,Ntime,Ncase,Nmodel) - Mem 1 only
    Real, Allocatable :: SPEI_Ann(:,:,:,:)                        ! Nlon,Nlat,Nlead,Ntime
    Real, Allocatable :: SPEI_Hai(:,:,:,:)                        ! Nlon,Nlat,Nlead,Ntime
    Real, Allocatable :: SPEI_obs(:,:,:)                          ! Nlon,Nlat,Ntime
    Real, Allocatable :: Ymax(:,:,:), Ymin(:,:,:)                 ! Nlon,Nlat,Nlead
    Real, Allocatable :: Yest(:,:)                                ! Ntime,Myvar
    Integer :: Nlon, Nlat, Ntime, Nt
    !-----------------------------------------------------------------------------
    Real, Allocatable, Dimension (:,:,:) :: Cor_a,Cor_h,PC_a,PC_h,POD_a,POD_h,SR_a,SR_h,POFD_a,POFD_h,FAR_a,FAR_h
    Real, Allocatable, Dimension (:,:,:) :: Prb_a, Prb_h 
    Real, Allocatable, Dimension (:,:,:) :: RMSE_a, RMSE_h
    !-----------------------------------------------------------------------------
    Integer :: ireg, ilead
    Integer :: Nlayer                             ! Num of layers including Input, output and hidden laysers
    Integer :: Nepoch                             ! Num of epochs
    double precision :: learn_rate ! Learning_Rate
    Integer, Allocatable :: Layer_size(:)                      ! (Nlayer)

    double precision, Allocatable :: tmp(:)
    Real :: a,b,c,d, Thres_obs, Thres_fcs
    Real :: PC0,POD0,FAR0,POFD0, FBI0

    Integer :: ilr, inode, itest, Ntest
    !-----------------------------------------------------------------------------
    ! Ann_hai:
    Integer :: Nsample, Nepoc
    Real,allocatable, Dimension(:,:) :: Inputs, Outputs, Inputs_X, Outputs_Y, Yhq
    Real,allocatable, Dimension(:)   :: min_in, max_in, min_out, max_out
    Real                             :: mean_error, mean_error_check
    integer                          :: Nin, Nhidden, Nout, iin, ihid, iout
    Real,allocatable, Dimension(:,:) :: weight_ih, weight_ho, moment_ih, moment_ho
    Real,allocatable, Dimension(:)   :: fin, fhid, fout, ftarget, delta_o, delta_h
    Real                             :: learning_rate, momentum, error, mintmp
    logical                          :: debug,training_mode

    !-----------------------------------------------------------------------------
    Character (Len=255) :: Dir_ANN_Save, save_file, Inp_Dir, Out_Dir, Mask_File, Fname, Str
    Character (Len=2)   :: Char2
    Integer :: latj(2*Nreg)=(/58,55,56,57,51,52,41,46,17,30,19,24,11, 9/)
    Integer :: loni(2*Nreg)=(/ 8, 9,22,18,21,19,20,16,31,30,28,28,21,18/)
    Integer :: Ny0, Ny1, Ny2, Ntime1, Ntime2
    Real    :: Mean_Cor1, Mean_ss11,Mean_ss12,Mean_ss13
    Real    :: Mean_Cor2, Mean_ss21,Mean_ss22,Mean_ss23

    Namelist /ann_info/   Nlayer,learn_rate,Nepoch
    Namelist /layer_info/ Layer_size
    Namelist /ann_hai/    Nhidden,learning_rate,momentum,training_mode,Nepoc,debug
    Namelist /dr_info/    Thres_obs, Thres_fcs

    !-----------------------------------------------------------------------------
    Inp_Dir      = "/home/tanpv/Data/562_VNU/0.25_VN/Dr_IDXs_Ope/" 
    Mask_File    = "/home/tanpv/Data/AWC/Mask_VN_0.25_Corrected.nc"
    Out_Dir      = "/home/tanpv/Progs/562_VNU/2024/Ann_New/Dr_Ann_Out/"
    Dir_ANN_Save = "/home/tanpv/Progs/562_VNU/2024/Ann_New/ANN_Save_test_para/"
    Ntime  = (Yr2-Yr1+1)*Nmon
    ! Chia thanh 2 tap: Training va testing
    Ny1    = (Yr2-Yr1+1)/4*3; Ny2 = (Yr2-Yr1+1) - Ny1    ! Training: 75%
    Ntime1 = Ny1*Nmon; Ntime2 = Ny2*Nmon                 ! Tesing:   25%
    !-----------------------------------------------------------------------------
    Open (1, file="Namelist_Ann_Dr_find_para.txt",Status="old")
    Read (1, ann_info)
    Allocate (Layer_size(Nlayer))
    Read (1, layer_info)
    Read (1, ann_hai)
    Read (1, dr_info)
    Close (1)
    Mxvar=Nmodel*Ncase; Myvar=1
    !-----------------------------------------------------------------------------
    Call rd_ncdf_2d (Mask_File,Lon,Lat,Nlon,Nlat,Regs,"reg")
    Allocate (Ymax(Nlon,Nlat,Nlead), Ymin(Nlon,Nlat,Nlead))
    !-----------------------------------------------------------------------------
    !Threshold = -1.0         ! Drought level
    write(Str,"(I2.2)") Layer_size(1)
    Do i=2,Nlayer
       write(Char2,"(I2.2)") Layer_size(i)
       Str=trim(Str)//"_"//trim(Char2)
    Enddo
    write (Fname,"(A,I2.2,A)") "check_para_train",Nlayer,"_"//trim(Str)//".txt"
    Open(3,file=Fname,status="Unknown")
    write (Fname,"(A,I2.2,A)") "check_para_test",Nlayer,"_"//trim(Str)//".txt"
    Open(4,file=Fname,status="Unknown")
    write (Fname,"(A,I2.2,A)") "check_para_all_",Nlayer,"_"//trim(Str)//".txt"
    Open(9,file=Fname,status="Unknown")

    write (3,"(A,20I5)") "Nlayer,Layer_size: ",Nlayer,(Layer_size(i),i=1,Nlayer)
    write (4,"(A,20I5)") "Nlayer,Layer_size: ",Nlayer,(Layer_size(i),i=1,Nlayer)
    write (9,"(A,20I5)") "Nlayer,Layer_size: ",Nlayer,(Layer_size(i),i=1,Nlayer)
    Do idx=1,Nidx            ! "spi", "spei"
       Do ilen=Nlen,Nlen        ! 1, 3, 6
          Call Reinit
          Call Read_all_Dr_IDXs (trim(IDXname(idx)),ilen)
          Do ilead=1,Nlead
             !Do ilon=1,Nlon
             !   Do ilat=1,Nlat
             !      if (Regs(ilon,ilat)>0) then
             Mean_Cor1=0; Mean_ss11=0; Mean_ss12=0; Mean_ss13=0;   ! Mean over training dataset
             Mean_Cor2=0; Mean_ss21=0; Mean_ss22=0; Mean_ss23=0;   ! Mean over testing dataset

             Do ireg=1,Nreg*2                      ! Number of gridpoints used to test
                ilon=loni(ireg); ilat=latj(ireg)   ! test for point by point
                      Call Calc_ANN_New         (Dir_ANN_Save,idx,ilen,ilead,ilon,ilat)   ! Training
                      Call Calc_ANN_New_testing (Dir_ANN_Save,idx,ilen,ilead,ilon,ilat)   ! Testing
             !      endif
             !   Enddo
             Enddo
             Mean_Cor1=Mean_Cor1/(Nreg*2); Mean_ss11=Mean_ss11/(Nreg*2); Mean_ss12=Mean_ss12/(Nreg*2); Mean_ss13=Mean_ss13/(Nreg*2);
             Mean_Cor2=Mean_Cor2/(Nreg*2); Mean_ss21=Mean_ss21/(Nreg*2); Mean_ss22=Mean_ss22/(Nreg*2); Mean_ss23=Mean_ss23/(Nreg*2);
             print"(A,20F8.3)","Train: Cor,ME,MAE,RMSE=",Mean_Cor1,Mean_ss11,Mean_ss12,Mean_ss13
             print"(A,20F8.3)","Test : Cor,ME,MAE,RMSE=",Mean_Cor2,Mean_ss21,Mean_ss22,Mean_ss23
             write (9,"(A,20F8.3)") "Train: Cor,ME,MAE,RMSE=",Mean_Cor1,Mean_ss11,Mean_ss12,Mean_ss13
             write (9,"(A,20F8.3)") "Test : Cor,ME,MAE,RMSE=",Mean_Cor2,Mean_ss21,Mean_ss22,Mean_ss23
          Enddo
          !Call Write_Dr_IDX_and_Veri (trim(IDXname(idx)),ilen)
       Enddo
    Enddo
   !-----------------------------------------------------------------------------
   CONTAINS
   !-----------------------------------------------------------------------------
   Subroutine Reinit
      if (Allocated (SPEI_Ann)) Deallocate (SPEI_Ann)                        ! Nlon,Nlat,Nlead,Ntime
      if (Allocated (SPEI_Hai)) Deallocate (SPEI_Hai)                        ! Nlon,Nlat,Nlead,Ntime
      Allocate (SPEI_Ann(Nlon,Nlat,Nlead,Ntime)); SPEI_Ann=Miss
      Allocate (SPEI_Hai(Nlon,Nlat,Nlead,Ntime)); SPEI_Hai=Miss

      if (Allocated (Cor_a)) Deallocate (Cor_a) 
      if (Allocated (Cor_h)) Deallocate (Cor_h)
      if (Allocated (Prb_a)) Deallocate (Prb_a)
      if (Allocated (Prb_h)) Deallocate (Prb_h)
      if (Allocated (PC_a))  Deallocate (PC_a)
      if (Allocated (PC_h))  Deallocate (PC_h)
      if (Allocated (POD_a)) Deallocate (POD_a)
      if (Allocated (POD_h)) Deallocate (POD_h)
      if (Allocated (SR_a))  Deallocate (SR_a)
      if (Allocated (SR_h))  Deallocate (SR_h)
      if (Allocated (POFD_a)) Deallocate (POFD_a)
      if (Allocated (POFD_h)) Deallocate (POFD_h)
      if (Allocated (FAR_a)) Deallocate (FAR_a)
      if (Allocated (FAR_h)) Deallocate (FAR_h)
      Allocate (Cor_a (Nlon,Nlat,Nlead))
      Allocate (Cor_h (Nlon,Nlat,Nlead))
      Allocate (Prb_a (Nlon,Nlat,Nlead))
      Allocate (Prb_h (Nlon,Nlat,Nlead))
      Allocate (PC_a  (Nlon,Nlat,Nlead))
      Allocate (PC_h  (Nlon,Nlat,Nlead))
      Allocate (POD_a (Nlon,Nlat,Nlead))
      Allocate (POD_h (Nlon,Nlat,Nlead))
      Allocate (SR_a  (Nlon,Nlat,Nlead))
      Allocate (SR_h  (Nlon,Nlat,Nlead))
      Allocate (POFD_a(Nlon,Nlat,Nlead))
      Allocate (POFD_h(Nlon,Nlat,Nlead))
      Allocate (FAR_a (Nlon,Nlat,Nlead))
      Allocate (FAR_h (Nlon,Nlat,Nlead))
      Cor_a=Miss; Cor_h=Miss; PC_a=Miss; PC_h=Miss; POD_a=Miss; POD_h=Miss; 
      SR_a=Miss; SR_h=Miss; POFD_a=Miss; POFD_h=Miss; FAR_a=Miss; FAR_h=Miss; 
      Prb_a=Miss;Prb_h=Miss

      if (Allocated (RMSE_a)) Deallocate (RMSE_a)  
      if (Allocated (RMSE_h)) Deallocate (RMSE_h)
      Allocate (RMSE_a (Nlon,Nlat,Nlead))
      Allocate (RMSE_h (Nlon,Nlat,Nlead))
      RMSE_a=Miss; RMSE_h=Miss
   End Subroutine Reinit
   !--------------------------------------------------------------------------------
   Subroutine Calc_ANN_New (Dir_ANN_Save,idx,ilen,ilead,ilon,ilat)
      Character (Len=*)   :: Dir_ANN_Save
      Character (Len=255) :: save_file
      Integer :: idx,ilen,ilead,ilon,ilat,ispl, i,j,k,icount
      Real             :: XX(Ntime1,Mxvar),YY(Ntime1),xtmp(Mxvar), ytmp
      Double precision :: x1d (Mxvar), y1d (Myvar)
      Logical :: OK
      Integer, Allocatable :: Check(:)
      Real :: Cor, Prob, ss1,ss2,ss3

      if (Allocated (Check)) Deallocate (Check)
      Allocate (Check(Ntime1))
      Do i=1,Ntime1
         YY(i)=SPEI_obs(ilon,ilat,i)
         j=0
         Do imod=1,Nmodel
            Do icas=1,Ncase
               j=j+1; XX(i,j)=SPEI_M1(ilon,ilat,ilead,i,icas,imod)
            Enddo
         Enddo
      Enddo
      !
      icount=0; Check(:)=0
      Do i=1,Ntime1
         ytmp=YY(i); xtmp(1:Mxvar)=XX(i,1:Mxvar)
         OK=Valid_Ar1(xtmp,Mxvar,Miss).AND.(ytmp/=Miss)
         if (OK) then
            icount=icount+1; Check(i)=1
         endif
      Enddo
      Nspl = icount
      if (Allocated (Out_Y)) Deallocate (Out_Y)
      if (Allocated (Inp_X)) Deallocate (Inp_X)
      Allocate (Inp_X(Nspl,Mxvar),Out_Y(Nspl,Myvar))
      ! To be used by subroutine neural_train_network_file_TP 
      ispl=0
      Do i=1,Ntime1
         if (Check(i)==1) then
            ispl=ispl+1
            Out_Y(ispl,1)       = YY(i)         !SPEI_obs(ilon,ilat,i)
            Inp_X(ispl,1:Mxvar) = XX(i,1:Mxvar)
         endif
      Enddo
      !--------------------------------------------------------
      ! Normalize: (for subroutine neural_train_network_file_TP)
      Ymax(ilon,ilat,ilead) = Maxval(Out_Y(1:Nspl,1))
      Ymin(ilon,ilat,ilead) = Minval(Out_Y(1:Nspl,1))
      Do i=1,Nspl
         Out_Y(i,1) = (Out_Y(i,1)-Ymin(ilon,ilat,ilead))/(Ymax(ilon,ilat,ilead)-Ymin(ilon,ilat,ilead))
      Enddo
      !--------------------------------------------------------
      Layer_size(1) = Mxvar; Layer_size(Nlayer) = Myvar   ! Update Num of nodes for input (X) and output (Y) layers
      call neural_init_network(Net, Layer_size)
      call neural_train_network_file_TP(Net, Nepoch, learn_rate)
      write (save_file,"(4(A,I2.2),A)") trim(Dir_ANN_Save)//"Sav_"//trim(IDXname(idx))//"_",ilen,"_lon_",ilon,"_lat_",ilat,"_lead_",ilead,".txt"
      call neural_save_network(Net,save_file)
      if (Allocated (Yest)) Deallocate (Yest)
      Allocate (Yest(Ntime1,Myvar)); Yest = Miss
      ispl=0
      Do i=1,Ntime1
         if (Check(i)==1) then
            ispl=ispl+1
            x1d(1:Mxvar) = Inp_X(ispl,1:Mxvar)
            y1d(:)       = neural_use_network(Net,x1d)
            Do j=1,Myvar
               Yest(i,j) = y1d(j)*(Ymax(ilon,ilat,ilead)-Ymin(ilon,ilat,ilead)) + Ymin(ilon,ilat,ilead)
            Enddo
            !print"(A,6F8.4)","Yest,Y_inp: ",Yest(i,:), YY(i)
         endif
      Enddo
      SPEI_Ann(ilon,ilat,ilead,1:Ntime1)=Yest(1:Ntime,1)

      !print*,Layer_size
      Call Correlation(Yest(:,1),YY(:),Ntime1,Cor,prob,Miss)
      ss1=ME   (Yest(:,1),YY(:),Ntime1,Miss)
      ss2=MAE  (Yest(:,1),YY(:),Ntime1,Miss)
      ss3=RMSE (Yest(:,1),YY(:),Ntime1,Miss)
      ! Sum up:
      Mean_Cor1=Mean_Cor1+Cor; Mean_ss11=Mean_ss11+ss1; Mean_ss12=Mean_ss12+ss2; Mean_ss13=Mean_ss13+ss3;
      print*,"------------------------------------------------------------------------------"
      print*,"Training..."
      print"(10F8.3)",Mean_Cor1,Cor,ss1,ss2,ss3
      write (3,"(A,4I3,A,4F8.3)") trim(IDXname(idx))//": ",ilen,ilead,ilon,ilat," Cor,RMSE: ",Cor,ss1,ss2,ss3
   End Subroutine Calc_ANN_New
   !------------------------------------------------------------------------------
   Subroutine Calc_ANN_New_testing (Dir_ANN_Save,idx,ilen,ilead,ilon,ilat)
      Character (Len=*)   :: Dir_ANN_Save
      Character (Len=255) :: save_file
      Integer :: idx,ilen,ilead,ilon,ilat,ispl, i,j,k,icount
      Real             :: XX(Ntime2,Mxvar),YY(Ntime2),xtmp(Mxvar), ytmp
      Double precision :: x1d (Mxvar), y1d (Myvar)
      Logical :: OK
      Integer, Allocatable :: Check(:)
      Real :: Cor, Prob, ss1,ss2,ss3

      if (Allocated (Check)) Deallocate (Check)
      Allocate (Check(Ntime2))
      Do i=1,Ntime2
         YY(i)=SPEI_obs(ilon,ilat,Ntime1+i)   ! For verification
         j=0
         Do imod=1,Nmodel
            Do icas=1,Ncase
               j=j+1; XX(i,j)=SPEI_M1(ilon,ilat,ilead,Ntime1+i,icas,imod)
            Enddo
         Enddo
      Enddo
      !
      icount=0; Check(:)=0
      Do i=1,Ntime2
         ! ytmp=YY(i); 
         xtmp(1:Mxvar)=XX(i,1:Mxvar)
         OK=Valid_Ar1(xtmp,Mxvar,Miss)  ! .AND.(ytmp/=Miss)
         if (OK) then
            icount=icount+1; Check(i)=1
         endif
      Enddo
      Nspl = icount
      !if (Allocated (Out_Y)) Deallocate (Out_Y)
      if (Allocated (Inp_X)) Deallocate (Inp_X)
      Allocate (Inp_X(Nspl,Mxvar)) !,Out_Y(Nspl,Myvar))
      ! To be used by subroutine neural_train_network_file_TP
      ispl=0
      Do i=1,Ntime2
         if (Check(i)==1) then
            ispl=ispl+1
            ! Out_Y(ispl,1)       = YY(i)         !SPEI_obs(ilon,ilat,i)
            Inp_X(ispl,1:Mxvar) = XX(i,1:Mxvar)
         endif
      Enddo
      !--------------------------------------------------------
      Layer_size(1) = Mxvar; Layer_size(Nlayer) = Myvar   ! Update Num of nodes for input (X) and output (Y) layers
      call neural_init_network(Net, Layer_size)

      !call neural_train_network_file_TP(Net, Nepoch, learn_rate)

      write (save_file,"(4(A,I2.2),A)") trim(Dir_ANN_Save)//"Sav_"//trim(IDXname(idx))//"_",ilen,"_lon_",ilon,"_lat_",ilat,"_lead_",ilead,".txt"
      !call neural_save_network(Net,save_file)
      Call neural_load_network(Net,save_file)
      if (Allocated (Yest)) Deallocate (Yest)
      Allocate (Yest(Ntime2,Myvar)); Yest = Miss
      ispl=0
      Do i=1,Ntime2
         if (Check(i)==1) then
            ispl=ispl+1
            x1d(1:Mxvar) = Inp_X(ispl,1:Mxvar)
            y1d(:)       = neural_use_network(Net,x1d)
            Do j=1,Myvar
               Yest(i,j) = y1d(j)*(Ymax(ilon,ilat,ilead)-Ymin(ilon,ilat,ilead)) + Ymin(ilon,ilat,ilead)
            Enddo
            !print"(A,6F8.4)","Yest,Y_inp: ",Yest(i,:), YY(i)
         endif
      Enddo
      SPEI_Ann(ilon,ilat,ilead,Ntime1+1:Ntime)=Yest(1:Ntime2,1)
      Call Correlation(Yest(:,1),YY(:),Ntime2,Cor,prob,Miss)
      print*,"Testing..."
      ss1=ME   (Yest(:,1),YY(:),Ntime2,Miss)
      ss2=MAE  (Yest(:,1),YY(:),Ntime2,Miss)
      ss3=RMSE (Yest(:,1),YY(:),Ntime2,Miss)
      Mean_Cor2=Mean_Cor2+Cor; Mean_ss21=Mean_ss21+ss1; Mean_ss22=Mean_ss22+ss2; Mean_ss23=Mean_ss23+ss3;
      print"(10F8.3)",Cor,ss1,ss2,ss3
      write (4,"(A,4I3,A,4F8.3)") trim(IDXname(idx))//": ",ilen,ilead,ilon,ilat," Cor,RMSE: ",Cor,ss1,ss2,ss3
   End Subroutine Calc_ANN_New_testing
   !------------------------------------------------------------------------------
   Subroutine Read_all_Dr_IDXs (IDX_nm,ilen)
     Character (Len=*)  :: IDX_nm
     Character (Len=20) :: Var_nm
     Integer :: it,i,ilen,ilon,ilat,ilead,Nlo,Nla,Nme,Nt,Nt1,Nt2,icas, it1, it2, icpr, ict, icpet
     Real, Allocatable :: X4d(:,:,:,:),X3d(:,:,:),xlon(:),xlat(:),xlead(:),xtime(:)

     if (Allocated (SPEI_M1)) Deallocate (SPEI_M1)
     Allocate (SPEI_M1(Nlon,Nlat,Nlead,Ntime,Ncase,Nmodel))
     write (Fname,"(A,I2.2,A)") trim(Inp_Dir)//"Dr_IDX_1983-2020_"//trim(IDX_nm)//"_",Len_SPI(ilen),".nc"
     
     Do imod=1,Nmodel
        Do icas=1,Ncase
           Var_nm=trim(Model_nm(imod))//"_"//trim(Cases(icas))
           Call rd_ncdf_4d (Fname,xlon,xlat,xlead,xtime,Nlo,Nla,Nle,Nt,X4d,trim(Var_nm))  ! X4d(lon,lat,lead,time)
           Do ilead=1,Nlead
              Do it=1,Ntime
                 SPEI_M1(:,:,ilead,it,icas,imod) = X4d(:,:,ilead,it)
              Enddo
           Enddo
           Deallocate (xlon,xlat,xlead,xtime,X4d)
        Enddo
     Enddo
     if (Allocated(SPEI_obs)) Deallocate (SPEI_obs)
     Allocate (SPEI_obs(Nlon,Nlat,Ntime))
     Call rd_ncdf_3d (Fname,xlon,xlat,xtime,Nlo,Nla,Nt,X3d,"obs")
     SPEI_obs(:,:,1:Ntime) = X3d(:,:,1:Ntime)
     Deallocate (xlon,xlat,xtime,X3d)
     Where (IsNaN(SPEI_M1)) SPEI_M1=Miss
     Where (IsNaN(SPEI_obs)) SPEI_obs=Miss
     Where (SPEI_M1>10.0) SPEI_M1=Miss
     Where (SPEI_obs>10.0) SPEI_obs=Miss
   End Subroutine Read_all_Dr_IDXs
   !------------------------------------------------------------------------------
   Subroutine Cate_Veri (O,F,N,Thre,PC0,POD0,SR0,FAR0,POFD0,FBI0)
     Integer :: N,i
     Real :: O(N),F(N),Thre,PC0,POD0,SR0,FAR0,POFD0,FBI0, a,b,c,d, Thre1

     Thre1 = Thres_fcs   ! F-Thres > O-Thres
     Where (O/=Miss.AND.O> Thre)   O=0
     Where (F/=Miss.AND.F> Thre1)  F=0
     Where (O/=Miss.AND.O<=Thre)   O=1
     Where (F/=Miss.AND.F<=Thre1)  F=1
     a=0; b=0; c=0; d=0
     Do i=1,N
        if (O(i)==1.AND.F(i)==1) a=a+1
        if (O(i)==1.AND.F(i)==0) c=c+1
        if (O(i)==0.AND.F(i)==1) b=b+1
        if (O(i)==0.AND.F(i)==0) d=d+1
     Enddo
print*,int(a),Int(b)
print*,int(c),Int(d)
     PC0  =PC  (a,b,c,d)
     POD0 =POD (a,b,c,d)
     SR0  =SR  (a,b,c,d)
     FAR0 =FAR (a,b,c,d)
     POFD0=POFD(a,b,c,d)
     FBI0 =FBI (a,b,c,d)
   End Subroutine Cate_Veri 
   !--------------------------------------------------------------------------------
   Subroutine Write_Dr_IDX_and_Veri (IDX_nm,ilen) 
      Character (Len=*) :: IDX_nm
      Character (Len=250) :: var_ln1, t_unit, var_ln, var_unit, lon_nm, lat_nm, z_nm, t_nm
      Real, Allocatable, Dimension (:) :: zlev, xtime
      Real, Allocatable :: X4d(:,:,:,:)
      INteger :: i, Nz

      Allocate (zlev(Nlead),xtime(Ntime))
      Do i=1,Nlead; zlev(i)=i; Enddo; Do i=1,Ntime; xtime(i)=i; Enddo
      t_unit="months since 1983-01-01 "; lon_nm="lon"; lat_nm="lat"; t_nm="time"; z_nm="lead"
      var_unit="-"

      write (Fname,"(A,I2.2,A)") trim(Out_Dir)//"Dr_Ann_1983_2020_"//trim(IDX_nm)//"_",Len_SPI(ilen),".nc"
      var_ln="Drought index based on New ANN of Cli, ANN and MLR"
      Call wr_ncdf_4d (Fname,Lon,Lat,zlev,xtime,Nlon,Nlat,Nlead,Ntime,SPEI_Ann,"ann_new", &
                         t_unit, var_ln,var_unit, lon_nm, lat_nm, z_nm, t_nm, Miss)
      var_ln="Drought index based on Hai_ANN of Cli, ANN and MLR"
      Call wr_ncdf_4d_apd (Fname,SPEI_Hai,"ann_hai", Nlon,Nlat,Nlead,Ntime, &
                                var_ln,var_unit, lon_nm, lat_nm, z_nm, t_nm, Miss)
      var_ln="Obseved Drought index"
      Call wr_ncdf_3d_apd (Fname,SPEI_obs,"obs",Nlon,Nlat,Ntime, var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      !----------------------------------
      write (Fname,"(A,I2.2,A)") trim(Out_Dir)//"Veri_Dr_Ann_1983_2020_"//trim(IDX_nm)//"_",Len_SPI(ilen),".nc"
      t_nm="lead"
      var_ln="Correlation - Ann New "
      Call wr_ncdf_3d (Fname,Lon,Lat,zlev,Nlon,Nlat,Nlead,Cor_a,"cor_a",t_unit, var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="P-value of Correlation - Ann New "
      Call wr_ncdf_3d_apd (Fname,Prb_a,"pv_a",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="Correlation - Ann Hai "
      Call wr_ncdf_3d_apd (Fname,Cor_h,"cor_h",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="P-value of Correlation - Ann Hai "
      Call wr_ncdf_3d_apd (Fname,Prb_h,"pv_h",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)

      var_ln="PC - Ann New "
      Call wr_ncdf_3d_apd (Fname,PC_a,  "pc_a", Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="POD - Ann New "
      Call wr_ncdf_3d_apd (Fname,POD_a, "pod_a",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="SR (success ratio) - Ann New "
      Call wr_ncdf_3d_apd (Fname,SR_a,  "sr_a", Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="POFD - Ann New "
      Call wr_ncdf_3d_apd (Fname,POFD_a,"pof_a",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="FAR - Ann New "
      Call wr_ncdf_3d_apd (Fname,FAR_a, "far_a",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)

      var_ln="PC - Ann Hai "
      Call wr_ncdf_3d_apd (Fname,PC_h,  "pc_h", Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="POD - Ann Hai "
      Call wr_ncdf_3d_apd (Fname,POD_h, "pod_h",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="SR (success ratio) - Ann New "
      Call wr_ncdf_3d_apd (Fname,SR_h,  "sr_h", Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="POFD - Ann Hai "
      Call wr_ncdf_3d_apd (Fname,POFD_h,"pof_h",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      var_ln="FAR - Ann Hai "
      Call wr_ncdf_3d_apd (Fname,FAR_h, "far_h",Nlon,Nlat,Nlead,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)

   End Subroutine Write_Dr_IDX_and_Veri
   !------------------------------------------------------------------------------

   Include "/home/tanpv/Mylibs/sub_rd_ncdf_Tan.F90"
   Include "/home/tanpv/Mylibs/sub_wr_ncdf_Tan.F90"
   Include "/home/tanpv/Mylibs/Function_Valid_Ar1.f90"
   Include "/home/tanpv/Mylibs/Correlation.f90"
   Include "/home/tanpv/Mylibs/Sub_Verification.f90"
   Include "/home/tanpv/Mylibs/Sub_neural_2024.f90"
   !------------------------------------------------------------------------------
   End
   Include "/home/tanpv/Mylibs/Student_Prob.f90"
