Skip to content
Snippets Groups Projects
mode_util.f90 39.6 KiB
Newer Older
    CHARACTER(LEN=4)            :: ypextsrc, ypextdest
    LOGICAL                     :: fexist
    INTEGER                     :: omode

    iverb = 0
    CALL init_sysfield()

    IF (olfi2cdf) THEN 
       ! Cas LFI -> NetCDF
       CALL LFIOUV(iresp,ilu,ltrue,hinfile,'OLD',lfalse&
            & ,lfalse,iverb,inap,inaf)
       IF (olfilist) THEN
          CALL LFILAF(iresp,ilu,lfalse)
          CALL LFIFER(iresp,ilu,'KEEP')
          return
       IF (.NOT.osplit) THEN
         cdffiles%nbfiles = 1
         allocate(cdffiles%cdf_id(1))

         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