  Program ClimIDX2NetCDF
  ! This program read all data of climate indices and write to netcdf file
  ! All files are kept their oringin format downloaded
  Use netcdf
  Implicit None
  Integer, Parameter :: Yr1=1850, Yr2=2020   ! Maximum timeseries
  !Integer, Parameter :: Yrs=1961, Yre=2017   ! Period to be stored
  Integer, Parameter :: Yrs=Yr1, Yre=Yr2   ! Period to be stored
  Integer, Parameter :: Nmon=12, Nidx=30
  !Character (Len=10), Parameter :: IDX_Name(Nidx)=(/"ONI",  "MEI","REQSOI","SOI","RINDO_SLPA","Nino3.4","CPAC850","BEST", &
  !                                                  "WPC850","PDO","PNA",  "DMI","WHWP",       "TNI",   "WP",     "QBO"/)
  !Character (Len=10), Parameter :: VarName(Nidx)= (/"ONI",  "MEI","REQSOI","SOI","RINDO",   "Nino34","CPAC850",  "BEST", &
  !                                                  "WPC850","PDO","PNA", "DMI","WHWP",       "TNI",   "WP",     "QBO"/)
  !Character (Len=100), Parameter :: IDX_Full_Name(Nidx)=(/"Oceanic Nino Index", "Multivariate ENSO Index", "Equatorial SOI", &
  !                     "Southern Oscillation Index", "Equatorial SOI Indonesia SLP (Standardized Anomalies)", &
  !                     "East Central Tropical Pacific SST", "850 MB TRADE WIND INDEX (175W-140W, 5N-5S CENTRAL PACIFIC STANDARDIZED DATA", &
  !                     "Bivariate ENSO Timeseries", "850 MB TRADE WIND INDEX (135E-180W, 5N-5S) WEST PACIFIC ORIGINAL DATA", &
  !                     "Pacific Decadal Oscillation", "Pacific North American Index", "Dipole Mode Index", "Western Hemisphere warm pool", &
  !                     "Trans-Nino Index", "Western Pacific Index", "Quasi-Biennial Oscillation"/)

  Character (Len=15), Parameter :: IDX_Fname(Nidx)=(/"nina1.data", "nina3.data", "nina34.data", "nina4.data", "oni.data", "tni.data", "meiv2.data", &
          "pna.data", "censo.data","ammsst.data", "CAR_ersst.data", "NTA_ersst.data", "soi.data", "whwp.data", "amon.us.data", &
          "np.data", "tsa.data", "tna.data", "qbo.data", "wp.data", "ao.data", "nao.data", &  ! 1-22
          "reqsoi.for","repac_slpa.for", "rindo_slpa.for", & ! 23-25
          "zwnd200", "wpac850", "epac850", "cpac850","qbo.u50.index"/)  ! 26-30

  Character (Len=15), Parameter :: VarName(Nidx)= (/"nino12", "nino3", "nino34", "nino4", "oni", "tni", "mei", "pna", "censo",&
          "ammsst", "CAR_ersst", "NTA_ersst", "soi", "whwp", "amonus", "np", "tsa", "tna", "qbo30", "wp", "ao", "nao", &
          "reqsoi", "repac_slpa", "rindo_slpa", &
          "zwnd20", "wpac85", "epac85", "cpac85", "qbo50"/)

  Character (Len=255), Parameter :: IDX_Full_Name(Nidx)= & 
          (/"Extreme Eastern Tropical Pacific SST (0-10S, 90W-80W). https://psl.noaa.gov/data/correlation/nina1.data",&
            "Eastern Tropical Pacific SST (5N-5S,150W-90W). https://psl.noaa.gov/data/correlation/nina3.data", &
            "East Central Tropical Pacific SST (5N-5S)(170-120W). https://psl.noaa.gov/data/correlation/nina34.data", &
            "Central Tropical Pacific SST *(5N-5S) (160E-150W). https://psl.noaa.gov/data/correlation/nina4.data", &
            "Oceanic Niño Index. https://psl.noaa.gov/data/correlation/oni.data", &
            "Indices of El Niño evolution. https://psl.noaa.gov/data/correlation/tni.data", &
            "Multivariate ENSO Index. https://psl.noaa.gov/data/correlation/meiv2.data", &
            "Pacific North American Index. https://psl.noaa.gov/data/correlation/pna.data", &
            "Bivariate ENSO Timeseries. https://psl.noaa.gov/data/correlation/censo.data", &
            "Atlantic Meridional Mode (AMM) SST Index. https://psl.noaa.gov/data/timeseries/monthly/AMM/ammsst.data", &
            "Caribbean SST Index: SST anomalies averaged over the the Caribbean. https://psl.noaa.gov/data/correlation/CAR_ersst.data.", &
            "North Tropical Atlantic SST Index. https://psl.noaa.gov/data/correlation/NTA_ersst.data", &
            "Southern Oscillation Index. https://psl.noaa.gov/data/correlation/soi.data", &

            "Western Hemisphere warm pool. https://psl.noaa.gov/data/correlation/whwp.data", &
            "AMO (Atlantic Multidecadal Oscillation) Index. https://psl.noaa.gov/data/correlation/amon.us.data", &
            "North Pacific pattern is the area-weighted sea level pressure over the region 30N-65N, 160E-140W. https://psl.noaa.gov/data/correlation/np.data", &

            "Tropical Southern Atlantic Index. https://psl.noaa.gov/data/correlation/tsa.data", &
            "Tropical Northern Atlantic Index. https://psl.noaa.gov/data/correlation/tna.data", &

            "Quasi-Biennial Oscillation. https://psl.noaa.gov/data/correlation/qbo.data", &
            "Western Pacific Index. https://psl.noaa.gov/data/correlation/wp.data", &
            "The loading pattern of AO (AAO). https://psl.noaa.gov/data/correlation/ao.data", &
            "North Atlantic Oscillation. https://psl.noaa.gov/data/correlation/nao.data", &

            "Equatorial SOI. https://www.cpc.ncep.noaa.gov/data/indices/reqsoi.for", &

!            "Western Hemisphere warm pool. https://psl.noaa.gov/data/correlation/whwp.data", &
!            "AMO (Atlantic Multidecadal Oscillation) Index. https://psl.noaa.gov/data/correlation/amon.us.data", &
!            "North Pacific pattern is the area-weighted sea level pressure over the region 30N-65N, 160E-140W. https://psl.noaa.gov/data/correlation/np.data", &

            "Equatorial Eastern Pacific SLP (Standardized Anomalies). https://www.cpc.ncep.noaa.gov/data/indices/repac_slpa.for", &
            "Indonesia SLP (Standardized Anomalies). https://www.cpc.ncep.noaa.gov/data/indices/rindo_slpa.for", &

!            "Tropical Southern Atlantic Index. https://psl.noaa.gov/data/correlation/tsa.data", &
!            "Tropical Northern Atlantic Index. https://psl.noaa.gov/data/correlation/tna.data", &

            "200 millibar (mb) Zonal Winds Equator (165°West-110°West). https://www.cpc.ncep.noaa.gov/data/indices/zwnd200", &
            "850 mb Trade Wind Index (135°East-180°West) 5°North-5°South West Pacific. https://www.cpc.ncep.noaa.gov/data/indices/wpac850", &
            "850 MB TRADE WIND INDEX(135W-120W)5N 5S  EAST PACIFIC:ORIGINAL DATA. https://www.cpc.ncep.noaa.gov/data/indices/epac850", &
            "850 mb Trade Wind Index (175°West-140°West) 5°North-5°South Central Pacific. https://www.cpc.ncep.noaa.gov/data/indices/cpac850", &
            "50 mb zonal wind index. https://www.cpc.ncep.noaa.gov/data/indices/qbo.u50.index"/)

!            "Quasi-Biennial Oscillation. https://psl.noaa.gov/data/correlation/qbo.data", &
!            "Western Pacific Index. https://psl.noaa.gov/data/correlation/wp.data", &
!            "The loading pattern of AO (AAO). https://psl.noaa.gov/data/correlation/ao.data", &
!            "North Atlantic Oscillation. https://psl.noaa.gov/data/correlation/nao.data"/)

  Real, Parameter :: Miss = -99.
  Integer :: imon, iyr, iidx, Nyear, iflie
  Character (Len=255) :: Fname
  Logical :: Fexist

  Real :: ClimIDX(Yr1:Yr2,1:Nmon,1:Nidx)

  !------------------------------------------------------------------------

   ClimIDX = Miss
   Do iidx=1, Nidx
      Fname=trim(IDX_Fname(iidx))
      inquire (file=trim(Fname), exist=Fexist)
      if (Fexist) then 
         print*, iidx, " Filename: ", trim(Fname)
         !print*, trim(VarName(iidx))
         !print*, trim(IDX_Full_Name(iidx))
      else
         print*,iidx, " No file exists"
      endif
      Call Read_ClimIDX_data (Fname,iidx)  ! Read all data from origin files downloaded
                                           ! The following variables are standadized:
                                           ! "zwnd200", "wpac850", "epac850", "cpac850","qbo.u50.index"
   Enddo

   !Do iidx=26,30 !1, Nidx
   !   Do iyr=Yr1, Yr2
   !      print "(i4,12F9.3)", iyr, (ClimIDX(iyr,imon,iidx), imon=1, Nmon)
   !   Enddo
   !   print*,IDX_FName(iidx)
   !   pause
   !Enddo

   Fname="Clim_IDX_2020.nc"
   Call Write_To_NC (trim(Fname))

   Fname="Clim_IDX_Longtime_2020.nc"
   Call Write_To_NC_Longtime_series (trim(Fname))

CONTAINS
!-----------------------------------------------------------------------

Subroutine Write_To_NC_Longtime_series (Fname)
   Character (Len=*) :: Fname
   Integer :: Nyear_all, Nyear, NTimeseries
   Real, Allocatable :: Xlon(:), Xlat(:), xtime(:), X(:,:)
   Integer :: it, iyr, imon, iy, iidx
   Character (Len=100) :: t_unit

   Nyear_all=Yr2-Yr1+1; Nyear=Yre-Yrs+1
   NTimeseries = Nyear*Nmon             ! Monthly timeseries data
   write(t_unit,"(A,I4.4,A)") "months since ", Yrs,"-01-01:00 "

   Allocate(Xtime(1:NTimeseries), Xlon(1), Xlat(1), X(1:NTimeseries,1))

   it=0
   Do iy=1, Nyear 
      Do imon=1, Nmon
         it=it+1
      !  Xtime(it)=(Yrs+iy-1)*100 + imon 
         Xtime(it)=it
      Enddo
   Enddo      ! Mang xlon chua so thu tu year

   Xlat(1)=1; Xlon(1)=1
   !Do imon=1, Nmon; Xlat(imon)=imon; Enddo       ! Mang Xlat chua so thu tu Month

   Do iidx=1, Nidx
      it=0
      Do iyr=Yrs, Yre
         Do imon=1, Nmon
            it=it+1
            X(it,1) = ClimIDX(iyr,imon,iidx)
         Enddo
      Enddo
      if (iidx==1) then
         Call wr_ncdf_3d (trim(Fname),xlon,xlat,xtime,1,1,NTimeseries,X,trim(VarName(iidx)),trim(t_unit),trim(IDX_Full_Name(iidx)),"-","Y","M","month", Miss)
      else
         Call wr_ncdf_3d_apd (trim(Fname),X,trim(VarName(iidx)),1,1,NTimeseries,trim(IDX_Full_Name(iidx)),"-","Y","M","month", Miss)
      endif
   Enddo
   Deallocate (Xlon, Xlat, Xtime, X)
End Subroutine Write_To_NC_Longtime_series
!-----------------------------------------------------------------------

Subroutine Write_To_NC (Fname)
   Character (Len=*) :: Fname
   Integer :: Nyear_all, Nyear
   Real, Allocatable :: Xlon(:), Xlat(:), X(:,:)
   Integer :: iyr, imon, iy, iidx

   Nyear_all=Yr2-Yr1+1; Nyear=Yre-Yrs+1
   Allocate(Xlon(1:Nyear), Xlat(1:Nmon), X(1:Nyear,1:Nmon))

   Do iy=1, Nyear; Xlon(iy)=Yrs+iy-1; Enddo      ! Mang xlon chua so thu tu year
   Do imon=1, Nmon; Xlat(imon)=imon; Enddo       ! Mang Xlat chua so thu tu Month

   Do iidx=1, Nidx
      iy=0
      Do iyr=Yrs, Yre
         iy=iy+1
         X(iy,1:Nmon) = ClimIDX(iyr,1:Nmon,iidx)
      Enddo
      if (iidx==1) then
         Call wr_ncdf_2d (trim(Fname), Xlon, Xlat, Nyear, Nmon, X, trim(VarName(iidx)), trim(IDX_Full_Name(iidx)), "-", "Year", "Month", Miss)
      else
         Call wr_ncdf_2d_apd (trim(Fname), X, trim(VarName(iidx)), Nyear, Nmon, trim(IDX_Full_Name(iidx)), "-", "Year", "Month", Miss)
      endif
   Enddo
   Deallocate (Xlon, Xlat, X)
End Subroutine Write_To_NC
!-----------------------------------------------------------------------

Subroutine Read_ClimIDX_data (Fname,iidx)
   Real :: X(1:Nmon), Valex
   Integer :: i, j, iyr, iyr1, Yrst, Yren, Nyear, iidx
   Character (Len=*) :: Fname
   Integer :: IO
   Character (Len=100) :: St, St1
   Character (Len=4)   :: year

   !print*, iidx, " ", trim(Fname)

   Open (1, file=trim(Fname), Status="Old")
   !Read (1,*) Fname   ! Bo dong dau
   !print*, trim(Fname)

   if (iidx<=22) then
      Read (1,*) Yrst, Yren
      print*, trim(Fname),Yrst, Yren
      Nyear=Yren-Yrst+1
      Do i=1, Nyear
         Read (1,*) iyr, (X(j), j=1, Nmon)
         ClimIDX(iyr,1:Nmon,iidx) = X(1:Nmon)
      Enddo
      Read(1,*) Valex
      Where (ClimIDX==Valex) ClimIDX=Miss
   else if (iidx<=25) then
      IO=0; 
      Do while (IO==0)
         Read (1,*,iostat=IO) iyr, (X(j), j=1, Nmon)
         if (IO==0) ClimIDX(iyr,1:Nmon,iidx) = X(1:Nmon)
      Enddo
      Valex=X(Nmon)
      Where (ClimIDX==Valex) ClimIDX=Miss
   else
      i=0; IO=0
      Loop_1: Do while (IO==0)
         if (i==3) then
            if (iidx==30) then
               Read (1,"(I4,12F7.2)",iostat=IO) iyr, (X(j), j=1, Nmon)
            else
               Read (1,"(I4,12F6.1)",iostat=IO) iyr, (X(j), j=1, Nmon)
            endif
            print"(I4,12F8.2)",iyr, (X(j), j=1, Nmon)
            if (IO==0) ClimIDX(iyr,1:Nmon,iidx) = X(1:Nmon) 
         else
            Read (1,"(A100)",iostat=IO) St1
            St=trim(ADJUSTL(St1)) 
            if (Len(trim(ADJUSTL(St)))>=4) then
               year=St(1:4)
               if (year=="YEAR".AND.i<3) then
                  i=i+1; Cycle Loop_1
               else if (i==3) then 
                  exit
               endif
            endif
         endif
      Enddo Loop_1
      Valex=X(Nmon)
      Where (ClimIDX==Valex) ClimIDX=Miss
   endif
   Close (1)
End Subroutine Read_ClimIDX_data
!-----------------------------------------------------------------------

Include "/home/tanpv/Mylibs/sub_wr_ncdf_Tan.F90"

END
