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