diff --git a/tools/diachro/Makefile.exrwdia b/tools/diachro/Makefile.exrwdia index 7698d9d31263ac153aeca714b1046eb19cef4487..3cec20ccd9f746bc868c421f62acb9687d9bcd94 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 72b2349d1c43bd37a98c9cbea63a3dacbbca912a..45d7d6bcac960b7c1c0adeabe3e763a72b5248df 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 d200ddfe505ed055d0dd5bb51c19e9fc7938e75b..89f8e183323f218f9264c58e2194da82e0e28810 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 904e6b27b78878a6ce5886becbd693e6d45aa67d..09bb4e4f91a8280ef3f337e729e0cce7b59cd656 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 0000000000000000000000000000000000000000..75a1e988162c51f43b4b2cd1ca4cba5fa003c61a --- /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 ee037a7d437a12413e1345fc4cd76896796856f3..cd16876f053ec2c67cd74f85447d207c7c665a0f 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 70c902b3189a9b46d71bdaff2f9ecfabb86ec2c9..6e2bce6046a1a5e779f032050e6b753b4f8121bc 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 0000000000000000000000000000000000000000..05b93adc42350acf8bfcabe36482149122436e84 --- /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); +}