From a5a861d3a70ba9cabc8c2290f37374b91b96b6ef Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 13 Jun 2017 17:21:57 +0200 Subject: [PATCH] Philippe 13/06/2017: IO: bug corrections * IO_WRITE_FIELD_LFI_C0: do not trim character string (size must be the same at read) * IO_WRITE_FIELD_LFI_T0: use TZFIELD instead of TPFIELD * IO_WRITE_HEADER: write DAD_NAME with a correct length string (for LFI files) * NCREADN0, NCREADN1 and NCREADN2: accept NF90_INT1 used when writing booleans --- src/LIB/SURCOUCHE/src/fmreadwrit.f90 | 14 +++++++------- src/LIB/SURCOUCHE/src/fmwrit_ll.f90 | 9 ++++++--- src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 15 +++++++++------ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 index ac0992cf3..4f9c202ba 100644 --- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 +++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 @@ -839,7 +839,7 @@ CHARACTER(LEN=16) :: YRECFM ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_LFI_C0','writing '//TRIM(TPFIELD%CMNHNAME)) ! -ILENG=LEN_TRIM(HFIELD) +ILENG=LEN(HFIELD) IF (ILENG==0) ILENG=1 ! CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP) @@ -904,10 +904,10 @@ CALL WRITE_PREPARE(TZFIELD,ILENG,IWORK,ITOTAL,IRESP) ! IF (IRESP==0) THEN IWORK(LEN_TRIM(TZFIELD%CCOMMENT)+3:)=ITDATE(:) - YRECFM=TRIM(TPFIELD%CMNHNAME) - IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) & + YRECFM=TRIM(TZFIELD%CMNHNAME) + IF( LEN_TRIM(TZFIELD%CMNHNAME) > LEN(YRECFM) ) & CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_T0','field name was truncated to '& - //YRECFM//' for '//TRIM(TPFIELD%CMNHNAME)) + //YRECFM//' for '//TRIM(TZFIELD%CMNHNAME)) CALL LFIECR(IRESP,KFLU,YRECFM,IWORK,ITOTAL) ENDIF ! @@ -928,10 +928,10 @@ CALL WRITE_PREPARE(TZFIELD,ILENG,IWORK,ITOTAL,IRESP) ! IF (IRESP==0) THEN CALL TRANSFW(IWORK(LEN_TRIM(TZFIELD%CCOMMENT)+3),TPDATA%TIME,ILENG) - YRECFM=TRIM(TPFIELD%CMNHNAME) - IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) & + YRECFM=TRIM(TZFIELD%CMNHNAME) + IF( LEN_TRIM(TZFIELD%CMNHNAME) > LEN(YRECFM) ) & CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_T0','field name was truncated to '& - //YRECFM//' for '//TRIM(TPFIELD%CMNHNAME)) + //YRECFM//' for '//TRIM(TZFIELD%CMNHNAME)) CALL LFIECR(IRESP,KFLU,YRECFM,IWORK,ITOTAL) ENDIF ! diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index bf58fdffe..42ca4432c 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -316,6 +316,8 @@ CONTAINS TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File structure CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: HDAD_NAME ! + CHARACTER(LEN=28) :: YDAD_NAME !Necessary to use a character string of the right length for LFI files + ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_HEADER','called for file'//TRIM(TPFILE%CNAME)) ! IF ( ASSOCIATED(TPFILE%TDADFILE) .AND. PRESENT(HDAD_NAME) ) THEN @@ -333,13 +335,14 @@ CONTAINS CALL IO_WRITE_FIELD(TPFILE,'STORAGE_TYPE',CSTORAGE_TYPE) CALL IO_WRITE_FIELD(TPFILE,'MY_NAME', TPFILE%CNAME) IF ( ASSOCIATED(TPFILE%TDADFILE) ) THEN - CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',TPFILE%TDADFILE%CNAME) + YDAD_NAME = TPFILE%TDADFILE%CNAME ELSE IF (PRESENT(HDAD_NAME)) THEN - CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',HDAD_NAME) + YDAD_NAME = HDAD_NAME ELSE CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_HEADER','TPFILE%TDADFILE not associated and HDAD_NAME not provided') - CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',' ') + YDAD_NAME = ' ' ENDIF + CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME',YDAD_NAME) ! END SUBROUTINE IO_WRITE_HEADER diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index f4bfbf03c..4079e0d34 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -2551,10 +2551,11 @@ END IF STATUS = NF90_INQUIRE_VARIABLE(KNCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS) IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN0[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME)) +!NF90_INT1 is for the case a boolean was written #ifndef MNH_INT8 -IF (IDIMS == 0 .AND. ITYPE == NF90_INT) THEN +IF (IDIMS == 0 .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT1) ) THEN #else -IF (IDIMS == 0 .AND. ITYPE == NF90_INT64) THEN +IF (IDIMS == 0 .AND. (ITYPE == NF90_INT64 .OR. ITYPE == NF90_INT1) ) THEN #endif ! Read variable STATUS = NF90_GET_VAR(KNCID, IVARID, KFIELD) @@ -2609,10 +2610,11 @@ END IF STATUS = NF90_INQUIRE_VARIABLE(KNCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS) IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN1[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME)) +!NF90_INT1 is for the case a boolean was written #ifndef MNH_INT8 -IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF90_INT) THEN +IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT1) ) THEN #else -IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF90_INT64) THEN +IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. (ITYPE == NF90_INT64 .OR. ITYPE == NF90_INT1) ) THEN #endif ! Check size of variable before reading IVARSIZE = 1 @@ -2680,10 +2682,11 @@ END IF STATUS = NF90_INQUIRE_VARIABLE(KNCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS) IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN2[NF90_INQUIRE_VARIABLE] '//TRIM(YVARNAME)) +!NF90_INT1 is for the case a boolean was written #ifndef MNH_INT8 -IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF90_INT) THEN +IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. (ITYPE == NF90_INT .OR. ITYPE == NF90_INT1) ) THEN #else -IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF90_INT64) THEN +IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. (ITYPE == NF90_INT64 .OR. ITYPE == NF90_INT1) ) THEN #endif ! Check size of variable before reading IVARSIZE = 1 -- GitLab