Index: trunk/NEMO/OPA_SRC/iom.F90
===================================================================
--- trunk/NEMO/OPA_SRC/iom.F90	(revision 485)
+++ trunk/NEMO/OPA_SRC/iom.F90	(revision 508)
@@ -2,68 +2,62 @@
    !!=====================================================================
    !!                    ***  MODULE  iom ***
-   !!
    !! Input/Output manager :  Library to read input files
-   !!
-   !! Ongoing work : This code is here to help discussions about I/O
-   !!                library in the NEMO system
    !!====================================================================
+   !! History :  9.0  ! 05 12  (J. Belier) Original code
+   !!            9.0  ! 06 02  (S. Masson) Adaptation to NEMO
+   !!--------------------------------------------------------------------
+   !!gm  caution add !DIR nec: improved performance to be checked as well as no result changes
+
    !!--------------------------------------------------------------------
    !!   iom_open       : open a file read only
    !!   iom_close      : close a file or all files opened by iom
-   !!   iom_get        : read a field : interface to several routines
+   !!   iom_get        : read a field (interfaced to several routines)
+   !!   iom_gettime    : read the time axis cdvar in the file               !!gm : never call ??????
    !!   iom_varid      : get the id of a variable in a file
-   !!   iom_get_gblatt : ???
+   !!   iom_rstput     : write a field in a restart file (interfaced to several routines)
    !!--------------------------------------------------------------------
-   !! History :  9.0  ! 05 12  (J. Belier) Original code
-   !!            9.0  ! 06 02  (S. Masson) Adaptation to NEMO
-   !!--------------------------------------------------------------------
-   !! * Modules used
    USE in_out_manager  ! I/O manager
    USE dom_oce         ! ocean space and time domain
-   USE lbclnk          ! ???
-   USE ioipsl          ! ???
+   USE lbclnk          ! lateal boundary condition / mpp exchanges
+   USE ioipsl          ! IOIPSL library
 
    IMPLICIT NONE
    PRIVATE
 
-   PUBLIC iom_open, iom_close, iom_get, iom_varid, iom_get_gblatt
-
-   !! * Interfaces
+   PUBLIC iom_open, iom_close, iom_get, iom_varid, iom_rstput, iom_gettime
+
    INTERFACE iom_get
-      MODULE PROCEDURE iom_get_r_1d, iom_get_r_2d, iom_get_r_3d
+      MODULE PROCEDURE iom_get_r_0d, iom_get_r_1d, iom_get_r_2d, iom_get_r_3d
    END INTERFACE
-
-   !! * Share module variables
-   INTEGER, PARAMETER, PUBLIC ::        &  !:
-      jpdom_data                  = 1,  &  !: ( 1  :jpidta, 1  :jpjdta)
-      jpdom_global                = 2,  &  !: ( 1  :jpiglo, 1  :jpjglo)
-      jpdom_local                 = 3,  &  !: One of the 3 following cases
-      jpdom_local_full            = 4,  &  !: ( 1  :jpi   , 1  :jpi   )
-      jpdom_local_noextra         = 5,  &  !: ( 1  :nlci  , 1  :nlcj  )
-      jpdom_local_noovlap         = 6,  &  !: (nldi:nlei  ,nldj:nlej  )
-      jpdom_unknown               = 7      !: No dimension checking
-
-   !! * Module variables
-   INTEGER, PARAMETER ::    &
-      jpmax_vars    = 50,   &  ! maximum number of variables in one file
-      jpmax_dims    =  5,   &  ! maximum number of dimensions for one variable
-      jpmax_digits  =  5       ! maximum number of digits in the file name to reference the cpu number
- 
+   INTERFACE iom_rstput
+      MODULE PROCEDURE iom_rstput_0d, iom_rstput_1d, iom_rstput_2d, iom_rstput_3d
+   END INTERFACE
+
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_data          = 1   !: ( 1  :jpidta, 1  :jpjdta)
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_global        = 2   !: ( 1  :jpiglo, 1  :jpjglo)
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_local         = 3   !: One of the 3 following cases
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_local_full    = 4   !: ( 1  :jpi   , 1  :jpi   )
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_local_noextra = 5   !: ( 1  :nlci  , 1  :nlcj  )
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_local_noovlap = 6   !: (nldi:nlei  ,nldj:nlej  )
+   INTEGER, PARAMETER, PUBLIC ::   jpdom_unknown       = 7   !: No dimension checking
+
+   INTEGER, PARAMETER ::   jpmax_vars   = 60,   &  ! maximum number of variables in one file
+      &                    jpmax_dims   =  4,   &  ! maximum number of dimensions for one variable
+      &                    jpmax_digits =  5       ! maximum number of digits for the cpu number in the file name
 !$AGRIF_DO_NOT_TREAT
-   INTEGER :: iom_init = 0
-
-   TYPE :: flio_file
+   INTEGER ::   iom_init = 0
+   TYPE    ::   flio_file
       CHARACTER(LEN=240)                        ::   name     ! name of the file
-      INTEGER                                   ::   iopen    ! 1/0 is the file is open/not open
+      INTEGER                                   ::   iopen    ! 1(0) if the file is open(not open)
       INTEGER                                   ::   nvars    ! number of identified varibles in the file
       INTEGER                                   ::   iduld    ! id of the unlimited dimension
       CHARACTER(LEN=16), DIMENSION(jpmax_vars)  ::   cn_var   ! names of the variables
       INTEGER, DIMENSION(jpmax_vars)            ::   ndims    ! number of dimensions of the variables
-      LOGICAL, DIMENSION(jpmax_vars)            ::   luld     ! variable including unlimited dimension
-      INTEGER, DIMENSION(jpmax_dims,jpmax_vars) ::   dimsz    ! size of the dimensions of the variables
+      LOGICAL, DIMENSION(jpmax_vars)            ::   luld     ! variable using the unlimited dimension
+      INTEGER, DIMENSION(jpmax_dims,jpmax_vars) ::   dimsz    ! size of variables dimensions 
       REAL(kind=wp), DIMENSION(jpmax_vars)      ::   scf      ! scale_factor of the variables
       REAL(kind=wp), DIMENSION(jpmax_vars)      ::   ofs      ! add_offset of the variables
    END TYPE flio_file
-   TYPE(flio_file), DIMENSION(flio_max_files)   :: iom_file ! array containing the info for all opened files
+   TYPE(flio_file), DIMENSION(flio_max_files)   ::   iom_file ! array containing the info for all opened files
 !$AGRIF_END_DO_NOT_TREAT
 
@@ -76,72 +70,143 @@
 CONTAINS
 
-   SUBROUTINE iom_open( cdname, knumfl, ldimg )
+   SUBROUTINE iom_open( cdname, knumfl, ldwrt, kdom, ldimg )
       !!---------------------------------------------------------------------
       !!                   ***  SUBROUTINE  iom_open  ***
       !!
       !! ** Purpose :  open an input file read only (return 0 if not found)
-      !!
-      !! ** Method :
-      !!
       !!---------------------------------------------------------------------
-      CHARACTER(len=*), INTENT(in )  ::   cdname   ! File name
-      INTEGER, INTENT(out)           ::   knumfl   ! Identifier of the opened file
-      LOGICAL, INTENT(in ), OPTIONAL ::   ldimg    ! flg to specify that we use dimg format
-
-      CHARACTER(LEN=100) :: clname   ! the name of the file based on cdname [[+clcpu]+clcpu]
-      CHARACTER(LEN=10) :: clsuffix  ! ".nc" or ".dimg"
-      CHARACTER(LEN=10) :: clcpu     ! the cpu number (max jpmax_digits digits)
-      LOGICAL :: llok                ! check the existence 
-      INTEGER :: icnt                ! counter for digits in clcpu (max = jpmax_digits)
+      CHARACTER(len=*), INTENT(in   )           ::   cdname   ! File name
+      INTEGER         , INTENT(  out)           ::   knumfl   ! Identifier of the opened file
+      LOGICAL         , INTENT(in   ), OPTIONAL ::   ldwrt    ! read or write the file?
+      INTEGER         , INTENT(in   ), OPTIONAL ::   kdom     ! Type of domain to be written
+      LOGICAL         , INTENT(in   ), OPTIONAL ::   ldimg    ! use dimg format?
+
+      CHARACTER(LEN=100)    ::   clname    ! the name of the file based on cdname [[+clcpu]+clcpu]
+      CHARACTER(LEN=100)    ::   cltmpn    ! tempory name to store clname (in writting mode)
+      CHARACTER(LEN=10)     ::   clsuffix  ! ".nc" or ".dimg"
+      CHARACTER(LEN=10)     ::   clcpu     ! the cpu number (max jpmax_digits digits)
+      LOGICAL               ::   llok      ! check the existence 
+      LOGICAL               ::   llwrt     ! 
+      INTEGER               ::   icnt      ! counter for digits in clcpu (max = jpmax_digits)
+      INTEGER               ::   iln, ils  ! lengths of character
+      INTEGER               ::   idom      ! type of domain
+      INTEGER               ::   ifliodom  ! model domain identifier (see flio_dom_set)
+      INTEGER, DIMENSION(2) ::   iszl      ! local number of points for x,y dimensions
+      INTEGER, DIMENSION(2) ::   ifst      ! position of first local point for x,y dimensions
+      INTEGER, DIMENSION(2) ::   ilst      ! position of last local point for x,y dimensions
+      INTEGER, DIMENSION(2) ::   ihst      ! start halo size for x,y dimensions
+      INTEGER, DIMENSION(2) ::   ihnd      ! end halo size for x,y dimensions
       !---------------------------------------------------------------------
-
-      ! find the file
+      ! if iom_open is called for the first time: initialize iom_file(:)%iopen to 0
+      ! (could be done when defining iom_file in f95 but not in f90)
+      IF( iom_init == 0 ) THEN
+         iom_file(:)%iopen = 0
+         iom_init = 1
+      ENDIF
+      ! do we read or write the file?
+      ! =============
+      IF( PRESENT(ldwrt) ) THEN   ;   llwrt = ldwrt
+      ELSE                        ;   llwrt = .FALSE.
+      ENDIF
+      ! create the file name by added, if needed, TRIM(Agrif_CFixed()) and TRIM(clsuffix)
       ! =============
       clname   = trim(cdname)
 #if defined key_agrif
       if ( .NOT. Agrif_Root() ) clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname)
-#endif                
+#endif    
+      ! which suffix should we use?
       clsuffix = ".nc"
-      IF( PRESENT(ldimg) ) THEN
-         IF ( ldimg ) clsuffix = ".dimg"
-      ENDIF
-      !
+      IF( PRESENT(ldimg) ) THEN   ;   IF( ldimg )   clsuffix = ".dimg"   ;   ENDIF
+      ! Add the suffix if needed
+      iln = LEN_TRIM(clname)
+      ils = LEN_TRIM(clsuffix)
+      IF( iln <= ils) clname = clname(1:iln)//TRIM(clsuffix)
+      IF( clname(iln-ils+1:iln) /= TRIM(clsuffix) )   clname = clname(1:iln)//TRIM(clsuffix)
+      cltmpn = clname   ! store this name
+      ! try to find if the file to be opened already exist
       INQUIRE( FILE = clname, EXIST = llok )
-      IF( .NOT.llok ) THEN                         ! try to complete the name with the suffix only
-         clname = TRIM(cdname)//TRIM(clsuffix)
-#if defined key_agrif
-         if ( .NOT. Agrif_Root() ) clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname)
-#endif                
-         INQUIRE( FILE = clname, EXIST = llok )
-         IF( .NOT.llok ) THEN                      ! try to complete the name with both cpu number and suffix
-            WRITE(clcpu,*) narea-1
-            clcpu  = trim(adjustl(clcpu))
-            clname = trim(cdname)//"_"
-#if defined key_agrif
-            if ( .NOT. Agrif_Root() ) clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname)
-#endif                
-            icnt = 0
-            INQUIRE( FILE = trim(clname)//trim(clcpu)//trim(clsuffix), EXIST = llok ) 
-            DO WHILE( .NOT.llok .AND. icnt < jpmax_digits )   ! we try fifferent formats for the cpu number by adding 0
-               clname = trim(clname)//"0"
-               INQUIRE( FILE = trim(clname)//trim(clcpu)//trim(clsuffix), EXIST = llok )
-               icnt = icnt + 1
-            END DO
-            IF( .NOT.llok ) THEN                   ! no way to find the files...
-               CALL ctl_stop( 'iom_open: file '//trim(clname)//'... not found' )
+      IF( .NOT.llok ) THEN
+         ! we try to add the cpu number to the name
+         WRITE(clcpu,*) narea-1
+         clcpu  = TRIM(ADJUSTL(clcpu))
+         iln = INDEX(clname,TRIM(clsuffix))
+         clname = clname(1:iln-1)//'_'//TRIM(clcpu)//TRIM(clsuffix)
+         icnt = 0
+         INQUIRE( FILE = clname, EXIST = llok ) 
+         ! we try different formats for the cpu number by adding 0
+         DO WHILE( .NOT.llok .AND. icnt < jpmax_digits )
+            clcpu  = "0"//trim(clcpu)
+            clname = clname(1:iln-1)//'_'//TRIM(clcpu)//TRIM(clsuffix)
+            INQUIRE( FILE = clname, EXIST = llok )
+            icnt = icnt + 1
+         END DO
+      ENDIF
+      !
+      IF( llok ) THEN      ! Open the file
+         !                 ! =============
+         IF( llwrt ) THEN 
+            IF(lwp) WRITE(numout,*) '          iom_open ~~~  open existing file: '//TRIM(clname)//' in WRITE mode'
+            CALL flioopfd( TRIM(clname), knumfl, "WRITE" )
+         ELSE
+            IF(lwp) WRITE(numout,*) '          iom_open ~~~  open existing file: '//TRIM(clname)//' in READ mode'
+            CALL flioopfd( TRIM(clname), knumfl )
+         ENDIF
+      ELSE                 ! no way to find the file...
+         !                 ! =======================
+         IF( llwrt ) THEN 
+            ! file opened in write mode
+            ! the file does not exist, we must create it...
+            ! =============
+            llok = .TRUE.
+            ! on which domain must the file be written??
+            ! check the domain definition
+            idom = jpdom_local_noovlap   ! default definition
+            IF( PRESENT(kdom) )   idom = kdom
+            ! create the domain informations
+            ! =============
+            SELECT CASE (idom)
+            CASE (jpdom_local_full)
+               iszl = (/ jpi             , jpj              /)
+               ifst = (/ nimpp           , njmpp            /)
+               ilst = (/ nimpp + jpi - 1 , njmpp + jpj - 1  /)
+               ihst = (/ nldi - 1        , nldj - 1         /)
+               ihnd = (/ jpi - nlei      , jpj - nlej       /)
+            CASE (jpdom_local_noextra)
+               iszl = (/ nlci            , nlcj             /)
+               ifst = (/ nimpp           , njmpp            /)
+               ilst = (/ nimpp + nlci - 1, njmpp + nlcj - 1 /)
+               ihst = (/ nldi - 1        , nldj - 1         /)
+               ihnd = (/ nlci - nlei     , nlcj - nlej      /)
+            CASE (jpdom_local_noovlap)
+               iszl = (/ nlei - nldi + 1 , nlej - nldj + 1  /)
+               ifst = (/ nimpp + nldi - 1, njmpp + nldj - 1 /)
+               ilst = (/ nimpp + nlei - 1, njmpp + nlej - 1 /)
+               ihst = (/ 0               , 0                /)
+               ihnd = (/ 0               , 0                /)
+            CASE DEFAULT
+               llok = .FALSE.
+               CALL ctl_stop( 'iom_open: wrong value of kdom, only jpdom_local* cases are accepted' )
+            END SELECT
+            IF( llok ) THEN
+               CALL flio_dom_set( jpnij, narea-1, (/1, 2/), (/jpiglo, jpjglo/)   &
+                    &                  , iszl, ifst, ilst, ihst, ihnd, 'BOX', ifliodom )        
+               ! create the file
+               ! =============
+               ! Note that fliocrfd may change the value of clname (add the cpu number...)
+               clname = cltmpn   ! get back the file name without the cpu number in it
+               IF(lwp) WRITE(numout,*) '          iom_open ~~~  create new file: '//trim(clname)//' in WRITE mode'
+               CALL fliocrfd( clname, (/'x'    , 'y'    , 'z', 't'/)   &
+                    &               , (/iszl(1), iszl(2), jpk, -1 /)   &
+                    &               , knumfl, ifliodom )
             ENDIF
-            clname = trim(clname)//trim(clcpu)//trim(clsuffix)
+         ELSE
+            ! the file is open for read-only, it must exist...
+            iln = INDEX( cltmpn,TRIM(clsuffix) )
+            CALL ctl_stop( 'iom_open: file '//cltmpn(1:iln-1)//'* not found' )
          ENDIF
       ENDIF
-
-      ! Open the file
+      ! start to fill the information of opened files
       ! =============
       IF( llok ) THEN                         
-         IF (lwp) WRITE(numout,*) 'iom_open ~~~  open file: '//trim(clname)
-         CALL flioopfd( trim(clname), knumfl )
-         IF( iom_init == 0 ) THEN
-            iom_file(:)%iopen = 0
-            iom_init = 1
-         ENDIF
          iom_file(knumfl)%iopen      = 1
          iom_file(knumfl)%name       = TRIM(clname)
@@ -152,8 +217,9 @@
          ! does the file contain time axis (that must be unlimitted) ?
          CALL flioinqf( knumfl, id_uld = iom_file(knumfl)%iduld )
+         IF(lwp) WRITE(numout,*) '                   ---> OK'
       ELSE
-         knumfl = 0
-      ENDIF
-  
+         knumfl = 0      ! return error flag
+      ENDIF
+      !
    END SUBROUTINE iom_open
 
@@ -164,16 +230,12 @@
       !!
       !! ** Purpose : close an input file, or all files opened by iom
-      !!
-      !! ** Method :
-      !!
       !!--------------------------------------------------------------------
-      INTEGER,INTENT(in), OPTIONAL ::   knumfl   ! Identifier of the file to be closed
-      !                                          ! If this argument is not present,
-      !                                          ! all the files opened by iom are closed.
-
-      INTEGER           ::   jf            ! dummy loop indices
-      INTEGER           ::   i_s, i_e      ! temporary integer
+      INTEGER, INTENT(in), OPTIONAL ::   knumfl   ! Identifier of the file to be closed
+      !                                           ! No argument : all the files opened by iom are closed
+
+      INTEGER ::   jf         ! dummy loop indices
+      INTEGER ::   i_s, i_e   ! temporary integer
       !---------------------------------------------------------------------
-
+      !
       IF( PRESENT(knumfl) ) THEN
          i_s = knumfl
@@ -183,8 +245,10 @@
          i_e = flio_max_files
       ENDIF
-      IF ( i_s > 0 ) THEN
+      
+      IF( i_s > 0 ) THEN
          DO jf = i_s, i_e
             IF( iom_file(jf)%iopen > 0 ) THEN
                CALL flioclo( jf )
+               IF(lwp) WRITE(numout,*) '          iom_close, close file: '//TRIM(iom_file(knumfl)%name)//' ok'
                iom_file(jf)%iopen      = 0
                iom_file(jf)%name       = 'NONE'
@@ -200,142 +264,118 @@
          END DO
       ENDIF
-          
+      !    
    END SUBROUTINE iom_close
  
 
    !!----------------------------------------------------------------------
-   !!                   INTERFACE iom_u_getv
+   !!                   INTERFACE iom_get_123d
    !!----------------------------------------------------------------------
-   SUBROUTINE iom_get_r_1d( knumfl, kdom , cdvar , pvar  ,   &
-      &                             ktime, kstart, kcount )
-      INTEGER               , INTENT(in )           ::   knumfl    ! Identifier of the file
-      INTEGER               , INTENT(in )           ::   kdom      ! Type of domain to be read
-      CHARACTER(len=*)      , INTENT(in )           ::   cdvar     ! Name of the variable
-      REAL(wp), DIMENSION(:), INTENT(out)           ::   pvar      ! read field
-      INTEGER               , INTENT(in ) ,OPTIONAL ::   ktime     ! record number
-      INTEGER , DIMENSION(:), INTENT(in ), OPTIONAL ::   kstart    ! start position of the reading in each axis 
-      INTEGER , DIMENSION(:), INTENT(in ), OPTIONAL ::   kcount    ! number of points to be read in each axis
-!
-      CHARACTER(LEN=100) :: clinfo                    ! info character
-!
-      clinfo = 'iom_get_r_1d, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
-      IF( PRESENT(kstart) ) THEN
-         IF ( SIZE(kstart) /= 1 ) CALL ctl_stop( trim(clinfo), 'kstart must be a 1 element vector' )
-      ENDIF
-      IF( PRESENT(kcount) ) THEN
-         IF ( SIZE(kcount) /= 1 ) CALL ctl_stop( trim(clinfo), 'kcount must be a 1 element vector' )
-      ENDIF
-      IF ( knumfl > 0 ) CALL iom_u_getv( knumfl, kdom       , cdvar        , pv_r1d=pvar,   &
-           &                                     ktime=ktime, kstart=kstart, kcount=kcount )
+   SUBROUTINE iom_get_r_0d( knumfl, cdvar, pvar )
+      INTEGER         , INTENT(in   )                 ::   knumfl    ! Identifier of the file
+      CHARACTER(len=*), INTENT(in   )                 ::   cdvar     ! Name of the variable
+      REAL(wp)        , INTENT(  out)                 ::   pvar      ! read field
+      !
+      IF( knumfl > 0 .AND. iom_varid( knumfl, cdvar ) > 0 )   CALL fliogetv( knumfl, cdvar, pvar )
+   END SUBROUTINE iom_get_r_0d
+
+   SUBROUTINE iom_get_r_1d( knumfl, kdom, cdvar, pvar, ktime, kstart, kcount )
+      INTEGER         , INTENT(in   )                         ::   knumfl    ! Identifier of the file
+      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read
+      CHARACTER(len=*), INTENT(in   )                         ::   cdvar     ! Name of the variable
+      REAL(wp)        , INTENT(  out), DIMENSION(:)           ::   pvar      ! read field
+      INTEGER         , INTENT(in   )              , OPTIONAL ::   ktime     ! record number
+      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kstart    ! start axis position of the reading 
+      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis
+      !
+      IF( knumfl > 0 ) CALL iom_get_123d( knumfl, kdom       , cdvar        , pv_r1d=pvar,   &
+         &                                        ktime=ktime, kstart=kstart, kcount=kcount )
    END SUBROUTINE iom_get_r_1d
-   SUBROUTINE iom_get_r_2d( knumfl, kdom , cdvar , pvar  ,   &
-      &                             ktime, kstart, kcount )
-      INTEGER,INTENT(in) :: knumfl
-      INTEGER,INTENT(in) :: kdom
-      CHARACTER(len=*),INTENT(in) :: cdvar
-      REAL(wp),INTENT(out),DIMENSION(:,:) :: pvar
-      INTEGER,INTENT(in),OPTIONAL :: ktime
-      INTEGER,DIMENSION(:),INTENT(in),OPTIONAL :: kstart
-      INTEGER,DIMENSION(:),INTENT(in),OPTIONAL :: kcount
-!
-      CHARACTER(LEN=100) :: clinfo                    ! info character
-!
-      clinfo = 'iom_get_r_2d, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
-      IF( PRESENT(kstart) ) THEN
-         IF ( size(kstart) /= 2 ) CALL ctl_stop(trim(clinfo), 'kstart must be a 2 element vector')
-      ENDIF
-      IF( PRESENT(kcount) ) THEN
-         IF ( size(kcount) /= 2 ) CALL ctl_stop(trim(clinfo), 'kcount must be a 2 element vector')
-      ENDIF
-      IF ( knumfl > 0 ) CALL iom_u_getv( knumfl, kdom       , cdvar        , pv_r2d=pvar,   &
-         &                                       ktime=ktime, kstart=kstart, kcount=kcount )
+
+   SUBROUTINE iom_get_r_2d( knumfl, kdom, cdvar, pvar, ktime, kstart, kcount )
+      INTEGER         , INTENT(in   )                           ::   knumfl    ! Identifier of the file
+      INTEGER         , INTENT(in   )                           ::   kdom      ! Type of domain to be read
+      CHARACTER(len=*), INTENT(in   )                           ::   cdvar     ! Name of the variable
+      REAL(wp)        , INTENT(  out), DIMENSION(:,:)           ::   pvar      ! read field
+      INTEGER         , INTENT(in   )                , OPTIONAL ::   ktime     ! record number
+      INTEGER         , INTENT(in   ), DIMENSION(2)  , OPTIONAL ::   kstart    ! start axis position of the reading 
+      INTEGER         , INTENT(in   ), DIMENSION(2)  , OPTIONAL ::   kcount    ! number of points in each axis
+      !
+      IF( knumfl > 0 ) CALL iom_get_123d( knumfl, kdom       , cdvar        , pv_r2d=pvar,   &
+         &                                        ktime=ktime, kstart=kstart, kcount=kcount )
    END SUBROUTINE iom_get_r_2d
-   SUBROUTINE iom_get_r_3d( knumfl, kdom , cdvar , pvar  ,   &
-      &                             ktime, kstart, kcount )
-      INTEGER,INTENT(in) :: knumfl
-      INTEGER,INTENT(in) :: kdom
-      CHARACTER(len=*),INTENT(in) :: cdvar
-      REAL(wp),INTENT(out),DIMENSION(:,:,:) :: pvar
-      INTEGER,INTENT(in),OPTIONAL :: ktime
-      INTEGER,DIMENSION(:),INTENT(in),OPTIONAL :: kstart
-      INTEGER,DIMENSION(:),INTENT(in),OPTIONAL :: kcount
-!
-      CHARACTER(LEN=100) :: clinfo                    ! info character
-!
-      clinfo = 'iom_get_r_3d, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
-      IF ( PRESENT(kstart) ) THEN
-         IF ( size(kstart) /= 3 ) CALL ctl_stop(trim(clinfo), 'kstart must be a 3 element vector')
-      ENDIF
-      IF ( PRESENT(kcount) ) THEN
-         IF ( size(kcount) /= 3 ) CALL ctl_stop(trim(clinfo), 'kcount must be a 3 element vector')
-      ENDIF
-      IF ( knumfl > 0 ) CALL iom_u_getv( knumfl, kdom       , cdvar        , pv_r3d=pvar,   &
-	     &                                   ktime=ktime, kstart=kstart, kcount=kcount )
+
+   SUBROUTINE iom_get_r_3d( knumfl, kdom, cdvar, pvar, ktime, kstart, kcount )
+      INTEGER         , INTENT(in   )                             ::   knumfl    ! Identifier of the file
+      INTEGER         , INTENT(in   )                             ::   kdom      ! Type of domain to be read
+      CHARACTER(len=*), INTENT(in   )                             ::   cdvar     ! Name of the variable
+      REAL(wp)        , INTENT(  out), DIMENSION(:,:,:)           ::   pvar      ! read field
+      INTEGER         , INTENT(in   )                  , OPTIONAL ::   ktime     ! record number
+      INTEGER         , INTENT(in   ), DIMENSION(3)    , OPTIONAL ::   kstart    ! start axis position of the reading 
+      INTEGER         , INTENT(in   ), DIMENSION(3)    , OPTIONAL ::   kcount    ! number of points in each axis
+      !
+      IF( knumfl > 0 ) CALL iom_get_123d( knumfl, kdom       , cdvar        , pv_r3d=pvar,   &
+         &                                        ktime=ktime, kstart=kstart, kcount=kcount )
    END SUBROUTINE iom_get_r_3d
    !!----------------------------------------------------------------------
 
-
-   SUBROUTINE iom_u_getv( knumfl, kdom  , cdvar , &
-        &                   pv_r1d, pv_r2d, pv_r3d, &
-        &                   ktime , kstart, kcount )
+   SUBROUTINE iom_get_123d( knumfl, kdom  , cdvar ,   &
+        &                   pv_r1d, pv_r2d, pv_r3d,   &
+        &                   ktime , kstart, kcount  )
      !!-----------------------------------------------------------------------
-     !!                  ***  ROUTINE  iom_u_getv  ***
+     !!                  ***  ROUTINE  iom_get_123d  ***
      !!
      !! ** Purpose : read a 1D/2D/3D variable
      !!
-     !! ** Method : read ONE time step at each CALL
-     !!
+     !! ** Method : read ONE record at each CALL
      !!-----------------------------------------------------------------------
-     INTEGER,                      INTENT(in )           ::   knumfl     ! Identifier of the file
-     INTEGER,                      INTENT(in )           ::   kdom       ! Type of domain to be read
-     CHARACTER(len=*),             INTENT(in )           ::   cdvar      ! Name of the variable
-     REAL(wp), DIMENSION(:)      , INTENT(out), OPTIONAL ::   pv_r1d     ! read field (1D case)
-     REAL(wp), DIMENSION(:,:)    , INTENT(out), OPTIONAL ::   pv_r2d     ! read field (2D case)
-     REAL(wp), DIMENSION(:,:,:)  , INTENT(out), OPTIONAL ::   pv_r3d     ! read field (3D case)
-     INTEGER                     , INTENT(in ), OPTIONAL ::   ktime      ! record number
-     INTEGER , DIMENSION(:)      , INTENT(in ), OPTIONAL ::   kstart     ! start position of the reading in each axis 
-     INTEGER , DIMENSION(:)      , INTENT(in ), OPTIONAL ::   kcount     ! number of points to be read in each axis
-
-     INTEGER                        :: jl            ! loop on number of dimension 
-     INTEGER                        :: idom,    &    ! type of domain
-          &                            idvar,   &    ! id of the variable
-          &                            inbdim,  &    ! number of dimensions of the variable
-          &                            idmspc,  &    ! number of spatial dimensions 
-          &                            itime,   &    ! record number
-          &                            istop         ! temporary value of nstop
-     INTEGER, DIMENSION(jpmax_dims) :: istart,  &    ! starting point to read for each axis
-          &                            icnt,    &    ! number of value to read along each axis 
-          &                            idimsz        ! size of the dimensions of the variable
-     REAL(wp)                       :: zscf, zofs    ! sacle_factor and add_offset
-     INTEGER                        ::  itmp         ! temporary integer
-     CHARACTER(LEN=100)             :: clinfo        ! info character
+     INTEGER                    , INTENT(in   )           ::   knumfl     ! Identifier of the file
+     INTEGER                    , INTENT(in   )           ::   kdom       ! Type of domain to be read
+     CHARACTER(len=*)           , INTENT(in   )           ::   cdvar      ! Name of the variable
+     REAL(wp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pv_r1d     ! read field (1D case)
+     REAL(wp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pv_r2d     ! read field (2D case)
+     REAL(wp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pv_r3d     ! read field (3D case)
+     INTEGER                    , INTENT(in   ), OPTIONAL ::   ktime      ! record number
+     INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kstart     ! start position of the reading in each axis 
+     INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kcount     ! number of points to be read in each axis
+     !
+     INTEGER                        ::   jl          ! loop on number of dimension 
+     INTEGER                        ::   idom,    &  ! type of domain
+          &                              idvar,   &  ! id of the variable
+          &                              inbdim,  &  ! number of dimensions of the variable
+          &                              idmspc,  &  ! number of spatial dimensions 
+          &                              itime,   &  ! record number
+          &                              istop       ! temporary value of nstop
+     INTEGER, DIMENSION(jpmax_dims) ::   istart,  &  ! starting point to read for each axis
+          &                              icnt,    &  ! number of value to read along each axis 
+          &                              idimsz      ! size of the dimensions of the variable
+     REAL(wp)                       ::   zscf, zofs  ! sacle_factor and add_offset
+     INTEGER                        ::   itmp        ! temporary integer
+     CHARACTER(LEN=100)             ::   clinfo      ! info character
      !---------------------------------------------------------------------
-     clinfo = 'iom_u_getv, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
+     !
+     clinfo = '          iom_get_123d, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
      ! local definition of the domain ?
      idom = kdom
      ! check kcount and kstart optionals parameters...
-     IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) ) &
+     IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) )   &
           CALL ctl_stop( trim(clinfo), 'kcount present needs kstart present' )
-     IF( PRESENT(kstart) .AND. (.NOT. PRESENT(kcount)) ) &
+     IF( PRESENT(kstart) .AND. (.NOT. PRESENT(kcount)) )   &
           CALL ctl_stop( trim(clinfo), 'kstart present needs kcount present' )
-     IF( PRESENT(kstart) .AND. idom /= jpdom_unknown ) &
+     IF( PRESENT(kstart) .AND. idom /= jpdom_unknown   )   &
           CALL ctl_stop( trim(clinfo), 'kstart present needs kdom = jpdom_unknown' )
 
      ! Search for the variable in the data base (eventually actualize data)
-     !-
      istop = nstop
      idvar = iom_varid( knumfl, cdvar )
      !
-     IF ( idvar > 0 ) THEN
+     IF( idvar > 0 ) THEN
         ! to write iom_file(knumfl)%dimsz in a shorter way !
         idimsz(:) = iom_file(knumfl)%dimsz(:, idvar) 
-        inbdim = iom_file(knumfl)%ndims(idvar)! number of dimensions in the file
-        idmspc = inbdim ! number of spatial dimensions in the file
-        IF( iom_file(knumfl)%luld(idvar) ) idmspc = inbdim - 1
-        IF( idmspc > 3 ) CALL ctl_stop(trim(clinfo), 'the file has more than 3 spatial dimensions',   &
-             &                    'this case is not coded...') 
-        ! Identify the domain in case of jpdom_local definition
-        !-
-        IF( idom == jpdom_local ) THEN
+        inbdim = iom_file(knumfl)%ndims(idvar)            ! number of dimensions in the file
+        idmspc = inbdim                                   ! number of spatial dimensions in the file
+        IF( iom_file(knumfl)%luld(idvar) )   idmspc = inbdim - 1
+        IF( idmspc > 3 )   CALL ctl_stop(trim(clinfo),   &
+           &                    'the file has more than 3 spatial dimensions this case is not coded...' ) 
+        IF( idom == jpdom_local ) THEN        ! Identify the domain in case of jpdom_local definition
            IF( idimsz(1) == jpi .AND. idimsz(2) == jpj ) THEN 
               idom = jpdom_local_full
@@ -348,10 +388,10 @@
            ENDIF
         ENDIF
-
+        !
         ! definition of istart and icnt
-        !-
+        !
         ! initializations
         istart(:) = 1
-        icnt(:) = 1
+        icnt  (:) = 1
         itime = 1
         IF( PRESENT(ktime) ) itime = ktime
@@ -383,5 +423,5 @@
            CASE (2)
               ! data is 2d array (+ maybe a temporal dimension)
-              IF ( PRESENT(kstart) ) THEN
+              IF( PRESENT(kstart) ) THEN
                  istart(1:3) = (/ kstart(1:2), itime /)
                  icnt(1:2) = kcount(1:2)
@@ -404,9 +444,9 @@
               ENDIF
            CASE DEFAULT
-              IF ( itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN
-                 CALL ctl_warn( trim(clinfo), '2D array but 3 spatial dimensions for the data...', &
-                      &         'As the size of the z dimension is 1 and as we try to read the first reacord, ',     &
-                      &         'we accept this case even if there is a possible mix-up between z and time dimension...')           
-                 IF ( PRESENT(kstart) ) THEN
+              IF( itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN
+                 CALL ctl_warn( trim(clinfo), '2D array but 3 spatial dimensions for the data...',                &
+                      &         'As the size of the z dimension is 1 and as we try to read the first record, ',   &
+                      &         'we accept this case even if there is a possible mix-up between z and time dimension' )           
+                 IF( PRESENT(kstart) ) THEN
                     istart(1:2) = kstart(1:2)
                     icnt(1:2) = kcount(1:2)
@@ -428,18 +468,18 @@
                  ENDIF
               ELSE
-                 CALL ctl_stop( trim(clinfo), 'to keep iom lisibility, when reading a 2D array,', &
-                      &         'we do not accept data with more than 2 spatial dimension',     &
-                      &         'Use ncwa -a to suppress the unnecessary dimensions')           
+                 CALL ctl_stop( trim(clinfo), 'to keep iom lisibility, when reading a 2D array,',           &
+                      &                       'we do not accept data with more than 2 spatial dimension',   &
+                      &                       'Use ncwa -a to suppress the unnecessary dimensions' )
               ENDIF
            END SELECT
         ELSEIF( PRESENT(pv_r3d) ) THEN
            SELECT CASE (idmspc)
-           CASE (1)
-              CALL ctl_stop(trim(clinfo), 'the file has only 1 spatial dimension',   &
-                   &        'it is impossible to read a 3d array from this file...')
-           CASE (2)
-              CALL ctl_stop(trim(clinfo), 'the file has only 2 spatial dimension',   &
-                   &        'it is impossible to read a 3d array from this file...')
-           CASE (3)
+           CASE( 1 )
+              CALL ctl_stop( trim(clinfo), 'the file has only 1 spatial dimension',            &
+                   &                       'it is impossible to read a 3d array from this file...' )
+           CASE( 2 )
+              CALL ctl_stop( trim(clinfo), 'the file has only 2 spatial dimension',            &
+                   &                       'it is impossible to read a 3d array from this file...' )
+           CASE( 3 )
               ! data is 3d array (+ maybe a temporal dimension)
               IF( PRESENT(kstart) ) THEN
@@ -469,7 +509,7 @@
               ENDIF
            CASE DEFAULT
-              CALL ctl_stop( trim(clinfo), 'to keep iom lisibility, when reading a 3D array,', &
-                   &         'we do not accept data with more than 3 spatial dimension',     &
-                   &         'Use ncwa -a to suppress the unnecessary dimensions')           
+              CALL ctl_stop( trim(clinfo), 'to keep iom lisibility, when reading a 3D array,',   &
+                   &         'we do not accept data with more than 3 spatial dimension',         &
+                   &         'Use ncwa -a to suppress the unnecessary dimensions' )           
            END SELECT
         ENDIF
@@ -491,5 +531,5 @@
            itmp = size(pv_r1d)
            WRITE(ctmp1,*) 'size(pv_r1d): ', itmp, ' /= icnt(1): ', icnt(1)
-           IF( itmp /= icnt(1) ) CALL ctl_stop( trim(clinfo), ctmp1 )
+           IF( itmp /= icnt(1) )   CALL ctl_stop( trim(clinfo), ctmp1 )
         ELSEIF( PRESENT(pv_r2d) ) THEN
            DO jl = 1, 2
@@ -501,5 +541,5 @@
                  WRITE(ctmp1,*) 'size(pv_r2d(nldi:nlei,nldj:nlej), ',jl,'): ',itmp,' /= icnt(',jl,'): ',icnt(jl)
               ENDIF
-              IF( itmp /= icnt(jl) ) CALL ctl_stop( trim(clinfo), ctmp1 )
+              IF( itmp /= icnt(jl) )   CALL ctl_stop( trim(clinfo), ctmp1 )
            END DO
         ELSEIF( PRESENT(pv_r3d) ) THEN
@@ -512,5 +552,5 @@
                  WRITE(ctmp1,*) 'size(pv_r3d(nldi:nlei,nldj:nlej), ',jl,'): ',itmp,' /= icnt(',jl,'): ',icnt(jl)
               ENDIF
-              IF( itmp /= icnt(jl) ) CALL ctl_stop( trim(clinfo), ctmp1 )
+              IF( itmp /= icnt(jl) )   CALL ctl_stop( trim(clinfo), ctmp1 )
            END DO
         ENDIF
@@ -520,6 +560,4 @@
      !-     
      IF( istop == nstop) THEN ! no additional errors until this point...
-        !
-        istop = nstop
         !
         zscf = iom_file(knumfl)%scf(idvar)      ! scale factor
@@ -529,12 +567,14 @@
            CALL fliogetv( knumfl, cdvar, pv_r1d(:), start=istart(1:inbdim), count=icnt(1:inbdim) )
            !--- Apply scale_factor and offset
-           IF( zscf /= 1. ) pv_r1d(:) = pv_r1d(:) * zscf 
-           IF( zofs /= 0. ) pv_r1d(:) = pv_r1d(:) + zofs
+           IF( zscf /= 1. )   pv_r1d(:) = pv_r1d(:) * zscf 
+           IF( zofs /= 0. )   pv_r1d(:) = pv_r1d(:) + zofs
         ELSEIF( PRESENT(pv_r2d) ) THEN
            IF( idom /= jpdom_unknown ) THEN
               CALL fliogetv( knumfl, cdvar, pv_r2d(nldi:nlei,nldj:nlej), start=istart(1:inbdim), count=icnt(1:inbdim) )
               !--- Apply scale_factor and offset
-              IF (zscf /= 1.) pv_r2d(nldi:nlei, nldj:nlej) = pv_r2d(nldi:nlei,nldj:nlej) * zscf
-              IF (zofs /= 0.) pv_r2d(nldi:nlei, nldj:nlej) = pv_r2d(nldi:nlei,nldj:nlej) + zofs
+!CDIR NOUNROLL
+              IF( zscf /= 1.)   pv_r2d(nldi:nlei, nldj:nlej) = pv_r2d(nldi:nlei,nldj:nlej) * zscf
+!CDIR NOUNROLL
+              IF( zofs /= 0.)   pv_r2d(nldi:nlei, nldj:nlej) = pv_r2d(nldi:nlei,nldj:nlej) + zofs
               !--- Fill the overlap areas and extra hallows (mpp)
               CALL lbc_lnk (pv_r2d,'Z',-999.,'no0')
@@ -542,13 +582,18 @@
               CALL fliogetv( knumfl, cdvar, pv_r2d(:,:), start=istart(1:inbdim), count=icnt(1:inbdim) )
               !--- Apply scale_factor and offset
-              IF (zscf /= 1.) pv_r2d(:,:) = pv_r2d(:,:) * zscf
-              IF (zofs /= 0.) pv_r2d(:,:) = pv_r2d(:,:) + zofs
+!CDIR COLLAPSE
+              IF( zscf /= 1.)   pv_r2d(:,:) = pv_r2d(:,:) * zscf
+!CDIR COLLAPSE
+              IF( zofs /= 0.)   pv_r2d(:,:) = pv_r2d(:,:) + zofs
            ENDIF
         ELSEIF( PRESENT(pv_r3d) ) THEN
            IF( idom /= jpdom_unknown ) THEN
-              CALL fliogetv( knumfl, cdvar, pv_r3d(nldi:nlei,nldj:nlej,:), start=istart(1:inbdim), count=icnt(1:inbdim) )
+              CALL fliogetv( knumfl, cdvar, pv_r3d(nldi:nlei,nldj:nlej,:), start=istart(1:inbdim),   &
+                 &                                                         count=icnt  (1:inbdim) )
               !--- Apply scale_factor and offset
-              IF( zscf /= 1. ) pv_r3d(nldi:nlei,nldj:nlej,:) = pv_r3d(nldi:nlei,nldj:nlej,:) * zscf
-              IF( zofs /= 0. ) pv_r3d(nldi:nlei,nldj:nlej,:) = pv_r3d(nldi:nlei,nldj:nlej,:) + zofs
+!CDIR NOUNROLL
+              IF( zscf /= 1. )   pv_r3d(nldi:nlei,nldj:nlej,:) = pv_r3d(nldi:nlei,nldj:nlej,:) * zscf
+!CDIR NOUNROLL
+              IF( zofs /= 0. )   pv_r3d(nldi:nlei,nldj:nlej,:) = pv_r3d(nldi:nlei,nldj:nlej,:) + zofs
               !--- Fill the overlap areas and extra hallows (mpp)
               IF( icnt(3) == jpk )   CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) ! this if could be removed with the new lbc_lnk ...
@@ -556,186 +601,317 @@
               CALL fliogetv( knumfl, cdvar, pv_r3d(:,:,:), start=istart(1:inbdim), count=icnt(1:inbdim) )
               !--- Apply scale_factor and offset
-              IF (zscf /= 1.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf
-              IF (zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs
+!CDIR COLLAPSE
+              IF( zscf /= 1.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf
+!CDIR COLLAPSE
+              IF( zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs
            ENDIF
         ENDIF
         !
-        IF( istop == nstop .AND. lwp )  &
-             &  WRITE(numout,*) ' read '//trim(cdvar)//' in '//trim(iom_file(knumfl)%name)//' ok'
+        IF( istop == nstop .AND. lwp )   &
+           WRITE(numout,*) '           read '//trim(cdvar)//' in '//trim(iom_file(knumfl)%name)//' ok'
      ENDIF
      !
-   END SUBROUTINE iom_u_getv
+   END SUBROUTINE iom_get_123d
 
    
    SUBROUTINE iom_gettime( knumfl, cdvar, ptime )
-     !!--------------------------------------------------------------------
-     !!                   ***  SUBROUTINE  iom_close  ***
-     !!
-     !! ** Purpose : read the time axis cdvar in the file 
-     !!
-     !! ** Method :
-     !!
-     !!--------------------------------------------------------------------
-     INTEGER               , INTENT(in)  ::   knumfl   ! Identifier of the file to be closed
-     CHARACTER(len=*)      , INTENT(in)  ::   cdvar    ! time axis name
-     REAL(wp), DIMENSION(:), INTENT(out) ::   ptime    ! the time axis
-
-     INTEGER           :: idvar    ! id of the variable
-     CHARACTER(LEN=100) :: clinfo                    ! info character
-     !---------------------------------------------------------------------
-     clinfo = 'iom_gettime, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
-     idvar = iom_varid( knumfl, cdvar )
-     !
-     ptime(:) = 0. ! default definition
-     IF ( idvar > 0 ) THEN
-        IF ( iom_file(knumfl)%ndims(idvar) == 1 ) THEN
-           IF ( iom_file(knumfl)%luld(idvar) ) THEN
-              IF ( iom_file(knumfl)%dimsz(1,idvar) == size(ptime) ) THEN
-                 CALL fliogetv( knumfl, cdvar, ptime(:), start=(/ 1 /), &
-                      &                                   count=(/ iom_file(knumfl)%dimsz(1,idvar) /) )
-              ELSE
-                 WRITE(ctmp1,*) 'error with the size of ptime ',size(ptime),iom_file(knumfl)%dimsz(1,idvar)
-                 CALL ctl_stop( trim(clinfo), trim(ctmp1) )
-              ENDIF
-           ELSE
-              CALL ctl_stop( trim(clinfo), 'variable dimension is not unlimited... use iom_get' )
-           ENDIF
-        ELSE
-           CALL ctl_stop( trim(clinfo), 'the variable has more than 1 dimension' )
-        ENDIF
-     ELSE
-        CALL ctl_stop( trim(clinfo), 'variable not found in '//iom_file(knumfl)%name )
-     ENDIF
-
+      !!--------------------------------------------------------------------
+      !!                   ***  SUBROUTINE iom_gettime  ***
+      !!
+      !! ** Purpose : read the time axis cdvar in the file 
+      !!--------------------------------------------------------------------
+      INTEGER               , INTENT(in   ) ::   knumfl   ! file Identifier
+      CHARACTER(len=*)      , INTENT(in   ) ::   cdvar    ! time axis name
+      REAL(wp), DIMENSION(:), INTENT(  out) ::   ptime    ! the time axis
+      !
+      INTEGER            ::   idvar    ! id of the variable
+      CHARACTER(LEN=100) ::   clinfo   ! info character
+      !---------------------------------------------------------------------
+      !
+      clinfo = 'iom_gettime, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
+      idvar = iom_varid( knumfl, cdvar )
+      !
+      ptime(:) = 0. ! default definition
+      IF( idvar > 0 ) THEN
+         IF( iom_file(knumfl)%ndims(idvar) == 1 ) THEN
+            IF( iom_file(knumfl)%luld(idvar) ) THEN
+               IF( iom_file(knumfl)%dimsz(1,idvar) == size(ptime) ) THEN
+                  CALL fliogetv( knumfl, cdvar, ptime(:), start=(/ 1 /),   &
+                     &                                    count=(/ iom_file(knumfl)%dimsz(1,idvar) /) )
+               ELSE
+                  WRITE(ctmp1,*) 'error with the size of ptime ',size(ptime),iom_file(knumfl)%dimsz(1,idvar)
+                  CALL ctl_stop( trim(clinfo), trim(ctmp1) )
+               ENDIF
+            ELSE
+               CALL ctl_stop( trim(clinfo), 'variable dimension is not unlimited... use iom_get' )
+            ENDIF
+         ELSE
+            CALL ctl_stop( trim(clinfo), 'the variable has more than 1 dimension' )
+         ENDIF
+      ELSE
+         CALL ctl_stop( trim(clinfo), 'variable not found in '//iom_file(knumfl)%name )
+      ENDIF
+      !
    END SUBROUTINE iom_gettime
     
     
-    
    FUNCTION iom_varid ( knumfl, cdvar, kdimsz )  
-     !!-----------------------------------------------------------------------
-     !!                  ***  FUNCTION  iom_varid  ***
-     !!
-     !! ** Purpose : get the id of a variable in a file (return 0 if not found)
-     !!
-     !! ** Method : ???
-     !!
-     !!-----------------------------------------------------------------------
-     INTEGER              , INTENT(in)            ::   knumfl   ! file Identifier
-     CHARACTER(len=*)     , INTENT(in)            ::   cdvar    ! name of the variable
-     INTEGER, DIMENSION(:), INTENT(out), OPTIONAL ::   kdimsz   ! size of the dimensions
-     !
-     INTEGER                        :: iom_varid, idvar, i_nvd, ji
-     INTEGER, DIMENSION(jpmax_dims) :: idimid
-     LOGICAL                        :: ll_fnd
-     CHARACTER(LEN=100)             :: clinfo                   ! info character
-     !!-----------------------------------------------------------------------
-     clinfo = 'iom_varid, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
-     iom_varid = 0                         ! default definition
-     IF ( PRESENT(kdimsz) ) kdimsz(:) = 0  ! default definition
-     !
-     IF ( knumfl > 0 ) THEN
-        IF( iom_file(knumfl)%iopen == 0 ) THEN 
-           CALL ctl_stop( trim(clinfo), 'the file is not open' )
-        ELSE
-           !
-           ll_fnd  = .FALSE.
-           idvar = 0
-           !
-           DO WHILE ( .NOT.ll_fnd .AND. idvar < iom_file(knumfl)%nvars )
-              idvar = idvar + 1
-              ll_fnd  = ( TRIM(cdvar) == TRIM(iom_file(knumfl)%cn_var(idvar)) )
-           END DO
-           !
-           IF( .NOT.ll_fnd ) THEN
-              idvar = idvar + 1
-              IF( idvar <= jpmax_vars ) THEN
-                 CALL flioinqv( knumfl, cdvar, ll_fnd, nb_dims = i_nvd )
-                 IF( ll_fnd ) THEN
-                    IF( i_nvd <= jpmax_dims ) THEN
-                       iom_file(knumfl)%nvars           = idvar
-                       iom_file(knumfl)%cn_var(idvar) = trim(cdvar)
-                       iom_file(knumfl)%ndims(idvar)  = i_nvd
-                       CALL flioinqv( knumfl, cdvar, ll_fnd, &
-                            &         len_dims = iom_file(knumfl)%dimsz(1:i_nvd,idvar), &
-                            &         id_dims  = idimid(1:i_nvd) )
-                       DO ji = 1, i_nvd
-                          IF ( idimid(ji) == iom_file(knumfl)%iduld ) iom_file(knumfl)%luld(idvar) = .TRUE.
-                       END DO
-                       !----------
-                       !---------- Deal with scale_factor and offset
-                       CALL flioinqa( knumfl, cdvar, 'scale_factor', ll_fnd )
-                       IF (ll_fnd) THEN
-                          CALL fliogeta( knumfl, cdvar, 'scale_factor', iom_file(knumfl)%scf(idvar) )
-                       ELSE
-                          iom_file(knumfl)%scf(idvar) = 1.
-                       END IF
-                       CALL flioinqa( knumfl, cdvar, 'offset', ll_fnd )
-                       IF( ll_fnd ) THEN
-                          CALL fliogeta( knumfl, cdvar, 'offset', iom_file(knumfl)%ofs(idvar) )
-                       ELSE
-                          iom_file(knumfl)%ofs(idvar) = 0.
-                       END IF
-                       !
-                       iom_varid = idvar
-                       IF ( PRESENT(kdimsz) ) THEN 
-                          IF ( i_nvd == size(kdimsz) ) THEN
-                             kdimsz(:) = iom_file(knumfl)%dimsz(1:i_nvd,idvar)
-                          ELSE
-                             WRITE(ctmp1,*) i_nvd, size(kdimsz)
-                             CALL ctl_stop( trim(clinfo), 'error in kdimsz size'//trim(ctmp1) )
-                          ENDIF
-                       ENDIF
-                    ELSE
-                       CALL ctl_stop( trim(clinfo), 'Too many dimensions in the file '//iom_file(knumfl)%name,   &
-                            &           'increase the parameter jpmax_vars')
-                    ENDIF
-                 ELSE  
-                    CALL ctl_warn( trim(clinfo), 'Variable '//trim(cdvar)// &
-                         & ' is not found in the file '//trim(iom_file(knumfl)%name) )
-                 ENDIF
-              ELSE
-                 CALL ctl_stop( trim(clinfo), 'Too many variables in the file '//iom_file(knumfl)%name,   &
-                      &           'increase the parameter jpmax_vars')
-              ENDIF
-           ELSE
-              iom_varid = idvar
-              IF ( PRESENT(kdimsz) ) THEN 
-                 i_nvd = iom_file(knumfl)%ndims(idvar)
-                 IF ( i_nvd == size(kdimsz) ) THEN
-                    kdimsz(:) = iom_file(knumfl)%dimsz(1:i_nvd,idvar)
-                 ELSE
-                    WRITE(ctmp1,*) i_nvd, size(kdimsz)
-                    CALL ctl_stop( trim(clinfo), 'error in kdimsz size'//trim(ctmp1) )
-                 ENDIF
-              ENDIF
-           ENDIF
-        ENDIF
-     ENDIF
-
+      !!-----------------------------------------------------------------------
+      !!                  ***  FUNCTION  iom_varid  ***
+      !!
+      !! ** Purpose : get the id of a variable in a file (return 0 if not found)
+      !!-----------------------------------------------------------------------
+      INTEGER              , INTENT(in   )           ::   knumfl   ! file Identifier
+      CHARACTER(len=*)     , INTENT(in   )           ::   cdvar    ! name of the variable
+      INTEGER, DIMENSION(:), INTENT(  out), OPTIONAL ::   kdimsz   ! size of the dimensions
+      !
+      INTEGER                        ::   ji                       ! dummy loop index
+      INTEGER                        ::   iom_varid, idvar, i_nvd
+      INTEGER, DIMENSION(jpmax_dims) ::   idimid
+      LOGICAL                        ::   ll_fnd
+      CHARACTER(LEN=100)             ::   clinfo                   ! info character
+      !!-----------------------------------------------------------------------
+      clinfo = 'iom_varid, file: '//trim(iom_file(knumfl)%name)//', var: '//trim(cdvar)
+      iom_varid = 0                         ! default definition
+      IF( PRESENT(kdimsz) ) kdimsz(:) = 0   ! default definition
+      !
+      IF( knumfl > 0 ) THEN
+         IF( iom_file(knumfl)%iopen == 0 ) THEN 
+            CALL ctl_stop( trim(clinfo), 'the file is not open' )
+         ELSE
+            ll_fnd  = .FALSE.
+            idvar = 0
+            !
+            DO WHILE ( .NOT.ll_fnd .AND. idvar < iom_file(knumfl)%nvars )
+               idvar = idvar + 1
+               ll_fnd  = ( TRIM(cdvar) == TRIM(iom_file(knumfl)%cn_var(idvar)) )
+            END DO
+            !
+            IF( .NOT.ll_fnd ) THEN
+               idvar = idvar + 1
+               IF( idvar <= jpmax_vars ) THEN
+                  CALL flioinqv( knumfl, cdvar, ll_fnd, nb_dims = i_nvd )
+                  IF( ll_fnd ) THEN
+                     IF( i_nvd <= jpmax_dims ) THEN
+                        iom_file(knumfl)%nvars           = idvar
+                        iom_file(knumfl)%cn_var(idvar) = trim(cdvar)
+                        iom_file(knumfl)%ndims(idvar)  = i_nvd
+                        CALL flioinqv( knumfl, cdvar, ll_fnd,   &
+                           &           len_dims = iom_file(knumfl)%dimsz(1:i_nvd,idvar), &
+                           &           id_dims  = idimid(1:i_nvd) )
+                        DO ji = 1, i_nvd
+                           IF( idimid(ji) == iom_file(knumfl)%iduld ) iom_file(knumfl)%luld(idvar) = .TRUE.
+                        END DO
+                        !----------
+                        !---------- Deal with scale_factor and offset
+                        CALL flioinqa( knumfl, cdvar, 'scale_factor', ll_fnd )
+                        IF( ll_fnd) THEN
+                           CALL fliogeta( knumfl, cdvar, 'scale_factor', iom_file(knumfl)%scf(idvar) )
+                        ELSE
+                           iom_file(knumfl)%scf(idvar) = 1.
+                        END IF
+                        CALL flioinqa( knumfl, cdvar, 'offset', ll_fnd )
+                        IF( ll_fnd ) THEN
+                           CALL fliogeta( knumfl, cdvar, 'offset', iom_file(knumfl)%ofs(idvar) )
+                        ELSE
+                           iom_file(knumfl)%ofs(idvar) = 0.
+                        END IF
+                        !
+                        iom_varid = idvar
+                        IF( PRESENT(kdimsz) ) THEN 
+                           IF( i_nvd == size(kdimsz) ) THEN
+                              kdimsz(:) = iom_file(knumfl)%dimsz(1:i_nvd,idvar)
+                           ELSE
+                              WRITE(ctmp1,*) i_nvd, size(kdimsz)
+                              CALL ctl_stop( trim(clinfo), 'error in kdimsz size'//trim(ctmp1) )
+                           ENDIF
+                        ENDIF
+                     ELSE
+                        CALL ctl_stop( trim(clinfo), 'Too many dimensions in the file '//iom_file(knumfl)%name,   &
+                           &                        'increase the parameter jpmax_vars')
+                     ENDIF
+!!$                  ELSE  
+!!$                     CALL ctl_warn( trim(clinfo), 'Variable '//trim(cdvar)// &
+!!$                        &                         ' is not found in the file '//trim(iom_file(knumfl)%name) )
+                  ENDIF
+               ELSE
+                  CALL ctl_stop( trim(clinfo), 'Too many variables in the file '//iom_file(knumfl)%name,   &
+                     &                         'increase the parameter jpmax_vars')
+               ENDIF
+            ELSE
+               iom_varid = idvar
+               IF( PRESENT(kdimsz) ) THEN 
+                  i_nvd = iom_file(knumfl)%ndims(idvar)
+                  IF( i_nvd == size(kdimsz) ) THEN
+                     kdimsz(:) = iom_file(knumfl)%dimsz(1:i_nvd,idvar)
+                  ELSE
+                     WRITE(ctmp1,*) i_nvd, size(kdimsz)
+                     CALL ctl_stop( trim(clinfo), 'error in kdimsz size'//trim(ctmp1) )
+                  ENDIF
+               ENDIF
+            ENDIF
+         ENDIF
+      ENDIF
+      !
    END FUNCTION iom_varid
 
-  
-   FUNCTION iom_get_gblatt( knumfl, kinfonum )
-      !!-----------------------------------------------------------------------
-      !!                  ***  FUNCTION  iom_get_gblatt  ***
+   !!----------------------------------------------------------------------
+   !!                   INTERFACE iom_rstput
+   !!----------------------------------------------------------------------
+   SUBROUTINE iom_rstput_0d( kt, kwrite, knumfl, cdvar, pvar )
+      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step
+      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step
+      INTEGER         , INTENT(in)                         ::   knumfl   ! Identifier of the file 
+      CHARACTER(len=*), INTENT(in)                         ::   cdvar    ! time axis name
+      REAL(wp)        , INTENT(in)                         ::   pvar     ! read field
+      IF( knumfl > 0 )   CALL iom_rstput_0123d( kt, kwrite, knumfl, cdvar, pv_r0d = pvar )
+   END SUBROUTINE iom_rstput_0d
+
+   SUBROUTINE iom_rstput_1d( kt, kwrite, knumfl, cdvar, pvar )
+      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step
+      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step
+      INTEGER         , INTENT(in)                         ::   knumfl   ! Identifier of the file 
+      CHARACTER(len=*), INTENT(in)                         ::   cdvar    ! time axis name
+      REAL(wp)        , INTENT(in), DIMENSION(        jpk) ::   pvar     ! read field
+      IF( knumfl > 0 )    CALL iom_rstput_0123d( kt, kwrite, knumfl, cdvar, pv_r1d = pvar )
+   END SUBROUTINE iom_rstput_1d
+
+   SUBROUTINE iom_rstput_2d( kt, kwrite, knumfl, cdvar, pvar )
+      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step
+      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step
+      INTEGER         , INTENT(in)                         ::   knumfl   ! Identifier of the file 
+      CHARACTER(len=*), INTENT(in)                         ::   cdvar    ! time axis name
+      REAL(wp)        , INTENT(in), DIMENSION(jpi,jpj    ) ::   pvar     ! read field
+      IF( knumfl > 0 )   CALL iom_rstput_0123d( kt, kwrite, knumfl, cdvar, pv_r2d = pvar )
+   END SUBROUTINE iom_rstput_2d
+
+   SUBROUTINE iom_rstput_3d( kt, kwrite, knumfl, cdvar, pvar )
+      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step
+      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step
+      INTEGER         , INTENT(in)                         ::   knumfl   ! Identifier of the file 
+      CHARACTER(len=*), INTENT(in)                         ::   cdvar    ! time axis name
+      REAL(wp)        , INTENT(in), DIMENSION(jpi,jpj,jpk) ::   pvar     ! read field
+      IF( knumfl > 0 )   CALL iom_rstput_0123d( kt, kwrite, knumfl, cdvar, pv_r3d = pvar )
+   END SUBROUTINE iom_rstput_3d
+   !!----------------------------------------------------------------------
+
+   SUBROUTINE iom_rstput_0123d( kt, kwrite, knumfl, cdvar ,   &
+      &                             pv_r0d, pv_r1d, pv_r2d, pv_r3d )
+      !!--------------------------------------------------------------------
+      !!                   ***  SUBROUTINE  iom_rstput  ***
       !!
-      !! ** Purpose : ???
-      !!
-      !! ** Method : ???
-      !!
-      !!-----------------------------------------------------------------------
-      INTEGER,INTENT(in) :: knumfl
-      INTEGER,          intent(in) :: kinfonum
-      !
-      CHARACTER(LEN=10) :: clinfo
-      REAL(wp) :: iom_get_gblatt
-      !!-----------------------------------------------------------------------
-
-      WRITE(clinfo,*) kinfonum
-      clinfo = 'info'//trim(adjustl(clinfo))
-      CALL fliogeta (knumfl, "?", clinfo, iom_get_gblatt)
-
-   END FUNCTION iom_get_gblatt
-
+      !! ** Purpose : read the time axis cdvar in the file 
+      !!--------------------------------------------------------------------
+      INTEGER                   , INTENT(in)           ::   kt       ! ocean time-step
+      INTEGER                   , INTENT(in)           ::   kwrite   ! writing time-step
+      INTEGER                   , INTENT(in)           ::   knumfl   ! Identifier of the file 
+      CHARACTER(len=*)          , INTENT(in)           ::   cdvar    ! time axis name
+      REAL(wp)                  , INTENT(in), OPTIONAL ::   pv_r0d   ! read field
+      REAL(wp), DIMENSION(:)    , INTENT(in), OPTIONAL ::   pv_r1d   ! read field
+      REAL(wp), DIMENSION(:,:)  , INTENT(in), OPTIONAL ::   pv_r2d   ! read field
+      REAL(wp), DIMENSION(:,:,:), INTENT(in), OPTIONAL ::   pv_r3d   ! read field
+      !
+      INTEGER               :: idims, idvar        
+      INTEGER               :: ix1, ix2, iy1, iy2       
+      INTEGER, DIMENSION(4) :: idimsz, idimid     
+      CHARACTER(LEN=100)    :: clinfo        ! info character
+      !---------------------------------------------------------------------
+      !
+      clinfo = '          iom_rstput_0123d, file: '//TRIM(iom_file(knumfl)%name)//', var: '//TRIM(cdvar)
+
+      ! define dimension variables if it is not already done
+      ! ==========================
+      IF( iom_file(knumfl)%nvars == 0 ) THEN
+         ! define the dimension variables if it is not already done
+         CALL fliodefv( knumfl,'nav_lon', (/1,2/), v_t=flio_r4   , axis='X',   &
+            &                  long_name="Longitude", units="degrees_east" )
+         CALL fliodefv( knumfl,'nav_lat', (/1,2/), v_t=flio_r4   , axis='Y',   &
+            &                  long_name="Latitude", units="degrees_north" )
+         CALL fliodefv( knumfl,'nav_lev', (/3/)  , v_t=flio_i4   , axis='Z',   &
+            &                  long_name="Model levels",units="model_levels")
+         CALL fliodefv( knumfl,'time_counter', (/4/), v_t=flio_r4, axis='T',   &
+            &                  long_name="Time axis", units='seconds since 0001-01-01 00:00:00' )
+         ! update informations structure related the dimension variable we just added...
+         iom_file(knumfl)%nvars       = 4
+         iom_file(knumfl)%luld(1:4)   = (/ .FALSE., .FALSE., .FALSE., .TRUE. /)
+         iom_file(knumfl)%cn_var(1:3) = (/ 'nav_lon', 'nav_lat', 'nav_lev' /)
+         iom_file(knumfl)%cn_var(4)   = 'time_counter'
+         iom_file(knumfl)%ndims(1:4)  = (/ 2, 2, 1, 1 /)  
+         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' define dimension variables done'
+      ENDIF
+
+      ! define the data if it is not already done
+      ! ===============
+      idvar = iom_varid( knumfl, cdvar )
+      IF( idvar <= 0 ) THEN
+         ! variable definition
+         IF(     PRESENT(pv_r0d) ) THEN   ;   idims = 0
+         ELSEIF( PRESENT(pv_r1d) ) THEN   ;   idims = 2   ;   idimid(1:idims) = (/    3,4/)
+         ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2  ,4/)
+         ELSEIF( PRESENT(pv_r3d) ) THEN   ;   idims = 4   ;   idimid(1:idims) = (/1,2,3,4/)
+         ENDIF
+         IF( PRESENT(pv_r0d) ) THEN   ;   CALL fliodefv (knumfl, cdvar                 , v_t = flio_r8)
+         ELSE                         ;   CALL fliodefv (knumfl, cdvar, idimid(1:idims), v_t = flio_r8)
+         ENDIF
+         ! update informations structure related the new variable we want to add...
+         idvar                          = iom_file(knumfl)%nvars + 1
+         iom_file(knumfl)%nvars         = idvar
+         iom_file(knumfl)%cn_var(idvar) = TRIM(cdvar)
+         iom_file(knumfl)%scf(idvar)    = 1.
+         iom_file(knumfl)%ofs(idvar)    = 0.
+         iom_file(knumfl)%ndims(idvar)  = idims
+         IF( .NOT. PRESENT(pv_r0d) ) THEN
+            iom_file(knumfl)%luld(idvar) = .TRUE.
+            CALL flioinqf( knumfl, ln_dim = idimsz )
+            iom_file(knumfl)%dimsz(1:idims-1,idvar) = idimsz(idimid(1:idims-1))
+         ENDIF
+         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' defined ok'
+      ENDIF
+
+      ! time step kwrite : write the variable
+      IF( kt == kwrite ) THEN
+         ! on what kind of domain must the data be written?
+         IF( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) THEN
+            idimsz(1:2) = iom_file(knumfl)%dimsz(1:2,idvar)
+            IF(     idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1) ) THEN
+               ix1 = nldi   ;   ix2 = nlei   ;   iy1 = nldj   ;   iy2 = nlej
+            ELSEIF( idimsz(1) == nlci              .AND. idimsz(2) == nlcj              ) THEN
+               ix1 = 1      ;   ix2 = nlci   ;   iy1 = 1      ;   iy2 = nlcj
+            ELSEIF( idimsz(1) == jpi               .AND. idimsz(2) == jpj               ) THEN
+               ix1 = 1      ;   ix2 = jpi    ;   iy1 = 1      ;   iy2 = jpj
+            ELSE 
+               CALL ctl_stop( 'iom_rstput_0123d: should have been an impossible case...' )
+            ENDIF
+
+            ! write dimension variables if it is not already done
+            ! =============
+            IF( iom_file(knumfl)%dimsz(1, 1) == 0 ) THEN
+               CALL flioputv( knumfl, 'nav_lon'     , glamt(ix1:ix2, iy1:iy2) )
+               CALL flioputv( knumfl, 'nav_lat'     , gphit(ix1:ix2, iy1:iy2) )
+               CALL flioputv( knumfl, 'nav_lev'     , gdept_0 )
+               CALL flioputv( knumfl, 'time_counter', kt )   ! +++ WRONG VALUE: to be improved but not really useful...
+               ! update informations structure related the dimension variable
+               iom_file(knumfl)%dimsz(1:2, 1) = idimsz(1:2)
+               iom_file(knumfl)%dimsz(1:2, 2) = idimsz(1:2)
+               iom_file(knumfl)%dimsz(1, 3:4) = (/idimsz(3), 1/)
+               IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done'
+            ENDIF
+         ENDIF
+
+         ! write the data
+         ! =============
+         IF(     PRESENT(pv_r0d) ) THEN   ;   CALL flioputv( knumfl, cdvar, pv_r0d                      )
+         ELSEIF( PRESENT(pv_r1d) ) THEN   ;   CALL flioputv( knumfl, cdvar, pv_r1d(                  :) )
+         ELSEIF( PRESENT(pv_r2d) ) THEN   ;   CALL flioputv( knumfl, cdvar, pv_r2d(ix1:ix2, iy1:iy2   ) )
+         ELSEIF( PRESENT(pv_r3d) ) THEN   ;   CALL flioputv( knumfl, cdvar, pv_r3d(ix1:ix2, iy1:iy2, :) )
+         ENDIF
+         ! add 1 to the size of the temporal dimension (not really useful...)
+         IF( iom_file(knumfl)%luld(idvar) )   iom_file(knumfl)%dimsz(iom_file(knumfl)%ndims(idvar), idvar)    &
+            &                               = iom_file(knumfl)%dimsz(iom_file(knumfl)%ndims(idvar), idvar) + 1
+         IF(lwp) WRITE(numout,*) TRIM(clinfo)//' written ok'
+      ENDIF
+      !     
+   END SUBROUTINE iom_rstput_0123d
+   
    !!======================================================================
 END MODULE iom
