diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index 4c0fc970840da06202bd886c4b8489dae022239f..b305c1aaada034e98869801a7a6006abb2793353 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -15,6 +15,7 @@ MODULE mode_util INTEGER,PARAMETER :: MAXRAW=10 INTEGER,PARAMETER :: MAXFILES=100 + INTEGER,parameter :: MAXDATES=100 INTEGER,PARAMETER :: FM_FIELD_SIZE = 32 @@ -54,6 +55,12 @@ CONTAINS TYPE(option),DIMENSION(:), INTENT(IN) :: options INTEGER, INTENT(IN) :: runmode + TYPE TLFIDATE + CHARACTER(LEN=FM_FIELD_SIZE) :: CNAME = '' !Name of the date variable + INTEGER :: NIDX_DATE = -1 !Index of the date part + INTEGER :: NIDX_TIME = -1 !Index of the time part + END TYPE TLFIDATE + CHARACTER(LEN=FM_FIELD_SIZE) :: yrecfm, YDATENAME CHARACTER(LEN=FM_FIELD_SIZE) :: var_calc CHARACTER(LEN=FM_FIELD_SIZE),dimension(MAXRAW) :: var_raw @@ -61,16 +68,16 @@ CONTAINS INTEGER :: ndb, nde, ndey, idx, idx_out, idx_var, maxvar INTEGER :: leng INTEGER :: sizemax - INTEGER :: IID, IRESP - INTEGER :: IDXDATE, IDXTIME, IDX1 + 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) :: idims, idimtmp INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: idim_id LOGICAL :: ladvan - LOGICAL :: GISDATE, GISTIME LOGICAL :: GOK + TYPE(TLFIDATE),DIMENSION(MAXDATES) :: TLFIDATES IF (options(OPTSPLIT)%set) THEN idx_out = 0 @@ -78,6 +85,8 @@ CONTAINS idx_out = 1 END IF + IDATES = 0 + IF (runmode==MODECDF2LFI) THEN !This file is a dummy one to manage netCDF dims idx_out = KNFILES_OUT @@ -274,9 +283,6 @@ END DO CALL LFIPOS(iresp2,ilu) ladvan = .TRUE. - GISDATE = .FALSE. - GISTIME = .FALSE. - YDATENAME = '' DO ji=1,nbvar_infile CALL LFICAS(iresp2,ilu,yrecfm,ileng,ipos,ladvan) tpreclist(ji)%name = trim(yrecfm) @@ -291,54 +297,49 @@ END DO CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','field in LFI file with %TDATE and %TIME in name '//TRIM(YRECFM)) IDX = MAX(IDXDATE,IDXTIME) IF (IDX>0) THEN - IF (LEN_TRIM(YDATENAME) == 0) THEN - !New date name detected - IDX1 = ji - YDATENAME = YRECFM(1:IDX-1) - IF (IDXDATE>0) GISDATE = .TRUE. - IF (IDXTIME>0) GISTIME = .TRUE. - ELSE - !Was already found => other field (date or time) is detected - IF (TRIM(YDATENAME)/=YRECFM(1:IDX-1)) STOP - IF (IDXDATE>0) THEN - IF (.NOT.GISDATE) THEN - GISDATE = .TRUE. - IF (GISTIME) THEN - tpreclist(ji)%name = 'removed_time' - tpreclist(ji)%tbw = .FALSE. - tpreclist(ji)%tbr = .FALSE. - tpreclist(ji)%found = .FALSE. - tpreclist(IDX1)%name = YDATENAME - ! - GISDATE = .FALSE. - GISTIME = .FALSE. - YDATENAME = '' - END IF - ELSE - CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','GISDATE is already TRUE for '//TRIM(YDATENAME)) - END IF - ELSE IF (IDXTIME>0) THEN - IF (.NOT.GISTIME) THEN - GISTIME = .TRUE. - IF (GISDATE) THEN - tpreclist(ji)%name = 'removed_date' - tpreclist(ji)%tbw = .FALSE. - tpreclist(ji)%tbr = .FALSE. - tpreclist(ji)%found = .FALSE. - tpreclist(IDX1)%name = YDATENAME - ! - GISDATE = .FALSE. - GISTIME = .FALSE. - YDATENAME = '' - END IF - ELSE - CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','GISTIME is already TRUE for '//TRIM(YDATENAME)) - END IF + YDATENAME = YRECFM(1:IDX-1) + !Look if datename is already known + ICURDATE = 0 + DO JJ=1,IDATES + IF (TRIM(YDATENAME)==TRIM(TLFIDATES(JJ)%CNAME)) THEN + ICURDATE = JJ + EXIT END IF + END DO + ! + IF (ICURDATE == 0) THEN + !New date name detected + IDATES = IDATES + 1 + IF (IDATES>MAXDATES) CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','too many dates, increase MAXDATES') + ICURDATE = IDATES + END IF + TLFIDATES(ICURDATE)%CNAME = TRIM(YDATENAME) + IF (IDXTIME>0) THEN + IF (TLFIDATES(ICURDATE)%NIDX_TIME /= -1) & + CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','NIDX_TIME already set for '//TRIM(YDATENAME)) + TLFIDATES(ICURDATE)%NIDX_TIME = JI + !Set variable name to truncated name (necessary to correctly identify the variable when read) + tpreclist(ji)%name = TRIM(YDATENAME) + END IF + IF (IDXDATE>0) THEN + IF (TLFIDATES(ICURDATE)%NIDX_DATE /= -1) & + CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','NIDX_DATE already set for '//TRIM(YDATENAME)) + TLFIDATES(ICURDATE)%NIDX_DATE = JI + !Do not treat this variable (the date part will be read with the time part) + tpreclist(ji)%name = 'removed_date' + tpreclist(ji)%tbw = .FALSE. + tpreclist(ji)%tbr = .FALSE. + tpreclist(ji)%found = .FALSE. END IF END IF END DO ! + DO JI=1,IDATES + IF (TLFIDATES(JI)%NIDX_DATE == -1 .OR. TLFIDATES(JI)%NIDX_TIME == -1) & + CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','incomplete DATE/TIME fields for '//TRIM(TLFIDATES(JI)%CNAME)) + END DO + + ! ELSE IF (INFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN DO ji=1,nbvar_infile var_id = ji @@ -797,6 +798,7 @@ END DO USE MODD_IO_ll, ONLY: LIOCDF4 USE MODD_PARAMETERS, ONLY: JPHEXT USE MODD_PARAMETERS_ll, ONLY: JPHEXT_ll=>JPHEXT, JPVEXT_ll=>JPVEXT + USE MODD_TIME_n, ONLY: TDTMOD USE MODE_FM, ONLY: IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST @@ -885,9 +887,12 @@ END DO CALL IO_READ_FIELD(INFILES(1)%TFILE,'ZHAT',XZHAT) ALLOCATE(LSLEVE) CALL IO_READ_FIELD(INFILES(1)%TFILE,'SLEVE',LSLEVE) + ALLOCATE(TDTMOD) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'DTMOD',TDTMOD) END IF END IF ! + ! ! Outfiles ! IF (runmode == MODELFI2CDF .OR. runmode == MODECDF2CDF) THEN @@ -900,7 +905,7 @@ END DO idx = KNFILES_OUT CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,HOUTFILE,'UNKNOWN','WRITE', & HFORMAT='NETCDF4',OOLD=.TRUE.) - CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) + CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE) IF (options(OPTCOMPRESS)%set) THEN outfiles(idx)%tfile%LNCCOMPRESS = .TRUE. @@ -934,7 +939,7 @@ END DO idx = KNFILES_OUT CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,'dummy_file','UNKNOWN','WRITE', & HFORMAT='NETCDF4',OOLD=.TRUE.) - CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) + CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE) END IF PRINT *,'--> Converted to file: ', TRIM(houtfile) @@ -987,7 +992,7 @@ END DO filename = trim(houtfile)//'.'//TRIM(YVARS(ji)) CALL IO_FILE_ADD2LIST(outfiles(ji)%TFILE,filename,'UNKNOWN','WRITE', & HFORMAT='NETCDF4') - CALL IO_FILE_OPEN_ll(outfiles(ji)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) + CALL IO_FILE_OPEN_ll(outfiles(ji)%TFILE) IF (options(OPTCOMPRESS)%set) THEN outfiles(ji)%tfile%LNCCOMPRESS = .TRUE. @@ -1014,7 +1019,7 @@ END DO DO ji=1,KNFILES - IF (filelist(ji)%TFILE%LOPENED) CALL IO_FILE_CLOSE_ll(filelist(ji)%TFILE) + IF (filelist(ji)%TFILE%LOPENED) CALL IO_FILE_CLOSE_ll(filelist(ji)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) END DO END SUBROUTINE CLOSE_FILES