From 80bbbb8362a4687f2f5f7aec70a7a799648f0e44 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 5 Jan 2017 14:40:55 +0100 Subject: [PATCH] Philippe 05/01/2017: IO: * ignore variables of zero-size * complete strings with spaces if necessary * read correctly the strings * typo corrections --- src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 51 ++++++++++++++++----------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 8beac9810..d38186aa8 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -577,7 +577,7 @@ IF (PRESENT(KVERTLEVEL)) THEN !PW: TODO: try to not do a find (for better perf) CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE,IRESP) IF (IRESP/=0) THEN - PRINT *,'FATAL: IO_FILE_OPEN_ll: file ',TRIM(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER),' not found in list' + PRINT *,'FATAL: IO_WRITE_FIELD_NC4_X2: file ',TRIM(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER),' not found in list' STOP END IF ELSE @@ -594,6 +594,11 @@ YVARNAME = str_replace(YVARNAME, '.', '--') ! The variable should not already exist but who knows ? STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) IF (STATUS /= NF90_NOERR) THEN + IF (SIZE(PFIELD)==0) THEN + PRINT *,'WARNING: IO_WRITE_FIELD_NC4_X2: ignoring variable with a zero size (',TRIM(YVARNAME),')' + RETURN + END IF + ! Get the netcdf dimensions CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) @@ -694,6 +699,11 @@ YVARNAME = str_replace(YVARNAME, '.', '--') ! The variable should not already exist but who knows ? STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) IF (STATUS /= NF90_NOERR) THEN + IF (SIZE(PFIELD)==0) THEN + PRINT *,'WARNING: IO_WRITE_FIELD_NC4_X3: ignoring variable with a zero size (',TRIM(YVARNAME),')' + RETURN + END IF + ! Get the netcdf dimensions CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) @@ -1151,6 +1161,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(1) :: IVDIMS INTEGER :: IRESP, ILEN +CHARACTER(LEN=:),ALLOCATABLE :: YFIELD ! IRESP = 0 @@ -1178,12 +1189,16 @@ IF (STATUS /= NF90_NOERR) THEN IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C0[NF90_DEF_VAR]') CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID) ELSE - PRINT *,'IO_WRITE_FIELD_NC4_N0: ', TRIM(YVARNAME), ' already defined !' + PRINT *,'IO_WRITE_FIELD_NC4_C0: ', TRIM(YVARNAME), ' already defined !' END IF +ALLOCATE(CHARACTER(LEN=ILEN)::YFIELD) +YFIELD(:)=TRIM(HFIELD) !Warning: keep (:) to prevent F2003 automatic reallocation +YFIELD(LEN_TRIM(HFIELD)+1:)=' ' ! Write the data -STATUS = NF90_PUT_VAR(INCID, IVARID, HFIELD) +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) +DEALLOCATE(YFIELD) KRESP = IRESP END SUBROUTINE IO_WRITE_FIELD_NC4_C0 @@ -1936,8 +1951,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND),DIMENSION(1) :: IVDIMS -CHARACTER(LEN=32) :: YSTR -!CHARACTER(LEN=LEN(HFIELD)) :: YSTR +CHARACTER(LEN=:),ALLOCATABLE :: YSTR INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER(KIND=IDCDF_KIND) :: IDIMLEN INTEGER :: II @@ -1962,22 +1976,19 @@ IF (IDIMS == 1 .AND. ITYPE == NF90_CHAR) THEN ! Check size of variable before reading STATUS = NF90_INQUIRE_DIMENSION(KNCID, IVDIMS(1), LEN=IDIMLEN) IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME)) - - IF (IDIMLEN <= LEN(YSTR)) THEN - ! Read variable - STATUS = NF90_GET_VAR(KNCID, IVARID, YSTR) - IF (STATUS /= NF90_NOERR) THEN - CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP) - GOTO 1000 - END IF - IF (LEN_TRIM(YSTR) > LEN(HFIELD)) PRINT *, 'NCDREADC0 : '//TRIM(YVARNAME)//' truncated !!' - HFIELD = TRIM(YSTR) - ! Read variables attributes (GRID and COMMENT) - CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) - ELSE - PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong size).' - IRESP = -3 + ! + ALLOCATE(CHARACTER(LEN=IDIMLEN)::YSTR) + ! Read variable + STATUS = NF90_GET_VAR(KNCID, IVARID, YSTR) + IF (STATUS /= NF90_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP) + GOTO 1000 END IF + IF (LEN_TRIM(YSTR) > LEN(HFIELD)) PRINT *, 'NCDREADC0 : '//TRIM(YVARNAME)//' truncated !!' + HFIELD = TRIM(YSTR) + DEALLOCATE(YSTR) + ! Read variables attributes (GRID and COMMENT) + CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH) ELSE PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' IRESP = -3 -- GitLab