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 13934 for NEMO/branches/2020/test_12905_xios_restart/src/OCE/IOM/iom.F90 – NEMO

Ignore:
Timestamp:
2020-12-01T13:17:32+01:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2462: update test branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/test_12905_xios_restart/src/OCE/IOM/iom.F90

    r13750 r13934  
    6060   PUBLIC iom_chkatt, iom_getatt, iom_putatt, iom_getszuld, iom_rstput, iom_delay_rst, iom_put 
    6161   PUBLIC iom_use, iom_context_finalize, iom_update_file_name, iom_miss_val 
     62   PUBLIC iom_xios_setid 
    6263 
    6364   PRIVATE iom_rp0d_sp, iom_rp1d_sp, iom_rp2d_sp, iom_rp3d_sp 
     
    7374   PRIVATE iom_set_rst_context, iom_set_vars_active 
    7475# endif 
     76   PRIVATE set_xios_context 
    7577   PRIVATE iom_set_rstw_active 
    7678 
     
    103105CONTAINS 
    104106 
    105    SUBROUTINE iom_init( cdname, fname, idfp, ld_closedef )  
     107   SUBROUTINE iom_init( cdname, kdid, ld_closedef )  
    106108      !!---------------------------------------------------------------------- 
    107109      !!                     ***  ROUTINE   *** 
     
    111113      !!---------------------------------------------------------------------- 
    112114      CHARACTER(len=*),           INTENT(in)  :: cdname 
    113       CHARACTER(len=*), OPTIONAL, INTENT(in)  :: fname 
    114       INTEGER         , OPTIONAL, INTENT(in)  :: idfp         ! pointer to netcdf file for restart reading with XIOS 
     115      INTEGER         , OPTIONAL, INTENT(in)  :: kdid           
    115116      LOGICAL         , OPTIONAL, INTENT(in)  :: ld_closedef 
    116117#if defined key_iomput 
     
    141142      CALL iom_swap( cdname ) 
    142143 
    143       llrstr = (TRIM(cdname) == TRIM(crxios_context)) .OR. (TRIM(cdname) == TRIM(crixios_context)) 
    144       llrstr = llrstr .OR. (TRIM(cdname) == TRIM(crtxios_context)) 
    145       llrstr = llrstr .OR. (TRIM(cdname) == TRIM(crsxios_context)) 
    146  
    147       llrstw = (TRIM(cdname) == TRIM(cwxios_context)) .OR. (TRIM(cdname) == TRIM(cwixios_context)) 
    148       llrstw = llrstw .OR. (TRIM(cdname) == TRIM(cwtxios_context)) 
    149       llrstw = llrstw .OR. (TRIM(cdname) == TRIM(cwsxios_context)) 
     144      llrstr = (cdname == cr_ocerst_cxt) .OR. (cdname == cr_icerst_cxt) 
     145      llrstr = llrstr .OR. (cdname == cr_toprst_cxt) 
     146      llrstr = llrstr .OR. (cdname == cr_sedrst_cxt) 
     147 
     148      llrstw = (cdname == cw_ocerst_cxt) .OR. (cdname == cw_icerst_cxt) 
     149      llrstw = llrstw .OR. (cdname == cw_toprst_cxt) 
     150      llrstw = llrstw .OR. (cdname == cw_sedrst_cxt) 
    150151 
    151152      llrst_context = llrstr .OR. llrstw 
     
    168169      IF(.NOT.llrst_context) CALL set_scalar 
    169170      ! 
    170       IF( TRIM(cdname) == TRIM(cxios_context) ) THEN   
     171      IF( cdname == cxios_context ) THEN   
    171172         CALL set_grid( "T", glamt, gphit, .FALSE., .FALSE. )  
    172173         CALL set_grid( "U", glamu, gphiu, .FALSE., .FALSE. ) 
     
    212213      ! vertical grid definition 
    213214      IF(.NOT.llrst_context) THEN 
    214           CALL iom_set_axis_attr(  "deptht", paxis = gdept_1d ) 
    215           CALL iom_set_axis_attr(  "depthu", paxis = gdept_1d ) 
    216           CALL iom_set_axis_attr(  "depthv", paxis = gdept_1d ) 
    217           CALL iom_set_axis_attr(  "depthw", paxis = gdepw_1d ) 
     215         CALL iom_set_axis_attr(  "deptht", paxis = gdept_1d ) 
     216         CALL iom_set_axis_attr(  "depthu", paxis = gdept_1d ) 
     217         CALL iom_set_axis_attr(  "depthv", paxis = gdept_1d ) 
     218         CALL iom_set_axis_attr(  "depthw", paxis = gdepw_1d ) 
    218219 
    219220          ! ABL 
    220           IF( .NOT. ALLOCATED(ght_abl) ) THEN   ! force definition for xml files (xios)  
    221              ALLOCATE( ght_abl(jpka), ghw_abl(jpka), e3t_abl(jpka), e3w_abl(jpka) )   ! default allocation needed by iom 
    222              ght_abl(:) = -1._wp   ;   ghw_abl(:) = -1._wp 
    223              e3t_abl(:) = -1._wp   ;   e3w_abl(:) = -1._wp 
    224           ENDIF 
    225           CALL iom_set_axis_attr( "ght_abl", ght_abl(2:jpka) ) 
    226           CALL iom_set_axis_attr( "ghw_abl", ghw_abl(2:jpka) ) 
     221         IF( .NOT. ALLOCATED(ght_abl) ) THEN   ! force definition for xml files (xios)  
     222            ALLOCATE( ght_abl(jpka), ghw_abl(jpka), e3t_abl(jpka), e3w_abl(jpka) )   ! default allocation needed by iom 
     223            ght_abl(:) = -1._wp   ;   ghw_abl(:) = -1._wp 
     224            e3t_abl(:) = -1._wp   ;   e3w_abl(:) = -1._wp 
     225         ENDIF 
     226         CALL iom_set_axis_attr( "ght_abl", ght_abl(2:jpka) ) 
     227         CALL iom_set_axis_attr( "ghw_abl", ghw_abl(2:jpka) ) 
    227228           
    228           ! Add vertical grid bounds 
    229           zt_bnds(2,:      ) = gdept_1d(:) 
    230           zt_bnds(1,2:jpk  ) = gdept_1d(1:jpkm1) 
    231           zt_bnds(1,1      ) = gdept_1d(1) - e3w_1d(1) 
    232           zw_bnds(1,:      ) = gdepw_1d(:) 
    233           zw_bnds(2,1:jpkm1) = gdepw_1d(2:jpk) 
    234           zw_bnds(2,jpk:   ) = gdepw_1d(jpk) + e3t_1d(jpk) 
    235           CALL iom_set_axis_attr(  "deptht", bounds=zw_bnds ) 
    236           CALL iom_set_axis_attr(  "depthu", bounds=zw_bnds ) 
    237           CALL iom_set_axis_attr(  "depthv", bounds=zw_bnds ) 
    238           CALL iom_set_axis_attr(  "depthw", bounds=zt_bnds ) 
    239  
    240           ! ABL 
    241           za_bnds(1,:) = ghw_abl(1:jpkam1) 
    242           za_bnds(2,:) = ghw_abl(2:jpka  ) 
    243           CALL iom_set_axis_attr( "ght_abl", bounds=za_bnds ) 
    244           za_bnds(1,:) = ght_abl(2:jpka  ) 
    245           za_bnds(2,:) = ght_abl(2:jpka  ) + e3w_abl(2:jpka) 
    246           CALL iom_set_axis_attr( "ghw_abl", bounds=za_bnds ) 
    247  
    248           CALL iom_set_axis_attr(  "nfloat", (/ (REAL(ji,wp), ji=1,jpnfl) /) ) 
     229         ! Add vertical grid bounds 
     230         zt_bnds(2,:      ) = gdept_1d(:) 
     231         zt_bnds(1,2:jpk  ) = gdept_1d(1:jpkm1) 
     232         zt_bnds(1,1      ) = gdept_1d(1) - e3w_1d(1) 
     233         zw_bnds(1,:      ) = gdepw_1d(:) 
     234         zw_bnds(2,1:jpkm1) = gdepw_1d(2:jpk) 
     235         zw_bnds(2,jpk:   ) = gdepw_1d(jpk) + e3t_1d(jpk) 
     236         CALL iom_set_axis_attr(  "deptht", bounds=zw_bnds ) 
     237         CALL iom_set_axis_attr(  "depthu", bounds=zw_bnds ) 
     238         CALL iom_set_axis_attr(  "depthv", bounds=zw_bnds ) 
     239         CALL iom_set_axis_attr(  "depthw", bounds=zt_bnds ) 
     240 
     241         ! ABL 
     242         za_bnds(1,:) = ghw_abl(1:jpkam1) 
     243         za_bnds(2,:) = ghw_abl(2:jpka  ) 
     244         CALL iom_set_axis_attr( "ght_abl", bounds=za_bnds ) 
     245         za_bnds(1,:) = ght_abl(2:jpka  ) 
     246         za_bnds(2,:) = ght_abl(2:jpka  ) + e3w_abl(2:jpka) 
     247         CALL iom_set_axis_attr( "ghw_abl", bounds=za_bnds ) 
     248 
     249         CALL iom_set_axis_attr(  "nfloat", (/ (REAL(ji,wp), ji=1,jpnfl) /) ) 
    249250# if defined key_si3 
    250           CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
    251           ! SIMIP diagnostics (4 main arctic straits) 
    252           CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,wp), ji=1,4) /) ) 
     251         CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
     252         ! SIMIP diagnostics (4 main arctic straits) 
     253         CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,wp), ji=1,4) /) ) 
    253254# endif 
    254255#if defined key_top 
    255           IF( ALLOCATED(profsed) ) CALL iom_set_axis_attr( "profsed", paxis = profsed ) 
    256 #endif 
    257           CALL iom_set_axis_attr( "icbcla", class_num ) 
    258           CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,wp) /) )   ! strange syntaxe and idea... 
    259           CALL iom_set_axis_attr( "iax_26C", (/ REAL(26,wp) /) )   ! strange syntaxe and idea... 
    260           CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,wp) /) )   ! strange syntaxe and idea... 
    261           ! for diaprt, we need to define an axis which size can be 1 (default) or 5 (if the file subbasins.nc exists) 
    262           INQUIRE( FILE = 'subbasins.nc', EXIST = ll_exist ) 
    263           nbasin = 1 + 4 * COUNT( (/ll_exist/) ) 
    264           CALL iom_set_axis_attr( "basin"  , (/ (REAL(ji,wp), ji=1,nbasin) /) ) 
     256         IF( ALLOCATED(profsed) ) CALL iom_set_axis_attr( "profsed", paxis = profsed ) 
     257#endif 
     258         CALL iom_set_axis_attr( "icbcla", class_num ) 
     259         CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,wp) /) )   ! strange syntaxe and idea... 
     260         CALL iom_set_axis_attr( "iax_26C", (/ REAL(26,wp) /) )   ! strange syntaxe and idea... 
     261         CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,wp) /) )   ! strange syntaxe and idea... 
     262         ! for diaprt, we need to define an axis which size can be 1 (default) or 5 (if the file subbasins.nc exists) 
     263         INQUIRE( FILE = 'subbasins.nc', EXIST = ll_exist ) 
     264         nbasin = 1 + 4 * COUNT( (/ll_exist/) ) 
     265         CALL iom_set_axis_attr( "basin"  , (/ (REAL(ji,wp), ji=1,nbasin) /) ) 
    265266      ENDIF 
    266267      ! 
    267268      ! automatic definitions of some of the xml attributs 
    268269      IF(llrstr) THEN 
    269           IF(PRESENT(idfp)) THEN 
    270              CALL iom_set_rst_context(.TRUE.) 
     270         IF(PRESENT(kdid)) THEN 
     271            CALL iom_set_rst_context(.TRUE.) 
    271272!set which fields will be read from restart file 
    272              CALL iom_set_vars_active(fname, idfp) 
    273           ELSE 
    274              CALL ctl_stop( 'iom_init:', 'restart read with XIOS: missing pointer to NETCDF file' ) 
    275           ENDIF 
     273            CALL iom_set_vars_active(kdid) 
     274         ELSE 
     275            CALL ctl_stop( 'iom_init:', 'restart read with XIOS: missing pointer to NETCDF file' ) 
     276         ENDIF 
    276277      ELSE IF(llrstw) THEN 
    277           CALL iom_set_rstw_file(fname) 
     278         CALL iom_set_rstw_file(iom_file(kdid)%name) 
    278279      ELSE 
    279           CALL set_xmlatt 
     280         CALL set_xmlatt 
    280281      ENDIF 
    281282      ! 
     
    301302      !! 
    302303      !!---------------------------------------------------------------------- 
    303    CHARACTER(len=*), OPTIONAL, INTENT(IN) :: cdname 
     304      CHARACTER(len=*), OPTIONAL, INTENT(IN) :: cdname 
    304305#if defined key_iomput 
    305    LOGICAL :: llrstw 
     306      LOGICAL :: llrstw 
    306307 
    307308      llrstw = .FALSE. 
    308309      IF(PRESENT(cdname)) THEN 
    309          llrstw = (TRIM(cdname) == TRIM(cwxios_context)) 
    310          llrstw = llrstw .OR. (TRIM(cdname) == TRIM(cwixios_context)) 
    311          llrstw = llrstw .OR. (TRIM(cdname) == TRIM(cwtxios_context)) 
    312          llrstw = llrstw .OR. (TRIM(cdname) == TRIM(cwsxios_context)) 
     310         llrstw = (cdname == cw_ocerst_cxt) 
     311         llrstw = llrstw .OR. (cdname == cw_icerst_cxt) 
     312         llrstw = llrstw .OR. (cdname == cw_toprst_cxt) 
     313         llrstw = llrstw .OR. (cdname == cw_sedrst_cxt) 
    313314      ENDIF 
    314315 
    315316      IF( llrstw ) THEN 
    316317!set names of the fields in restart file IF using XIOS to write data 
    317           CALL iom_set_rst_context(.FALSE.) 
    318           CALL xios_close_context_definition() 
     318         CALL iom_set_rst_context(.FALSE.) 
     319         CALL xios_close_context_definition() 
    319320      ELSE 
    320           CALL xios_close_context_definition() 
    321           CALL xios_update_calendar( 0 ) 
     321         CALL xios_close_context_definition() 
     322         CALL xios_update_calendar( 0 ) 
    322323      ENDIF 
    323324#else 
     
    327328   END SUBROUTINE iom_init_closedef 
    328329 
    329    SUBROUTINE iom_set_vars_active(cdfname, idnum) 
     330   SUBROUTINE iom_set_vars_active(idnum) 
    330331      !!--------------------------------------------------------------------- 
    331332      !!                   ***  SUBROUTINE  iom_set_vars_active  *** 
     
    335336      !!               id of the file is assumed to be rrestart. 
    336337      !!--------------------------------------------------------------------- 
    337  
    338    CHARACTER(len=*), INTENT(IN) :: cdfname 
    339    INTEGER         , INTENT(IN) :: idnum  
     338      INTEGER, INTENT(IN) :: idnum  
     339       
    340340#if defined key_iomput 
    341    INTEGER                                    :: ndims, nvars, natts, unlimitedDimId, dimlen, xtype,mdims 
    342    TYPE(xios_field)                           :: field_hdl 
    343    TYPE(xios_file)                            :: file_hdl 
    344    TYPE(xios_filegroup)                       :: filegroup_hdl 
    345    INTEGER                                    :: dimids(4), jv,i, idim 
    346    CHARACTER(LEN=256)                         :: clinfo               ! info character 
    347    INTEGER, ALLOCATABLE                       :: indimlens(:) 
    348    CHARACTER(LEN=nf90_max_name), ALLOCATABLE  :: indimnames(:) 
    349    CHARACTER(LEN=nf90_max_name)               :: dimname, varname 
    350    LOGICAL                                    :: lmeta 
    351  
    352         meta(1) = "nav_lat" 
    353         meta(2) = "nav_lon" 
    354         meta(3) = "nav_lev" 
    355         meta(4) = "time_instant" 
    356         meta(5) = "time_instant_bounds" 
    357         meta(6) = "time_counter" 
    358         meta(7) = "time_counter_bounds" 
    359         meta(8) = "x" 
    360         meta(9) = "y" 
    361         meta(10) = "numcat" 
    362  
    363         clinfo = '          iom_set_vars_active, file: '//TRIM(cdfname) 
     341      INTEGER                                    :: ndims, nvars, natts, unlimitedDimId, dimlen, xtype,mdims 
     342      TYPE(xios_field)                           :: field_hdl 
     343      TYPE(xios_file)                            :: file_hdl 
     344      TYPE(xios_filegroup)                       :: filegroup_hdl 
     345      INTEGER                                    :: dimids(4), jv,i, idim 
     346      CHARACTER(LEN=256)                         :: clinfo               ! info character 
     347      INTEGER, ALLOCATABLE                       :: indimlens(:) 
     348      CHARACTER(LEN=nf90_max_name), ALLOCATABLE  :: indimnames(:) 
     349      CHARACTER(LEN=nf90_max_name)               :: dimname, varname 
     350      INTEGER                                    :: iln 
     351      CHARACTER(LEN=lc)                          :: fname 
     352      LOGICAL                                    :: lmeta 
     353!metadata in restart file for restart read with XIOS 
     354      INTEGER, PARAMETER                         :: NMETA = 10 
     355      CHARACTER(LEN=lc)                          :: meta(NMETA) 
     356 
     357 
     358      meta(1) = "nav_lat" 
     359      meta(2) = "nav_lon" 
     360      meta(3) = "nav_lev" 
     361      meta(4) = "time_instant" 
     362      meta(5) = "time_instant_bounds" 
     363      meta(6) = "time_counter" 
     364      meta(7) = "time_counter_bounds" 
     365      meta(8) = "x" 
     366      meta(9) = "y" 
     367      meta(10) = "numcat" 
     368 
     369      clinfo = '          iom_set_vars_active, file: '//TRIM(iom_file(idnum)%name) 
     370 
     371      iln = INDEX( iom_file(idnum)%name, '.nc' ) 
     372!XIOS doee not need .nc 
     373      IF(iln > 0) THEN 
     374        fname =  iom_file(idnum)%name(1:iln-1) 
     375      ELSE 
     376        fname =  iom_file(idnum)%name 
     377      ENDIF 
    364378 
    365379!set name of the restart file and enable available fields 
    366         CALL xios_get_handle("file_definition", filegroup_hdl ) 
    367         CALL xios_add_child(filegroup_hdl, file_hdl, 'rrestart') 
    368         CALL xios_set_file_attr( "rrestart", name=trim(cdfname), type="one_file", & 
    369              par_access="collective", enabled=.TRUE., mode="read",                 & 
    370              output_freq=xios_timestep) 
    371  
    372         CALL iom_nf90_check( nf90_inquire(idnum, ndims, nvars, natts ), clinfo ) 
    373         ALLOCATE(indimlens(ndims), indimnames(ndims)) 
    374         CALL iom_nf90_check( nf90_inquire(idnum, unlimitedDimId = unlimitedDimId ), clinfo ) 
    375  
    376         DO idim = 1, ndims 
    377            CALL iom_nf90_check( nf90_inquire_dimension(idnum, idim, dimname, dimlen ), clinfo ) 
    378            indimlens(idim) = dimlen 
    379            indimnames(idim) = dimname 
    380         ENDDO 
    381  
    382         DO jv =1, nvars 
    383             lmeta = .FALSE. 
    384             CALL iom_nf90_check( nf90_inquire_variable(idnum, jv, varname, xtype, ndims, dimids, natts ), clinfo ) 
    385             DO i = 1, NMETA 
    386                IF(TRIM(varname) == TRIM(meta(i))) THEN 
    387                   lmeta = .TRUE. 
    388                ENDIF 
    389             ENDDO 
    390             IF(.NOT.lmeta) THEN 
    391                CALL xios_add_child(file_hdl, field_hdl, TRIM(varname)) 
    392                mdims = ndims 
    393  
    394                IF(ANY(dimids(1:ndims) == unlimitedDimId)) THEN 
    395                 mdims = mdims - 1 
    396                ENDIF 
    397  
    398                IF(mdims == 3) THEN 
    399                       CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(varname),   & 
    400                                    domain_ref="grid_N", axis_ref=TRIM(iom_axis(indimlens(dimids(mdims)))), & 
    401                                    prec = 8, operation = "instant") 
    402                ELSEIF(mdims == 2) THEN 
    403                       CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(varname), & 
    404                                           domain_ref="grid_N", prec = 8, operation = "instant")  
    405                ELSEIF(mdims == 1) THEN 
    406                       CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(varname), & 
    407                                           axis_ref=TRIM(iom_axis(indimlens(dimids(mdims)))), prec = 8, operation = "instant") 
    408                ELSEIF(mdims == 0) THEN 
    409                       CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(varname), & 
    410                                                 scalar_ref = "grid_scalar", prec = 8, operation = "instant") 
    411                ELSE 
    412                       WRITE(ctmp1,*) 'iom_set_vars_active: variable ', TRIM(varname) ,' incorrect number of dimensions'  
    413                       CALL ctl_stop( 'iom_set_vars_active:', ctmp1 ) 
    414                ENDIF 
     380      CALL xios_get_handle("file_definition", filegroup_hdl ) 
     381      CALL xios_add_child(filegroup_hdl, file_hdl, 'rrestart') 
     382      CALL xios_set_file_attr( "rrestart", name=fname, type="one_file",      & 
     383           par_access="collective", enabled=.TRUE., mode="read",              & 
     384                                                    output_freq=xios_timestep ) 
     385 
     386      CALL iom_nf90_check( nf90_inquire(iom_file(idnum)%nfid, ndims, nvars, natts ), clinfo ) 
     387      ALLOCATE(indimlens(ndims), indimnames(ndims)) 
     388      CALL iom_nf90_check( nf90_inquire(iom_file(idnum)%nfid, unlimitedDimId = unlimitedDimId ), clinfo ) 
     389 
     390      DO idim = 1, ndims 
     391         CALL iom_nf90_check( nf90_inquire_dimension(iom_file(idnum)%nfid, idim, dimname, dimlen ), clinfo ) 
     392         indimlens(idim) = dimlen 
     393         indimnames(idim) = dimname 
     394      ENDDO 
     395 
     396      DO jv =1, nvars 
     397         lmeta = .FALSE. 
     398         CALL iom_nf90_check( nf90_inquire_variable(iom_file(idnum)%nfid, jv, varname, xtype, ndims, dimids, natts ), clinfo ) 
     399         DO i = 1, NMETA 
     400           IF(varname == meta(i)) THEN 
     401             lmeta = .TRUE. 
     402           ENDIF 
     403         ENDDO 
     404         IF(.NOT.lmeta) THEN 
     405            CALL xios_add_child(file_hdl, field_hdl, varname) 
     406            mdims = ndims 
     407 
     408            IF(ANY(dimids(1:ndims) == unlimitedDimId)) THEN 
     409               mdims = mdims - 1 
    415410            ENDIF 
    416         ENDDO 
    417         DEALLOCATE(indimlens, indimnames) 
     411 
     412            IF(mdims == 3) THEN 
     413               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname,   & 
     414                                   domain_ref="grid_N",                           & 
     415                                   axis_ref=iom_axis(indimlens(dimids(mdims))),   & 
     416                                   prec = 8, operation = "instant"                ) 
     417            ELSEIF(mdims == 2) THEN 
     418               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname,  & 
     419                                   domain_ref="grid_N", prec = 8,                & 
     420                                   operation = "instant"                         )  
     421            ELSEIF(mdims == 1) THEN 
     422               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname, & 
     423                                   axis_ref=iom_axis(indimlens(dimids(mdims))), & 
     424                                   prec = 8, operation = "instant"              ) 
     425            ELSEIF(mdims == 0) THEN 
     426               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname, & 
     427                                   scalar_ref = "grid_scalar", prec = 8,        & 
     428                                   operation = "instant"                        ) 
     429            ELSE 
     430               WRITE(ctmp1,*) 'iom_set_vars_active: variable ', TRIM(varname) ,' incorrect number of dimensions'  
     431               CALL ctl_stop( 'iom_set_vars_active:', ctmp1 ) 
     432            ENDIF 
     433         ENDIF 
     434      ENDDO 
     435      DEALLOCATE(indimlens, indimnames) 
    418436#endif 
    419437   END SUBROUTINE iom_set_vars_active 
     
    425443      !! ** Purpose :  define file name in XIOS context for writing restart 
    426444      !!--------------------------------------------------------------------- 
    427    CHARACTER(len=*) :: cdrst_file 
     445      CHARACTER(len=*) :: cdrst_file 
    428446#if defined key_iomput 
    429    TYPE(xios_file) :: file_hdl 
    430    TYPE(xios_filegroup) :: filegroup_hdl 
    431    INTEGER :: i 
    432    CHARACTER(lc)  ::   clpath 
     447      TYPE(xios_file) :: file_hdl 
     448      TYPE(xios_filegroup) :: filegroup_hdl 
    433449 
    434450!set name of the restart file and enable available fields 
    435         IF(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS write) to: ',cdrst_file 
    436         CALL xios_get_handle("file_definition", filegroup_hdl ) 
    437         CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart') 
    438         IF(nxioso.eq.1) THEN  
    439            CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&  
    440                                     mode="write", output_freq=xios_timestep)  
    441            if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'  
    442         ELSE   
    443            CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&  
    444                                     mode="write", output_freq=xios_timestep)  
    445            if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'  
    446         ENDIF  
    447         CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file)) 
     451      IF(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS write) to: ', TRIM(cdrst_file) 
     452      CALL xios_get_handle("file_definition", filegroup_hdl ) 
     453      CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart') 
     454      IF(nxioso.eq.1) THEN  
     455         CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&  
     456                                       mode="write", output_freq=xios_timestep)  
     457         IF(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'  
     458      ELSE   
     459         CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&  
     460                                            mode="write", output_freq=xios_timestep)  
     461         IF(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'  
     462      ENDIF  
     463      CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file)) 
    448464#endif 
    449465   END SUBROUTINE iom_set_rstw_file 
     
    458474      !!--------------------------------------------------------------------- 
    459475!sets enabled = .TRUE. for each field in restart file 
    460    CHARACTER(len = *), INTENT(IN)                     :: sdfield 
    461    REAL(dp), OPTIONAL, INTENT(IN)                     :: rd0 
    462    REAL(sp), OPTIONAL, INTENT(IN)                     :: rs0 
    463    REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:)       :: rd1 
    464    REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:)       :: rs1 
    465    REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:, :)    :: rd2 
    466    REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:, :)    :: rs2 
    467    REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:, :, :) :: rd3   
    468    REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:, :, :) :: rs3 
     476      CHARACTER(len = *), INTENT(IN)                     :: sdfield 
     477      REAL(dp), OPTIONAL, INTENT(IN)                     :: rd0 
     478      REAL(sp), OPTIONAL, INTENT(IN)                     :: rs0 
     479      REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:)       :: rd1 
     480      REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:)       :: rs1 
     481      REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:, :)    :: rd2 
     482      REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:, :)    :: rs2 
     483      REAL(dp), OPTIONAL, INTENT(IN), DIMENSION(:, :, :) :: rd3   
     484      REAL(sp), OPTIONAL, INTENT(IN), DIMENSION(:, :, :) :: rs3 
    469485#if defined key_iomput 
    470    TYPE(xios_field) :: field_hdl 
    471    TYPE(xios_file) :: file_hdl 
    472    INTEGER :: i 
    473    CHARACTER(lc)  ::   clpath 
    474    CHARACTER(len=1024) :: fname 
    475    CHARACTER(len=lc)   :: axis_ref 
    476  
    477         CALL xios_get_handle("wrestart", file_hdl) 
     486      TYPE(xios_field) :: field_hdl 
     487      TYPE(xios_file) :: file_hdl 
     488 
     489      CALL xios_get_handle("wrestart", file_hdl) 
    478490!define fields for restart context 
    479         CALL xios_add_child(file_hdl, field_hdl, TRIM(sdfield)) 
    480  
    481         IF(PRESENT(rd3)) THEN 
    482                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield),   & 
    483                             domain_ref="grid_N", axis_ref=TRIM(iom_axis(size(rd3, 3))), & 
    484                             prec = 8, operation = "instant") 
    485         ELSEIF(PRESENT(rs3)) THEN 
    486                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield),   & 
    487                             domain_ref="grid_N", axis_ref=TRIM(iom_axis(size(rd3, 3))), & 
    488                             prec = 4, operation = "instant") 
    489         ELSEIF(PRESENT(rd2)) THEN 
    490                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield), & 
    491                                    domain_ref="grid_N", prec = 8, operation = "instant")  
    492         ELSEIF(PRESENT(rs2)) THEN 
    493                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield), & 
    494                                    domain_ref="grid_N", prec = 4, operation = "instant") 
    495         ELSEIF(PRESENT(rd1)) THEN 
    496                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield), & 
    497                                    axis_ref=TRIM(iom_axis(size(rd1, 1))), prec = 8, operation = "instant") 
    498         ELSEIF(PRESENT(rs1)) THEN 
    499                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield), & 
    500                                    axis_ref=TRIM(iom_axis(size(rd1, 1))), prec = 4, operation = "instant") 
    501         ELSEIF(PRESENT(rd0)) THEN 
    502                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield), & 
    503                                          scalar_ref = "grid_scalar", prec = 8, operation = "instant") 
    504         ELSEIF(PRESENT(rs0)) THEN 
    505                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(sdfield), & 
    506                                          scalar_ref = "grid_scalar", prec = 4, operation = "instant") 
    507         ENDIF 
     491      CALL xios_add_child(file_hdl, field_hdl, sdfield) 
     492 
     493      IF(PRESENT(rd3)) THEN 
     494         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     495                             domain_ref = "grid_N",                       & 
     496                             axis_ref = iom_axis(size(rd3, 3)),           & 
     497                             prec = 8, operation = "instant"              ) 
     498      ELSEIF(PRESENT(rs3)) THEN 
     499         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     500                             domain_ref = "grid_N",                       & 
     501                             axis_ref = iom_axis(size(rd3, 3)),           & 
     502                             prec = 4, operation = "instant"              ) 
     503      ELSEIF(PRESENT(rd2)) THEN 
     504         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     505                             domain_ref = "grid_N", prec = 8,             & 
     506                             operation = "instant"                        )  
     507      ELSEIF(PRESENT(rs2)) THEN 
     508         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     509                             domain_ref = "grid_N", prec = 4,             & 
     510                             operation = "instant"                        ) 
     511      ELSEIF(PRESENT(rd1)) THEN 
     512         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     513                             axis_ref = iom_axis(size(rd1, 1)),           & 
     514                             prec = 8, operation = "instant"              ) 
     515      ELSEIF(PRESENT(rs1)) THEN 
     516         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     517                             axis_ref = iom_axis(size(rd1, 1)),           & 
     518                             prec = 4, operation = "instant"              ) 
     519      ELSEIF(PRESENT(rd0)) THEN 
     520         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     521                             scalar_ref = "grid_scalar", prec = 8,        & 
     522                             operation = "instant"                        ) 
     523      ELSEIF(PRESENT(rs0)) THEN 
     524         CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield, & 
     525                             scalar_ref = "grid_scalar", prec = 4,        & 
     526                             operation = "instant"                        ) 
     527      ENDIF 
    508528#endif 
    509529   END SUBROUTINE iom_set_rstw_active 
    510530 
    511531   FUNCTION iom_axis(idlev) result(axis_ref) 
    512      !!--------------------------------------------------------------------- 
     532      !!--------------------------------------------------------------------- 
    513533      !!                   ***  FUNCTION  iom_axis  *** 
    514534      !! 
     
    518538      !!              iom_set_rst_context 
    519539      !!--------------------------------------------------------------------- 
    520     INTEGER, INTENT(IN) :: idlev 
    521     CHARACTER(len=lc)   :: axis_ref 
    522     CHARACTER(len=12)   :: str 
    523        IF(idlev == jpk) THEN 
     540      INTEGER, INTENT(IN) :: idlev 
     541      CHARACTER(len=lc)   :: axis_ref 
     542      CHARACTER(len=12)   :: str 
     543      IF(idlev == jpk) THEN 
    524544         axis_ref="nav_lev" 
    525545#if defined key_si3 
    526        ELSEIF(idlev == jpl) THEN 
     546      ELSEIF(idlev == jpl) THEN 
    527547         axis_ref="numcat" 
    528548#endif          
    529        ELSE 
     549      ELSE 
    530550         write(str, *) idlev 
    531551         CALL ctl_stop( 'iom_axis', 'Definition for axis with '//TRIM(ADJUSTL(str))//' levels missing') 
    532        ENDIF 
     552      ENDIF 
    533553   END FUNCTION iom_axis 
    534554 
     555   FUNCTION iom_xios_setid(cdname) result(kid) 
     556     !!--------------------------------------------------------------------- 
     557      !!                   ***  FUNCTION    *** 
     558      !! 
     559      !! ** Purpose : this function returns first available id to keep information about file  
     560      !!              sets filename in iom_file structure and sets name 
     561      !!              of XIOS context depending on cdcomp 
     562      !!              corresponds to iom_nf90_open 
     563      !!--------------------------------------------------------------------- 
     564      CHARACTER(len=*), INTENT(in   ) :: cdname      ! File name 
     565      INTEGER                         :: kid      ! identifier of the opened file 
     566      INTEGER                         :: jl 
     567 
     568      kid = 0 
     569      DO jl = jpmax_files, 1, -1 
     570         IF( iom_file(jl)%nfid == 0 )   kid = jl 
     571      ENDDO 
     572 
     573      iom_file(kid)%name   = TRIM(cdname) 
     574      iom_file(kid)%nfid   = 1 
     575      iom_file(kid)%nvars  = 0 
     576      iom_file(kid)%irec   = -1 
     577 
     578   END FUNCTION iom_xios_setid 
     579 
    535580   SUBROUTINE iom_set_rst_context(ld_rstr)  
    536      !!--------------------------------------------------------------------- 
     581      !!--------------------------------------------------------------------- 
    537582      !!                   ***  SUBROUTINE  iom_set_rst_context  *** 
    538583      !! 
     
    541586      !!                
    542587      !!--------------------------------------------------------------------- 
    543    LOGICAL, INTENT(IN)               :: ld_rstr 
    544    INTEGER :: ji 
     588      LOGICAL, INTENT(IN)               :: ld_rstr 
     589      INTEGER :: ji 
    545590#if defined key_iomput 
    546    TYPE(xios_domaingroup)            :: domaingroup_hdl  
    547    TYPE(xios_domain)                 :: domain_hdl  
    548    TYPE(xios_axisgroup)              :: axisgroup_hdl  
    549    TYPE(xios_axis)                   :: axis_hdl  
    550    TYPE(xios_scalar)                 :: scalar_hdl  
    551    TYPE(xios_scalargroup)            :: scalargroup_hdl  
    552  
    553      CALL xios_get_handle("domain_definition",domaingroup_hdl)  
    554      CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N")  
    555      CALL set_grid("N", glamt, gphit, .TRUE., ld_rstr)  
     591      TYPE(xios_domaingroup)            :: domaingroup_hdl  
     592      TYPE(xios_domain)                 :: domain_hdl  
     593      TYPE(xios_axisgroup)              :: axisgroup_hdl  
     594      TYPE(xios_axis)                   :: axis_hdl  
     595      TYPE(xios_scalar)                 :: scalar_hdl  
     596      TYPE(xios_scalargroup)            :: scalargroup_hdl  
     597 
     598      CALL xios_get_handle("domain_definition",domaingroup_hdl)  
     599      CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N")  
     600      CALL set_grid("N", glamt, gphit, .TRUE., ld_rstr)  
    556601  
    557      CALL xios_get_handle("axis_definition",axisgroup_hdl)  
    558      CALL xios_add_child(axisgroup_hdl, axis_hdl, "nav_lev")  
     602      CALL xios_get_handle("axis_definition",axisgroup_hdl)  
     603      CALL xios_add_child(axisgroup_hdl, axis_hdl, "nav_lev")  
    559604!AGRIF fails to compile when unit= is in call to xios_set_axis_attr 
    560 !    CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels",  unit="m", positive="down")  
    561      CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels in meters", positive="down") 
    562      CALL iom_set_axis_attr( "nav_lev", paxis = gdept_1d )  
     605!     CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels",  unit="m", positive="down")  
     606      CALL xios_set_axis_attr( "nav_lev", long_name = "Vertical levels in meters", positive = "down") 
     607      CALL iom_set_axis_attr( "nav_lev", paxis = gdept_1d )  
    563608#if defined key_si3 
    564      CALL xios_add_child(axisgroup_hdl, axis_hdl, "numcat") 
    565      CALL iom_set_axis_attr( "numcat", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
    566 #endif 
    567  
    568      CALL xios_get_handle("scalar_definition", scalargroup_hdl)  
    569      CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar")  
     609      CALL xios_add_child(axisgroup_hdl, axis_hdl, "numcat") 
     610      CALL iom_set_axis_attr( "numcat", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
     611#endif 
     612      CALL xios_get_handle("scalar_definition", scalargroup_hdl)  
     613      CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar")  
    570614#endif 
    571615   END SUBROUTINE iom_set_rst_context 
     616 
     617 
     618   SUBROUTINE set_xios_context(kdid, cdcont)  
     619      !!--------------------------------------------------------------------- 
     620      !!                   ***  SUBROUTINE  iom_set_rst_context  *** 
     621      !! 
     622      !! ** Purpose : set correct XIOS context based on kdid 
     623      !!                
     624      !!--------------------------------------------------------------------- 
     625      INTEGER,           INTENT(IN)     :: kdid           ! Identifier of the file 
     626      CHARACTER(LEN=lc), INTENT(OUT)    :: cdcont         ! name of the context for XIOS read/write 
     627       
     628      cdcont = "NONE" 
     629 
     630      IF(lrxios) THEN 
     631         IF(kdid == numror) THEN 
     632            cdcont = cr_ocerst_cxt 
     633         ELSEIF(kdid == numrir) THEN 
     634            cdcont = cr_icerst_cxt  
     635         ELSEIF(kdid == numrtr) THEN 
     636            cdcont = cr_toprst_cxt 
     637         ELSEIF(kdid == numrsr) THEN 
     638            cdcont = cr_sedrst_cxt 
     639         ENDIF 
     640      ENDIF 
     641 
     642      IF(lwxios) THEN 
     643         IF(kdid == numrow) THEN 
     644            cdcont = cw_ocerst_cxt 
     645         ELSEIF(kdid == numriw) THEN 
     646            cdcont = cw_icerst_cxt 
     647         ELSEIF(kdid == numrtw) THEN 
     648            cdcont = cw_toprst_cxt 
     649         ELSEIF(kdid == numrsw) THEN 
     650            cdcont = cw_sedrst_cxt 
     651         ENDIF 
     652      ENDIF 
     653   END SUBROUTINE set_xios_context 
     654 
    572655 
    573656   SUBROUTINE iom_swap( cdname ) 
     
    829912   !!                   INTERFACE iom_get 
    830913   !!---------------------------------------------------------------------- 
    831    SUBROUTINE iom_g0d_sp( kiomid, cdvar, pvar, ktime, ldxios ) 
     914   SUBROUTINE iom_g0d_sp( kiomid, cdvar, pvar, ktime ) 
    832915      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
    833916      CHARACTER(len=*), INTENT(in   )                 ::   cdvar     ! Name of the variable 
     
    835918      REAL(dp)                                        ::   ztmp_pvar ! tmp var to read field 
    836919      INTEGER         , INTENT(in   ),     OPTIONAL   ::   ktime     ! record number 
    837       LOGICAL         , INTENT(in   ),     OPTIONAL   ::   ldxios    ! use xios to read restart 
    838920      ! 
    839921      INTEGER                                         ::   idvar     ! variable id 
     
    843925      CHARACTER(LEN=100)                              ::   clname    ! file name 
    844926      CHARACTER(LEN=1)                                ::   cldmspc   ! 
    845       LOGICAL                                         ::   llxios 
    846       ! 
    847       llxios = .FALSE. 
    848       IF( PRESENT(ldxios) ) llxios = ldxios 
    849  
    850       IF(.NOT.llxios) THEN  ! read data using default library 
     927      CHARACTER(LEN=lc)                               ::   context 
     928      ! 
     929      CALL set_xios_context(kiomid, context) 
     930 
     931      IF(context == "NONE") THEN  ! read data using default library 
    851932         itime = 1 
    852933         IF( PRESENT(ktime) ) itime = ktime 
     
    871952#if defined key_iomput 
    872953         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar) 
     954         CALL iom_swap(context) 
    873955         CALL xios_recv_field( trim(cdvar), pvar) 
     956         CALL iom_swap(cxios_context) 
    874957#else 
    875958         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//trim(clname)//', var:'//trim(cdvar) 
     
    879962   END SUBROUTINE iom_g0d_sp 
    880963 
    881    SUBROUTINE iom_g0d_dp( kiomid, cdvar, pvar, ktime, ldxios ) 
     964   SUBROUTINE iom_g0d_dp( kiomid, cdvar, pvar, ktime ) 
    882965      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
    883966      CHARACTER(len=*), INTENT(in   )                 ::   cdvar     ! Name of the variable 
    884967      REAL(dp)        , INTENT(  out)                 ::   pvar      ! read field 
    885968      INTEGER         , INTENT(in   ),     OPTIONAL   ::   ktime     ! record number 
    886       LOGICAL         , INTENT(in   ),     OPTIONAL   ::   ldxios    ! use xios to read restart 
    887969      ! 
    888970      INTEGER                                         ::   idvar     ! variable id 
     
    892974      CHARACTER(LEN=100)                              ::   clname    ! file name 
    893975      CHARACTER(LEN=1)                                ::   cldmspc   ! 
    894       LOGICAL                                         ::   llxios 
    895       ! 
    896       llxios = .FALSE. 
    897       IF( PRESENT(ldxios) ) llxios = ldxios 
    898  
    899       IF(.NOT.llxios) THEN  ! read data using default library 
     976      CHARACTER(LEN=lc)                               ::   context 
     977      ! 
     978      CALL set_xios_context(kiomid, context) 
     979 
     980      IF(context == "NONE") THEN  ! read data using default library 
    900981         itime = 1 
    901982         IF( PRESENT(ktime) ) itime = ktime 
     
    9191000#if defined key_iomput 
    9201001         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar) 
     1002         CALL iom_swap(context) 
    9211003         CALL xios_recv_field( trim(cdvar), pvar) 
     1004         CALL iom_swap(cxios_context) 
    9221005#else 
    9231006         WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//trim(clname)//', var:'//trim(cdvar) 
     
    9271010   END SUBROUTINE iom_g0d_dp 
    9281011 
    929    SUBROUTINE iom_g1d_sp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios ) 
     1012   SUBROUTINE iom_g1d_sp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 
    9301013      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    9311014      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    9361019      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kstart    ! start axis position of the reading  
    9371020      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis 
    938       LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    9391021      ! 
    9401022      IF( kiomid > 0 ) THEN 
     
    9421024            ALLOCATE(ztmp_pvar(size(pvar,1))) 
    9431025            CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r1d=ztmp_pvar,   & 
    944               &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
    945               &                                                     ldxios=ldxios ) 
     1026              &                                                     ktime=ktime, kstart=kstart, kcount=kcount ) 
    9461027            pvar = ztmp_pvar 
    9471028            DEALLOCATE(ztmp_pvar) 
     
    9511032 
    9521033 
    953    SUBROUTINE iom_g1d_dp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios ) 
     1034   SUBROUTINE iom_g1d_dp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 
    9541035      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    9551036      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    9591040      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kstart    ! start axis position of the reading  
    9601041      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis 
    961       LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    9621042      ! 
    9631043      IF( kiomid > 0 ) THEN 
    9641044         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r1d=pvar,   & 
    965               &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
    966               &                                                     ldxios=ldxios ) 
     1045              &                                                     ktime=ktime, kstart=kstart, kcount=kcount) 
    9671046      ENDIF 
    9681047   END SUBROUTINE iom_g1d_dp 
    9691048 
    970    SUBROUTINE iom_g2d_sp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount, ldxios) 
     1049   SUBROUTINE iom_g2d_sp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount) 
    9711050      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    9721051      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    9801059      INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kstart    ! start axis position of the reading  
    9811060      INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kcount    ! number of points in each axis 
    982       LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    9831061      ! 
    9841062      IF( kiomid > 0 ) THEN 
     
    9871065            CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r2d = ztmp_pvar  , ktime = ktime,   & 
    9881066             &                                                      cd_type = cd_type, psgn   = psgn  , kfill = kfill,   & 
    989              &                                                      kstart  = kstart , kcount = kcount, ldxios=ldxios  ) 
     1067             &                                                      kstart  = kstart , kcount = kcount  ) 
    9901068            pvar = ztmp_pvar 
    9911069            DEALLOCATE(ztmp_pvar) 
     
    9941072   END SUBROUTINE iom_g2d_sp 
    9951073 
    996    SUBROUTINE iom_g2d_dp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount, ldxios) 
     1074   SUBROUTINE iom_g2d_dp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount) 
    9971075      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    9981076      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    10051083      INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kstart    ! start axis position of the reading  
    10061084      INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kcount    ! number of points in each axis 
    1007       LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    10081085      ! 
    10091086      IF( kiomid > 0 ) THEN 
    10101087         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r2d = pvar  , ktime = ktime,   & 
    10111088            &                                                       cd_type = cd_type, psgn   = psgn  , kfill = kfill,   & 
    1012             &                                                       kstart  = kstart , kcount = kcount, ldxios=ldxios  ) 
     1089            &                                                       kstart  = kstart , kcount = kcount                ) 
    10131090      ENDIF 
    10141091   END SUBROUTINE iom_g2d_dp 
    10151092 
    1016    SUBROUTINE iom_g3d_sp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount, ldxios ) 
     1093   SUBROUTINE iom_g3d_sp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount ) 
    10171094      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    10181095      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    10261103      INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kstart    ! start axis position of the reading  
    10271104      INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kcount    ! number of points in each axis 
    1028       LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    10291105      ! 
    10301106      IF( kiomid > 0 ) THEN 
     
    10331109            CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r3d = ztmp_pvar  , ktime = ktime,   & 
    10341110            &                                                       cd_type = cd_type, psgn   = psgn  , kfill = kfill,   & 
    1035             &                                                       kstart  = kstart , kcount = kcount, ldxios=ldxios  ) 
     1111            &                                                       kstart  = kstart , kcount = kcount                ) 
    10361112            pvar = ztmp_pvar 
    10371113            DEALLOCATE(ztmp_pvar) 
     
    10401116   END SUBROUTINE iom_g3d_sp 
    10411117 
    1042    SUBROUTINE iom_g3d_dp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount, ldxios ) 
     1118   SUBROUTINE iom_g3d_dp( kiomid, kdom, cdvar, pvar, ktime, cd_type, psgn, kfill, kstart, kcount ) 
    10431119      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    10441120      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    10511127      INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kstart    ! start axis position of the reading  
    10521128      INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kcount    ! number of points in each axis 
    1053       LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    10541129      ! 
    10551130      IF( kiomid > 0 ) THEN 
     
    10571132            CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r3d = pvar  , ktime = ktime,   & 
    10581133            &                                                       cd_type = cd_type, psgn   = psgn  , kfill = kfill,   & 
    1059             &                                                       kstart  = kstart , kcount = kcount, ldxios=ldxios  ) 
     1134            &                                                       kstart  = kstart , kcount = kcount                ) 
    10601135         END IF 
    10611136      ENDIF 
     
    10651140 
    10661141   SUBROUTINE iom_get_123d( kiomid , kdom, cdvar, pv_r1d, pv_r2d, pv_r3d, ktime ,   & 
    1067          &                  cd_type, psgn, kfill, kstart, kcount, ldxios ) 
     1142         &                  cd_type, psgn, kfill, kstart, kcount ) 
    10681143      !!----------------------------------------------------------------------- 
    10691144      !!                  ***  ROUTINE  iom_get_123d  *** 
     
    10851160      INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kstart    ! start position of the reading in each axis  
    10861161      INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kcount    ! number of points to be read in each axis 
    1087       LOGICAL                    , INTENT(in   ), OPTIONAL ::   ldxios    ! use XIOS to read restart 
    10881162      ! 
    10891163      LOGICAL                        ::   llok        ! true if ok! 
    1090       LOGICAL                        ::   llxios      ! local definition for XIOS read 
    10911164      INTEGER                        ::   jl          ! loop on number of dimension  
    10921165      INTEGER                        ::   idom        ! type of domain 
     
    11151188      REAL(dp)                       ::   gma, gmi 
    11161189      !--------------------------------------------------------------------- 
    1117       ! 
     1190      CHARACTER(LEN=lc)                               ::   context 
     1191      ! 
     1192      CALL set_xios_context(kiomid, context) 
    11181193      inlev = -1 
    11191194      IF( PRESENT(pv_r3d) )   inlev = SIZE(pv_r3d, 3) 
    11201195      ! 
    1121       llxios = .FALSE. 
    1122       IF( PRESENT(ldxios) )   llxios = ldxios 
    1123       ! 
    11241196      idom = kdom 
    11251197      istop = nstop 
    11261198      ! 
    1127       IF(.NOT.llxios) THEN 
     1199      IF(context == "NONE") THEN 
    11281200         clname = iom_file(kiomid)%name   !   esier to read 
    11291201         clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar) 
     
    12931365!would be good to be able to check which context is active and swap only if current is not restart 
    12941366         idvar = iom_varid( kiomid, cdvar ) 
    1295  
     1367         CALL iom_swap(context) 
    12961368         zsgn = 1._wp 
    12971369         IF( PRESENT(psgn   ) )   zsgn    = psgn 
     
    13151387            CALL xios_recv_field( trim(cdvar), pv_r1d) 
    13161388         ENDIF 
     1389         CALL iom_swap(cxios_context) 
    13171390#else 
    13181391         istop = istop + 1  
     
    15101583   !!                   INTERFACE iom_rstput 
    15111584   !!---------------------------------------------------------------------- 
    1512    SUBROUTINE iom_rp0d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1585   SUBROUTINE iom_rp0d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    15131586      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    15141587      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    15171590      REAL(sp)        , INTENT(in)                         ::   pvar     ! written field 
    15181591      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1519       LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
    1520       LOGICAL :: llx                ! local xios write flag 
    1521       INTEGER :: ivid   ! variable id 
    1522  
    1523       llx = .FALSE. 
    1524       IF(PRESENT(ldxios)) llx = ldxios 
     1592      ! 
     1593      LOGICAL           :: llx                ! local xios write flag 
     1594      INTEGER           :: ivid   ! variable id 
     1595      CHARACTER(LEN=lc) :: context 
     1596      ! 
     1597      CALL set_xios_context(kiomid, context) 
     1598 
     1599      llx = .NOT. (context == "NONE") 
     1600 
    15251601      IF( llx ) THEN 
    15261602#ifdef key_iomput 
    1527       IF( kt == kwrite ) THEN 
    1528           IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
    1529           CALL iom_put(trim(cdvar), pvar) 
    1530       ELSE 
    1531           IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',trim(cdvar) 
    1532           CALL iom_set_rstw_active( trim(cdvar), rs0 = pvar )  
    1533       ENDIF 
     1603         IF( kt == kwrite ) THEN 
     1604            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
     1605            CALL iom_swap(context) 
     1606            CALL iom_put(trim(cdvar), pvar) 
     1607            CALL iom_swap(cxios_context) 
     1608         ELSE 
     1609            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',trim(cdvar) 
     1610            CALL iom_swap(context) 
     1611            CALL iom_set_rstw_active( trim(cdvar), rs0 = pvar )  
     1612            CALL iom_swap(cxios_context) 
     1613         ENDIF 
    15341614#endif 
    15351615      ELSE 
     
    15431623   END SUBROUTINE iom_rp0d_sp 
    15441624 
    1545    SUBROUTINE iom_rp0d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1625   SUBROUTINE iom_rp0d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    15461626      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    15471627      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    15501630      REAL(dp)        , INTENT(in)                         ::   pvar     ! written field 
    15511631      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1552       LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
    1553       LOGICAL :: llx                ! local xios write flag 
    1554       INTEGER :: ivid   ! variable id 
    1555  
    1556       llx = .FALSE. 
    1557       IF(PRESENT(ldxios)) llx = ldxios 
     1632      ! 
     1633      LOGICAL           :: llx                ! local xios write flag 
     1634      INTEGER           :: ivid   ! variable id 
     1635      CHARACTER(LEN=lc) :: context 
     1636      ! 
     1637      CALL set_xios_context(kiomid, context) 
     1638 
     1639      llx = .NOT. (context == "NONE") 
     1640 
    15581641      IF( llx ) THEN 
    15591642#ifdef key_iomput 
    1560       IF( kt == kwrite ) THEN 
    1561           IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
    1562           CALL iom_put(trim(cdvar), pvar) 
    1563       ELSE 
    1564           IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',trim(cdvar) 
    1565           CALL iom_set_rstw_active( trim(cdvar), rd0 = pvar )  
    1566       ENDIF 
     1643         IF( kt == kwrite ) THEN 
     1644            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
     1645            CALL iom_swap(context) 
     1646            CALL iom_put(trim(cdvar), pvar) 
     1647            CALL iom_swap(cxios_context) 
     1648         ELSE 
     1649            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',trim(cdvar) 
     1650            CALL iom_swap(context) 
     1651            CALL iom_set_rstw_active( trim(cdvar), rd0 = pvar )  
     1652            CALL iom_swap(cxios_context) 
     1653         ENDIF 
    15671654#endif 
    15681655      ELSE 
     
    15771664 
    15781665 
    1579    SUBROUTINE iom_rp1d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1666   SUBROUTINE iom_rp1d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    15801667      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    15811668      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    15841671      REAL(sp)        , INTENT(in), DIMENSION(          :) ::   pvar     ! written field 
    15851672      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1586       LOGICAL, OPTIONAL                                    ::   ldxios   ! xios write flag 
    1587       LOGICAL :: llx                ! local xios write flag 
    1588       INTEGER :: ivid   ! variable id 
    1589  
    1590       llx = .FALSE. 
    1591       IF(PRESENT(ldxios)) llx = ldxios 
     1673      ! 
     1674      LOGICAL           :: llx                ! local xios write flag 
     1675      INTEGER           :: ivid   ! variable id 
     1676      CHARACTER(LEN=lc) :: context 
     1677      ! 
     1678      CALL set_xios_context(kiomid, context) 
     1679 
     1680      llx = .NOT. (context == "NONE") 
     1681 
    15921682      IF( llx ) THEN 
    15931683#ifdef key_iomput 
    1594       IF( kt == kwrite ) THEN 
    1595          IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
    1596          CALL iom_put(trim(cdvar), pvar) 
    1597       ELSE 
    1598          IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',trim(cdvar) 
    1599          CALL iom_set_rstw_active( trim(cdvar), rs1 = pvar ) 
    1600       ENDIF 
     1684         IF( kt == kwrite ) THEN 
     1685            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
     1686            CALL iom_swap(context) 
     1687            CALL iom_put(trim(cdvar), pvar) 
     1688            CALL iom_swap(cxios_context) 
     1689         ELSE 
     1690            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',trim(cdvar) 
     1691            CALL iom_swap(context) 
     1692            CALL iom_set_rstw_active( trim(cdvar), rs1 = pvar ) 
     1693            CALL iom_swap(cxios_context) 
     1694         ENDIF 
    16011695#endif 
    16021696      ELSE 
     
    16101704   END SUBROUTINE iom_rp1d_sp 
    16111705 
    1612    SUBROUTINE iom_rp1d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1706   SUBROUTINE iom_rp1d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    16131707      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    16141708      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    16171711      REAL(dp)        , INTENT(in), DIMENSION(          :) ::   pvar     ! written field 
    16181712      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1619       LOGICAL, OPTIONAL                                    ::   ldxios   ! xios write flag 
    1620       LOGICAL :: llx                ! local xios write flag 
    1621       INTEGER :: ivid   ! variable id 
    1622  
    1623       llx = .FALSE. 
    1624       IF(PRESENT(ldxios)) llx = ldxios 
     1713      ! 
     1714      LOGICAL           :: llx                ! local xios write flag 
     1715      INTEGER           :: ivid   ! variable id 
     1716      CHARACTER(LEN=lc) :: context 
     1717      ! 
     1718      CALL set_xios_context(kiomid, context) 
     1719 
     1720      llx = .NOT. (context == "NONE") 
     1721 
    16251722      IF( llx ) THEN 
    16261723#ifdef key_iomput 
    1627       IF( kt == kwrite ) THEN 
    1628          IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
    1629          CALL iom_put(trim(cdvar), pvar) 
    1630       ELSE 
    1631          IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',trim(cdvar) 
    1632          CALL iom_set_rstw_active( trim(cdvar), rd1 = pvar ) 
    1633       ENDIF 
     1724         IF( kt == kwrite ) THEN 
     1725            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
     1726            CALL iom_swap(context) 
     1727            CALL iom_put(trim(cdvar), pvar) 
     1728            CALL iom_swap(cxios_context) 
     1729         ELSE 
     1730            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',trim(cdvar) 
     1731            CALL iom_swap(context) 
     1732            CALL iom_set_rstw_active( trim(cdvar), rd1 = pvar ) 
     1733            CALL iom_swap(cxios_context) 
     1734         ENDIF 
    16341735#endif 
    16351736      ELSE 
     
    16441745 
    16451746 
    1646    SUBROUTINE iom_rp2d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1747   SUBROUTINE iom_rp2d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    16471748      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    16481749      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    16511752      REAL(sp)        , INTENT(in), DIMENSION(:,    :    ) ::   pvar     ! written field 
    16521753      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1653       LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
    1654       LOGICAL :: llx 
    1655       INTEGER :: ivid   ! variable id 
    1656  
    1657       llx = .FALSE. 
    1658       IF(PRESENT(ldxios)) llx = ldxios 
     1754      ! 
     1755      LOGICAL            :: llx 
     1756      INTEGER            :: ivid   ! variable id 
     1757      CHARACTER(LEN=lc)  :: context 
     1758      ! 
     1759      CALL set_xios_context(kiomid, context) 
     1760 
     1761      llx = .NOT. (context == "NONE") 
     1762 
    16591763      IF( llx ) THEN 
    16601764#ifdef key_iomput 
    1661       IF( kt == kwrite ) THEN 
    1662          IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
    1663          CALL iom_put(trim(cdvar), pvar) 
    1664       ELSE 
    1665          IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',trim(cdvar) 
    1666          CALL iom_set_rstw_active( trim(cdvar), rs2 = pvar ) 
    1667       ENDIF 
     1765         IF( kt == kwrite ) THEN 
     1766            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
     1767            CALL iom_swap(context) 
     1768            CALL iom_put(trim(cdvar), pvar) 
     1769            CALL iom_swap(cxios_context) 
     1770         ELSE 
     1771            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',trim(cdvar) 
     1772            CALL iom_swap(context) 
     1773            CALL iom_set_rstw_active( trim(cdvar), rs2 = pvar ) 
     1774            CALL iom_swap(cxios_context) 
     1775         ENDIF 
    16681776#endif 
    16691777      ELSE 
     
    16771785   END SUBROUTINE iom_rp2d_sp 
    16781786 
    1679    SUBROUTINE iom_rp2d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1787   SUBROUTINE iom_rp2d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    16801788      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    16811789      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    16841792      REAL(dp)        , INTENT(in), DIMENSION(:,    :    ) ::   pvar     ! written field 
    16851793      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1686       LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
    1687       LOGICAL :: llx 
    1688       INTEGER :: ivid   ! variable id 
    1689  
    1690       llx = .FALSE. 
    1691       IF(PRESENT(ldxios)) llx = ldxios 
     1794      ! 
     1795      LOGICAL           :: llx 
     1796      INTEGER           :: ivid   ! variable id 
     1797      CHARACTER(LEN=lc) :: context 
     1798      ! 
     1799      CALL set_xios_context(kiomid, context) 
     1800 
     1801      llx = .NOT. (context == "NONE") 
     1802 
    16921803      IF( llx ) THEN 
    16931804#ifdef key_iomput 
    1694       IF( kt == kwrite ) THEN 
    1695          IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
    1696          CALL iom_put(trim(cdvar), pvar) 
    1697       ELSE 
    1698          IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',trim(cdvar) 
    1699          CALL iom_set_rstw_active( trim(cdvar), rd2 = pvar ) 
    1700       ENDIF 
     1805         IF( kt == kwrite ) THEN 
     1806            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
     1807            CALL iom_swap(context) 
     1808            CALL iom_put(trim(cdvar), pvar) 
     1809            CALL iom_swap(cxios_context) 
     1810         ELSE 
     1811            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',trim(cdvar) 
     1812            CALL iom_swap(context) 
     1813            CALL iom_set_rstw_active( trim(cdvar), rd2 = pvar ) 
     1814            CALL iom_swap(cxios_context) 
     1815         ENDIF 
    17011816#endif 
    17021817      ELSE 
     
    17111826 
    17121827 
    1713    SUBROUTINE iom_rp3d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1828   SUBROUTINE iom_rp3d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    17141829      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    17151830      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    17181833      REAL(sp)        , INTENT(in),       DIMENSION(:,:,:) ::   pvar     ! written field 
    17191834      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1720       LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
    1721       LOGICAL :: llx                 ! local xios write flag 
    1722       INTEGER :: ivid   ! variable id 
    1723  
    1724       llx = .FALSE. 
    1725       IF(PRESENT(ldxios)) llx = ldxios 
     1835      ! 
     1836      LOGICAL           :: llx                 ! local xios write flag 
     1837      INTEGER           :: ivid   ! variable id 
     1838      CHARACTER(LEN=lc) :: context 
     1839      ! 
     1840      CALL set_xios_context(kiomid, context) 
     1841 
     1842      llx = .NOT. (context == "NONE") 
     1843 
    17261844      IF( llx ) THEN 
    17271845#ifdef key_iomput 
    1728       IF( kt == kwrite ) THEN 
    1729          IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
    1730          CALL iom_put(trim(cdvar), pvar) 
    1731      ELSE 
    1732          IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',trim(cdvar) 
    1733          CALL iom_set_rstw_active( trim(cdvar), rs3 = pvar ) 
    1734       ENDIF 
     1846         IF( kt == kwrite ) THEN 
     1847            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
     1848            CALL iom_swap(context) 
     1849            CALL iom_put(trim(cdvar), pvar) 
     1850            CALL iom_swap(cxios_context) 
     1851         ELSE 
     1852            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',trim(cdvar) 
     1853            CALL iom_swap(context) 
     1854            CALL iom_set_rstw_active( trim(cdvar), rs3 = pvar ) 
     1855            CALL iom_swap(cxios_context) 
     1856         ENDIF 
    17351857#endif 
    17361858      ELSE 
     
    17441866   END SUBROUTINE iom_rp3d_sp 
    17451867 
    1746    SUBROUTINE iom_rp3d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
     1868   SUBROUTINE iom_rp3d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
    17471869      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    17481870      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    17511873      REAL(dp)        , INTENT(in),       DIMENSION(:,:,:) ::   pvar     ! written field 
    17521874      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
    1753       LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
    1754       LOGICAL :: llx                 ! local xios write flag 
    1755       INTEGER :: ivid   ! variable id 
    1756  
    1757       llx = .FALSE. 
    1758       IF(PRESENT(ldxios)) llx = ldxios 
     1875      ! 
     1876      LOGICAL           :: llx                 ! local xios write flag 
     1877      INTEGER           :: ivid   ! variable id 
     1878      CHARACTER(LEN=lc) :: context 
     1879      ! 
     1880      CALL set_xios_context(kiomid, context) 
     1881 
     1882      llx = .NOT. (context == "NONE") 
     1883 
    17591884      IF( llx ) THEN 
    17601885#ifdef key_iomput 
    1761       IF( kt == kwrite ) THEN 
    1762          IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
    1763          CALL iom_put(trim(cdvar), pvar) 
    1764       ELSE 
    1765          IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',trim(cdvar) 
    1766          CALL iom_set_rstw_active( trim(cdvar), rd3 = pvar ) 
    1767       ENDIF 
     1886         IF( kt == kwrite ) THEN 
     1887            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
     1888            CALL iom_swap(context) 
     1889            CALL iom_put(trim(cdvar), pvar) 
     1890            CALL iom_swap(cxios_context) 
     1891         ELSE 
     1892            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',trim(cdvar) 
     1893            CALL iom_swap(context) 
     1894            CALL iom_set_rstw_active( trim(cdvar), rd3 = pvar ) 
     1895            CALL iom_swap(cxios_context) 
     1896         ENDIF 
    17681897#endif 
    17691898      ELSE 
     
    18802009      IF( iom_use(cdname) ) THEN 
    18812010#if defined key_iomput 
    1882          IF( SIZE(pfield2d, dim=1) == jpi .AND. SIZE(pfield2d, dim=2) == jpj ) THEN 
    1883             CALL xios_send_field( cdname, pfield2d(Nis0:Nie0, Njs0:Nje0) )       ! this extraction will create a copy of pfield2d 
    1884          ELSE 
    1885             CALL xios_send_field( cdname, pfield2d ) 
    1886          ENDIF 
     2011         CALL xios_send_field( cdname, pfield2d ) 
    18872012#else 
    18882013         WRITE(numout,*) pfield2d   ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings 
     
    18962021      IF( iom_use(cdname) ) THEN 
    18972022#if defined key_iomput 
    1898          IF( SIZE(pfield2d, dim=1) == jpi .AND. SIZE(pfield2d, dim=2) == jpj ) THEN 
    1899             CALL xios_send_field( cdname, pfield2d(Nis0:Nie0, Njs0:Nje0) )       ! this extraction will create a copy of pfield2d 
    1900          ELSE 
    1901             CALL xios_send_field( cdname, pfield2d ) 
    1902          ENDIF 
     2023         CALL xios_send_field( cdname, pfield2d ) 
    19032024#else 
    19042025         WRITE(numout,*) pfield2d   ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings 
     
    19122033      IF( iom_use(cdname) ) THEN 
    19132034#if defined key_iomput 
    1914          IF( SIZE(pfield3d, dim=1) == jpi .AND. SIZE(pfield3d, dim=2) == jpj ) THEN 
    1915             CALL xios_send_field( cdname, pfield3d(Nis0:Nie0, Njs0:Nje0,:) )     ! this extraction will create a copy of pfield3d 
    1916          ELSE 
    1917             CALL xios_send_field( cdname, pfield3d ) 
    1918          ENDIF 
     2035         CALL xios_send_field( cdname, pfield3d ) 
    19192036#else 
    19202037         WRITE(numout,*) pfield3d   ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings 
     
    19282045      IF( iom_use(cdname) ) THEN 
    19292046#if defined key_iomput 
    1930          IF( SIZE(pfield3d, dim=1) == jpi .AND. SIZE(pfield3d, dim=2) == jpj ) THEN 
    1931             CALL xios_send_field( cdname, pfield3d(Nis0:Nie0, Njs0:Nje0,:) )     ! this extraction will create a copy of pfield3d 
    1932          ELSE 
    1933             CALL xios_send_field( cdname, pfield3d ) 
    1934          ENDIF 
     2047         CALL xios_send_field( cdname, pfield3d ) 
    19352048#else 
    19362049         WRITE(numout,*) pfield3d   ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings 
     
    19442057      IF( iom_use(cdname) ) THEN 
    19452058#if defined key_iomput 
    1946          IF( SIZE(pfield4d, dim=1) == jpi .AND. SIZE(pfield4d, dim=2) == jpj ) THEN 
    1947             CALL xios_send_field( cdname, pfield4d(Nis0:Nie0, Njs0:Nje0,:,:) )   ! this extraction will create a copy of pfield4d 
    1948          ELSE 
    1949             CALL xios_send_field (cdname, pfield4d ) 
    1950          ENDIF 
     2059         CALL xios_send_field (cdname, pfield4d ) 
    19512060#else 
    19522061         WRITE(numout,*) pfield4d   ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings 
     
    19602069      IF( iom_use(cdname) ) THEN 
    19612070#if defined key_iomput 
    1962          IF( SIZE(pfield4d, dim=1) == jpi .AND. SIZE(pfield4d, dim=2) == jpj ) THEN 
    1963             CALL xios_send_field( cdname, pfield4d(Nis0:Nie0, Njs0:Nje0,:,:) )   ! this extraction will create a copy of pfield4d 
    1964          ELSE 
    1965             CALL xios_send_field (cdname, pfield4d ) 
    1966          ENDIF 
     2071         CALL xios_send_field (cdname, pfield4d ) 
    19672072#else 
    19682073         WRITE(numout,*) pfield4d   ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings 
     
    21352240      CALL iom_swap( cdname )   ! swap to cdname context 
    21362241      CALL xios_update_calendar(kt) 
    2137       IF( cdname /= TRIM(cxios_context) )   CALL iom_swap( TRIM(cxios_context) )   ! return back to nemo context 
     2242      IF( cdname /= TRIM(cxios_context) )   CALL iom_swap( cxios_context )   ! return back to nemo context 
    21382243   END SUBROUTINE iom_setkt 
    21392244 
     
    21492254         CALL iom_swap( cdname )   ! swap to cdname context 
    21502255         CALL xios_context_finalize() ! finalize the context 
    2151          IF( cdname /= TRIM(cxios_context) ) CALL iom_swap( TRIM(cxios_context) )   ! return back to nemo context 
     2256         IF( cdname /= cxios_context ) CALL iom_swap( cxios_context )   ! return back to nemo context 
    21522257      ENDIF 
    21532258      ! 
     
    21702275      ! 
    21712276      CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=Ni0glo,nj_glo=Nj0glo,ibegin=mig0(Nis0)-1,jbegin=mjg0(Njs0)-1,ni=Ni_0,nj=Nj_0) 
    2172       CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = 0, data_ni = Ni_0, data_jbegin = 0, data_nj = Nj_0) 
     2277      CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = -nn_hls, data_ni = jpi, data_jbegin = -nn_hls, data_nj = jpj) 
    21732278!don't define lon and lat for restart reading context.  
    21742279      IF ( .NOT.ldrxios ) & 
     
    22692374      CALL dom_ngb( 180.0_wp, 90.0_wp, ix, iy, 'T' ) !  i-line that passes near the North Pole : Reference latitude (used in plots) 
    22702375      CALL iom_set_domain_attr("gznl", ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig0(Nis0)-1, jbegin=mjg0(Njs0)-1, ni=Ni_0, nj=Nj_0) 
    2271       CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin = 0, data_ni = Ni_0, data_jbegin = 0, data_nj = Nj_0) 
     2376      CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin = -nn_hls, data_ni = jpi, data_jbegin = -nn_hls, data_nj = jpj) 
    22722377      CALL iom_set_domain_attr("gznl", lonvalue = real(zlon, dp),   & 
    22732378         &                             latvalue = real(RESHAPE(plat(Nis0:Nie0, Njs0:Nje0),(/ Ni_0*Nj_0 /)),dp))   
    2274       CALL iom_set_zoom_domain_attr("ptr", ibegin=ix-1, jbegin=0, ni=1, nj=Nj_0) 
     2379      CALL iom_set_zoom_domain_attr("ptr", ibegin=ix-1, jbegin=0, ni=1, nj=Nj0glo) 
    22752380      ! 
    22762381      CALL iom_update_file_name('ptr') 
Note: See TracChangeset for help on using the changeset viewer.