Ignore:
Timestamp:
2018-12-19T22:54:16+01:00 (2 years ago)
Author:
smasson
Message:

trunk: merge back dev_r10164_HPC09_ESIWACE_PREP_MERGE@10424 into the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/IOM/iom_nf90.F90

    r10068 r10425  
    3030 
    3131   PUBLIC iom_nf90_open  , iom_nf90_close, iom_nf90_varid, iom_nf90_get, iom_nf90_gettime, iom_nf90_rstput 
    32    PUBLIC iom_nf90_getatt, iom_nf90_putatt 
     32   PUBLIC iom_nf90_chkatt, iom_nf90_getatt, iom_nf90_putatt 
    3333 
    3434   INTERFACE iom_nf90_get 
    3535      MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 
    36    END INTERFACE 
    37    INTERFACE iom_nf90_getatt 
    38       MODULE PROCEDURE iom_nf90_giatt, iom_nf90_gratt, iom_nf90_gcatt 
    39    END INTERFACE 
    40    INTERFACE iom_nf90_putatt 
    41       MODULE PROCEDURE iom_nf90_piatt, iom_nf90_pratt, iom_nf90_pcatt 
    4236   END INTERFACE 
    4337   INTERFACE iom_nf90_rstput 
     
    129123               CALL iom_nf90_check(NF90_CREATE( TRIM(cdname), imode, if90id, chunksize = ichunk ), clinfo) 
    130124            ENDIF 
    131             CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL, idmy                    ), clinfo) 
     125            CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL,                   idmy ), clinfo) 
    132126            ! define dimensions 
    133             CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'x'      , kdompar(1,1)  , idmy ), clinfo) 
    134             CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'y'      , kdompar(2,1)  , idmy ), clinfo) 
    135             IF( PRESENT(kdlev) ) THEN 
    136                CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'numcat' , ilevels    , idmy ), clinfo) 
    137             ELSE 
    138                CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'nav_lev', ilevels    , idmy ), clinfo) 
    139             ENDIF 
     127            CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'x',   kdompar(1,1), idmy ), clinfo) 
     128            CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'y',   kdompar(2,1), idmy ), clinfo) 
     129            CALL iom_nf90_check(NF90_DEF_DIM( if90id,      'nav_lev',            jpk, idmy ), clinfo) 
    140130            CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
     131            IF( PRESENT(kdlev) )   & 
     132               CALL iom_nf90_check(NF90_DEF_DIM( if90id,    'numcat',          kdlev, idmy ), clinfo) 
    141133            ! global attributes 
    142134            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij              ), clinfo) 
     
    165157         iom_file(kiomid)%name   = TRIM(cdname) 
    166158         iom_file(kiomid)%nfid   = if90id 
    167          iom_file(kiomid)%iolib  = jpnf90 
    168159         iom_file(kiomid)%nvars  = 0 
    169160         iom_file(kiomid)%irec   = -1   ! useless for NetCDF files, used to know if the file is in define mode  
     
    329320   END SUBROUTINE iom_nf90_g123d 
    330321 
    331    !!---------------------------------------------------------------------- 
    332    !!                   INTERFACE iom_nf90_getatt 
    333    !!---------------------------------------------------------------------- 
    334  
    335    SUBROUTINE iom_nf90_giatt( kiomid, cdatt, pv_i0d, cdvar) 
    336       !!----------------------------------------------------------------------- 
    337       !!                  ***  ROUTINE  iom_nf90_giatt  *** 
    338       !! 
    339       !! ** Purpose : read an integer attribute with NF90 
     322 
     323   SUBROUTINE iom_nf90_chkatt( kiomid, cdatt, llok, ksize, cdvar ) 
     324      !!----------------------------------------------------------------------- 
     325      !!                  ***  ROUTINE  iom_nf90_chkatt  *** 
     326      !! 
     327      !! ** Purpose : check existence of attribute with NF90 
    340328      !!              (either a global attribute (default) or a variable 
    341329      !!               attribute if optional variable name is supplied (cdvar)) 
     
    343331      INTEGER         , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    344332      CHARACTER(len=*), INTENT(in   ) ::   cdatt    ! attribute name 
    345       INTEGER         , INTENT(  out) ::   pv_i0d   ! read field 
     333      LOGICAL         , INTENT(  out) ::   llok     ! error code 
     334      INTEGER         , INTENT(  out), OPTIONAL     & 
     335                      &               ::   ksize    ! attribute size 
    346336      CHARACTER(len=*), INTENT(in   ), OPTIONAL     & 
    347337                      &               ::   cdvar    ! name of the variable 
     338      ! 
     339      INTEGER                         ::   if90id   ! temporary integer 
     340      INTEGER                         ::   isize    ! temporary integer 
     341      INTEGER                         ::   ivarid   ! NetCDF variable Id 
     342      !--------------------------------------------------------------------- 
     343      ! 
     344      if90id = iom_file(kiomid)%nfid 
     345      IF( PRESENT(cdvar) ) THEN 
     346         ! check the variable exists in the file 
     347         llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 
     348         IF( llok ) & 
     349            ! check the variable has the attribute required 
     350            llok = NF90_Inquire_attribute(if90id, ivarid, cdatt, len=isize ) == nf90_noerr 
     351      ELSE 
     352         llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt, len=isize ) == nf90_noerr 
     353      ENDIF 
     354      ! 
     355      IF( PRESENT(ksize) ) ksize = isize 
     356      ! 
     357      IF( .not. llok) & 
     358         CALL ctl_warn('iom_nf90_chkatt: no attribute '//cdatt//' found') 
     359      ! 
     360   END SUBROUTINE iom_nf90_chkatt 
     361 
     362 
     363   !!---------------------------------------------------------------------- 
     364   !!                   INTERFACE iom_nf90_getatt 
     365   !!---------------------------------------------------------------------- 
     366 
     367   SUBROUTINE iom_nf90_getatt( kiomid, cdatt, katt0d, katt1d, patt0d, patt1d, cdatt0d, cdvar) 
     368      !!----------------------------------------------------------------------- 
     369      !!                  ***  ROUTINE  iom_nf90_getatt  *** 
     370      !! 
     371      !! ** Purpose : read an attribute with NF90 
     372      !!              (either a global attribute (default) or a variable 
     373      !!               attribute if optional variable name is supplied (cdvar)) 
     374      !!----------------------------------------------------------------------- 
     375      INTEGER               , INTENT(in   )           ::   kiomid   ! Identifier of the file 
     376      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt    ! attribute name 
     377      INTEGER               , INTENT(  out), OPTIONAL ::   katt0d   ! read scalar integer 
     378      INTEGER, DIMENSION(:) , INTENT(  out), OPTIONAL ::   katt1d   ! read 1d array integer 
     379      REAL(wp)              , INTENT(  out), OPTIONAL ::   patt0d   ! read scalar  real 
     380      REAL(wp), DIMENSION(:), INTENT(  out), OPTIONAL ::   patt1d   ! read 1d array real 
     381      CHARACTER(len=*)      , INTENT(  out), OPTIONAL ::   cdatt0d  ! read character 
     382      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar    ! name of the variable 
    348383      ! 
    349384      INTEGER                         ::   if90id   ! temporary integer 
     
    361396            llok = NF90_Inquire_attribute(if90id, ivarid, cdatt) == nf90_noerr 
    362397         ELSE 
    363             CALL ctl_warn('iom_nf90_getatt: no variable '//cdvar//' found') 
     398            CALL ctl_warn('iom_nf90_getatt: no variable '//TRIM(cdvar)//' found') 
    364399         ENDIF 
    365400      ELSE 
     
    369404      ! 
    370405      IF( llok) THEN 
    371          clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', giatt: '//TRIM(cdatt) 
    372          CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_i0d), clinfo) 
     406         clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 
     407         IF(PRESENT( katt0d))   CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values =  katt0d), clinfo) 
     408         IF(PRESENT( katt1d))   CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values =  katt1d), clinfo) 
     409         IF(PRESENT( patt0d))   CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values =  patt0d), clinfo) 
     410         IF(PRESENT( patt1d))   CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values =  patt1d), clinfo) 
     411         IF(PRESENT(cdatt0d))   CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values = cdatt0d), clinfo) 
    373412      ELSE 
    374          CALL ctl_warn('iom_nf90_getatt: no attribute '//cdatt//' found') 
    375          pv_i0d = -999 
    376       ENDIF 
    377       ! 
    378    END SUBROUTINE iom_nf90_giatt 
    379  
    380  
    381    SUBROUTINE iom_nf90_gratt( kiomid, cdatt, pv_r0d, cdvar ) 
    382       !!----------------------------------------------------------------------- 
    383       !!                  ***  ROUTINE  iom_nf90_gratt  *** 
    384       !! 
    385       !! ** Purpose : read a real attribute with NF90 
     413         CALL ctl_warn('iom_nf90_getatt: no attribute '//TRIM(cdatt)//' found') 
     414         IF(PRESENT( katt0d))    katt0d    = -999 
     415         IF(PRESENT( katt1d))    katt1d(:) = -999 
     416         IF(PRESENT( patt0d))    patt0d    = -999._wp 
     417         IF(PRESENT( patt1d))    patt1d(:) = -999._wp 
     418         IF(PRESENT(cdatt0d))   cdatt0d    = '!' 
     419      ENDIF 
     420      ! 
     421   END SUBROUTINE iom_nf90_getatt 
     422 
     423 
     424   SUBROUTINE iom_nf90_putatt( kiomid, cdatt, katt0d, katt1d, patt0d, patt1d, cdatt0d, cdvar) 
     425      !!----------------------------------------------------------------------- 
     426      !!                  ***  ROUTINE  iom_nf90_putatt  *** 
     427      !! 
     428      !! ** Purpose : write an attribute with NF90 
    386429      !!              (either a global attribute (default) or a variable 
    387430      !!               attribute if optional variable name is supplied (cdvar)) 
    388431      !!----------------------------------------------------------------------- 
    389       INTEGER                   , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    390       CHARACTER(len=*)          , INTENT(in   ) ::   cdatt    ! attribute name 
    391       REAL(wp)                  , INTENT(  out) ::   pv_r0d   ! read field 
    392       CHARACTER(len=*), OPTIONAL, INTENT(in   ) ::   cdvar    ! name of the variable 
    393       ! 
    394       INTEGER            ::   if90id   ! temporary integer 
    395       INTEGER            ::   ivarid   ! NetCDF variable Id 
    396       LOGICAL            ::   llok     ! temporary logical 
    397       CHARACTER(LEN=100) ::   clinfo   ! info character 
     432      INTEGER               , INTENT(in   )           ::   kiomid   ! Identifier of the file 
     433      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt    ! attribute name 
     434      INTEGER               , INTENT(in   ), OPTIONAL ::   katt0d   ! read scalar integer 
     435      INTEGER, DIMENSION(:) , INTENT(in   ), OPTIONAL ::   katt1d   ! read 1d array integer 
     436      REAL(wp)              , INTENT(in   ), OPTIONAL ::   patt0d   ! read scalar  real 
     437      REAL(wp), DIMENSION(:), INTENT(in   ), OPTIONAL ::   patt1d   ! read 1d array real 
     438      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdatt0d  ! read character 
     439      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar    ! name of the variable 
     440      ! 
     441      INTEGER                         ::   if90id   ! temporary integer 
     442      INTEGER                         ::   ivarid   ! NetCDF variable Id 
     443      INTEGER                         ::   isize    ! Attribute size 
     444      INTEGER                         ::   itype    ! Attribute type 
     445      LOGICAL                         ::   llok     ! temporary logical 
     446      LOGICAL                         ::   llatt     ! temporary logical 
     447      LOGICAL                         ::   lldata   ! temporary logical 
     448      CHARACTER(LEN=100)              ::   clinfo   ! info character 
    398449      !--------------------------------------------------------------------- 
    399450      ! 
    400451      if90id = iom_file(kiomid)%nfid 
    401452      IF( PRESENT(cdvar) ) THEN 
    402          ! check the variable exists in the file 
    403          llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 
    404          IF( llok ) THEN 
    405             ! check the variable has the attribute required 
    406             llok = NF90_Inquire_attribute(if90id, ivarid, cdatt) == nf90_noerr 
    407          ELSE 
    408             CALL ctl_warn('iom_nf90_getatt: no variable '//cdvar//' found') 
     453         llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr   ! is the variable in the file? 
     454         IF( .NOT. llok ) THEN 
     455            CALL ctl_warn('iom_nf90_putatt: no variable '//TRIM(cdvar)//' found'   & 
     456               &        , '                 no attribute '//cdatt//' written' ) 
     457            RETURN 
    409458         ENDIF 
    410459      ELSE 
    411          llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 
    412460         ivarid = NF90_GLOBAL 
    413461      ENDIF 
    414       ! 
    415       IF( llok) THEN 
    416          clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', gratt: '//TRIM(cdatt) 
    417          CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_r0d), clinfo) 
    418       ELSE 
    419          CALL ctl_warn('iom_nf90_getatt: no attribute '//cdatt//' found') 
    420          pv_r0d = -999._wp 
    421       ENDIF 
    422       ! 
    423    END SUBROUTINE iom_nf90_gratt 
    424  
    425  
    426    SUBROUTINE iom_nf90_gcatt( kiomid, cdatt, pv_c0d, cdvar ) 
    427       !!----------------------------------------------------------------------- 
    428       !!                  ***  ROUTINE  iom_nf90_gcatt  *** 
    429       !! 
    430       !! ** Purpose : read a character attribute with NF90 
    431       !!              (either a global attribute (default) or a variable 
    432       !!               attribute if optional variable name is supplied (cdvar)) 
    433       !!----------------------------------------------------------------------- 
    434       INTEGER                   , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    435       CHARACTER(len=*)          , INTENT(in   ) ::   cdatt    ! attribute name 
    436       CHARACTER(len=*)          , INTENT(  out) ::   pv_c0d   ! read field 
    437       CHARACTER(len=*), OPTIONAL, INTENT(in   ) ::   cdvar    ! name of the variable 
    438       ! 
    439       INTEGER            ::   if90id   ! temporary integer 
    440       INTEGER            ::   ivarid   ! NetCDF variable Id 
    441       LOGICAL            ::   llok     ! temporary logical 
    442       CHARACTER(LEN=100) ::   clinfo   ! info character 
    443       !--------------------------------------------------------------------- 
    444       ! 
    445       if90id = iom_file(kiomid)%nfid 
    446       IF( PRESENT(cdvar) ) THEN 
    447          ! check the variable exists in the file 
    448          llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 
    449          IF( llok ) THEN 
    450             ! check the variable has the attribute required 
    451             llok = NF90_Inquire_attribute(if90id, ivarid, cdatt) == nf90_noerr 
    452          ELSE 
    453             CALL ctl_warn('iom_nf90_getatt: no variable '//cdvar//' found') 
    454          ENDIF 
    455       ELSE 
    456          llok = NF90_Inquire_attribute(if90id, NF90_GLOBAL, cdatt) == nf90_noerr 
    457          ivarid = NF90_GLOBAL 
    458       ENDIF 
    459 ! 
    460       IF( llok) THEN 
    461          clinfo = 'iom_nf90_getatt, file: '//TRIM(iom_file(kiomid)%name)//', gcatt: '//TRIM(cdatt) 
    462          CALL iom_nf90_check(NF90_GET_ATT(if90id, ivarid, cdatt, values=pv_c0d), clinfo) 
    463       ELSE 
    464          CALL ctl_warn('iom_nf90_getatt: no attribute '//cdatt//' found') 
    465          pv_c0d = '!' 
    466       ENDIF 
    467       ! 
    468    END SUBROUTINE iom_nf90_gcatt 
    469  
    470  
    471    !!---------------------------------------------------------------------- 
    472    !!                   INTERFACE iom_nf90_putatt 
    473    !!---------------------------------------------------------------------- 
    474  
    475    SUBROUTINE iom_nf90_piatt( kiomid, cdatt, pv_i0d, cdvar) 
    476       !!----------------------------------------------------------------------- 
    477       !!                  ***  ROUTINE  iom_nf90_piatt  *** 
    478       !! 
    479       !! ** Purpose : write an integer attribute with NF90 
    480       !!              (either a global attribute (default) or a variable 
    481       !!               attribute if optional variable name is supplied (cdvar)) 
    482       !!----------------------------------------------------------------------- 
    483       INTEGER         , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    484       CHARACTER(len=*), INTENT(in   ) ::   cdatt    ! attribute name 
    485       INTEGER         , INTENT(in   ) ::   pv_i0d   ! write field 
    486       CHARACTER(len=*), INTENT(in   ), OPTIONAL     & 
    487                       &               ::   cdvar    ! name of the variable 
    488       ! 
    489       INTEGER                         ::   if90id   ! temporary integer 
    490       INTEGER                         ::   ivarid   ! NetCDF variable Id 
    491       LOGICAL                         ::   llok     ! temporary logical 
    492       LOGICAL                         ::   lenddef  ! temporary logical 
    493       CHARACTER(LEN=100)              ::   clinfo   ! info character 
    494       !--------------------------------------------------------------------- 
    495       ! 
    496       if90id = iom_file(kiomid)%nfid 
    497       lenddef = .false. 
    498       IF( PRESENT(cdvar) ) THEN 
    499          ! check the variable exists in the file 
    500          llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 
    501          IF( .NOT. llok ) THEN 
    502             CALL ctl_warn('iom_nf90_putatt: no variable '//cdvar//' found') 
    503          ENDIF 
    504       ELSE 
    505          llok = .true. 
    506          ivarid = NF90_GLOBAL 
    507       ENDIF 
    508       ! 
    509       IF( llok) THEN 
    510          clinfo = 'iom_nf90_putatt, file: '//TRIM(iom_file(kiomid)%name)//', piatt: '//TRIM(cdatt) 
    511          IF( iom_file(kiomid)%irec /= -1 ) THEN    
    512             ! trick: irec used to know if the file is in define mode or not 
    513             ! if it is not then temporarily put it into define mode 
    514             CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo) 
    515             lenddef = .true. 
    516          ENDIF 
     462      llatt = NF90_Inquire_attribute(if90id, ivarid, cdatt, len = isize, xtype = itype ) == nf90_noerr 
     463      ! 
     464      ! trick: irec used to know if the file is in define mode or not 
     465      lldata = iom_file(kiomid)%irec /= -1   ! default: go back in define mode if in data mode 
     466      IF( lldata .AND. llatt ) THEN          ! attribute already there. Do we really need to go back in define mode? 
     467         ! do we have the appropriate type? 
     468         IF(PRESENT( katt0d) .OR. PRESENT( katt1d))   llok = itype == NF90_INT 
     469         IF(PRESENT( patt0d) .OR. PRESENT( patt1d))   llok = itype == NF90_DOUBLE 
     470         IF(PRESENT(cdatt0d)                      )   llok = itype == NF90_CHAR 
     471         ! and do we have the appropriate size? 
     472         IF(PRESENT( katt0d))   llok = llok .AND. isize == 1 
     473         IF(PRESENT( katt1d))   llok = llok .AND. isize == SIZE(katt1d) 
     474         IF(PRESENT( patt0d))   llok = llok .AND. isize == 1 
     475         IF(PRESENT( patt1d))   llok = llok .AND. isize == SIZE(patt1d) 
     476         IF(PRESENT(cdatt0d))   llok = llok .AND. isize == LEN_TRIM(cdatt0d) 
    517477         ! 
    518          CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values=pv_i0d), clinfo) 
    519          ! 
    520          IF( lenddef ) THEN    
    521             ! file was in data mode on entry; put it back in that mode 
    522             CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo) 
    523          ENDIF 
    524       ELSE 
    525          CALL ctl_warn('iom_nf90_putatt: no attribute '//cdatt//' written') 
    526       ENDIF 
    527       ! 
    528    END SUBROUTINE iom_nf90_piatt 
    529  
    530  
    531    SUBROUTINE iom_nf90_pratt( kiomid, cdatt, pv_r0d, cdvar ) 
    532       !!----------------------------------------------------------------------- 
    533       !!                  ***  ROUTINE  iom_nf90_pratt  *** 
    534       !! 
    535       !! ** Purpose : write a real attribute with NF90 
    536       !!              (either a global attribute (default) or a variable 
    537       !!               attribute if optional variable name is supplied (cdvar)) 
    538       !!----------------------------------------------------------------------- 
    539       INTEGER                   , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    540       CHARACTER(len=*)          , INTENT(in   ) ::   cdatt    ! attribute name 
    541       REAL(wp)                  , INTENT(in   ) ::   pv_r0d   ! write field 
    542       CHARACTER(len=*), OPTIONAL, INTENT(in   ) ::   cdvar    ! name of the variable 
    543       ! 
    544       INTEGER            ::   if90id   ! temporary integer 
    545       INTEGER            ::   ivarid   ! NetCDF variable Id 
    546       LOGICAL            ::   llok     ! temporary logical 
    547       LOGICAL            ::   lenddef  ! temporary logical 
    548       CHARACTER(LEN=100) ::   clinfo   ! info character 
    549       !--------------------------------------------------------------------- 
    550       ! 
    551       if90id = iom_file(kiomid)%nfid 
    552       lenddef = .false. 
    553       IF( PRESENT(cdvar) ) THEN 
    554          ! check the variable exists in the file 
    555          llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 
    556          IF( .NOT. llok ) THEN 
    557             CALL ctl_warn('iom_nf90_putatt: no variable '//cdvar//' found') 
    558          ENDIF 
    559       ELSE 
    560          llok = .true. 
    561          ivarid = NF90_GLOBAL 
    562       ENDIF 
    563       ! 
    564       IF( llok) THEN 
    565          clinfo = 'iom_nf90_putatt, file: '//TRIM(iom_file(kiomid)%name)//', pratt: '//TRIM(cdatt) 
    566          IF( iom_file(kiomid)%irec /= -1 ) THEN    
    567             ! trick: irec used to know if the file is in define mode or not 
    568             ! if it is not then temporarily put it into define mode 
    569             CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo) 
    570             lenddef = .true. 
    571          ENDIF 
    572          ! 
    573          CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values=pv_r0d), clinfo) 
    574          ! 
    575          IF( lenddef ) THEN    
    576             ! file was in data mode on entry; put it back in that mode 
    577             CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo) 
    578          ENDIF 
    579       ELSE 
    580          CALL ctl_warn('iom_nf90_putatt: no attribute '//cdatt//' written') 
    581       ENDIF 
    582       ! 
    583    END SUBROUTINE iom_nf90_pratt 
    584  
    585  
    586    SUBROUTINE iom_nf90_pcatt( kiomid, cdatt, pv_c0d, cdvar ) 
    587       !!----------------------------------------------------------------------- 
    588       !!                  ***  ROUTINE  iom_nf90_pcatt  *** 
    589       !! 
    590       !! ** Purpose : write a character attribute with NF90 
    591       !!              (either a global attribute (default) or a variable 
    592       !!               attribute if optional variable name is supplied (cdvar)) 
    593       !!----------------------------------------------------------------------- 
    594       INTEGER                   , INTENT(in   ) ::   kiomid   ! Identifier of the file 
    595       CHARACTER(len=*)          , INTENT(in   ) ::   cdatt    ! attribute name 
    596       CHARACTER(len=*)          , INTENT(in   ) ::   pv_c0d   ! write field 
    597       CHARACTER(len=*), OPTIONAL, INTENT(in   ) ::   cdvar    ! name of the variable 
    598       ! 
    599       INTEGER            ::   if90id   ! temporary integer 
    600       INTEGER            ::   ivarid   ! NetCDF variable Id 
    601       LOGICAL            ::   llok     ! temporary logical 
    602       LOGICAL            ::   lenddef  ! temporary logical 
    603       CHARACTER(LEN=100) ::   clinfo   ! info character 
    604       !--------------------------------------------------------------------- 
    605       ! 
    606       if90id = iom_file(kiomid)%nfid 
    607       lenddef = .false. 
    608       IF( PRESENT(cdvar) ) THEN 
    609          ! check the variable exists in the file 
    610          llok = NF90_INQ_VARID( if90id, TRIM(cdvar), ivarid ) == nf90_noerr 
    611          IF( .NOT. llok ) THEN 
    612             CALL ctl_warn('iom_nf90_putatt: no variable '//cdvar//' found') 
    613          ENDIF 
    614       ELSE 
    615          llok = .true. 
    616          ivarid = NF90_GLOBAL 
    617       ENDIF 
    618       ! 
    619       IF( llok) THEN 
    620          clinfo = 'iom_nf90_putatt, file: '//TRIM(iom_file(kiomid)%name)//', pcatt: '//TRIM(cdatt) 
    621          IF( iom_file(kiomid)%irec /= -1 ) THEN    
    622             ! trick: irec used to know if the file is in define mode or not 
    623             ! if it is not then temporarily put it into define mode 
    624             CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo) 
    625             lenddef = .true. 
    626          ENDIF 
    627          ! 
    628          CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values=pv_c0d), clinfo) 
    629          ! 
    630          IF( lenddef ) THEN    
    631             ! file was in data mode on entry; put it back in that mode 
    632             CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo) 
    633          ENDIF 
    634       ELSE 
    635          CALL ctl_warn('iom_nf90_putatt: no attribute '//cdatt//' written') 
    636       ENDIF 
    637       ! 
    638    END SUBROUTINE iom_nf90_pcatt 
     478         lldata = .NOT. llok 
     479      ENDIF 
     480      ! 
     481      clinfo = 'iom_nf90_putatt, file: '//TRIM(iom_file(kiomid)%name)//', att: '//TRIM(cdatt) 
     482      IF(lldata)   CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo)   ! leave data mode to define mode 
     483      ! 
     484      IF(PRESENT( katt0d))   CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values =       katt0d) , clinfo) 
     485      IF(PRESENT( katt1d))   CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values =       katt1d) , clinfo) 
     486      IF(PRESENT( patt0d))   CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values =       patt0d) , clinfo) 
     487      IF(PRESENT( patt1d))   CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values =       patt1d) , clinfo) 
     488      IF(PRESENT(cdatt0d))   CALL iom_nf90_check(NF90_PUT_ATT(if90id, ivarid, cdatt, values = trim(cdatt0d)), clinfo) 
     489      ! 
     490      IF(lldata)   CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo)   ! leave define mode to data mode 
     491      ! 
     492   END SUBROUTINE iom_nf90_putatt 
    639493 
    640494 
     
    693547      INTEGER, DIMENSION(4) :: idimid               ! dimensions id 
    694548      CHARACTER(LEN=256)    :: clinfo               ! info character 
    695       CHARACTER(LEN= 12), DIMENSION(4) :: cltmp     ! temporary character 
     549      CHARACTER(LEN= 12), DIMENSION(5) :: cltmp     ! temporary character 
    696550      INTEGER               :: if90id               ! nf90 file identifier 
    697551      INTEGER               :: idmy                 ! dummy variable 
     
    704558      !                                             ! when appropriate (currently chunking is applied to 4d fields only) 
    705559      INTEGER               :: idlv                 ! local variable 
     560      INTEGER               :: idim3                ! id of the third dimension 
    706561      !--------------------------------------------------------------------- 
    707562      ! 
     
    717572         ENDIF 
    718573         ! define the dimension variables if it is not already done 
    719          IF(iom_file(kiomid)%nlev == jpk ) THEN 
    720           cltmp = (/ 'nav_lon     ', 'nav_lat     ', 'nav_lev     ', 'time_counter' /) 
    721          ELSE 
    722           cltmp = (/ 'nav_lon     ', 'nav_lat     ', 'numcat      ', 'time_counter' /) 
    723          ENDIF 
     574         cltmp = (/ 'nav_lon', 'nav_lat', 'nav_lev', 'time_counter', 'numcat' /) 
    724575         CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(1)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(1) ), clinfo) 
    725576         CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(2)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(2) ), clinfo) 
     
    729580         iom_file(kiomid)%nvars       = 4 
    730581         iom_file(kiomid)%luld(1:4)   = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 
    731          iom_file(kiomid)%cn_var(1:4) = cltmp 
    732          iom_file(kiomid)%ndims(1:4)  = (/ 2, 2, 1, 1 /)   
     582         iom_file(kiomid)%cn_var(1:4) = cltmp(1:4) 
     583         iom_file(kiomid)%ndims(1:4)  = (/ 2, 2, 1, 1 /) 
     584         IF( NF90_INQ_DIMID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN   ! add a 5th variable corresponding to the 5th dimension 
     585            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(5)), NF90_FLOAT , (/ 5 /), iom_file(kiomid)%nvid(5) ), clinfo) 
     586            iom_file(kiomid)%nvars     = 5 
     587            iom_file(kiomid)%luld(5)   = .FALSE. 
     588            iom_file(kiomid)%cn_var(5) = cltmp(5) 
     589            iom_file(kiomid)%ndims(5)  = 1 
     590         ENDIF 
    733591         ! trick: defined to 0 to say that dimension variables are defined but not yet written 
    734592         iom_file(kiomid)%dimsz(1, 1)  = 0    
     
    752610         ! variable definition 
    753611         IF(     PRESENT(pv_r0d) ) THEN   ;   idims = 0 
    754          ELSEIF( PRESENT(pv_r1d) ) THEN   ;   idims = 2   ;   idimid(1:idims) = (/    3,4/) 
     612         ELSEIF( PRESENT(pv_r1d) ) THEN 
     613            IF( SIZE(pv_r1d,1) == jpk ) THEN   ;   idim3 = 3 
     614            ELSE                               ;   idim3 = 5 
     615            ENDIF 
     616                                              idims = 2   ;   idimid(1:idims) = (/idim3,4/) 
    755617         ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2  ,4/) 
    756          ELSEIF( PRESENT(pv_r3d) ) THEN   ;   idims = 4   ;   idimid(1:idims) = (/1,2,3,4/) 
     618         ELSEIF( PRESENT(pv_r3d) ) THEN 
     619            IF( SIZE(pv_r3d,3) == jpk ) THEN   ;   idim3 = 3 
     620            ELSE                               ;   idim3 = 5 
     621            ENDIF 
     622                                              idims = 4   ;   idimid(1:idims) = (/1,2,idim3,4/) 
    757623         ENDIF 
    758624         IF( PRESENT(ktype) ) THEN   ! variable external type 
    759625            SELECT CASE (ktype) 
    760             CASE (jp_r8)  ;   itype = NF90_DOUBLE 
    761             CASE (jp_r4)  ;   itype = NF90_FLOAT 
    762             CASE (jp_i4)  ;   itype = NF90_INT 
    763             CASE (jp_i2)  ;   itype = NF90_SHORT 
    764             CASE (jp_i1)  ;   itype = NF90_BYTE 
     626            CASE (jp_r8)   ;   itype = NF90_DOUBLE 
     627            CASE (jp_r4)   ;   itype = NF90_FLOAT 
     628            CASE (jp_i4)   ;   itype = NF90_INT 
     629            CASE (jp_i2)   ;   itype = NF90_SHORT 
     630            CASE (jp_i1)   ;   itype = NF90_BYTE 
    765631            CASE DEFAULT   ;   CALL ctl_stop( TRIM(clinfo)//' unknown variable type' ) 
    766632            END SELECT 
     
    834700               CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lat'     , idmy )         , clinfo ) 
    835701               CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 
    836                IF(iom_file(kiomid)%nlev == jpk ) THEN  
    837                   !NEMO 
    838                   CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev'     , idmy ), clinfo ) 
    839                   CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gdept_1d       ), clinfo ) 
    840                ELSE 
    841                   CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'numcat'     , idmy ), clinfo) 
     702               CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev'     , idmy ), clinfo ) 
     703               CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gdept_1d       ), clinfo ) 
     704               IF( NF90_INQ_VARID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN 
    842705                  CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, (/ (idlv, idlv = 1,iom_file(kiomid)%nlev) /)), clinfo ) 
    843706               ENDIF 
Note: See TracChangeset for help on using the changeset viewer.