diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 index d811f475f88d6bfe3d0a22511f1763a44df1f35d..efe4e6f6776c742f5831883bd4ab76cb86570ca3 100644 --- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 +++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 @@ -267,8 +267,9 @@ PRIVATE INTERFACE IO_WRITE_FIELD_LFI MODULE PROCEDURE IO_WRITE_FIELD_LFI_X0,IO_WRITE_FIELD_LFI_X1, & IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, & - IO_WRITE_FIELD_LFI_N0, & - IO_WRITE_FIELD_LFI_C0 + IO_WRITE_FIELD_LFI_N0, & + IO_WRITE_FIELD_LFI_C0, & + IO_WRITE_FIELD_LFI_T0 END INTERFACE IO_WRITE_FIELD_LFI ! PUBLIC IO_WRITE_FIELD_LFI @@ -495,6 +496,73 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) ! END SUBROUTINE IO_WRITE_FIELD_LFI_C0 ! +SUBROUTINE IO_WRITE_FIELD_LFI_T0(TPFIELD,KFLU,TPDATA,KRESP) +! +USE MODD_TYPE_DATE +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +TYPE (DATE_TIME), INTENT(IN) :: TPDATA ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised +! +!* 0.2 Declarations of local variables +! +INTEGER :: ILENG +INTEGER(kind=LFI_INT) :: IRESP, ITOTAL +TYPE(TFIELDDATA) :: TZFIELD +INTEGER, DIMENSION(3) :: ITDATE ! date array +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_LFI_T0','writing '//TRIM(TPFIELD%CMNHNAME)) +! +TZFIELD = TPFIELD +! +! Write date +! +TZFIELD%CMNHNAME = TRIM(TPFIELD%CMNHNAME)//'%TDATE' +TZFIELD%CCOMMENT = 'YYYYMMDD' +ITDATE(1)=TPDATA%TDATE%YEAR +ITDATE(2)=TPDATA%TDATE%MONTH +ITDATE(3)=TPDATA%TDATE%DAY +ILENG=SIZE(ITDATE) +! +CALL WRITE_PREPARE(TZFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + IWORK(LEN_TRIM(TZFIELD%CCOMMENT)+3:)=ITDATE(:) + CALL LFIECR(IRESP,KFLU,TRIM(TZFIELD%CMNHNAME),IWORK,ITOTAL) +ENDIF +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +IF (IRESP/=0) THEN + KRESP = IRESP + RETURN +END IF +! +! Write time +! +TZFIELD%CMNHNAME = TRIM(TPFIELD%CMNHNAME)//'%TIME' +TZFIELD%CCOMMENT = 'SECONDS' +ILENG=1 +! +CALL WRITE_PREPARE(TZFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + CALL TRANSFW(IWORK(LEN_TRIM(TZFIELD%CCOMMENT)+3),TPDATA%TIME,ILENG) + CALL LFIECR(IRESP,KFLU,TRIM(TZFIELD%CMNHNAME),IWORK,ITOTAL) +ENDIF +! +KRESP=IRESP +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +END SUBROUTINE IO_WRITE_FIELD_LFI_T0 +! SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP) ! TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index a34f402a91a202552c0b5686d167ec9f54fcc1c6..e66e745ee8fc38a1e68f23d6df5be349c0c45b93 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -184,11 +184,13 @@ MODULE MODE_FMWRIT IO_WRITE_FIELD_BYNAME_N0, & IO_WRITE_FIELD_BYNAME_L0, & IO_WRITE_FIELD_BYNAME_C0, & + IO_WRITE_FIELD_BYNAME_T0, & IO_WRITE_FIELD_BYFIELD_X0,IO_WRITE_FIELD_BYFIELD_X1, & IO_WRITE_FIELD_BYFIELD_X2,IO_WRITE_FIELD_BYFIELD_X3, & IO_WRITE_FIELD_BYFIELD_N0, & IO_WRITE_FIELD_BYFIELD_L0, & - IO_WRITE_FIELD_BYFIELD_C0 + IO_WRITE_FIELD_BYFIELD_C0, & + IO_WRITE_FIELD_BYFIELD_T0 END INTERFACE INTERFACE FMWRIT @@ -2920,6 +2922,82 @@ CONTAINS KRESP = IRESP END SUBROUTINE FMWRITT0_ll + SUBROUTINE IO_WRITE_FIELD_BYNAME_T0(TPFILE,HNAME,HFIPRI,KRESP,TFIELD) + ! + USE MODD_IO_ll, ONLY : TFILEDATA + ! + !* 0.1 Declarations of arguments + ! + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + CHARACTER(LEN=*), INTENT(IN) :: HNAME ! name of the field to write + CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! output file for error messages + INTEGER, INTENT(OUT):: KRESP ! return-code + TYPE (DATE_TIME), INTENT(IN) :: TFIELD ! array containing the data field + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: ID ! Index of the field + ! + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_T0','writing '//TRIM(HNAME)) + ! + CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP) + ! + IF(KRESP==0) CALL IO_WRITE_FIELD(TPFILE,TFIELDLIST(ID),HFIPRI,KRESP,TFIELD) + ! + END SUBROUTINE IO_WRITE_FIELD_BYNAME_T0 + + SUBROUTINE IO_WRITE_FIELD_BYFIELD_T0(TPFILE,TPFIELD,HFIPRI,KRESP,TFIELD) + USE MODD_IO_ll + USE MODD_FM + USE MODD_TYPE_DATE + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + !* 0. DECLARATIONS + ! ------------ + ! + ! + !* 0.1 Declarations of arguments + ! + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! output file for error messages + INTEGER, INTENT(OUT):: KRESP ! return-code + TYPE (DATE_TIME), INTENT(IN) :: TFIELD ! array containing the data field + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + ! + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_T0','writing '//TRIM(TPFIELD%CMNHNAME)) + ! + IRESP = 0 + ! + !------------------------------------------------------------------ + TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi') + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,TFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TFIELD,IRESP) + ELSE + IF (ISP == TZFD%OWNER) THEN + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,TFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TFIELD,IRESP) + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_T0",TPFILE%CNAME,HFIPRI,TPFIELD%CMNHNAME,TPFIELD%CDIR,TPFIELD%NGRID,& + LEN(TPFIELD%CCOMMENT) ,IRESP) + END IF + KRESP = IRESP + END SUBROUTINE IO_WRITE_FIELD_BYFIELD_T0 + SUBROUTINE FMWRIT_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,& & KGRID,KLENCH,HCOMMENT,KRESP) USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L2D diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index df87dded9351d1d11a6458326ac9a5c1a1382d13..c7c36018f5768767980ec97d24198aea3446cb8e 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -7,12 +7,13 @@ MODULE MODE_FIELD USE MODD_CONF, ONLY : CPROGRAM USE MODD_IO_ll, ONLY : NVERB_DEBUG,NVERB_INFO,NVERB_WARNING,NVERB_ERROR,NVERB_FATAL USE MODD_PARAMETERS +USE MODD_TYPE_DATE USE MODE_MSG ! IMPLICIT NONE ! INTEGER,PRIVATE,PARAMETER :: MAXFIELDS = 100 -INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4 +INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5 ! TYPE TFIELDPTR_L0D LOGICAL, POINTER :: DATA => NULL() @@ -34,12 +35,16 @@ TYPE TFIELDPTR_X3D REAL,DIMENSION(:,:,:),POINTER :: DATA => NULL() END TYPE TFIELDPTR_X3D ! +TYPE TFIELDPTR_T0D + TYPE(DATE_TIME), POINTER :: DATA => NULL() +END TYPE TFIELDPTR_T0D +! !Structure describing the characteristics of a field TYPE TFIELDDATA CHARACTER(LEN=NMNHNAMELGTMAX) :: CMNHNAME = '' !Name of the field (for MesoNH, non CF convention) CHARACTER(LEN=32) :: CSTDNAME = '' !Standard name (CF convention) CHARACTER(LEN=32) :: CLONGNAME = '' !Long name (CF convention) - CHARACTER(LEN=32) :: CUNITS = '' !Canonical units (CF convention) + CHARACTER(LEN=40) :: CUNITS = '' !Canonical units (CF convention) CHARACTER(LEN=2) :: CDIR = '' !Type of the data field (XX,XY,--...) CHARACTER(LEN=100) :: CCOMMENT = '' !Comment (for MesoNH, non CF convention) INTEGER :: NGRID = -1 !Localization on the model grid @@ -52,6 +57,8 @@ TYPE TFIELDDATA TYPE(TFIELDPTR_X1D),DIMENSION(:),ALLOCATABLE :: TFIELD_X1D !Pointer to the real 1D fields (one per nested mesh) TYPE(TFIELDPTR_X2D),DIMENSION(:),ALLOCATABLE :: TFIELD_X2D !Pointer to the real 2D fields (one per nested mesh) TYPE(TFIELDPTR_X3D),DIMENSION(:),ALLOCATABLE :: TFIELD_X3D !Pointer to the real 3D fields (one per nested mesh) + ! + TYPE(TFIELDPTR_T0D),DIMENSION(:),ALLOCATABLE :: TFIELD_T0D !Pointer to the scalar date/time fields (one per nested mesh) END TYPE TFIELDDATA ! LOGICAL,SAVE :: LFIELDLIST_ISINIT = .FALSE. diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index d39cc750e9566f912c4d8e5c864114855e468c1a..81c3a139612576693cd28c6f5da4b2fc2a113f84 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -25,8 +25,9 @@ INTEGER(KIND=IDCDF_KIND),PARAMETER :: DEFLATE = 1 INTERFACE IO_WRITE_FIELD_NC4 MODULE PROCEDURE IO_WRITE_FIELD_NC4_X0,IO_WRITE_FIELD_NC4_X1, & IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, & - IO_WRITE_FIELD_NC4_N0, & - IO_WRITE_FIELD_NC4_C0 + IO_WRITE_FIELD_NC4_N0, & + IO_WRITE_FIELD_NC4_C0, & + IO_WRITE_FIELD_NC4_T0 END INTERFACE IO_WRITE_FIELD_NC4 INTERFACE NCWRIT @@ -201,11 +202,12 @@ IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITATTR [NF90_PUT_AT END SUBROUTINE WRITATTR -SUBROUTINE IO_WRITE_FIELD_ATTR_NC4(TPFIELD,KNCID,KVARID) +SUBROUTINE IO_WRITE_FIELD_ATTR_NC4(TPFIELD,KNCID,KVARID,HCALENDAR) ! -TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD -INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KNCID -INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KVARID +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER(KIND=IDCDF_KIND), INTENT(IN) :: KNCID +INTEGER(KIND=IDCDF_KIND), INTENT(IN) :: KVARID +CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HCALENDAR ! INTEGER(KIND=IDCDF_KIND) :: STATUS ! @@ -256,6 +258,13 @@ ELSE IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_ATTR_NC4 [NF90_PUT_ATT]') ENDIF ! +! Calendar (CF convention) +IF(PRESENT(HCALENDAR)) THEN + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_ATTR_NC4','CALENDAR provided for variable '//TRIM(TPFIELD%CMNHNAME)) + STATUS = NF90_PUT_ATT(KNCID, KVARID,'calendar', TRIM(HCALENDAR)) + IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_ATTR_NC4 [NF90_PUT_ATT]') +ENDIF +! END SUBROUTINE IO_WRITE_FIELD_ATTR_NC4 FUNCTION GETDIMCDF(PIOCDF, KLEN, HDIMNAME) @@ -459,9 +468,6 @@ END SUBROUTINE NCWRITX0 SUBROUTINE IO_WRITE_FIELD_NC4_X0(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP) ! -USE MODD_FM, ONLY : FMHEADER -USE MODD_PARAMETERS_ll, ONLY : JPVEXT -! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(IOCDF), POINTER :: PZCDF @@ -549,9 +555,6 @@ END SUBROUTINE NCWRITX1 SUBROUTINE IO_WRITE_FIELD_NC4_X1(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP) ! -USE MODD_FM, ONLY : FMHEADER -USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME -! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(IOCDF), POINTER :: PZCDF @@ -657,7 +660,6 @@ END SUBROUTINE NCWRITX2 SUBROUTINE IO_WRITE_FIELD_NC4_X2(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP,KVERTLEVEL,KZFILE) ! -USE MODD_FM, ONLY : FMHEADER USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME ! TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE @@ -790,8 +792,6 @@ END SUBROUTINE NCWRITX3 SUBROUTINE IO_WRITE_FIELD_NC4_X3(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP) ! -USE MODD_FM, ONLY : FMHEADER -! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(IOCDF), POINTER :: PZCDF @@ -1050,7 +1050,6 @@ END SUBROUTINE NCWRITN0 SUBROUTINE IO_WRITE_FIELD_NC4_N0(TPFILE,TPFIELD,PZCDF,KFIELD,KRESP) ! -USE MODD_FM, ONLY : FMHEADER USE MODD_PARAMETERS_ll, ONLY : JPVEXT #if 0 USE MODD_PARAMETERS_ll, ONLY : JPHEXT, JPVEXT @@ -1267,8 +1266,6 @@ END SUBROUTINE NCWRITC0 SUBROUTINE IO_WRITE_FIELD_NC4_C0(TPFILE,TPFIELD,PZCDF,HFIELD,KRESP) ! -USE MODD_FM, ONLY : FMHEADER -! TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(IOCDF), POINTER :: PZCDF @@ -1378,6 +1375,126 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC1[NF90_PUT_VAR KRESP = IRESP END SUBROUTINE NCWRITC1 +SUBROUTINE IO_WRITE_FIELD_NC4_T0(TPFILE,TPFIELD,PZCDF,TPDATA,KRESP) +! +USE MODD_TYPE_DATE +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +TYPE(IOCDF), POINTER :: PZCDF +TYPE (DATE_TIME), INTENT(IN) :: TPDATA +INTEGER, INTENT(OUT):: KRESP +! +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(1) :: IVDIMS +INTEGER :: IRESP +INTEGER, DIMENSION(3) :: ITDATE ! date array +TYPE(TFIELDDATA) :: TZFIELD +CHARACTER(LEN=40) :: YUNITS +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_T0','writing '//TRIM(TPFIELD%CMNHNAME)) +! +IRESP = 0 +! +TZFIELD = TPFIELD +! +ITDATE(1)=TPDATA%TDATE%YEAR +ITDATE(2)=TPDATA%TDATE%MONTH +ITDATE(3)=TPDATA%TDATE%DAY +! +! Get the Netcdf file ID +INCID = TPFILE%NNCID +! +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(TRIM(TPFIELD%CMNHNAME), '%', '__') +YVARNAME = str_replace(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) + +! The variable should not already exist but who knows ? +STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF90_NOERR) THEN + ! Define the scalar variable + STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TZFIELD,INCID,IVARID,HCALENDAR='standard') +ELSE + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(YVARNAME)//' already defined') +END IF + +! Write the data +STATUS = NF90_PUT_VAR(INCID, IVARID, TPDATA%TIME) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) + +IF (IRESP/=0) THEN + KRESP = IRESP + RETURN +END IF + +#if 1 +!This part is to keep backward compatibility with MesoNH files +!but date/time is not conform to CF convention +! +! Write date +! +TZFIELD%CMNHNAME = TRIM(YVARNAME)//'__TDATE' +TZFIELD%CLONGNAME = TRIM(TPFIELD%CLONGNAME)//'%TDATE' +TZFIELD%CUNITS = '' +TZFIELD%CCOMMENT = 'YYYYMMDD' + +! The variable should not already exist but who knows ? +STATUS = NF90_INQ_VARID(INCID, TZFIELD%CMNHNAME, IVARID) +IF (STATUS /= NF90_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, INT(SHAPE(ITDATE),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + + ! Define the variable + STATUS = NF90_DEF_VAR(INCID, TZFIELD%CMNHNAME, NF90_INT, IVDIMS, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TZFIELD,INCID,IVARID) +ELSE + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TZFIELD%CMNHNAME)//' already defined') +END IF + +! Write the data +STATUS = NF90_PUT_VAR(INCID, IVARID, ITDATE) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_PUT_VAR] '//TRIM(TZFIELD%CMNHNAME),IRESP) + +IF (IRESP/=0) THEN + KRESP = IRESP + RETURN +END IF +! +! Write time +! +TZFIELD%CMNHNAME = TRIM(YVARNAME)//'__TIME' +TZFIELD%CLONGNAME = TRIM(TPFIELD%CLONGNAME)//'%TIME' +TZFIELD%CUNITS = 's' +TZFIELD%CCOMMENT = 'SECONDS' + +! The variable should not already exist but who knows ? +STATUS = NF90_INQ_VARID(INCID, TZFIELD%CMNHNAME, IVARID) +IF (STATUS /= NF90_NOERR) THEN + ! Define the scalar variable + STATUS = NF90_DEF_VAR(INCID, TZFIELD%CMNHNAME, NF90_DOUBLE, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TZFIELD,INCID,IVARID) +ELSE + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TZFIELD%CMNHNAME)//' already defined') +END IF + +! Write the data +STATUS = NF90_PUT_VAR(INCID, IVARID, TPDATA%TIME) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_T0[NF90_PUT_VAR] '//TRIM(TZFIELD%CMNHNAME),IRESP) +#endif + +KRESP = IRESP +END SUBROUTINE IO_WRITE_FIELD_NC4_T0 ! ! ! Here come the NetCDF READ routines