From 352abd0cee613989886a4ad372ebd03e303635c3 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 22 Mar 2018 17:11:45 +0100
Subject: [PATCH] Philippe 22/03/2018: lfi2cdf: corrections for cdf2lfi + final
 cleaning

---
 LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90   | 22 ++++++++-----
 LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 39 +++++++++++++-----------
 2 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index 4663fe5cd..bade9ffb9 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
@@ -2,6 +2,7 @@ program LFI2CDF
   USE MODD_CONF,          ONLY: CPROGRAM
   USE MODD_CONFZ,         ONLY: NB_PROCIO_R
   USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
+  USE MODD_IO_ll,         ONLY: NIO_VERB, NGEN_VERB, LVERB_OUTLST, LVERB_STDOUT, NVERB_DEBUG
   USE MODD_PARAMETERS,    ONLY: JPHEXT, JPVEXT
   USE MODD_TIMEZ,         ONLY: TIMEZ
 
@@ -16,13 +17,13 @@ program LFI2CDF
   IMPLICIT NONE 
 
   INTEGER :: ji
-  INTEGER :: nbvar_infile ! number of variables available in the input file
-  INTEGER :: nbvar_tbr  ! number of variables to be read
-  INTEGER :: nbvar_calc ! number of variables to be computed from others
-  INTEGER :: nbvar_tbw  ! number of variables to be written
-  INTEGER :: nbvar      ! number of defined variables
-  INTEGER :: IINFO_ll   ! return code of // routines
-  INTEGER :: nfiles_out ! number of output files
+  INTEGER :: nbvar_infile = 0 ! number of variables available in the input file
+  INTEGER :: nbvar_tbr    = 0 ! number of variables to be read
+  INTEGER :: nbvar_calc   = 0 ! number of variables to be computed from others
+  INTEGER :: nbvar_tbw    = 0 ! number of variables to be written
+  INTEGER :: nbvar        = 0 ! number of defined variables
+  INTEGER :: IINFO_ll         ! return code of // routines
+  INTEGER :: nfiles_out   = 0 ! number of output files
   CHARACTER(LEN=:),allocatable :: hvarlist
   TYPE(TFILE_ELT),DIMENSION(1)        :: infiles
   TYPE(TFILE_ELT),DIMENSION(MAXFILES) :: outfiles
@@ -42,6 +43,11 @@ program LFI2CDF
 
   ALLOCATE(TIMEZ) !Used by IO_WRITE_FIELD
 
+  NIO_VERB  = NVERB_WARNING
+  NGEN_VERB = NVERB_WARNING
+  LVERB_OUTLST = .FALSE.
+  LVERB_STDOUT = .TRUE.
+
   call read_commandline(options,hinfile,houtfile,runmode)
 
   IF (options(OPTMERGE)%set) THEN
@@ -107,6 +113,8 @@ program LFI2CDF
      ELSE
         nbvar = nbvar_infile
      END IF
+  ELSE
+    nbvar = nbvar_infile
   END IF
 
   IF (runmode == MODELFI2CDF) THEN
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 8c945e021..4c0fc9708 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -129,8 +129,7 @@ CONTAINS
             var_calc = yrecfm(1:ndey-1)
             DO WHILE (ndey /= 0)
               IF (idx>MAXRAW) THEN
-                print *,'Error: MAXRAW exceeded (too many raw variables for 1 computed one)'
-                STOP
+                CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','MAXRAW exceeded (too many raw variables for 1 computed one)')
               END IF
               yrecfm = yrecfm(ndey+1:)
               ndey = INDEX(TRIM(yrecfm),'+')
@@ -180,6 +179,7 @@ CONTAINS
               tpreclist(ji)%NSIZE = ileng - 2 - NLFIMAXCOMMENTLENGTH
             END IF
 
+            IF (iresp2==0 .AND. ileng == 0 .AND. ipos==0 .AND. INFILES(1)%TFILE%NSUBFILES_IOZ>0) THEN
               !Variable not found with no error (iresp2==0 .AND. ileng == 0 .AND. ipos==0)
               !If we are merging, maybe it is one of the split variable
               !In that case, the 1st part of the variable is in the 1st split file with a 0001 suffix
@@ -223,8 +223,6 @@ CONTAINS
               status = NF90_INQUIRE_VARIABLE(kcdf_id2,var_id,ndims = idims,dimids = idim_id)
               IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
 
-!TODO:useful?
-!DUPLICATED
               IF (idims == 0) THEN
                  ! variable scalaire
                  leng = 1
@@ -249,11 +247,10 @@ CONTAINS
           END IF
 
           IF (.NOT.tpreclist(ji)%found) THEN
-             PRINT *,'Article ',TRIM(yrecfm), ' not found!'
+            CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','variable '//TRIM(yrecfm)//' not found => ignored')
              tpreclist(ji)%tbw   = .FAlSE.
              tpreclist(ji)%tbr   = .FAlSE.
           ELSE
-             ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
              IF (leng > sizemax) sizemax = leng
           END IF
        END DO
@@ -282,7 +279,6 @@ END DO
          YDATENAME = ''
          DO ji=1,nbvar_infile
            CALL LFICAS(iresp2,ilu,yrecfm,ileng,ipos,ladvan)
-           ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
            tpreclist(ji)%name   = trim(yrecfm)
            tpreclist(ji)%found  = .TRUE.
            tpreclist(ji)%NSIZE  = ileng - 2 - NLFIMAXCOMMENTLENGTH
@@ -349,10 +345,8 @@ END DO
            status = NF90_INQUIRE_VARIABLE(kcdf_id,var_id, name = tpreclist(ji)%name, ndims = idims, &
                                           dimids = idim_id)
            IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-           ! PRINT *,'Article ',ji,' : ',TRIM(tpreclist(ji)%name),', longueur = ',ileng
            tpreclist(ji)%found  = .TRUE.
-!TODO:useful?
-!DUPLICATED
+
            IF (idims == 0) THEN
              ! variable scalaire
              leng = 1
@@ -536,25 +530,27 @@ END DO
   END SUBROUTINE HANDLE_ERR
 
   SUBROUTINE def_ncdf(outfiles,KNFILES_OUT)
+    USE MODD_CONF,   ONLY: NMNHVERSION
     USE MODE_NETCDF, ONLY: IO_WRITE_HEADER_NC4
 
     TYPE(TFILE_ELT),DIMENSION(:),INTENT(IN) :: outfiles
     INTEGER,                     INTENT(IN) :: KNFILES_OUT
 
+    CHARACTER(LEN=16) :: YMNHVERSION
     INTEGER :: ji
-!     INTEGER(KIND=IDCDF_KIND) :: status
-!     INTEGER(KIND=IDCDF_KIND) :: kcdf_id
+    INTEGER(KIND=IDCDF_KIND) :: status
+    INTEGER(KIND=IDCDF_KIND) :: kcdf_id
 
 
     DO ji = 1,KNFILES_OUT
-!       kcdf_id = outfiles(ji)%TFILE%NNCID
+      kcdf_id = outfiles(ji)%TFILE%NNCID
 
       ! global attributes
       CALL IO_WRITE_HEADER_NC4(outfiles(ji)%TFILE)
       !
-!       status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'Title',VERSION_ID)
-!       IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-print *,'PW:TODO: add header specific to lfi2cdf (history...?)'
+      WRITE(YMNHVERSION,"( I0,'.',I0,'.',I0 )" ) NMNHVERSION(1),NMNHVERSION(2),NMNHVERSION(3)
+      status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'lfi2cdf_version',TRIM(YMNHVERSION))
+      IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
     END DO
     
   END SUBROUTINE def_ncdf
@@ -804,6 +800,7 @@ print *,'PW:TODO: add header specific to lfi2cdf (history...?)'
 
     USE MODE_FM,               ONLY: IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll
     USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
+
     TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: infiles
     TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: outfiles
     INTEGER,                     INTENT(OUT) :: KNFILES_OUT
@@ -838,6 +835,7 @@ print *,'PW:TODO: add header specific to lfi2cdf (history...?)'
        CALL IO_FILE_ADD2LIST(INFILES(1)%TFILE,HINFILE,'UNKNOWN','READ', &
                              HFORMAT='LFI',KLFIVERB=0)
        CALL IO_FILE_OPEN_ll(INFILES(1)%TFILE)
+
        ilu = INFILES(1)%TFILE%NLFIFLU
 
        nbvar_infile = INFILES(1)%TFILE%NLFININAR
@@ -939,7 +937,7 @@ print *,'PW:TODO: add header specific to lfi2cdf (history...?)'
      CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG)
    END IF
 
-   PRINT *,'--> Fichier converti : ', TRIM(houtfile)
+   PRINT *,'--> Converted to file: ', TRIM(houtfile)
 
   END SUBROUTINE OPEN_FILES
 
@@ -978,7 +976,12 @@ print *,'PW:TODO: add header specific to lfi2cdf (history...?)'
         CALL PRINT_MSG(NVERB_FATAL,'IO','OPEN_SPLIT_NCFILES_OUT','problem separating variable names')
       END IF
     END DO
-    YVARS(nbvar) = YLIST
+    idx2 = INDEX(YLIST,'=')
+    IF (idx2>0) THEN
+      YVARS(nbvar) = YLIST(1:idx2-1)
+    ELSE
+      YVARS(nbvar) = YLIST
+    END IF
 
     DO ji = 1,nbvar
       filename = trim(houtfile)//'.'//TRIM(YVARS(ji))
-- 
GitLab