! <-~~~=| (+) Subroutine to write netCDF file with 3 options: 2d, 3d, 4d ~ lon, lat, time, lev  =@
! <-~~~=| (-) Only avaiable to write 1 variables 						=@
! <-~~~=| Reference: http://spanlib.sourceforge.net/doc/doc_f90_exa.html			=@
! <-~~~=| --------------------									=@
! <-~~~=| To compile: 										=@
! <-~~~=|            ifort -L ${netcdf}lib/ -lnetcdff -I ${netcdf}include/ main_program.F90	=@
! <-~~~=| ----------:										=@
! <-~~~=|            where: netcdf="/opt/apps/intel_12.0/linux86_64/netcdf/4.1.3/"		=@
! <-~~~=|==-------------------------------------------------------------------------------------=@
!Cac chuong trinh con goi de ghi ra file NetCDF:

! Ghi mot mang ky tu var(nlon) voi ten mang mo ta lon(nlon)
!SUBROUTINE wr_ncdf_1d_char (filenm, lon, nlon, var, var_nm, var_long_name, var_unit, lon_nm, flag)

! Ghi mot mang so thuc 1 chieu var(nlon)
!SUBROUTINE wr_ncdf_1d (filenm, lon, nlon, var, var_nm, var_long_name, var_unit, lon_nm, flag)

! Ghi mot mang so thuc 2 chieu var(nlon,nlat)
!SUBROUTINE wr_ncdf_2d (filenm,lon,lat,nlon,nlat,var,var_nm, var_long_name, var_unit, lon_nm, lat_nm, flag)

! Ghi mot mang so thuc 3 chieu var(nlon,nlat,nt)
!SUBROUTINE wr_ncdf_3d (filenm,lon,lat,t,nlon,nlat,nt,var,var_nm,t_unit, var_long_name, var_unit, lon_nm, lat_nm, t_nm, flag)

! Ghi them mot mang ky tu var(nlon) vao file san co cung kich thuoc chieu x la nlon
!SUBROUTINE wr_ncdf_1d_apd_char (filenm,var,var_nm, nlon, var_long_name, var_unit, lon_nm, flag)

! Ghi them mot mang so thuc 1 chieu var(nlon) vao file san co cung kich thuoc chieu x la nlon
!SUBROUTINE wr_ncdf_1d_apd (filenm,var,var_nm, nlon, var_long_name, var_unit, lon_nm, flag)

! Ghi them mot mang so thuc 2 chieu var(nlon,nlat) vao file san co cung kich thuoc chieu x la nlon, chieu y la nlat
!SUBROUTINE wr_ncdf_2d_apd (filenm,var,var_nm,nlon,nlat, var_long_name, var_unit, lon_nm, lat_nm, flag)

! Ghi them mot mang so thuc 3 chieu var(nlon,nlat,nt) vao file san co cung kich thuoc chieu x la nlon, chieu y la nlat, chieu t la nt
!SUBROUTINE wr_ncdf_3d_apd (filenm,var,var_nm,nlon,nlat,nt, var_long_name, var_unit, lon_nm, lat_nm, t_nm, flag)

! Ghi mot mang so thuc 4 chieu var(nlon,nlat,nz,nt)
!Subroutine wr_ncdf_4d (filenm,lon,lat,z,t,nlon,nlat,nz,nt,var,var_nm, &
!                       t_unit, var_long_name, var_unit, lon_nm, lat_nm, z_nm, t_nm, flag)

! Ghi them mot mang so thuc 4 chieu var(nlon,nlat,nz, nt) vao file san co cung kich thuoc chieu x la nlon, chieu y la nlat, chieu z la nz, chieu t la nt
!SUBROUTINE wr_ncdf_4d_apd (filenm,var,var_nm, nlon,nlat,nz,nt, &
!                           var_long_name,var_unit, lon_nm, lat_nm, z_nm, t_nm,flag)


! <-~~~=| Write 1D character (Len=*) to netCDF ...

SUBROUTINE wr_ncdf_1d_char (filenm, lon, nlon, var, var_nm, var_long_name, var_unit, lon_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
   character (len = *) :: lon_nm  
   integer, parameter :: NDIMS = 1 
   integer :: ncid, var_id, dims_id(NDIMS)
   integer :: lon_id, charID
   integer, intent (in) :: nlon 
   character (len = *), intent (in) :: var(nlon)
   real, intent (in) :: lon(nlon), flag

   print*,"   Writing netCDF file: ",filenm,"..."
   call hulk ( nf90_create (filenm, nf90_write, ncid) )
     call hulk ( nf90_def_dim (ncid, lon_nm, nlon, dims_id(1)) )
     call hulk ( nf90_def_var (ncid, lon_nm, nf90_float, dims_id(1),lon_id) )
     call hulk ( nf90_def_dim (ncid, "charlen", 20, charID) )
     call hulk ( nf90_def_var (ncid, var_nm, nf90_char, (/charID,dims_id(1)/), var_id) )
 
     call hulk ( nf90_put_att (ncid, lon_id, "long_name", "Station"))
     call hulk ( nf90_put_att (ncid, lon_id, "units",         "No") )
     call hulk ( nf90_put_att (ncid, var_id, "long_name",trim(var_long_name)))
     call hulk ( nf90_put_att (ncid, var_id, "units",trim(var_unit)))
     call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
     call hulk ( nf90_enddef(ncid) )

     call hulk ( nf90_put_var (ncid, lon_id, lon) )
     call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing file ",filenm
   return
END SUBROUTINE wr_ncdf_1d_char

! <-~~~=| Write 1D netCDF ...

SUBROUTINE wr_ncdf_1d (filenm, lon, nlon, var, var_nm, var_long_name, var_unit, lon_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
   character (len = *) :: lon_nm   !, lat_nm    ! Names of Dim_1, Dim_2
   integer, parameter :: NDIMS = 1 ! 2
   integer :: ncid, var_id, dims_id(NDIMS)
   integer :: lon_id  ! , lat_id
   integer, intent (in) :: nlon  ! , nlat
   real, dimension (nlon), intent (in) :: var
   real, intent (in) :: lon(nlon), flag  ! lat(nlat), flag

   print*,"   Writing netCDF file: ",filenm,"..."
   call hulk ( nf90_create (filenm, nf90_write, ncid) )
        call hulk ( nf90_def_dim (ncid, lon_nm, nlon, dims_id(1)) )
        call hulk ( nf90_def_var (ncid, lon_nm, nf90_float, dims_id(1),   lon_id) )
        call hulk ( nf90_def_var (ncid, var_nm, nf90_float, dims_id(1:1), var_id) )
             call hulk ( nf90_put_att (ncid, lon_id, "long_name",     "Station") ) !"Longitude") )
             call hulk ( nf90_put_att (ncid, lon_id, "units",         "No") ) !"degree_east") )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",     trim(var_long_name))) !"What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units",         trim(var_unit)))      ! "OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
        call hulk ( nf90_enddef(ncid) )

        call hulk ( nf90_put_var (ncid, lon_id, lon) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing file ",filenm

   return
END SUBROUTINE wr_ncdf_1d

! <-~~~=| Write 2D netCDF ...
SUBROUTINE wr_ncdf_2d (filenm,lon,lat,nlon,nlat,var,var_nm, var_long_name, var_unit, lon_nm, lat_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
!   character (len = *), parameter :: lon_nm = "lon", lat_nm = "lat"
   character (len = *) :: lon_nm, lat_nm    ! Names of Dim_1, Dim_2
   integer, parameter :: NDIMS = 2
   integer :: ncid, var_id, dims_id(NDIMS)
   integer :: lon_id, lat_id
   integer, intent (in) :: nlon, nlat
   real, dimension (nlon,nlat), intent (in) :: var
   real, intent (in) :: lon(nlon), lat(nlat), flag

   print*,"   Writing netCDF file: ",filenm,"..."
   call hulk ( nf90_create (filenm, nf90_write, ncid) )
        call hulk ( nf90_def_dim (ncid, lon_nm, nlon, dims_id(1)) )
        call hulk ( nf90_def_dim (ncid, lat_nm, nlat, dims_id(2)) )

        call hulk ( nf90_def_var (ncid, lon_nm, nf90_float, dims_id(1),   lon_id) )
        call hulk ( nf90_def_var (ncid, lat_nm, nf90_float, dims_id(2),   lat_id) )
        call hulk ( nf90_def_var (ncid, var_nm, nf90_float, dims_id(1:2), var_id) )
             call hulk ( nf90_put_att (ncid, lon_id, "long_name",     "Longitude") )
             call hulk ( nf90_put_att (ncid, lon_id, "units",         "degree_east") )
             call hulk ( nf90_put_att (ncid, lat_id, "long_name",     "Latitude") )
             call hulk ( nf90_put_att (ncid, lat_id, "units",         "degree_north") )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",     trim(var_long_name))) !"What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units",         trim(var_unit)))      ! "OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
        call hulk ( nf90_enddef(ncid) )

        call hulk ( nf90_put_var (ncid, lon_id, lon) )
        call hulk ( nf90_put_var (ncid, lat_id, lat) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing file ",filenm

   return
END SUBROUTINE wr_ncdf_2d
!------------------------- Write 2D with lon, lat double precision
SUBROUTINE wr_ncdf_2d_dbl (filenm,lon,lat,nlon,nlat,var,var_nm, var_long_name, var_unit, lon_nm, lat_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
!   character (len = *), parameter :: lon_nm = "lon", lat_nm = "lat"
   character (len = *) :: lon_nm, lat_nm    ! Names of Dim_1, Dim_2
   integer, parameter :: NDIMS = 2
   integer :: ncid, var_id, dims_id(NDIMS)
   integer :: lon_id, lat_id
   integer, intent (in) :: nlon, nlat
   real, dimension (nlon,nlat), intent (in) :: var
   real*8, intent (in) :: lon(nlon), lat(nlat)
   real :: flag

   print*,"   Writing netCDF file: ",filenm,"..."
   call hulk ( nf90_create (filenm, nf90_write, ncid) )
        call hulk ( nf90_def_dim (ncid, lon_nm, nlon, dims_id(1)) )
        call hulk ( nf90_def_dim (ncid, lat_nm, nlat, dims_id(2)) )

        call hulk ( nf90_def_var (ncid, lon_nm, nf90_float, dims_id(1),   lon_id) )
        call hulk ( nf90_def_var (ncid, lat_nm, nf90_float, dims_id(2),   lat_id) )
        call hulk ( nf90_def_var (ncid, var_nm, nf90_float, dims_id(1:2), var_id) )
             call hulk ( nf90_put_att (ncid, lon_id, "long_name",     "Longitude") )
             call hulk ( nf90_put_att (ncid, lon_id, "units",         "degree_east") )
             call hulk ( nf90_put_att (ncid, lat_id, "long_name",     "Latitude") )
             call hulk ( nf90_put_att (ncid, lat_id, "units",         "degree_north") )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",     trim(var_long_name))) !"What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units",         trim(var_unit)))      ! "OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
        call hulk ( nf90_enddef(ncid) )

        call hulk ( nf90_put_var (ncid, lon_id, lon) )
        call hulk ( nf90_put_var (ncid, lat_id, lat) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing file ",filenm
END SUBROUTINE wr_ncdf_2d_dbl

! <-~~~=| Write 3D netCDF ...
SUBROUTINE wr_ncdf_3d (filenm,lon,lat,t,nlon,nlat,nt,var,var_nm,t_unit, var_long_name, var_unit, lon_nm, lat_nm, t_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, t_unit, var_long_name, var_unit
!   character (len = *), parameter :: lon_nm = "lon", lat_nm = "lat", t_nm = "time"
   character (len = *) :: lon_nm, lat_nm, t_nm   ! Names of Dim_1, Dim_2, Dim_3
   integer, parameter :: NDIMS = 3
   integer :: ncid, var_id, dims_id(NDIMS)
   integer :: lon_id, lat_id, t_id
   integer, intent (in) :: nlon, nlat, nt
   real, dimension (nlon,nlat,nt), intent (in) :: var
   real, intent (in) :: lon(nlon), lat(nlat), t(nt), flag
   
   print*,"   Writing netCDF file: ",filenm,"..."
   call hulk ( nf90_create (filenm, nf90_write, ncid) )
        call hulk ( nf90_def_dim (ncid, lon_nm, nlon, dims_id(1)) )
        call hulk ( nf90_def_dim (ncid, lat_nm, nlat, dims_id(2)) )
        call hulk ( nf90_def_dim (ncid, t_nm,   nt,   dims_id(3)) )

        call hulk ( nf90_def_var (ncid,lon_nm,nf90_float,dims_id(1),lon_id) )
        call hulk ( nf90_def_var (ncid,lat_nm,nf90_float,dims_id(2),lat_id) )
        call hulk ( nf90_def_var (ncid,t_nm,nf90_float,dims_id(3),t_id) )
        call hulk ( nf90_def_var (ncid,var_nm,nf90_float,dims_id(1:3),var_id) )
             call hulk ( nf90_put_att (ncid,lon_id,"long_name","Longitude") )
             call hulk ( nf90_put_att (ncid,lon_id,"units","degree_east") )
             call hulk ( nf90_put_att (ncid,lat_id,"long_name","Latitude") )
             call hulk ( nf90_put_att (ncid,lat_id,"units","degree_north") )
             call hulk ( nf90_put_att (ncid,t_id,"long_name","Time") )

!             call hulk ( nf90_put_att (ncid,t_id,"units","months since 1986-01-15 00:00:00") )
             call hulk ( nf90_put_att (ncid,t_id,"units",trim(t_unit)//" 00:00:00") )
             call hulk ( nf90_put_att (ncid,t_id,"calendar","proleptic_gregorian") )
             call hulk ( nf90_put_att (ncid,var_id,"long_name",      trim(var_long_name)))  !"What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid,var_id,"units",          trim(var_unit)))       !"OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid,var_id,"missing_value",flag) )
        call hulk ( nf90_enddef (ncid) )
        call hulk ( nf90_put_var (ncid,lon_id,lon) )
        call hulk ( nf90_put_var (ncid,lat_id,lat) )
        call hulk ( nf90_put_var (ncid,t_id,t) )
        call hulk ( nf90_put_var (ncid,var_id,var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing file ",filenm

   return
END SUBROUTINE wr_ncdf_3d

! <-~~~=|= Write 1D character variable to existed file, need to have same dimensions

SUBROUTINE wr_ncdf_1d_apd_char (filenm,var,var_nm, nlon, var_long_name, var_unit, lon_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
   character (len = *) :: lon_nm
   integer, parameter :: NDIMS = 1  ! 2
   integer :: ncid, var_id, charID, dims_id(NDIMS)
   integer, intent (in) :: nlon
   character (len = *), intent (in) :: var(nlon)
   real, intent (in) :: flag
   integer :: istat ! nx

   print*,"   Writing append to netCDF file: ",filenm,"..."
   call hulk ( nf90_open (filenm, nf90_write, ncid) )
   call hulk ( nf90_inq_dimid (ncid, lon_nm, dims_id(1)) )

   istat = ( nf90_inq_dimid (ncid, "charlen", charID ))
   if (istat .ne. nf90_noerr) then
     print *,"new dimension"
     call hulk ( nf90_redef (ncid) )
     call hulk (nf90_def_dim (ncID, "charlen", 20, charID) )   
   else
     call hulk ( nf90_redef (ncid) )
   endif

   call hulk ( nf90_def_var (ncid, var_nm, nf90_char, (/charID,dims_id(1:1)/), var_id) )

   call hulk ( nf90_put_att (ncid, var_id, "long_name",trim(var_long_name))) 
   call hulk ( nf90_put_att (ncid, var_id, "units",trim(var_unit)))
   call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
   call hulk ( nf90_enddef (ncid) )
   call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing append to file ",filenm

   return

END SUBROUTINE wr_ncdf_1d_apd_char

! <-~~~=|= Write 1D variable to existed file, need to have same dimensions
SUBROUTINE wr_ncdf_1d_apd (filenm,var,var_nm, nlon, var_long_name, var_unit, lon_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
!   character (len = *), parameter :: lon_nm = "lon", lat_nm = "lat"
   character (len = *) :: lon_nm ! , lat_nm
   integer, parameter :: NDIMS = 1  ! 2
   integer :: ncid, var_id, dims_id(NDIMS)
   integer, intent (in) :: nlon  ! , nlat
   real, dimension (nlon), intent (in) :: var
   real, intent (in) :: flag

   print*,"   Writing append to netCDF file: ",filenm,"..."
   call hulk ( nf90_open (filenm, nf90_write, ncid) )
        call hulk ( nf90_inq_dimid (ncid, lon_nm, dims_id(1)) )
!        call hulk ( nf90_inq_dimid (ncid, lat_nm, dims_id(2)) )
        call hulk ( nf90_redef (ncid) )
             call hulk ( nf90_def_var (ncid, var_nm,nf90_float,dims_id(1:1),var_id) )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",     trim(var_long_name)))  !"What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units",         trim(var_unit)))       !"OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
        call hulk ( nf90_enddef (ncid) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing append to file ",filenm

   return
END SUBROUTINE wr_ncdf_1d_apd

! <-~~~=|= Write 2D variable to existed file, need to have same dimensions
SUBROUTINE wr_ncdf_2d_apd (filenm,var,var_nm,nlon,nlat, var_long_name, var_unit, lon_nm, lat_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
!   character (len = *), parameter :: lon_nm = "lon", lat_nm = "lat"
   character (len = *) :: lon_nm, lat_nm
   integer, parameter :: NDIMS = 2
   integer :: ncid, var_id, dims_id(NDIMS)
   integer, intent (in) :: nlon, nlat
   real, dimension (nlon,nlat), intent (in) :: var
   real, intent (in) :: flag

   print*,"   Writing append to netCDF file: ",filenm,"..."
   call hulk ( nf90_open (filenm, nf90_write, ncid) )
        call hulk ( nf90_inq_dimid (ncid, lon_nm, dims_id(1)) )
        call hulk ( nf90_inq_dimid (ncid, lat_nm, dims_id(2)) )
        call hulk ( nf90_redef (ncid) )
             call hulk ( nf90_def_var (ncid, var_nm,nf90_float,dims_id(1:2),var_id) )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",     trim(var_long_name)))  !"What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units",         trim(var_unit)))       !"OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )        
        call hulk ( nf90_enddef (ncid) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing append to file ",filenm

   return
END SUBROUTINE wr_ncdf_2d_apd

! <-~~~=|= Write 3D variable to existed file, need to have same dimensions
SUBROUTINE wr_ncdf_3d_apd (filenm,var,var_nm,nlon,nlat,nt, var_long_name, var_unit, lon_nm, lat_nm, t_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
!   character (len = *), parameter :: lon_nm = "lon", lat_nm = "lat", t_nm = "time"
   character (len = *) :: lon_nm, lat_nm, t_nm   ! Names of Dim_1, Dim_2, Dim_3
   integer, parameter :: NDIMS = 3
   integer :: ncid, var_id, dims_id(NDIMS)
   integer, intent (in) :: nlon, nlat, nt
   real, dimension (nlon,nlat,nt), intent (in) :: var
   real, intent (in) :: flag

   print*,"   Writing append to netCDF file: ",filenm,"..."
   call hulk ( nf90_open (filenm, nf90_write, ncid) )
        call hulk ( nf90_inq_dimid (ncid, lon_nm, dims_id(1)) )
        call hulk ( nf90_inq_dimid (ncid, lat_nm, dims_id(2)) )
        call hulk ( nf90_inq_dimid (ncid, t_nm,   dims_id(3)) )
        call hulk ( nf90_redef (ncid) )
             call hulk ( nf90_def_var (ncid, var_nm,nf90_float,dims_id(1:3),var_id) )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",    trim(var_long_name)))  ! "What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units",        trim(var_unit)))       ! "OMG (@.@!)") )
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
        call hulk ( nf90_enddef (ncid) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing append to file ",filenm

   return
END SUBROUTINE wr_ncdf_3d_apd

! <-~~~=| Nf90 checking errors ...
SUBROUTINE hulk (stat)
   use netcdf
   integer :: stat
   if ( stat .ne. nf90_noerr) then
      print*, trim(nf90_strerror(stat))
      stop
   endif
END SUBROUTINE hulk
!----------------------------------------------------------------------------------
Subroutine wr_ncdf_4d (filenm,lon,lat,z,t,nlon,nlat,nz,nt,var,var_nm, &
                       t_unit, var_long_name, var_unit, lon_nm, lat_nm, z_nm, t_nm, flag)
   character (len = *), intent (in) :: filenm, var_nm, t_unit, var_long_name, var_unit
   character (len = *) :: lon_nm, lat_nm, z_nm, t_nm
   integer, parameter :: NDIMS = 4
   integer :: ncid, var_id, dims_id(NDIMS)
   integer :: lon_id, lat_id, z_id, t_id
   integer, intent (in) :: nlon, nlat, nz, nt
   real, dimension (nlon,nlat,nz,nt), intent (in) :: var
   real, intent (in) :: lon(nlon), lat(nlat), z(nz), t(nt), flag

   print*,"   Writing netCDF file: ",filenm,"..."
   call hulk ( nf90_create (filenm, nf90_write, ncid) )
        call hulk ( nf90_def_dim (ncid, lon_nm, nlon, dims_id(1)) )
        call hulk ( nf90_def_dim (ncid, lat_nm, nlat, dims_id(2)) )
        call hulk ( nf90_def_dim (ncid, z_nm,   nz,   dims_id(3)) )
        call hulk ( nf90_def_dim (ncid, t_nm,   nt,   dims_id(4)) )

        call hulk ( nf90_def_var (ncid,lon_nm,nf90_float,dims_id(1),lon_id) )
        call hulk ( nf90_def_var (ncid,lat_nm,nf90_float,dims_id(2),lat_id) )
        call hulk ( nf90_def_var (ncid,z_nm,nf90_float,dims_id(3),z_id) )
        call hulk ( nf90_def_var (ncid,t_nm,nf90_float,dims_id(4),t_id) )
        call hulk ( nf90_def_var (ncid,var_nm,nf90_float,dims_id(1:4),var_id) )
             call hulk ( nf90_put_att (ncid,lon_id,"long_name","Longitude") )
             call hulk ( nf90_put_att (ncid,lon_id,"units","degree_east") )
             call hulk ( nf90_put_att (ncid,lon_id,"axis","X") )
             call hulk ( nf90_put_att (ncid,lat_id,"long_name","Latitude") )
             call hulk ( nf90_put_att (ncid,lat_id,"units","degree_north") )
             call hulk ( nf90_put_att (ncid,lat_id,"axis","Y") )
             call hulk ( nf90_put_att (ncid,z_id,  "long_name","z") )
             call hulk ( nf90_put_att (ncid,z_id,  "units","Lev") )
             call hulk ( nf90_put_att (ncid,z_id,  "axis","Z") )

             call hulk ( nf90_put_att (ncid,t_id,"long_name","Time") )
             call hulk ( nf90_put_att (ncid,t_id,"units",trim(t_unit)//" 00:00:00") )
             call hulk ( nf90_put_att (ncid,t_id,"calendar","proleptic_gregorian") )
             call hulk ( nf90_put_att (ncid,t_id,"axis","T") )

             call hulk ( nf90_put_att (ncid,var_id,"long_name",trim(var_long_name)))
             call hulk ( nf90_put_att (ncid,var_id,"units", trim(var_unit)))
             call hulk ( nf90_put_att (ncid,var_id,"missing_value",flag) )

        call hulk ( nf90_enddef (ncid) )
        call hulk ( nf90_put_var (ncid,lon_id,lon) )
        call hulk ( nf90_put_var (ncid,lat_id,lat) )
        call hulk ( nf90_put_var (ncid,z_id,  z) )
        call hulk ( nf90_put_var (ncid,t_id,  t) )
        call hulk ( nf90_put_var (ncid,var_id,var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing file ",filenm

End Subroutine wr_ncdf_4d
!---------------------------------------------------------------------------------
SUBROUTINE wr_ncdf_4d_apd (filenm,var,var_nm, nlon,nlat,nz,nt, &
                           var_long_name,var_unit, lon_nm, lat_nm, z_nm, t_nm,flag)
   character (len = *), intent (in) :: filenm, var_nm, var_long_name, var_unit
   character (len = *) :: lon_nm, lat_nm, z_nm, t_nm
   integer, parameter :: NDIMS = 4
   integer :: ncid, var_id, dims_id(NDIMS)
   integer, intent (in) :: nlon, nlat, nz, nt
   real, dimension (nlon,nlat,nz,nt), intent (in) :: var
   real, intent (in) :: flag

   print*,"   Writing append to netCDF file: ",filenm,"..."
   call hulk ( nf90_open (filenm, nf90_write, ncid) )
        call hulk ( nf90_inq_dimid (ncid, lon_nm, dims_id(1)) )
        call hulk ( nf90_inq_dimid (ncid, lat_nm, dims_id(2)) )
        call hulk ( nf90_inq_dimid (ncid, z_nm,   dims_id(3)) )
        call hulk ( nf90_inq_dimid (ncid, t_nm,   dims_id(4)) )
        call hulk ( nf90_redef (ncid) )
             call hulk ( nf90_def_var (ncid,var_nm,nf90_float,dims_id(1:4),var_id) )
             call hulk ( nf90_put_att (ncid, var_id, "long_name",trim(var_long_name)))  ! "What the hell (!@.@) !!!") )
             call hulk ( nf90_put_att (ncid, var_id, "units", trim(var_unit)))
             call hulk ( nf90_put_att (ncid, var_id, "missing_value", flag) )
        call hulk ( nf90_enddef (ncid) )
        call hulk ( nf90_put_var (ncid, var_id, var) )
   call hulk ( nf90_close (ncid) )
   print*,"   Completed writing append to file ",filenm

END SUBROUTINE wr_ncdf_4d_apd
!----------------------------------------------------------------------------------=@
