From 2ab38db08c84724e9a61cd2aea1481fc5ddf0d48 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 7 Jun 2018 16:34:02 +0200
Subject: [PATCH] Philippe 07/06/2018: lfi2cdf: clean + remove duplicated code

---
 LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 191 ++++++++++-------------
 1 file changed, 81 insertions(+), 110 deletions(-)

diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 22523cdf2..3f0c42c8b 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -80,13 +80,11 @@ CONTAINS
     INTEGER                                  :: ji,jj
     INTEGER                                  :: ndb, nde, ndey, idx, idx_out, idx_var, maxvar
     INTEGER                                  :: leng
-    INTEGER                                  :: sizemax
     INTEGER                                  :: IID, IRESP, IDATES, ICURDATE
     INTEGER                                  :: IDXDATE, IDXTIME
     INTEGER(KIND=LFI_INT)                    :: iresp2,ilu,ileng,ipos
     INTEGER(KIND=IDCDF_KIND)                 :: kcdf_id, kcdf_id2, var_id
-    INTEGER(KIND=IDCDF_KIND)                 :: jdim, status
-    INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: idims_id
+    INTEGER(KIND=IDCDF_KIND)                 :: status
     LOGICAL                                  :: ladvan
     LOGICAL                                  :: GOK
     TYPE(TLFIDATE),DIMENSION(MAXDATES)       :: TLFIDATES
@@ -115,8 +113,6 @@ CONTAINS
     PRINT *,'DIMY =',NJMAX_ll+2*JPHEXT
     PRINT *,'DIMZ =',NKMAX   +2*JPVEXT
 
-    sizemax = 0
-
     ! Phase 1 : build articles list to convert.
     !
     !    Pour l'instant tous les articles du fichier LFI sont
@@ -241,76 +237,14 @@ CONTAINS
             !
             IF (status == NF90_NOERR) THEN
               tpreclist(ji)%found = .true.
-              status = NF90_INQUIRE_VARIABLE(kcdf_id2,var_id,ndims = tpreclist(ji)%NDIMS_FILE, &
-                                             xtype=tpreclist(ji)%NTYPE_FILE, dimids = idims_id)
-              IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-
-              IF (.NOT.tpreclist(ji)%LSPLIT) THEN
-                ALLOCATE(tpreclist(ji)%NDIMSIZES_FILE(tpreclist(ji)%NDIMS_FILE))
-                ALLOCATE(tpreclist(ji)%CDIMNAMES_FILE(tpreclist(ji)%NDIMS_FILE))
-              ELSE
-                ALLOCATE(tpreclist(ji)%NDIMSIZES_FILE(tpreclist(ji)%NDIMS_FILE+1))
-                ALLOCATE(tpreclist(ji)%CDIMNAMES_FILE(tpreclist(ji)%NDIMS_FILE+1))
-              END IF
-
-              IF (tpreclist(ji)%NDIMS_FILE == 0) THEN
-                 ! variable scalaire
-                 leng = 1
-              ELSE
-                 ! infos sur dimensions
-                 leng = 1
-                 DO jdim=1,tpreclist(ji)%NDIMS_FILE
-                   status = NF90_INQUIRE_DIMENSION(kcdf_id2,idims_id(jdim),                    &
-                                                   len =  tpreclist(ji)%NDIMSIZES_FILE(jdim), &
-                                                   name = tpreclist(ji)%CDIMNAMES_FILE(jdim)  )
-                   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-                   leng = leng*tpreclist(ji)%NDIMSIZES_FILE(jdim)
-                END DO
-
-                IF (tpreclist(ji)%NDIMS_FILE>0) THEN
-                  IF (tpreclist(ji)%CDIMNAMES_FILE(tpreclist(ji)%NDIMS_FILE)=='time') THEN
-                    tpreclist(ji)%TFIELD%LTIMEDEP = .TRUE.
-                  ELSE
-                    tpreclist(ji)%TFIELD%LTIMEDEP = .FALSE.
-                  END IF
-                ELSE
-                  tpreclist(ji)%TFIELD%LTIMEDEP = .FALSE.
-                END IF
-
-                IF (tpreclist(ji)%LSPLIT) THEN
-                  IF(     (.NOT.tpreclist(ji)%TFIELD%LTIMEDEP .AND.  tpreclist(ji)%NDIMS_FILE/=2)   &
-                     .OR. (     tpreclist(ji)%TFIELD%LTIMEDEP .AND.  tpreclist(ji)%NDIMS_FILE/=3) ) &
-                    CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','split variables can only be 3D')
-                  !Split variables are Z-split
-                  leng = leng * (NKMAX+2*JPVEXT)
-                  !Move time dimension to last (4th) position
-                  IF (tpreclist(ji)%TFIELD%LTIMEDEP) THEN
-                    tpreclist(ji)%NDIMSIZES_FILE(4) = tpreclist(ji)%NDIMSIZES_FILE(3)
-                    tpreclist(ji)%CDIMNAMES_FILE(4) = tpreclist(ji)%CDIMNAMES_FILE(3)
-                  END IF
-                  !Add vertical dimension
-                  tpreclist(ji)%NDIMSIZES_FILE(3) = NKMAX+2*JPVEXT
-                  tpreclist(ji)%CDIMNAMES_FILE(3) = 'level' !Could also be 'level_w'
-                END IF
-              END IF
+              CALL IO_GET_METADATA_NC4(kcdf_id2,var_id,tpreclist(ji))
             END IF
-            tpreclist(ji)%NSIZE = leng
-
-            STATUS = NF90_GET_ATT(kcdf_id,var_id,'grid',tpreclist(ji)%NGRID_FILE)
-            IF (status /= NF90_NOERR) tpreclist(ji)%NGRID_FILE = 0
-
-            STATUS = NF90_GET_ATT(kcdf_id,var_id,'units',tpreclist(ji)%CUNITS_FILE)
-
-            !Add maximum comment size (necessary when writing LFI files because the comment is stored with the field)
-            leng = leng + NLFIMAXCOMMENTLENGTH
           END IF
 
           IF (.NOT.tpreclist(ji)%found) THEN
             CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','variable '//TRIM(yrecfm)//' not found => ignored')
              tpreclist(ji)%tbw   = .FAlSE.
              tpreclist(ji)%tbr   = .FAlSE.
-          ELSE
-             IF (leng > sizemax) sizemax = leng
           END IF
        END DO
 
@@ -338,7 +272,6 @@ END DO
            tpreclist(ji)%name   = trim(yrecfm)
            tpreclist(ji)%found  = .TRUE.
            tpreclist(ji)%NSIZE  = ileng - 2 - NLFIMAXCOMMENTLENGTH
-           IF (ileng > sizemax) sizemax = ileng
 
            !Detect if date variable
            IDXDATE = INDEX(trim(yrecfm),"%TDATE",.TRUE.)
@@ -393,38 +326,11 @@ END DO
        ELSE IF (INFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN
          DO ji=1,nbvar_infile
            var_id = ji
-           status = NF90_INQUIRE_VARIABLE(kcdf_id,var_id, name = tpreclist(ji)%name, ndims = tpreclist(ji)%NDIMS_FILE, &
-                                          xtype=tpreclist(ji)%NTYPE_FILE, dimids = idims_id)
+           status = NF90_INQUIRE_VARIABLE(kcdf_id,var_id, name = tpreclist(ji)%name)
            IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
            tpreclist(ji)%found  = .TRUE.
-
-           ALLOCATE(tpreclist(ji)%NDIMSIZES_FILE(tpreclist(ji)%NDIMS_FILE))
-           ALLOCATE(tpreclist(ji)%CDIMNAMES_FILE(tpreclist(ji)%NDIMS_FILE))
-
-           IF (tpreclist(ji)%NDIMS_FILE == 0) THEN
-             ! variable scalaire
-             leng = 1
-           ELSE
-             ! infos sur dimensions
-             leng = 1
-             DO jdim=1,tpreclist(ji)%NDIMS_FILE
-               status = NF90_INQUIRE_DIMENSION(kcdf_id,idims_id(jdim),                     &
-                                               len =  tpreclist(ji)%NDIMSIZES_FILE(jdim), &
-                                               name = tpreclist(ji)%CDIMNAMES_FILE(jdim)  )
-               IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-               leng = leng*tpreclist(ji)%NDIMSIZES_FILE(jdim)
-             END DO
-           END IF
-           tpreclist(ji)%NSIZE  = leng
-           IF (leng > sizemax) sizemax = leng
-
-           STATUS = NF90_GET_ATT(kcdf_id,var_id,'grid',tpreclist(ji)%NGRID_FILE)
-           IF (status /= NF90_NOERR) tpreclist(ji)%NGRID_FILE = 0
-
-           STATUS = NF90_GET_ATT(kcdf_id,var_id,'units',tpreclist(ji)%CUNITS_FILE)
+           CALL IO_GET_METADATA_NC4(kcdf_id,var_id,tpreclist(ji))
          END DO
-         !Add maximum comment size (necessary when writing LFI files because the comment is stored with the field)
-         sizemax = sizemax + NLFIMAXCOMMENTLENGTH
        END IF
 
        maxvar = nbvar_infile
@@ -562,16 +468,6 @@ END DO
 
             CALL IO_FILL_DIMS_NC4(outfiles(idx_out)%TFILE,tpreclist(ji),IRESP)
 
-            IF (tpreclist(ji)%NDIMS_FILE>0) THEN
-              IF (tpreclist(ji)%CDIMNAMES_FILE(tpreclist(ji)%NDIMS_FILE)=='time') THEN
-                tpreclist(ji)%TFIELD%LTIMEDEP = .TRUE.
-              ELSE
-                tpreclist(ji)%TFIELD%LTIMEDEP = .FALSE.
-              END IF
-            ELSE
-              tpreclist(ji)%TFIELD%LTIMEDEP = .FALSE.
-            END IF
-
             IF (tpreclist(ji)%NDIMS_FILE>0) THEN
               IF (tpreclist(ji)%CDIMNAMES_FILE(tpreclist(ji)%NDIMS_FILE)=='time') THEN
                 tpreclist(ji)%TFIELD%NDIMS = tpreclist(ji)%TFIELD%NDIMS - 1
@@ -706,8 +602,6 @@ END DO
     END DO !ji=1,maxvar
     END IF !nbvar_calc>0
 
-    WRITE(*,'("Maximum buffer size:",f10.3," Mio")') sizemax*8./1048576.
-
   END SUBROUTINE parse_infiles
   
   SUBROUTINE HANDLE_ERR(status,line)
@@ -1222,6 +1116,83 @@ END DO
 
   END SUBROUTINE CLOSE_FILES
 
+
+  SUBROUTINE IO_GET_METADATA_NC4(KFILE_ID,KVAR_ID,TPREC)
+    USE MODD_DIM_n,      ONLY: NKMAX
+    USE MODD_PARAMETERS, ONLY: JPVEXT
+
+    INTEGER,        INTENT(IN)    :: KFILE_ID
+    INTEGER,        INTENT(IN)    :: KVAR_ID
+    TYPE(workfield),INTENT(INOUT) :: TPREC
+
+    INTEGER                                  :: ILENG
+    INTEGER                                  :: JDIM
+    INTEGER(KIND=IDCDF_KIND)                 :: ISTATUS
+    INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMS_ID
+
+    ISTATUS = NF90_INQUIRE_VARIABLE(KFILE_ID,KVAR_ID,NDIMS = TPREC%NDIMS_FILE, &
+                                    XTYPE = TPREC%NTYPE_FILE, DIMIDS = IDIMS_ID)
+    IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__)
+
+    IF (.NOT.TPREC%LSPLIT) THEN
+      ALLOCATE(TPREC%NDIMSIZES_FILE(TPREC%NDIMS_FILE))
+      ALLOCATE(TPREC%CDIMNAMES_FILE(TPREC%NDIMS_FILE))
+    ELSE
+      ALLOCATE(TPREC%NDIMSIZES_FILE(TPREC%NDIMS_FILE+1))
+      ALLOCATE(TPREC%CDIMNAMES_FILE(TPREC%NDIMS_FILE+1))
+    END IF
+
+    IF (TPREC%NDIMS_FILE == 0) THEN
+      ! Scalar variable
+      ILENG = 1
+    ELSE
+      ! Fill dimensions info
+      ILENG = 1
+      DO JDIM=1,TPREC%NDIMS_FILE
+        ISTATUS = NF90_INQUIRE_DIMENSION(KFILE_ID,IDIMS_ID(JDIM),                    &
+                                                   len =  TPREC%NDIMSIZES_FILE(JDIM), &
+                                                   name = TPREC%CDIMNAMES_FILE(JDIM)  )
+        IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__)
+        ILENG = ILENG*TPREC%NDIMSIZES_FILE(JDIM)
+      END DO
+
+      IF (TPREC%NDIMS_FILE>0) THEN
+        IF (TPREC%CDIMNAMES_FILE(TPREC%NDIMS_FILE)=='time') THEN
+          TPREC%TFIELD%LTIMEDEP = .TRUE.
+        ELSE
+          TPREC%TFIELD%LTIMEDEP = .FALSE.
+        END IF
+      ELSE
+        TPREC%TFIELD%LTIMEDEP = .FALSE.
+      END IF
+
+      IF (TPREC%LSPLIT) THEN
+        IF(     (.NOT.TPREC%TFIELD%LTIMEDEP .AND.  TPREC%NDIMS_FILE/=2)   &
+            .OR. (     TPREC%TFIELD%LTIMEDEP .AND.  TPREC%NDIMS_FILE/=3) ) &
+          CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','split variables can only be 3D')
+          !Split variables are Z-split
+          ILENG = ILENG * (NKMAX+2*JPVEXT)
+          !Move time dimension to last (4th) position
+          IF (TPREC%TFIELD%LTIMEDEP) THEN
+            TPREC%NDIMSIZES_FILE(4) = TPREC%NDIMSIZES_FILE(3)
+            TPREC%CDIMNAMES_FILE(4) = TPREC%CDIMNAMES_FILE(3)
+          END IF
+          !Add vertical dimension
+          TPREC%NDIMSIZES_FILE(3) = NKMAX+2*JPVEXT
+          TPREC%CDIMNAMES_FILE(3) = 'level' !Could also be 'level_w'
+        END IF
+      END IF
+
+      TPREC%NSIZE = ILENG
+
+      ISTATUS = NF90_GET_ATT(KFILE_ID,KVAR_ID,'grid',TPREC%NGRID_FILE)
+      IF (ISTATUS /= NF90_NOERR) TPREC%NGRID_FILE = 0
+
+      ISTATUS = NF90_GET_ATT(KFILE_ID,KVAR_ID,'units',TPREC%CUNITS_FILE)
+      IF (ISTATUS /= NF90_NOERR) TPREC%CUNITS_FILE = ''
+  END SUBROUTINE IO_GET_METADATA_NC4
+
+
   SUBROUTINE IO_FILL_DIMS_NC4(TPFILE,TPREC,KRESP)
     USE MODD_IO_ll,  ONLY: TFILEDATA
     USE MODE_NETCDF, ONLY: GETDIMCDF, IO_FIND_DIM_BYNAME_NC4
-- 
GitLab