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 13463 for NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/IOM/iom_nf90.F90 – NEMO

Ignore:
Timestamp:
2020-09-14T17:40:34+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2195:update to trunk 13461

Location:
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@13382        sette 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/IOM/iom_nf90.F90

    r10522 r13463  
    1919   !!---------------------------------------------------------------------- 
    2020   USE dom_oce         ! ocean space and time domain 
     21   USE sbc_oce, ONLY: ght_abl ! abl vertical level number and height 
    2122   USE lbclnk          ! lateal boundary condition / mpp exchanges 
    2223   USE iom_def         ! iom variables definitions 
     
    3233 
    3334   INTERFACE iom_nf90_get 
    34       MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 
     35      MODULE PROCEDURE iom_nf90_g0d_sp                    
     36      MODULE PROCEDURE iom_nf90_g0d_dp, iom_nf90_g123d_dp 
    3537   END INTERFACE 
    3638   INTERFACE iom_nf90_rstput 
    37       MODULE PROCEDURE iom_nf90_rp0123d 
     39      MODULE PROCEDURE iom_nf90_rp0123d_dp 
    3840   END INTERFACE 
    3941 
     
    4547CONTAINS 
    4648 
    47    SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdompar, kdlev ) 
     49   SUBROUTINE iom_nf90_open( cdname, kiomid, ldwrt, ldok, kdlev, cdcomp ) 
    4850      !!--------------------------------------------------------------------- 
    4951      !!                   ***  SUBROUTINE  iom_open  *** 
     
    5557      LOGICAL                , INTENT(in   )           ::   ldwrt       ! read or write the file? 
    5658      LOGICAL                , INTENT(in   )           ::   ldok        ! check the existence  
    57       INTEGER, DIMENSION(2,5), INTENT(in   ), OPTIONAL ::   kdompar     ! domain parameters:  
    58       INTEGER                , INTENT(in   ), OPTIONAL ::   kdlev       ! size of the third dimension 
     59      INTEGER                , INTENT(in   ), OPTIONAL ::   kdlev       ! size of the ice/abl third dimension 
     60      CHARACTER(len=3)       , INTENT(in   ), OPTIONAL ::   cdcomp      ! name of component calling iom_nf90_open 
    5961 
    6062      CHARACTER(LEN=256) ::   clinfo           ! info character 
    6163      CHARACTER(LEN=256) ::   cltmp            ! temporary character 
     64      CHARACTER(LEN=12 ) ::   clfmt            ! writing format 
     65      CHARACTER(LEN=3  ) ::   clcomp           ! name of component calling iom_nf90_open 
     66      INTEGER            ::   idg              ! number of digits 
    6267      INTEGER            ::   iln              ! lengths of character 
    6368      INTEGER            ::   istop            ! temporary storage of nstop 
     
    6974      INTEGER            ::   ihdf5            ! local variable for retrieval of value for NF90_HDF5 
    7075      LOGICAL            ::   llclobber        ! local definition of ln_clobber 
    71       INTEGER            ::   ilevels           ! vertical levels 
    7276      !--------------------------------------------------------------------- 
    7377      ! 
     
    7680      ! 
    7781      !                 !number of vertical levels 
    78       IF( PRESENT(kdlev) ) THEN   ;   ilevels = kdlev    ! use input value (useful for sea-ice) 
    79       ELSE                        ;   ilevels = jpk      ! by default jpk 
     82      IF( PRESENT(cdcomp) )   THEN 
     83         IF( .NOT. PRESENT(kdlev) ) CALL ctl_stop( 'iom_nf90_open: cdcomp and kdlev must both be present' ) 
     84         clcomp = cdcomp    ! use input value 
     85      ELSE 
     86         clcomp = 'OCE'     ! by default  
    8087      ENDIF 
    8188      ! 
     
    104111         IF( ldwrt ) THEN              !* the file should be open in write mode so we create it... 
    105112            IF( jpnij > 1 ) THEN 
    106                WRITE(cltmp,'(a,a,i4.4,a)') cdname(1:iln-1), '_', narea-1, '.nc' 
     113               idg = MAX( INT(LOG10(REAL(MAX(1,jpnij-1),wp))) + 1, 4 )          ! how many digits to we need to write? min=4, max=9 
     114               WRITE(clfmt, "('(a,a,i', i1, '.', i1, ',a)')") idg, idg          ! '(a,a,ix.x,a)' 
     115               WRITE(cltmp,clfmt) cdname(1:iln-1), '_', narea-1, '.nc' 
    107116               cdname = TRIM(cltmp) 
    108117            ENDIF 
     
    124133            CALL iom_nf90_check(NF90_SET_FILL( if90id, NF90_NOFILL,                   idmy ), clinfo) 
    125134            ! define dimensions 
    126             CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'x',   kdompar(1,1), idmy ), clinfo) 
    127             CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'y',   kdompar(2,1), idmy ), clinfo) 
    128             CALL iom_nf90_check(NF90_DEF_DIM( if90id,      'nav_lev',            jpk, idmy ), clinfo) 
    129             CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
    130             IF( PRESENT(kdlev) )   & 
    131                CALL iom_nf90_check(NF90_DEF_DIM( if90id,    'numcat',          kdlev, idmy ), clinfo) 
     135                               CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'x',  Ni_0, idmy ), clinfo) 
     136                               CALL iom_nf90_check(NF90_DEF_DIM( if90id,            'y',  Nj_0, idmy ), clinfo) 
     137            SELECT CASE (clcomp) 
     138            CASE ('OCE')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,      'nav_lev',   jpk, idmy ), clinfo) 
     139            CASE ('ICE')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,       'numcat', kdlev, idmy ), clinfo) 
     140            CASE ('ABL')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,      'nav_lev', kdlev, idmy ), clinfo) 
     141            CASE ('SED')   ;   CALL iom_nf90_check(NF90_DEF_DIM( if90id,       'numsed', kdlev, idmy ), clinfo) 
     142            CASE DEFAULT   ;   CALL ctl_stop( 'iom_nf90_open unknown component type' ) 
     143            END SELECT 
     144                               CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo) 
    132145            ! global attributes 
    133             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij              ), clinfo) 
    134             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number'         , narea-1            ), clinfo) 
    135             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/1     , 2     /) ), clinfo) 
    136             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_global'    , (/jpiglo, jpjglo/) ), clinfo) 
    137             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_local'     , kdompar(:,1)      ), clinfo) 
    138             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_first' , kdompar(:,2)      ), clinfo) 
    139             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_last'  , kdompar(:,3)      ), clinfo) 
    140             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_start', kdompar(:,4)      ), clinfo) 
    141             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , kdompar(:,5)      ), clinfo) 
    142             CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'              ), clinfo) 
     146            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                        ), clinfo) 
     147            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                      ), clinfo) 
     148            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1        , 2           /) ), clinfo) 
     149            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo    , Nj0glo     /) ), clinfo) 
     150            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0      , Nj_0       /) ), clinfo) 
     151            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig0(Nis0), mjg0(Njs0) /) ), clinfo) 
     152            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig0(Nie0), mjg0(Nje0) /) ), clinfo) 
     153            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0         , 0          /) ), clinfo) 
     154            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0         , 0          /) ), clinfo) 
     155            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                        ), clinfo) 
    143156         ELSE                          !* the file should be open for read mode so it must exist... 
    144157            CALL ctl_stop( TRIM(clinfo), ' should be impossible case...' ) 
     
    155168         ENDDO 
    156169         iom_file(kiomid)%name   = TRIM(cdname) 
     170         iom_file(kiomid)%comp   = clcomp 
    157171         iom_file(kiomid)%nfid   = if90id 
    158172         iom_file(kiomid)%nvars  = 0 
    159173         iom_file(kiomid)%irec   = -1   ! useless for NetCDF files, used to know if the file is in define mode  
    160          iom_file(kiomid)%nlev   = ilevels 
    161174         CALL iom_nf90_check(NF90_Inquire(if90id, unlimitedDimId = iom_file(kiomid)%iduld), clinfo) 
    162175         IF( iom_file(kiomid)%iduld .GE. 0 ) THEN 
     
    187200 
    188201 
    189    FUNCTION iom_nf90_varid ( kiomid, cdvar, kiv, kdimsz, kndims 
     202   FUNCTION iom_nf90_varid ( kiomid, cdvar, kiv, kdimsz, kndims, lduld 
    190203      !!----------------------------------------------------------------------- 
    191204      !!                  ***  FUNCTION  iom_varid  *** 
     
    196209      CHARACTER(len=*)     , INTENT(in   )           ::   cdvar    ! name of the variable 
    197210      INTEGER              , INTENT(in   )           ::   kiv   !  
    198       INTEGER, DIMENSION(:), INTENT(  out), OPTIONAL ::   kdimsz   ! size of the dimensions 
    199       INTEGER,               INTENT(  out), OPTIONAL ::   kndims   ! size of the dimensions 
     211      INTEGER, DIMENSION(:), INTENT(  out), OPTIONAL ::   kdimsz   ! size of each dimension 
     212      INTEGER              , INTENT(  out), OPTIONAL ::   kndims   ! number of dimensions 
     213      LOGICAL              , INTENT(  out), OPTIONAL ::   lduld    ! true if the last dimension is unlimited (time) 
    200214      ! 
    201215      INTEGER                        ::   iom_nf90_varid   ! iom variable Id 
     
    251265         ENDIF 
    252266         IF( PRESENT(kndims) )  kndims = iom_file(kiomid)%ndims(kiv) 
     267         IF( PRESENT( lduld) )  lduld  = iom_file(kiomid)%luld(kiv) 
    253268      ELSE   
    254269         iom_nf90_varid = -1   !   variable not found, return error code: -1 
     
    261276   !!---------------------------------------------------------------------- 
    262277 
    263    SUBROUTINE iom_nf90_g0d( kiomid, kvid, pvar, kstart ) 
     278   SUBROUTINE iom_nf90_g0d_sp( kiomid, kvid, pvar, kstart ) 
    264279      !!----------------------------------------------------------------------- 
    265280      !!                  ***  ROUTINE  iom_nf90_g0d  *** 
     
    269284      INTEGER ,               INTENT(in   )            ::   kiomid   ! Identifier of the file 
    270285      INTEGER ,               INTENT(in   )            ::   kvid     ! variable id 
    271       REAL(wp),               INTENT(  out)            ::   pvar     ! read field 
     286      REAL(sp),               INTENT(  out)            ::   pvar     ! read field 
    272287      INTEGER , DIMENSION(1), INTENT(in   ), OPTIONAL  ::   kstart   ! start position of the reading in each axis 
    273288      ! 
     
    276291      clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 
    277292      CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo ) 
    278    END SUBROUTINE iom_nf90_g0d 
    279  
    280  
    281    SUBROUTINE iom_nf90_g123d( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2,   & 
     293   END SUBROUTINE iom_nf90_g0d_sp 
     294 
     295   SUBROUTINE iom_nf90_g0d_dp( kiomid, kvid, pvar, kstart ) 
     296      !!----------------------------------------------------------------------- 
     297      !!                  ***  ROUTINE  iom_nf90_g0d  *** 
     298      !! 
     299      !! ** Purpose : read a scalar with NF90 
     300      !!----------------------------------------------------------------------- 
     301      INTEGER ,               INTENT(in   )            ::   kiomid   ! Identifier of the file 
     302      INTEGER ,               INTENT(in   )            ::   kvid     ! variable id 
     303      REAL(dp),               INTENT(  out)            ::   pvar     ! read field 
     304      INTEGER , DIMENSION(1), INTENT(in   ), OPTIONAL  ::   kstart   ! start position of the reading in each axis 
     305      ! 
     306      CHARACTER(LEN=100)      ::   clinfo   ! info character 
     307      !--------------------------------------------------------------------- 
     308      clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 
     309      CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo ) 
     310   END SUBROUTINE iom_nf90_g0d_dp 
     311 
     312   SUBROUTINE iom_nf90_g123d_dp( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2,   & 
    282313         &                    pv_r1d, pv_r2d, pv_r3d ) 
    283314      !!----------------------------------------------------------------------- 
     
    294325      INTEGER , DIMENSION(:)     , INTENT(in   )           ::   kcount    ! number of points to be read in each axis 
    295326      INTEGER ,                    INTENT(in   )           ::   kx1, kx2, ky1, ky2   ! subdomain indexes 
    296       REAL(wp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pv_r1d    ! read field (1D case) 
    297       REAL(wp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pv_r2d    ! read field (2D case) 
    298       REAL(wp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pv_r3d    ! read field (3D case) 
     327      REAL(dp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pv_r1d    ! read field (1D case) 
     328      REAL(dp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pv_r2d    ! read field (2D case) 
     329      REAL(dp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pv_r3d    ! read field (3D case) 
    299330      ! 
    300331      CHARACTER(LEN=100) ::   clinfo               ! info character 
     
    317348      ENDIF 
    318349      ! 
    319    END SUBROUTINE iom_nf90_g123d 
     350   END SUBROUTINE iom_nf90_g123d_dp 
     351 
    320352 
    321353 
     
    491523   END SUBROUTINE iom_nf90_putatt 
    492524 
    493  
    494    SUBROUTINE iom_nf90_rp0123d( kt, kwrite, kiomid, cdvar , kvid  , ktype,   & 
     525   SUBROUTINE iom_nf90_rp0123d_dp( kt, kwrite, kiomid, cdvar , kvid  , ktype,   & 
    495526         &                                  pv_r0d, pv_r1d, pv_r2d, pv_r3d ) 
    496527      !!-------------------------------------------------------------------- 
     
    505536      INTEGER                     , INTENT(in)           ::   kvid     ! variable id 
    506537      INTEGER                     , INTENT(in), OPTIONAL ::   ktype    ! variable type (default R8) 
    507       REAL(wp)                    , INTENT(in), OPTIONAL ::   pv_r0d   ! written Od field 
    508       REAL(wp), DIMENSION(      :), INTENT(in), OPTIONAL ::   pv_r1d   ! written 1d field 
    509       REAL(wp), DIMENSION(:, :   ), INTENT(in), OPTIONAL ::   pv_r2d   ! written 2d field 
    510       REAL(wp), DIMENSION(:, :, :), INTENT(in), OPTIONAL ::   pv_r3d   ! written 3d field 
     538      REAL(dp)                    , INTENT(in), OPTIONAL ::   pv_r0d   ! written Od field 
     539      REAL(dp), DIMENSION(      :), INTENT(in), OPTIONAL ::   pv_r1d   ! written 1d field 
     540      REAL(dp), DIMENSION(:, :   ), INTENT(in), OPTIONAL ::   pv_r2d   ! written 2d field 
     541      REAL(dp), DIMENSION(:, :, :), INTENT(in), OPTIONAL ::   pv_r3d   ! written 3d field 
    511542      ! 
    512543      INTEGER               :: idims                ! number of dimension 
     
    517548      INTEGER, DIMENSION(4) :: idimid               ! dimensions id 
    518549      CHARACTER(LEN=256)    :: clinfo               ! info character 
    519       CHARACTER(LEN= 12), DIMENSION(5) :: cltmp     ! temporary character 
    520550      INTEGER               :: if90id               ! nf90 file identifier 
    521       INTEGER               :: idmy                 ! dummy variable 
    522551      INTEGER               :: itype                ! variable type 
    523552      INTEGER, DIMENSION(4) :: ichunksz             ! NetCDF4 chunk sizes. Will be computed using 
     
    528557      !                                             ! when appropriate (currently chunking is applied to 4d fields only) 
    529558      INTEGER               :: idlv                 ! local variable 
    530       INTEGER               :: idim3                ! id of the third dimension 
    531559      !--------------------------------------------------------------------- 
    532560      ! 
     
    542570         ENDIF 
    543571         ! define the dimension variables if it is not already done 
    544          ! Warning: we must use the same character length in an array constructor (at least for gcc compiler) 
    545          cltmp = (/ 'nav_lon     ', 'nav_lat     ', 'nav_lev     ', 'time_counter', 'numcat      ' /)    
    546          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(1)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(1) ), clinfo) 
    547          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(2)), NF90_FLOAT , (/ 1, 2 /), iom_file(kiomid)%nvid(2) ), clinfo) 
    548          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(3)), NF90_FLOAT , (/ 3    /), iom_file(kiomid)%nvid(3) ), clinfo) 
    549          CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(4)), NF90_DOUBLE, (/ 4    /), iom_file(kiomid)%nvid(4) ), clinfo) 
     572         DO jd = 1, 2 
     573            CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(jd,jd)),clinfo) 
     574            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ 1, 2 /),   & 
     575               &                              iom_file(kiomid)%nvid(jd) ), clinfo) 
     576         END DO 
     577         iom_file(kiomid)%dimsz(2,1) = iom_file(kiomid)%dimsz(2,2)   ! second dim of first  variable 
     578         iom_file(kiomid)%dimsz(1,2) = iom_file(kiomid)%dimsz(1,1)   ! first  dim of second variable 
     579         DO jd = 3, 4 
     580            CALL iom_nf90_check(NF90_INQUIRE_DIMENSION(if90id,jd,iom_file(kiomid)%cn_var(jd),iom_file(kiomid)%dimsz(1,jd)), clinfo) 
     581            CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(iom_file(kiomid)%cn_var(jd)), NF90_FLOAT , (/ jd   /),   & 
     582               &                              iom_file(kiomid)%nvid(jd) ), clinfo) 
     583         END DO 
    550584         ! update informations structure related the dimension variable we just added... 
    551585         iom_file(kiomid)%nvars       = 4 
    552586         iom_file(kiomid)%luld(1:4)   = (/ .FALSE., .FALSE., .FALSE., .TRUE. /) 
    553          iom_file(kiomid)%cn_var(1:4) = cltmp(1:4) 
    554587         iom_file(kiomid)%ndims(1:4)  = (/ 2, 2, 1, 1 /) 
    555          IF( NF90_INQ_DIMID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN   ! add a 5th variable corresponding to the 5th dimension 
    556             CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cltmp(5)), NF90_FLOAT , (/ 5 /), iom_file(kiomid)%nvid(5) ), clinfo) 
    557             iom_file(kiomid)%nvars     = 5 
    558             iom_file(kiomid)%luld(5)   = .FALSE. 
    559             iom_file(kiomid)%cn_var(5) = cltmp(5) 
    560             iom_file(kiomid)%ndims(5)  = 1 
    561          ENDIF 
    562          ! trick: defined to 0 to say that dimension variables are defined but not yet written 
    563          iom_file(kiomid)%dimsz(1, 1)  = 0    
    564588         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done' 
    565589      ENDIF 
     
    582606         IF(     PRESENT(pv_r0d) ) THEN   ;   idims = 0 
    583607         ELSEIF( PRESENT(pv_r1d) ) THEN 
    584             IF( SIZE(pv_r1d,1) == jpk ) THEN   ;   idim3 = 3 
    585             ELSE                               ;   idim3 = 5 
    586             ENDIF 
    587                                               idims = 2   ;   idimid(1:idims) = (/idim3,4/) 
    588          ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2  ,4/) 
     608                                              idims = 2   ;   idimid(1:idims) = (/3,4/) 
     609         ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2,4/) 
    589610         ELSEIF( PRESENT(pv_r3d) ) THEN 
    590             IF( SIZE(pv_r3d,3) == jpk ) THEN   ;   idim3 = 3 
    591             ELSE                               ;   idim3 = 5 
    592             ENDIF 
    593                                               idims = 4   ;   idimid(1:idims) = (/1,2,idim3,4/) 
     611                                              idims = 4   ;   idimid(1:idims) = (/1,2,3,4/) 
    594612         ENDIF 
    595613         IF( PRESENT(ktype) ) THEN   ! variable external type 
     
    653671         IF( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) THEN 
    654672            idimsz(1:2) = iom_file(kiomid)%dimsz(1:2,idvar) 
    655             IF(     idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1) ) THEN 
    656                ix1 = nldi   ;   ix2 = nlei   ;   iy1 = nldj   ;   iy2 = nlej 
    657             ELSEIF( idimsz(1) == nlci              .AND. idimsz(2) == nlcj              ) THEN 
    658                ix1 = 1      ;   ix2 = nlci   ;   iy1 = 1      ;   iy2 = nlcj 
    659             ELSEIF( idimsz(1) == jpi               .AND. idimsz(2) == jpj               ) THEN 
     673            IF(     idimsz(1) == Ni_0 .AND. idimsz(2) == Nj_0 ) THEN 
     674               ix1 = Nis0   ;   ix2 = Nie0   ;   iy1 = Njs0   ;   iy2 = Nje0 
     675            ELSEIF( idimsz(1) == jpi  .AND. idimsz(2) == jpj  ) THEN 
     676               ix1 = 1      ;   ix2 = jpi    ;   iy1 = 1      ;   iy2 = jpj 
     677            ELSEIF( idimsz(1) == jpi  .AND. idimsz(2) == jpj  ) THEN 
    660678               ix1 = 1      ;   ix2 = jpi    ;   iy1 = 1      ;   iy2 = jpj 
    661679            ELSE  
     
    666684            ! ============= 
    667685            ! trick: is defined to 0 => dimension variable are defined but not yet written 
    668             IF( iom_file(kiomid)%dimsz(1, 1) == 0 ) THEN 
    669                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lon'     , idmy )         , clinfo ) 
    670                CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, glamt(ix1:ix2, iy1:iy2) ), clinfo ) 
    671                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lat'     , idmy )         , clinfo ) 
    672                CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gphit(ix1:ix2, iy1:iy2) ), clinfo ) 
    673                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'nav_lev'     , idmy ), clinfo ) 
    674                CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, gdept_1d       ), clinfo ) 
    675                IF( NF90_INQ_VARID( if90id, 'numcat', idmy ) == nf90_noerr ) THEN 
    676                   CALL iom_nf90_check( NF90_PUT_VAR  ( if90id, idmy, (/ (idlv, idlv = 1,iom_file(kiomid)%nlev) /)), clinfo ) 
    677                ENDIF 
    678                ! +++ WRONG VALUE: to be improved but not really useful... 
    679                CALL iom_nf90_check( NF90_INQ_VARID( if90id, 'time_counter', idmy ), clinfo ) 
    680                CALL iom_nf90_check( NF90_PUT_VAR( if90id, idmy, kt                      ), clinfo )    
    681                ! update the values of the variables dimensions size 
    682                CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 1, len = iom_file(kiomid)%dimsz(1,1) ), clinfo ) 
    683                CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 2, len = iom_file(kiomid)%dimsz(2,1) ), clinfo ) 
    684                iom_file(kiomid)%dimsz(1:2, 2) = iom_file(kiomid)%dimsz(1:2, 1) 
    685                CALL iom_nf90_check( NF90_INQUIRE_DIMENSION( if90id, 3, len = iom_file(kiomid)%dimsz(1,3) ), clinfo ) 
    686                iom_file(kiomid)%dimsz(1  , 4) = 1   ! unlimited dimension 
     686            IF( iom_file(kiomid)%dimsz(1, 4) == 0 ) THEN   ! time_counter = 0 
     687               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 1,                            glamt(ix1:ix2, iy1:iy2) ), clinfo ) 
     688               CALL iom_nf90_check(    NF90_PUT_VAR( if90id, 2,                            gphit(ix1:ix2, iy1:iy2) ), clinfo ) 
     689               SELECT CASE (iom_file(kiomid)%comp) 
     690               CASE ('OCE')   
     691                  CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3,                                           gdept_1d ), clinfo ) 
     692               CASE ('ABL') 
     693                  CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3,                                            ght_abl ), clinfo ) 
     694               CASE DEFAULT 
     695                  CALL iom_nf90_check( NF90_PUT_VAR( if90id, 3, (/ (idlv, idlv = 1,iom_file(kiomid)%dimsz(1,3)) /) ), clinfo ) 
     696               END SELECT 
     697               ! "wrong" value: to be improved but not really useful... 
     698               CALL iom_nf90_check(   NF90_PUT_VAR( if90id, 4,                                                  kt ), clinfo )    
     699               ! update the size of the variable corresponding to the unlimited dimension 
     700               iom_file(kiomid)%dimsz(1, 4) = 1   ! so we don't enter this IF case any more... 
    687701               IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done' 
    688702            ENDIF 
     
    706720      ENDIF 
    707721      !      
    708    END SUBROUTINE iom_nf90_rp0123d 
     722   END SUBROUTINE iom_nf90_rp0123d_dp 
    709723 
    710724 
Note: See TracChangeset for help on using the changeset viewer.