From 0134851d5cf1af2618e9683f2221a4c6459b9474 Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 22 Mar 2018 11:51:31 +0100 Subject: [PATCH] Philippe 22/03/2018: lfi2cdf: cleaning + simplifications --- LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 | 28 +- LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 | 396 ++++++++++------------- 2 files changed, 191 insertions(+), 233 deletions(-) diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 index 5e265ae62..4663fe5cd 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 @@ -15,16 +15,18 @@ program LFI2CDF IMPLICIT NONE - INTEGER :: ibuflen INTEGER :: ji INTEGER :: nbvar_infile ! number of variables available in the input file INTEGER :: nbvar_tbr ! number of variables to be read INTEGER :: nbvar_calc ! number of variables to be computed from others INTEGER :: nbvar_tbw ! number of variables to be written INTEGER :: nbvar ! number of defined variables - INTEGER :: IINFO_ll ! return code of // routines + INTEGER :: IINFO_ll ! return code of // routines + INTEGER :: nfiles_out ! number of output files CHARACTER(LEN=:),allocatable :: hvarlist - TYPE(filelist_struct) :: infiles, outfiles + TYPE(TFILE_ELT),DIMENSION(1) :: infiles + TYPE(TFILE_ELT),DIMENSION(MAXFILES) :: outfiles + TYPE(workfield), DIMENSION(:), POINTER :: tzreclist type(option),dimension(:),allocatable :: options @@ -67,7 +69,7 @@ program LFI2CDF CALL INI_FIELD_LIST(1) - CALL OPEN_FILES(infiles, outfiles, hinfile, houtfile, nbvar_infile, options, runmode) + CALL OPEN_FILES(infiles, outfiles, nfiles_out, hinfile, houtfile, nbvar_infile, options, runmode) IF (options(OPTLIST)%set) STOP !Set and initialize parallel variables (necessary to read splitted files) @@ -109,25 +111,25 @@ program LFI2CDF IF (runmode == MODELFI2CDF) THEN ! Conversion LFI -> NetCDF - IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,houtfile,nbvar_tbw,tzreclist,options) - CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options,runmode) - CALL def_ncdf(outfiles,tzreclist,nbvar,options) + IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options) + CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode) + CALL def_ncdf(outfiles,nfiles_out) CALL fill_files(infiles,outfiles,tzreclist,nbvar,options) ELSE IF (runmode == MODECDF2CDF) THEN ! Conversion netCDF -> netCDF - IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,houtfile,nbvar_tbw,tzreclist,options) - CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options,runmode) - CALL def_ncdf(outfiles,tzreclist,nbvar,options) + IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options) + CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode) + CALL def_ncdf(outfiles,nfiles_out) CALL fill_files(infiles,outfiles,tzreclist,nbvar,options) ELSE ! Conversion NetCDF -> LFI - CALL parse_infiles(infiles,outfiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options,runmode) + CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode) CALL fill_files(infiles,outfiles,tzreclist,nbvar,options) END IF - CALL CLOSE_FILES(infiles) - CALL CLOSE_FILES(outfiles) + CALL CLOSE_FILES(infiles, 1) + CALL CLOSE_FILES(outfiles,nfiles_out) end program LFI2CDF diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 index cc4afc747..8c945e021 100644 --- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 +++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 @@ -4,7 +4,6 @@ MODULE mode_util USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH, NMNHNAMELGTMAX USE MODE_FIELD - USE MODE_FIELDTYPE USE MODE_FMREAD USE MODE_FMWRIT @@ -15,23 +14,12 @@ MODULE mode_util IMPLICIT NONE INTEGER,PARAMETER :: MAXRAW=10 - INTEGER,PARAMETER :: MAXLEN=512 INTEGER,PARAMETER :: MAXFILES=100 INTEGER,PARAMETER :: FM_FIELD_SIZE = 32 - INTEGER,PARAMETER :: UNDEFINED = -1, READING = 1, WRITING = 2 - INTEGER,PARAMETER :: UNKNOWN_FORMAT = -1, NETCDF_FORMAT = 1, LFI_FORMAT = 2 - - TYPE filelist_struct - INTEGER :: nbfiles = 0 - TYPE(TFILE_ELT),DIMENSION(MAXFILES) :: TFILES - END TYPE filelist_struct - - TYPE workfield - CHARACTER(LEN=FM_FIELD_SIZE) :: name ! nom du champ - INTEGER :: id_in = -1 + CHARACTER(LEN=NMNHNAMELGTMAX) :: name ! nom du champ LOGICAL :: found ! T if found in the input file LOGICAL :: calc ! T if computed from other variables LOGICAL :: tbw ! to be written or not @@ -50,54 +38,37 @@ MODULE mode_util CHARACTER(LEN=6) :: CPROGRAM_ORIG - INTEGER, SAVE :: IDIMX = 0 - INTEGER, SAVE :: IDIMY = 0 - INTEGER, SAVE :: IDIMZ = 0 - CONTAINS - FUNCTION str_replace(hstr, hold, hnew) - CHARACTER(LEN=*) :: hstr, hold, hnew - CHARACTER(LEN=LEN_TRIM(hstr)+MAX(0,LEN(hnew)-LEN(hold))) :: str_replace - - INTEGER :: pos - - pos = INDEX(hstr,hold) - IF (pos /= 0) THEN - str_replace = hstr(1:pos-1)//hnew//hstr(pos+LEN(hold):) - ELSE - str_replace = hstr - END IF - - END FUNCTION str_replace - - SUBROUTINE parse_infiles(infiles, outfiles, nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw, tpreclist, kbuflen, options, runmode) + SUBROUTINE parse_infiles(infiles, outfiles, KNFILES_OUT, nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw, & + tpreclist, options, runmode) USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX USE MODD_PARAMETERS, ONLY: JPHEXT, JPVEXT USE MODE_NETCDF, ONLY: IO_GUESS_DIMIDS_NC4 - TYPE(filelist_struct), INTENT(IN) :: infiles - TYPE(filelist_struct), INTENT(IN) :: outfiles - INTEGER, INTENT(IN) :: nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw - TYPE(workfield), DIMENSION(:), POINTER :: tpreclist - INTEGER, INTENT(OUT) :: kbuflen - TYPE(option),DIMENSION(:), INTENT(IN) :: options - INTEGER, INTENT(IN) :: runmode + TYPE(TFILE_ELT),DIMENSION(:), INTENT(IN) :: infiles + TYPE(TFILE_ELT),DIMENSION(:), INTENT(IN) :: outfiles + INTEGER, INTENT(IN) :: KNFILES_OUT + INTEGER, INTENT(IN) :: nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw + TYPE(workfield), DIMENSION(:),POINTER,INTENT(OUT) :: tpreclist + TYPE(option),DIMENSION(:), INTENT(IN) :: options + INTEGER, INTENT(IN) :: runmode - INTEGER :: ji,jj, kcdf_id, kcdf_id2, itype - INTEGER :: ndb, nde, ndey, idx, idx_out, idx_var, maxvar - INTEGER :: idims, idimtmp, jdim, status - LOGICAL :: ladvan - INTEGER :: ich, leng - INTEGER :: comment_size, fsize, sizemax CHARACTER(LEN=FM_FIELD_SIZE) :: yrecfm, YDATENAME - INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork - INTEGER :: IID, IRESP - INTEGER(KIND=LFI_INT) :: iresp2,ilu,ileng,ipos CHARACTER(LEN=FM_FIELD_SIZE) :: var_calc CHARACTER(LEN=FM_FIELD_SIZE),dimension(MAXRAW) :: var_raw - INTEGER, DIMENSION(10) :: idim_id + INTEGER :: ji,jj + INTEGER :: ndb, nde, ndey, idx, idx_out, idx_var, maxvar + INTEGER :: leng + INTEGER :: sizemax + INTEGER :: IID, IRESP INTEGER :: IDXDATE, IDXTIME, IDX1 + 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 @@ -109,24 +80,19 @@ CONTAINS IF (runmode==MODECDF2LFI) THEN !This file is a dummy one to manage netCDF dims - idx_out = outfiles%nbfiles + idx_out = KNFILES_OUT END IF - IF (infiles%TFILES(1)%TFILE%CFORMAT == 'LFI') THEN - ilu = infiles%TFILES(1)%TFILE%NLFIFLU - ELSE IF (infiles%TFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN - kcdf_id = infiles%TFILES(1)%TFILE%NNCID + IF (INFILES(1)%TFILE%CFORMAT == 'LFI') THEN + ilu = INFILES(1)%TFILE%NLFIFLU + ELSE IF (INFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN + kcdf_id = INFILES(1)%TFILE%NNCID END IF - ! update IDIMX,IDIMY,IDIMZ - IDIMX = NIMAX_ll+2*JPHEXT - IDIMY = NJMAX_ll+2*JPHEXT - IDIMZ = NKMAX +2*JPVEXT - PRINT *,'MESONH 3D, 2D articles DIMENSIONS used :' - PRINT *,'DIMX =',IDIMX - PRINT *,'DIMY =',IDIMY - PRINT *,'DIMZ =',IDIMZ ! IDIMZ may be equal to 0 (PGD files) + PRINT *,'DIMX =',NIMAX_ll+2*JPHEXT + PRINT *,'DIMY =',NJMAX_ll+2*JPHEXT + PRINT *,'DIMZ =',NKMAX +2*JPVEXT sizemax = 0 @@ -207,18 +173,17 @@ CONTAINS IF (tpreclist(ji)%calc) CYCLE yrecfm = TRIM(tpreclist(ji)%name) - IF (infiles%TFILES(1)%TFILE%CFORMAT == 'LFI') THEN + IF (INFILES(1)%TFILE%CFORMAT == 'LFI') THEN CALL LFINFO(iresp2,ilu,trim(yrecfm),ileng,ipos) IF (iresp2 == 0 .AND. ileng /= 0) THEN tpreclist(ji)%found = .true. tpreclist(ji)%NSIZE = ileng - 2 - NLFIMAXCOMMENTLENGTH END IF - IF (iresp2==0 .AND. ileng == 0 .AND. ipos==0 .AND. infiles%TFILES(1)%TFILE%NSUBFILES_IOZ>0) THEN !Variable not found with no error (iresp2==0 .AND. ileng == 0 .AND. ipos==0) !If we are merging, maybe it is one of the split variable !In that case, the 1st part of the variable is in the 1st split file with a 0001 suffix - CALL LFINFO(iresp2,infiles%TFILES(1)%TFILE%TFILES_IOZ(1)%TFILE%NLFIFLU,trim(yrecfm)//'0001',ileng,ipos) + CALL LFINFO(iresp2,INFILES(1)%TFILE%TFILES_IOZ(1)%TFILE%NLFIFLU,trim(yrecfm)//'0001',ileng,ipos) IF (iresp2 == 0 .AND. ileng /= 0) THEN tpreclist(ji)%found = .true. tpreclist(ji)%LSPLIT = .true. @@ -226,32 +191,36 @@ CONTAINS tpreclist(tpreclist(ji)%tgt)%LSPLIT = .true. END IF END IF - tpreclist(ji)%NSIZE = (ileng - 2 - NLFIMAXCOMMENTLENGTH) * IDIMZ + tpreclist(ji)%NSIZE = (ileng - 2 - NLFIMAXCOMMENTLENGTH) * (NKMAX+2*JPVEXT) ileng = tpreclist(ji)%NSIZE + 2 + NLFIMAXCOMMENTLENGTH END IF leng = ileng - ELSE IF (infiles%TFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN - status = NF90_INQ_VARID(kcdf_id,trim(yrecfm),tpreclist(ji)%id_in) - IF (status /= NF90_NOERR .AND. infiles%TFILES(1)%TFILE%NSUBFILES_IOZ>0) THEN + ELSE IF (INFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN + status = NF90_INQ_VARID(kcdf_id,trim(yrecfm),var_id) + IF (status /= NF90_NOERR .AND. INFILES(1)%TFILE%NSUBFILES_IOZ>0) THEN !Variable probably not found (other error possible...) !If we are merging, maybe it is one of the split variable !In that case, the 1st part of the variable is in the 1st split file with a 0001 suffix - kcdf_id2 = infiles%TFILES(1)%TFILE%TFILES_IOZ(1)%TFILE%NNCID - status = NF90_INQ_VARID(kcdf_id2,trim(yrecfm)//'0001',tpreclist(ji)%id_in) + kcdf_id2 = INFILES(1)%TFILE%TFILES_IOZ(1)%TFILE%NNCID + status = NF90_INQ_VARID(kcdf_id2,trim(yrecfm)//'0001',var_id) IF (status == NF90_NOERR) THEN tpreclist(ji)%LSPLIT = .true. IF (tpreclist(ji)%tgt > 0) THEN !If this variable is used for a calculated one tpreclist(tpreclist(ji)%tgt)%LSPLIT = .true. END IF + ELSE + CALL HANDLE_ERR(status,__LINE__) END IF + ELSE IF (status /= NF90_NOERR) THEN + CALL HANDLE_ERR(status,__LINE__) ELSE kcdf_id2 = kcdf_id ENDIF ! IF (status == NF90_NOERR) THEN tpreclist(ji)%found = .true. - status = NF90_INQUIRE_VARIABLE(kcdf_id2,tpreclist(ji)%id_in,ndims = idims,dimids = idim_id) + status = NF90_INQUIRE_VARIABLE(kcdf_id2,var_id,ndims = idims,dimids = idim_id) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) !TODO:useful? @@ -270,7 +239,7 @@ CONTAINS IF (tpreclist(ji)%LSPLIT) THEN IF(idims/=2) CALL PRINT_MSG(NVERB_FATAL,'IO','parse_infiles','split variables can only be 3D') !Split variables are Z-split - leng = leng * IDIMZ + leng = leng * (NKMAX+2*JPVEXT) END IF END IF END IF @@ -304,7 +273,7 @@ END DO tpreclist(ji)%src(:) = -1 END DO - IF (infiles%TFILES(1)%TFILE%CFORMAT == 'LFI') THEN + IF (INFILES(1)%TFILE%CFORMAT == 'LFI') THEN CALL LFIPOS(iresp2,ilu) ladvan = .TRUE. @@ -374,10 +343,10 @@ END DO END IF END DO ! - ELSE IF (infiles%TFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN + ELSE IF (INFILES(1)%TFILE%CFORMAT == 'NETCDF4') THEN DO ji=1,nbvar_infile - tpreclist(ji)%id_in = ji - status = NF90_INQUIRE_VARIABLE(kcdf_id,tpreclist(ji)%id_in, name = tpreclist(ji)%name, ndims = idims, & + var_id = ji + status = NF90_INQUIRE_VARIABLE(kcdf_id,var_id, name = tpreclist(ji)%name, ndims = idims, & dimids = idim_id) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) ! PRINT *,'Article ',ji,' : ',TRIM(tpreclist(ji)%name),', longueur = ',ileng @@ -438,7 +407,7 @@ END DO tpreclist(ji)%TFIELD = TFIELDLIST(IID) ALLOCATE(tpreclist(ji)%TDIMS(tpreclist(ji)%TFIELD%NDIMS)) ! Determine TDIMS - CALL IO_GUESS_DIMIDS_NC4(outfiles%tfiles(idx_out)%TFILE,tpreclist(ji)%TFIELD,& + CALL IO_GUESS_DIMIDS_NC4(outfiles(idx_out)%TFILE,tpreclist(ji)%TFIELD,& tpreclist(ji)%NSIZE,tpreclist(ji)%TDIMS,IRESP) IF (IRESP/=0) THEN CALL PRINT_MSG(NVERB_WARNING,'IO','parse_infiles','can not guess dimensions for '//tpreclist(ji)%TFIELD%CMNHNAME// & @@ -553,8 +522,6 @@ END DO END DO !ji=1,maxvar END IF !nbvar_calc>0 - kbuflen = sizemax - WRITE(*,'("Taille maximale du buffer :",f10.3," Mio")') sizemax*8./1048576. END SUBROUTINE parse_infiles @@ -568,32 +535,26 @@ END DO END IF END SUBROUTINE HANDLE_ERR - SUBROUTINE def_ncdf(outfiles,tpreclist,nbvar,options) + SUBROUTINE def_ncdf(outfiles,KNFILES_OUT) USE MODE_NETCDF, ONLY: IO_WRITE_HEADER_NC4 - TYPE(filelist_struct), INTENT(IN) :: outfiles - TYPE(workfield),DIMENSION(:),INTENT(INOUT) :: tpreclist - INTEGER, INTENT(IN) :: nbvar - TYPE(option),DIMENSION(:), INTENT(IN) :: options + TYPE(TFILE_ELT),DIMENSION(:),INTENT(IN) :: outfiles + INTEGER, INTENT(IN) :: KNFILES_OUT - INTEGER :: compress_level, status - INTEGER :: idx, ji, nbfiles - INTEGER :: kcdf_id - INTEGER :: IID, IRESP - INTEGER :: invdims - INTEGER :: type_float - INTEGER, DIMENSION(10) :: ivdims - CHARACTER(LEN=20) :: ycdfvar + INTEGER :: ji +! INTEGER(KIND=IDCDF_KIND) :: status +! INTEGER(KIND=IDCDF_KIND) :: kcdf_id - DO ji = 1,outfiles%nbfiles - kcdf_id = outfiles%TFILES(ji)%TFILE%NNCID + DO ji = 1,KNFILES_OUT +! kcdf_id = outfiles(ji)%TFILE%NNCID ! global attributes - CALL IO_WRITE_HEADER_NC4(outfiles%TFILES(ji)%TFILE) + CALL IO_WRITE_HEADER_NC4(outfiles(ji)%TFILE) ! ! status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'Title',VERSION_ID) ! IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) +print *,'PW:TODO: add header specific to lfi2cdf (history...?)' END DO END SUBROUTINE def_ncdf @@ -601,7 +562,8 @@ END DO SUBROUTINE fill_files(infiles,outfiles,tpreclist,knaf,options) USE MODD_TYPE_DATE - TYPE(filelist_struct), INTENT(IN) :: infiles, outfiles + TYPE(TFILE_ELT),DIMENSION(:), INTENT(IN) :: infiles + TYPE(TFILE_ELT),DIMENSION(:), INTENT(IN) :: outfiles TYPE(workfield), DIMENSION(:),INTENT(INOUT) :: tpreclist INTEGER, INTENT(IN) :: knaf TYPE(option),DIMENSION(:), INTENT(IN) :: options @@ -645,15 +607,15 @@ END DO CASE (0) ALLOCATE(ITAB1D(1)) IF (tpreclist(ji)%calc) ALLOCATE(ITAB1D2(1)) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D(1)) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D(1)) CASE (1) ALLOCATE(ITAB1D(IDIMLEN(1))) IF (tpreclist(ji)%calc) ALLOCATE(ITAB1D2(IDIMLEN(1))) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D) CASE (2) ALLOCATE(ITAB2D(IDIMLEN(1),IDIMLEN(2))) IF (tpreclist(ji)%calc) ALLOCATE(ITAB2D2(IDIMLEN(1),IDIMLEN(2))) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB2D) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB2D) CASE DEFAULT CALL PRINT_MSG(NVERB_WARNING,'IO','fill_files','too many dimensions for ' & //TRIM(tpreclist(ISRC)%name)//' => ignored') @@ -665,28 +627,28 @@ END DO SELECT CASE(IDIMS) CASE (0) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D2(1)) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D2(1)) ITAB1D(1) = ITAB1D(1) + ITAB1D2(1) CASE (1) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D2) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB1D2) ITAB1D(:) = ITAB1D(:) + ITAB1D2(:) CASE (2) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB2D2) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,ITAB2D2) ITAB2D(:,:) = ITAB2D(:,:) + ITAB2D2(:,:) END SELECT END DO SELECT CASE(IDIMS) CASE (0) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D(1)) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D(1)) DEALLOCATE(ITAB1D) IF (tpreclist(ji)%calc) DEALLOCATE(ITAB1D2) CASE (1) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB1D) DEALLOCATE(ITAB1D) IF (tpreclist(ji)%calc) DEALLOCATE(ITAB1D2) CASE (2) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB2D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ITAB2D) DEALLOCATE(ITAB2D) IF (tpreclist(ji)%calc) DEALLOCATE(ITAB2D2) END SELECT @@ -698,13 +660,13 @@ END DO SELECT CASE(IDIMS) CASE (0) ALLOCATE(GTAB1D(1)) - CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,GTAB1D(1)) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D(1)) + CALL IO_READ_FIELD (INFILES(1)%TFILE, tpreclist(ji)%TFIELD,GTAB1D(1)) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D(1)) DEALLOCATE(GTAB1D) CASE (1) ALLOCATE(GTAB1D(IDIMLEN(1))) - CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,GTAB1D) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D) + CALL IO_READ_FIELD (INFILES(1)%TFILE, tpreclist(ji)%TFIELD,GTAB1D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,GTAB1D) DEALLOCATE(GTAB1D) CASE DEFAULT CALL PRINT_MSG(NVERB_WARNING,'IO','fill_files','too many dimensions for ' & @@ -728,23 +690,23 @@ END DO CASE (0) ALLOCATE(XTAB1D(1)) IF (tpreclist(ji)%calc) ALLOCATE(XTAB1D2(1)) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D(1)) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D(1)) CASE (1) ALLOCATE(XTAB1D(IDIMLEN(1))) IF (tpreclist(ji)%calc) ALLOCATE(XTAB1D2(IDIMLEN(1))) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D) CASE (2) ALLOCATE(XTAB2D(IDIMLEN(1),IDIMLEN(2))) IF (tpreclist(ji)%calc) ALLOCATE(XTAB2D2(IDIMLEN(1),IDIMLEN(2))) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB2D) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB2D) CASE (3) ALLOCATE(XTAB3D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3))) IF (tpreclist(ji)%calc) ALLOCATE(XTAB3D2(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3))) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB3D) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB3D) CASE (4) ALLOCATE(XTAB4D(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3),IDIMLEN(4))) IF (tpreclist(ji)%calc) ALLOCATE(XTAB4D2(IDIMLEN(1),IDIMLEN(2),IDIMLEN(3),IDIMLEN(4))) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB4D) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB4D) CASE DEFAULT CALL PRINT_MSG(NVERB_WARNING,'IO','fill_files','too many dimensions for ' & //TRIM(tpreclist(ISRC)%name)//' => ignored') @@ -756,42 +718,42 @@ END DO SELECT CASE(IDIMS) CASE (0) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D2(1)) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D2(1)) XTAB1D(1) = XTAB1D(1) + XTAB1D2(1) CASE (1) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D2) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB1D2) XTAB1D(:) = XTAB1D(:) + XTAB1D2(:) CASE (2) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB2D2) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB2D2) XTAB2D(:,:) = XTAB2D(:,:) + XTAB2D2(:,:) CASE (3) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB3D2) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB3D2) XTAB3D(:,:,:) = XTAB3D(:,:,:) + XTAB3D2(:,:,:) CASE (4) - CALL IO_READ_FIELD(infiles%tfiles(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB4D2) + CALL IO_READ_FIELD(INFILES(1)%TFILE,tpreclist(ISRC)%TFIELD,XTAB4D2) XTAB4D(:,:,:,:) = XTAB4D(:,:,:,:) + XTAB4D2(:,:,:,:) END SELECT END DO SELECT CASE(IDIMS) CASE (0) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB1D(1)) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB1D(1)) DEALLOCATE(XTAB1D) IF (tpreclist(ji)%calc) DEALLOCATE(XTAB1D2) CASE (1) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB1D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB1D) DEALLOCATE(XTAB1D) IF (tpreclist(ji)%calc) DEALLOCATE(XTAB1D2) CASE (2) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB2D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB2D) DEALLOCATE(XTAB2D) IF (tpreclist(ji)%calc) DEALLOCATE(XTAB2D2) CASE (3) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB3D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB3D) DEALLOCATE(XTAB3D) IF (tpreclist(ji)%calc) DEALLOCATE(XTAB3D2) CASE (4) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB4D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,XTAB4D) DEALLOCATE(XTAB4D) IF (tpreclist(ji)%calc) DEALLOCATE(XTAB4D2) END SELECT @@ -805,8 +767,8 @@ END DO END IF ALLOCATE(CHARACTER(LEN=tpreclist(ji)%NSIZE)::YTAB0D) - CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD,YTAB0D) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,YTAB0D) + CALL IO_READ_FIELD (INFILES(1)%TFILE, tpreclist(ji)%TFIELD,YTAB0D) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,YTAB0D) DEALLOCATE(YTAB0D) @@ -816,8 +778,8 @@ END DO //TRIM(tpreclist(ISRC)%name)//' => ignored') CYCLE END IF - CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE, tpreclist(ji)%TFIELD%CMNHNAME,TZDATE) - CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE) + CALL IO_READ_FIELD (INFILES(1)%TFILE, tpreclist(ji)%TFIELD%CMNHNAME,TZDATE) + CALL IO_WRITE_FIELD(outfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE) CASE default CALL PRINT_MSG(NVERB_WARNING,'IO','fill_files','invalid datatype for ' & @@ -830,7 +792,7 @@ END DO END SUBROUTINE fill_files - SUBROUTINE OPEN_FILES(infiles,outfiles,hinfile,houtfile,nbvar_infile,options,runmode) + SUBROUTINE OPEN_FILES(infiles,outfiles,KNFILES_OUT,hinfile,houtfile,nbvar_infile,options,runmode) USE MODD_CONF, ONLY: LCARTESIAN USE MODD_CONF_n, ONLY: CSTORAGE_TYPE USE MODD_DIM_n, ONLY: NIMAX_ll, NJMAX_ll, NKMAX @@ -842,24 +804,22 @@ END DO USE MODE_FM, ONLY: IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST - TYPE(filelist_struct),INTENT(OUT) :: infiles, outfiles - CHARACTER(LEN=*), INTENT(IN) :: hinfile - CHARACTER(LEN=*), INTENT(IN) :: houtfile - INTEGER , INTENT(OUT) :: nbvar_infile - TYPE(option),DIMENSION(:),INTENT(IN) :: options - INTEGER , INTENT(IN) :: runmode - - INTEGER :: IRESP - INTEGER :: extindex - INTEGER(KIND=LFI_INT) :: ilu,iresp2,iverb,inap,inaf - INTEGER :: idx,status - CHARACTER(LEN=4) :: ypextsrc, ypextdest - LOGICAL :: fexist - INTEGER :: omode - - iverb = 0 - - CALL init_sysfield() + TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: infiles + TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: outfiles + INTEGER, INTENT(OUT) :: KNFILES_OUT + CHARACTER(LEN=*), INTENT(IN) :: hinfile + CHARACTER(LEN=*), INTENT(IN) :: houtfile + INTEGER, INTENT(OUT) :: nbvar_infile + TYPE(option),DIMENSION(:), INTENT(IN) :: options + INTEGER, INTENT(IN) :: runmode + + INTEGER :: idx + INTEGER(KIND=IDCDF_KIND) :: omode + INTEGER(KIND=IDCDF_KIND) :: status + INTEGER(KIND=LFI_INT) :: ilu,iresp + + + KNFILES_OUT = 0 ! ! Infiles ! @@ -867,72 +827,66 @@ END DO ! ! 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) + CALL IO_FILE_ADD2LIST(INFILES(1)%TFILE,HINFILE,'UNKNOWN','READ',HFORMAT='NETCDF4') + CALL IO_FILE_OPEN_ll(INFILES(1)%TFILE) - nbvar_infile = INFILES%TFILES(idx)%TFILE%NNCNAR + nbvar_infile = INFILES(1)%TFILE%NNCNAR ELSE ! ! LFI ! - infiles%nbfiles = infiles%nbfiles + 1 - idx = infiles%nbfiles - CALL IO_FILE_ADD2LIST(INFILES%TFILES(idx)%TFILE,HINFILE,'UNKNOWN','READ', & + CALL IO_FILE_ADD2LIST(INFILES(1)%TFILE,HINFILE,'UNKNOWN','READ', & HFORMAT='LFI',KLFIVERB=0) - CALL IO_FILE_OPEN_ll(INFILES%TFILES(idx)%TFILE) - ilu = INFILES%TFILES(idx)%TFILE%NLFIFLU + CALL IO_FILE_OPEN_ll(INFILES(1)%TFILE) + ilu = INFILES(1)%TFILE%NLFIFLU - nbvar_infile = INFILES%TFILES(idx)%TFILE%NLFININAR + nbvar_infile = INFILES(1)%TFILE%NLFININAR IF (options(OPTLIST)%set) THEN - CALL LFILAF(iresp2,ilu,lfalse) - CALL IO_FILE_CLOSE_ll(INFILES%TFILES(idx)%TFILE) + CALL LFILAF(iresp,ilu,lfalse) + CALL IO_FILE_CLOSE_ll(INFILES(1)%TFILE) return END IF 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) + !Read problem dimensions and some grid variables (needed to determine domain size and also by IO_FILE_OPEN_ll to create netCDF files) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'JPHEXT',JPHEXT) JPHEXT_ll = JPHEXT - !CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP) - !IF(IRESP/=0) JPVEXT=1 JPVEXT_ll = JPVEXT ! 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(1)%TFILE,'IMAX',NIMAX_ll) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'JMAX',NJMAX_ll) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'KMAX',NKMAX) ! - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'PROGRAM',CPROGRAM_ORIG) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'PROGRAM',CPROGRAM_ORIG) ! ALLOCATE(CSTORAGE_TYPE) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE) + CALL IO_READ_FIELD(INFILES(1)%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) + CALL IO_READ_FIELD(INFILES(1)%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(1)%TFILE,'YHAT',XYHAT) + CALL IO_READ_FIELD(INFILES(1)%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) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'LAT0',XLAT0) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'LON0',XLON0) + CALL IO_READ_FIELD(INFILES(1)%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) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'RPK', XRPK) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'LATORI',XLATORI) + CALL IO_READ_FIELD(INFILES(1)%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) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'ZHAT',XZHAT) ALLOCATE(LSLEVE) - CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'SLEVE',LSLEVE) + CALL IO_READ_FIELD(INFILES(1)%TFILE,'SLEVE',LSLEVE) END IF END IF ! @@ -943,70 +897,71 @@ END DO ! NetCDF ! IF (.NOT.options(OPTSPLIT)%set) THEN - outfiles%nbfiles = outfiles%nbfiles + 1 + KNFILES_OUT = KNFILES_OUT + 1 - idx = outfiles%nbfiles - CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,HOUTFILE,'UNKNOWN','WRITE', & + idx = KNFILES_OUT + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,HOUTFILE,'UNKNOWN','WRITE', & HFORMAT='NETCDF4',OOLD=.TRUE.) - CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) + CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) IF (options(OPTCOMPRESS)%set) THEN - outfiles%tfiles(idx)%tfile%LNCCOMPRESS = .TRUE. - outfiles%tfiles(idx)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue + outfiles(idx)%tfile%LNCCOMPRESS = .TRUE. + outfiles(idx)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue END IF IF (options(OPTREDUCE)%set) THEN - outfiles%tfiles(idx)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. + outfiles(idx)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. END IF - status = NF90_SET_FILL(OUTFILES%TFILES(idx)%TFILE%NNCID,NF90_NOFILL,omode) + status = NF90_SET_FILL(outfiles(idx)%TFILE%NNCID,NF90_NOFILL,omode) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) END IF ! .NOT.osplit ELSE ! ! LFI ! - outfiles%nbfiles = outfiles%nbfiles + 1 - idx = outfiles%nbfiles - CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,houtfile,'UNKNOWN','WRITE', & + KNFILES_OUT = KNFILES_OUT + 1 + idx = KNFILES_OUT + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,houtfile,'UNKNOWN','WRITE', & HFORMAT='LFI',KLFIVERB=0,OOLD=.TRUE.) LIOCDF4 = .FALSE. !Necessary to open correctly the LFI file - CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE) + CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE) LIOCDF4 = .TRUE. END IF ! ! Create a dummy netCDF file necessary to manage correctly the netCDF dims IF (runmode == MODECDF2LFI) THEN - outfiles%nbfiles = outfiles%nbfiles + 1 + KNFILES_OUT = KNFILES_OUT + 1 - idx = outfiles%nbfiles - CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,'dummy_file','UNKNOWN','WRITE', & + idx = KNFILES_OUT + CALL IO_FILE_ADD2LIST(outfiles(idx)%TFILE,'dummy_file','UNKNOWN','WRITE', & HFORMAT='NETCDF4',OOLD=.TRUE.) - CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) + CALL IO_FILE_OPEN_ll(outfiles(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) END IF PRINT *,'--> Fichier converti : ', TRIM(houtfile) END SUBROUTINE OPEN_FILES - SUBROUTINE OPEN_SPLIT_NCFILES_OUT(outfiles,houtfile,nbvar,tpreclist,options) + SUBROUTINE OPEN_SPLIT_NCFILES_OUT(outfiles,KNFILES_OUT,houtfile,nbvar,options) USE MODE_FM, ONLY: IO_FILE_OPEN_ll USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST - TYPE(filelist_struct), INTENT(INOUT) :: outfiles + + TYPE(TFILE_ELT),DIMENSION(:), INTENT(INOUT) :: outfiles + INTEGER, INTENT(OUT) :: KNFILES_OUT CHARACTER(LEN=*), INTENT(IN) :: houtfile INTEGER, INTENT(IN) :: nbvar - TYPE(workfield), DIMENSION(:), INTENT(IN) :: tpreclist TYPE(option),DIMENSION(:), INTENT(IN) :: options - INTEGER :: ji - INTEGER :: idx1, idx2 - INTEGER :: status - INTEGER :: omode - CHARACTER(LEN=MAXLEN) :: filename - CHARACTER(LEN=:),ALLOCATABLE :: YLIST + CHARACTER(LEN=:),ALLOCATABLE :: filename + CHARACTER(LEN=:),ALLOCATABLE :: YLIST CHARACTER(LEN=NMNHNAMELGTMAX),DIMENSION(nbvar) :: YVARS + INTEGER :: ji + INTEGER :: idx1, idx2 + INTEGER(KIND=IDCDF_KIND) :: status + INTEGER(KIND=IDCDF_KIND) :: omode - outfiles%nbfiles = nbvar + KNFILES_OUT = nbvar YLIST = TRIM(options(OPTVAR)%cvalue) DO ji = 1,nbvar-1 @@ -1027,35 +982,36 @@ END DO DO ji = 1,nbvar filename = trim(houtfile)//'.'//TRIM(YVARS(ji)) - CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(ji)%TFILE,filename,'UNKNOWN','WRITE', & + CALL IO_FILE_ADD2LIST(outfiles(ji)%TFILE,filename,'UNKNOWN','WRITE', & HFORMAT='NETCDF4') - CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(ji)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) + CALL IO_FILE_OPEN_ll(outfiles(ji)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG) IF (options(OPTCOMPRESS)%set) THEN - outfiles%tfiles(ji)%tfile%LNCCOMPRESS = .TRUE. - outfiles%tfiles(ji)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue + outfiles(ji)%tfile%LNCCOMPRESS = .TRUE. + outfiles(ji)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue END IF IF (options(OPTREDUCE)%set) THEN - outfiles%tfiles(ji)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. + outfiles(ji)%tfile%LNCREDUCE_FLOAT_PRECISION = .TRUE. END IF - status = NF90_SET_FILL(OUTFILES%TFILES(ji)%TFILE%NNCID,NF90_NOFILL,omode) + status = NF90_SET_FILL(outfiles(ji)%TFILE%NNCID,NF90_NOFILL,omode) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__) END DO END SUBROUTINE OPEN_SPLIT_NCFILES_OUT - SUBROUTINE CLOSE_FILES(filelist) + SUBROUTINE CLOSE_FILES(filelist,KNFILES) USE MODE_FM, ONLY: IO_FILE_CLOSE_ll - TYPE(filelist_struct),INTENT(INOUT) :: filelist + TYPE(TFILE_ELT),DIMENSION(:),INTENT(INOUT) :: filelist + INTEGER, INTENT(IN) :: KNFILES - INTEGER(KIND=LFI_INT) :: ilu,iresp - INTEGER :: ji,status + INTEGER :: ji + - DO ji=1,filelist%nbfiles - IF (filelist%TFILES(ji)%TFILE%LOPENED) CALL IO_FILE_CLOSE_ll(filelist%TFILES(ji)%TFILE) + DO ji=1,KNFILES + IF (filelist(ji)%TFILE%LOPENED) CALL IO_FILE_CLOSE_ll(filelist(ji)%TFILE) END DO END SUBROUTINE CLOSE_FILES -- GitLab