diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 15224d2a3d1296e89e80f007ba7b958410ea91d3..3c90ffc773b093f763c4916300b642b7917b93b3 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -532,7 +532,7 @@ END IF END SUBROUTINE IO_WRITE_HEADER_NC4 -SUBROUTINE IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,KVARID,KSHAPE,HCALENDAR,OISCOORD) +SUBROUTINE IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,KVARID,OEXISTED,KSHAPE,HCALENDAR,OISCOORD) ! USE MODD_CONF, ONLY: CPROGRAM, LCARTESIAN USE MODD_CONF_n, ONLY: CSTORAGE_TYPE @@ -542,6 +542,7 @@ USE MODE_FIELD, ONLY: TYPEINT, TYPEREAL TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD INTEGER(KIND=IDCDF_KIND), INTENT(IN) :: KVARID +LOGICAL, INTENT(IN) :: OEXISTED !True if variable was already defined INTEGER(KIND=IDCDF_KIND),DIMENSION(:),OPTIONAL,INTENT(IN) :: KSHAPE CHARACTER(LEN=*), OPTIONAL,INTENT(IN) :: HCALENDAR LOGICAL, OPTIONAL,INTENT(IN) :: OISCOORD ! Is a coordinate variable (->do not write coordinates attribute) @@ -668,10 +669,13 @@ IF(TPFIELD%NTYPE==TYPEINT .AND. TPFIELD%NDIMS>0) THEN 'interval for variable '//TRIM(TPFIELD%CMNHNAME)) ! ! Fillvalue (CF/COMODO convention) - !Remark: the attribute '_FillValue' is also recognized by the netCDF library - ! and is used when pre-filling a variable - STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%NFILLVALUE) - IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]') + ! Remarks: * the attribute '_FillValue' is also recognized by the netCDF library + ! and is used when pre-filling a variable + ! * it cannot be modified if some data has already been written (->check OEXISTED) + IF(.NOT.OEXISTED) THEN + STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%NFILLVALUE) + IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]') + END IF ! ! Valid_min/max (CF/COMODO convention) STATUS = NF90_PUT_ATT(INCID, KVARID,'valid_min', TPFIELD%NVALIDMIN) @@ -687,14 +691,17 @@ IF(TPFIELD%NTYPE==TYPEREAL .AND. TPFIELD%NDIMS>0) THEN 'interval for variable '//TRIM(TPFIELD%CMNHNAME)) ! ! Fillvalue (CF/COMODO convention) - !Remark: the attribute '_FillValue' is also recognized by the netCDF library - ! and is used when pre-filling a variable - IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN - STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', REAL(TPFIELD%XFILLVALUE,KIND=4)) - ELSE - STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%XFILLVALUE) + ! Remarks: * the attribute '_FillValue' is also recognized by the netCDF library + ! and is used when pre-filling a variable + ! * it cannot be modified if some data has already been written (->check OEXISTED) + IF(.NOT.OEXISTED) THEN + IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN + STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', REAL(TPFIELD%XFILLVALUE,KIND=4)) + ELSE + STATUS = NF90_PUT_ATT(INCID, KVARID,'_FillValue', TPFIELD%XFILLVALUE) + END IF + IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]') END IF - IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_ATTR_NC4 [NF90_PUT_ATT]') ! ! Valid_min/max (CF/COMODO convention) IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -911,13 +918,16 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -927,11 +937,12 @@ IF (STATUS /= NF90_NOERR) THEN STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVARID) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +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_X0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) @@ -953,13 +964,16 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -987,11 +1001,12 @@ IF (STATUS /= NF90_NOERR) THEN IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X1[NF90_DEF_VAR_DEFLATE]') END IF ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +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) @@ -1019,6 +1034,7 @@ INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP LOGICAL :: GSPLIT TYPE(TFILEDATA),POINTER :: TZFILE +LOGICAL :: GEXISTED !True if variable was already defined ! IRESP = 0 GSPLIT = .FALSE. @@ -1042,7 +1058,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X2',TRIM(TPFILE%CNAME)//': w ! ! Get the Netcdf file ID INCID = TZFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(YTMP,YVARNAME) ! The variable should not already exist but who knows ? @@ -1070,11 +1088,12 @@ IF (STATUS /= NF90_NOERR) THEN IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_DEF_VAR_DEFLATE]') END IF ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X2',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND),OISCOORD=OISCOORD) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND),OISCOORD=OISCOORD) ! Write the data 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(TPFIELD%CMNHNAME),IRESP) @@ -1096,6 +1115,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X3',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) @@ -1103,7 +1123,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X3',TRIM(TPFILE%CNAME)//': w IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1131,11 +1153,12 @@ IF (STATUS /= NF90_NOERR) THEN END IF IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X3[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X3',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) ! 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) @@ -1157,6 +1180,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X4',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) @@ -1164,7 +1188,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X4',TRIM(TPFILE%CNAME)//': w IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1192,11 +1218,12 @@ IF (STATUS /= NF90_NOERR) THEN END IF IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X4[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X4',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) ! 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) @@ -1218,6 +1245,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X5',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) @@ -1225,7 +1253,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X5',TRIM(TPFILE%CNAME)//': w IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1253,11 +1283,12 @@ IF (STATUS /= NF90_NOERR) THEN END IF IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X5',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) ! 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) @@ -1279,6 +1310,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X6',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) @@ -1286,7 +1318,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X6',TRIM(TPFILE%CNAME)//': w IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1314,11 +1348,12 @@ IF (STATUS /= NF90_NOERR) THEN END IF IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X6[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X6',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(PFIELD),KIND=IDCDF_KIND)) ! 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) @@ -1345,13 +1380,16 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_N0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1365,11 +1403,12 @@ IF (STATUS /= NF90_NOERR) THEN #endif IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N0[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_N0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +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_N0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) @@ -1414,13 +1453,16 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_N1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1443,11 +1485,12 @@ IF (STATUS /= NF90_NOERR) THEN #endif IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N1[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_N1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +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) @@ -1469,6 +1512,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! IRESP = 0 ! @@ -1476,7 +1520,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_N2',TRIM(TPFILE%CNAME)//': w ! ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1504,11 +1550,12 @@ IF (STATUS /= NF90_NOERR) THEN IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N2[NF90_DEF_VAR_DEFLATE]') END IF ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_N2',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(KFIELD),KIND=IDCDF_KIND)) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFIELD),KIND=IDCDF_KIND)) ! 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) @@ -1529,6 +1576,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! IRESP = 0 ! @@ -1536,7 +1584,9 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_N3',TRIM(TPFILE%CNAME)//': w ! ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1564,11 +1614,12 @@ IF (STATUS /= NF90_NOERR) THEN IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3[NF90_DEF_VAR_DEFLATE]') END IF ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_N3',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,KSHAPE=INT(SHAPE(KFIELD),KIND=IDCDF_KIND)) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED,KSHAPE=INT(SHAPE(KFIELD),KIND=IDCDF_KIND)) ! 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) @@ -1591,13 +1642,16 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_L0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1608,6 +1662,7 @@ IF (STATUS /= NF90_NOERR) THEN STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVARID) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF @@ -1619,7 +1674,7 @@ ELSE END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +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_L0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) @@ -1643,13 +1698,16 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(OFIELD))) :: IVDIMS INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_L1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! IRESP = 0 ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1669,6 +1727,7 @@ IF (STATUS /= NF90_NOERR) THEN STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF @@ -1680,7 +1739,7 @@ ELSEWHERE END WHERE ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +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) @@ -1705,6 +1764,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(1) :: IVDIMS INTEGER :: IRESP, ILEN CHARACTER(LEN=:),ALLOCATABLE :: YFIELD +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_C0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1718,7 +1778,9 @@ IF (ILEN==0) ILEN = IMULT ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1730,6 +1792,7 @@ IF (STATUS /= NF90_NOERR) THEN STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C0[NF90_DEF_VAR]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_C0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF @@ -1737,7 +1800,7 @@ ALLOCATE(CHARACTER(LEN=ILEN)::YFIELD) YFIELD(:)=TRIM(HFIELD) !Warning: keep (:) to prevent F2003 automatic reallocation YFIELD(LEN_TRIM(HFIELD)+1:)=' ' ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED) ! Write the data STATUS = NF90_PUT_VAR(INCID, IVARID, YFIELD) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) @@ -1762,6 +1825,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(2) :: IVDIMS INTEGER(KIND=IDCDF_KIND) :: ILEN, ISIZE INTEGER :: IRESP +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_C1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1772,7 +1836,9 @@ ISIZE = SIZE(HFIELD) ! Get the Netcdf file ID INCID = TPFILE%NNCID - +! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! The variable should not already exist but who knows ? @@ -1785,11 +1851,12 @@ IF (STATUS /= NF90_NOERR) THEN 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]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_C1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID) +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,IVARID,GEXISTED) ! Write the data 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) @@ -1816,6 +1883,7 @@ INTEGER :: IRESP INTEGER, DIMENSION(3) :: ITDATE ! date array TYPE(TFIELDDATA) :: TZFIELD CHARACTER(LEN=40) :: YUNITS +LOGICAL :: GEXISTED !True if variable was already defined ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME)) ! @@ -1830,6 +1898,8 @@ ITDATE(3)=TPDATA%TDATE%DAY ! Get the Netcdf file ID INCID = TPFILE%NNCID ! +GEXISTED = .FALSE. +! CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) ! TZFIELD%CMNHNAME = TRIM(YVARNAME) @@ -1843,11 +1913,12 @@ IF (STATUS /= NF90_NOERR) THEN 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]') ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)//' already defined') END IF ! Write metadata -CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TZFIELD,IVARID,HCALENDAR='standard') +CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TZFIELD,IVARID,GEXISTED,HCALENDAR='standard') ! 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) @@ -1877,7 +1948,7 @@ IF (STATUS /= NF90_NOERR) THEN ! 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(TPFILE,TZFIELD,IVARID) + CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TZFIELD,IVARID,GEXISTED) ELSE CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(TZFIELD%CMNHNAME)//' already defined') END IF @@ -1904,8 +1975,9 @@ 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(TPFILE,TZFIELD,IVARID) + CALL IO_WRITE_FIELD_ATTR_NC4(TPFILE,TZFIELD,IVARID,GEXISTED) ELSE + GEXISTED = .TRUE. CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_T0',TRIM(TPFILE%CNAME)//': '//TRIM(TZFIELD%CMNHNAME)//' already defined') END IF