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