From 292d063d68beb49cccf0bcdd21a2d28761f8a0b9 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 13 Mar 2018 09:47:26 +0100 Subject: [PATCH] Philippe 13/03/2018: lfi2cdf: multiple changes to use new data structures (commit not very clean) --- LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 | 2 +- LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 | 3 +- LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 647 ++++++++++---------- 3 files changed, 336 insertions(+), 316 deletions(-) diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 index 1159504b7..fd61b5533 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 @@ -159,7 +159,7 @@ program LFI2CDF ELSE ! Conversion NetCDF -> LFI CALL parse_infiles(infiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options,current_level) - CALL build_lfi(infiles,outfiles,tzreclist,ibuflen) + CALL build_lfi(infiles,outfiles,tzreclist,nbvar_infile,ibuflen) END IF CALL CLOSE_FILES(infiles) diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 index 005a87f3d..06105bee0 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 @@ -220,7 +220,6 @@ subroutine check_options(options,infile,runmode) integer :: idx1, idx2 - !Check if help has been asked if (options(OPTHELP)%set) then call help() @@ -276,7 +275,7 @@ subroutine help() print *,"Options:" print *," --compress, -c compression_level" print *," Compress data. The compression level should be in the 1 to 9 interval." - print *," Only supported with the netCDF-4 format (cdf2cdf and lfi2cdf only)" + print *," Only supported with the netCDF format (cdf2cdf and lfi2cdf only)" print *," --help, -h" print *," Print this text" print *," --list, -l" diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index 2f6736900..b71d40e62 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -1,5 +1,6 @@ MODULE mode_util - USE MODD_IO_ll, ONLY: TFILE_ELT + USE MODD_IO_ll, ONLY: TFILE_ELT + USE MODD_NETCDF, ONLY: DIMCDF, IDCDF_KIND USE MODD_PARAM USE mode_dimlist @@ -37,16 +38,17 @@ MODULE mode_util TYPE workfield - CHARACTER(LEN=FM_FIELD_SIZE) :: name ! nom du champ - TYPE(dimCDFl2c), POINTER :: dim - INTEGER :: id_in = -1, id_out = -1 - LOGICAL :: found ! T if found in the input file - LOGICAL :: calc ! T if computed from other variables - LOGICAL :: tbw ! to be written or not - LOGICAL :: tbr ! to be read or not - 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 + CHARACTER(LEN=FM_FIELD_SIZE) :: name ! nom du champ + TYPE(dimCDFl2c), POINTER :: dim + INTEGER :: id_in = -1, id_out = -1 + LOGICAL :: found ! T if found in the input file + LOGICAL :: calc ! T if computed from other variables + LOGICAL :: tbw ! to be written or not + LOGICAL :: tbr ! to be read or not + 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 + TYPE(DIMCDF),DIMENSION(:),ALLOCATABLE :: TDIMS ! Dimensions of the field END TYPE workfield LOGICAL(KIND=LFI_INT), PARAMETER :: ltrue = .TRUE. @@ -100,26 +102,15 @@ CONTAINS IF (infiles%files(1)%format == LFI_FORMAT) THEN ilu = infiles%files(1)%lun_id - ! update IDIMX,IDIMY,IDIMZ - IDIMX = NIMAX_ll+2*JPHEXT - IDIMY = NJMAX_ll+2*JPHEXT - IDIMZ = NKMAX +2*JPVEXT ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN kcdf_id = infiles%files(1)%lun_id - - status = NF90_INQ_DIMID(kcdf_id, "DIMX", idim_id(1)) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - status = NF90_INQUIRE_DIMENSION(kcdf_id,idim_id(1),len = IDIMX) - - status = NF90_INQ_DIMID(kcdf_id, "DIMY", idim_id(2)) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - status = NF90_INQUIRE_DIMENSION(kcdf_id,idim_id(2),len = IDIMY) - - status = NF90_INQ_DIMID(kcdf_id, "DIMZ", idim_id(3)) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - status = NF90_INQUIRE_DIMENSION(kcdf_id,idim_id(3),len = IDIMZ) END IF + ! update IDIMX,IDIMY,IDIMZ + IDIMX = NIMAX_ll+2*JPHEXT + IDIMY = NJMAX_ll+2*JPHEXT + IDIMZ = NKMAX +2*JPVEXT + GUSEDIM = (IDIMX*IDIMY > 0) IF (GUSEDIM) THEN PRINT *,'MESONH 3D, 2D articles DIMENSIONS used :' @@ -340,21 +331,6 @@ END DO END IF END DO ! - ! Check if variable is in TFIELDLIST and populate corresponding metadata - DO ji=1,nbvar_infile - IF (.NOT.tpreclist(ji)%found) CYCLE - ! - CALL FIND_FIELD_ID_FROM_MNHNAME(tpreclist(ji)%name,IID,IRESP) - IF (IRESP==0) THEN - tpreclist(ji)%TFIELD = TFIELDLIST(IID) - ELSE !Field not found in list - CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','variable '//TRIM(tpreclist(ji)%name)//' is not known => ignored') - tpreclist(ji)%tbw = .FALSE. - tpreclist(ji)%tbr = .FALSE. - tpreclist(ji)%found = .FALSE. - END IF - END DO - ! ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN DO ji=1,nbvar_infile tpreclist(ji)%id_in = ji @@ -386,6 +362,44 @@ END DO maxvar = nbvar_infile END IF + ! Check if variable is in TFIELDLIST and populate corresponding metadata + DO ji=1,nbvar_infile + IF (.NOT.tpreclist(ji)%found) CYCLE + ! + !Do not treat dimension variables (they are automatically added when creating netCDF file) + IF ( tpreclist(ji)%name == 'ni' & + .OR. tpreclist(ji)%name == 'nj' & + .OR. tpreclist(ji)%name == 'ni_u' & + .OR. tpreclist(ji)%name == 'nj_u' & + .OR. tpreclist(ji)%name == 'ni_v' & + .OR. tpreclist(ji)%name == 'nj_v' & + .OR. tpreclist(ji)%name == 'latitude' & + .OR. tpreclist(ji)%name == 'longitude' & + .OR. tpreclist(ji)%name == 'latitude_u' & + .OR. tpreclist(ji)%name == 'longitude_u' & + .OR. tpreclist(ji)%name == 'latitude_v' & + .OR. tpreclist(ji)%name == 'longitude_v' & + .OR. tpreclist(ji)%name == 'latitude_f' & + .OR. tpreclist(ji)%name == 'longitude_f' & + .OR. tpreclist(ji)%name == 'level' & + .OR. tpreclist(ji)%name == 'level_w' ) THEN + tpreclist(ji)%tbw = .FALSE. + tpreclist(ji)%tbr = .FALSE. + tpreclist(ji)%found = .FALSE. + ELSE + CALL FIND_FIELD_ID_FROM_MNHNAME(tpreclist(ji)%name,IID,IRESP) + IF (IRESP==0) THEN + tpreclist(ji)%TFIELD = TFIELDLIST(IID) + ALLOCATE(tpreclist(ji)%TDIMS(tpreclist(ji)%TFIELD%NDIMS)) + ELSE !Field not found in list + CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','variable '//TRIM(tpreclist(ji)%name)//' is not known => ignored') + tpreclist(ji)%tbw = .FALSE. + tpreclist(ji)%tbr = .FALSE. + tpreclist(ji)%found = .FALSE. + END IF + END IF + END DO + kbuflen = sizemax WRITE(*,'("Taille maximale du buffer :",f10.3," Mio")') sizemax*8./1048576. @@ -451,6 +465,8 @@ END DO END SUBROUTINE HANDLE_ERR SUBROUTINE def_ncdf(outfiles,tpreclist,nbvar,options) + USE MODE_NETCDF, ONLY: IO_WRITE_HEADER_NC4 + TYPE(filelist_struct), INTENT(IN) :: outfiles TYPE(workfield),DIMENSION(:),INTENT(INOUT) :: tpreclist INTEGER, INTENT(IN) :: nbvar @@ -459,6 +475,7 @@ END DO INTEGER :: compress_level, status INTEGER :: idx, ji, nbfiles INTEGER :: kcdf_id + INTEGER :: IID, IRESP TYPE(dimCDFl2c), POINTER :: tzdim INTEGER :: invdims INTEGER :: type_float @@ -478,142 +495,30 @@ END DO kcdf_id = outfiles%files(ji)%lun_id ! global attributes - status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'Title',VERSION_ID) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - ! define DIMENSIONS - tzdim=>first_DimCDF() - DO WHILE(ASSOCIATED(tzdim)) - IF (tzdim%create) THEN - status = NF90_DEF_DIM(kcdf_id,tzdim%name,tzdim%len,tzdim%id) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - END IF - tzdim=>tzdim%next - END DO - END DO - - PRINT *,'------------- NetCDF DEFINITION ---------------' - - ! define VARIABLES and ATTRIBUTES - idx = 1 - DO ji=1,nbvar - IF (.NOT.tpreclist(ji)%tbw) CYCLE - - IF (ASSOCIATED(tpreclist(ji)%dim)) THEN - IF (tpreclist(ji)%dim%create) THEN - invdims = 1 - ivdims(1) = tpreclist(ji)%dim%id - ELSE - invdims = tpreclist(ji)%dim%ndims - IF(options(OPTMERGE)%set) invdims=invdims+1 !when merging variables from LFI splitted files - SELECT CASE(invdims) - CASE(2) - ivdims(1)=ptdimx%id - ivdims(2)=ptdimy%id - CASE(3) - ivdims(1)=ptdimx%id - ivdims(2)=ptdimy%id - ivdims(3)=ptdimz%id - CASE(12) - ivdims(1)=ptdimx%id - ivdims(2)=ptdimz%id - invdims = 2 ! on retablit la bonne valeur du nbre de dimension - CASE default - PRINT *,'Fatal error in NetCDF dimension definition' - STOP - END SELECT - END IF - ELSE - ! scalar variables - invdims = 0 - ivdims(1) = 0 ! ignore dans ce cas - END IF - - ! Variables definition - - !! NetCDF n'aime pas les '%' dans le nom des variables - !! "%" remplaces par '__' - ycdfvar = str_replace(tpreclist(ji)%name,'%','__') - !! ni les '.' remplaces par '--' - ycdfvar = str_replace(ycdfvar,'.','--') - - kcdf_id = outfiles%files(idx)%lun_id - - SELECT CASE(tpreclist(ji)%TFIELD%NTYPE) - CASE (TYPECHAR) -! PRINT *,'TYPECHAR : ',tpreclist(ji)%name - status = NF90_DEF_VAR(kcdf_id,ycdfvar,NF90_CHAR,& - ivdims(:invdims),tpreclist(ji)%id_out) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - CASE (TYPEINT) -! PRINT *,'TYPEINT : ',tpreclist(ji)%name - status = NF90_DEF_VAR(kcdf_id,ycdfvar,NF90_INT,& - ivdims(:invdims),tpreclist(ji)%id_out) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - CASE (TYPELOG) -! PRINT *,'TYPELOG : ',tpreclist(ji)%name - status = NF90_DEF_VAR(kcdf_id,ycdfvar,NF90_INT1,& - ivdims(:invdims),tpreclist(ji)%id_out) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - CASE(TYPEREAL) -! PRINT *,'TYPEREAL : ',tpreclist(ji)%name - status = NF90_DEF_VAR(kcdf_id,ycdfvar,type_float,& - ivdims(:invdims),tpreclist(ji)%id_out) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - CASE(TYPEDATE) -! PRINT *,'TYPEDATE : ',tpreclist(ji)%name - status = NF90_DEF_VAR(kcdf_id,ycdfvar,NF90_DOUBLE,& - ivdims(:invdims),tpreclist(ji)%id_out) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - - CASE default - PRINT *,'ATTENTION : ',TRIM(tpreclist(ji)%name),' est de& - & TYPE inconnu --> force a REAL' - status = NF90_DEF_VAR(kcdf_id,ycdfvar,type_float,& - ivdims(:invdims),tpreclist(ji)%id_out) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - - END SELECT - - ! Compress data (costly operation for the CPU) - IF (options(OPTCOMPRESS)%set .AND. invdims>0) THEN - compress_level = options(OPTCOMPRESS)%ivalue - status = NF90_DEF_VAR_DEFLATE(kcdf_id,tpreclist(ji)%id_out,1,1,compress_level) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - END IF - - - IF (options(OPTSPLIT)%set) idx = idx + 1 + CALL IO_WRITE_HEADER_NC4(outfiles%TFILES(ji)%TFILE) + ! +! status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'Title',VERSION_ID) +! IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) END DO - DO ji = 1,nbfiles - kcdf_id = outfiles%files(ji)%lun_id - status = NF90_ENDDEF(kcdf_id) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - END DO - END SUBROUTINE def_ncdf SUBROUTINE fill_ncdf(infiles,outfiles,tpreclist,knaf,kbuflen,options,current_level) USE MODD_TYPE_DATE - TYPE(filelist_struct), INTENT(IN):: infiles, outfiles - TYPE(workfield), DIMENSION(:),INTENT(IN):: tpreclist - INTEGER, INTENT(IN):: knaf - INTEGER, INTENT(IN):: kbuflen - TYPE(option),DIMENSION(:), INTENT(IN):: options - INTEGER, INTENT(IN), OPTIONAL :: current_level + USE MODE_NETCDF, ONLY: IO_GUESS_DIMIDS_NC4 + + TYPE(filelist_struct), INTENT(IN) :: infiles, outfiles + TYPE(workfield), DIMENSION(:),INTENT(INOUT) :: tpreclist + INTEGER, INTENT(IN) :: knaf + INTEGER, INTENT(IN) :: kbuflen + TYPE(option),DIMENSION(:), INTENT(IN) :: options + INTEGER, OPTIONAL, INTENT(IN) :: current_level INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork INTEGER :: idx, ji,jj INTEGER :: kcdf_id - INTEGER :: status +! INTEGER :: status INTEGER :: extent, ndims INTEGER :: ich INTEGER :: IID, IRESP2 @@ -621,15 +526,25 @@ END DO INTEGER :: level INTEGER(KIND=LFI_INT) :: iresp,ilu,ileng,ipos CHARACTER(LEN=4) :: suffix - INTEGER,DIMENSION(3) :: idims, start +! INTEGER,DIMENSION(3) :: idims, start + INTEGER,DIMENSION(3) :: start INTEGER,DIMENSION(:),ALLOCATABLE :: itab LOGICAL,DIMENSION(:),ALLOCATABLE :: gtab - REAL(KIND=8),DIMENSION(:),ALLOCATABLE :: xtab - CHARACTER, DIMENSION(:), ALLOCATABLE :: ytab - REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: xtab3d, xtab3d2 + REAL,DIMENSION(:),ALLOCATABLE :: xtab +! CHARACTER, DIMENSION(:), ALLOCATABLE :: ytab + CHARACTER(LEN=:), ALLOCATABLE :: ytab + REAL, DIMENSION(:,:), ALLOCATABLE :: xtab2d + REAL, DIMENSION(:,:,:), ALLOCATABLE :: xtab3d, xtab3d2 + REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: xtab4d INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: itab3d, itab3d2 TYPE(DATE_TIME) :: TZDATE +INTEGER(KIND=IDCDF_KIND) :: STATUS +INTEGER(KIND=IDCDF_KIND) :: INCID +INTEGER(KIND=IDCDF_KIND) :: IVARID +INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions +INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IVDIMS +INTEGER(KIND=IDCDF_KIND),DIMENSION(NF90_MAX_VAR_DIMS) :: IDIMLEN ! IF (infiles%files(1)%format == LFI_FORMAT) ilu = infiles%files(1)%lun_id ! @@ -653,31 +568,7 @@ END DO kcdf_id = outfiles%files(idx)%lun_id - IF (ASSOCIATED(tpreclist(ji)%dim)) THEN - extent = tpreclist(ji)%dim%len - ndims = tpreclist(ji)%dim%ndims - ELSE - extent = 1 - ndims = 0 - END IF - -! PRINT *,'Dimensions (',ndims,') for ',TRIM(tpreclist(ji)%name) - idims(:) = 1 - if(ndims>0) idims(1) = ptdimx%len - if(ndims>1) idims(2) = ptdimy%len - if(ndims>2) idims(3) = ptdimz%len - if(ndims>3) then - if(ndims==12) then - ndims = 2 - idims(2) = ptdimz%len - else - PRINT *,'Too many dimensions (',ndims,') for ',TRIM(tpreclist(ji)%name) - STOP - endif - endif - -!write(*,"( '----------------------------------------' )") -!write(*,"( 'Field :',A )") trim(tpreclist(ji)%name) + ndims = tpreclist(ji)%TFIELD%NDIMS SELECT CASE(tpreclist(ji)%TFIELD%NTYPE) CASE (TYPEINT) @@ -685,11 +576,15 @@ END DO IF (.NOT.tpreclist(ji)%calc) THEN CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),ileng,ipos) CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%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(ji)%TFIELD,extent,tpreclist(ji)%TDIMS) itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1) ELSE src=tpreclist(ji)%src(1) 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 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) @@ -703,19 +598,49 @@ END DO !TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z) SELECT CASE(ndims) CASE (0) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:extent)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1)) CASE (1) - status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:extent)) CASE (2) - status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(itab,(/ptdimx%len,ptdimy%len/)), & - start = (/1,1,level/) ) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(itab,tpreclist(ji)%TDIMS(1:2)%LEN)) +! status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(itab,(/ptdimx%len,ptdimy%len/)), & +! start = (/1,1,level/) ) CASE (3) - status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(itab,(/ptdimx%len,ptdimy%len,ptdimz%len/))) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(itab,tpreclist(ji)%TDIMS(1:3)%LEN)) CASE DEFAULT print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported' END SELECT ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN +INCID = infiles%TFILES(1)%TFILE%NNCID +STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +if (ndims/=idims) then +print *,'aieeeeeee' +stop +end if +DO JJ=1,IDIMS + STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ)) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +END DO + SELECT CASE(ndims) + CASE (0) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,itab(1)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1)) + CASE (1) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,itab(1:IDIMLEN(1))) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:IDIMLEN(1))) + CASE (2) +print *,'PW:TODO' + CASE (3) +print *,'PW:TODO' + CASE DEFAULT + print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported' + END SELECT + +#if 0 ALLOCATE( itab3d(idims(1),idims(2),idims(3)) ) IF (.NOT.tpreclist(ji)%calc) THEN status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,itab3d) @@ -746,6 +671,7 @@ END DO IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) DEALLOCATE(itab3d) +#endif END IF @@ -754,11 +680,15 @@ END DO IF (.NOT.tpreclist(ji)%calc) THEN CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),ileng,ipos) CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%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(ji)%TFIELD,extent,tpreclist(ji)%TDIMS) itab(1:extent) = iwork(3+iwork(2):3+iwork(2)+extent-1) ELSE src=tpreclist(ji)%src(1) 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 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) @@ -779,7 +709,7 @@ END DO SELECT CASE(ndims) CASE (0) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1:extent)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1)) CASE (1) status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/)) CASE DEFAULT @@ -787,6 +717,34 @@ END DO END SELECT ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN +INCID = infiles%TFILES(1)%TFILE%NNCID +STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +if (ndims/=idims) then +print *,'aieeeeeee' +stop +end if +DO JJ=1,IDIMS + STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ)) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +END DO + SELECT CASE(ndims) + CASE (0) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,gtab(1)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1)) + CASE (1) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,gtab(1:IDIMLEN(1))) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1:IDIMLEN(1))) + CASE (2) +print *,'PW:TODO' + CASE (3) +print *,'PW:TODO' + CASE DEFAULT + print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported' + END SELECT +#if 0 ALLOCATE( itab3d(idims(1),idims(2),idims(3)) ) IF (.NOT.tpreclist(ji)%calc) THEN status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,itab3d) @@ -812,6 +770,7 @@ END DO IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) DEALLOCATE(itab3d) +#endif END IF @@ -820,11 +779,15 @@ END DO IF (.NOT.tpreclist(ji)%calc) THEN CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),ileng,ipos) CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%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(ji)%TFIELD,extent,tpreclist(ji)%TDIMS) xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /)) ELSE src=tpreclist(ji)%src(1) 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 xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /)) jj = 2 DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW) @@ -837,18 +800,60 @@ END DO !TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z) SELECT CASE(ndims) CASE (0) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:extent)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1)) CASE (1) - status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:extent)) CASE (2) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,(/ptdimx%len,ptdimy%len/))) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,tpreclist(ji)%TDIMS(1:2)%LEN)) CASE (3) - status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len,ptdimz%len/))) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,tpreclist(ji)%TDIMS(1:3)%LEN)) + CASE (4) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,tpreclist(ji)%TDIMS(1:4)%LEN)) CASE DEFAULT print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported' END SELECT ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN +INCID = infiles%TFILES(1)%TFILE%NNCID +STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +if (ndims/=idims) then +print *,'aieeeeeee' +stop +end if +DO JJ=1,IDIMS + STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ)) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +END DO + SELECT CASE(ndims) + CASE (0) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,xtab(1)) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1)) + CASE (1) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,xtab(1:IDIMLEN(1))) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:IDIMLEN(1))) + CASE (2) + ALLOCATE(XTAB2D(IDIMLEN(1),IDIMLEN(2))) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,XTAB2D) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB2D) + DEALLOCATE(XTAB2D) + CASE (3) + ALLOCATE(XTAB3D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3))) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,XTAB3D) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB3D) + DEALLOCATE(XTAB3D) + CASE (4) + ALLOCATE(XTAB4D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3),IDIMLEN(4))) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,XTAB4D) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB4D) + DEALLOCATE(XTAB4D) + CASE DEFAULT + print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported' + END SELECT + +#if 0 ALLOCATE( xtab3d(idims(1),idims(2),idims(3)) ) IF (.NOT.tpreclist(ji)%calc) THEN status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,xtab3d) @@ -879,25 +884,43 @@ END DO IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) DEALLOCATE(xtab3d) +#endif END IF CASE (TYPECHAR) + IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPECHAR') IF (infiles%files(1)%format == LFI_FORMAT) THEN CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),ileng,ipos) CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),iwork,ileng) - ALLOCATE(ytab(extent)) + extent = ileng - 2 - iwork(2) !iwork(2) = comment length +! ALLOCATE(ytab(extent)) + allocate(character(len=extent)::ytab) DO jj=1,extent ich = iwork(2+iwork(2)+jj) - ytab(jj) = CHAR(ich) +! ytab(jj) = CHAR(ich) + ytab(jj:jj) = CHAR(ich) END DO - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ytab) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,trim(ytab)) DEALLOCATE(ytab) ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN - status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,ytab,count=(/extent/)) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,ytab,count=(/extent/)) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +INCID = infiles%TFILES(1)%TFILE%NNCID +STATUS = NF90_INQ_VARID(INCID,tpreclist(ji)%TFIELD%CMNHNAME,IVARID) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +STATUS = NF90_INQUIRE_VARIABLE(INCID, IVARID, NDIMS=IDIMS, DIMIDS=IVDIMS) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +! if (ndims/=idims) then +if (idims/=1) then +print *,'aieeeeeee' +stop +end if +DO JJ=1,IDIMS + STATUS = NF90_INQUIRE_DIMENSION(infiles%TFILES(1)%TFILE%NNCID, IVDIMS(JJ), LEN=IDIMLEN(JJ)) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +END DO + allocate(character(len=IDIMLEN(1))::ytab) + CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,ytab) + CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ytab) + DEALLOCATE(ytab) END IF CASE (TYPEDATE) @@ -917,9 +940,10 @@ END DO DEALLOCATE(iwork) END SUBROUTINE fill_ncdf - SUBROUTINE build_lfi(infiles,outfiles,tpreclist,kbuflen) + SUBROUTINE build_lfi(infiles,outfiles,tpreclist,knaf,kbuflen) TYPE(filelist_struct), INTENT(IN) :: infiles, outfiles TYPE(workfield), DIMENSION(:), INTENT(IN) :: tpreclist + INTEGER, INTENT(IN) :: knaf INTEGER, INTENT(IN) :: kbuflen INTEGER :: kcdf_id, status @@ -948,8 +972,9 @@ END DO PRINT *,'Taille buffer = ',2+kbuflen ALLOCATE(iwork(2+kbuflen)) + DO ivar=1,knaf + IF (.NOT.tpreclist(ivar)%tbw) CYCLE - DO ivar=1,SIZE(tpreclist) icomlen = LEN(tpreclist(ivar)%TFIELD%CCOMMENT) IF (icomlen > MAXLFICOMMENTLENGTH) THEN PRINT *,'ERROR: comment length is too big. Please increase MAXLFICOMMENTLENGTH' @@ -963,6 +988,9 @@ END DO iwork(2+jj)=ICHAR(tpreclist(ivar)%TFIELD%CCOMMENT(jj:jj)) END DO +stop + +#if 0 IF (ASSOCIATED(tpreclist(ivar)%dim)) THEN idlen = tpreclist(ivar)%dim%len ndims = tpreclist(ivar)%dim%ndims @@ -1028,6 +1056,7 @@ END DO DEALLOCATE(xtab3d) END SELECT +#endif ! Attention restoration des '%' dans le nom des champs LFI yrecfm = str_replace(tpreclist(ivar)%name,'__','%') @@ -1075,6 +1104,7 @@ END DO USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX USE MODD_GRID, ONLY: XBETA, XRPK, XLAT0, XLON0, XLATORI, XLONORI USE MODD_GRID_n, ONLY: LSLEVE, XXHAT, XYHAT, XZHAT + USE MODD_IO_ll, ONLY: LIOCDF4 USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT USE MODE_FM, ONLY: IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll @@ -1097,9 +1127,28 @@ END DO iverb = 0 CALL init_sysfield() + ! + ! Infiles + ! + IF (runmode == MODECDF2CDF .OR. runmode == MODECDF2LFI) THEN + ! + ! NetCDF + ! + infiles%nbfiles = infiles%nbfiles + 1 + idx = infiles%nbfiles + CALL IO_FILE_ADD2LIST(INFILES%TFILES(idx)%TFILE,HINFILE,'UNKNOWN','READ',HFORMAT='NETCDF4') + CALL IO_FILE_OPEN_ll(INFILES%TFILES(idx)%TFILE) + infiles%files(idx)%lun_id = INFILES%TFILES(idx)%TFILE%NNCID + infiles%files(idx)%format = NETCDF_FORMAT + infiles%files(idx)%status = READING + infiles%files(idx)%opened = .TRUE. - IF (runmode == MODELFI2CDF) THEN - ! Cas LFI -> NetCDF + status = NF90_INQUIRE(infiles%files(idx)%lun_id, nvariables = nbvar_infile) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) + ELSE + ! + ! LFI + ! infiles%nbfiles = infiles%nbfiles + 1 idx = infiles%nbfiles CALL IO_FILE_ADD2LIST(INFILES%TFILES(idx)%TFILE,HINFILE(1:LEN_TRIM(HINFILE)-4),'UNKNOWN','READ', & @@ -1118,49 +1167,56 @@ END DO CALL IO_FILE_CLOSE_ll(INFILES%TFILES(idx)%TFILE) return END IF - - !Read problem dimensions and some grid variables (needed by IO_FILE_OPEN_ll for netCDF files) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPHEXT',JPHEXT) - !CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP) - !IF(IRESP/=0) JPVEXT=1 - JPVEXT = 1 - ! - ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'IMAX',NIMAX_ll) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JMAX',NJMAX_ll) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'KMAX',NKMAX) - ! - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'PROGRAM',CPROGRAM_ORIG) + END IF + ! + !Read problem dimensions and some grid variables (needed by IO_FILE_OPEN_ll to create netCDF files but also to determine IDIMX/Y/Z) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPHEXT',JPHEXT) + !CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP) + !IF(IRESP/=0) JPVEXT=1 + JPVEXT = 1 + ! + ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'IMAX',NIMAX_ll) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JMAX',NJMAX_ll) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'KMAX',NKMAX) + ! + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'PROGRAM',CPROGRAM_ORIG) + ! + ALLOCATE(CSTORAGE_TYPE) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE) + ! + IF ( TRIM(CPROGRAM_ORIG)/='PGD' & + .AND. .NOT.(TRIM(CPROGRAM_ORIG)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX + ALLOCATE(XXHAT(NIMAX_ll+2*JPHEXT)) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'XHAT',XXHAT) + ALLOCATE(XYHAT(NJMAX_ll+2*JPHEXT)) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'YHAT',XYHAT) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'CARTESIAN',LCARTESIAN) + ! + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LAT0',XLAT0) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LON0',XLON0) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'BETA',XBETA) + ! + IF (.NOT.LCARTESIAN) THEN + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'RPK', XRPK) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LATORI',XLATORI) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LONORI',XLONORI) + ENDIF + ! + IF (TRIM(CPROGRAM_ORIG)/='NESPGD') THEN + ALLOCATE(XZHAT(NKMAX+2*JPVEXT)) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'ZHAT',XZHAT) + ALLOCATE(LSLEVE) + CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'SLEVE',LSLEVE) + END IF + END IF + ! + ! Outfiles + ! + IF (runmode == MODELFI2CDF .OR. runmode == MODECDF2CDF) THEN ! - ALLOCATE(CSTORAGE_TYPE) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE) + ! NetCDF ! - IF ( TRIM(CPROGRAM_ORIG)/='PGD' & - .AND. .NOT.(TRIM(CPROGRAM_ORIG)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX - ALLOCATE(XXHAT(NIMAX_ll+2*JPHEXT)) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'XHAT',XXHAT) - ALLOCATE(XYHAT(NJMAX_ll+2*JPHEXT)) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'YHAT',XYHAT) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'CARTESIAN',LCARTESIAN) - ! - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LAT0',XLAT0) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LON0',XLON0) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'BETA',XBETA) - ! - IF (.NOT.LCARTESIAN) THEN - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'RPK', XRPK) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LATORI',XLATORI) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LONORI',XLONORI) - ENDIF - ! - IF (TRIM(CPROGRAM_ORIG)/='NESPGD') THEN - ALLOCATE(XZHAT(NKMAX+2*JPVEXT)) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'ZHAT',XZHAT) - ALLOCATE(LSLEVE) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'SLEVE',LSLEVE) - END IF - END IF - IF (.NOT.options(OPTSPLIT)%set) THEN outfiles%nbfiles = outfiles%nbfiles + 1 @@ -1173,71 +1229,36 @@ END DO outfiles%files(idx)%status = WRITING outfiles%files(idx)%opened = .TRUE. - status = NF90_SET_FILL(outfiles%files(idx)%lun_id,NF90_NOFILL,omode) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) -!!$ SELECT CASE(omode) -!!$ CASE (NF90_FILL) -!!$ PRINT *,'Ancien mode : NF90_FILL' -!!$ CASE (NF90_NOFILL) -!!$ PRINT *,'Ancien mode : NF90_NOFILL' -!!$ CASE default -!!$ PRINT *, 'Ancien mode : inconnu' -!!$ END SELECT - END IF ! .NOT.osplit - - ELSE IF (runmode == MODECDF2CDF) THEN - ! Cas netCDF -> netCDF - - infiles%nbfiles = infiles%nbfiles + 1 - idx = infiles%nbfiles - status = NF90_OPEN(hinfile,NF90_NOWRITE,infiles%files(idx)%lun_id) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - infiles%files(idx)%opened = .TRUE. - infiles%files(idx)%format = NETCDF_FORMAT - infiles%files(idx)%status = READING - - status = NF90_INQUIRE(infiles%files(idx)%lun_id, nvariables = nbvar_infile) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - + IF (options(OPTCOMPRESS)%set) THEN + outfiles%tfiles(idx)%tfile%LNCCOMPRESS = .TRUE. + outfiles%tfiles(idx)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue + END IF - IF (.NOT.options(OPTSPLIT)%set) THEN - outfiles%nbfiles = outfiles%nbfiles + 1 - idx = outfiles%nbfiles - status = NF90_CREATE(houtfile, IOR(NF90_CLOBBER,NF90_NETCDF4), outfiles%files(idx)%lun_id) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - outfiles%files(idx)%opened = .TRUE. - outfiles%files(idx)%format = NETCDF_FORMAT - outfiles%files(idx)%status = WRITING + IF (options(OPTREDUCE)%set) THEN + outfiles%tfiles(idx)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. + END IF status = NF90_SET_FILL(outfiles%files(idx)%lun_id,NF90_NOFILL,omode) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) END IF ! .NOT.osplit - ELSE - ! Cas NetCDF -> LFI - infiles%nbfiles = infiles%nbfiles + 1 - idx = infiles%nbfiles - status = NF90_OPEN(hinfile,NF90_NOWRITE,infiles%files(idx)%lun_id) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - infiles%files(idx)%opened = .TRUE. - infiles%files(idx)%format = NETCDF_FORMAT - infiles%files(idx)%status = READING - - status = NF90_INQUIRE(infiles%files(idx)%lun_id, nvariables = nbvar_infile) - IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) - - inap = 100 + ! + ! LFI + ! outfiles%nbfiles = outfiles%nbfiles + 1 idx = outfiles%nbfiles - outfiles%files(idx)%lun_id = 11 + CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,TRIM(houtfile)//'.lfi','UNKNOWN','WRITE', & + HFORMAT='LFI',KLFIVERB=0) + LIOCDF4 = .FALSE. !Necessary to open correctly the LFI file + CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE) + LIOCDF4 = .TRUE. + outfiles%files(idx)%lun_id = OUTFILES%TFILES(idx)%TFILE%NLFIFLU outfiles%files(idx)%format = LFI_FORMAT outfiles%files(idx)%status = WRITING - ilu = outfiles%files(idx)%lun_id - CALL LFIOUV(iresp2,ilu,ltrue,TRIM(houtfile)//'.lfi','NEW' ,lfalse,lfalse,iverb,inap,inaf) - outfiles%files(idx)%opened = .TRUE. - END IF + infiles%files(idx)%opened = .TRUE. + END IF - PRINT *,'--> Fichier converti : ', TRIM(houtfile) + PRINT *,'--> Fichier converti : ', TRIM(houtfile) END SUBROUTINE OPEN_FILES -- GitLab