Program Dr_IDXs_SEACLID
  ! Calculating PDSI, SPI, SPEI 
  use netcdf

! Nairn J. and Fawcett R. (2013) Defining heatwaves: heatwave defined as a heat-impact event servicing all community and business sectors in Australia. 
! CAWCR Technical Report No. 060. Centre for Australian Weather and Climate Research.

! Laz Orpita U., Rahman Ataur and Ouarda Taha B. M. J. (2023). Compound heatwave and drought hotspots and their trends in Southeast Australia. 
! Natural Hazards , vol. 119 , nº 1. pp. 357-386. DOI: 10.1007/s11069-023-06115-6.

!------------------------------------------------------------------------------
  Implicit None
  Real, parameter    :: Miss=-99.0
  Integer, Parameter :: Nmon=12, N365=365 !, Yr1=1961, Yr2=2020 

  ! Distribution function's parameters:
!  Real, Allocatable    :: beta_spi(:), gamm(:), pzero(:)
!  Real                 :: beta_spei(0:2), logLogisticParams(0:Nmon,0:2), DisPars(0:Nmon,0:2)

  Real, Allocatable :: Lon(:), Lat(:), xlon(:), xlat(:), time(:), xmod(:), Mask(:,:) 
  Integer           :: Nlon, Nlat, it, ilon, ilat
 !------------------------------------------------------------------------------
  Real, Allocatable, Dimension(:,:,:)   :: HWsev_obs                 ! Nlon,Nlat,Ntime

  Real, Allocatable, Dimension(:,:,:)   :: CDHevt_obs                ! Nlon,Nlat,Ntime
  Real, Allocatable, Dimension(:,:,:)   :: CDHsev_obs                ! Nlon,Nlat,Ntime
 !------------------------------------------------------------------------------
  Real, Allocatable, Dimension(:,:,:)   :: SPEI_obs                  ! Nlon,Nlat,Ntime           - SPEI with a fixed timescale in days (e.g. 31 days, 91 days)
 !------------------------------------------------------------------------------
  ! Chars:
  ! Drought  : is defined as a period during which the drought index (SPEI) falls below a specific threshold
  ! Heatwave : is defined as a period of at least three consecutive days during which Tx>=90th percentile (Tx90p) 
  ! CDH event: A compound drought and heatwave event is defined as the occurrence of at least three consecutive days with both drought and HW
  ! CDH = SPEI<=Threshold and Tx>=Tx90p
  ! CDH characteristics:
  ! -------------------
  ! Frq: Frequency - A number of CDH events
  ! Ndy: Frequency - A number of CDH days
  ! Dm : Mean duration - Averaged duration of all events in each year
  ! Dx : Maximum duration - Maximum duration of all events in each year
  ! Mgm: Mean CDH magnitude (Magnitude = -drought_index * HW_severity 
  ! Mgx: Maximum CDH magnitude 
  Real, Allocatable, Dimension(:,:,:)   :: CHDM_obs                  ! Nlon,Nlat,Ntime
  Real, Allocatable, Dimension(:,:,:)   :: Frq_obs, Ndy_obs, Dm_obs, Dx_obs, Mgm_obs, Mgx_obs     ! Nlon,Nlat,Nyesr
  Real, Allocatable, Dimension(:,:)     :: Frq_obs_all, Ndy_obs_all, Dm_obs_all       ! Nlon,Nlat
  Real, Allocatable, Dimension(:,:)     :: Dx_obs_all, Mgm_obs_all, Mgx_obs_all       ! Nlon,Nlat
  Real, Allocatable, Dimension(:,:)     :: Tr_Frq, Tr_Dm, Tr_Dx, Tr_Mgm, Tr_Mgx, Tr_Ndy       ! Nlon,Nlat
  Real, Allocatable, Dimension(:,:)     :: pTr_Frq, pTr_Dm, pTr_Dx, pTr_Mgm, pTr_Mgx, pTr_Ndy ! Nlon,Nlat
 !------------------------------------------------------------------------------
  Character (Len=255) :: Fname,Fname1,Fname2,Fname_evt,Fname_sev,Fname_hw,Fname_qp
  Character (Len=255) :: Obs_Dir, Inp_Dir, Out_Dir, Mask_File
  Character (Len=255) :: Fevt_obs,Fevt_mod,Fsev_obs,Fsev_mod
  Integer :: Yr1, Yr2, Nmodel, Timescale, Ntime, Nyear
 ! Character (Len=20), Allocatable  :: Modelnm(:)
  Character (Len=6)                :: Tx_nm, Tm_nm, Pr_nm           ! Varname in files
  Logical                          :: status, Empty
  Integer                          :: Nlo,Nla,Nt,Nz, imod
  Real                             :: Drou_Thres
!------------------------------------------------------------------------------
! For writing to NC file:
  Real, allocatable, Dimension (:,:,:,:) :: X4d
  Real, allocatable, Dimension (:) :: X1d, Y1d, Xt, SPEI_out, Rain, T2m, Tx, Tm
!------------------------------------------------------------------------------
   Namelist /File_Dir_Names/ Mask_File,Obs_Dir,Inp_Dir,Out_Dir
   Namelist /Data_Info/      Yr1, Yr2, Timescale, Drou_Thres
   Namelist /Modelname/      Tx_nm, Tm_nm, Pr_nm
!------------------------------------------------------------------------------

   Open (1, file="Namelist_Chars_CDH.txt",Status="old")
   Read (1, File_Dir_Names)
   Read (1, Data_Info)
   Read (1, Modelname)

   Ntime=(Yr2-Yr1+1)*N365; Nyear = Yr2-Yr1+1

   ! Read landmask data for SEA region with resolution of CORDEX SEA 2024 (~0.25 deg)
   Call rd_ncdf_2d (Mask_File,Lon,Lat,Nlon,Nlat,Mask,"reg")             ! Land points
   !------------------------------------------------------------------------
   if (Allocated(xlon)) Deallocate (xlon)
   if (Allocated(xlat)) Deallocate (xlat)
  ! if (Allocated(xmod)) Deallocate (xmod)
   if (Allocated(time)) Deallocate (time)
   !------------------------------------------------------------------------
   Fname = trim(Out_Dir)//"HW_sev_obs.nc"
   Call rd_ncdf_3d (Fname,xlon,xlat,time,nlo,nla,nt,HWsev_obs,"sev")
   Deallocate (xlon,xlat,time)
   !write (Fname,"(A,I2.2,A)") trim(Out_Dir)//"SPEI_",Timescale,"_obs.nc"
   Fname = trim(Out_Dir)//"SPEI_obs.nc"
   Call rd_ncdf_3d (Fname,xlon,xlat,time,nlo,nla,nt,SPEI_obs,"spei")
   Deallocate (xlon,xlat,time)
   Call Calc_CDH_Evt_Sev_obs
   Call Init_All_Chars_obs
   Call Calc_Chars_obs           ! Inputs: CDHevt_obs, CHDM_obs
   Call Calc_Trend
   Fname1=trim(Out_Dir)//"Chars_CDH_Dr_HwTx_yearly_obs.nc"
   Fname2=trim(Out_Dir)//"Chars_CDH_Dr_HwTx_Clim_obs.nc"
   Call Write_all_Chars_obs (Fname1,Fname2)
   Call Release_All_Chars_obs
   !------------------------------------------------------------------------
   print*,"Normal terminal of Chars_CDH_Dr_HwTx.f90."
   !------------------------------------------------------------------------------
   CONTAINS
   !------------------------------------------------------------------------------
   Subroutine Calc_Trend
      Integer :: it,it1,it2,ilon,ilat,imod
      Real :: X1d(Nyear)
      Real :: sensl, prb

      print*,"Calling Calc_Trend ..."
      Do ilon=1,Nlon
         Do ilat=1,Nlat
            if (Mask(ilon,ilat)/=Miss) then
               X1d(1:Nyear) = Frq_obs(ilon,ilat,1:Nyear)
               Call MK_Sensl(X1d,Nyear,sensl,prb,Miss)
               Tr_Frq(ilon,ilat) = sensl; pTr_Frq(ilon,ilat) = prb

               X1d(1:Nyear) = Dm_obs (ilon,ilat,1:Nyear)
               Call MK_Sensl(X1d,Nyear,sensl,prb,Miss)
               Tr_Dm(ilon,ilat) = sensl; pTr_Dm(ilon,ilat) = prb

               X1d(1:Nyear) = Dx_obs (ilon,ilat,1:Nyear)
               Call MK_Sensl(X1d,Nyear,sensl,prb,Miss)
               Tr_Dx(ilon,ilat) = sensl; pTr_Dx(ilon,ilat) = prb

               X1d(1:Nyear) = Ndy_obs(ilon,ilat,1:Nyear)
               Call MK_Sensl(X1d,Nyear,sensl,prb,Miss)
               Tr_Ndy(ilon,ilat) = sensl; pTr_Ndy(ilon,ilat) = prb

               X1d(1:Nyear) = Mgm_obs(ilon,ilat,1:Nyear)
               Call MK_Sensl(X1d,Nyear,sensl,prb,Miss)
               Tr_Mgm(ilon,ilat) = sensl; pTr_Mgm(ilon,ilat) = prb

               X1d(1:Nyear) = Mgx_obs(ilon,ilat,1:Nyear)
               Call MK_Sensl(X1d,Nyear,sensl,prb,Miss)
               Tr_Mgx(ilon,ilat) = sensl; pTr_Mgx(ilon,ilat) = prb
            endif
         ENddo
      Enddo
   End Subroutine Calc_Trend
   !------------------------------------------------------------------------------
   Subroutine Calc_Chars_obs
      ! Inputs: CDHevt_obs, CHDM_obs
      Integer :: it,it1,it2,ilon,ilat,imod
      Real, Allocatable :: X1d(:), Y1d(:), M1(:), Spells(:), I_Start(:), I_End(:)
      Integer :: Nspls,Nspl3,istar,iend,Max_evt
      Real :: tmp, IMAX1, N_Spell_1, duration
      Real, dimension (Nyear) :: Frq, Dm, Dx, Nd, Sev, Svx
      Integer :: i,j,iyr

      !---------------------------------------------------------------------
      if (Allocated (X1d)) Deallocate (X1d)
      if (Allocated (Y1d)) Deallocate (Y1d)
      if (Allocated (Spells)) Deallocate (Spells)
      if (Allocated (I_Start)) Deallocate (I_Start)
      if (Allocated (I_End)) Deallocate (I_End)
      if (Allocated (M1)) Deallocate (M1)

      Allocate (X1d(Ntime), Y1d(Ntime))
      Allocate (Spells(Ntime), I_Start(Ntime), I_End(Ntime))
      Allocate (M1(Ntime))
      !---------------------------------------------------------------------
      print*,"Calling Calc_Chars_obs ..."
      ! Obs:
      Do ilon=1,Nlon
         Do ilat=1,Nlat
            if (Mask(ilon,ilat)/=Miss) then
               X1d(1:Ntime) = CDHevt_obs(ilon,ilat,1:Ntime)   ! Timeseries of Event days
               Y1d(1:Ntime) = CDHsev_obs(ilon,ilat,1:Ntime)   ! Timeseries of CHDM
               Call NSpell_and_Leng (X1d, Ntime, M1, Imax1, Spells, N_Spell_1, I_Start, I_End, Miss)
               Nspls = N_Spell_1         ! So dot
               Frq=0; Dm=0; Dx=0; Nd=0; Sev=0; Svx=0   ! Freq, Mean Dur, Max Dur, NHWday, mean Sev Max Sev
               Do i=1,Nspls
                  duration = Spells(i) ! I_End(i) - I_Start(i) + 1
                  if (duration >= 3.) then
                     istar = Int(I_Start(i))                ! Thu tu Ngay bat mot HW
                     iend  = Int(I_End(i))                  ! Thu tu Ngay ket thuc mot HW
                     iyr   = istar/N365 + 1 !mod(istar,N365)                ! Thu tu Nam co HW
                     Frq(iyr) = Frq(iyr) + 1                ! Number of HW event in year iyr
                     Dm (iyr) = Dm (iyr) + duration         ! Total duration of HW in year iyr
                     Nd (iyr) = Dm (iyr)                    ! Number of HW days
                     if (Dx(iyr)<duration) Dx(iyr) = duration ! Maximum duration
                     tmp   = 0
                     Do j=istar,iend
                        if (Y1d(j)>0) tmp = tmp + Y1d(j)    ! Sum of positive difference between Tx and Qp
                     Enddo
                     Sev(iyr) = Sev(iyr) + tmp              ! Total severity in year iyr
                     if (Svx(iyr)<tmp) Svx(iyr) = tmp       ! Maximum severity
                  endif
               Enddo
               Do iyr=1,Nyear
                  if (Frq(iyr)>0) then    ! Trung binh nam
                     Dm (iyr) = Dm (iyr)/Frq(iyr)
                     Sev(iyr) = Sev(iyr)/Frq(iyr)
                  endif
               Enddo
               ! Frq_obs; Ndy_obs; Dm_obs; Dx_obs; Mgm_obs; Mgx_obs
               Frq_obs(ilon,ilat,1:Nyear) = Frq(1:Nyear)      ! Freq (evt)
               Dm_obs (ilon,ilat,1:Nyear) = Dm (1:Nyear)      ! Mean duration (day)
               Dx_obs (ilon,ilat,1:Nyear) = Dx (1:Nyear)      ! Max duration (day)
               Ndy_obs(ilon,ilat,1:Nyear) = Nd(1:Nyear)       ! Num of CHD days (day)
               Mgm_obs(ilon,ilat,1:Nyear) = Sev(1:Nyear)      ! Mean Magnitude (C)
               Mgx_obs(ilon,ilat,1:Nyear) = Svx(1:Nyear)      ! Max Magnitude  (C)
               ! Clim mean:
               Frq_obs_all(ilon,ilat)  = Ave_No_Zero(Frq,Nyear,Miss)  ! Clim mean
               Dm_obs_all (ilon,ilat)  = Ave_No_Zero(Dm, Nyear,Miss)
               Dx_obs_all (ilon,ilat)  = Ave_No_Zero(Dx, Nyear,Miss)
               Mgm_obs_all(ilon,ilat)  = Ave_No_Zero(Sev,Nyear,Miss)
               Ndy_obs_all(ilon,ilat)  = Ave_No_Zero(Nd, Nyear,Miss)
               Mgx_obs_all(ilon,ilat)  = Ave_No_Zero(Svx,Nyear,Miss)
            endif
         Enddo
      Enddo
      Deallocate (X1d,Y1d,Spells,I_Start,I_End,M1)
      Print*,"End of Calc_Chars_obs"
      !Deallocate (X1d,Y1d,Spells,I_Start,I_End,M1)
   End Subroutine Calc_Chars_obs
   !------------------------------------------------------------------------------
   Real Function Ave_No_Zero (X,N,Miss)
      ! Calculating the mean value of all elements that differ from Zero and Miss
      Integer :: N,i,ic
      Real    :: Miss, tmp, X(N)
      ic=0; tmp=0
      Do i=1,N
         if (X(i)/=Miss.AND.X(i)/=0.) then
            ic=ic+1;tmp=tmp+X(i)
         endif
      Enddo
      if (ic>0) then
         Ave_No_Zero = tmp/real(ic)
      else
         Ave_No_Zero = Miss
      endif
   End Function Ave_No_Zero
   !------------------------------------------------------------------------------
   Subroutine Init_All_Chars_obs
      Allocate (Frq_obs(Nlon,Nlat,Nyear),Ndy_obs(Nlon,Nlat,Nyear),Dm_obs (Nlon,Nlat,Nyear))
      Allocate (Dx_obs (Nlon,Nlat,Nyear),Mgm_obs(Nlon,Nlat,Nyear),Mgx_obs(Nlon,Nlat,Nyear))
      Frq_obs=Miss; Ndy_obs=Miss; Dm_obs=Miss; Dx_obs=Miss; Mgm_obs=Miss; Mgx_obs=Miss;

      Allocate (Frq_obs_all(Nlon,Nlat),Ndy_obs_all(Nlon,Nlat),Dm_obs_all (Nlon,Nlat))
      Allocate (Dx_obs_all (Nlon,Nlat),Mgm_obs_all(Nlon,Nlat),Mgx_obs_all(Nlon,Nlat))
      Frq_obs_all=Miss; Ndy_obs_all=Miss; Dm_obs_all=Miss; Dx_obs_all=Miss; Mgm_obs_all=Miss; Mgx_obs_all=Miss;

      Allocate (Tr_Frq(Nlon,Nlat),Tr_Dm(Nlon,Nlat),Tr_Dx(Nlon,Nlat),Tr_Mgm(Nlon,Nlat),Tr_Mgx(Nlon,Nlat),Tr_Ndy(Nlon,Nlat))       ! Nlon,Nlat
      Allocate (pTr_Frq(Nlon,Nlat),pTr_Dm(Nlon,Nlat),pTr_Dx(Nlon,Nlat),pTr_Mgm(Nlon,Nlat),pTr_Mgx(Nlon,Nlat),pTr_Ndy(Nlon,Nlat)) ! Nlon,Nlat
      Tr_Frq=Miss; Tr_Dm=Miss; Tr_Dx=Miss; Tr_Mgm=Miss; Tr_Mgx=Miss; Tr_Ndy=Miss;        ! Nlon,Nlat
      pTr_Frq=Miss; pTr_Dm=Miss; pTr_Dx=Miss; pTr_Mgm=Miss; pTr_Mgx=Miss; pTr_Ndy=Miss   ! Nlon,Nlat
   End Subroutine Init_All_Chars_obs
   !------------------------------------------------------------------------------
   Subroutine Release_All_Chars_obs
      Deallocate (Frq_obs,Ndy_obs,Dm_obs,Dx_obs,Mgm_obs,Mgx_obs)
      Deallocate (Frq_obs_all,Ndy_obs_all,Dm_obs_all,Dx_obs_all,Mgm_obs_all,Mgx_obs_all)
      Deallocate (CDHevt_obs)
   End Subroutine Release_All_Chars_obs
   !------------------------------------------------------------------------------
   Subroutine Calc_CDH_Evt_Sev_obs
      Integer :: imod,ilon,ilat,it,iday,iday1
      Real    :: hwsev, dridx

      if (Allocated (CDHevt_obs)) Deallocate (CDHevt_obs)
      if (Allocated (CDHsev_obs)) Deallocate (CDHsev_obs)
      Allocate (CDHevt_obs(Nlon,Nlat,Ntime))
      Allocate (CDHsev_obs(Nlon,Nlat,Ntime)) 
      CDHevt_obs=Miss; CDHsev_obs=Miss;
      print*,"Calling Calc_CDH_Evt_Sev_obs ..."
      ! Obs:
      Do ilon=1,Nlon
         Do ilat=1,Nlat
            if (Mask(ilon,ilat)/=Miss) then
               Do it=1,Ntime
                  !hwevt = HWevt_obs (ilon,ilat,it) 
                  !drevt = DRevt_obs (ilon,ilat,it)
                  !drsev = DRsev_obs(ilon,ilat,it);     ! Drought index value
                  dridx = SPEI_obs(ilon,ilat,it)
                  hwsev = HWsev_obs (ilon,ilat,it)      ! Excess Heat Factor
                  if (dridx/=Miss.AND.hwsev/=Miss) then
                     if (dridx<=Drou_Thres.AND.hwsev>0) then
                        CDHevt_obs(ilon,ilat,it) = 1
                        CDHsev_obs(ilon,ilat,it) = -dridx*hwsev
                     else
                        CDHevt_obs(ilon,ilat,it) = 0
                        CDHsev_obs(ilon,ilat,it) = 0
                     endif
                  endif
                  !if (hwevt==1..AND.drevt==1.) then    ! simultaneously occur both Drought and HW
                  !   CDHevt_obs(ilon,ilat,it) = 1      ! Drought YES
                  !   CDHsev_obs(ilon,ilat,it) = -drsev*hwsev     ! CHD YES
                  !else if (hwevt==0..AND.drevt==0.) then
                  !   CDHevt_obs(ilon,ilat,it) = 0
                  !   CDHsev_obs(ilon,ilat,it) = 0
                  !endif
                  !if (CDHevt_obs(ilon,ilat,it)==1) then
                  !   CDHsev_obs(ilon,ilat,it) = -drsev*hwsev     ! CHD YES
                  !else if (CDHevt_obs(ilon,ilat,it)==0.) then
                  !   CDHsev_obs(ilon,ilat,it) = 0
                  !endif
               Enddo
            endif
         Enddo
      Enddo
      print*,"Calling Calc_CDH_Evt_Sev_obs Done."
   End Subroutine Calc_CDH_Evt_Sev_obs
   !------------------------------------------------------------------------------
   Subroutine Write_all_Chars_obs (Fannual,Fclim)
      Character (Len=*) :: Fannual,Fclim
      Character (Len=255) :: t_unit, Var_nm, Var_ln, var_unit, lon_nm, lat_nm, z_nm, t_nm, Str
      Integer :: it,i,ilen,ilon,ilat,ilead,Nlo,Nla,Nme,Nt,Nt1,Nt2,icas, it1, it2, icpr, ict, icpet
      Real :: tmpr, tmpt, tmpet, alpha, lat_reg

      print*,"Calling Write_all_Chars_obs..."
      if (Allocated(time)) Deallocate (time)
      Allocate (time(Nyear))
      t_unit="years since 1980-01-01 "; var_unit="-";
      lon_nm="lon"; lat_nm="lat"; z_nm="model"; t_nm="year"
      Do i=1,Nyear; time(i)=i-1; Enddo
      print*,time
      ! Annual Obs:
      Var_ln="Annual number of the observed CDH events (Frequency)"
      Call wr_ncdf_3d (Fannual,Lon,Lat,time,Nlon,Nlat,Nyear,Frq_obs,"frq",t_unit, var_ln,"-", lon_nm, lat_nm, t_nm, Miss)
      !Call wr_ncdf_3d_apd (Fannual,Frq_obs,"frq_obs",Nlon,Nlat,Nyear,var_ln, var_unit, lon_nm, lat_nm, t_nm, Miss)
      Var_ln="Annual mean duration of the observed CDH"
      Call wr_ncdf_3d_apd (Fannual,Dm_obs,"dm",Nlon,Nlat,Nyear,var_ln,"day", lon_nm, lat_nm, t_nm, Miss)
      Var_ln="Annual maximum duration of the observed CDH"
      Call wr_ncdf_3d_apd (Fannual,Dx_obs,"dx",Nlon,Nlat,Nyear,var_ln,"day", lon_nm, lat_nm, t_nm, Miss)
      Var_ln="Annual mean magnitude of the observed CDH"
      Call wr_ncdf_3d_apd (Fannual,Mgm_obs,"sev",Nlon,Nlat,Nyear,var_ln,"C2", lon_nm, lat_nm, t_nm, Miss)
      Var_ln="Annual maximum magnitude of the observed CDH"
      Call wr_ncdf_3d_apd (Fannual,Mgx_obs,"svx",Nlon,Nlat,Nyear,var_ln,"C2", lon_nm, lat_nm, t_nm, Miss)
      Var_ln="Annual number of the observed CDH days"
      Call wr_ncdf_3d_apd (Fannual,Ndy_obs,"nday",Nlon,Nlat,Nyear,var_ln,"day", lon_nm, lat_nm, t_nm, Miss)
      ! Clim obs:
      Var_ln="Climatological mean of the observed CDH events"
      !Call wr_ncdf_2d_apd (Fclim,Frq_obs_all,"frq_cli",Nlon,Nlat, var_ln,"-", lon_nm, lat_nm, Miss)
      Call wr_ncdf_2d (Fclim,Lon,Lat,Nlon,Nlat,Frq_obs_all,"frq",var_ln,"-", lon_nm, lat_nm, Miss)
      Var_ln="Climatological mean of the observed mean CDH duration"
      Call wr_ncdf_2d_apd (Fclim,Dm_obs_all,"dm",Nlon,Nlat, var_ln,"day",lon_nm, lat_nm, Miss)
      Var_ln="Climatological mean of the observed maximum CDH duration"
      Call wr_ncdf_2d_apd (Fclim,Dx_obs_all,"dx",Nlon,Nlat, var_ln,"day",lon_nm, lat_nm, Miss)
      Var_ln="Climatological mean of the observed mean CDH magnitude"
      Call wr_ncdf_2d_apd (Fclim,Mgm_obs_all,"sev",Nlon,Nlat, var_ln,"C",lon_nm, lat_nm, Miss)
      Var_ln="Climatological mean of the observed maximum CDH magnitude"
      Call wr_ncdf_2d_apd (Fclim,Mgx_obs_all,"svx",Nlon,Nlat, var_ln,"C",lon_nm, lat_nm, Miss)
      Var_ln="Climatological mean of the observed number of CDH days"
      Call wr_ncdf_2d_apd (Fclim,Ndy_obs_all,"nday",Nlon,Nlat, var_ln,"day",lon_nm, lat_nm, Miss)

      ! Trend:
      Var_ln="Trend of changes in the annual observed CDH events (Frequency)"
      Call wr_ncdf_2d_apd (Fclim,Tr_Frq,"slp_frq",Nlon,Nlat, var_ln,"hw/year",lon_nm, lat_nm, Miss)
      Var_ln="p-level of Trend of changes in the annual observed CDH events (Frequency)"
      Call wr_ncdf_2d_apd (Fclim,pTr_Frq,"p_frq",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)

      Var_ln="Trend of changes in the annual mean duration of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,Tr_Dm,"slp_dm",Nlon,Nlat, var_ln,"day/year",lon_nm, lat_nm, Miss)
      Var_ln="p-level of Trend of changes in the annual mean duration of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,pTr_Dm,"p_dm",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)

      Var_ln="Trend of changes in the annual maximum duration of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,Tr_Dx,"slp_dx",Nlon,Nlat, var_ln,"day/year",lon_nm, lat_nm, Miss)
      Var_ln="p-level of Trend of changes in the annual maximum duration of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,pTr_Dx,"p_dx",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)

      Var_ln="Trend of changes in the annual mean magnitude of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,Tr_Mgm,"slp_sev",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)
      Var_ln="p-level of Trend of changes in the annual mean magnitude of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,pTr_Mgm,"p_sev",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)

      Var_ln="Trend of changes in the annual maximum magnitude of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,Tr_Mgx,"slp_svx",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)
      Var_ln="p-level of Trend of changes in the annual maximum magnitude of the observed CDH"
      Call wr_ncdf_2d_apd (Fclim,pTr_Mgx,"p_svx",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)

      Var_ln="Trend of changes in the annual number of the observed CDH days"
      Call wr_ncdf_2d_apd (Fclim,Tr_Ndy,"slp_nday",Nlon,Nlat, var_ln,"day/year",lon_nm, lat_nm, Miss)
      Var_ln="Trend of changes in the annual number of the observed CDH days"
      Call wr_ncdf_2d_apd (Fclim,pTr_Ndy,"p_nday",Nlon,Nlat, var_ln,"-",lon_nm, lat_nm, Miss)
   End Subroutine Write_all_Chars_obs 
   !------------------------------------------------------------------------------
   Include "/home/tanpv/Mylibs/sub_wr_ncdf_Tan.F90"
   Include "/home/tanpv/Mylibs/sub_rd_ncdf_Tan.F90"
   Include "/home/tanpv/Mylibs/Ave.f90"

   Include "/home/tanpv/Mylibs/Sub_NSpell_and_Leng.f90"
   Include "/home/tanpv/Mylibs/Sub_SPEI_Daily_One_Stn_2024.f90"
   Include "/home/tanpv/Mylibs/Sub_Daily_Percentile.f90"
   Include "/home/tanpv/Mylibs/Sub_Trend_MK.f90"
   !--------------------------------------------------------------------
   END ! Program
