Skip to content
Snippets Groups Projects
mode_util.f90 60.5 KiB
Newer Older
  • Learn to ignore specific revisions
  •          ELSE
               ALLOCATE( xtab3d2(idims(1),idims(2),idims(3)) )
               src=tpreclist(ji)%src(1)
               status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(src)%id_in,xtab3d)
               IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
               jj = 2
               DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW)
                 src=tpreclist(ji)%src(jj)
                 status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(src)%id_in,xtab3d2)
                 IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
                 xtab3d(:,:,:) = xtab3d(:,:,:) + xtab3d2(:,:,:)
                 jj=jj+1
               END DO
               DEALLOCATE(xtab3d2)
             END IF
    
    !TODO: not clean, should be done only if merging z-levels
             IF (ndims == 2) THEN
               start = (/1,1,level/)
             ELSE
               start = (/1,1,1/)
             ENDIF
             status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab3d,start=start)
             IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
             DEALLOCATE(xtab3d)
    
             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)
    
             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)
    
             CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,trim(ytab))
    
             DEALLOCATE(ytab)
    
            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
    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)
             IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPEDATE')
    
    !PW: TODO: tpreclist(ji)%TFIELD%CMNHNAME => tpreclist(ji)%TFIELD
             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)
    
           CASE default
    
             CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','invalid datatype')
    
        DEALLOCATE(itab,gtab,xtab)
    
        DEALLOCATE(iwork)
      END SUBROUTINE fill_ncdf
    
    
      SUBROUTINE build_lfi(infiles,outfiles,tpreclist,knaf,kbuflen)
    
        TYPE(filelist_struct),         INTENT(IN) :: infiles, outfiles
    
        TYPE(workfield), DIMENSION(:), INTENT(IN) :: tpreclist
    
        INTEGER,                       INTENT(IN) :: kbuflen
        
    
        INTEGER :: kcdf_id, status
        INTEGER :: ivar,ji,jj,ndims
    
        INTEGER(KIND=8), DIMENSION(:), POINTER  :: iwork
        INTEGER(KIND=8), DIMENSION(:), POINTER  :: idata
    
        REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: xtab3d
        INTEGER,      DIMENSION(:,:,:), ALLOCATABLE :: itab3d
    
        CHARACTER,    DIMENSION(:), ALLOCATABLE :: ytab
        CHARACTER(LEN=FM_FIELD_SIZE)            :: yrecfm
    
        INTEGER :: iartlen, idlen, icomlen
    
        INTEGER(KIND=LFI_INT) :: iresp,ilu,iartlen8
    
    
        ilu = outfiles%files(1)%lun_id
        kcdf_id = infiles%files(1)%lun_id
    
    
        ! Un article LFI est compose de :
        !   - 1 entier identifiant le numero de grille
        !   - 1 entier contenant la taille du commentaire
        !   - le commentaire code en entier 64 bits
        !   - les donnees proprement dites
    
        PRINT *,'Taille buffer = ',2+kbuflen
    
        ALLOCATE(iwork(2+kbuflen))
    
           icomlen = LEN(tpreclist(ivar)%TFIELD%CCOMMENT)
    
           IF (icomlen > MAXLFICOMMENTLENGTH) THEN
             PRINT *,'ERROR: comment length is too big. Please increase MAXLFICOMMENTLENGTH'
             STOP
           END IF
    
    
           ! traitement Grille et Commentaire
    
           iwork(2) = icomlen
           DO jj=1,iwork(2)
    
              iwork(2+jj)=ICHAR(tpreclist(ivar)%TFIELD%CCOMMENT(jj:jj))
    
           IF (ASSOCIATED(tpreclist(ivar)%dim)) THEN
              idlen = tpreclist(ivar)%dim%len
    
           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
             PRINT *,'Too many dimensions'
             STOP
           endif
    
    
           iartlen = 2+icomlen+idlen
           idata=>iwork(3+icomlen:iartlen)
    
    
    
              ALLOCATE( itab3d(idims(1),idims(2),idims(3)) )
    
              status = NF90_GET_VAR(kcdf_id,tpreclist(ivar)%id_in,itab3d)
    
              IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
    !          PRINT *,'TYPEINT,TYPELOG --> ',tpreclist(ivar)%name,',len = ',idlen
    
              idata(1:idlen) = RESHAPE( itab3d , (/ idims(1)*idims(2)*idims(3) /) )
    
              DEALLOCATE(itab3d)
    
              ALLOCATE( xtab3d(idims(1),idims(2),idims(3)) )
    
              status = NF90_GET_VAR(kcdf_id,tpreclist(ivar)%id_in,xtab3d)
    
              IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
    !          PRINT *,'TYPEREAL -->    ',tpreclist(ivar)%name,',len = ',idlen
    
              idata(1:idlen) = RESHAPE( TRANSFER(xtab3d,(/ 0_8 /),idlen) , (/ idims(1)*idims(2)*idims(3) /) )
    
              DEALLOCATE(xtab3d)
    
              ALLOCATE(ytab(idlen))
    
              status = NF90_GET_VAR(kcdf_id,tpreclist(ivar)%id_in,ytab)
    
              IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
    !          PRINT *,'TYPECHAR -->     ',tpreclist(ivar)%name,',len = ',idlen
    
              DO jj=1,idlen
                 idata(jj) = ICHAR(ytab(jj))
              END DO
              
              DEALLOCATE(ytab)
    
           CASE default
    
              ALLOCATE( xtab3d(idims(1),idims(2),idims(3)) )
    
              status = NF90_GET_VAR(kcdf_id,tpreclist(ivar)%id_in,xtab3d)
    
              IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
    
              PRINT *,'Default (ERROR) -->',tpreclist(ivar)%name,',len = ',idlen
    
              idata(1:idlen) = RESHAPE( TRANSFER(xtab3d,(/ 0_8 /),idlen) , (/ idims(1)*idims(2)*idims(3) /) )
    
              DEALLOCATE(xtab3d)
    
           
           ! Attention restoration des '%' dans le nom des champs LFI
           yrecfm = str_replace(tpreclist(ivar)%name,'__','%')
           ! et des '.'
           yrecfm = str_replace(yrecfm,'--','.')
    
           iartlen8 = iartlen
           CALL LFIECR(iresp,ilu,yrecfm,iwork,iartlen8)
    
    
      END SUBROUTINE build_lfi
    
    
      SUBROUTINE UPDATE_VARID_IN(infiles,hinfile,tpreclist,nbvar,current_level)
        !Update the id_in for netCDF files (could change from one file to the other)
        TYPE(filelist_struct),         INTENT(IN)    :: infiles
        CHARACTER(LEN=*),              INTENT(IN)    :: hinfile
        TYPE(workfield), DIMENSION(:), INTENT(INOUT) :: tpreclist
        INTEGER,                       INTENT(IN)    :: nbvar
        INTEGER,                       INTENT(IN)    :: current_level
    
        INTEGER :: ji, status
        CHARACTER(len=4) :: suffix
    
    
        if (infiles%files(1)%format /= NETCDF_FORMAT) return
    
        write(suffix,'(I4.4)') current_level
    
        DO ji=1,nbvar
          IF (.NOT.tpreclist(ji)%tbr) CYCLE
          status = NF90_INQ_VARID(infiles%files(1)%lun_id,trim(tpreclist(ji)%name)//trim(suffix),tpreclist(ji)%id_in)
          IF (status /= NF90_NOERR .AND. tpreclist(ji)%found) THEN
            tpreclist(ji)%found=.false.
            tpreclist(ji)%tbr=.false.
            tpreclist(ji)%tbw=.false.
            print *,'Error: variable ',trim(tpreclist(ji)%name),' not found anymore in split file'
          END IF
        END DO
      END SUBROUTINE UPDATE_VARID_IN
    
    
      SUBROUTINE OPEN_FILES(infiles,outfiles,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
        USE MODD_GRID,          ONLY: XBETA, XRPK, XLAT0, XLON0, XLATORI, XLONORI
        USE MODD_GRID_n,        ONLY: LSLEVE, XXHAT, XYHAT, XZHAT
    
        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                     :: 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()
    
        !
        ! 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.
    
           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', &
                                 HFORMAT='LFI',KLFIVERB=0)
           CALL IO_FILE_OPEN_ll(INFILES%TFILES(idx)%TFILE)
           infiles%files(idx)%lun_id = INFILES%TFILES(idx)%TFILE%NLFIFLU
    
           infiles%files(idx)%format = LFI_FORMAT
           infiles%files(idx)%status = READING
    
           ilu = infiles%files(idx)%lun_id
    
           infiles%files(idx)%opened  = .TRUE.
    
    
           nbvar_infile = INFILES%TFILES(idx)%TFILE%NLFININAR
    
              CALL IO_FILE_CLOSE_ll(INFILES%TFILES(idx)%TFILE)
    
       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
    
             outfiles%nbfiles = outfiles%nbfiles + 1
    
             idx = outfiles%nbfiles
    
             CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,HOUTFILE,'UNKNOWN','WRITE', &
                                   HFORMAT='NETCDF4')
             CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG)
             outfiles%files(idx)%lun_id = OUTFILES%TFILES(idx)%TFILE%NNCID
    
             outfiles%files(idx)%format = NETCDF_FORMAT
             outfiles%files(idx)%status = WRITING
             outfiles%files(idx)%opened  = .TRUE.
    
             IF (options(OPTCOMPRESS)%set) THEN
               outfiles%tfiles(idx)%tfile%LNCCOMPRESS       = .TRUE.
               outfiles%tfiles(idx)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue
             END IF
    
             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
    
           outfiles%nbfiles = outfiles%nbfiles + 1
           idx = outfiles%nbfiles
    
           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
    
    
      END SUBROUTINE OPEN_FILES
    
      SUBROUTINE OPEN_SPLIT_LFIFILE_IN(infiles,hinfile,current_level)
        TYPE(filelist_struct), INTENT(INOUT) :: infiles
    
        CHARACTER(LEN=*), INTENT(IN) :: hinfile
        INTEGER,          INTENT(IN) :: current_level
    
    
        INTEGER(KIND=LFI_INT) :: ilu,iresp,iverb,inap,nbvar
    
    
        CHARACTER(LEN=3)      :: suffix
        CHARACTER(LEN=:),ALLOCATABLE :: filename
    
    
        iverb = 0 !Verbosity level for LFI
    
        ALLOCATE(character(len=len(hinfile)) :: filename)
    
    
        ilu = infiles%files(1)%lun_id !We assume only 1 infile
    
    
        write(suffix,'(I3.3)') current_level
        filename=hinfile(1:len(hinfile)-7)//suffix//'.lfi'
        CALL LFIOUV(iresp,ilu,ltrue,filename,'OLD',lfalse,lfalse,iverb,inap,nbvar)
    
        infiles%files(1)%opened = .TRUE.
    
        DEALLOCATE(filename)
      END SUBROUTINE OPEN_SPLIT_LFIFILE_IN
    
      SUBROUTINE OPEN_SPLIT_NCFILE_IN(infiles,hinfile,current_level)
        TYPE(filelist_struct), INTENT(INOUT) :: infiles
        CHARACTER(LEN=*), INTENT(IN) :: hinfile
        INTEGER,          INTENT(IN) :: current_level
    
        INTEGER :: status
        CHARACTER(LEN=3)      :: suffix
        CHARACTER(LEN=:),ALLOCATABLE :: filename
    
    
        ALLOCATE(character(len=len(hinfile)) :: filename)
    
        write(suffix,'(I3.3)') current_level
        filename=hinfile(1:len(hinfile)-6)//suffix//'.nc'
        status = NF90_OPEN(filename,NF90_NOWRITE,infiles%files(1)%lun_id)
        IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
        infiles%files(1)%opened  = .TRUE.
    
      END SUBROUTINE OPEN_SPLIT_NCFILE_IN
    
      SUBROUTINE OPEN_SPLIT_NCFILES_OUT(outfiles,houtfile,nbvar,tpreclist,options)
    
        USE MODE_FM,               ONLY: IO_FILE_OPEN_ll
        USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
    
        TYPE(filelist_struct),         INTENT(INOUT) :: outfiles
    
        CHARACTER(LEN=*),              INTENT(IN)    :: houtfile
        INTEGER,                       INTENT(IN)    :: nbvar
        TYPE(workfield), DIMENSION(:), INTENT(IN)    :: tpreclist
    
        TYPE(option),DIMENSION(:),     INTENT(IN)    :: options
    
    
        INTEGER :: ji, idx
        INTEGER :: status
        INTEGER :: omode
        CHARACTER(LEN=MAXLEN) :: filename
    
    
        DO ji = 1,nbvar
    
          IF (tpreclist(ji)%tbw) outfiles%nbfiles = outfiles%nbfiles + 1
    
        END DO
    
        idx = 1
        DO ji = 1,nbvar
          IF (.NOT.tpreclist(ji)%tbw) CYCLE
    
          outfiles%files(idx)%var_id = ji
    
          filename = trim(houtfile)//'.'//trim(tpreclist(ji)%name)//'.nc'
    
          CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,filename,'UNKNOWN','WRITE', &
                                HFORMAT='NETCDF4')
          CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG)
          outfiles%files(idx)%lun_id = OUTFILES%TFILES(idx)%TFILE%NNCID
          outfiles%files(idx)%format = NETCDF_FORMAT
          outfiles%files(idx)%status = WRITING
          outfiles%files(idx)%opened  = .TRUE.
    
          IF (options(OPTCOMPRESS)%set) THEN
            outfiles%tfiles(idx)%tfile%LNCCOMPRESS       = .TRUE.
            outfiles%tfiles(idx)%tfile%NNCCOMPRESS_LEVEL = options(OPTCOMPRESS)%ivalue
          END IF
    
          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__)
    
          idx = idx + 1
        END DO
    
    
      END SUBROUTINE OPEN_SPLIT_NCFILES_OUT
    
      SUBROUTINE CLOSE_FILES(filelist)
        TYPE(filelist_struct),INTENT(INOUT) :: filelist
    
        INTEGER(KIND=LFI_INT) :: ilu,iresp
    
        DO ji=1,filelist%nbfiles
          IF ( .NOT.filelist%files(ji)%opened ) CYCLE
    
          IF ( filelist%files(ji)%format == LFI_FORMAT ) THEN
    
            ilu = filelist%files(ji)%lun_id
            CALL LFIFER(iresp,ilu,'KEEP')
    
          ELSE IF ( filelist%files(ji)%format == NETCDF_FORMAT ) THEN
            status = NF90_CLOSE(filelist%files(ji)%lun_id)
            IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
          END IF
          filelist%files(ji)%opened=.false.
    
      END SUBROUTINE CLOSE_FILES
    
    END MODULE mode_util