Changeset 2528 for trunk/NEMOGCM/NEMO/OPA_SRC/IOM/iom_nf90.F90
- Timestamp:
- 2010-12-27T18:33:53+01:00 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMOGCM/NEMO/OPA_SRC/IOM/iom_nf90.F90
- Property svn:eol-style deleted
r2172 r2528 28 28 29 29 PUBLIC iom_nf90_open, iom_nf90_close, iom_nf90_varid, iom_nf90_get, iom_nf90_gettime, iom_nf90_rstput 30 PUBLIC iom_nf90_getatt 30 31 31 32 INTERFACE iom_nf90_get 32 33 MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 34 END INTERFACE 35 INTERFACE iom_nf90_getatt 36 MODULE PROCEDURE iom_nf90_intatt 33 37 END INTERFACE 34 38 INTERFACE iom_nf90_rstput 35 39 MODULE PROCEDURE iom_nf90_rp0123d 36 40 END INTERFACE 41 37 42 !!---------------------------------------------------------------------- 38 !! OPA 9.0 , LOCEAN-IPSL (2006)43 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 39 44 !! $Id$ 40 !! Software governed by the CeCILL licence ( modipsl/doc/NEMO_CeCILL.txt)45 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 41 46 !!---------------------------------------------------------------------- 42 47 … … 63 68 INTEGER :: jl ! loop variable 64 69 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 66 72 LOGICAL :: llclobber ! local definition of ln_clobber 67 73 !--------------------------------------------------------------------- … … 78 84 IF( ldwrt ) THEN ! ... in write mode 79 85 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 81 91 CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy ), clinfo) 82 92 ELSE ! ... in read mode … … 97 107 ELSE ; imode = IOR( NF90_64BIT_OFFSET, NF90_NOCLOBBER ) 98 108 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 100 119 CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy ), clinfo) 101 120 ! define dimensions … … 288 307 289 308 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 290 337 SUBROUTINE iom_nf90_gettime( kiomid, kvid, ptime, cdunits, cdcalendar ) 291 338 !!-------------------------------------------------------------------- … … 346 393 INTEGER :: idmy ! dummy variable 347 394 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) 348 402 !--------------------------------------------------------------------- 349 403 ! … … 376 430 ! =============== 377 431 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 ! 378 439 idvar = iom_file(kiomid)%nvars + 1 379 440 ! are we in define mode? … … 406 467 & iom_file(kiomid)%nvid(idvar) ), clinfo) 407 468 ENDIF 469 lchunk = .false. 470 IF( snc4set%luse .AND. idims.eq.4 ) lchunk = .true. 408 471 ! update informations structure related the new variable we want to add... 409 472 iom_file(kiomid)%nvars = idvar … … 417 480 DO jd = 1, idims 418 481 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) 419 483 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 420 496 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' defined ok' 421 497 ELSE … … 497 573 END SUBROUTINE iom_nf90_check 498 574 499 500 575 !!====================================================================== 501 576 END MODULE iom_nf90
Note: See TracChangeset
for help on using the changeset viewer.