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 10727 for utils/tools_AGRIF_CMEMS_2020/DOMAINcfg/src/iom.F90 – NEMO

Ignore:
Timestamp:
2019-02-27T17:02:02+01:00 (5 years ago)
Author:
rblod
Message:

new nesting tools (attempt) and brutal cleaning of DOMAINcfg, see ticket #2129

File:
1 moved

Legend:

Unmodified
Added
Removed
  • utils/tools_AGRIF_CMEMS_2020/DOMAINcfg/src/iom.F90

    r10725 r10727  
    11MODULE iom 
    2    !!===================================================================== 
     2   !!====================================================================== 
    33   !!                    ***  MODULE  iom *** 
    44   !! Input/Output manager :  Library to read input files 
    5    !!==================================================================== 
     5   !!====================================================================== 
    66   !! History :  2.0  ! 2005-12  (J. Belier) Original code 
    77   !!            2.0  ! 2006-02  (S. Masson) Adaptation to NEMO 
    88   !!            3.0  ! 2007-07  (D. Storkey) Changes to iom_gettime 
    99   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  add C1D case   
    10    !!-------------------------------------------------------------------- 
    11  
    12    !!-------------------------------------------------------------------- 
     10   !!            3.6  ! 2014-15  DIMG format removed 
     11   !!            3.6  ! 2015-15  (J. Harle) Added procedure to read REAL attributes 
     12   !!            4.0  ! 2017-11  (M. Andrejczuk) Extend IOM interface to write any 3D fields 
     13   !!---------------------------------------------------------------------- 
     14 
     15   !!---------------------------------------------------------------------- 
    1316   !!   iom_open       : open a file read only 
    1417   !!   iom_close      : close a file or all files opened by iom 
    1518   !!   iom_get        : read a field (interfaced to several routines) 
    16    !!   iom_gettime    : read the time axis cdvar in the file 
    1719   !!   iom_varid      : get the id of a variable in a file 
    1820   !!   iom_rstput     : write a field in a restart file (interfaced to several routines) 
    19    !!-------------------------------------------------------------------- 
     21   !!---------------------------------------------------------------------- 
    2022   USE dom_oce         ! ocean space and time domain 
    2123   USE lbclnk          ! lateal boundary condition / mpp exchanges 
     
    2426   USE in_out_manager  ! I/O manager 
    2527   USE lib_mpp           ! MPP library 
     28#if defined key_iomput 
     29   USE sbc_oce  , ONLY :   nn_fsbc         ! ocean space and time domain 
     30   USE trc_oce  , ONLY :   nn_dttrc        !  !: frequency of step on passive tracers 
     31   USE icb_oce  , ONLY :   nclasses, class_num       !  !: iceberg classes 
     32#if defined key_si3 
     33   USE ice      , ONLY :   jpl 
     34#endif 
     35   USE domngb          ! ocean space and time domain 
     36   USE phycst          ! physical constants 
     37   USE dianam          ! build name of file 
     38   USE xios 
     39# endif 
     40   USE ioipsl, ONLY :  ju2ymds    ! for calendar 
     41#if defined key_top 
     42   USE trc, ONLY    :  profsed 
     43#endif 
     44   USE lib_fortran  
    2645 
    2746   IMPLICIT NONE 
    2847   PUBLIC   !   must be public to be able to access iom_def through iom 
    2948    
     49#if defined key_iomput 
     50   LOGICAL, PUBLIC, PARAMETER ::   lk_iomput = .TRUE.        !: iom_put flag 
     51#else 
    3052   LOGICAL, PUBLIC, PARAMETER ::   lk_iomput = .FALSE.       !: iom_put flag 
    31    PUBLIC iom_init, iom_swap, iom_open, iom_close, iom_setkt, iom_varid, iom_get, iom_gettime, iom_rstput, iom_put 
    32    PUBLIC iom_getatt, iom_use, iom_context_finalize 
     53#endif 
     54   PUBLIC iom_init, iom_swap, iom_open, iom_close, iom_setkt, iom_varid, iom_get 
     55   PUBLIC iom_chkatt, iom_getatt, iom_putatt, iom_getszuld, iom_rstput, iom_delay_rst, iom_put 
     56   PUBLIC iom_use, iom_context_finalize 
    3357 
    3458   PRIVATE iom_rp0d, iom_rp1d, iom_rp2d, iom_rp3d 
    3559   PRIVATE iom_g0d, iom_g1d, iom_g2d, iom_g3d, iom_get_123d 
    3660   PRIVATE iom_p1d, iom_p2d, iom_p3d 
     61#if defined key_iomput 
     62   PRIVATE iom_set_domain_attr, iom_set_axis_attr, iom_set_field_attr, iom_set_file_attr, iom_get_file_attr, iom_set_grid_attr 
     63   PRIVATE set_grid, set_grid_bounds, set_scalar, set_xmlatt, set_mooring, iom_update_file_name, iom_sdate 
     64   PRIVATE iom_set_rst_context, iom_set_rstw_active, iom_set_rstr_active 
     65# endif 
     66   PUBLIC iom_set_rstw_var_active, iom_set_rstw_core, iom_set_rst_vars 
    3767 
    3868   INTERFACE iom_get 
     
    4070   END INTERFACE 
    4171   INTERFACE iom_getatt 
    42       MODULE PROCEDURE iom_g0d_intatt 
     72      MODULE PROCEDURE iom_g0d_iatt, iom_g1d_iatt, iom_g0d_ratt, iom_g1d_ratt, iom_g0d_catt 
     73   END INTERFACE 
     74   INTERFACE iom_putatt 
     75      MODULE PROCEDURE iom_p0d_iatt, iom_p1d_iatt, iom_p0d_ratt, iom_p1d_ratt, iom_p0d_catt 
    4376   END INTERFACE 
    4477   INTERFACE iom_rstput 
    4578      MODULE PROCEDURE iom_rp0d, iom_rp1d, iom_rp2d, iom_rp3d 
    4679   END INTERFACE 
    47   INTERFACE iom_put 
    48      MODULE PROCEDURE iom_p0d, iom_p1d, iom_p2d, iom_p3d 
    49   END INTERFACE 
    50  
     80   INTERFACE iom_put 
     81      MODULE PROCEDURE iom_p0d, iom_p1d, iom_p2d, iom_p3d 
     82   END INTERFACE iom_put 
     83   
    5184   !!---------------------------------------------------------------------- 
    5285   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
    53    !! $Id: iom.F90 8572 2017-09-28 08:27:06Z cbricaud $ 
    54    !! Software governed by the CeCILL licence (./LICENSE) 
     86   !! $Id: iom.F90 10523 2019-01-16 09:36:03Z smasson $ 
     87   !! Software governed by the CeCILL license (see ./LICENSE) 
    5588   !!---------------------------------------------------------------------- 
    56  
    5789CONTAINS 
    5890 
    59    SUBROUTINE iom_init( cdname )  
     91   SUBROUTINE iom_init( cdname, fname, ld_tmppatch )  
    6092      !!---------------------------------------------------------------------- 
    6193      !!                     ***  ROUTINE   *** 
     
    6496      !! 
    6597      !!---------------------------------------------------------------------- 
    66       CHARACTER(len=*), INTENT(in)  :: cdname 
    67        
     98      CHARACTER(len=*),           INTENT(in)  :: cdname 
     99      CHARACTER(len=*), OPTIONAL, INTENT(in)  :: fname 
     100      LOGICAL         , OPTIONAL, INTENT(in)  :: ld_tmppatch 
     101#if defined key_iomput 
     102      ! 
     103      TYPE(xios_duration) :: dtime    = xios_duration(0, 0, 0, 0, 0, 0) 
     104      TYPE(xios_date)     :: start_date 
     105      CHARACTER(len=lc) :: clname 
     106      INTEGER           :: ji, jkmin 
     107      LOGICAL :: llrst_context              ! is context related to restart 
     108      ! 
     109      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zt_bnds, zw_bnds 
     110      LOGICAL ::   ll_tmppatch = .TRUE.    !: seb: patch before we remove periodicity 
     111      INTEGER ::   nldi_save, nlei_save    !:      and close boundaries in output files 
     112      INTEGER ::   nldj_save, nlej_save    !: 
     113      !!---------------------------------------------------------------------- 
     114      ! 
     115      ! seb: patch before we remove periodicity and close boundaries in output files 
     116      IF( PRESENT(ld_tmppatch) ) THEN   ;   ll_tmppatch = ld_tmppatch 
     117      ELSE                              ;   ll_tmppatch = .TRUE. 
     118      ENDIF 
     119      IF ( ll_tmppatch ) THEN 
     120         nldi_save = nldi   ;   nlei_save = nlei 
     121         nldj_save = nldj   ;   nlej_save = nlej 
     122         IF( nimpp           ==      1 ) nldi = 1 
     123         IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 
     124         IF( njmpp           ==      1 ) nldj = 1 
     125         IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 
     126      ENDIF 
     127      ! 
     128      ALLOCATE( zt_bnds(2,jpk), zw_bnds(2,jpk) ) 
     129      ! 
     130      clname = cdname 
     131      IF( TRIM(Agrif_CFixed()) /= '0' )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(cdname) 
     132      CALL xios_context_initialize(TRIM(clname), mpi_comm_oce) 
     133      CALL iom_swap( cdname ) 
     134      llrst_context =  (TRIM(cdname) == TRIM(crxios_context) .OR. TRIM(cdname) == TRIM(cwxios_context)) 
     135 
     136      ! Calendar type is now defined in xml file  
     137      SELECT CASE ( nleapy )        ! Choose calendar for IOIPSL 
     138      CASE ( 1)   ; CALL xios_define_calendar( TYPE = "Gregorian", time_origin = xios_date(1900,01,01,00,00,00), & 
     139          &                                    start_date = xios_date(nyear,nmonth,nday,0,0,0) ) 
     140      CASE ( 0)   ; CALL xios_define_calendar( TYPE = "NoLeap"   , time_origin = xios_date(1900,01,01,00,00,00), & 
     141          &                                    start_date = xios_date(nyear,nmonth,nday,0,0,0) ) 
     142      CASE (30)   ; CALL xios_define_calendar( TYPE = "D360"     , time_origin = xios_date(1900,01,01,00,00,00), & 
     143          &                                    start_date = xios_date(nyear,nmonth,nday,0,0,0) ) 
     144      END SELECT 
     145 
     146      ! horizontal grid definition 
     147      IF(.NOT.llrst_context) CALL set_scalar 
     148      ! 
     149      IF( TRIM(cdname) == TRIM(cxios_context) ) THEN   
     150         CALL set_grid( "T", glamt, gphit, .FALSE., .FALSE. )  
     151         CALL set_grid( "U", glamu, gphiu, .FALSE., .FALSE. ) 
     152         CALL set_grid( "V", glamv, gphiv, .FALSE., .FALSE. ) 
     153         CALL set_grid( "W", glamt, gphit, .FALSE., .FALSE. ) 
     154         CALL set_grid_znl( gphit ) 
     155         ! 
     156         IF( ln_cfmeta ) THEN   ! Add additional grid metadata 
     157            CALL iom_set_domain_attr("grid_T", area = e1e2t(nldi:nlei, nldj:nlej)) 
     158            CALL iom_set_domain_attr("grid_U", area = e1e2u(nldi:nlei, nldj:nlej)) 
     159            CALL iom_set_domain_attr("grid_V", area = e1e2v(nldi:nlei, nldj:nlej)) 
     160            CALL iom_set_domain_attr("grid_W", area = e1e2t(nldi:nlei, nldj:nlej)) 
     161            CALL set_grid_bounds( "T", glamf, gphif, glamt, gphit ) 
     162            CALL set_grid_bounds( "U", glamv, gphiv, glamu, gphiu ) 
     163            CALL set_grid_bounds( "V", glamu, gphiu, glamv, gphiv ) 
     164            CALL set_grid_bounds( "W", glamf, gphif, glamt, gphit ) 
     165         ENDIF 
     166      ENDIF 
     167      ! 
     168      IF( TRIM(cdname) == TRIM(cxios_context)//"_crs" ) THEN   
     169         CALL dom_grid_crs   ! Save the parent grid information  & Switch to coarse grid domain 
     170         ! 
     171         CALL set_grid( "T", glamt_crs, gphit_crs, .FALSE., .FALSE. )  
     172         CALL set_grid( "U", glamu_crs, gphiu_crs, .FALSE., .FALSE. )  
     173         CALL set_grid( "V", glamv_crs, gphiv_crs, .FALSE., .FALSE. )  
     174         CALL set_grid( "W", glamt_crs, gphit_crs, .FALSE., .FALSE. )  
     175         CALL set_grid_znl( gphit_crs ) 
     176          ! 
     177         CALL dom_grid_glo   ! Return to parent grid domain 
     178         ! 
     179         IF( ln_cfmeta .AND. .NOT. llrst_context) THEN   ! Add additional grid metadata 
     180            CALL iom_set_domain_attr("grid_T", area = e1e2t_crs(nldi:nlei, nldj:nlej)) 
     181            CALL iom_set_domain_attr("grid_U", area = e1u_crs(nldi:nlei, nldj:nlej) * e2u_crs(nldi:nlei, nldj:nlej)) 
     182            CALL iom_set_domain_attr("grid_V", area = e1v_crs(nldi:nlei, nldj:nlej) * e2v_crs(nldi:nlei, nldj:nlej)) 
     183            CALL iom_set_domain_attr("grid_W", area = e1e2t_crs(nldi:nlei, nldj:nlej)) 
     184            CALL set_grid_bounds( "T", glamf_crs, gphif_crs, glamt_crs, gphit_crs ) 
     185            CALL set_grid_bounds( "U", glamv_crs, gphiv_crs, glamu_crs, gphiu_crs ) 
     186            CALL set_grid_bounds( "V", glamu_crs, gphiu_crs, glamv_crs, gphiv_crs ) 
     187            CALL set_grid_bounds( "W", glamf_crs, gphif_crs, glamt_crs, gphit_crs ) 
     188         ENDIF 
     189      ENDIF 
     190      ! 
     191      ! vertical grid definition 
     192      IF(.NOT.llrst_context) THEN 
     193          CALL iom_set_axis_attr( "deptht",  paxis = gdept_1d ) 
     194          CALL iom_set_axis_attr( "depthu",  paxis = gdept_1d ) 
     195          CALL iom_set_axis_attr( "depthv",  paxis = gdept_1d ) 
     196          CALL iom_set_axis_attr( "depthw",  paxis = gdepw_1d ) 
     197 
     198          ! Add vertical grid bounds 
     199          jkmin = MIN(2,jpk)  ! in case jpk=1 (i.e. sas2D) 
     200          zt_bnds(2,:        ) = gdept_1d(:) 
     201          zt_bnds(1,jkmin:jpk) = gdept_1d(1:jpkm1) 
     202          zt_bnds(1,1        ) = gdept_1d(1) - e3w_1d(1) 
     203          zw_bnds(1,:        ) = gdepw_1d(:) 
     204          zw_bnds(2,1:jpkm1  ) = gdepw_1d(jkmin:jpk) 
     205          zw_bnds(2,jpk:     ) = gdepw_1d(jpk) + e3t_1d(jpk) 
     206          CALL iom_set_axis_attr( "deptht", bounds=zw_bnds ) 
     207          CALL iom_set_axis_attr( "depthu", bounds=zw_bnds ) 
     208          CALL iom_set_axis_attr( "depthv", bounds=zw_bnds ) 
     209          CALL iom_set_axis_attr( "depthw", bounds=zt_bnds ) 
     210          ! 
     211# if defined key_floats 
     212          CALL iom_set_axis_attr( "nfloat", (/ (REAL(ji,wp), ji=1,jpnfl) /) ) 
     213# endif 
     214# if defined key_si3 
     215          CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
     216          ! SIMIP diagnostics (4 main arctic straits) 
     217          CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,wp), ji=1,4) /) ) 
     218# endif 
     219#if defined key_top 
     220          CALL iom_set_axis_attr( "profsed", paxis = profsed ) 
     221#endif 
     222          CALL iom_set_axis_attr( "icbcla", class_num ) 
     223          CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,wp) /) ) 
     224          CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,wp) /) ) 
     225      ENDIF 
     226      ! 
     227      ! automatic definitions of some of the xml attributs 
     228      IF( TRIM(cdname) == TRIM(crxios_context) ) THEN 
     229!set names of the fields in restart file IF using XIOS to read data 
     230          CALL iom_set_rst_context(.TRUE.) 
     231          CALL iom_set_rst_vars(rst_rfields) 
     232!set which fields are to be read from restart file 
     233          CALL iom_set_rstr_active() 
     234      ELSE IF( TRIM(cdname) == TRIM(cwxios_context) ) THEN 
     235!set names of the fields in restart file IF using XIOS to write data 
     236          CALL iom_set_rst_context(.FALSE.) 
     237          CALL iom_set_rst_vars(rst_wfields) 
     238!set which fields are to be written to a restart file 
     239          CALL iom_set_rstw_active(fname) 
     240      ELSE 
     241          CALL set_xmlatt 
     242      ENDIF 
     243      ! 
     244      ! end file definition 
     245      dtime%second = rdt 
     246      CALL xios_set_timestep( dtime ) 
     247      CALL xios_close_context_definition() 
     248      CALL xios_update_calendar( 0 ) 
     249      ! 
     250      DEALLOCATE( zt_bnds, zw_bnds ) 
     251      ! 
     252      IF ( ll_tmppatch ) THEN 
     253         nldi = nldi_save   ;   nlei = nlei_save 
     254         nldj = nldj_save   ;   nlej = nlej_save 
     255      ENDIF 
     256#endif 
     257      ! 
    68258   END SUBROUTINE iom_init 
    69259 
     260   SUBROUTINE iom_set_rstw_var_active(field) 
     261      !!--------------------------------------------------------------------- 
     262      !!                   ***  SUBROUTINE  iom_set_rstw_var_active  *** 
     263      !! 
     264      !! ** Purpose :  enable variable in restart file when writing with XIOS  
     265      !!--------------------------------------------------------------------- 
     266   CHARACTER(len = *), INTENT(IN) :: field 
     267   INTEGER :: i 
     268   LOGICAL :: llis_set 
     269   CHARACTER(LEN=256) :: clinfo    ! info character 
     270 
     271#if defined key_iomput 
     272   llis_set = .FALSE. 
     273 
     274   DO i = 1, max_rst_fields 
     275       IF(TRIM(rst_wfields(i)%vname) == field) THEN  
     276          rst_wfields(i)%active = .TRUE. 
     277          llis_set = .TRUE. 
     278          EXIT 
     279       ENDIF 
     280   ENDDO 
     281!Warn if variable is not in defined in rst_wfields 
     282   IF(.NOT.llis_set) THEN 
     283      WRITE(ctmp1,*) 'iom_set_rstw_var_active: variable ', field ,' is available for writing but not defined'  
     284      CALL ctl_stop( 'iom_set_rstw_var_active:', ctmp1 ) 
     285   ENDIF 
     286#else 
     287        clinfo = 'iom_set_rstw_var_active: key_iomput is needed to use XIOS restart read/write functionality' 
     288        CALL ctl_stop('STOP', TRIM(clinfo)) 
     289#endif 
     290 
     291   END SUBROUTINE iom_set_rstw_var_active 
     292 
     293   SUBROUTINE iom_set_rstr_active() 
     294      !!--------------------------------------------------------------------- 
     295      !!                   ***  SUBROUTINE  iom_set_rstr_active  *** 
     296      !! 
     297      !! ** Purpose :  define file name in XIOS context for reading restart file, 
     298      !!               enable variables present in restart file for reading with XIOS  
     299      !!--------------------------------------------------------------------- 
     300 
     301!sets enabled = .TRUE. for each field in restart file 
     302   CHARACTER(len=256) :: rst_file 
     303 
     304#if defined key_iomput 
     305   TYPE(xios_field) :: field_hdl 
     306   TYPE(xios_file) :: file_hdl 
     307   TYPE(xios_filegroup) :: filegroup_hdl 
     308   INTEGER :: i 
     309   CHARACTER(lc)  ::   clpath 
     310 
     311        clpath = TRIM(cn_ocerst_indir) 
     312        IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/' 
     313        IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
     314           rst_file = TRIM(clpath)//TRIM(cn_ocerst_in) 
     315        ELSE 
     316           rst_file = TRIM(clpath)//'1_'//TRIM(cn_ocerst_in) 
     317        ENDIF 
     318!set name of the restart file and enable available fields 
     319        if(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS) to: ',rst_file 
     320        CALL xios_get_handle("file_definition", filegroup_hdl ) 
     321        CALL xios_add_child(filegroup_hdl, file_hdl, 'rrestart') 
     322        CALL xios_set_file_attr( "rrestart", name=trim(rst_file), type="one_file", & 
     323             par_access="collective", enabled=.TRUE., mode="read",                 & 
     324             output_freq=xios_timestep) 
     325!define variables for restart context 
     326        DO i = 1, max_rst_fields 
     327         IF( TRIM(rst_rfields(i)%vname) /= "NO_NAME") THEN 
     328           IF( iom_varid( numror, TRIM(rst_rfields(i)%vname), ldstop = .FALSE. ) > 0 ) THEN 
     329                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_rfields(i)%vname)) 
     330                SELECT CASE (TRIM(rst_rfields(i)%grid)) 
     331                 CASE ("grid_N_3D") 
     332                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     333                        domain_ref="grid_N", axis_ref="nav_lev", operation = "instant") 
     334                 CASE ("grid_N") 
     335                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     336                        domain_ref="grid_N", operation = "instant")  
     337                CASE ("grid_vector") 
     338                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     339                         axis_ref="nav_lev", operation = "instant") 
     340                 CASE ("grid_scalar") 
     341                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     342                        scalar_ref = "grid_scalar", operation = "instant") 
     343                END SELECT 
     344                IF(lwp) WRITE(numout,*) 'XIOS read: ', TRIM(rst_rfields(i)%vname), ' enabled in ', TRIM(rst_file) 
     345           ENDIF 
     346         ENDIF 
     347        END DO 
     348#endif 
     349   END SUBROUTINE iom_set_rstr_active 
     350 
     351   SUBROUTINE iom_set_rstw_core(cdmdl) 
     352      !!--------------------------------------------------------------------- 
     353      !!                   ***  SUBROUTINE  iom_set_rstw_core  *** 
     354      !! 
     355      !! ** Purpose :  set variables which are always in restart file  
     356      !!--------------------------------------------------------------------- 
     357   CHARACTER (len=*), INTENT (IN) :: cdmdl ! model OPA or SAS 
     358   CHARACTER(LEN=256)             :: clinfo    ! info character 
     359#if defined key_iomput 
     360   IF(cdmdl == "OPA") THEN 
     361!from restart.F90 
     362   CALL iom_set_rstw_var_active("rdt") 
     363   IF ( .NOT. ln_diurnal_only ) THEN 
     364        CALL iom_set_rstw_var_active('ub'  ) 
     365        CALL iom_set_rstw_var_active('vb'  ) 
     366        CALL iom_set_rstw_var_active('tb'  ) 
     367        CALL iom_set_rstw_var_active('sb'  ) 
     368        CALL iom_set_rstw_var_active('sshb') 
     369        ! 
     370        CALL iom_set_rstw_var_active('un'  ) 
     371        CALL iom_set_rstw_var_active('vn'  ) 
     372        CALL iom_set_rstw_var_active('tn'  ) 
     373        CALL iom_set_rstw_var_active('sn'  ) 
     374        CALL iom_set_rstw_var_active('sshn') 
     375        CALL iom_set_rstw_var_active('rhop') 
     376     ! extra variable needed for the ice sheet coupling 
     377        IF ( ln_iscpl ) THEN 
     378             CALL iom_set_rstw_var_active('tmask') 
     379             CALL iom_set_rstw_var_active('umask') 
     380             CALL iom_set_rstw_var_active('vmask') 
     381             CALL iom_set_rstw_var_active('smask') 
     382             CALL iom_set_rstw_var_active('e3t_n') 
     383             CALL iom_set_rstw_var_active('e3u_n') 
     384             CALL iom_set_rstw_var_active('e3v_n') 
     385             CALL iom_set_rstw_var_active('gdepw_n') 
     386        END IF 
     387      ENDIF 
     388      IF(ln_diurnal) CALL iom_set_rstw_var_active('Dsst') 
     389!from trasbc.F90 
     390         CALL iom_set_rstw_var_active('sbc_hc_b') 
     391         CALL iom_set_rstw_var_active('sbc_sc_b') 
     392   ENDIF 
     393#else 
     394        clinfo = 'iom_set_rstw_core: key_iomput is needed to use XIOS restart read/write functionality' 
     395        CALL ctl_stop('STOP', TRIM(clinfo)) 
     396#endif 
     397   END SUBROUTINE iom_set_rstw_core 
     398 
     399   SUBROUTINE iom_set_rst_vars(fields) 
     400      !!--------------------------------------------------------------------- 
     401      !!                   ***  SUBROUTINE iom_set_rst_vars   *** 
     402      !! 
     403      !! ** Purpose :  Fill array fields with the information about all  
     404      !!               possible variables and corresponding grids definition  
     405      !!               for reading/writing restart with XIOS 
     406      !!--------------------------------------------------------------------- 
     407   TYPE(RST_FIELD), INTENT(INOUT) :: fields(max_rst_fields) 
     408   INTEGER :: i 
     409 
     410        i = 0 
     411        i = i + 1; fields(i)%vname="rdt";            fields(i)%grid="grid_scalar" 
     412        i = i + 1; fields(i)%vname="un";             fields(i)%grid="grid_N_3D" 
     413        i = i + 1; fields(i)%vname="ub";             fields(i)%grid="grid_N_3D" 
     414        i = i + 1; fields(i)%vname="vn";             fields(i)%grid="grid_N_3D" 
     415        i = i + 1; fields(i)%vname="vb";             fields(i)%grid="grid_N_3D"   
     416        i = i + 1; fields(i)%vname="tn";             fields(i)%grid="grid_N_3D" 
     417        i = i + 1; fields(i)%vname="tb";             fields(i)%grid="grid_N_3D" 
     418        i = i + 1; fields(i)%vname="sn";             fields(i)%grid="grid_N_3D" 
     419        i = i + 1; fields(i)%vname="sb";             fields(i)%grid="grid_N_3D" 
     420        i = i + 1; fields(i)%vname="sshn";           fields(i)%grid="grid_N" 
     421        i = i + 1; fields(i)%vname="sshb";           fields(i)%grid="grid_N" 
     422        i = i + 1; fields(i)%vname="rhop";           fields(i)%grid="grid_N_3D" 
     423        i = i + 1; fields(i)%vname="kt";             fields(i)%grid="grid_scalar" 
     424        i = i + 1; fields(i)%vname="ndastp";         fields(i)%grid="grid_scalar" 
     425        i = i + 1; fields(i)%vname="adatrj";         fields(i)%grid="grid_scalar" 
     426        i = i + 1; fields(i)%vname="utau_b";         fields(i)%grid="grid_N" 
     427        i = i + 1; fields(i)%vname="vtau_b";         fields(i)%grid="grid_N" 
     428        i = i + 1; fields(i)%vname="qns_b";          fields(i)%grid="grid_N" 
     429        i = i + 1; fields(i)%vname="emp_b";          fields(i)%grid="grid_N" 
     430        i = i + 1; fields(i)%vname="sfx_b";          fields(i)%grid="grid_N" 
     431        i = i + 1; fields(i)%vname="en" ;            fields(i)%grid="grid_N_3D"  
     432        i = i + 1; fields(i)%vname="avt_k";            fields(i)%grid="grid_N_3D" 
     433        i = i + 1; fields(i)%vname="avm_k";            fields(i)%grid="grid_N_3D" 
     434        i = i + 1; fields(i)%vname="dissl";          fields(i)%grid="grid_N_3D" 
     435        i = i + 1; fields(i)%vname="sbc_hc_b";       fields(i)%grid="grid_N" 
     436        i = i + 1; fields(i)%vname="sbc_sc_b";       fields(i)%grid="grid_N" 
     437        i = i + 1; fields(i)%vname="qsr_hc_b";       fields(i)%grid="grid_N_3D" 
     438        i = i + 1; fields(i)%vname="fraqsr_1lev";    fields(i)%grid="grid_N" 
     439        i = i + 1; fields(i)%vname="greenland_icesheet_mass" 
     440                                               fields(i)%grid="grid_scalar" 
     441        i = i + 1; fields(i)%vname="greenland_icesheet_timelapsed" 
     442                                               fields(i)%grid="grid_scalar" 
     443        i = i + 1; fields(i)%vname="greenland_icesheet_mass_roc" 
     444                                               fields(i)%grid="grid_scalar" 
     445        i = i + 1; fields(i)%vname="antarctica_icesheet_mass" 
     446                                               fields(i)%grid="grid_scalar" 
     447        i = i + 1; fields(i)%vname="antarctica_icesheet_timelapsed" 
     448                                               fields(i)%grid="grid_scalar" 
     449        i = i + 1; fields(i)%vname="antarctica_icesheet_mass_roc" 
     450                                               fields(i)%grid="grid_scalar" 
     451        i = i + 1; fields(i)%vname="frc_v";          fields(i)%grid="grid_scalar" 
     452        i = i + 1; fields(i)%vname="frc_t";          fields(i)%grid="grid_scalar" 
     453        i = i + 1; fields(i)%vname="frc_s";          fields(i)%grid="grid_scalar" 
     454        i = i + 1; fields(i)%vname="frc_wn_t";       fields(i)%grid="grid_scalar" 
     455        i = i + 1; fields(i)%vname="frc_wn_s";       fields(i)%grid="grid_scalar" 
     456        i = i + 1; fields(i)%vname="ssh_ini";        fields(i)%grid="grid_N" 
     457        i = i + 1; fields(i)%vname="e3t_ini";        fields(i)%grid="grid_N_3D" 
     458        i = i + 1; fields(i)%vname="hc_loc_ini";     fields(i)%grid="grid_N_3D" 
     459        i = i + 1; fields(i)%vname="sc_loc_ini";     fields(i)%grid="grid_N_3D" 
     460        i = i + 1; fields(i)%vname="ssh_hc_loc_ini"; fields(i)%grid="grid_N" 
     461        i = i + 1; fields(i)%vname="ssh_sc_loc_ini"; fields(i)%grid="grid_N" 
     462        i = i + 1; fields(i)%vname="tilde_e3t_b";    fields(i)%grid="grid_N" 
     463        i = i + 1; fields(i)%vname="tilde_e3t_n";    fields(i)%grid="grid_N" 
     464        i = i + 1; fields(i)%vname="hdiv_lf";        fields(i)%grid="grid_N" 
     465        i = i + 1; fields(i)%vname="ub2_b";          fields(i)%grid="grid_N" 
     466        i = i + 1; fields(i)%vname="vb2_b";          fields(i)%grid="grid_N" 
     467        i = i + 1; fields(i)%vname="sshbb_e";        fields(i)%grid="grid_N" 
     468        i = i + 1; fields(i)%vname="ubb_e";          fields(i)%grid="grid_N" 
     469        i = i + 1; fields(i)%vname="vbb_e";          fields(i)%grid="grid_N" 
     470        i = i + 1; fields(i)%vname="sshb_e";         fields(i)%grid="grid_N" 
     471        i = i + 1; fields(i)%vname="ub_e";           fields(i)%grid="grid_N" 
     472        i = i + 1; fields(i)%vname="vb_e";           fields(i)%grid="grid_N" 
     473        i = i + 1; fields(i)%vname="fwf_isf_b";      fields(i)%grid="grid_N" 
     474        i = i + 1; fields(i)%vname="isf_sc_b";       fields(i)%grid="grid_N" 
     475        i = i + 1; fields(i)%vname="isf_hc_b";       fields(i)%grid="grid_N" 
     476        i = i + 1; fields(i)%vname="ssh_ibb";        fields(i)%grid="grid_N" 
     477        i = i + 1; fields(i)%vname="rnf_b";          fields(i)%grid="grid_N" 
     478        i = i + 1; fields(i)%vname="rnf_hc_b";       fields(i)%grid="grid_N" 
     479        i = i + 1; fields(i)%vname="rnf_sc_b";       fields(i)%grid="grid_N" 
     480        i = i + 1; fields(i)%vname="nn_fsbc";        fields(i)%grid="grid_scalar" 
     481        i = i + 1; fields(i)%vname="ssu_m";          fields(i)%grid="grid_N" 
     482        i = i + 1; fields(i)%vname="ssv_m";          fields(i)%grid="grid_N" 
     483        i = i + 1; fields(i)%vname="sst_m";          fields(i)%grid="grid_N" 
     484        i = i + 1; fields(i)%vname="sss_m";          fields(i)%grid="grid_N" 
     485        i = i + 1; fields(i)%vname="ssh_m";          fields(i)%grid="grid_N" 
     486        i = i + 1; fields(i)%vname="e3t_m";          fields(i)%grid="grid_N" 
     487        i = i + 1; fields(i)%vname="frq_m";          fields(i)%grid="grid_N" 
     488        i = i + 1; fields(i)%vname="avmb";           fields(i)%grid="grid_vector" 
     489        i = i + 1; fields(i)%vname="avtb";           fields(i)%grid="grid_vector" 
     490        i = i + 1; fields(i)%vname="ub2_i_b";        fields(i)%grid="grid_N" 
     491        i = i + 1; fields(i)%vname="vb2_i_b";        fields(i)%grid="grid_N" 
     492        i = i + 1; fields(i)%vname="ntime";          fields(i)%grid="grid_scalar" 
     493        i = i + 1; fields(i)%vname="Dsst";           fields(i)%grid="grid_scalar" 
     494        i = i + 1; fields(i)%vname="tmask";          fields(i)%grid="grid_N_3D" 
     495        i = i + 1; fields(i)%vname="umask";          fields(i)%grid="grid_N_3D" 
     496        i = i + 1; fields(i)%vname="vmask";          fields(i)%grid="grid_N_3D" 
     497        i = i + 1; fields(i)%vname="smask";          fields(i)%grid="grid_N_3D" 
     498        i = i + 1; fields(i)%vname="gdepw_n";        fields(i)%grid="grid_N_3D" 
     499        i = i + 1; fields(i)%vname="e3t_n";          fields(i)%grid="grid_N_3D" 
     500        i = i + 1; fields(i)%vname="e3u_n";          fields(i)%grid="grid_N_3D" 
     501        i = i + 1; fields(i)%vname="e3v_n";          fields(i)%grid="grid_N_3D" 
     502        i = i + 1; fields(i)%vname="surf_ini";       fields(i)%grid="grid_N" 
     503        i = i + 1; fields(i)%vname="e3t_b";          fields(i)%grid="grid_N_3D" 
     504        i = i + 1; fields(i)%vname="hmxl_n";         fields(i)%grid="grid_N_3D" 
     505        i = i + 1; fields(i)%vname="un_bf";          fields(i)%grid="grid_N" 
     506        i = i + 1; fields(i)%vname="vn_bf";          fields(i)%grid="grid_N" 
     507        i = i + 1; fields(i)%vname="hbl";            fields(i)%grid="grid_N" 
     508        i = i + 1; fields(i)%vname="hbli";           fields(i)%grid="grid_N" 
     509        i = i + 1; fields(i)%vname="wn";             fields(i)%grid="grid_N_3D" 
     510 
     511        IF( i-1 > max_rst_fields) THEN 
     512           WRITE(ctmp1,*) 'E R R O R : iom_set_rst_vars SIZE of RST_FIELD array is too small' 
     513           CALL ctl_stop( 'iom_set_rst_vars:', ctmp1 ) 
     514        ENDIF 
     515   END SUBROUTINE iom_set_rst_vars 
     516 
     517 
     518   SUBROUTINE iom_set_rstw_active(cdrst_file) 
     519      !!--------------------------------------------------------------------- 
     520      !!                   ***  SUBROUTINE iom_set_rstw_active   *** 
     521      !! 
     522      !! ** Purpose :  define file name in XIOS context for writing restart 
     523      !!               enable variables present in restart file for writing 
     524      !!--------------------------------------------------------------------- 
     525!sets enabled = .TRUE. for each field in restart file 
     526   CHARACTER(len=*) :: cdrst_file 
     527#if defined key_iomput 
     528   TYPE(xios_field) :: field_hdl 
     529   TYPE(xios_file) :: file_hdl 
     530   TYPE(xios_filegroup) :: filegroup_hdl 
     531   INTEGER :: i 
     532   CHARACTER(lc)  ::   clpath 
     533 
     534!set name of the restart file and enable available fields 
     535        IF(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS write) to: ',cdrst_file 
     536        CALL xios_get_handle("file_definition", filegroup_hdl ) 
     537        CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart') 
     538        IF(nxioso.eq.1) THEN  
     539           CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&  
     540                                    mode="write", output_freq=xios_timestep)  
     541           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'  
     542        ELSE   
     543           CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&  
     544                                    mode="write", output_freq=xios_timestep)  
     545           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'  
     546        ENDIF  
     547        CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file)) 
     548!define fields for restart context 
     549        DO i = 1, max_rst_fields 
     550         IF( rst_wfields(i)%active ) THEN 
     551                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_wfields(i)%vname)) 
     552                SELECT CASE (TRIM(rst_wfields(i)%grid)) 
     553                 CASE ("grid_N_3D") 
     554                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     555                        domain_ref="grid_N", axis_ref="nav_lev", prec = 8, operation = "instant") 
     556                 CASE ("grid_N") 
     557                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     558                        domain_ref="grid_N", prec = 8, operation = "instant")  
     559                 CASE ("grid_vector") 
     560                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     561                         axis_ref="nav_lev", prec = 8, operation = "instant") 
     562                 CASE ("grid_scalar") 
     563                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     564                        scalar_ref = "grid_scalar", prec = 8, operation = "instant") 
     565                END SELECT 
     566         ENDIF 
     567        END DO 
     568#endif 
     569   END SUBROUTINE iom_set_rstw_active 
     570 
     571   SUBROUTINE iom_set_rst_context(ld_rstr)  
     572     !!--------------------------------------------------------------------- 
     573      !!                   ***  SUBROUTINE  iom_set_rst_context  *** 
     574      !! 
     575      !! ** Purpose : Define domain, axis and grid for restart (read/write)  
     576      !!              context  
     577      !!                
     578      !!--------------------------------------------------------------------- 
     579   LOGICAL, INTENT(IN)               :: ld_rstr 
     580!ld_rstr is true for restart context. There is no need to define grid for  
     581!restart read, because it's read from file 
     582#if defined key_iomput 
     583   TYPE(xios_domaingroup)            :: domaingroup_hdl  
     584   TYPE(xios_domain)                 :: domain_hdl  
     585   TYPE(xios_axisgroup)              :: axisgroup_hdl  
     586   TYPE(xios_axis)                   :: axis_hdl  
     587   TYPE(xios_scalar)                 :: scalar_hdl  
     588   TYPE(xios_scalargroup)            :: scalargroup_hdl  
     589 
     590     CALL xios_get_handle("domain_definition",domaingroup_hdl)  
     591     CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N")  
     592     CALL set_grid("N", glamt, gphit, .TRUE., ld_rstr)  
     593  
     594     CALL xios_get_handle("axis_definition",axisgroup_hdl)  
     595     CALL xios_add_child(axisgroup_hdl, axis_hdl, "nav_lev")  
     596!AGRIF fails to compile when unit= is in call to xios_set_axis_attr 
     597!    CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels",  unit="m", positive="down")  
     598     CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels in meters", positive="down") 
     599     CALL iom_set_axis_attr( "nav_lev", paxis = gdept_1d )  
     600 
     601     CALL xios_get_handle("scalar_definition", scalargroup_hdl)  
     602     CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar")  
     603#endif 
     604   END SUBROUTINE iom_set_rst_context 
    70605 
    71606   SUBROUTINE iom_swap( cdname ) 
     
    76611      !!--------------------------------------------------------------------- 
    77612      CHARACTER(len=*), INTENT(in) :: cdname 
     613#if defined key_iomput 
     614      TYPE(xios_context) :: nemo_hdl 
     615 
     616      IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
     617        CALL xios_get_handle(TRIM(cdname),nemo_hdl) 
     618      ELSE 
     619        CALL xios_get_handle(TRIM(Agrif_CFixed())//"_"//TRIM(cdname),nemo_hdl) 
     620      ENDIF 
     621      ! 
     622      CALL xios_set_current_context(nemo_hdl) 
     623#endif 
    78624      ! 
    79625   END SUBROUTINE iom_swap 
    80626 
    81627 
    82    SUBROUTINE iom_open( cdname, kiomid, ldwrt, kdom, kiolib, ldstop, ldiof ) 
     628   SUBROUTINE iom_open( cdname, kiomid, ldwrt, kdom, lagrif, ldstop, ldiof, kdlev ) 
    83629      !!--------------------------------------------------------------------- 
    84630      !!                   ***  SUBROUTINE  iom_open  *** 
     
    90636      LOGICAL         , INTENT(in   ), OPTIONAL ::   ldwrt    ! open in write modeb          (default = .FALSE.) 
    91637      INTEGER         , INTENT(in   ), OPTIONAL ::   kdom     ! Type of domain to be written (default = jpdom_local_noovlap) 
    92       INTEGER         , INTENT(in   ), OPTIONAL ::   kiolib   ! library used to open the file (default = jpnf90)  
    93638      LOGICAL         , INTENT(in   ), OPTIONAL ::   ldstop   ! stop if open to read a non-existing file (default = .TRUE.) 
     639      LOGICAL         , INTENT(in   ), OPTIONAL ::   lagrif   ! add 1_ prefix for AGRIF (default = .TRUE. 
    94640      LOGICAL         , INTENT(in   ), OPTIONAL ::   ldiof    ! Interp On the Fly, needed for AGRIF (default = .FALSE.) 
    95  
     641      INTEGER         , INTENT(in   ), OPTIONAL ::   kdlev    ! number of vertical levels 
     642      ! 
    96643      CHARACTER(LEN=256)    ::   clname    ! the name of the file based on cdname [[+clcpu]+clcpu] 
    97644      CHARACTER(LEN=256)    ::   cltmpn    ! tempory name to store clname (in writting mode) 
    98       CHARACTER(LEN=10)     ::   clsuffix  ! ".nc" or ".dimg" 
     645      CHARACTER(LEN=10)     ::   clsuffix  ! ".nc"  
    99646      CHARACTER(LEN=15)     ::   clcpu     ! the cpu number (max jpmax_digits digits) 
    100647      CHARACTER(LEN=256)    ::   clinfo    ! info character 
     
    104651      LOGICAL               ::   llstop    ! local definition of ldstop 
    105652      LOGICAL               ::   lliof     ! local definition of ldiof 
    106       INTEGER               ::   iolib     ! library do we use to open the file 
     653      LOGICAL               ::   llagrif   ! local definition of lagrif 
    107654      INTEGER               ::   icnt      ! counter for digits in clcpu (max = jpmax_digits) 
    108655      INTEGER               ::   iln, ils  ! lengths of character 
     
    137684      ELSE                         ;   llstop = .TRUE. 
    138685      ENDIF 
    139       ! what library do we use to open the file? 
    140       IF( PRESENT(kiolib) ) THEN   ;   iolib = kiolib 
    141       ELSE                         ;   iolib = jpnf90 
     686      ! do we add agrif suffix 
     687      IF( PRESENT(lagrif) ) THEN   ;   llagrif = lagrif 
     688      ELSE                         ;   llagrif = .TRUE. 
    142689      ENDIF 
    143690      ! are we using interpolation on the fly? 
     
    147694      ! do we read the overlap  
    148695      ! ugly patch SM+JMM+RB to overwrite global definition in some cases 
    149       llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif  
     696      llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif 
    150697      ! create the file name by added, if needed, TRIM(Agrif_CFixed()) and TRIM(clsuffix) 
    151698      ! ============= 
    152699      clname   = trim(cdname) 
    153       IF ( .NOT. Agrif_Root() .AND. .NOT. lliof ) THEN 
     700      IF ( .NOT. Agrif_Root() .AND. .NOT. lliof .AND. llagrif) THEN 
    154701         iln    = INDEX(clname,'/')  
    155702         cltmpn = clname(1:iln) 
     
    158705      ENDIF 
    159706      ! which suffix should we use? 
    160       SELECT CASE (iolib) 
    161       CASE (jpnf90   ) ;   clsuffix = '.nc' 
    162       CASE DEFAULT     ;   clsuffix = '' 
    163       END SELECT 
     707      clsuffix = '.nc' 
    164708      ! Add the suffix if needed 
    165709      iln = LEN_TRIM(clname) 
     
    173717      IF( .NOT.llok ) THEN 
    174718         ! we try to add the cpu number to the name 
    175             WRITE(clcpu,*) narea-1 
     719         WRITE(clcpu,*) narea-1 
     720 
    176721         clcpu  = TRIM(ADJUSTL(clcpu)) 
    177722         iln = INDEX(clname,TRIM(clsuffix), back = .TRUE.) 
     
    186731            icnt = icnt + 1 
    187732         END DO 
     733      ELSE 
     734         lxios_sini = .TRUE. 
    188735      ENDIF 
    189736      IF( llwrt ) THEN 
     
    220767         END SELECT 
    221768      ENDIF 
    222       ! Open the NetCDF or RSTDIMG file 
     769      ! Open the NetCDF file 
    223770      ! ============= 
    224771      ! do we have some free file identifier? 
     
    243790      ENDIF 
    244791      IF( istop == nstop ) THEN   ! no error within this routine 
    245          SELECT CASE (iolib) 
    246          CASE (jpnf90   )   ;   CALL iom_nf90_open(    clname, kiomid, llwrt, llok, idompar ) 
    247          CASE DEFAULT 
    248          END SELECT 
     792         CALL iom_nf90_open( clname, kiomid, llwrt, llok, idompar, kdlev = kdlev ) 
    249793      ENDIF 
    250794      ! 
     
    279823         DO jf = i_s, i_e 
    280824            IF( iom_file(jf)%nfid > 0 ) THEN 
    281                SELECT CASE (iom_file(jf)%iolib) 
    282                CASE (jpnf90   )   ;   CALL iom_nf90_close(    jf ) 
    283                CASE DEFAULT 
    284                END SELECT 
     825               CALL iom_nf90_close( jf ) 
    285826               iom_file(jf)%nfid       = 0          ! free the id  
    286827               IF( PRESENT(kiomid) )   kiomid = 0   ! return 0 as id to specify that the file was closed 
     
    304845      INTEGER              , INTENT(in   )           ::   kiomid   ! file Identifier 
    305846      CHARACTER(len=*)     , INTENT(in   )           ::   cdvar    ! name of the variable 
    306       INTEGER, DIMENSION(:), INTENT(  out), OPTIONAL ::   kdimsz   ! size of the dimensions 
     847      INTEGER, DIMENSION(:), INTENT(  out), OPTIONAL ::   kdimsz   ! size of each dimension 
    307848      INTEGER,               INTENT(  out), OPTIONAL ::   kndims   ! size of the dimensions 
    308849      LOGICAL              , INTENT(in   ), OPTIONAL ::   ldstop   ! stop if looking for non-existing variable (default = .TRUE.) 
     
    335876               iiv = iiv + 1 
    336877               IF( iiv <= jpmax_vars ) THEN 
    337                   SELECT CASE (iom_file(kiomid)%iolib) 
    338                   CASE (jpnf90   )   ;   iom_varid = iom_nf90_varid  ( kiomid, cdvar, iiv, kdimsz, kndims ) 
    339                   CASE DEFAULT    
    340                   END SELECT 
     878                  iom_varid = iom_nf90_varid( kiomid, cdvar, iiv, kdimsz, kndims ) 
    341879               ELSE 
    342880                  CALL ctl_stop( trim(clinfo), 'Too many variables in the file '//iom_file(kiomid)%name,   & 
    343                         &                         'increase the parameter jpmax_vars') 
     881                        &                      'increase the parameter jpmax_vars') 
    344882               ENDIF 
    345883               IF( llstop .AND. iom_varid == -1 )   CALL ctl_stop( TRIM(clinfo)//' not found' )  
     
    348886               IF( PRESENT(kdimsz) ) THEN  
    349887                  i_nvd = iom_file(kiomid)%ndims(iiv) 
    350                   IF( i_nvd == size(kdimsz) ) THEN 
    351                      kdimsz(:) = iom_file(kiomid)%dimsz(1:i_nvd,iiv) 
     888                  IF( i_nvd <= size(kdimsz) ) THEN 
     889                     kdimsz(1:i_nvd) = iom_file(kiomid)%dimsz(1:i_nvd,iiv) 
    352890                  ELSE 
    353891                     WRITE(ctmp1,*) i_nvd, size(kdimsz) 
     
    366904   !!                   INTERFACE iom_get 
    367905   !!---------------------------------------------------------------------- 
    368    SUBROUTINE iom_g0d( kiomid, cdvar, pvar, ktime ) 
     906   SUBROUTINE iom_g0d( kiomid, cdvar, pvar, ktime, ldxios ) 
    369907      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
    370908      CHARACTER(len=*), INTENT(in   )                 ::   cdvar     ! Name of the variable 
    371909      REAL(wp)        , INTENT(  out)                 ::   pvar      ! read field 
    372910      INTEGER         , INTENT(in   ),     OPTIONAL   ::   ktime     ! record number 
     911      LOGICAL         , INTENT(in   ),     OPTIONAL   ::   ldxios    ! use xios to read restart 
    373912      ! 
    374913      INTEGER                                         ::   idvar     ! variable id 
     
    378917      CHARACTER(LEN=100)                              ::   clname    ! file name 
    379918      CHARACTER(LEN=1)                                ::   cldmspc   ! 
    380       ! 
    381       itime = 1 
    382       IF( PRESENT(ktime) ) itime = ktime 
    383       ! 
    384       clname = iom_file(kiomid)%name 
    385       clinfo = '          iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar) 
    386       ! 
    387       IF( kiomid > 0 ) THEN 
    388          idvar = iom_varid( kiomid, cdvar ) 
    389          IF( iom_file(kiomid)%nfid > 0 .AND. idvar > 0 ) THEN 
    390             idmspc = iom_file ( kiomid )%ndims( idvar ) 
    391             IF( iom_file(kiomid)%luld(idvar) )  idmspc = idmspc - 1 
    392             WRITE(cldmspc , fmt='(i1)') idmspc 
    393             IF( idmspc > 0 )  CALL ctl_stop( TRIM(clinfo), 'When reading to a 0D array, we do not accept data', & 
    394                                  &                         'with 1 or more spatial dimensions: '//cldmspc//' were found.' , & 
    395                                  &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
    396             SELECT CASE (iom_file(kiomid)%iolib) 
    397             CASE (jpnf90   )   ;   CALL iom_nf90_get(    kiomid, idvar, pvar, itime ) 
    398             CASE DEFAULT     
    399             END SELECT 
     919      LOGICAL                                         ::   llxios 
     920      ! 
     921      llxios = .FALSE. 
     922      IF( PRESENT(ldxios) ) llxios = ldxios 
     923 
     924      IF(.NOT.llxios) THEN  ! read data using default library 
     925         itime = 1 
     926         IF( PRESENT(ktime) ) itime = ktime 
     927         ! 
     928         clname = iom_file(kiomid)%name 
     929         clinfo = '          iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar) 
     930         ! 
     931         IF( kiomid > 0 ) THEN 
     932            idvar = iom_varid( kiomid, cdvar ) 
     933            IF( iom_file(kiomid)%nfid > 0 .AND. idvar > 0 ) THEN 
     934               idmspc = iom_file ( kiomid )%ndims( idvar ) 
     935               IF( iom_file(kiomid)%luld(idvar) )  idmspc = idmspc - 1 
     936               WRITE(cldmspc , fmt='(i1)') idmspc 
     937               IF( idmspc > 0 )  CALL ctl_stop( TRIM(clinfo), 'When reading to a 0D array, we do not accept data', & 
     938                                    &                         'with 1 or more spatial dimensions: '//cldmspc//' were found.' , & 
     939                                    &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     940               CALL iom_nf90_get( kiomid, idvar, pvar, itime ) 
     941            ENDIF 
    400942         ENDIF 
     943      ELSE 
     944#if defined key_iomput 
     945         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar) 
     946         CALL iom_swap( TRIM(crxios_context) ) 
     947         CALL xios_recv_field( trim(cdvar), pvar) 
     948         CALL iom_swap( TRIM(cxios_context) ) 
     949#else 
     950         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//trim(clname)//', var:'//trim(cdvar) 
     951         CALL ctl_stop( 'iom_g0d', ctmp1 ) 
     952#endif 
    401953      ENDIF 
    402954   END SUBROUTINE iom_g0d 
    403955 
    404    SUBROUTINE iom_g1d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 
     956   SUBROUTINE iom_g1d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios ) 
    405957      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    406958      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    410962      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kstart    ! start axis position of the reading  
    411963      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis 
     964      LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    412965      ! 
    413966      IF( kiomid > 0 ) THEN 
    414967         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r1d=pvar,   & 
    415               &                                                     ktime=ktime, kstart=kstart, kcount=kcount ) 
     968              &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
     969              &                                                     ldxios=ldxios ) 
    416970      ENDIF 
    417971   END SUBROUTINE iom_g1d 
    418972 
    419    SUBROUTINE iom_g2d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr ) 
     973   SUBROUTINE iom_g2d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios) 
    420974      INTEGER         , INTENT(in   )                           ::   kiomid    ! Identifier of the file 
    421975      INTEGER         , INTENT(in   )                           ::   kdom      ! Type of domain to be read 
     
    429983                                                                               ! called open_ocean_jstart to set the start 
    430984                                                                               ! value for the 2nd dimension (netcdf only) 
     985      LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios      ! read data using XIOS 
    431986      ! 
    432987      IF( kiomid > 0 ) THEN 
    433988         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r2d=pvar,   & 
    434989              &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
    435               &                                                     lrowattr=lrowattr ) 
     990              &                                                     lrowattr=lrowattr,  ldxios=ldxios) 
    436991      ENDIF 
    437992   END SUBROUTINE iom_g2d 
    438993 
    439    SUBROUTINE iom_g3d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr ) 
     994   SUBROUTINE iom_g3d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios ) 
    440995      INTEGER         , INTENT(in   )                             ::   kiomid    ! Identifier of the file 
    441996      INTEGER         , INTENT(in   )                             ::   kdom      ! Type of domain to be read 
     
    4491004                                                                                 ! called open_ocean_jstart to set the start 
    4501005                                                                                 ! value for the 2nd dimension (netcdf only) 
     1006      LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios        ! read data using XIOS 
    4511007      ! 
    4521008      IF( kiomid > 0 ) THEN 
    4531009         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r3d=pvar,   & 
    4541010              &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
    455               &                                                     lrowattr=lrowattr ) 
     1011              &                                                     lrowattr=lrowattr, ldxios=ldxios ) 
    4561012      ENDIF 
    4571013   END SUBROUTINE iom_g3d 
     
    4611017         &                  pv_r1d, pv_r2d, pv_r3d,   & 
    4621018         &                  ktime , kstart, kcount,   & 
    463          &                  lrowattr                ) 
     1019         &                  lrowattr, ldxios        ) 
    4641020      !!----------------------------------------------------------------------- 
    4651021      !!                  ***  ROUTINE  iom_get_123d  *** 
     
    4821038                                                                           ! called open_ocean_jstart to set the start 
    4831039                                                                           ! value for the 2nd dimension (netcdf only) 
    484       ! 
     1040      LOGICAL                    , INTENT(in   ), OPTIONAL ::   ldxios     ! use XIOS to read restart 
     1041      ! 
     1042      LOGICAL                        ::   llxios       ! local definition for XIOS read 
    4851043      LOGICAL                        ::   llnoov      ! local definition to read overlap 
    4861044      LOGICAL                        ::   luse_jattr  ! local definition to read open_ocean_jstart file attribute 
     
    5061064      CHARACTER(LEN=256)             ::   clname      ! file name 
    5071065      CHARACTER(LEN=1)               ::   clrankpv, cldmspc      !  
     1066      LOGICAL                        ::   ll_depth_spec ! T => if kstart, kcount present then *only* use values for 3rd spatial dimension. 
     1067      INTEGER                        ::   inlev       ! number of levels for 3D data 
     1068      REAL(wp)                       ::   gma, gmi 
    5081069      !--------------------------------------------------------------------- 
    5091070      ! 
    510       clname = iom_file(kiomid)%name   !   esier to read 
    511       clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar) 
    512       ! local definition of the domain ? 
     1071      inlev = -1 
     1072      IF( PRESENT(pv_r3d) )   inlev = SIZE(pv_r3d, 3) 
     1073      ! 
     1074      llxios = .FALSE. 
     1075      if(PRESENT(ldxios)) llxios = ldxios 
     1076      idvar = iom_varid( kiomid, cdvar )  
    5131077      idom = kdom 
    514       ! do we read the overlap  
    515       ! ugly patch SM+JMM+RB to overwrite global definition in some cases 
    516       llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif  
    517       ! check kcount and kstart optionals parameters... 
    518       IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) ) CALL ctl_stop(trim(clinfo), 'kcount present needs kstart present') 
    519       IF( PRESENT(kstart) .AND. (.NOT. PRESENT(kcount)) ) CALL ctl_stop(trim(clinfo), 'kstart present needs kcount present') 
    520       IF( PRESENT(kstart) .AND. idom /= jpdom_unknown   ) CALL ctl_stop(trim(clinfo), 'kstart present needs kdom = jpdom_unknown') 
    521  
    522       luse_jattr = .false. 
    523       IF( PRESENT(lrowattr) ) THEN 
    524          IF( lrowattr .AND. idom /= jpdom_data   ) CALL ctl_stop(trim(clinfo), 'lrowattr present and true needs kdom = jpdom_data') 
    525          IF( lrowattr .AND. idom == jpdom_data   ) luse_jattr = .true. 
    526       ENDIF 
    527       IF( luse_jattr ) THEN 
    528          SELECT CASE (iom_file(kiomid)%iolib) 
    529          CASE (jpnf90   )    
    530              ! Ok 
    531          CASE DEFAULT     
    532          END SELECT 
    533       ENDIF 
    534  
    535       ! Search for the variable in the data base (eventually actualize data) 
    536       istop = nstop 
    537       idvar = iom_varid( kiomid, cdvar ) 
    538       ! 
    539       IF( idvar > 0 ) THEN 
    540          ! to write iom_file(kiomid)%dimsz in a shorter way ! 
    541          idimsz(:) = iom_file(kiomid)%dimsz(:, idvar)  
    542          inbdim = iom_file(kiomid)%ndims(idvar)            ! number of dimensions in the file 
    543          idmspc = inbdim                                   ! number of spatial dimensions in the file 
    544          IF( iom_file(kiomid)%luld(idvar) )   idmspc = inbdim - 1 
    545          IF( idmspc > 3 )   CALL ctl_stop(trim(clinfo), 'the file has more than 3 spatial dimensions this case is not coded...')  
     1078      ! 
     1079      IF(.NOT.llxios) THEN 
     1080         clname = iom_file(kiomid)%name   !   esier to read 
     1081         clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar) 
     1082         ! local definition of the domain ? 
     1083         ! do we read the overlap  
     1084         ! ugly patch SM+JMM+RB to overwrite global definition in some cases 
     1085         llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif  
     1086         ! check kcount and kstart optionals parameters... 
     1087         IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) ) CALL ctl_stop(trim(clinfo), 'kcount present needs kstart present') 
     1088         IF( PRESENT(kstart) .AND. (.NOT. PRESENT(kcount)) ) CALL ctl_stop(trim(clinfo), 'kstart present needs kcount present') 
     1089         IF( PRESENT(kstart) .AND. idom /= jpdom_unknown .AND.  idom /= jpdom_autoglo_xy  ) & 
     1090     &          CALL ctl_stop(trim(clinfo), 'kstart present needs kdom = jpdom_unknown or kdom = jpdom_autoglo_xy') 
     1091 
     1092         luse_jattr = .false. 
     1093         IF( PRESENT(lrowattr) ) THEN 
     1094            IF( lrowattr .AND. idom /= jpdom_data   ) CALL ctl_stop(trim(clinfo), 'lrowattr present and true needs kdom = jpdom_data') 
     1095            IF( lrowattr .AND. idom == jpdom_data   ) luse_jattr = .true. 
     1096         ENDIF 
     1097 
     1098         ! Search for the variable in the data base (eventually actualize data) 
     1099         istop = nstop 
    5461100         ! 
    547          ! update idom definition... 
    548          ! Identify the domain in case of jpdom_auto(glo/dta) definition 
    549          IF( idom == jpdom_autoglo .OR. idom == jpdom_autodta ) THEN             
    550             IF( idom == jpdom_autoglo ) THEN   ;   idom = jpdom_global  
    551             ELSE                               ;   idom = jpdom_data 
     1101         IF( idvar > 0 ) THEN 
     1102            ! to write iom_file(kiomid)%dimsz in a shorter way ! 
     1103            idimsz(:) = iom_file(kiomid)%dimsz(:, idvar)  
     1104            inbdim = iom_file(kiomid)%ndims(idvar)            ! number of dimensions in the file 
     1105            idmspc = inbdim                                   ! number of spatial dimensions in the file 
     1106            IF( iom_file(kiomid)%luld(idvar) )   idmspc = inbdim - 1 
     1107            IF( idmspc > 3 )   CALL ctl_stop(trim(clinfo), 'the file has more than 3 spatial dimensions this case is not coded...')  
     1108            ! 
     1109            ! update idom definition... 
     1110            ! Identify the domain in case of jpdom_auto(glo/dta) definition 
     1111            IF( idom == jpdom_autoglo_xy ) THEN 
     1112               ll_depth_spec = .TRUE. 
     1113               idom = jpdom_autoglo 
     1114            ELSE 
     1115               ll_depth_spec = .FALSE. 
    5521116            ENDIF 
    553             ind1 = INDEX( clname, '_', back = .TRUE. ) + 1 
    554             ind2 = INDEX( clname, '.', back = .TRUE. ) - 1 
    555             IF( ind2 > ind1 ) THEN   ;   IF( VERIFY( clname(ind1:ind2), '0123456789' ) == 0 )   idom = jpdom_local   ;   ENDIF 
    556          ENDIF 
    557          ! Identify the domain in case of jpdom_local definition 
    558          IF( idom == jpdom_local ) THEN 
    559             IF(     idimsz(1) == jpi               .AND. idimsz(2) == jpj               ) THEN   ;   idom = jpdom_local_full 
    560             ELSEIF( idimsz(1) == nlci              .AND. idimsz(2) == nlcj              ) THEN   ;   idom = jpdom_local_noextra 
    561             ELSEIF( idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1) ) THEN   ;   idom = jpdom_local_noovlap 
    562             ELSE   ;   CALL ctl_stop( trim(clinfo), 'impossible to identify the local domain' ) 
     1117            IF( idom == jpdom_autoglo .OR. idom == jpdom_autodta ) THEN             
     1118               IF( idom == jpdom_autoglo ) THEN   ;   idom = jpdom_global  
     1119               ELSE                               ;   idom = jpdom_data 
     1120               ENDIF 
     1121               ind1 = INDEX( clname, '_', back = .TRUE. ) + 1 
     1122               ind2 = INDEX( clname, '.', back = .TRUE. ) - 1 
     1123               IF( ind2 > ind1 ) THEN   ;   IF( VERIFY( clname(ind1:ind2), '0123456789' ) == 0 )   idom = jpdom_local   ;   ENDIF 
    5631124            ENDIF 
    564          ENDIF 
    565          ! 
    566          ! check the consistency between input array and data rank in the file 
    567          ! 
    568          ! initializations 
    569          itime = 1 
    570          IF( PRESENT(ktime) ) itime = ktime 
    571  
    572          irankpv = 1 * COUNT( (/PRESENT(pv_r1d)/) ) + 2 * COUNT( (/PRESENT(pv_r2d)/) ) + 3 * COUNT( (/PRESENT(pv_r3d)/) ) 
    573          WRITE(clrankpv, fmt='(i1)') irankpv 
    574          WRITE(cldmspc , fmt='(i1)') idmspc 
    575          ! 
    576          IF(     idmspc <  irankpv ) THEN  
    577             CALL ctl_stop( TRIM(clinfo), 'The file has only '//cldmspc//' spatial dimension',   & 
    578                &                         'it is impossible to read a '//clrankpv//'D array from this file...' ) 
    579          ELSEIF( idmspc == irankpv ) THEN 
    580             IF( PRESENT(pv_r1d) .AND. idom /= jpdom_unknown )   & 
    581                &   CALL ctl_stop( TRIM(clinfo), 'case not coded...You must use jpdom_unknown' ) 
    582          ELSEIF( idmspc >  irankpv ) THEN 
    583                IF( PRESENT(pv_r2d) .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN 
    584                   CALL ctl_warn( trim(clinfo), '2D array but 3 spatial dimensions for the data...'              ,   & 
    585                         &         'As the size of the z dimension is 1 and as we try to read the first record, ',   & 
    586                         &         'we accept this case, even if there is a possible mix-up between z and time dimension' )    
    587                   idmspc = idmspc - 1 
    588                ELSE 
    589                   CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,'         ,   & 
    590                      &                         'we do not accept data with '//cldmspc//' spatial dimensions',   & 
    591                      &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     1125            ! Identify the domain in case of jpdom_local definition 
     1126            IF( idom == jpdom_local ) THEN 
     1127               IF(     idimsz(1) == jpi               .AND. idimsz(2) == jpj               ) THEN   ;   idom = jpdom_local_full 
     1128               ELSEIF( idimsz(1) == nlci              .AND. idimsz(2) == nlcj              ) THEN   ;   idom = jpdom_local_noextra 
     1129               ELSEIF( idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1) ) THEN   ;   idom = jpdom_local_noovlap 
     1130               ELSE   ;   CALL ctl_stop( trim(clinfo), 'impossible to identify the local domain' ) 
    5921131               ENDIF 
    593          ENDIF 
    594  
    595          ! 
    596          ! definition of istart and icnt 
    597          ! 
    598          icnt  (:) = 1 
    599          istart(:) = 1 
    600          istart(idmspc+1) = itime 
    601  
    602          IF(              PRESENT(kstart)       ) THEN ; istart(1:idmspc) = kstart(1:idmspc) ; icnt(1:idmspc) = kcount(1:idmspc) 
    603          ELSE 
    604             IF(           idom == jpdom_unknown ) THEN                                       ; icnt(1:idmspc) = idimsz(1:idmspc) 
    605             ELSE  
    606                IF( .NOT. PRESENT(pv_r1d) ) THEN   !   not a 1D array 
    607                   IF(     idom == jpdom_data    ) THEN 
    608                      jstartrow = 1 
    609                      IF( luse_jattr ) THEN 
    610                         CALL iom_getatt(kiomid, 'open_ocean_jstart', jstartrow ) ! -999 is returned if the attribute is not found 
    611                         jstartrow = MAX(1,jstartrow) 
     1132            ENDIF 
     1133            ! 
     1134            ! check the consistency between input array and data rank in the file 
     1135            ! 
     1136            ! initializations 
     1137            itime = 1 
     1138            IF( PRESENT(ktime) ) itime = ktime 
     1139            ! 
     1140            irankpv = 1 * COUNT( (/PRESENT(pv_r1d)/) ) + 2 * COUNT( (/PRESENT(pv_r2d)/) ) + 3 * COUNT( (/PRESENT(pv_r3d)/) ) 
     1141            WRITE(clrankpv, fmt='(i1)') irankpv 
     1142            WRITE(cldmspc , fmt='(i1)') idmspc 
     1143            ! 
     1144            IF(     idmspc <  irankpv ) THEN  
     1145               CALL ctl_stop( TRIM(clinfo), 'The file has only '//cldmspc//' spatial dimension',   & 
     1146                  &                         'it is impossible to read a '//clrankpv//'D array from this file...' ) 
     1147            ELSEIF( idmspc == irankpv ) THEN 
     1148               IF( PRESENT(pv_r1d) .AND. idom /= jpdom_unknown )   & 
     1149                  &   CALL ctl_stop( TRIM(clinfo), 'case not coded...You must use jpdom_unknown' ) 
     1150            ELSEIF( idmspc >  irankpv ) THEN 
     1151                  IF( PRESENT(pv_r2d) .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN 
     1152                     CALL ctl_warn( trim(clinfo), '2D array but 3 spatial dimensions for the data...'              ,   & 
     1153                           &         'As the size of the z dimension is 1 and as we try to read the first record, ',   & 
     1154                           &         'we accept this case, even if there is a possible mix-up between z and time dimension' )    
     1155                     idmspc = idmspc - 1 
     1156                  ELSE 
     1157                     CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,'         ,   & 
     1158                        &                         'we do not accept data with '//cldmspc//' spatial dimensions',   & 
     1159                        &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     1160                  ENDIF 
     1161            ENDIF 
     1162            ! 
     1163            ! definition of istart and icnt 
     1164            ! 
     1165            icnt  (:) = 1 
     1166            istart(:) = 1 
     1167            istart(idmspc+1) = itime 
     1168    
     1169            IF( PRESENT(kstart) .AND. .NOT. ll_depth_spec ) THEN  
     1170               istart(1:idmspc) = kstart(1:idmspc)  
     1171               icnt  (1:idmspc) = kcount(1:idmspc) 
     1172            ELSE 
     1173               IF(idom == jpdom_unknown ) THEN 
     1174                  icnt(1:idmspc) = idimsz(1:idmspc) 
     1175               ELSE  
     1176                  IF( .NOT. PRESENT(pv_r1d) ) THEN   !   not a 1D array 
     1177                     IF(     idom == jpdom_data    ) THEN 
     1178                        jstartrow = 1 
     1179                        IF( luse_jattr ) THEN 
     1180                           CALL iom_getatt(kiomid, 'open_ocean_jstart', jstartrow ) ! -999 is returned if the attribute is not found 
     1181                           jstartrow = MAX(1,jstartrow) 
     1182                        ENDIF 
     1183                        istart(1:2) = (/ mig(1), mjg(1) + jstartrow - 1 /)  ! icnt(1:2) done below 
     1184                     ELSEIF( idom == jpdom_global  ) THEN ; istart(1:2) = (/ nimpp , njmpp  /)  ! icnt(1:2) done below 
    6121185                     ENDIF 
    613                      istart(1:2) = (/ mig(1), mjg(1) + jstartrow - 1 /)  ! icnt(1:2) done below 
    614                   ELSEIF( idom == jpdom_global  ) THEN ; istart(1:2) = (/ nimpp , njmpp  /)  ! icnt(1:2) done below 
    615                   ENDIF 
    616                   ! we do not read the overlap                     -> we start to read at nldi, nldj 
     1186                     ! we do not read the overlap                     -> we start to read at nldi, nldj 
    6171187! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    6181188!                  IF( idom /= jpdom_local_noovlap )   istart(1:2) = istart(1:2) + (/ nldi - 1, nldj - 1 /) 
    619                   IF( llnoov .AND. idom /= jpdom_local_noovlap ) istart(1:2) = istart(1:2) + (/ nldi - 1, nldj - 1 /) 
     1189                     IF( llnoov .AND. idom /= jpdom_local_noovlap ) istart(1:2) = istart(1:2) + (/ nldi - 1, nldj - 1 /) 
    6201190                  ! we do not read the overlap and the extra-halos -> from nldi to nlei and from nldj to nlej  
    6211191! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    6221192!                  icnt(1:2) = (/ nlei - nldi + 1, nlej - nldj + 1 /) 
    623                   IF( llnoov ) THEN   ;   icnt(1:2) = (/ nlei - nldi + 1, nlej - nldj + 1 /) 
    624                   ELSE                ;   icnt(1:2) = (/ nlci           , nlcj            /) 
    625                   ENDIF 
    626                   IF( PRESENT(pv_r3d) ) THEN 
    627                      IF( idom == jpdom_data ) THEN   ; icnt(3) = jpkdta 
    628                      ELSE                            ; icnt(3) = jpk 
     1193                     IF( llnoov ) THEN   ;   icnt(1:2) = (/ nlei - nldi + 1, nlej - nldj + 1 /) 
     1194                     ELSE                ;   icnt(1:2) = (/ nlci           , nlcj            /) 
     1195                     ENDIF 
     1196                     IF( PRESENT(pv_r3d) ) THEN 
     1197                        IF( idom == jpdom_data ) THEN                        ;                               icnt(3) = inlev 
     1198                        ELSEIF( ll_depth_spec .AND. PRESENT(kstart) ) THEN   ;   istart(3) = kstart(3)   ;   icnt(3) = kcount(3) 
     1199                        ELSE                                                 ;                               icnt(3) = inlev 
     1200                        ENDIF 
    6291201                     ENDIF 
    6301202                  ENDIF 
    6311203               ENDIF 
    6321204            ENDIF 
    633          ENDIF 
    634  
    635          ! check that istart and icnt can be used with this file 
    636          !- 
    637          DO jl = 1, jpmax_dims 
    638             itmp = istart(jl)+icnt(jl)-1 
    639             IF( itmp > idimsz(jl) .AND. idimsz(jl) /= 0 ) THEN 
    640                WRITE( ctmp1, FMT="('(istart(', i1, ') + icnt(', i1, ') - 1) = ', i5)" ) jl, jl, itmp 
    641                WRITE( ctmp2, FMT="(' is larger than idimsz(', i1,') = ', i5)"         ) jl, idimsz(jl) 
    642                CALL ctl_stop( trim(clinfo), 'start and count too big regarding to the size of the data, ', ctmp1, ctmp2 )      
    643             ENDIF 
    644          END DO 
    645  
    646          ! check that icnt matches the input array 
    647          !-      
    648          IF( idom == jpdom_unknown ) THEN 
    649             IF( irankpv == 1 )        ishape(1:1) = SHAPE(pv_r1d) 
    650             IF( irankpv == 2 )        ishape(1:2) = SHAPE(pv_r2d) 
    651             IF( irankpv == 3 )        ishape(1:3) = SHAPE(pv_r3d) 
    652             ctmp1 = 'd' 
    653          ELSE 
    654             IF( irankpv == 2 ) THEN 
     1205 
     1206            ! check that istart and icnt can be used with this file 
     1207            !- 
     1208            DO jl = 1, jpmax_dims 
     1209               itmp = istart(jl)+icnt(jl)-1 
     1210               IF( itmp > idimsz(jl) .AND. idimsz(jl) /= 0 ) THEN 
     1211                  WRITE( ctmp1, FMT="('(istart(', i1, ') + icnt(', i1, ') - 1) = ', i5)" ) jl, jl, itmp 
     1212                  WRITE( ctmp2, FMT="(' is larger than idimsz(', i1,') = ', i5)"         ) jl, idimsz(jl) 
     1213                  CALL ctl_stop( trim(clinfo), 'start and count too big regarding to the size of the data, ', ctmp1, ctmp2 )      
     1214               ENDIF 
     1215            END DO 
     1216 
     1217            ! check that icnt matches the input array 
     1218            !-      
     1219            IF( idom == jpdom_unknown ) THEN 
     1220               IF( irankpv == 1 )        ishape(1:1) = SHAPE(pv_r1d) 
     1221               IF( irankpv == 2 )        ishape(1:2) = SHAPE(pv_r2d) 
     1222               IF( irankpv == 3 )        ishape(1:3) = SHAPE(pv_r3d) 
     1223               ctmp1 = 'd' 
     1224            ELSE 
     1225               IF( irankpv == 2 ) THEN 
    6551226! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    6561227!               ishape(1:2) = SHAPE(pv_r2d(nldi:nlei,nldj:nlej  ))   ;   ctmp1 = 'd(nldi:nlei,nldj:nlej)' 
    657                IF( llnoov ) THEN ; ishape(1:2)=SHAPE(pv_r2d(nldi:nlei,nldj:nlej  )) ; ctmp1='d(nldi:nlei,nldj:nlej)' 
    658                ELSE              ; ishape(1:2)=SHAPE(pv_r2d(1   :nlci,1   :nlcj  )) ; ctmp1='d(1:nlci,1:nlcj)' 
     1228                  IF( llnoov ) THEN ; ishape(1:2)=SHAPE(pv_r2d(nldi:nlei,nldj:nlej  )) ; ctmp1='d(nldi:nlei,nldj:nlej)' 
     1229                  ELSE              ; ishape(1:2)=SHAPE(pv_r2d(1   :nlci,1   :nlcj  )) ; ctmp1='d(1:nlci,1:nlcj)' 
     1230                  ENDIF 
     1231               ENDIF 
     1232               IF( irankpv == 3 ) THEN  
     1233! JMM + SM: ugly patch before getting the new version of lib_mpp) 
     1234!               ishape(1:3) = SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:))   ;   ctmp1 = 'd(nldi:nlei,nldj:nlej,:)' 
     1235                  IF( llnoov ) THEN ; ishape(1:3)=SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:)) ; ctmp1='d(nldi:nlei,nldj:nlej,:)' 
     1236                  ELSE              ; ishape(1:3)=SHAPE(pv_r3d(1   :nlci,1   :nlcj,:)) ; ctmp1='d(1:nlci,1:nlcj,:)' 
     1237                  ENDIF 
    6591238               ENDIF 
    6601239            ENDIF 
    661             IF( irankpv == 3 ) THEN  
    662 ! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    663 !               ishape(1:3) = SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:))   ;   ctmp1 = 'd(nldi:nlei,nldj:nlej,:)' 
    664                IF( llnoov ) THEN ; ishape(1:3)=SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:)) ; ctmp1='d(nldi:nlei,nldj:nlej,:)' 
    665                ELSE              ; ishape(1:3)=SHAPE(pv_r3d(1   :nlci,1   :nlcj,:)) ; ctmp1='d(1:nlci,1:nlcj,:)' 
    666                ENDIF 
    667             ENDIF 
     1240          
     1241            DO jl = 1, irankpv 
     1242               WRITE( ctmp2, FMT="(', ', i1,'): ', i5,' /= icnt(', i1,'):', i5)" ) jl, ishape(jl), jl, icnt(jl) 
     1243               IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pv_r'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) ) 
     1244            END DO 
     1245 
    6681246         ENDIF 
    669           
    670          DO jl = 1, irankpv 
    671             WRITE( ctmp2, FMT="(', ', i1,'): ', i5,' /= icnt(', i1,'):', i5)" ) jl, ishape(jl), jl, icnt(jl) 
    672             IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pv_r'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) ) 
    673          END DO 
    674  
    675       ENDIF 
    676  
    677       ! read the data 
    678       !-      
    679       IF( idvar > 0 .AND. istop == nstop ) THEN   ! no additional errors until this point... 
    680          ! 
     1247 
     1248         ! read the data 
     1249         !-      
     1250         IF( idvar > 0 .AND. istop == nstop ) THEN   ! no additional errors until this point... 
     1251            ! 
    6811252         ! find the right index of the array to be read 
    6821253! JMM + SM: ugly patch before getting the new version of lib_mpp) 
     
    6841255!         ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
    6851256!         ENDIF 
    686          IF( llnoov ) THEN 
    687             IF( idom /= jpdom_unknown ) THEN   ;   ix1 = nldi   ;   ix2 = nlei      ;   iy1 = nldj   ;   iy2 = nlej 
    688             ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1257            IF( llnoov ) THEN 
     1258               IF( idom /= jpdom_unknown ) THEN   ;   ix1 = nldi   ;   ix2 = nlei      ;   iy1 = nldj   ;   iy2 = nlej 
     1259               ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1260               ENDIF 
     1261            ELSE 
     1262               IF( idom /= jpdom_unknown ) THEN   ;   ix1 = 1      ;   ix2 = nlci      ;   iy1 = 1      ;   iy2 = nlcj 
     1263               ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1264               ENDIF 
     1265            ENDIF 
     1266       
     1267            CALL iom_nf90_get( kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2, pv_r1d, pv_r2d, pv_r3d ) 
     1268 
     1269            IF( istop == nstop ) THEN   ! no additional errors until this point... 
     1270               IF(lwp) WRITE(numout,"(10x,' read ',a,' (rec: ',i6,') in ',a,' ok')") TRIM(cdvar), itime, TRIM(iom_file(kiomid)%name) 
     1271              
     1272               !--- overlap areas and extra hallows (mpp) 
     1273               IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown ) THEN 
     1274                  CALL lbc_lnk( 'iom', pv_r2d,'Z',-999.,'no0' ) 
     1275               ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown ) THEN 
     1276                  ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 
     1277                  IF( icnt(3) == inlev ) THEN 
     1278                     CALL lbc_lnk( 'iom', pv_r3d,'Z',-999.,'no0' ) 
     1279                  ELSE   ! put some arbitrary value (a call to lbc_lnk will be done later...) 
     1280                     DO jj = nlcj+1, jpj   ;   pv_r3d(1:nlci, jj, :) = pv_r3d(1:nlci, nlej, :)   ;   END DO 
     1281                     DO ji = nlci+1, jpi   ;   pv_r3d(ji    , : , :) = pv_r3d(nlei  , :   , :)   ;   END DO 
     1282                  ENDIF 
     1283               ENDIF 
     1284               ! 
     1285            ELSE 
     1286               ! return if istop == nstop is false 
     1287               RETURN 
    6891288            ENDIF 
    6901289         ELSE 
    691             IF( idom /= jpdom_unknown ) THEN   ;   ix1 = 1      ;   ix2 = nlci      ;   iy1 = 1      ;   iy2 = nlcj 
    692             ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
    693             ENDIF 
    694          ENDIF 
    695        
    696          SELECT CASE (iom_file(kiomid)%iolib) 
    697          CASE (jpnf90   )   ;   CALL iom_nf90_get(    kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2,   & 
    698             &                                         pv_r1d, pv_r2d, pv_r3d ) 
    699          CASE DEFAULT     
    700          END SELECT 
    701  
    702          IF( istop == nstop ) THEN   ! no additional errors until this point... 
    703             IF(lwp) WRITE(numout,"(10x,' read ',a,' (rec: ',i6,') in ',a,' ok')") TRIM(cdvar), itime, TRIM(iom_file(kiomid)%name) 
    704            
    705             !--- overlap areas and extra hallows (mpp) 
    706             IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown ) THEN 
    707                CALL lbc_lnk( pv_r2d,'Z',-999.,'no0' ) 
    708             ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown ) THEN 
    709                ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 
    710                IF( icnt(3) == jpk ) THEN 
    711                   CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
    712                ELSE   ! put some arbitrary value (a call to lbc_lnk will be done later...) 
    713                   DO jj = nlcj+1, jpj   ;   pv_r3d(1:nlci, jj, :) = pv_r3d(1:nlci, nlej, :)   ;   END DO 
    714                   DO ji = nlci+1, jpi   ;   pv_r3d(ji    , : , :) = pv_r3d(nlei  , :   , :)   ;   END DO 
    715                ENDIF 
    716             ENDIF 
    717              
    718             !--- Apply scale_factor and offset 
    719             zscf = iom_file(kiomid)%scf(idvar)      ! scale factor 
    720             zofs = iom_file(kiomid)%ofs(idvar)      ! offset 
    721             IF(     PRESENT(pv_r1d) ) THEN 
    722                IF( zscf /= 1. )   pv_r1d(:) = pv_r1d(:) * zscf  
    723                IF( zofs /= 0. )   pv_r1d(:) = pv_r1d(:) + zofs 
    724             ELSEIF( PRESENT(pv_r2d) ) THEN 
    725 !CDIR COLLAPSE 
    726                IF( zscf /= 1.)   pv_r2d(:,:) = pv_r2d(:,:) * zscf 
    727 !CDIR COLLAPSE 
    728                IF( zofs /= 0.)   pv_r2d(:,:) = pv_r2d(:,:) + zofs 
    729             ELSEIF( PRESENT(pv_r3d) ) THEN 
    730 !CDIR COLLAPSE 
    731                IF( zscf /= 1.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf 
    732 !CDIR COLLAPSE 
    733                IF( zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs 
    734             ENDIF 
    735             ! 
     1290            ! return if statment idvar > 0 .AND. istop == nstop is false 
     1291            RETURN 
    7361292         ENDIF 
    7371293         ! 
     1294      ELSE        ! read using XIOS. Only if KEY_IOMPUT is defined 
     1295#if defined key_iomput 
     1296!would be good to be able to check which context is active and swap only if current is not restart 
     1297         CALL iom_swap( TRIM(crxios_context) )  
     1298         IF( PRESENT(pv_r3d) ) THEN 
     1299            pv_r3d(:, :, :) = 0. 
     1300            if(lwp) write(numout,*) 'XIOS RST READ (3D): ',trim(cdvar) 
     1301            CALL xios_recv_field( trim(cdvar), pv_r3d) 
     1302            IF(idom /= jpdom_unknown ) then 
     1303                CALL lbc_lnk( 'iom', pv_r3d,'Z',-999.,'no0' ) 
     1304            ENDIF 
     1305         ELSEIF( PRESENT(pv_r2d) ) THEN 
     1306            pv_r2d(:, :) = 0. 
     1307            if(lwp) write(numout,*) 'XIOS RST READ (2D): ', trim(cdvar) 
     1308            CALL xios_recv_field( trim(cdvar), pv_r2d) 
     1309            IF(idom /= jpdom_unknown ) THEN 
     1310                CALL lbc_lnk('iom', pv_r2d,'Z',-999.,'no0') 
     1311            ENDIF 
     1312         ELSEIF( PRESENT(pv_r1d) ) THEN 
     1313            pv_r1d(:) = 0. 
     1314            if(lwp) write(numout,*) 'XIOS RST READ (1D): ', trim(cdvar) 
     1315            CALL xios_recv_field( trim(cdvar), pv_r1d) 
     1316         ENDIF 
     1317         CALL iom_swap( TRIM(cxios_context) ) 
     1318#else 
     1319         istop = istop + 1  
     1320         clinfo = 'Can not use XIOS in iom_get_123d, file: '//trim(clname)//', var:'//trim(cdvar) 
     1321#endif 
     1322      ENDIF 
     1323!some final adjustments 
     1324      ! C1D case : always call lbc_lnk to replicate the central value over the whole 3X3 domain 
     1325 
     1326      !--- Apply scale_factor and offset 
     1327      zscf = iom_file(kiomid)%scf(idvar)      ! scale factor 
     1328      zofs = iom_file(kiomid)%ofs(idvar)      ! offset 
     1329      IF(     PRESENT(pv_r1d) ) THEN 
     1330         IF( zscf /= 1. )   pv_r1d(:) = pv_r1d(:) * zscf  
     1331         IF( zofs /= 0. )   pv_r1d(:) = pv_r1d(:) + zofs 
     1332      ELSEIF( PRESENT(pv_r2d) ) THEN 
     1333         IF( zscf /= 1.)   pv_r2d(:,:) = pv_r2d(:,:) * zscf 
     1334         IF( zofs /= 0.)   pv_r2d(:,:) = pv_r2d(:,:) + zofs 
     1335      ELSEIF( PRESENT(pv_r3d) ) THEN 
     1336         IF( zscf /= 1.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf 
     1337         IF( zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs 
    7381338      ENDIF 
    7391339      ! 
     
    7411341 
    7421342 
    743    SUBROUTINE iom_gettime( kiomid, ptime, cdvar, kntime, cdunits, cdcalendar ) 
    744       !!-------------------------------------------------------------------- 
    745       !!                   ***  SUBROUTINE iom_gettime  *** 
    746       !! 
    747       !! ** Purpose : read the time axis cdvar in the file  
    748       !!-------------------------------------------------------------------- 
    749       INTEGER                    , INTENT(in   ) ::   kiomid     ! file Identifier 
    750       REAL(wp), DIMENSION(:)     , INTENT(  out) ::   ptime      ! the time axis 
    751       CHARACTER(len=*), OPTIONAL , INTENT(in   ) ::   cdvar      ! time axis name 
    752       INTEGER         , OPTIONAL , INTENT(  out) ::   kntime     ! number of times in file 
    753       CHARACTER(len=*), OPTIONAL , INTENT(  out) ::   cdunits    ! units attribute of time coordinate 
    754       CHARACTER(len=*), OPTIONAL , INTENT(  out) ::   cdcalendar ! calendar attribute of  
    755       ! 
    756       INTEGER, DIMENSION(1) :: kdimsz 
    757       INTEGER            ::   idvar    ! id of the variable 
    758       CHARACTER(LEN=32)  ::   tname    ! local name of time coordinate 
    759       CHARACTER(LEN=100) ::   clinfo   ! info character 
    760       !--------------------------------------------------------------------- 
    761       ! 
    762       IF ( PRESENT(cdvar) ) THEN 
    763          tname = cdvar 
    764       ELSE 
    765          tname = iom_file(kiomid)%uldname 
    766       ENDIF 
     1343   FUNCTION iom_getszuld ( kiomid )   
     1344      !!----------------------------------------------------------------------- 
     1345      !!                  ***  FUNCTION  iom_getszuld  *** 
     1346      !! 
     1347      !! ** Purpose : get the size of the unlimited dimension in a file 
     1348      !!              (return -1 if not found) 
     1349      !!----------------------------------------------------------------------- 
     1350      INTEGER, INTENT(in   ) ::   kiomid   ! file Identifier 
     1351      ! 
     1352      INTEGER                ::   iom_getszuld 
     1353      !!----------------------------------------------------------------------- 
     1354      iom_getszuld = -1 
    7671355      IF( kiomid > 0 ) THEN 
    768          clinfo = 'iom_gettime, file: '//trim(iom_file(kiomid)%name)//', var: '//trim(tname) 
    769          IF ( PRESENT(kntime) ) THEN 
    770             idvar  = iom_varid( kiomid, tname, kdimsz = kdimsz ) 
    771             kntime = kdimsz(1) 
    772          ELSE 
    773             idvar = iom_varid( kiomid, tname ) 
    774          ENDIF 
    775          ! 
    776          ptime(:) = 0. ! default definition 
    777          IF( idvar > 0 ) THEN 
    778             IF( iom_file(kiomid)%ndims(idvar) == 1 ) THEN 
    779                IF( iom_file(kiomid)%luld(idvar) ) THEN 
    780                   IF( iom_file(kiomid)%dimsz(1,idvar) <= size(ptime) ) THEN 
    781                      SELECT CASE (iom_file(kiomid)%iolib) 
    782                      CASE (jpnf90   )   ;   CALL iom_nf90_gettime(   kiomid, idvar, ptime, cdunits, cdcalendar ) 
    783                      CASE DEFAULT     
    784                      END SELECT 
    785                   ELSE 
    786                      WRITE(ctmp1,*) 'error with the size of ptime ',size(ptime),iom_file(kiomid)%dimsz(1,idvar) 
    787                      CALL ctl_stop( trim(clinfo), trim(ctmp1) ) 
    788                   ENDIF 
    789                ELSE 
    790                   CALL ctl_stop( trim(clinfo), 'variable dimension is not unlimited... use iom_get' ) 
    791                ENDIF 
    792             ELSE 
    793                CALL ctl_stop( trim(clinfo), 'the variable has more than 1 dimension' ) 
    794             ENDIF 
    795          ELSE 
    796             CALL ctl_stop( trim(clinfo), 'variable not found in '//iom_file(kiomid)%name ) 
    797          ENDIF 
    798       ENDIF 
    799       ! 
    800    END SUBROUTINE iom_gettime 
    801  
     1356         IF( iom_file(kiomid)%iduld > 0 )   iom_getszuld = iom_file(kiomid)%lenuld 
     1357      ENDIF 
     1358   END FUNCTION iom_getszuld 
     1359    
     1360 
     1361   !!---------------------------------------------------------------------- 
     1362   !!                   INTERFACE iom_chkatt 
     1363   !!---------------------------------------------------------------------- 
     1364   SUBROUTINE iom_chkatt( kiomid, cdatt, llok, ksize, cdvar ) 
     1365      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
     1366      CHARACTER(len=*), INTENT(in   )                 ::   cdatt     ! Name of the attribute 
     1367      LOGICAL         , INTENT(  out)                 ::   llok      ! Error code 
     1368      INTEGER         , INTENT(  out), OPTIONAL       ::   ksize     ! Size of the attribute array 
     1369      CHARACTER(len=*), INTENT(in   ), OPTIONAL       ::   cdvar     ! Name of the variable 
     1370      ! 
     1371      IF( kiomid > 0 ) THEN 
     1372         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_chkatt( kiomid, cdatt, llok, ksize=ksize, cdvar=cdvar ) 
     1373      ENDIF 
     1374      ! 
     1375   END SUBROUTINE iom_chkatt 
    8021376 
    8031377   !!---------------------------------------------------------------------- 
    8041378   !!                   INTERFACE iom_getatt 
    8051379   !!---------------------------------------------------------------------- 
    806    SUBROUTINE iom_g0d_intatt( kiomid, cdatt, pvar ) 
    807       INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
    808       CHARACTER(len=*), INTENT(in   )                 ::   cdatt     ! Name of the attribute 
    809       INTEGER         , INTENT(  out)                 ::   pvar      ! read field 
     1380   SUBROUTINE iom_g0d_iatt( kiomid, cdatt, katt0d, cdvar ) 
     1381      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1382      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1383      INTEGER               , INTENT(  out)           ::   katt0d    ! read field 
     1384      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
    8101385      ! 
    8111386      IF( kiomid > 0 ) THEN 
    812          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    813             SELECT CASE (iom_file(kiomid)%iolib) 
    814             CASE (jpnf90   )   ;   CALL iom_nf90_getatt( kiomid, cdatt, pvar ) 
    815             CASE DEFAULT     
    816             END SELECT 
    817          ENDIF 
    818       ENDIF 
    819    END SUBROUTINE iom_g0d_intatt 
     1387         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_getatt( kiomid, cdatt,  katt0d =  katt0d, cdvar=cdvar ) 
     1388      ENDIF 
     1389   END SUBROUTINE iom_g0d_iatt 
     1390 
     1391   SUBROUTINE iom_g1d_iatt( kiomid, cdatt, katt1d, cdvar ) 
     1392      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1393      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1394      INTEGER, DIMENSION(:) , INTENT(  out)           ::   katt1d    ! read field 
     1395      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1396      ! 
     1397      IF( kiomid > 0 ) THEN 
     1398         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_getatt( kiomid, cdatt,  katt1d =  katt1d, cdvar=cdvar ) 
     1399      ENDIF 
     1400   END SUBROUTINE iom_g1d_iatt 
     1401 
     1402   SUBROUTINE iom_g0d_ratt( kiomid, cdatt, patt0d, cdvar ) 
     1403      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1404      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1405      REAL(wp)              , INTENT(  out)           ::   patt0d    ! read field 
     1406      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1407      ! 
     1408      IF( kiomid > 0 ) THEN 
     1409         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_getatt( kiomid, cdatt,  patt0d =  patt0d, cdvar=cdvar ) 
     1410      ENDIF 
     1411   END SUBROUTINE iom_g0d_ratt 
     1412 
     1413   SUBROUTINE iom_g1d_ratt( kiomid, cdatt, patt1d, cdvar ) 
     1414      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1415      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1416      REAL(wp), DIMENSION(:), INTENT(  out)           ::   patt1d    ! read field 
     1417      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1418      ! 
     1419      IF( kiomid > 0 ) THEN 
     1420         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_getatt( kiomid, cdatt,  patt1d =  patt1d, cdvar=cdvar ) 
     1421      ENDIF 
     1422   END SUBROUTINE iom_g1d_ratt 
     1423    
     1424   SUBROUTINE iom_g0d_catt( kiomid, cdatt, cdatt0d, cdvar ) 
     1425      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1426      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1427      CHARACTER(len=*)      , INTENT(  out)           ::   cdatt0d   ! read field 
     1428      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1429      ! 
     1430      IF( kiomid > 0 ) THEN 
     1431         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_getatt( kiomid, cdatt, cdatt0d = cdatt0d, cdvar=cdvar ) 
     1432      ENDIF 
     1433   END SUBROUTINE iom_g0d_catt 
     1434 
     1435 
     1436   !!---------------------------------------------------------------------- 
     1437   !!                   INTERFACE iom_putatt 
     1438   !!---------------------------------------------------------------------- 
     1439   SUBROUTINE iom_p0d_iatt( kiomid, cdatt, katt0d, cdvar ) 
     1440      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1441      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1442      INTEGER               , INTENT(in   )           ::   katt0d    ! written field 
     1443      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1444      ! 
     1445      IF( kiomid > 0 ) THEN 
     1446         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_putatt( kiomid, cdatt,  katt0d =  katt0d, cdvar=cdvar ) 
     1447      ENDIF 
     1448   END SUBROUTINE iom_p0d_iatt 
     1449 
     1450   SUBROUTINE iom_p1d_iatt( kiomid, cdatt, katt1d, cdvar ) 
     1451      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1452      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1453      INTEGER, DIMENSION(:) , INTENT(in   )           ::   katt1d    ! written field 
     1454      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1455      ! 
     1456      IF( kiomid > 0 ) THEN 
     1457         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_putatt( kiomid, cdatt,  katt1d =  katt1d, cdvar=cdvar ) 
     1458      ENDIF 
     1459   END SUBROUTINE iom_p1d_iatt 
     1460 
     1461   SUBROUTINE iom_p0d_ratt( kiomid, cdatt, patt0d, cdvar ) 
     1462      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1463      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1464      REAL(wp)              , INTENT(in   )           ::   patt0d    ! written field 
     1465      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1466      ! 
     1467      IF( kiomid > 0 ) THEN 
     1468         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_putatt( kiomid, cdatt,  patt0d =  patt0d, cdvar=cdvar ) 
     1469      ENDIF 
     1470   END SUBROUTINE iom_p0d_ratt 
     1471 
     1472   SUBROUTINE iom_p1d_ratt( kiomid, cdatt, patt1d, cdvar ) 
     1473      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1474      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1475      REAL(wp), DIMENSION(:), INTENT(in   )           ::   patt1d    ! written field 
     1476      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1477      ! 
     1478      IF( kiomid > 0 ) THEN 
     1479         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_putatt( kiomid, cdatt,  patt1d =  patt1d, cdvar=cdvar ) 
     1480      ENDIF 
     1481   END SUBROUTINE iom_p1d_ratt 
     1482    
     1483   SUBROUTINE iom_p0d_catt( kiomid, cdatt, cdatt0d, cdvar ) 
     1484      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
     1485      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
     1486      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt0d   ! written field 
     1487      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
     1488      ! 
     1489      IF( kiomid > 0 ) THEN 
     1490         IF( iom_file(kiomid)%nfid > 0 )   CALL iom_nf90_putatt( kiomid, cdatt, cdatt0d = cdatt0d, cdvar=cdvar ) 
     1491      ENDIF 
     1492   END SUBROUTINE iom_p0d_catt 
    8201493 
    8211494 
     
    8231496   !!                   INTERFACE iom_rstput 
    8241497   !!---------------------------------------------------------------------- 
    825    SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1498   SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    8261499      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    8271500      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    8301503      REAL(wp)        , INTENT(in)                         ::   pvar     ! written field 
    8311504      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1505      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1506      LOGICAL :: llx                ! local xios write flag 
    8321507      INTEGER :: ivid   ! variable id 
    833       IF( kiomid > 0 ) THEN 
    834          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    835             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    836             SELECT CASE (iom_file(kiomid)%iolib) 
    837             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
    838             CASE DEFAULT      
    839             END SELECT 
     1508 
     1509      llx = .FALSE. 
     1510      IF(PRESENT(ldxios)) llx = ldxios 
     1511      IF( llx ) THEN 
     1512#ifdef key_iomput 
     1513      IF( kt == kwrite ) THEN 
     1514          IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
     1515          CALL xios_send_field(trim(cdvar), pvar) 
     1516      ENDIF 
     1517#endif 
     1518      ELSE 
     1519         IF( kiomid > 0 ) THEN 
     1520            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1521               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1522               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
     1523            ENDIF 
    8401524         ENDIF 
    8411525      ENDIF 
    8421526   END SUBROUTINE iom_rp0d 
    8431527 
    844    SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1528   SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    8451529      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    8461530      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    8491533      REAL(wp)        , INTENT(in), DIMENSION(          :) ::   pvar     ! written field 
    8501534      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1535      LOGICAL, OPTIONAL                                    ::   ldxios   ! xios write flag 
     1536      LOGICAL :: llx                ! local xios write flag 
    8511537      INTEGER :: ivid   ! variable id 
    852       IF( kiomid > 0 ) THEN 
    853          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    854             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    855             SELECT CASE (iom_file(kiomid)%iolib) 
    856             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
    857             CASE DEFAULT      
    858             END SELECT 
     1538 
     1539      llx = .FALSE. 
     1540      IF(PRESENT(ldxios)) llx = ldxios 
     1541      IF( llx ) THEN 
     1542#ifdef key_iomput 
     1543      IF( kt == kwrite ) THEN 
     1544         IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
     1545         CALL xios_send_field(trim(cdvar), pvar) 
     1546      ENDIF 
     1547#endif 
     1548      ELSE 
     1549         IF( kiomid > 0 ) THEN 
     1550            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1551               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1552               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
     1553            ENDIF 
    8591554         ENDIF 
    8601555      ENDIF 
    8611556   END SUBROUTINE iom_rp1d 
    8621557 
    863    SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1558   SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    8641559      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    8651560      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    8681563      REAL(wp)        , INTENT(in), DIMENSION(:,    :    ) ::   pvar     ! written field 
    8691564      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1565      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1566      LOGICAL :: llx 
    8701567      INTEGER :: ivid   ! variable id 
    871       IF( kiomid > 0 ) THEN 
    872          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    873             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    874             SELECT CASE (iom_file(kiomid)%iolib) 
    875             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
    876             CASE DEFAULT      
    877             END SELECT 
     1568 
     1569      llx = .FALSE. 
     1570      IF(PRESENT(ldxios)) llx = ldxios 
     1571      IF( llx ) THEN 
     1572#ifdef key_iomput 
     1573      IF( kt == kwrite ) THEN 
     1574         IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
     1575         CALL xios_send_field(trim(cdvar), pvar) 
     1576      ENDIF 
     1577#endif 
     1578      ELSE 
     1579         IF( kiomid > 0 ) THEN 
     1580            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1581               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1582               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
     1583            ENDIF 
    8781584         ENDIF 
    8791585      ENDIF 
    8801586   END SUBROUTINE iom_rp2d 
    8811587 
    882    SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1588   SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    8831589      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    8841590      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    8871593      REAL(wp)        , INTENT(in),       DIMENSION(:,:,:) ::   pvar     ! written field 
    8881594      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1595      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1596      LOGICAL :: llx                 ! local xios write flag 
    8891597      INTEGER :: ivid   ! variable id 
    890       IF( kiomid > 0 ) THEN 
    891          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    892             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    893             SELECT CASE (iom_file(kiomid)%iolib) 
    894             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
    895             CASE DEFAULT      
    896             END SELECT 
     1598 
     1599      llx = .FALSE. 
     1600      IF(PRESENT(ldxios)) llx = ldxios 
     1601      IF( llx ) THEN 
     1602#ifdef key_iomput 
     1603      IF( kt == kwrite ) THEN 
     1604         IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
     1605         CALL xios_send_field(trim(cdvar), pvar) 
     1606      ENDIF 
     1607#endif 
     1608      ELSE 
     1609         IF( kiomid > 0 ) THEN 
     1610            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1611               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1612               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
     1613            ENDIF 
    8971614         ENDIF 
    8981615      ENDIF 
    8991616   END SUBROUTINE iom_rp3d 
    9001617 
     1618 
     1619  SUBROUTINE iom_delay_rst( cdaction, cdcpnt, kncid ) 
     1620      !!--------------------------------------------------------------------- 
     1621      !!   Routine iom_delay_rst: used read/write restart related to mpp_delay 
     1622      !! 
     1623      !!--------------------------------------------------------------------- 
     1624      CHARACTER(len=*), INTENT(in   ) ::   cdaction        ! 
     1625      CHARACTER(len=*), INTENT(in   ) ::   cdcpnt 
     1626      INTEGER         , INTENT(in   ) ::   kncid 
     1627      ! 
     1628      INTEGER  :: ji 
     1629      INTEGER  :: indim 
     1630      LOGICAL  :: llattexist 
     1631      REAL(wp), ALLOCATABLE, DIMENSION(:) ::   zreal1d 
     1632      !!--------------------------------------------------------------------- 
     1633      ! 
     1634      !                                      =================================== 
     1635      IF( TRIM(cdaction) == 'READ' ) THEN   ! read restart related to mpp_delay ! 
     1636         !                                   =================================== 
     1637         DO ji = 1, nbdelay 
     1638            IF ( c_delaycpnt(ji) == cdcpnt ) THEN 
     1639               CALL iom_chkatt( kncid, 'DELAY_'//c_delaylist(ji), llattexist, indim ) 
     1640               IF( llattexist )  THEN 
     1641                  ALLOCATE( todelay(ji)%z1d(indim) ) 
     1642                  CALL iom_getatt( kncid, 'DELAY_'//c_delaylist(ji), todelay(ji)%z1d(:) ) 
     1643                  ndelayid(ji) = 0   ! set to 0 to specify that the value was read in the restart 
     1644               ENDIF 
     1645           ENDIF 
     1646         END DO 
     1647         !                                   ==================================== 
     1648      ELSE                                  ! write restart related to mpp_delay ! 
     1649         !                                   ==================================== 
     1650         DO ji = 1, nbdelay   ! save only ocean delayed global communication variables 
     1651            IF ( c_delaycpnt(ji) == cdcpnt ) THEN 
     1652               IF( ASSOCIATED(todelay(ji)%z1d) ) THEN 
     1653                  CALL mpp_delay_rcv(ji)   ! make sure %z1d is received 
     1654                  CALL iom_putatt( kncid, 'DELAY_'//c_delaylist(ji), todelay(ji)%z1d(:) ) 
     1655               ENDIF 
     1656            ENDIF 
     1657         END DO 
     1658         ! 
     1659      ENDIF 
     1660       
     1661   END SUBROUTINE iom_delay_rst 
     1662   
     1663    
    9011664 
    9021665   !!---------------------------------------------------------------------- 
     
    9071670      REAL(wp)        , INTENT(in) ::   pfield0d 
    9081671      REAL(wp)        , DIMENSION(jpi,jpj) ::   zz     ! masson 
     1672#if defined key_iomput 
     1673      zz(:,:)=pfield0d 
     1674      CALL xios_send_field(cdname, zz) 
     1675      !CALL xios_send_field(cdname, (/pfield0d/))  
     1676#else 
    9091677      IF( .FALSE. )   WRITE(numout,*) cdname, pfield0d   ! useless test to avoid compilation warnings 
     1678#endif 
    9101679   END SUBROUTINE iom_p0d 
    9111680 
     
    9131682      CHARACTER(LEN=*)          , INTENT(in) ::   cdname 
    9141683      REAL(wp),     DIMENSION(:), INTENT(in) ::   pfield1d 
     1684#if defined key_iomput 
     1685      CALL xios_send_field( cdname, RESHAPE( (/pfield1d/), (/1,1,SIZE(pfield1d)/) ) ) 
     1686#else 
    9151687      IF( .FALSE. )   WRITE(numout,*) cdname, pfield1d   ! useless test to avoid compilation warnings 
     1688#endif 
    9161689   END SUBROUTINE iom_p1d 
    9171690 
     
    9191692      CHARACTER(LEN=*)            , INTENT(in) ::   cdname 
    9201693      REAL(wp),     DIMENSION(:,:), INTENT(in) ::   pfield2d 
     1694#if defined key_iomput 
     1695      CALL xios_send_field(cdname, pfield2d) 
     1696#else 
    9211697      IF( .FALSE. )   WRITE(numout,*) cdname, pfield2d   ! useless test to avoid compilation warnings 
     1698#endif 
    9221699   END SUBROUTINE iom_p2d 
    9231700 
     
    9251702      CHARACTER(LEN=*)                , INTENT(in) ::   cdname 
    9261703      REAL(wp),       DIMENSION(:,:,:), INTENT(in) ::   pfield3d 
     1704#if defined key_iomput 
     1705      CALL xios_send_field( cdname, pfield3d ) 
     1706#else 
    9271707      IF( .FALSE. )   WRITE(numout,*) cdname, pfield3d   ! useless test to avoid compilation warnings 
     1708#endif 
    9281709   END SUBROUTINE iom_p3d 
     1710 
     1711#if defined key_iomput 
    9291712   !!---------------------------------------------------------------------- 
    930  
    931  
     1713   !!   'key_iomput'                                         XIOS interface 
     1714   !!---------------------------------------------------------------------- 
     1715 
     1716   SUBROUTINE iom_set_domain_attr( cdid, ni_glo, nj_glo, ibegin, jbegin, ni, nj,                                               & 
     1717      &                                    data_dim, data_ibegin, data_ni, data_jbegin, data_nj, lonvalue, latvalue, mask,     & 
     1718      &                                    nvertex, bounds_lon, bounds_lat, area ) 
     1719      !!---------------------------------------------------------------------- 
     1720      !!---------------------------------------------------------------------- 
     1721      CHARACTER(LEN=*)                  , INTENT(in) ::   cdid 
     1722      INTEGER                 , OPTIONAL, INTENT(in) ::   ni_glo, nj_glo, ibegin, jbegin, ni, nj 
     1723      INTEGER                 , OPTIONAL, INTENT(in) ::   data_dim, data_ibegin, data_ni, data_jbegin, data_nj 
     1724      INTEGER                 , OPTIONAL, INTENT(in) ::   nvertex 
     1725      REAL(wp), DIMENSION(:)  , OPTIONAL, INTENT(in) ::   lonvalue, latvalue 
     1726      REAL(wp), DIMENSION(:,:), OPTIONAL, INTENT(in) ::   bounds_lon, bounds_lat, area 
     1727      LOGICAL , DIMENSION(:)  , OPTIONAL, INTENT(in) ::   mask 
     1728      !!---------------------------------------------------------------------- 
     1729      ! 
     1730      IF( xios_is_valid_domain     (cdid) ) THEN 
     1731         CALL xios_set_domain_attr     ( cdid, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj,   & 
     1732            &    data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj ,   & 
     1733            &    lonvalue_1D=lonvalue, latvalue_1D=latvalue, mask_1D=mask, nvertex=nvertex, bounds_lon_1D=bounds_lon,      & 
     1734            &    bounds_lat_1D=bounds_lat, area=area, type='curvilinear') 
     1735      ENDIF 
     1736      IF( xios_is_valid_domaingroup(cdid) ) THEN 
     1737         CALL xios_set_domaingroup_attr( cdid, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj,   & 
     1738            &    data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj ,   & 
     1739            &    lonvalue_1D=lonvalue, latvalue_1D=latvalue, mask_1D=mask, nvertex=nvertex, bounds_lon_1D=bounds_lon,      & 
     1740            &    bounds_lat_1D=bounds_lat, area=area, type='curvilinear' ) 
     1741      ENDIF 
     1742      ! 
     1743      CALL xios_solve_inheritance() 
     1744      ! 
     1745   END SUBROUTINE iom_set_domain_attr 
     1746 
     1747 
     1748   SUBROUTINE iom_set_zoom_domain_attr( cdid, ibegin, jbegin, ni, nj ) 
     1749      !!---------------------------------------------------------------------- 
     1750      !!---------------------------------------------------------------------- 
     1751      CHARACTER(LEN=*), INTENT(in) ::   cdid 
     1752      INTEGER         , INTENT(in) ::   ibegin, jbegin, ni, nj 
     1753      ! 
     1754      TYPE(xios_gridgroup) :: gridgroup_hdl 
     1755      TYPE(xios_grid)      :: grid_hdl 
     1756      TYPE(xios_domain)    :: domain_hdl  
     1757      TYPE(xios_axis)      :: axis_hdl  
     1758      CHARACTER(LEN=64)    :: cldomrefid   ! domain_ref name 
     1759      CHARACTER(len=1)     :: cl1          ! last character of this name 
     1760      !!---------------------------------------------------------------------- 
     1761      ! 
     1762      IF( xios_is_valid_zoom_domain(cdid) ) THEN 
     1763         ! define the zoom_domain attributs 
     1764         CALL xios_set_zoom_domain_attr( cdid, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj ) 
     1765         ! define a new 2D grid with this new domain 
     1766         CALL xios_get_handle("grid_definition", gridgroup_hdl ) 
     1767         CALL xios_add_child(gridgroup_hdl, grid_hdl, TRIM(cdid)//'_2D' )   ! add a new 2D grid to grid_definition 
     1768         CALL xios_add_child(grid_hdl, domain_hdl, TRIM(cdid) )             ! add its domain 
     1769         ! define a new 3D grid with this new domain 
     1770         CALL xios_add_child(gridgroup_hdl, grid_hdl, TRIM(cdid)//'_3D' )   ! add a new 3D grid to grid_definition 
     1771         CALL xios_add_child(grid_hdl, domain_hdl, TRIM(cdid) )             ! add its domain 
     1772         ! vertical axis 
     1773         cl1 = cdid(LEN_TRIM(cdid):)                                        ! last letter of cdid 
     1774         cl1 = CHAR(ICHAR(cl1)+32)                                          ! from upper to lower case 
     1775         CALL xios_add_child(grid_hdl, axis_hdl, 'depth'//cl1)              ! add its axis 
     1776      ENDIF 
     1777      !       
     1778   END SUBROUTINE iom_set_zoom_domain_attr 
     1779 
     1780 
     1781   SUBROUTINE iom_set_axis_attr( cdid, paxis, bounds ) 
     1782      !!---------------------------------------------------------------------- 
     1783      !!---------------------------------------------------------------------- 
     1784      CHARACTER(LEN=*)      , INTENT(in) ::   cdid 
     1785      REAL(wp), DIMENSION(:)  , OPTIONAL, INTENT(in) ::   paxis 
     1786      REAL(wp), DIMENSION(:,:), OPTIONAL, INTENT(in) ::   bounds 
     1787      !!---------------------------------------------------------------------- 
     1788      IF( PRESENT(paxis) ) THEN 
     1789         IF( xios_is_valid_axis     (cdid) )   CALL xios_set_axis_attr     ( cdid, n_glo=SIZE(paxis), value=paxis ) 
     1790         IF( xios_is_valid_axisgroup(cdid) )   CALL xios_set_axisgroup_attr( cdid, n_glo=SIZE(paxis), value=paxis ) 
     1791      ENDIF 
     1792      IF( xios_is_valid_axis     (cdid) )   CALL xios_set_axis_attr     ( cdid, bounds=bounds ) 
     1793      IF( xios_is_valid_axisgroup(cdid) )   CALL xios_set_axisgroup_attr( cdid, bounds=bounds ) 
     1794      CALL xios_solve_inheritance() 
     1795   END SUBROUTINE iom_set_axis_attr 
     1796 
     1797 
     1798   SUBROUTINE iom_set_field_attr( cdid, freq_op, freq_offset ) 
     1799      !!---------------------------------------------------------------------- 
     1800      !!---------------------------------------------------------------------- 
     1801      CHARACTER(LEN=*)             , INTENT(in) ::   cdid 
     1802      TYPE(xios_duration), OPTIONAL, INTENT(in) ::   freq_op 
     1803      TYPE(xios_duration), OPTIONAL, INTENT(in) ::   freq_offset 
     1804      !!---------------------------------------------------------------------- 
     1805      IF( xios_is_valid_field     (cdid) )   CALL xios_set_field_attr     ( cdid, freq_op=freq_op, freq_offset=freq_offset ) 
     1806      IF( xios_is_valid_fieldgroup(cdid) )   CALL xios_set_fieldgroup_attr( cdid, freq_op=freq_op, freq_offset=freq_offset ) 
     1807      CALL xios_solve_inheritance() 
     1808   END SUBROUTINE iom_set_field_attr 
     1809 
     1810 
     1811   SUBROUTINE iom_set_file_attr( cdid, name, name_suffix ) 
     1812      !!---------------------------------------------------------------------- 
     1813      !!---------------------------------------------------------------------- 
     1814      CHARACTER(LEN=*)          , INTENT(in) ::   cdid 
     1815      CHARACTER(LEN=*),OPTIONAL , INTENT(in) ::   name, name_suffix 
     1816      !!---------------------------------------------------------------------- 
     1817      IF( xios_is_valid_file     (cdid) )   CALL xios_set_file_attr     ( cdid, name=name, name_suffix=name_suffix ) 
     1818      IF( xios_is_valid_filegroup(cdid) )   CALL xios_set_filegroup_attr( cdid, name=name, name_suffix=name_suffix ) 
     1819      CALL xios_solve_inheritance() 
     1820   END SUBROUTINE iom_set_file_attr 
     1821 
     1822 
     1823   SUBROUTINE iom_get_file_attr( cdid, name, name_suffix, output_freq ) 
     1824      !!---------------------------------------------------------------------- 
     1825      !!---------------------------------------------------------------------- 
     1826      CHARACTER(LEN=*)          , INTENT(in ) ::   cdid 
     1827      CHARACTER(LEN=*),OPTIONAL , INTENT(out) ::   name, name_suffix 
     1828      TYPE(xios_duration), OPTIONAL , INTENT(out) :: output_freq 
     1829      LOGICAL                                 ::   llexist1,llexist2,llexist3 
     1830      !--------------------------------------------------------------------- 
     1831      IF( PRESENT( name        ) )   name = ''          ! default values 
     1832      IF( PRESENT( name_suffix ) )   name_suffix = '' 
     1833      IF( PRESENT( output_freq ) )   output_freq = xios_duration(0,0,0,0,0,0) 
     1834      IF( xios_is_valid_file     (cdid) ) THEN 
     1835         CALL xios_solve_inheritance() 
     1836         CALL xios_is_defined_file_attr     ( cdid, name = llexist1, name_suffix = llexist2, output_freq = llexist3) 
     1837         IF(llexist1)   CALL xios_get_file_attr     ( cdid, name = name ) 
     1838         IF(llexist2)   CALL xios_get_file_attr     ( cdid, name_suffix = name_suffix ) 
     1839         IF(llexist3)   CALL xios_get_file_attr     ( cdid, output_freq = output_freq ) 
     1840      ENDIF 
     1841      IF( xios_is_valid_filegroup(cdid) ) THEN 
     1842         CALL xios_solve_inheritance() 
     1843         CALL xios_is_defined_filegroup_attr( cdid, name = llexist1, name_suffix = llexist2, output_freq = llexist3) 
     1844         IF(llexist1)   CALL xios_get_filegroup_attr( cdid, name = name ) 
     1845         IF(llexist2)   CALL xios_get_filegroup_attr( cdid, name_suffix = name_suffix ) 
     1846         IF(llexist3)   CALL xios_get_filegroup_attr( cdid, output_freq = output_freq ) 
     1847      ENDIF 
     1848   END SUBROUTINE iom_get_file_attr 
     1849 
     1850 
     1851   SUBROUTINE iom_set_grid_attr( cdid, mask ) 
     1852      !!---------------------------------------------------------------------- 
     1853      !!---------------------------------------------------------------------- 
     1854      CHARACTER(LEN=*)                   , INTENT(in) ::   cdid 
     1855      LOGICAL, DIMENSION(:,:,:), OPTIONAL, INTENT(in) ::   mask 
     1856      !!---------------------------------------------------------------------- 
     1857      IF( xios_is_valid_grid     (cdid) )   CALL xios_set_grid_attr     ( cdid, mask_3D=mask ) 
     1858      IF( xios_is_valid_gridgroup(cdid) )   CALL xios_set_gridgroup_attr( cdid, mask_3D=mask ) 
     1859      CALL xios_solve_inheritance() 
     1860   END SUBROUTINE iom_set_grid_attr 
     1861 
     1862   SUBROUTINE iom_setkt( kt, cdname ) 
     1863      !!---------------------------------------------------------------------- 
     1864      !!---------------------------------------------------------------------- 
     1865      INTEGER         , INTENT(in) ::   kt  
     1866      CHARACTER(LEN=*), INTENT(in) ::   cdname 
     1867      !!---------------------------------------------------------------------- 
     1868      CALL iom_swap( cdname )   ! swap to cdname context 
     1869      CALL xios_update_calendar(kt) 
     1870      IF( cdname /= TRIM(cxios_context) )   CALL iom_swap( TRIM(cxios_context) )   ! return back to nemo context 
     1871   END SUBROUTINE iom_setkt 
     1872 
     1873   SUBROUTINE iom_context_finalize( cdname ) 
     1874      !!---------------------------------------------------------------------- 
     1875      !!---------------------------------------------------------------------- 
     1876      CHARACTER(LEN=*), INTENT(in) :: cdname 
     1877      CHARACTER(LEN=120)           :: clname 
     1878      !!---------------------------------------------------------------------- 
     1879      clname = cdname 
     1880      IF( TRIM(Agrif_CFixed()) .NE. '0' ) clname = TRIM(Agrif_CFixed())//"_"//clname  
     1881      IF( xios_is_valid_context(clname) ) THEN 
     1882         CALL iom_swap( cdname )   ! swap to cdname context 
     1883         CALL xios_context_finalize() ! finalize the context 
     1884         IF( cdname /= TRIM(cxios_context) ) CALL iom_swap( TRIM(cxios_context) )   ! return back to nemo context 
     1885      ENDIF 
     1886      ! 
     1887   END SUBROUTINE iom_context_finalize 
     1888 
     1889 
     1890   SUBROUTINE set_grid( cdgrd, plon, plat, ldxios, ldrxios ) 
     1891      !!---------------------------------------------------------------------- 
     1892      !!                     ***  ROUTINE set_grid  *** 
     1893      !! 
     1894      !! ** Purpose :   define horizontal grids 
     1895      !!---------------------------------------------------------------------- 
     1896      CHARACTER(LEN=1)            , INTENT(in) ::   cdgrd 
     1897      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plon 
     1898      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
     1899      ! 
     1900      INTEGER  :: ni, nj 
     1901      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmask 
     1902      LOGICAL, INTENT(IN) :: ldxios, ldrxios 
     1903      !!---------------------------------------------------------------------- 
     1904      ! 
     1905      ni = nlei-nldi+1 
     1906      nj = nlej-nldj+1 
     1907      ! 
     1908      CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-2, jbegin=njmpp+nldj-2, ni=ni, nj=nj) 
     1909      CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 
     1910!don't define lon and lat for restart reading context.  
     1911      IF ( .NOT.ldrxios ) & 
     1912         CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)),   & 
     1913         &                                     latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
     1914      ! 
     1915      IF ( ln_mskland .AND. (.NOT.ldxios) ) THEN 
     1916         ! mask land points, keep values on coast line -> specific mask for U, V and W points 
     1917         SELECT CASE ( cdgrd ) 
     1918         CASE('T')   ;   zmask(:,:,:)       = tmask(:,:,:) 
     1919         CASE('U')   ;   zmask(2:jpim1,:,:) = tmask(2:jpim1,:,:) + tmask(3:jpi,:,:)   ;   CALL lbc_lnk( 'iom', zmask, 'U', 1. ) 
     1920         CASE('V')   ;   zmask(:,2:jpjm1,:) = tmask(:,2:jpjm1,:) + tmask(:,3:jpj,:)   ;   CALL lbc_lnk( 'iom', zmask, 'V', 1. ) 
     1921         CASE('W')   ;   zmask(:,:,2:jpk  ) = tmask(:,:,1:jpkm1) + tmask(:,:,2:jpk)   ;   zmask(:,:,1) = tmask(:,:,1) 
     1922         END SELECT 
     1923         ! 
     1924         CALL iom_set_domain_attr( "grid_"//cdgrd       , mask = RESHAPE(zmask(nldi:nlei,nldj:nlej,1),(/ni*nj    /)) /= 0. ) 
     1925         CALL iom_set_grid_attr  ( "grid_"//cdgrd//"_3D", mask = RESHAPE(zmask(nldi:nlei,nldj:nlej,:),(/ni,nj,jpk/)) /= 0. ) 
     1926      ENDIF 
     1927      ! 
     1928   END SUBROUTINE set_grid 
     1929 
     1930 
     1931   SUBROUTINE set_grid_bounds( cdgrd, plon_cnr, plat_cnr, plon_pnt, plat_pnt ) 
     1932      !!---------------------------------------------------------------------- 
     1933      !!                   ***  ROUTINE set_grid_bounds  *** 
     1934      !! 
     1935      !! ** Purpose :   define horizontal grid corners 
     1936      !! 
     1937      !!---------------------------------------------------------------------- 
     1938      CHARACTER(LEN=1)                      , INTENT(in) :: cdgrd 
     1939      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) :: plon_cnr, plat_cnr  ! Lat/lon coord. of a contiguous vertex of cell (i,j) 
     1940      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) :: plon_pnt, plat_pnt  ! Lat/lon coord. of the point of cell (i,j) 
     1941      ! 
     1942      INTEGER :: ji, jj, jn, ni, nj 
     1943      INTEGER :: icnr, jcnr                                    ! Offset such that the vertex coordinate (i+icnr,j+jcnr) 
     1944      !                                                        ! represents the bottom-left corner of cell (i,j) 
     1945      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: z_bnds      ! Lat/lon coordinates of the vertices of cell (i,j) 
     1946      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: z_fld       ! Working array to determine where to rotate cells 
     1947      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: z_rot       ! Lat/lon working array for rotation of cells 
     1948      !!---------------------------------------------------------------------- 
     1949      ! 
     1950      ALLOCATE( z_bnds(4,jpi,jpj,2), z_fld(jpi,jpj), z_rot(4,2)  ) 
     1951      ! 
     1952      ! Offset of coordinate representing bottom-left corner 
     1953      SELECT CASE ( TRIM(cdgrd) ) 
     1954      CASE ('T', 'W')   ;   icnr = -1   ;   jcnr = -1 
     1955      CASE ('U')        ;   icnr =  0   ;   jcnr = -1 
     1956      CASE ('V')        ;   icnr = -1   ;   jcnr =  0 
     1957      END SELECT 
     1958      ! 
     1959      ni = nlei-nldi+1   ! Dimensions of subdomain interior 
     1960      nj = nlej-nldj+1 
     1961      ! 
     1962      z_fld(:,:) = 1._wp 
     1963      CALL lbc_lnk( 'iom', z_fld, cdgrd, -1. )    ! Working array for location of northfold 
     1964      ! 
     1965      ! Cell vertices that can be defined 
     1966      DO jj = 2, jpjm1 
     1967         DO ji = 2, jpim1 
     1968            z_bnds(1,ji,jj,1) = plat_cnr(ji+icnr,  jj+jcnr  ) ! Bottom-left 
     1969            z_bnds(2,ji,jj,1) = plat_cnr(ji+icnr+1,jj+jcnr  ) ! Bottom-right 
     1970            z_bnds(3,ji,jj,1) = plat_cnr(ji+icnr+1,jj+jcnr+1) ! Top-right 
     1971            z_bnds(4,ji,jj,1) = plat_cnr(ji+icnr,  jj+jcnr+1) ! Top-left 
     1972            z_bnds(1,ji,jj,2) = plon_cnr(ji+icnr,  jj+jcnr  ) ! Bottom-left 
     1973            z_bnds(2,ji,jj,2) = plon_cnr(ji+icnr+1,jj+jcnr  ) ! Bottom-right 
     1974            z_bnds(3,ji,jj,2) = plon_cnr(ji+icnr+1,jj+jcnr+1) ! Top-right 
     1975            z_bnds(4,ji,jj,2) = plon_cnr(ji+icnr,  jj+jcnr+1) ! Top-left 
     1976         END DO 
     1977      END DO 
     1978      ! 
     1979      ! Cell vertices on boundries 
     1980      DO jn = 1, 4 
     1981         CALL lbc_lnk( 'iom', z_bnds(jn,:,:,1), cdgrd, 1., pval=999._wp ) 
     1982         CALL lbc_lnk( 'iom', z_bnds(jn,:,:,2), cdgrd, 1., pval=999._wp ) 
     1983      END DO 
     1984      ! 
     1985      ! Zero-size cells at closed boundaries if cell points provided, 
     1986      ! otherwise they are closed cells with unrealistic bounds 
     1987      IF( PRESENT(plon_pnt) .AND. PRESENT(plat_pnt) ) THEN 
     1988         IF( (nbondi == -1 .OR. nbondi == 2) .AND. .NOT. (jperio == 1 .OR. jperio == 4 .OR. jperio == 6) ) THEN 
     1989            DO jn = 1, 4        ! (West or jpni = 1), closed E-W 
     1990               z_bnds(jn,1,:,1) = plat_pnt(1,:)  ;  z_bnds(jn,1,:,2) = plon_pnt(1,:) 
     1991            END DO 
     1992         ENDIF 
     1993         IF( (nbondi == 1 .OR. nbondi == 2) .AND. .NOT. (jperio == 1 .OR. jperio == 4 .OR. jperio == 6) ) THEN 
     1994            DO jn = 1, 4        ! (East or jpni = 1), closed E-W 
     1995               z_bnds(jn,nlci,:,1) = plat_pnt(nlci,:)  ;  z_bnds(jn,nlci,:,2) = plon_pnt(nlci,:) 
     1996            END DO 
     1997         ENDIF 
     1998         IF( nbondj == -1 .OR. (nbondj == 2 .AND. jperio /= 2) ) THEN 
     1999            DO jn = 1, 4        ! South or (jpnj = 1, not symmetric) 
     2000               z_bnds(jn,:,1,1) = plat_pnt(:,1)  ;  z_bnds(jn,:,1,2) = plon_pnt(:,1) 
     2001            END DO 
     2002         ENDIF 
     2003         IF( (nbondj == 1 .OR. nbondj == 2) .AND. jperio  < 3 ) THEN 
     2004            DO jn = 1, 4        ! (North or jpnj = 1), no north fold 
     2005               z_bnds(jn,:,nlcj,1) = plat_pnt(:,nlcj)  ;  z_bnds(jn,:,nlcj,2) = plon_pnt(:,nlcj) 
     2006            END DO 
     2007         ENDIF 
     2008      ENDIF 
     2009      ! 
     2010      IF( (nbondj == 1 .OR. nbondj == 2) .AND. jperio >= 3 ) THEN    ! Rotate cells at the north fold 
     2011         DO jj = 1, jpj 
     2012            DO ji = 1, jpi 
     2013               IF( z_fld(ji,jj) == -1. ) THEN 
     2014                  z_rot(1,:) = z_bnds(3,ji,jj,:) ; z_rot(2,:) = z_bnds(4,ji,jj,:) 
     2015                  z_rot(3,:) = z_bnds(1,ji,jj,:) ; z_rot(4,:) = z_bnds(2,ji,jj,:) 
     2016                  z_bnds(:,ji,jj,:) = z_rot(:,:) 
     2017               ENDIF 
     2018            END DO 
     2019         END DO 
     2020      ELSE IF( nbondj == 2 .AND. jperio == 2 ) THEN                  ! Invert cells at the symmetric equator 
     2021         DO ji = 1, jpi 
     2022            z_rot(1:2,:) = z_bnds(3:4,ji,1,:) 
     2023            z_rot(3:4,:) = z_bnds(1:2,ji,1,:) 
     2024            z_bnds(:,ji,1,:) = z_rot(:,:) 
     2025         END DO 
     2026      ENDIF 
     2027      ! 
     2028      CALL iom_set_domain_attr("grid_"//cdgrd, bounds_lat = RESHAPE(z_bnds(:,nldi:nlei,nldj:nlej,1),(/ 4,ni*nj /)),           & 
     2029          &                                    bounds_lon = RESHAPE(z_bnds(:,nldi:nlei,nldj:nlej,2),(/ 4,ni*nj /)), nvertex=4 ) 
     2030      ! 
     2031      DEALLOCATE( z_bnds, z_fld, z_rot )  
     2032      ! 
     2033   END SUBROUTINE set_grid_bounds 
     2034 
     2035 
     2036   SUBROUTINE set_grid_znl( plat ) 
     2037      !!---------------------------------------------------------------------- 
     2038      !!                     ***  ROUTINE set_grid_znl  *** 
     2039      !! 
     2040      !! ** Purpose :   define grids for zonal mean 
     2041      !! 
     2042      !!---------------------------------------------------------------------- 
     2043      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
     2044      ! 
     2045      INTEGER  :: ni, nj, ix, iy 
     2046      REAL(wp), DIMENSION(:), ALLOCATABLE  ::   zlon 
     2047      !!---------------------------------------------------------------------- 
     2048      ! 
     2049      ni=nlei-nldi+1       ! define zonal mean domain (jpj*jpk) 
     2050      nj=nlej-nldj+1 
     2051      ALLOCATE( zlon(ni*nj) )       ;       zlon(:) = 0._wp 
     2052      ! 
     2053      CALL dom_ngb( -168.53, 65.03, ix, iy, 'T' ) !  i-line that passes through Bering Strait: Reference latitude (used in plots) 
     2054!      CALL dom_ngb( 180., 90., ix, iy, 'T' ) !  i-line that passes near the North Pole : Reference latitude (used in plots) 
     2055      CALL iom_set_domain_attr("gznl", ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-2, jbegin=njmpp+nldj-2, ni=ni, nj=nj) 
     2056      CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 
     2057      CALL iom_set_domain_attr("gznl", lonvalue = zlon,   & 
     2058         &                             latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
     2059      CALL iom_set_zoom_domain_attr("znl_T", ibegin=ix-1, jbegin=0, ni=1, nj=jpjglo) 
     2060      CALL iom_set_zoom_domain_attr("znl_W", ibegin=ix-1, jbegin=0, ni=1, nj=jpjglo) 
     2061      ! 
     2062      CALL iom_update_file_name('ptr') 
     2063      ! 
     2064   END SUBROUTINE set_grid_znl 
     2065 
     2066 
     2067   SUBROUTINE set_scalar 
     2068      !!---------------------------------------------------------------------- 
     2069      !!                     ***  ROUTINE set_scalar  *** 
     2070      !! 
     2071      !! ** Purpose :   define fake grids for scalar point 
     2072      !! 
     2073      !!---------------------------------------------------------------------- 
     2074      REAL(wp), DIMENSION(1)   ::   zz = 1. 
     2075      !!---------------------------------------------------------------------- 
     2076      ! 
     2077      CALL iom_set_domain_attr('scalarpoint', ni_glo=jpnij, nj_glo=1, ibegin=narea-1, jbegin=0, ni=1, nj=1) 
     2078      CALL iom_set_domain_attr('scalarpoint', data_dim=2, data_ibegin = 1, data_ni = 1, data_jbegin = 1, data_nj = 1) 
     2079      ! 
     2080      zz = REAL( narea, wp ) 
     2081      CALL iom_set_domain_attr('scalarpoint', lonvalue=zz, latvalue=zz) 
     2082      ! 
     2083   END SUBROUTINE set_scalar 
     2084 
     2085 
     2086   SUBROUTINE set_xmlatt 
     2087      !!---------------------------------------------------------------------- 
     2088      !!                     ***  ROUTINE set_xmlatt  *** 
     2089      !! 
     2090      !! ** Purpose :   automatic definitions of some of the xml attributs... 
     2091      !! 
     2092      !!---------------------------------------------------------------------- 
     2093      CHARACTER(len=1),DIMENSION( 3) ::   clgrd                    ! suffix name 
     2094      CHARACTER(len=256)             ::   clsuff                   ! suffix name 
     2095      CHARACTER(len=1)               ::   cl1                      ! 1 character 
     2096      CHARACTER(len=2)               ::   cl2                      ! 2 characters 
     2097      CHARACTER(len=3)               ::   cl3                      ! 3 characters 
     2098      INTEGER                        ::   ji, jg                   ! loop counters 
     2099      INTEGER                        ::   ix, iy                   ! i-,j- index 
     2100      REAL(wp)        ,DIMENSION(11) ::   zlontao                  ! longitudes of tao    moorings 
     2101      REAL(wp)        ,DIMENSION( 7) ::   zlattao                  ! latitudes  of tao    moorings 
     2102      REAL(wp)        ,DIMENSION( 4) ::   zlonrama                 ! longitudes of rama   moorings 
     2103      REAL(wp)        ,DIMENSION(11) ::   zlatrama                 ! latitudes  of rama   moorings 
     2104      REAL(wp)        ,DIMENSION( 3) ::   zlonpira                 ! longitudes of pirata moorings 
     2105      REAL(wp)        ,DIMENSION( 9) ::   zlatpira                 ! latitudes  of pirata moorings 
     2106      TYPE(xios_duration)            ::   f_op, f_of 
     2107      !!---------------------------------------------------------------------- 
     2108      !  
     2109      ! frequency of the call of iom_put (attribut: freq_op) 
     2110      f_op%timestep = 1        ;  f_of%timestep =  0  ; CALL iom_set_field_attr('field_definition', freq_op=f_op, freq_offset=f_of) 
     2111      f_op%timestep = 2        ;  f_of%timestep =  0  ; CALL iom_set_field_attr('trendT_even'     , freq_op=f_op, freq_offset=f_of) 
     2112      f_op%timestep = 2        ;  f_of%timestep = -1  ; CALL iom_set_field_attr('trendT_odd'      , freq_op=f_op, freq_offset=f_of) 
     2113      f_op%timestep = nn_fsbc  ;  f_of%timestep =  0  ; CALL iom_set_field_attr('SBC'             , freq_op=f_op, freq_offset=f_of) 
     2114      f_op%timestep = nn_fsbc  ;  f_of%timestep =  0  ; CALL iom_set_field_attr('SBC_scalar'      , freq_op=f_op, freq_offset=f_of) 
     2115      f_op%timestep = nn_dttrc ;  f_of%timestep =  0  ; CALL iom_set_field_attr('ptrc_T'          , freq_op=f_op, freq_offset=f_of) 
     2116      f_op%timestep = nn_dttrc ;  f_of%timestep =  0  ; CALL iom_set_field_attr('diad_T'          , freq_op=f_op, freq_offset=f_of) 
     2117 
     2118      ! output file names (attribut: name) 
     2119      DO ji = 1, 9 
     2120         WRITE(cl1,'(i1)') ji  
     2121         CALL iom_update_file_name('file'//cl1) 
     2122      END DO 
     2123      DO ji = 1, 99 
     2124         WRITE(cl2,'(i2.2)') ji  
     2125         CALL iom_update_file_name('file'//cl2) 
     2126      END DO 
     2127      DO ji = 1, 999 
     2128         WRITE(cl3,'(i3.3)') ji  
     2129         CALL iom_update_file_name('file'//cl3) 
     2130      END DO 
     2131 
     2132      ! Zooms... 
     2133      clgrd = (/ 'T', 'U', 'W' /)  
     2134      DO jg = 1, SIZE(clgrd)                                                                   ! grid type 
     2135         cl1 = clgrd(jg) 
     2136         ! Equatorial section (attributs: jbegin, ni, name_suffix) 
     2137         CALL dom_ngb( 0., 0., ix, iy, cl1 ) 
     2138         CALL iom_set_zoom_domain_attr('Eq'//cl1, ibegin=0, jbegin=iy-1, ni=jpiglo, nj=1 ) 
     2139         CALL iom_get_file_attr   ('Eq'//cl1, name_suffix = clsuff             ) 
     2140         CALL iom_set_file_attr   ('Eq'//cl1, name_suffix = TRIM(clsuff)//'_Eq') 
     2141         CALL iom_update_file_name('Eq'//cl1) 
     2142      END DO 
     2143      ! TAO moorings (attributs: ibegin, jbegin, name_suffix) 
     2144      zlontao = (/ 137.0, 147.0, 156.0, 165.0, -180.0, -170.0, -155.0, -140.0, -125.0, -110.0, -95.0 /) 
     2145      zlattao = (/  -8.0,  -5.0,  -2.0,   0.0,    2.0,    5.0,    8.0 /) 
     2146      CALL set_mooring( zlontao, zlattao ) 
     2147      ! RAMA moorings (attributs: ibegin, jbegin, name_suffix) 
     2148      zlonrama = (/  55.0,  67.0, 80.5, 90.0 /) 
     2149      zlatrama = (/ -16.0, -12.0, -8.0, -4.0, -1.5, 0.0, 1.5, 4.0, 8.0, 12.0, 15.0 /) 
     2150      CALL set_mooring( zlonrama, zlatrama ) 
     2151      ! PIRATA moorings (attributs: ibegin, jbegin, name_suffix) 
     2152      zlonpira = (/ -38.0, -23.0, -10.0 /) 
     2153      zlatpira = (/ -19.0, -14.0,  -8.0, 0.0, 4.0, 8.0, 12.0, 15.0, 20.0 /) 
     2154      CALL set_mooring( zlonpira, zlatpira ) 
     2155      ! 
     2156   END SUBROUTINE set_xmlatt 
     2157 
     2158 
     2159   SUBROUTINE set_mooring( plon, plat ) 
     2160      !!---------------------------------------------------------------------- 
     2161      !!                     ***  ROUTINE set_mooring  *** 
     2162      !! 
     2163      !! ** Purpose :   automatic definitions of moorings xml attributs... 
     2164      !! 
     2165      !!---------------------------------------------------------------------- 
     2166      REAL(wp), DIMENSION(:), INTENT(in) ::   plon, plat   ! longitudes/latitudes oft the mooring 
     2167      ! 
     2168!!$      CHARACTER(len=1),DIMENSION(4) ::   clgrd = (/ 'T', 'U', 'V', 'W' /)   ! suffix name 
     2169      CHARACTER(len=1),DIMENSION(1) ::   clgrd = (/ 'T' /)        ! suffix name 
     2170      CHARACTER(len=256)            ::   clname                   ! file name 
     2171      CHARACTER(len=256)            ::   clsuff                   ! suffix name 
     2172      CHARACTER(len=1)              ::   cl1                      ! 1 character 
     2173      CHARACTER(len=6)              ::   clon,clat                ! name of longitude, latitude 
     2174      INTEGER                       ::   ji, jj, jg               ! loop counters 
     2175      INTEGER                       ::   ix, iy                   ! i-,j- index 
     2176      REAL(wp)                      ::   zlon, zlat 
     2177      !!---------------------------------------------------------------------- 
     2178      DO jg = 1, SIZE(clgrd) 
     2179         cl1 = clgrd(jg) 
     2180         DO ji = 1, SIZE(plon) 
     2181            DO jj = 1, SIZE(plat) 
     2182               zlon = plon(ji) 
     2183               zlat = plat(jj) 
     2184               ! modifications for RAMA moorings 
     2185               IF( zlon ==  67. .AND. zlat ==  15. )   zlon =  65. 
     2186               IF( zlon ==  90. .AND. zlat <=  -4. )   zlon =  95. 
     2187               IF( zlon ==  95. .AND. zlat ==  -4. )   zlat =  -5. 
     2188               ! modifications for PIRATA moorings 
     2189               IF( zlon == -38. .AND. zlat == -19. )   zlon = -34. 
     2190               IF( zlon == -38. .AND. zlat == -14. )   zlon = -32. 
     2191               IF( zlon == -38. .AND. zlat ==  -8. )   zlon = -30. 
     2192               IF( zlon == -38. .AND. zlat ==   0. )   zlon = -35. 
     2193               IF( zlon == -23. .AND. zlat ==  20. )   zlat =  21. 
     2194               IF( zlon == -10. .AND. zlat == -14. )   zlat = -10. 
     2195               IF( zlon == -10. .AND. zlat ==  -8. )   zlat =  -6. 
     2196               IF( zlon == -10. .AND. zlat ==   4. ) THEN   ;   zlon = 0.   ;   zlat = 0.   ;   ENDIF 
     2197               CALL dom_ngb( zlon, zlat, ix, iy, cl1 ) 
     2198               IF( zlon >= 0. ) THEN   
     2199                  IF( zlon == REAL(NINT(zlon), wp) ) THEN   ;   WRITE(clon, '(i3,  a)') NINT( zlon), 'e' 
     2200                  ELSE                                      ;   WRITE(clon, '(f5.1,a)')       zlon , 'e' 
     2201                  ENDIF 
     2202               ELSE              
     2203                  IF( zlon == REAL(NINT(zlon), wp) ) THEN   ;   WRITE(clon, '(i3,  a)') NINT(-zlon), 'w' 
     2204                  ELSE                                      ;   WRITE(clon, '(f5.1,a)')      -zlon , 'w' 
     2205                  ENDIF 
     2206               ENDIF 
     2207               IF( zlat >= 0. ) THEN   
     2208                  IF( zlat == REAL(NINT(zlat), wp) ) THEN   ;   WRITE(clat, '(i2,  a)') NINT( zlat), 'n' 
     2209                  ELSE                                      ;   WRITE(clat, '(f4.1,a)')       zlat , 'n' 
     2210                  ENDIF 
     2211               ELSE              
     2212                  IF( zlat == REAL(NINT(zlat), wp) ) THEN   ;   WRITE(clat, '(i2,  a)') NINT(-zlat), 's' 
     2213                  ELSE                                      ;   WRITE(clat, '(f4.1,a)')      -zlat , 's' 
     2214                  ENDIF 
     2215               ENDIF 
     2216               clname = TRIM(ADJUSTL(clat))//TRIM(ADJUSTL(clon)) 
     2217               CALL iom_set_zoom_domain_attr(TRIM(clname)//cl1, ibegin= ix-1, jbegin= iy-1, ni=1, nj=1) 
     2218 
     2219               CALL iom_get_file_attr   (TRIM(clname)//cl1, name_suffix = clsuff                         ) 
     2220               CALL iom_set_file_attr   (TRIM(clname)//cl1, name_suffix = TRIM(clsuff)//'_'//TRIM(clname)) 
     2221               CALL iom_update_file_name(TRIM(clname)//cl1) 
     2222            END DO 
     2223         END DO 
     2224      END DO 
     2225       
     2226   END SUBROUTINE set_mooring 
     2227 
     2228    
     2229   SUBROUTINE iom_update_file_name( cdid ) 
     2230      !!---------------------------------------------------------------------- 
     2231      !!                     ***  ROUTINE iom_update_file_name  *** 
     2232      !! 
     2233      !! ** Purpose :    
     2234      !! 
     2235      !!---------------------------------------------------------------------- 
     2236      CHARACTER(LEN=*)          , INTENT(in) ::   cdid 
     2237      ! 
     2238      CHARACTER(LEN=256) ::   clname 
     2239      CHARACTER(LEN=20)  ::   clfreq 
     2240      CHARACTER(LEN=20)  ::   cldate 
     2241      INTEGER            ::   idx 
     2242      INTEGER            ::   jn 
     2243      INTEGER            ::   itrlen 
     2244      INTEGER            ::   iyear, imonth, iday, isec 
     2245      REAL(wp)           ::   zsec 
     2246      LOGICAL            ::   llexist 
     2247      TYPE(xios_duration)   ::   output_freq  
     2248      !!---------------------------------------------------------------------- 
     2249      ! 
     2250      DO jn = 1, 2 
     2251         ! 
     2252         output_freq = xios_duration(0,0,0,0,0,0) 
     2253         IF( jn == 1 )   CALL iom_get_file_attr( cdid, name        = clname, output_freq = output_freq ) 
     2254         IF( jn == 2 )   CALL iom_get_file_attr( cdid, name_suffix = clname ) 
     2255         ! 
     2256         IF ( TRIM(clname) /= '' ) THEN  
     2257            ! 
     2258            idx = INDEX(clname,'@expname@') + INDEX(clname,'@EXPNAME@') 
     2259            DO WHILE ( idx /= 0 )  
     2260               clname = clname(1:idx-1)//TRIM(cexper)//clname(idx+9:LEN_TRIM(clname)) 
     2261               idx = INDEX(clname,'@expname@') + INDEX(clname,'@EXPNAME@') 
     2262            END DO 
     2263            ! 
     2264            idx = INDEX(clname,'@freq@') + INDEX(clname,'@FREQ@') 
     2265            DO WHILE ( idx /= 0 )  
     2266              IF ( output_freq%timestep /= 0) THEN 
     2267                  WRITE(clfreq,'(I18,A2)')INT(output_freq%timestep),'ts'  
     2268                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2269              ELSE IF ( output_freq%second /= 0 ) THEN 
     2270                  WRITE(clfreq,'(I19,A1)')INT(output_freq%second),'s'  
     2271                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2272              ELSE IF ( output_freq%minute /= 0 ) THEN 
     2273                  WRITE(clfreq,'(I18,A2)')INT(output_freq%minute),'mi'  
     2274                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2275              ELSE IF ( output_freq%hour /= 0 ) THEN 
     2276                  WRITE(clfreq,'(I19,A1)')INT(output_freq%hour),'h'  
     2277                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2278              ELSE IF ( output_freq%day /= 0 ) THEN 
     2279                  WRITE(clfreq,'(I19,A1)')INT(output_freq%day),'d'  
     2280                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2281              ELSE IF ( output_freq%month /= 0 ) THEN    
     2282                  WRITE(clfreq,'(I19,A1)')INT(output_freq%month),'m'  
     2283                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2284              ELSE IF ( output_freq%year /= 0 ) THEN    
     2285                  WRITE(clfreq,'(I19,A1)')INT(output_freq%year),'y'  
     2286                  itrlen = LEN_TRIM(ADJUSTL(clfreq)) 
     2287              ELSE 
     2288                  CALL ctl_stop('error in the name of file id '//TRIM(cdid),   & 
     2289                     & ' attribute output_freq is undefined -> cannot replace @freq@ in '//TRIM(clname) ) 
     2290              ENDIF 
     2291              clname = clname(1:idx-1)//TRIM(ADJUSTL(clfreq))//clname(idx+6:LEN_TRIM(clname)) 
     2292              idx = INDEX(clname,'@freq@') + INDEX(clname,'@FREQ@') 
     2293            END DO 
     2294            ! 
     2295            idx = INDEX(clname,'@startdate@') + INDEX(clname,'@STARTDATE@') 
     2296            DO WHILE ( idx /= 0 )  
     2297               cldate = iom_sdate( fjulday - rdt / rday ) 
     2298               clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+11:LEN_TRIM(clname)) 
     2299               idx = INDEX(clname,'@startdate@') + INDEX(clname,'@STARTDATE@') 
     2300            END DO 
     2301            ! 
     2302            idx = INDEX(clname,'@startdatefull@') + INDEX(clname,'@STARTDATEFULL@') 
     2303            DO WHILE ( idx /= 0 )  
     2304               cldate = iom_sdate( fjulday - rdt / rday, ldfull = .TRUE. ) 
     2305               clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+15:LEN_TRIM(clname)) 
     2306               idx = INDEX(clname,'@startdatefull@') + INDEX(clname,'@STARTDATEFULL@') 
     2307            END DO 
     2308            ! 
     2309            idx = INDEX(clname,'@enddate@') + INDEX(clname,'@ENDDATE@') 
     2310            DO WHILE ( idx /= 0 )  
     2311               cldate = iom_sdate( fjulday + rdt / rday * REAL( nitend - nit000, wp ), ld24 = .TRUE. ) 
     2312               clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+9:LEN_TRIM(clname)) 
     2313               idx = INDEX(clname,'@enddate@') + INDEX(clname,'@ENDDATE@') 
     2314            END DO 
     2315            ! 
     2316            idx = INDEX(clname,'@enddatefull@') + INDEX(clname,'@ENDDATEFULL@') 
     2317            DO WHILE ( idx /= 0 )  
     2318               cldate = iom_sdate( fjulday + rdt / rday * REAL( nitend - nit000, wp ), ld24 = .TRUE., ldfull = .TRUE. ) 
     2319               clname = clname(1:idx-1)//TRIM(cldate)//clname(idx+13:LEN_TRIM(clname)) 
     2320               idx = INDEX(clname,'@enddatefull@') + INDEX(clname,'@ENDDATEFULL@') 
     2321            END DO 
     2322            ! 
     2323            IF( jn == 1 .AND. TRIM(Agrif_CFixed()) /= '0' )   clname = TRIM(Agrif_CFixed())//"_"//TRIM(clname) 
     2324            IF( jn == 1 )   CALL iom_set_file_attr( cdid, name        = clname ) 
     2325            IF( jn == 2 )   CALL iom_set_file_attr( cdid, name_suffix = clname ) 
     2326            ! 
     2327         ENDIF 
     2328         ! 
     2329      END DO 
     2330      ! 
     2331   END SUBROUTINE iom_update_file_name 
     2332 
     2333 
     2334   FUNCTION iom_sdate( pjday, ld24, ldfull ) 
     2335      !!---------------------------------------------------------------------- 
     2336      !!                     ***  ROUTINE iom_sdate  *** 
     2337      !! 
     2338      !! ** Purpose :   send back the date corresponding to the given julian day 
     2339      !!---------------------------------------------------------------------- 
     2340      REAL(wp), INTENT(in   )           ::   pjday    ! julian day 
     2341      LOGICAL , INTENT(in   ), OPTIONAL ::   ld24     ! true to force 24:00 instead of 00:00 
     2342      LOGICAL , INTENT(in   ), OPTIONAL ::   ldfull   ! true to get the compleate date: yyyymmdd_hh:mm:ss 
     2343      ! 
     2344      CHARACTER(LEN=20) ::   iom_sdate 
     2345      CHARACTER(LEN=50) ::   clfmt                         !  format used to write the date  
     2346      INTEGER           ::   iyear, imonth, iday, ihour, iminute, isec 
     2347      REAL(wp)          ::   zsec 
     2348      LOGICAL           ::   ll24, llfull 
     2349      !!---------------------------------------------------------------------- 
     2350      ! 
     2351      IF( PRESENT(ld24) ) THEN   ;   ll24 = ld24 
     2352      ELSE                       ;   ll24 = .FALSE. 
     2353      ENDIF 
     2354      ! 
     2355      IF( PRESENT(ldfull) ) THEN   ;   llfull = ldfull 
     2356      ELSE                         ;   llfull = .FALSE. 
     2357      ENDIF 
     2358      ! 
     2359      CALL ju2ymds( pjday, iyear, imonth, iday, zsec ) 
     2360      isec = NINT(zsec) 
     2361      ! 
     2362      IF ( ll24 .AND. isec == 0 ) THEN   ! 00:00 of the next day -> move to 24:00 of the current day 
     2363         CALL ju2ymds( pjday - 1., iyear, imonth, iday, zsec ) 
     2364         isec = 86400 
     2365      ENDIF 
     2366      ! 
     2367      IF( iyear < 10000 ) THEN   ;   clfmt = "i4.4,2i2.2"                ! format used to write the date  
     2368      ELSE                       ;   WRITE(clfmt, "('i',i1,',2i2.2')") INT(LOG10(REAL(iyear,wp))) + 1 
     2369      ENDIF 
     2370      ! 
     2371!$AGRIF_DO_NOT_TREAT       
     2372      ! needed in the conv 
     2373      IF( llfull ) THEN  
     2374         clfmt = TRIM(clfmt)//",'_',i2.2,':',i2.2,':',i2.2" 
     2375         ihour   = isec / 3600 
     2376         isec    = MOD(isec, 3600) 
     2377         iminute = isec / 60 
     2378         isec    = MOD(isec, 60) 
     2379         WRITE(iom_sdate, '('//TRIM(clfmt)//')') iyear, imonth, iday, ihour, iminute, isec    ! date of the end of run 
     2380      ELSE 
     2381         WRITE(iom_sdate, '('//TRIM(clfmt)//')') iyear, imonth, iday                          ! date of the end of run 
     2382      ENDIF 
     2383!$AGRIF_END_DO_NOT_TREAT       
     2384      ! 
     2385   END FUNCTION iom_sdate 
     2386 
     2387#else 
     2388   !!---------------------------------------------------------------------- 
     2389   !!   NOT 'key_iomput'                               a few dummy routines 
     2390   !!---------------------------------------------------------------------- 
    9322391 
    9332392   SUBROUTINE iom_setkt( kt, cdname ) 
     
    9422401   END SUBROUTINE iom_context_finalize 
    9432402 
     2403#endif 
    9442404 
    9452405   LOGICAL FUNCTION iom_use( cdname ) 
     2406      !!---------------------------------------------------------------------- 
     2407      !!---------------------------------------------------------------------- 
    9462408      CHARACTER(LEN=*), INTENT(in) ::   cdname 
     2409      !!---------------------------------------------------------------------- 
     2410#if defined key_iomput 
     2411      iom_use = xios_field_is_active( cdname ) 
     2412#else 
    9472413      iom_use = .FALSE. 
     2414#endif 
    9482415   END FUNCTION iom_use 
    9492416    
Note: See TracChangeset for help on using the changeset viewer.