Skip to content
Snippets Groups Projects
mode_util.f90 38.7 KiB
Newer Older
  • Learn to ignore specific revisions
  •          IF (ohdf5) THEN
                status = NF90_CREATE(houtfile, IOR(NF90_CLOBBER,NF90_NETCDF4), cdffiles%cdf_id(1))
             ELSE
                status = NF90_CREATE(houtfile, IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), cdffiles%cdf_id(1))
             END IF
    
             IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
             cdffiles%opened  = .TRUE.
    
             status = NF90_SET_FILL(cdffiles%cdf_id(1),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
    
           
        ELSE
           ! Cas NetCDF -> LFI
    
           cdffiles%nbfiles = 1
           allocate(cdffiles%cdf_id(1))
           status = NF90_OPEN(hinfile,NF90_NOWRITE,cdffiles%cdf_id(1))
    
           IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
           CALL LFIOUV(iresp,ilu,ltrue,houtfile,'NEW'&
                & ,lfalse,lfalse,iverb,inap,inaf)
    
        klu  = ilu
        knaf = inaf
    
        PRINT *,'--> Fichier converti : ', houtfile
    
    
      END SUBROUTINE OPEN_FILES
    
      SUBROUTINE OPEN_SPLIT_LFIFILE(ilu,hinfile,current_level)
        INTEGER,          INTENT(IN) :: ilu
        CHARACTER(LEN=*), INTENT(IN) :: hinfile
        INTEGER,          INTENT(IN) :: current_level
    
        INTEGER(KIND=LFI_INT) :: iresp,iverb,inap,nbvar
    
        CHARACTER(LEN=3)      :: suffix
        CHARACTER(LEN=:),ALLOCATABLE :: filename
    
        iverb = 0 !Verbosity level for LFI
    
        ALLOCATE(character(len=len(hinfile)) :: filename)
    
        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)
    
        DEALLOCATE(filename)
      END SUBROUTINE OPEN_SPLIT_LFIFILE
    
    
      SUBROUTINE OPEN_SPLIT_NCFILES(houtfile,nbvar,tpreclist,cdffiles,ohdf5)
        CHARACTER(LEN=*),              INTENT(IN)    :: houtfile
        INTEGER,                       INTENT(IN)    :: nbvar
        TYPE(workfield), DIMENSION(:), INTENT(IN)    :: tpreclist
        TYPE(cdf_files),               INTENT(INOUT) :: cdffiles
        LOGICAL,                       INTENT(IN)    :: ohdf5
    
        INTEGER :: ji, idx
        INTEGER :: status
        INTEGER :: omode
        CHARACTER(LEN=MAXLEN) :: filename
    
    
        cdffiles%nbfiles = 0
        DO ji = 1,nbvar
          IF (tpreclist(ji)%tbw) cdffiles%nbfiles = cdffiles%nbfiles + 1
        END DO
        allocate(cdffiles%cdf_id(cdffiles%nbfiles))
        allocate(cdffiles%var_id(cdffiles%nbfiles))
    
        idx = 1
        DO ji = 1,nbvar
          IF (.NOT.tpreclist(ji)%tbw) CYCLE
    
          cdffiles%var_id(idx) = ji
    
          IF (ohdf5) THEN
            filename = trim(houtfile)//'.'//trim(tpreclist(ji)%name)//'.nc4'
            status = NF90_CREATE(trim(filename), IOR(NF90_CLOBBER,NF90_NETCDF4), cdffiles%cdf_id(idx))
          ELSE
            filename = trim(houtfile)//'.'//trim(tpreclist(ji)%name)//'.nc'
            status = NF90_CREATE(trim(filename), IOR(NF90_CLOBBER,NF90_64BIT_OFFSET), cdffiles%cdf_id(idx))
          END IF
    
          IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
          status = NF90_SET_FILL(cdffiles%cdf_id(idx),NF90_NOFILL,omode)
          IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
    
          idx = idx + 1
        END DO
    
        cdffiles%opened  = .TRUE.
    
      END SUBROUTINE OPEN_SPLIT_NCFILES
    
      SUBROUTINE CLOSE_FILES(klu,cdffiles,osplit)
        INTEGER, INTENT(IN) :: klu
        TYPE(cdf_files),INTENT(INOUT) :: cdffiles
        LOGICAl, INTENT(IN) :: osplit
    
        INTEGER(KIND=LFI_INT) :: iresp,ilu
    
        ! close LFI file
    
        CALL LFIFER(iresp,ilu,'KEEP')
    
        ! close NetCDF files
        DO ji=1,cdffiles%nbfiles
          status = NF90_CLOSE(cdffiles%cdf_id(ji))
          IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
        END DO
        cdffiles%opened=.false.
    
        
      END SUBROUTINE CLOSE_files
    
      SUBROUTINE CLOSE_SPLIT_LFIFILE(ilu)
        INTEGER, INTENT(IN) :: ilu
    
        INTEGER(KIND=LFI_INT) :: iresp
    
        CALL LFIFER(iresp,ilu,'KEEP')
      END SUBROUTINE CLOSE_SPLIT_LFIFILE
    
    
    END MODULE mode_util