From 9a7b5559c6ef705beb25fab02025b408ea55a9c3 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 23 Mar 2018 15:50:06 +0100
Subject: [PATCH] Philippe 23/03/2018: IO: add time coordinate variable + add
 LTIMEDEP field in TFIELDDATA (LTIMEDEP is only set for some test variables)

---
 src/LIB/SURCOUCHE/src/mode_field.f90  |   4 +
 src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 203 ++++++++++++++++++++++----
 2 files changed, 178 insertions(+), 29 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 3950453a2..01e357c51 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -75,6 +75,7 @@ TYPE TFIELDDATA
   INTEGER            :: NGRID     = -1 !Localization on the model grid
   INTEGER            :: NTYPE     = TYPEUNDEF !Datatype
   INTEGER            :: NDIMS     = 0  !Number of dimensions
+  LOGICAL            :: LTIMEDEP  = .FALSE. !Is the field time-dependent?
   !
 #if defined(MNH_IOCDF4)
   INTEGER            :: NFILLVALUE =  NF90_FILL_INT  !Fill value for integer fields
@@ -1078,6 +1079,7 @@ TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_U component of wind'
 TFIELDLIST(IDX)%NGRID      = 2
 TFIELDLIST(IDX)%NTYPE      = TYPEREAL
 TFIELDLIST(IDX)%NDIMS      = 3
+TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
 ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
 IDX = IDX+1
 !
@@ -1091,6 +1093,7 @@ TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_V component of wind'
 TFIELDLIST(IDX)%NGRID      = 3
 TFIELDLIST(IDX)%NTYPE      = TYPEREAL
 TFIELDLIST(IDX)%NDIMS      = 3
+TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
 ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
 IDX = IDX+1
 !
@@ -1104,6 +1107,7 @@ TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_vertical wind'
 TFIELDLIST(IDX)%NGRID      = 4
 TFIELDLIST(IDX)%NTYPE      = TYPEREAL
 TFIELDLIST(IDX)%NDIMS      = 3
+TFIELDLIST(IDX)%LTIMEDEP   = .TRUE.
 ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
 IDX = IDX+1
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 06005c38d..49f7fc09d 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -294,7 +294,11 @@ IF (TPFILE%LMASTER) THEN !vertical coordinates in the transformed space are the
     DEALLOCATE(ZZHATM)
   END IF
 END IF
-
+!
+!Write time scale
+IF (TPFILE%LMASTER) THEN
+  CALL WRITE_TIME_COORD(PIOCDF%DIMTIME)
+END IF
 
 CONTAINS
 SUBROUTINE WRITE_HOR_COORD(TDIM,HLONGNAME,HSTDNAME,HAXIS,PSHIFT,KBOUNDLOW,KBOUNDHIGH,PCOORDS)
@@ -516,6 +520,61 @@ SUBROUTINE WRITE_VER_COORD(TDIM,HLONGNAME,HSTDNAME,HCOMPNAME,PSHIFT,KBOUNDLOW,KB
 
 END SUBROUTINE WRITE_VER_COORD
 
+SUBROUTINE WRITE_TIME_COORD(TDIM)
+  USE MODD_TIME_n,     ONLY: TDTMOD, TDTCUR
+
+  USE MODE_FIELD,      ONLY: TFIELDLIST,FIND_FIELD_ID_FROM_MNHNAME
+  USE MODE_GRIDPROJ
+
+  USE MODI_TEMPORAL_DIST
+
+  TYPE(DIMCDF), POINTER, INTENT(IN) :: TDIM
+
+  REAL                         :: ZDELTATIME
+  CHARACTER(LEN=40)            :: YUNITS
+  CHARACTER(LEN=:),ALLOCATABLE :: YVARNAME
+  INTEGER(KIND=IDCDF_KIND)     :: IVARID
+  INTEGER(KIND=IDCDF_KIND)     :: IVDIM
+  INTEGER(KIND=IDCDF_KIND)     :: STATUS
+
+
+  IF (ASSOCIATED(TDTCUR) .AND. ASSOCIATED(TDTMOD)) THEN
+    YVARNAME = TRIM(TDIM%NAME)
+    IVDIM = TDIM%ID
+
+    STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
+    IF (STATUS /= NF90_NOERR) THEN
+      ! Define the coordinate variable
+      STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVDIM, IVARID)
+      IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_TIME_COORD[NF90_DEF_VAR]')
+    ELSE
+      CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_TIME_COORD',TRIM(YVARNAME)//' already defined')
+    END IF
+
+    ! Write metadata
+    STATUS = NF90_PUT_ATT(INCID, IVARID, 'long_name','time axis')
+    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    STATUS = NF90_PUT_ATT(INCID, IVARID, 'standard_name','time')
+    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    WRITE(YUNITS,'( "seconds since ",I4.4,"-",I2.2,"-",I2.2," 00:00:00 +0:00" )') &
+          TDTMOD%TDATE%YEAR,TDTMOD%TDATE%MONTH,TDTMOD%TDATE%DAY
+    STATUS = NF90_PUT_ATT(INCID, IVARID, 'units',YUNITS)
+    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    STATUS = NF90_PUT_ATT(INCID, IVARID, 'axis','T')
+    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+    STATUS = NF90_PUT_ATT(INCID, IVARID,'calendar','standard')
+    IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]')
+
+    ! Write the data
+    CALL TEMPORAL_DIST(TDTCUR%TDATE%YEAR, TDTCUR%TDATE%MONTH, TDTCUR%TDATE%DAY, TDTCUR%TIME, &
+                       TDTMOD%TDATE%YEAR, TDTMOD%TDATE%MONTH, TDTMOD%TDATE%DAY, 0.,          &
+                       ZDELTATIME                                                            )
+    STATUS = NF90_PUT_VAR(INCID, IVARID, ZDELTATIME)
+    IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITE_NC_COORDS_VAR[NF90_PUT_VAR] '//TRIM(YVARNAME))
+  END IF
+
+END SUBROUTINE WRITE_TIME_COORD
+
 END SUBROUTINE IO_WRITE_COORDVAR_NC4
 
 
@@ -892,11 +951,12 @@ GETSTRDIMID = TMP%ID
 
 END FUNCTION GETSTRDIMID
 
+
 SUBROUTINE FILLVDIMS(TPFILE, TPFIELD, KSHAPE, KVDIMS)
 TYPE(TFILEDATA),                      INTENT(IN)  :: TPFILE
 TYPE(TFIELDDATA),                     INTENT(IN)  :: TPFIELD
 INTEGER(KIND=IDCDF_KIND),DIMENSION(:),INTENT(IN)  :: KSHAPE
-INTEGER(KIND=IDCDF_KIND),DIMENSION(:),INTENT(OUT) :: KVDIMS
+INTEGER(KIND=IDCDF_KIND),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KVDIMS
 !
 INTEGER               :: IGRID
 INTEGER               :: JI
@@ -917,6 +977,14 @@ IF(SIZE(KSHAPE)/=TPFIELD%NDIMS) THEN
                  //TRIM(TPFIELD%CMNHNAME))
 END IF
 !
+IF (TPFIELD%LTIMEDEP) THEN
+  !Add time dimension
+  ALLOCATE(KVDIMS(TPFIELD%NDIMS+1))
+  KVDIMS(TPFIELD%NDIMS+1) = TPFILE%TNCDIMS%DIMTIME%ID
+ELSE
+  ALLOCATE(KVDIMS(TPFIELD%NDIMS))
+END IF
+!
 IF(IGRID<0 .OR. IGRID>8) THEN
   WRITE(YINT,'( I0 )') IGRID
   CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','invalid NGRID ('//TRIM(YINT)//') for field '//TRIM(TPFIELD%CMNHNAME))
@@ -1133,7 +1201,11 @@ INCID = TPFILE%NNCID
 GEXISTED = .FALSE.
 !
 CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
-
+!
+IF (TPFIELD%LTIMEDEP) &
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X0',TRIM(TPFILE%CNAME)// &
+                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
+!
 ! The variable should not already exist but who knows ?
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
@@ -1166,7 +1238,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1214,7 +1286,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X1
 
@@ -1234,7 +1308,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=4)         :: YSUFFIX
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 TYPE(TFIELDDATA)         :: TZFIELD
 TYPE(TFILEDATA),POINTER  :: TZFILE
@@ -1304,6 +1378,8 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TZFILE,TZFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFI
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_PUT_VAR] '//TRIM(TZFIELD%CMNHNAME),IRESP)
  
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X2
 
@@ -1319,7 +1395,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1368,7 +1444,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFI
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X3[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X3
 
@@ -1384,7 +1462,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1433,7 +1511,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFI
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X4[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X4
 
@@ -1449,7 +1529,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1498,7 +1578,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFI
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X5
 
@@ -1514,7 +1596,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1563,7 +1645,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFI
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X6[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_X6
 
@@ -1597,7 +1681,11 @@ INCID = TPFILE%NNCID
 GEXISTED = .FALSE.
 !
 CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
-
+!
+IF (TPFIELD%LTIMEDEP) &
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_N0',TRIM(TPFILE%CNAME)// &
+                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
+!
 ! The variable should not already exist but who knows ?
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
@@ -1657,7 +1745,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1700,7 +1788,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_N1
 
@@ -1716,7 +1806,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1765,7 +1855,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFI
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N2[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_N2
 
@@ -1780,7 +1872,7 @@ INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMS
 INTEGER                  :: IRESP
 LOGICAL                  :: GEXISTED !True if variable was already defined
 !
@@ -1829,7 +1921,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFI
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, KFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_N3
 
@@ -1859,7 +1953,11 @@ INCID = TPFILE%NNCID
 GEXISTED = .FALSE.
 !
 CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
-
+!
+IF (TPFIELD%LTIMEDEP) &
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L0',TRIM(TPFILE%CNAME)// &
+                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
+!
 ! The variable should not already exist but who knows ?
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
@@ -1902,7 +2000,7 @@ INTEGER(KIND=IDCDF_KIND)                                 :: STATUS
 INTEGER(KIND=IDCDF_KIND)                                 :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))                     :: YVARNAME
 INTEGER(KIND=IDCDF_KIND)                                 :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(OFIELD))) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE      :: IVDIMS
 INTEGER                                                  :: IRESP
 LOGICAL                                                  :: GEXISTED !True if variable was already defined
 !
@@ -1949,7 +2047,9 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 ! Write the data
 STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
- 
+
+DEALLOCATE(IVDIMS)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_L1
 
@@ -1973,7 +2073,6 @@ LOGICAL                                :: GEXISTED !True if variable was already
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_C0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
 IRESP = 0
-
 !Store the character string in a string of a size multiple of NSTRINGCHUNKSIZE
 !This is done to limit the number of dimensions in the netCDF file
 ILEN = ((LEN_TRIM(HFIELD)+NSTRINGCHUNKSIZE-1)/NSTRINGCHUNKSIZE)*NSTRINGCHUNKSIZE
@@ -1986,7 +2085,11 @@ INCID = TPFILE%NNCID
 GEXISTED = .FALSE.
 !
 CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
-
+!
+IF (TPFIELD%LTIMEDEP) &
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_C0',TRIM(TPFILE%CNAME)// &
+                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
+!
 ! The variable should not already exist but who knows ?
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
@@ -2027,6 +2130,7 @@ INTEGER(KIND=IDCDF_KIND)               :: INCID
 CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))   :: YVARNAME
 INTEGER(KIND=IDCDF_KIND)               :: IVARID
 INTEGER(KIND=IDCDF_KIND), DIMENSION(2) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(:), ALLOCATABLE :: IVDIMSTMP
 INTEGER(KIND=IDCDF_KIND)               :: ILEN, ISIZE
 INTEGER                                :: IRESP
 LOGICAL                                :: GEXISTED !True if variable was already defined
@@ -2044,13 +2148,21 @@ INCID = TPFILE%NNCID
 GEXISTED = .FALSE.
 !
 CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
-
+!
+IF (TPFIELD%LTIMEDEP) THEN
+  !This is an error (+return) and not a warning because IVDIMSTMP could be of size 2 if LTIMEDEP=T
+  CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELD_NC4_C1',TRIM(TPFILE%CNAME)// &
+                 ': time dependent variable not (yet) possible for '//TRIM(TPFIELD%CMNHNAME))
+  RETURN
+END IF
+!
 ! The variable should not already exist but who knows ?
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
    ! Get the netcdf string dimensions id 
    IVDIMS(1) = GETSTRDIMID(TPFILE,ILEN)
-   CALL FILLVDIMS(TPFILE, TPFIELD, (/ISIZE/), IVDIMS(2:2))
+   CALL FILLVDIMS(TPFILE, TPFIELD, (/ISIZE/), IVDIMSTMP)
+   IVDIMS(2) = IVDIMSTMP(1)
    ! Define the variable 
    STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID)
    IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C1[NF90_DEF_VAR]')
@@ -2065,6 +2177,8 @@ CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED)
 STATUS = NF90_PUT_VAR(INCID, IVARID, HFIELD(1:ISIZE)(1:ILEN), START=(/IONE,IONE/), COUNT=(/ILEN,ISIZE/))
 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
 
+DEALLOCATE(IVDIMSTMP)
+
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_C1
 
@@ -2109,7 +2223,11 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
 TZFIELD%CMNHNAME = TRIM(YVARNAME)
 WRITE(YUNITS,'( "seconds since ",I4.4,"-",I2.2,"-",I2.2," 00:00:00 +0:00" )') ITDATE(1),ITDATE(2),ITDATE(3)
 TZFIELD%CUNITS = TRIM(YUNITS)
-
+!
+IF (TPFIELD%LTIMEDEP) &
+  CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)// &
+                 ': time dependent variable not (yet) possible for 0D variable '//TRIM(TPFIELD%CMNHNAME))
+!
 ! The variable should not already exist but who knows ?
 STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
 IF (STATUS /= NF90_NOERR) THEN
@@ -2478,6 +2596,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 IF (IDIMS == 1 .AND. ITYPE == NF90_DOUBLE) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
@@ -2542,6 +2663,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X2[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 !Treat special case of a degenerated 3D array (3rd dimension size is 1)
 IF (IDIMS==3) THEN
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
@@ -2621,6 +2745,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X3[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 IF (IDIMS == 3 .AND. ITYPE == NF90_DOUBLE) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
@@ -2689,6 +2816,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X4[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 IF (IDIMS == 4 .AND. ITYPE == NF90_DOUBLE) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
@@ -2760,6 +2890,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X5[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 IF (IDIMS == 5 .AND. ITYPE == NF90_DOUBLE) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
@@ -2834,6 +2967,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_X6[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 IF (IDIMS == 6 .AND. ITYPE == NF90_DOUBLE) THEN
   ! Check size of variable before reading
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN(1))
@@ -2967,6 +3103,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_N1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 !NF90_INT1 is for the case a boolean was written
 #if ( MNH_INT == 4 )
 IF (IDIMS == 1 .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT1) ) THEN
@@ -3036,6 +3175,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_N2[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 !Treat special case of a degenerated 3D array (3rd dimension size is 1)
 IF (IDIMS==3) THEN
   STATUS = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(3), LEN=IDIMLEN(3))
@@ -3188,6 +3330,9 @@ END IF
 STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
 IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'IO_READ_FIELD_NC4_L1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME))
 
+!Neglect the time dimension (of size 1)
+IF (TPFIELD%LTIMEDEP) IDIMS=IDIMS-1
+
 !NF90_INT1 is for the case a boolean was written
 !Accept also INT and INT64 (for backward compatibility)
 IF (IDIMS == 1 .AND. (ITYPE == NF90_INT1 .OR. ITYPE == NF90_INT .OR. ITYPE == NF90_INT64)  ) THEN
-- 
GitLab