Skip to content
Snippets Groups Projects
Commit 80bbbb83 authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 05/01/2017: IO:

* ignore variables of zero-size
* complete strings with spaces if necessary
* read correctly the strings
* typo corrections
parent 99e84c76
No related branches found
No related tags found
No related merge requests found
...@@ -577,7 +577,7 @@ IF (PRESENT(KVERTLEVEL)) THEN ...@@ -577,7 +577,7 @@ IF (PRESENT(KVERTLEVEL)) THEN
!PW: TODO: try to not do a find (for better perf) !PW: TODO: try to not do a find (for better perf)
CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE,IRESP) CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//'.Z'//YNUMBER,TZFILE,IRESP)
IF (IRESP/=0) THEN 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 STOP
END IF END IF
ELSE ELSE
...@@ -594,6 +594,11 @@ YVARNAME = str_replace(YVARNAME, '.', '--') ...@@ -594,6 +594,11 @@ YVARNAME = str_replace(YVARNAME, '.', '--')
! The variable should not already exist but who knows ? ! The variable should not already exist but who knows ?
STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
IF (STATUS /= NF90_NOERR) THEN 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 ! Get the netcdf dimensions
CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS)
...@@ -694,6 +699,11 @@ YVARNAME = str_replace(YVARNAME, '.', '--') ...@@ -694,6 +699,11 @@ YVARNAME = str_replace(YVARNAME, '.', '--')
! The variable should not already exist but who knows ? ! The variable should not already exist but who knows ?
STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
IF (STATUS /= NF90_NOERR) THEN 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 ! Get the netcdf dimensions
CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS)
...@@ -1151,6 +1161,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME ...@@ -1151,6 +1161,7 @@ CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: IVARID
INTEGER(KIND=IDCDF_KIND), DIMENSION(1) :: IVDIMS INTEGER(KIND=IDCDF_KIND), DIMENSION(1) :: IVDIMS
INTEGER :: IRESP, ILEN INTEGER :: IRESP, ILEN
CHARACTER(LEN=:),ALLOCATABLE :: YFIELD
! !
IRESP = 0 IRESP = 0
...@@ -1178,12 +1189,16 @@ IF (STATUS /= NF90_NOERR) THEN ...@@ -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]') 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) CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID)
ELSE ELSE
PRINT *,'IO_WRITE_FIELD_NC4_N0: ', TRIM(YVARNAME), ' already defined !' PRINT *,'IO_WRITE_FIELD_NC4_C0: ', TRIM(YVARNAME), ' already defined !'
END IF 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 ! 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) 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 KRESP = IRESP
END SUBROUTINE IO_WRITE_FIELD_NC4_C0 END SUBROUTINE IO_WRITE_FIELD_NC4_C0
...@@ -1936,8 +1951,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID ...@@ -1936,8 +1951,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID
INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type
INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions
INTEGER(KIND=IDCDF_KIND),DIMENSION(1) :: IVDIMS INTEGER(KIND=IDCDF_KIND),DIMENSION(1) :: IVDIMS
CHARACTER(LEN=32) :: YSTR CHARACTER(LEN=:),ALLOCATABLE :: YSTR
!CHARACTER(LEN=LEN(HFIELD)) :: YSTR
INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length
INTEGER(KIND=IDCDF_KIND) :: IDIMLEN INTEGER(KIND=IDCDF_KIND) :: IDIMLEN
INTEGER :: II INTEGER :: II
...@@ -1962,22 +1976,19 @@ IF (IDIMS == 1 .AND. ITYPE == NF90_CHAR) THEN ...@@ -1962,22 +1976,19 @@ IF (IDIMS == 1 .AND. ITYPE == NF90_CHAR) THEN
! Check size of variable before reading ! Check size of variable before reading
STATUS = NF90_INQUIRE_DIMENSION(KNCID, IVDIMS(1), LEN=IDIMLEN) 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 (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF90_INQUIRE_DIMENSION] '//TRIM(YVARNAME))
!
IF (IDIMLEN <= LEN(YSTR)) THEN ALLOCATE(CHARACTER(LEN=IDIMLEN)::YSTR)
! Read variable ! Read variable
STATUS = NF90_GET_VAR(KNCID, IVARID, YSTR) STATUS = NF90_GET_VAR(KNCID, IVARID, YSTR)
IF (STATUS /= NF90_NOERR) THEN IF (STATUS /= NF90_NOERR) THEN
CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF90_GET_VAR] '//TRIM(YVARNAME),IRESP)
GOTO 1000 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
END IF 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 ELSE
PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).' PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
IRESP = -3 IRESP = -3
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment