From f926995e263c932ce4d5e8b5eb024a3c1c809fb1 Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Tue, 15 Sep 2015 16:09:13 +0200
Subject: [PATCH] Commited changes of Didier before my own modifications

---
 tools/diachro/Makefile.exrwdia        |   2 +-
 tools/diachro/Rules.LXgfortran        |   3 +-
 tools/lfi2cdf/Makefile                |  11 +-
 tools/lfi2cdf/Rules.LXgfortran        |  22 ++-
 tools/lfi2cdf/scripts/lfi2cdfregex.sh |  31 ++++
 tools/lfi2cdf/src/lfi2cdf.f90         |  86 ++++--------
 tools/lfi2cdf/src/mode_util.f90       | 195 +++++++++++++++-----------
 tools/lfi2cdf/src/newmain.c           | 148 +++++++++++++++++++
 8 files changed, 347 insertions(+), 151 deletions(-)
 create mode 100755 tools/lfi2cdf/scripts/lfi2cdfregex.sh
 create mode 100644 tools/lfi2cdf/src/newmain.c

diff --git a/tools/diachro/Makefile.exrwdia b/tools/diachro/Makefile.exrwdia
index 7698d9d31..3cec20ccd 100644
--- a/tools/diachro/Makefile.exrwdia
+++ b/tools/diachro/Makefile.exrwdia
@@ -1,7 +1,7 @@
 B ?= 32
 
 ifeq ($(origin MNH_LIBTOOLS), undefined)
-dummy %:
+dummy :
 	@echo "ERROR : MNH_LIBTOOLS variable is not set !";echo
 else
 include $(MNH_LIBTOOLS)/tools/where.Libs
diff --git a/tools/diachro/Rules.LXgfortran b/tools/diachro/Rules.LXgfortran
index 72b2349d1..45d7d6bca 100644
--- a/tools/diachro/Rules.LXgfortran
+++ b/tools/diachro/Rules.LXgfortran
@@ -1,5 +1,6 @@
 #LIBX = -L/usr/X11R6/lib64 -lX11 -lg2c
 LIBX = -L/usr/X11R6/lib -lX11 -lpng -lz
+LIBX = -L/usr/X11R6/lib64 -lX11 -lpng -lz -lcairo -lfreetype
 
 #LIBV5D = /usr/local/lib/libv5d.a
 #LIBV5D = -L/mesonh/MAKE/lib/vis5d/LXgfortran -lv5d 
@@ -15,7 +16,7 @@ F90FLAGS +=  -O2
 ifeq ($(B),64)
 F90FLAGS += -fdefault-real-8 
 endif
-LDFLAGS  += -Wl,-noinhibit-exec -Wl,-warn-once
+LDFLAGS  += -Wl,-noinhibit-exec -Wl,-warn-once -static-libgfortran
 #
 #OBJS2 = image_fordiachro.o
 #$(OBJS2) : F90FLAGS = -w -O2
diff --git a/tools/lfi2cdf/Makefile b/tools/lfi2cdf/Makefile
index d200ddfe5..89f8e1833 100644
--- a/tools/lfi2cdf/Makefile
+++ b/tools/lfi2cdf/Makefile
@@ -17,10 +17,10 @@ DIR_COMP = $(DIR_LIB)/COMPRESS
 LIBCOMP  = $(DIR_COMP)/$(ARCH)/liblficomp.a
 
 
-OBJS = lfi2cdf.o modd_ncparam.o mode_dimlist.o fieldtype.o mode_util.o
+OBJS = newmain.o lfi2cdf.o modd_ncparam.o mode_dimlist.o fieldtype.o mode_util.o
 PROGS = lfi2cdf 
 
-INC = -I$(DIR_OBJ)
+INC = -I$(DIR_OBJ) -DLFI_INT=$(LFI_INT)
 
 DIR_CONF:=$(SRC_MESONH)/conf
 
@@ -32,6 +32,9 @@ include Rules.$(ARCH)
 	$(F90) $(INC) -c $(F90FLAGS) $(DIR_OBJ)/cpp_$(*F).f90 -o $(DIR_OBJ)/$(*F).o
 	-@mv  *.mod $(DIR_OBJ)/. 2> /dev/null || echo pas de module dans $*.f90
 
+%.o:%.c $(DIR_OBJ)/.dummy
+	$(CC) $(INC) $(CFLAGS) $(CPPFLAGS) -c $< -o $(DIR_OBJ)/$(*F).o
+
 all : $(PROGS) cdf2lfi
 
 cdf2lfi: $(PROGS) 
@@ -40,7 +43,8 @@ cdf2lfi: $(PROGS)
 $(PROGS): $(OBJS) $(LIBLFI) $(LIBCOMP)
 	cd $(DIR_OBJ); $(F90) $(LDFLAGS) -o $@ $(OBJS) $(LIBLFI) $(LIBCOMP) $(LIBCDF)
 
-$(OBJS): $(LIBCDF)
+#$(OBJS): $(LIBCDF)
+$(OBJS): 
 
 $(DIR_OBJ)/.dummy :
 	mkdir -p $(DIR_OBJ)
@@ -76,3 +80,4 @@ modd_ncparam.o: modd_ncparam.f90
 mode_dimlist.o: mode_dimlist.f90
 mode_util.o: mode_util.f90 modd_ncparam.o fieldtype.o mode_dimlist.o
 fieldtype.o: fieldtype.f90 modd_ncparam.o
+
diff --git a/tools/lfi2cdf/Rules.LXgfortran b/tools/lfi2cdf/Rules.LXgfortran
index 904e6b27b..09bb4e4f9 100644
--- a/tools/lfi2cdf/Rules.LXgfortran
+++ b/tools/lfi2cdf/Rules.LXgfortran
@@ -7,9 +7,25 @@ NETCDFHOME = /usr
 DIR_CDF = $(NETCDFHOME)/lib64
 LIBCDF = $(DIR_CDF)/libnetcdff.so $(DIR_CDF)/libnetcdf.so
 
+NETCDFHOME = /usr/local/netcdf4-tools
+DIR_CDF = $(NETCDFHOME)/lib64
+LIBCDF = -L$(DIR_CDF) -lnetcdff
+
+NETCDFHOME = /workdir/MESONH/MNH-V5-1-3/src/LIB/netcdf-4.1.3-LXgfortranI4
+DIR_CDF = $(NETCDFHOME)/lib64
+LIBCDF = -L$(DIR_CDF) -lnetcdff -lnetcdf  -lhdf5_hl -lhdf5
+
+NETCDFCHOME = /home/waup/installations/libraries/netcdf-c/4.3.3.1_ser
+NETCDFFHOME = /home/waup/installations/libraries/netcdf-fortran/4.4.2_ser
+DIR_CDFC = $(NETCDFCHOME)/lib64
+DIR_CDFF = $(NETCDFFHOME)/lib64
+DIR_HDF5 = /home/waup/installations/libraries/HDF5/1.8.15p1_ser/lib64
+LIBCDF = -L$(DIR_CDFC) -L$(DIR_CDFF) -L$(DIR_HDF5) -lnetcdff -lnetcdf  -lhdf5_hl -lhdf5
+
 ###################################
 
-CPPFLAGS += -DLOWMEM
-INC      += -I$(NETCDFHOME)/include
+#PW: to test!!!! CPPFLAGS += -DLOWMEM
+INC      += -I$(NETCDFFHOME)/include
 F90FLAGS += -fdefault-real-8  -O2 
-LDFLAGS  += 
+LDFLAGS  +=
+LFI_INT=4
diff --git a/tools/lfi2cdf/scripts/lfi2cdfregex.sh b/tools/lfi2cdf/scripts/lfi2cdfregex.sh
new file mode 100755
index 000000000..75a1e9881
--- /dev/null
+++ b/tools/lfi2cdf/scripts/lfi2cdfregex.sh
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+#
+usage(){
+    cat >&2 <<EOF
+Usage : 
+
+  ${0##*/} '~/pattern/'  infile.lfi : select articles that match regex 'pattern'.
+  ${0##*/} '!~/pattern/' infile.lfi : select articles that doesn't match regex 'pattern'.
+    
+Example :
+  - Select all COVER articles :
+      ${0##*/} '~/^COVER/' infile.lfi 
+
+EOF
+    exit 1
+}
+
+[ -z "$2" ] && usage  
+
+REGEXP=$1
+INFILE=$2
+
+
+VARLIST=$(lfi2cdf -l $INFILE | awk -F\" '$2 && gsub("[[:space:]]+","",$2)+1 && $2 '$REGEXP' {printf("%s,",$2)}')
+[ -n "$VARLIST" ] && VARLIST="-v$VARLIST" 
+CMD="lfi2cdf $VARLIST $INFILE"
+echo $CMD
+#$CMD
+
+
diff --git a/tools/lfi2cdf/src/lfi2cdf.f90 b/tools/lfi2cdf/src/lfi2cdf.f90
index ee037a7d4..cd16876f0 100644
--- a/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/tools/lfi2cdf/src/lfi2cdf.f90
@@ -1,68 +1,37 @@
-PROGRAM testinfo
+subroutine  LFI2CDFMAIN(hinfile,iiflen,houtfile,ioflen,hvarlist,ivlen,olfi2cdf,olfilist,ohdf5)
   USE mode_util
-#ifdef NAGf95
-  USE F90_UNIX
-#endif
   IMPLICIT NONE 
-
-  CHARACTER(LEN=80) :: yfilename
-  CHARACTER(LEN=50) :: yexe
-
+  INTEGER :: iiflen, ioflen, ivlen
+  CHARACTER(LEN=iiflen) :: hinfile
+  CHARACTER(LEN=ioflen) :: houtfile
+  CHARACTER(LEN=ivlen)  :: hvarlist
+  LOGICAL :: olfi2cdf, olfilist, ohdf5
+  
   INTEGER :: ibuflen
-#ifndef NAGf95
-  INTEGER :: IARGC
-  ! CRAY specific
-  INTEGER :: arglen
-  INTEGER :: iresp
-  !!!!!!!!!!!!!!!!!
-#endif
-  INTEGER :: inarg
   INTEGER :: ilu
-  INTEGER :: inaf
+  INTEGER :: inaf, ji
   INTEGER :: icdf_id
   TYPE(workfield), DIMENSION(:), POINTER :: tzreclist
-  LOGICAL :: glfi2cdf
 
-  INARG = IARGC()
+  CALL OPEN_FILES(hinfile, houtfile, olfi2cdf, olfilist, ohdf5, icdf_id, ilu, inaf)
+  IF (olfilist) return
 
-#if defined(F90HP)
-#define HPINCR 1
-#else
-#define HPINCR 0
-#endif
-
-#if defined(FUJI) || defined(NAGf95) || defined(NEC) || defined(HP) || defined(pgf) || defined(G95) || defined(GFORTRAN)
-  CALL GETARG(0+HPINCR,yexe)
-  IF (LEN_TRIM(yexe) == 0) THEN
-    PRINT *, 'FATAL ERROR : Activer la macro -DF90HP dans le Makefile et recompiler'
-    STOP
-  END IF
-#else
-  CALL PXFGETARG(0,yexe,arglen,iresp)
-#endif
-!  PRINT *,yexe, ' avec ',INARG,' arguments.'
-  IF (INARG == 1) THEN 
-#if defined(FUJI) || defined(NAGf95) || defined(NEC) || defined(HP) || defined(pgf) || defined(G95) || defined(GFORTRAN)
-     CALL GETARG(1+HPINCR,yfilename)
-#else
-     CALL PXFGETARG(1,yfilename,arglen,iresp)
-#endif
-  ELSE 
-     PRINT *,'Usage : ', TRIM(yexe), ' [fichier lfi]'
-     STOP
-  END IF
-  
-  glfi2cdf = (INDEX(yexe,'lfi2cdf') /= 0)
-
-!  CALL SAMPSTART
-
-  CALL OPEN_FILES(glfi2cdf, yfilename, icdf_id, ilu, inaf)
-
-  IF (glfi2cdf) THEN
+  IF (olfi2cdf) THEN
      ! Conversion LFI -> NetCDF
-     CALL parse_lfi(ilu,inaf,tzreclist,ibuflen)
-     CALL def_ncdf(tzreclist,icdf_id)
-     CALL fill_ncdf(ilu,icdf_id,tzreclist,ibuflen)
+     IF (ivlen > 0) THEN
+        ! inaf is computed from number of requested variables
+        ! by counting commas.
+        inaf = 0
+        DO ji=1,ivlen
+           if (hvarlist(ji:ji) == ',') THEN
+              inaf = inaf+1
+           END IF
+        END DO
+     END IF
+     
+     CALL parse_lfi(ilu,hvarlist,inaf,tzreclist,ibuflen)
+     CALL def_ncdf(tzreclist,inaf,icdf_id)
+     CALL fill_ncdf(ilu,icdf_id,tzreclist,inaf,ibuflen)
 
   ELSE
      ! Conversion NetCDF -> LFI
@@ -72,6 +41,5 @@ PROGRAM testinfo
   
   CALL CLOSE_FILES(ilu,icdf_id)
   
-!  CALL SAMPSTOP
- 
-END PROGRAM testinfo
+end subroutine LFI2CDFMAIN
+
diff --git a/tools/lfi2cdf/src/mode_util.f90 b/tools/lfi2cdf/src/mode_util.f90
index 70c902b31..6e2bce604 100644
--- a/tools/lfi2cdf/src/mode_util.f90
+++ b/tools/lfi2cdf/src/mode_util.f90
@@ -20,7 +20,10 @@ MODULE mode_util
   END TYPE lfidata
   TYPE(lfidata), DIMENSION(:), ALLOCATABLE :: lfiart
 #endif
-  
+
+  LOGICAL(KIND=LFI_INT), PARAMETER :: ltrue  = .TRUE.
+  LOGICAL(KIND=LFI_INT), PARAMETER :: lfalse = .FALSE.
+
   INCLUDE 'netcdf.inc'
 
 CONTAINS 
@@ -40,13 +43,14 @@ CONTAINS
   END FUNCTION str_replace
 
   SUBROUTINE FMREADLFIN1(klu,hrecfm,kval,kresp)
-  INTEGER, INTENT(IN)         :: klu ! logical fortran unit au lfi file
-  CHARACTER(LEN=*),INTENT(IN) :: hrecfm ! article name to be read
+  INTEGER(KIND=LFI_INT), INTENT(IN) :: klu ! logical fortran unit au lfi file
+  CHARACTER(LEN=*),INTENT(IN)       :: hrecfm ! article name to be read
   INTEGER, INTENT(OUT)        :: kval ! integer value for hrecfm article
-  INTEGER, INTENT(OUT)        :: kresp! return code null if OK
+  INTEGER(KIND=LFI_INT), INTENT(OUT):: kresp! return code null if OK
   !
   INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE::iwork
-  INTEGER :: iresp,ilenga,iposex,icomlen
+  INTEGER :: icomlen
+  INTEGER(KIND=LFI_INT) :: iresp,ilenga,iposex
   !
   CALL LFINFO(iresp,klu,hrecfm,ilenga,iposex)
   IF (iresp /=0 .OR. ilenga == 0) THEN
@@ -62,24 +66,29 @@ CONTAINS
   END IF
   END SUBROUTINE FMREADLFIN1
 
-  SUBROUTINE parse_lfi(klu, knaf, tpreclist, kbuflen)
+  SUBROUTINE parse_lfi(klu, hvarlist, knaf, tpreclist, kbuflen)
     INTEGER, INTENT(IN)                    :: klu
-    INTEGER, INTENT(IN)                    :: knaf
+    INTEGER, INTENT(INOUT)                 :: knaf
+    CHARACTER(LEN=*), intent(IN)           :: hvarlist
     TYPE(workfield), DIMENSION(:), POINTER :: tpreclist    
     INTEGER, INTENT(OUT)                   :: kbuflen
 
     INTEGER                                  :: ji,jj
-    INTEGER                                  :: ileng,ipos
+    INTEGER                                  :: ndb, nde
+    INTEGER                                  :: inaf
     LOGICAL                                  :: ladvan
-    INTEGER                                  :: iresp
     INTEGER                                  :: ich
     INTEGER                                  :: fsize,sizemax
     CHARACTER(LEN=FM_FIELD_SIZE)             :: yrecfm
 #ifdef LOWMEM
     INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork
 #endif
+    INTEGER(KIND=LFI_INT)                    :: iresp,ilu,ileng,ipos
     !JUAN CYCCL3
     INTEGER                        :: JPHEXT
+
+    ilu = klu
+
     CALL FMREADLFIN1(klu,'JPHEXT',JPHEXT,iresp)
     IF (iresp /= 0) JPHEXT=1
     ! First check if IMAX,JMAX,KMAX exist in LFI file
@@ -90,7 +99,7 @@ CONTAINS
     CALL FMREADLFIN1(klu,'JMAX',IDIMY,iresp)
     IF (iresp == 0) IDIMY = IDIMY+2*JPHEXT  ! JMAX + 2*JPHEXT
     !
-    CALL FMREADLFIN1(klu,'KMAX',IDIMZ,iresp)
+    CALL FMREADLFIN1(ilu,'KMAX',IDIMZ,iresp)
     IF (iresp == 0) IDIMZ = IDIMZ+2  ! KMAX + 2*JPVEXT
     GUSEDIM = (IDIMX*IDIMY > 0)
     IF (GUSEDIM) THEN
@@ -108,9 +117,6 @@ CONTAINS
     ALLOCATE(tpreclist(knaf))
     sizemax = 0
 
-    CALL LFIPOS(iresp,klu)
-    ladvan = .TRUE.
-
     ! Phase 1 : build articles list to convert.
     !
     !    Pour l'instant tous les articles du fichier LFI sont
@@ -118,28 +124,60 @@ CONTAINS
     !    compte un sous-ensemble d'article (liste definie par
     !    l'utilisateur par exemple)  
     !
-    DO ji=1,knaf
-       CALL LFICAS(iresp,klu,yrecfm,ileng,ipos,ladvan)
-       ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
-       tpreclist(ji)%name = yrecfm
-       IF (ileng > sizemax) sizemax = ileng        
+    IF (LEN_TRIM(hvarlist) > 0) THEN
+       ! A variable list is provided with -v var1,...
+       ndb  = 1
+       inaf = 0
+       DO ji=1,knaf
+          nde = INDEX(TRIM(hvarlist(ndb:)),',')
+          yrecfm = hvarlist(ndb:ndb+nde-2)
+          ndb = nde+ndb
+
+          CALL LFINFO(iresp,ilu,yrecfm,ileng,ipos)
+          
+          IF (iresp /= 0 .OR. ileng == 0) THEN
+             PRINT *,'Article ',TRIM(yrecfm), ' not found!'
+          ELSE
+             inaf = inaf+1
+             ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
+             tpreclist(inaf)%name = yrecfm
+             IF (ileng > sizemax) sizemax = ileng        
 #ifndef LOWMEM       
-       ALLOCATE(lfiart(ji)%iwtab(ileng))
+             ALLOCATE(lfiart(inaf)%iwtab(ileng))
 #endif
-    END DO
+          end IF
+       END DO
+    ELSE
+       ! Entire file is converted
+       CALL LFIPOS(iresp,ilu)
+       ladvan = .TRUE.
+       
+       DO ji=1,knaf
+          CALL LFICAS(iresp,ilu,yrecfm,ileng,ipos,ladvan)
+          ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
+          tpreclist(ji)%name = yrecfm
+          IF (ileng > sizemax) sizemax = ileng        
+#ifndef LOWMEM       
+          ALLOCATE(lfiart(ji)%iwtab(ileng))
+#endif
+       END DO
+       inaf = knaf
+    END IF
+
     kbuflen = sizemax
 #ifdef LOWMEM
     WRITE(*,'("Taille maximale du buffer :",f10.3," Mo")') sizemax*8./1048576.
     ALLOCATE(iwork(sizemax))
 #endif
+    
     ! Phase 2 : Extract comments and dimensions for valid articles.
     !           Infos are put in tpreclist.
     CALL init_dimCDF()
-    DO ji=1,knaf
+    DO ji=1,inaf
        yrecfm = tpreclist(ji)%name
-       CALL LFINFO(iresp,klu,yrecfm,ileng,ipos)
+       CALL LFINFO(iresp,ilu,yrecfm,ileng,ipos)
 #ifdef LOWMEM
-       CALL LFILEC(iresp,klu,yrecfm,iwork,ileng)
+       CALL LFILEC(iresp,ilu,yrecfm,iwork,ileng)
        tpreclist(ji)%TYPE = get_ftype(yrecfm)               
        tpreclist(ji)%grid = iwork(1)
 
@@ -150,7 +188,7 @@ CONTAINS
        END DO
        fsize = ileng-(2+iwork(2))
 #else
-       CALL LFILEC(iresp,klu,yrecfm,lfiart(ji)%iwtab,ileng)
+       CALL LFILEC(iresp,ilu,yrecfm,lfiart(ji)%iwtab,ileng)
        tpreclist(ji)%TYPE = get_ftype(yrecfm)               
        tpreclist(ji)%grid = lfiart(ji)%iwtab(1)
 
@@ -168,6 +206,7 @@ CONTAINS
 #ifdef LOWMEM
     DEALLOCATE(iwork)
 #endif
+    knaf = inaf
   END SUBROUTINE parse_lfi
   
   SUBROUTINE HANDLE_ERR(status,line)
@@ -179,8 +218,9 @@ CONTAINS
     END IF
   END SUBROUTINE HANDLE_ERR
 
-  SUBROUTINE def_ncdf(tpreclist,kcdf_id)
+  SUBROUTINE def_ncdf(tpreclist,knaf,kcdf_id)
     TYPE(workfield),DIMENSION(:),INTENT(IN) :: tpreclist    
+    INTEGER,                     INTENT(IN) :: knaf
     INTEGER,                     INTENT(OUT):: kcdf_id
 
     INTEGER :: status
@@ -209,7 +249,7 @@ CONTAINS
     PRINT *,'------------- NetCDF DEFINITION ---------------'
 
     ! define VARIABLES and ATTRIBUTES
-    DO ji=1,SIZE(tpreclist)
+    DO ji=1,knaf
       
        IF (ASSOCIATED(tpreclist(ji)%dim)) THEN
          IF (tpreclist(ji)%dim%create) THEN
@@ -296,10 +336,11 @@ CONTAINS
     
   END SUBROUTINE def_ncdf
 
-  SUBROUTINE fill_ncdf(klu,kcdf_id,tpreclist,kbuflen)
+  SUBROUTINE fill_ncdf(klu,kcdf_id,tpreclist,knaf,kbuflen)
     INTEGER,                      INTENT(IN):: klu
     INTEGER,                      INTENT(IN):: kcdf_id
-    TYPE(workfield), DIMENSION(:),INTENT(IN):: tpreclist    
+    TYPE(workfield), DIMENSION(:),INTENT(IN):: tpreclist
+    INTEGER,                      INTENT(IN):: knaf
     INTEGER,                      INTENT(IN):: kbuflen
 #ifdef LOWMEM
     INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork
@@ -309,11 +350,11 @@ CONTAINS
     REAL   (KIND=8),DIMENSION(:),ALLOCATABLE :: xtab
     CHARACTER, DIMENSION(:), ALLOCATABLE     :: ytab
     INTEGER                                  :: status
-    INTEGER                                  :: iresp
-    INTEGER                                  :: ileng
-    INTEGER                                  :: ipos
     INTEGER                                  :: extent
     INTEGER                                  :: ich
+    INTEGER(KIND=LFI_INT) :: iresp,ilu,ileng,ipos
+    !
+    ilu = klu
     !
 #if LOWMEM
     ALLOCATE(iwork(kbuflen))
@@ -321,10 +362,10 @@ CONTAINS
     ALLOCATE(itab(kbuflen))
     ALLOCATE(xtab(kbuflen))
 
-    DO ji=1,SIZE(tpreclist)
+    DO ji=1,knaf
 #if LOWMEM
-       CALL LFINFO(iresp,klu,tpreclist(ji)%name,ileng,ipos)
-       CALL LFILEC(iresp,klu,tpreclist(ji)%name,iwork,ileng)
+       CALL LFINFO(iresp,ilu,tpreclist(ji)%name,ileng,ipos)
+       CALL LFILEC(iresp,ilu,tpreclist(ji)%name,iwork,ileng)
 #endif
        IF (ASSOCIATED(tpreclist(ji)%dim)) THEN
           extent = tpreclist(ji)%dim%len
@@ -483,7 +524,6 @@ CONTAINS
     TYPE(workfield), DIMENSION(:), INTENT(IN) :: tpreclist
     INTEGER,                       INTENT(IN) :: kbuflen
     
-    INTEGER :: iresp
     INTEGER :: status
     INTEGER :: ivar,jj
     INTEGER(KIND=8), DIMENSION(:), POINTER  :: iwork
@@ -494,6 +534,7 @@ CONTAINS
     CHARACTER(LEN=FM_FIELD_SIZE)            :: yrecfm
 
     INTEGER :: iartlen, idlen, icomlen
+    INTEGER(KIND=LFI_INT) :: iresp,ilu,iartlen8
 
     ! Un article LFI est compose de :
     !   - 1 entier identifiant le numero de grille
@@ -575,69 +616,50 @@ CONTAINS
        yrecfm = str_replace(tpreclist(ivar)%name,'__','%')
        ! et des '.'
        yrecfm = str_replace(yrecfm,'--','.')
-       CALL LFIECR(iresp,klu,yrecfm,iwork,iartlen)
+       ilu = klu
+       iartlen8 = iartlen
+       CALL LFIECR(iresp,ilu,yrecfm,iwork,iartlen8)
 
     END DO
     DEALLOCATE(iwork,itab,xtab)
 
   END SUBROUTINE build_lfi
 
-  SUBROUTINE OPEN_FILES(olfi2cdf,hfnam,kcdf_id,klu,knaf)
-    LOGICAL,          INTENT(IN)  :: olfi2cdf
-    CHARACTER(LEN=*), INTENT(IN)  :: hfnam
+  SUBROUTINE OPEN_FILES(hinfile,houtfile,olfi2cdf,olfilist,ohdf5,kcdf_id,klu,knaf)
+    LOGICAL,          INTENT(IN)  :: olfi2cdf, olfilist, ohdf5
+    CHARACTER(LEN=*), INTENT(IN)  :: hinfile
+    CHARACTER(LEN=*), INTENT(IN)  :: houtfile
     INTEGER         , INTENT(OUT) :: kcdf_id,klu,knaf
 
-    INTEGER :: iverb,inap
     INTEGER                     :: extindex
+    INTEGER(KIND=LFI_INT)       :: ilu,iresp,iverb,inap,inaf
     INTEGER                     :: status
     CHARACTER(LEN=4)            :: ypextsrc, ypextdest
-    INTEGER, PARAMETER          :: ilu=11
-    CHARACTER(LEN(hfnam))       :: filename, basename
     LOGICAL                     :: fexist
     INTEGER                     :: omode
-    filename = hfnam
 
-    IF (olfi2cdf) THEN 
-       ypextsrc  = '.lfi'
-       ypextdest = '.cdf'
-    ELSE 
-       ypextsrc  = '.cdf'
-       ypextdest = '.lfi'
-    END IF
-
-    extindex = INDEX(filename,ypextsrc,.TRUE.)
-    IF (extindex /= 0) THEN
-       basename = filename(1:extindex-1)
-    ELSE
-       basename = filename
-    END IF
-    
-    INQUIRE(FILE=filename,EXIST=fexist)
-    IF (.NOT. fexist) THEN
-       filename = TRIM(basename)//ypextsrc
-       INQUIRE(FILE=filename,EXIST=fexist)     
-    END IF
-    
-    IF (.NOT. fexist) THEN
-       PRINT *, 'Erreur, le fichier ',TRIM(filename),' n''existe&
-            & pas...'
-       STOP
-    END IF
-    
-    PRINT *,'--> Fichier converti : ',TRIM(basename)//ypextdest
-    
     iverb = 0
-    
+    ilu   = 11
+
     CALL init_sysfield()
 
     IF (olfi2cdf) THEN 
        ! Cas LFI -> NetCDF
-       CALL LFIOUV(status,ilu,.TRUE.,filename,'UNKNOWN',.FALSE.&
-            & ,.FALSE.,iverb,inap,knaf)
-    
-       status = NF_CREATE(TRIM(basename)//ypextdest,&
-                IOR(NF_CLOBBER,NF_64BIT_OFFSET), kcdf_id)
+       CALL LFIOUV(iresp,ilu,ltrue,hinfile,'OLD',lfalse&
+            & ,lfalse,iverb,inap,inaf)
 
+       IF (olfilist) THEN
+          CALL LFILAF(iresp,ilu,lfalse)
+          CALL LFIFER(iresp,ilu,'KEEP')
+          return
+       end IF
+
+       IF (ohdf5) THEN
+          status = NF_CREATE(houtfile, IOR(NF_CLOBBER,NF_NETCDF4), kcdf_id)
+       ELSE
+          status = NF_CREATE(houtfile, IOR(NF_CLOBBER,NF_64BIT_OFFSET), kcdf_id) 
+       end IF
+       
        IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__)
 
        status = NF_SET_FILL(kcdf_id,NF_NOFILL,omode)
@@ -653,25 +675,30 @@ CONTAINS
        
     ELSE
        ! Cas NetCDF -> LFI
-       status = NF_OPEN(filename,NF_NOWRITE,kcdf_id)
+       status = NF_OPEN(hinfile,NF_NOWRITE,kcdf_id)
        IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__)
        
        inap = 100
-       CALL LFIOUV(status,ilu,.TRUE.,TRIM(basename)//ypextdest,'NEW'&
-            & ,.FALSE.,.FALSE.,iverb,inap,knaf)
+       CALL LFIOUV(iresp,ilu,ltrue,houtfile,'NEW'&
+            & ,lfalse,lfalse,iverb,inap,inaf)
     END IF
 
-    klu = ilu
+    klu  = ilu
+    knaf = inaf
+
+    PRINT *,'--> Fichier converti : ', houtfile
 
   END SUBROUTINE OPEN_FILES
   
   SUBROUTINE CLOSE_FILES(klu,kcdf_id)
     INTEGER, INTENT(IN) :: klu, kcdf_id
     
-    INTEGER :: status
+    INTEGER(KIND=LFI_INT) :: iresp,ilu
+    INTEGER               :: status
 
+    ilu = klu
     ! close LFI file
-    CALL LFIFER(status,klu,'KEEP')
+    CALL LFIFER(iresp,ilu,'KEEP')
 
     ! close NetCDF file
     status = NF_CLOSE(kcdf_id)
diff --git a/tools/lfi2cdf/src/newmain.c b/tools/lfi2cdf/src/newmain.c
new file mode 100644
index 000000000..05b93adc4
--- /dev/null
+++ b/tools/lfi2cdf/src/newmain.c
@@ -0,0 +1,148 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+
+#define BUFSIZE 4096
+
+extern lfi2cdfmain_(char*, int*, char*, int*, char*, int*, int*, int*, int*);
+
+char *cleancomma(char *varlist)
+{
+  char *ip, *op;
+
+  op = varlist;
+  
+  for (ip=varlist; *ip; ip++) {
+    if (*ip != ',' || *ip == ',' && *op != ',') 
+      *(++op) = *ip;
+  }
+  if (*op != ',') 
+    *(++op) = ',';
+
+  *(op+1) = '\0';
+  return varlist+1;
+}
+
+int main(int argc, char **argv)
+{
+  int ilen;
+  int list_flag;
+  int l2c_flag;
+  int hdf5_flag;
+  char *cmd, *infile;
+  int c;
+  char buff[BUFSIZE];
+  int varlistlen;
+  char *varlist;
+  char *p;
+  int lenopt;
+  char *outfile=NULL;
+  int olen=0;
+
+  cmd = strrchr(argv[0], '/');
+  if (cmd == NULL)
+    cmd = argv[0];
+  else
+    cmd++;
+  l2c_flag = strcmp(cmd, "lfi2cdf") == 0 ? 1 : 0;
+
+  list_flag = 0;
+  hdf5_flag = 0;
+  p = buff;
+  *p = '\0';
+
+  while (1) {
+    int option_index = 0;
+
+    static struct option long_options[] = {
+      {"cdf4",    no_argument,       0,  '4'},
+      {"list",  no_argument,       0,  'l' },
+      {"var",   required_argument, 0,  'v' },
+      {0,         0,                 0,  0 }
+    };
+
+    c = getopt_long(argc, argv, "lo:v:4",
+		    long_options, &option_index);
+    if (c == -1)
+      break;
+
+    switch (c) {
+    case 0:
+      printf("option %s", long_options[option_index].name);
+      if (optarg)
+	printf(" with arg %s", optarg);
+      printf("\n");
+      break;
+    case '4':
+      hdf5_flag = 1;
+      break;
+    case 'l':
+      list_flag = 1;
+      break;
+    case 'o':
+      outfile = optarg;
+      olen = strlen(outfile);
+      break;
+    case 'v':
+      if (l2c_flag) {
+	lenopt = strlen(optarg);
+	//	printf("option v with value '%s'\n", optarg);
+	if (p+lenopt > buff+BUFSIZE)
+	  printf("%s ignored in list\n", optarg);
+	else {
+	  *p++ = ',';
+	  strcpy(p, optarg);
+	  p += lenopt;
+	}
+      } else 
+	printf("option -v is ignored\n"); 
+      break;
+
+    default:
+      printf("?? getopt returned character code 0%o ??\n", c);
+    }
+  }
+
+  if (optind == argc) {
+    printf("usage : lfi2cdf [--cdf4 -4] [-l] [-v var1[,...]] [-o output-file.nc] input-file.lfi\n");
+    printf("        cdf2lfi [-o output-file.lfi] input-file.nc\n");
+    exit(EXIT_FAILURE);
+  } 
+
+  ilen = strlen(argv[optind]);
+  infile = argv[optind];
+
+  varlist = cleancomma(buff);
+  varlistlen = strlen(buff);
+  
+  if (outfile == NULL) {
+    /* determine outfile name from infile name */
+    char *cp, *sp;
+    cp = strrchr(infile, '/');
+    if (cp == 0)                /* no delimiter */
+      cp = infile;
+    else                        /* skip delimeter */
+      cp++;
+    outfile = (char*) malloc((unsigned)(strlen(cp)+5));
+    (void) strncpy(outfile, cp, strlen(cp) + 1);
+    if ((sp = strrchr(outfile, '.')) != NULL)
+      *sp = '\0';
+    if (l2c_flag){
+      char *ncext;
+      ncext = hdf5_flag ? ".nc4" : ".nc"; 
+      strcat(outfile,ncext);
+    } else
+      strcat(outfile,".lfi");
+    olen = strlen(outfile);
+  }
+
+  /*
+  printf("cmd=%s; inputfile=%s(%d); outputfile=%s(%d); varlistclean=%s with size : %d\n", cmd, 
+         infile, ilen, outfile, olen, varlist, varlistlen);
+  */
+
+  lfi2cdfmain_(infile, &ilen, outfile, &olen, varlist, &varlistlen, &l2c_flag, &list_flag, &hdf5_flag);
+
+  exit(EXIT_SUCCESS);
+}
-- 
GitLab