
!Subroutine Write_PCA_EOF (Fname, Var, Eigen, N, M, Varn, Var_ln, Var_unit, slon, slat, h, reg, lon_n, lat_n, Miss)
Subroutine Write_PCA_EOF (Fname, Varn, Var_ln, Var_unit, lon_n, lat_n, Miss)
Integer :: ilon, ilat, it, ist
!Real, intent (in) :: slon(N),slat(N), h(N), reg(N)
!Real    :: Var(N,M), Eigen(M), Xlon(N), Xlat(M), Xtime(M), Miss
Real, Allocatable :: Var(:,:), Xlon(:), Xlat(:), Xtime(:) 
Character (Len=*) :: Fname, Varn, Var_ln, Var_unit, lon_n, lat_n
Real :: Miss

! Note: Varn is only either "PCA" or "EOF"!
if (trim(Varn)=="PCA") then               ! PCA
   Allocate (Xlon(Ntime), Xlat(NEig))
   Do ilon=1, Ntime; Xlon(ilon)=ilon;           Enddo        ! Mang Lon
   Do ilat=1, NEig;  Xlat(ilat)=Eigens(ilat); Enddo        ! Mang Lat
   Allocate (Var(1:Ntime,1:NEig));
   Do it=1, Ntime; Var(it,1:NEig)=NhanTo(it,1:NEig); Enddo
   Call wr_ncdf_2d (trim(Fname), Xlon, Xlat, Ntime, NEig, Var, trim(Varn), trim(Var_ln), trim(Var_unit), trim(lon_n), trim(lat_n), Miss)
   Deallocate (Var, Xlon, Xlat)
else if (trim(Varn)=="PCA_PA2") then
   Allocate (Xlon(Nmon), Xlat(NEig))
   Do ilon=1, Nmon; Xlon(ilon)=ilon;           Enddo        ! Mang Lon
   Do ilat=1, NEig;  Xlat(ilat)=Eigens(ilat); Enddo        ! Mang Lat
   Allocate (Var(1:Nmon,1:NEig));
   Do it=1, Nmon; Var(it,1:NEig)=NhanTo(it,1:NEig); Enddo
   Call wr_ncdf_2d (trim(Fname), Xlon, Xlat, Nmon, NEig, Var, trim(Varn), trim(Var_ln), trim(Var_unit), trim(lon_n), trim(lat_n), Miss)
   Deallocate (Var, Xlon, Xlat)
else if (trim(Varn)=="EOF") then          ! EOF
   if (trim(lon_n)=="Stn") then
      Allocate (Xtime(NEig))
      Do it=1, NEig; Xtime(it)=Eigens(it); Enddo    ! Mang Time
      Allocate (Var(1:Nst,1:NEig));
      Do ist=1, Nst; Var(ist,1:NEig)=TaiTrong(ist,1:NEig); Enddo
      Call write_station_data2netcdf (trim(Fname), Lon, Lat, H, Reg, Xtime, Nst, NEig, trim(Varn), trim(Var_unit), Var, Miss)
      Deallocate (Var, Xtime)
   else
      Allocate (Xlon(Ntime), Xlat(NEig))
      Do ilon=1, Ntime; Xlon(ilon)=ilon;           Enddo
      Do ilat=1, NEig;  Xlat(ilat)=Eigens(ilat); Enddo
      Allocate (Var(1:N_ClimIDX,1:NEig));
      Do it=1, N_ClimIDX; Var(it,1:NEig)=TaiTrong(it,1:NEig); Enddo
      Call wr_ncdf_2d (trim(Fname), Xlon, Xlat, N_ClimIDX, NEig, Var, trim(Varn), trim(Var_ln), trim(Var_unit), trim(lon_n), trim(lat_n), Miss)
      Deallocate (Var, Xlon, Xlat)
   endif
else if (trim(Varn)=="EOF_PA2") then
   Allocate (Xtime(NEig))
   Do it=1, NEig; Xtime(it)=Eigens(it); Enddo    ! Mang Time
   Allocate (Var(1:Nst,1:NEig));
   Do ist=1, Nst; Var(ist,1:NEig)=TaiTrong(ist,1:NEig); Enddo
   Call write_station_data2netcdf (trim(Fname), Lon, Lat, H, Reg, Xtime, Nst, NEig, trim(Varn), trim(Var_unit), Var, Miss)
   Deallocate (Var, Xtime)
else if (trim(Varn)=="PCA_Mon") then
   Allocate (Xtime(NEig))
   Do it=1, NEig; Xtime(it)=Eigens(it); Enddo    ! Mang Time
   Allocate (Var(1:Nst,1:NEig));
   Do ist=1, Nst; Var(ist,1:NEig)=TaiTrong(ist,1:NEig); Enddo
   Call write_station_data2netcdf (trim(Fname), Lon, Lat, H, Reg, Xtime, Nst, NEig, trim(Varn), trim(Var_unit), Var, Miss)
   Deallocate (Var, Xtime)
else if (trim(Varn)=="EOF_Mon") then
   Allocate (Xlon(Nmon*2), Xlat(NEig))
   Do ilon=1, Nmon*2; Xlon(ilon)=ilon;  Enddo
   Do ilat=1, NEig;  Xlat(ilat)=Eigens(ilat); Enddo
   Allocate (Var(1:Nmon*2,1:NEig));
   Do it=1, Nmon*2; Var(it,1:NEig)=TaiTrong(it,1:NEig); Enddo
   Call wr_ncdf_2d (trim(Fname), Xlon, Xlat, Nmon*2, NEig, Var, trim(Varn), trim(Var_ln), trim(Var_unit), trim(lon_n), trim(lat_n), Miss)
   Deallocate (Var, Xlon, Xlat)
else 
   Print*,"Something is wrong in Varname. Please check !"
endif
End Subroutine Write_PCA_EOF

