New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 2528 for trunk/NEMOGCM/NEMO/OPA_SRC/IOM/iom_nf90.F90 – NEMO

Ignore:
Timestamp:
2010-12-27T18:33:53+01:00 (13 years ago)
Author:
rblod
Message:

Update NEMOGCM from branch nemo_v3_3_beta

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/IOM/iom_nf90.F90

    • Property svn:eol-style deleted
    r2172 r2528  
    2828 
    2929   PUBLIC iom_nf90_open, iom_nf90_close, iom_nf90_varid, iom_nf90_get, iom_nf90_gettime, iom_nf90_rstput 
     30   PUBLIC iom_nf90_getatt 
    3031 
    3132   INTERFACE iom_nf90_get 
    3233      MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 
     34   END INTERFACE 
     35   INTERFACE iom_nf90_getatt 
     36      MODULE PROCEDURE iom_nf90_intatt 
    3337   END INTERFACE 
    3438   INTERFACE iom_nf90_rstput 
    3539      MODULE PROCEDURE iom_nf90_rp0123d 
    3640   END INTERFACE 
     41 
    3742   !!---------------------------------------------------------------------- 
    38    !!  OPA 9.0 , LOCEAN-IPSL (2006) 
     43   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    3944   !! $Id$ 
    40    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     45   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 
    4146   !!---------------------------------------------------------------------- 
    4247 
     
    6368      INTEGER            ::   jl               ! loop variable 
    6469      INTEGER            ::   ichunk           ! temporary storage of nn_chunksz 
    65       INTEGER            ::   imode            ! creation mode flag: NF90_CLOBBER or NF90_NOCLOBBER 
     70      INTEGER            ::   imode            ! creation mode flag: NF90_CLOBBER or NF90_NOCLOBBER or NF90_HDF5 
     71      INTEGER            ::   ihdf5            ! local variable for retrieval of value for NF90_HDF5 
    6672      LOGICAL            ::   llclobber        ! local definition of ln_clobber 
    6773      !--------------------------------------------------------------------- 
     
    7884         IF( ldwrt ) THEN  ! ... in write mode 
    7985            IF(lwp) WRITE(numout,*) TRIM(clinfo)//' open existing file: '//TRIM(cdname)//' in WRITE mode' 
    80             CALL iom_nf90_check(NF90_OPEN( TRIM(cdname), NF90_WRITE  , if90id, chunksize = ichunk ), clinfo) 
     86            IF( snc4set%luse ) THEN 
     87               CALL iom_nf90_check(NF90_OPEN( TRIM(cdname), NF90_WRITE  , if90id ), clinfo) 
     88            ELSE 
     89               CALL iom_nf90_check(NF90_OPEN( TRIM(cdname), NF90_WRITE  , if90id, chunksize = ichunk ), clinfo) 
     90            ENDIF 
    8191            CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy                          ), clinfo) 
    8292         ELSE              ! ... in read mode 
     
    97107            ELSE                   ;   imode = IOR( NF90_64BIT_OFFSET, NF90_NOCLOBBER )  
    98108            ENDIF 
    99             CALL iom_nf90_check(NF90_CREATE( TRIM(cdname), imode, if90id, chunksize = ichunk ), clinfo) 
     109            IF( snc4set%luse ) THEN 
     110               IF(lwp) WRITE(numout,*) TRIM(clinfo)//' creating file: '//TRIM(cdname)//' in hdf5 (netcdf4) mode' 
     111               CALL GET_NF90_SYMBOL("NF90_HDF5", ihdf5) 
     112               IF( llclobber ) THEN   ;   imode = IOR(ihdf5, NF90_CLOBBER) 
     113               ELSE                   ;   imode = IOR(ihdf5, NF90_NOCLOBBER) 
     114               ENDIF 
     115               CALL iom_nf90_check(NF90_CREATE( TRIM(cdname), imode, if90id ), clinfo) 
     116            ELSE 
     117               CALL iom_nf90_check(NF90_CREATE( TRIM(cdname), imode, if90id, chunksize = ichunk ), clinfo) 
     118            ENDIF 
    100119            CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy                     ), clinfo) 
    101120            ! define dimensions 
     
    288307 
    289308 
     309   SUBROUTINE iom_nf90_intatt( kiomid, cdatt, pvar ) 
     310      !!----------------------------------------------------------------------- 
     311      !!                  ***  ROUTINE  iom_nf90_intatt  *** 
     312      !! 
     313      !! ** Purpose : read an integer attribute with NF90 
     314      !!----------------------------------------------------------------------- 
     315      INTEGER         , INTENT(in   ) ::   kiomid   ! Identifier of the file 
     316      CHARACTER(len=*), INTENT(in   ) ::   cdatt    ! attribute name 
     317      INTEGER         , INTENT(  out) ::   pvar     ! read field 
     318      ! 
     319      INTEGER                         ::   if90id   ! temporary integer 
     320      LOGICAL                         ::   llok     ! temporary logical 
     321      CHARACTER(LEN=100)              ::   clinfo   ! info character 
     322      !--------------------------------------------------------------------- 
     323      !  
     324      if90id = iom_file(kiomid)%nfid 
     325      llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 
     326      IF( llok) THEN 
     327         clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 
     328         CALL iom_nf90_check(NF90_GET_ATT(if90id, NF90_GLOBAL, cdatt, values=pvar), clinfo) 
     329      ELSE 
     330         CALL ctl_warn('iom_nf90_getatt: no attribute '//cdatt//' found') 
     331         pvar = -999 
     332      ENDIF 
     333      !  
     334   END SUBROUTINE iom_nf90_intatt 
     335 
     336 
    290337   SUBROUTINE iom_nf90_gettime( kiomid, kvid, ptime, cdunits, cdcalendar ) 
    291338      !!-------------------------------------------------------------------- 
     
    346393      INTEGER               :: idmy                 ! dummy variable 
    347394      INTEGER               :: itype                ! variable type 
     395      INTEGER, DIMENSION(4) :: ichunksz             ! NetCDF4 chunk sizes. Will be computed using 
     396                                                    ! nn_nchunks_[i,j,k,t] namelist parameters 
     397      INTEGER               :: ichunkalg, ishuffle,& 
     398                               ideflate, ideflate_level 
     399                                                    ! NetCDF4 internally fixed parameters 
     400      LOGICAL               :: lchunk               ! logical switch to activate chunking and compression 
     401                                                    ! when appropriate (currently chunking is applied to 4d fields only) 
    348402      !--------------------------------------------------------------------- 
    349403      ! 
     
    376430      ! =============== 
    377431      IF( kvid <= 0 ) THEN 
     432         ! 
     433         ! NetCDF4 chunking and compression fixed settings 
     434         ichunkalg = 0 
     435         ishuffle = 1 
     436         ideflate = 1 
     437         ideflate_level = 1 
     438         ! 
    378439         idvar = iom_file(kiomid)%nvars + 1 
    379440         ! are we in define mode? 
     
    406467                 &                            iom_file(kiomid)%nvid(idvar) ), clinfo) 
    407468         ENDIF 
     469         lchunk = .false. 
     470         IF( snc4set%luse .AND. idims.eq.4 ) lchunk = .true. 
    408471         ! update informations structure related the new variable we want to add... 
    409472         iom_file(kiomid)%nvars         = idvar 
     
    417480         DO jd = 1, idims 
    418481            CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, idimid(jd), len = iom_file(kiomid)%dimsz(jd,idvar) ), clinfo) 
     482            IF ( lchunk ) ichunksz(jd) = iom_file(kiomid)%dimsz(jd,idvar) 
    419483         END DO 
     484         IF ( lchunk ) THEN 
     485            ! Calculate chunk sizes by partitioning each dimension as requested in namnc4 namelist 
     486            ! Disallow very small chunk sizes and prevent chunk sizes larger than each individual dimension 
     487            ichunksz(1) = MIN( ichunksz(1),MAX( (ichunksz(1)-1)/snc4set%ni + 1 ,16 ) ) ! Suggested default nc4set%ni=4 
     488            ichunksz(2) = MIN( ichunksz(2),MAX( (ichunksz(2)-1)/snc4set%nj + 1 ,16 ) ) ! Suggested default nc4set%nj=2 
     489            ichunksz(3) = MIN( ichunksz(3),MAX( (ichunksz(3)-1)/snc4set%nk + 1 , 1 ) ) ! Suggested default nc4set%nk=6 
     490            ichunksz(4) = 1                                                            ! Do not allow chunks to span the 
     491                                                                                       ! unlimited dimension 
     492            CALL iom_nf90_check(SET_NF90_DEF_VAR_CHUNKING(if90id, idvar, ichunkalg, ichunksz), clinfo) 
     493            CALL iom_nf90_check(SET_NF90_DEF_VAR_DEFLATE(if90id, idvar, ishuffle, ideflate, ideflate_level), clinfo) 
     494            IF(lwp) WRITE(numout,*) TRIM(clinfo)//' chunked ok. Chunks sizes: ', ichunksz 
     495         ENDIF 
    420496         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' defined ok' 
    421497      ELSE 
     
    497573   END SUBROUTINE iom_nf90_check 
    498574 
    499  
    500575   !!====================================================================== 
    501576END MODULE iom_nf90 
Note: See TracChangeset for help on using the changeset viewer.