diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index fc7a2142a6e1bc14adbb3cc240b779965eead752..5f73e9741c5716df738320de6cbc5d68c18a1ab9 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -45,6 +45,7 @@ MODULE mode_util LOGICAL :: calc ! T if computed from other variables LOGICAL :: tbw ! to be written or not LOGICAL :: tbr ! to be read or not + INTEGER :: NSRC = 0 ! Number of variables used to compute the variable (needed only if calc=.true.) INTEGER,DIMENSION(MAXRAW) :: src ! List of variables used to compute the variable (needed only if calc=.true.) INTEGER :: tgt ! Target: id of the variable that use it (calc variable) TYPE(TFIELDDATA) :: TFIELD ! Metadata about the field @@ -99,6 +100,7 @@ CONTAINS INTEGER, DIMENSION(10) :: idim_id INTEGER :: IDXDATE, IDXTIME, IDX1 LOGICAL :: GISDATE, GISTIME + LOGICAL :: GOK IF (infiles%files(1)%format == LFI_FORMAT) THEN ilu = infiles%files(1)%lun_id @@ -181,6 +183,7 @@ CONTAINS tpreclist(idx_var)%calc = .TRUE. tpreclist(idx_var)%tbw = .TRUE. tpreclist(idx_var)%tbr = .FALSE. + tpreclist(idx_var)%NSRC = idx-1 idx_var=idx_var+1 DO jj = 1, idx-1 tpreclist(idx_var-jj)%src(jj) = idx_var @@ -363,8 +366,8 @@ END DO END IF ! Check if variable is in TFIELDLIST and populate corresponding metadata - DO ji=1,nbvar_infile - IF (.NOT.tpreclist(ji)%found) CYCLE + DO ji=1,maxvar + IF (.NOT.tpreclist(ji)%found .OR. tpreclist(ji)%calc ) CYCLE ! !Do not treat dimension variables (they are automatically added when creating netCDF file) IF ( tpreclist(ji)%name == 'ni' & @@ -400,6 +403,101 @@ END DO END IF END DO + IF (nbvar_calc>0) THEN + !Calculated variables + !Done after previous loop to reuse metadate from component variables + !Derive metadata from its components + !If same value for all components => take it + !If not => nothing or default value + !Check sizes: must be the same for all + DO ji=1,maxvar + IF (.NOT.tpreclist(ji)%calc ) CYCLE + ! + tpreclist(ji)%TFIELD%CMNHNAME = tpreclist(ji)%name + tpreclist(ji)%TFIELD%CSTDNAME = '' + tpreclist(ji)%TFIELD%CLONGNAME = tpreclist(ji)%name + ! + GOK = .TRUE. + DO jj=1,tpreclist(ji)%NSRC + idx_var = tpreclist(ji)%src(jj) + IF(.NOT.tpreclist(idx_var)%found) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','some components for calculated variable ' & + //TRIM(tpreclist(ji)%name)//' are not known => ignored') + tpreclist(ji)%tbw = .FALSE. + tpreclist(ji)%tbr = .FALSE. + tpreclist(ji)%found = .FALSE. + GOK = .FALSE. + EXIT + END IF + END DO + ! + IF (GOK) THEN + idx_var = tpreclist(ji)%src(1) + tpreclist(ji)%TFIELD%CUNITS = tpreclist(idx_var)%TFIELD%CUNITS + tpreclist(ji)%TFIELD%CDIR = tpreclist(idx_var)%TFIELD%CDIR + tpreclist(ji)%TFIELD%CLBTYPE = tpreclist(idx_var)%TFIELD%CLBTYPE + tpreclist(ji)%TFIELD%CCOMMENT = TRIM(tpreclist(ji)%name)//'='//TRIM(tpreclist(idx_var)%name) + IF (tpreclist(ji)%NSRC>1) tpreclist(ji)%TFIELD%CCOMMENT = TRIM(tpreclist(ji)%TFIELD%CCOMMENT)//'+' + tpreclist(ji)%TFIELD%NGRID = tpreclist(idx_var)%TFIELD%NGRID + tpreclist(ji)%TFIELD%NTYPE = tpreclist(idx_var)%TFIELD%NTYPE + tpreclist(ji)%TFIELD%NDIMS = tpreclist(idx_var)%TFIELD%NDIMS +#if 0 +!PW: TODO? + tpreclist(ji)%TFIELD%NFILLVALUE + tpreclist(ji)%TFIELD%XFILLVALUE + tpreclist(ji)%TFIELD%NVALIDMIN + tpreclist(ji)%TFIELD%NVALIDMAX + tpreclist(ji)%TFIELD%XVALIDMIN + tpreclist(ji)%TFIELD%XVALIDMAX +#endif + DO jj=2,tpreclist(ji)%NSRC + idx_var = tpreclist(ji)%src(jj) + ! + IF (tpreclist(ji)%TFIELD%CUNITS /= tpreclist(idx_var)%TFIELD%CUNITS) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','CUNITS is not uniform between components of calculated variable '& + //TRIM(tpreclist(ji)%name)//' => CUNITS not set') + tpreclist(ji)%TFIELD%CUNITS = '' + END IF + ! + IF (tpreclist(ji)%TFIELD%CDIR /= tpreclist(idx_var)%TFIELD%CDIR) THEN + CALL PRINT_MSG(NVERB_ERROR,'IO','parse_infiles','CDIR is not uniform between components of calculated variable '& + //TRIM(tpreclist(ji)%name)//' => CDIR=--') + tpreclist(ji)%TFIELD%CDIR = '--' + END IF + ! + IF (tpreclist(ji)%TFIELD%CLBTYPE /= tpreclist(idx_var)%TFIELD%CLBTYPE) THEN + CALL PRINT_MSG(NVERB_ERROR,'IO','parse_infiles','CLBTYPE is not uniform between components of calculated variable '& + //TRIM(tpreclist(ji)%name)//' => CLBTYPE=NONE') + tpreclist(ji)%TFIELD%CLBTYPE = 'NONE' + END IF + ! + tpreclist(ji)%TFIELD%CCOMMENT = TRIM(tpreclist(ji)%TFIELD%CCOMMENT)//TRIM(tpreclist(idx_var)%name) + IF (jj<tpreclist(ji)%NSRC) tpreclist(ji)%TFIELD%CCOMMENT = TRIM(tpreclist(ji)%TFIELD%CCOMMENT)//'+' + ! + IF (tpreclist(ji)%TFIELD%NGRID /= tpreclist(idx_var)%TFIELD%NGRID) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','NGRID is not uniform between components of calculated variable '& + //TRIM(tpreclist(ji)%name)//' => NGRID=1') + tpreclist(ji)%TFIELD%NGRID = 1 + END IF + ! + IF (tpreclist(ji)%TFIELD%NTYPE /= tpreclist(idx_var)%TFIELD%NTYPE) THEN + CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','NTYPE is not uniform between components of calculated variable '& + //TRIM(tpreclist(ji)%name)) + tpreclist(ji)%TFIELD%NTYPE = TYPEUNDEF + END IF + ! + IF (tpreclist(ji)%TFIELD%NDIMS /= tpreclist(idx_var)%TFIELD%NDIMS) THEN + CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','NDIMS is not uniform between components of calculated variable '& + //TRIM(tpreclist(ji)%name)) + END IF + END DO + ! + ALLOCATE(tpreclist(ji)%TDIMS(tpreclist(ji)%TFIELD%NDIMS)) + ! + END IF + END DO !ji=1,maxvar + END IF !nbvar_calc>0 + kbuflen = sizemax WRITE(*,'("Taille maximale du buffer :",f10.3," Mio")') sizemax*8./1048576. @@ -443,14 +541,6 @@ END DO tpreclist(ji)%dim=>get_dimCDF(fsize) END DO - !Complete info for calculated variables - IF (nbvar_calc>0) THEN - DO ji=1,maxvar - IF (.NOT.tpreclist(ji)%calc) CYCLE - tpreclist(ji)%dim => tpreclist(tpreclist(ji)%src(1))%dim - END DO - END IF - PRINT *,'Nombre de dimensions = ', size_dimCDF() DEALLOCATE(iwork) END SUBROUTINE parse_infiles @@ -591,12 +681,23 @@ INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng) extent = ileng - 2 - iwork(2) !iwork(2) = comment length itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1) + ! Determine TDIMS + CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(src)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2) + IF (IRESP2/=0) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// & + ' => ignored') + CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// & + ' => ignored') + CYCLE + ELSE + tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS + END IF jj = 2 - DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW) + DO jj=2,tpreclist(ji)%NSRC src=tpreclist(ji)%src(jj) CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng) +!PW: TODO: check same dimensions itab(1:extent) = itab(1:extent) + iwork(3+iwork(2):3+iwork(2)+extent-1) - jj=jj+1 END DO ENDIF @@ -699,11 +800,23 @@ print *,'PW:TODO' CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),ileng,ipos) CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng) extent = ileng - 2 - iwork(2) !iwork(2) = comment length + ! Determine TDIMS + CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(src)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2) + IF (IRESP2/=0) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// & + ' => ignored') + CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// & + ' => ignored') + CYCLE + ELSE + tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS + END IF itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1) jj = 2 DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW) src=tpreclist(ji)%src(jj) CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng) +!PW: TODO: check same dimensions itab(1:extent) = itab(1:extent) + iwork(3+iwork(2):3+iwork(2)+extent-1) jj=jj+1 END DO @@ -803,11 +916,23 @@ print *,'PW:TODO' CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),ileng,ipos) CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng) extent = ileng - 2 - iwork(2) !iwork(2) = comment length + ! Determine TDIMS + CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx)%TFILE,tpreclist(src)%TFIELD,extent,tpreclist(src)%TDIMS,IRESP2) + IF (IRESP2/=0) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(src)%TFIELD%CMNHNAME// & + ' => ignored') + CALL PRINT_MSG(NVERB_WARNING,'IO','fill_ncdf','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// & + ' => ignored') + CYCLE + ELSE + tpreclist(ji)%TDIMS = tpreclist(src)%TDIMS + END IF xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /)) jj = 2 DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW) src=tpreclist(ji)%src(jj) CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng) +!PW: TODO: check same dimensions xtab(1:extent) = xtab(1:extent) + TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /)) jj=jj+1 END DO