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 9367 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90 – NEMO

Ignore:
Timestamp:
2018-02-28T17:23:20+01:00 (6 years ago)
Author:
mathiot
Message:

Add restart read/write via XIOS capability (#1953 and #1962 and twiki: 2017WP/Met_Office-1_Mirek_XIOSread). WARNING: need to upgrade XIOS to r1296 to compile

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90

    r9019 r9367  
    4343   USE ioipsl, ONLY :  ju2ymds    ! for calendar 
    4444   USE crs             ! Grid coarsening 
     45   USE lib_fortran  
     46   USE diurnal_bulk, ONLY : ln_diurnal_only, ln_diurnal 
    4547 
    4648   IMPLICIT NONE 
     
    6264   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 
    6365   PRIVATE set_grid, set_grid_bounds, set_scalar, set_xmlatt, set_mooring, iom_update_file_name, iom_sdate 
     66   PRIVATE iom_set_rst_context, iom_set_rstw_active, iom_set_rstr_active 
     67   PUBLIC iom_set_rstw_var_active, iom_set_rst_vars 
    6468# endif 
    6569 
     
    8791CONTAINS 
    8892 
    89    SUBROUTINE iom_init( cdname )  
     93   SUBROUTINE iom_init( cdname, fname )  
    9094      !!---------------------------------------------------------------------- 
    9195      !!                     ***  ROUTINE   *** 
     
    9599      !!---------------------------------------------------------------------- 
    96100      CHARACTER(len=*), INTENT(in)  :: cdname 
    97       ! 
     101      CHARACTER(len=*), OPTIONAL, INTENT(in)  :: fname 
    98102#if defined key_iomput 
    99103      ! 
    100104      TYPE(xios_duration) :: dtime    = xios_duration(0, 0, 0, 0, 0, 0) 
    101105      TYPE(xios_date)     :: start_date 
    102       CHARACTER(len=10) :: clname 
     106      CHARACTER(len=lc) :: clname 
    103107      INTEGER           :: ji, jkmin 
     108      LOGICAL :: llrst_context              ! is context related to restart 
    104109      ! 
    105110      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zt_bnds, zw_bnds 
     
    112117      CALL xios_context_initialize(TRIM(clname), mpi_comm_opa) 
    113118      CALL iom_swap( cdname ) 
    114  
     119      llrst_context =  (TRIM(cdname) == TRIM(crxios_context) .OR. TRIM(cdname) == TRIM(cwxios_context)) 
    115120 
    116121      ! Calendar type is now defined in xml file  
     
    125130 
    126131      ! horizontal grid definition 
    127       CALL set_scalar 
     132      IF(.NOT.llrst_context) CALL set_scalar 
    128133      ! 
    129134      IF( TRIM(cdname) == TRIM(cxios_context) ) THEN   
    130          CALL set_grid( "T", glamt, gphit )  
    131          CALL set_grid( "U", glamu, gphiu ) 
    132          CALL set_grid( "V", glamv, gphiv ) 
    133          CALL set_grid( "W", glamt, gphit ) 
     135         CALL set_grid( "T", glamt, gphit, .FALSE. )  
     136         CALL set_grid( "U", glamu, gphiu, .FALSE. ) 
     137         CALL set_grid( "V", glamv, gphiv, .FALSE. ) 
     138         CALL set_grid( "W", glamt, gphit, .FALSE. ) 
    134139         CALL set_grid_znl( gphit ) 
    135140         ! 
     
    149154         CALL dom_grid_crs   ! Save the parent grid information  & Switch to coarse grid domain 
    150155         ! 
    151          CALL set_grid( "T", glamt_crs, gphit_crs )  
    152          CALL set_grid( "U", glamu_crs, gphiu_crs )  
    153          CALL set_grid( "V", glamv_crs, gphiv_crs )  
    154          CALL set_grid( "W", glamt_crs, gphit_crs )  
     156         CALL set_grid( "T", glamt_crs, gphit_crs, .FALSE. )  
     157         CALL set_grid( "U", glamu_crs, gphiu_crs, .FALSE. )  
     158         CALL set_grid( "V", glamv_crs, gphiv_crs, .FALSE. )  
     159         CALL set_grid( "W", glamt_crs, gphit_crs, .FALSE. )  
    155160         CALL set_grid_znl( gphit_crs ) 
    156161          ! 
    157162         CALL dom_grid_glo   ! Return to parent grid domain 
    158163         ! 
    159          IF( ln_cfmeta ) THEN   ! Add additional grid metadata 
     164         IF( ln_cfmeta .AND. .NOT. llrst_context) THEN   ! Add additional grid metadata 
    160165            CALL iom_set_domain_attr("grid_T", area = e1e2t_crs(nldi:nlei, nldj:nlej)) 
    161166            CALL iom_set_domain_attr("grid_U", area = e1u_crs(nldi:nlei, nldj:nlej) * e2u_crs(nldi:nlei, nldj:nlej)) 
     
    170175      ! 
    171176      ! vertical grid definition 
    172       CALL iom_set_axis_attr( "deptht", gdept_1d ) 
    173       CALL iom_set_axis_attr( "depthu", gdept_1d ) 
    174       CALL iom_set_axis_attr( "depthv", gdept_1d ) 
    175       CALL iom_set_axis_attr( "depthw", gdepw_1d ) 
    176       ! 
    177       ! Add vertical grid bounds 
    178       jkmin = MIN(2,jpk)  ! in case jpk=1 (i.e. sas2D) 
    179       zt_bnds(2,:        ) = gdept_1d(:) 
    180       zt_bnds(1,jkmin:jpk) = gdept_1d(1:jpkm1) 
    181       zt_bnds(1,1        ) = gdept_1d(1) - e3w_1d(1) 
    182       zw_bnds(1,:        ) = gdepw_1d(:) 
    183       zw_bnds(2,1:jpkm1  ) = gdepw_1d(jkmin:jpk) 
    184       zw_bnds(2,jpk:     ) = gdepw_1d(jpk) + e3t_1d(jpk) 
    185       CALL iom_set_axis_attr( "deptht", bounds=zt_bnds ) 
    186       CALL iom_set_axis_attr( "depthu", bounds=zt_bnds ) 
    187       CALL iom_set_axis_attr( "depthv", bounds=zt_bnds ) 
    188       CALL iom_set_axis_attr( "depthw", bounds=zw_bnds ) 
    189       ! 
     177      IF(.NOT.llrst_context) THEN 
     178          CALL iom_set_axis_attr( "deptht", paxis = gdept_1d ) 
     179          CALL iom_set_axis_attr( "depthu", paxis = gdept_1d ) 
     180          CALL iom_set_axis_attr( "depthv", paxis = gdept_1d ) 
     181          CALL iom_set_axis_attr( "depthw", paxis = gdepw_1d ) 
     182 
     183          ! Add vertical grid bounds 
     184          jkmin = MIN(2,jpk)  ! in case jpk=1 (i.e. sas2D) 
     185          zt_bnds(2,:        ) = gdept_1d(:) 
     186          zt_bnds(1,jkmin:jpk) = gdept_1d(1:jpkm1) 
     187          zt_bnds(1,1        ) = gdept_1d(1) - e3w_1d(1) 
     188          zw_bnds(1,:        ) = gdepw_1d(:) 
     189          zw_bnds(2,1:jpkm1  ) = gdepw_1d(jkmin:jpk) 
     190          zw_bnds(2,jpk:     ) = gdepw_1d(jpk) + e3t_1d(jpk) 
     191          CALL iom_set_axis_attr( "deptht", bounds=zt_bnds ) 
     192          CALL iom_set_axis_attr( "depthu", bounds=zt_bnds ) 
     193          CALL iom_set_axis_attr( "depthv", bounds=zt_bnds ) 
     194          CALL iom_set_axis_attr( "depthw", bounds=zw_bnds ) 
     195          ! 
    190196# if defined key_floats 
    191       CALL iom_set_axis_attr( "nfloat", (/ (REAL(ji,wp), ji=1,nfloat) /) ) 
     197          CALL iom_set_axis_attr( "nfloat", (/ (REAL(ji,wp), ji=1,nfloat) /) ) 
    192198# endif 
    193199# if defined key_lim3 
    194       CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
    195       ! SIMIP diagnostics (4 main arctic straits) 
    196       CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,wp), ji=1,4) /) ) 
     200          CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
     201          ! SIMIP diagnostics (4 main arctic straits) 
     202          CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,wp), ji=1,4) /) ) 
    197203# endif 
    198       CALL iom_set_axis_attr( "icbcla", class_num ) 
    199       CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,wp) /) ) 
    200       CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,wp) /) ) 
    201        
     204          CALL iom_set_axis_attr( "icbcla", class_num ) 
     205          CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,wp) /) ) 
     206          CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,wp) /) ) 
     207      ENDIF 
     208      ! 
    202209      ! automatic definitions of some of the xml attributs 
    203       CALL set_xmlatt 
     210      IF( TRIM(cdname) == TRIM(crxios_context) ) THEN 
     211!set names of the fields in restart file IF using XIOS to read data 
     212          CALL iom_set_rst_context() 
     213          CALL iom_set_rst_vars(rst_rfields) 
     214!set which fields are to be read from restart file 
     215          CALL iom_set_rstr_active() 
     216      ELSE IF( TRIM(cdname) == TRIM(cwxios_context) ) THEN 
     217!set names of the fields in restart file IF using XIOS to write data 
     218          CALL iom_set_rst_context() 
     219          CALL iom_set_rst_vars(rst_wfields) 
     220!set which fields are to be written to a restart file 
     221          CALL iom_set_rstw_active(fname) 
     222      ELSE 
     223          CALL set_xmlatt 
     224      ENDIF 
    204225      ! 
    205226      ! end file definition 
     
    215236   END SUBROUTINE iom_init 
    216237 
     238   SUBROUTINE iom_set_rstw_var_active(field) 
     239      !!--------------------------------------------------------------------- 
     240      !!                   ***  SUBROUTINE  iom_set_rstw_var_active  *** 
     241      !! 
     242      !! ** Purpose :  enable variable in restart file when writing with XIOS  
     243      !!--------------------------------------------------------------------- 
     244   CHARACTER(len = *), INTENT(IN) :: field 
     245   INTEGER :: i 
     246   LOGICAL :: llis_set 
     247 
     248   llis_set = .FALSE. 
     249 
     250   DO i = 1, max_rst_fields 
     251       IF(TRIM(rst_wfields(i)%vname) == field) THEN  
     252          rst_wfields(i)%active = .TRUE. 
     253          llis_set = .TRUE. 
     254          EXIT 
     255       ENDIF 
     256   ENDDO 
     257!Warn if variable is not in defined in rst_wfields 
     258   IF(.NOT.llis_set) THEN 
     259      IF(lwp) THEN 
     260         write(numout,cform_err) 
     261         write(numout,*) 'iom_set_rstw_var_active: variable ', field ,' is available for writing but not defined'  
     262      ENDIF 
     263        nstop = nstop + 1 
     264   ENDIF 
     265 
     266   END SUBROUTINE iom_set_rstw_var_active 
     267 
     268   SUBROUTINE iom_set_rstr_active() 
     269      !!--------------------------------------------------------------------- 
     270      !!                   ***  SUBROUTINE  iom_set_rstr_active  *** 
     271      !! 
     272      !! ** Purpose :  define file name in XIOS context for reading restart file, 
     273      !!               enable variables present in restart file for reading with XIOS  
     274      !!--------------------------------------------------------------------- 
     275 
     276!sets enabled = .TRUE. for each field in restart file 
     277   CHARACTER(len=256) :: rst_file 
     278   TYPE(xios_field) :: field_hdl 
     279   TYPE(xios_file) :: file_hdl 
     280   TYPE(xios_filegroup) :: filegroup_hdl 
     281   INTEGER :: i 
     282   CHARACTER(lc)  ::   clpath 
     283 
     284        clpath = TRIM(cn_ocerst_indir) 
     285        IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/' 
     286        IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
     287           rst_file = TRIM(clpath)//TRIM(cn_ocerst_in) 
     288        ELSE 
     289           rst_file = TRIM(clpath)//'1_'//TRIM(cn_ocerst_in) 
     290        ENDIF 
     291!set name of the restart file and enable available fields 
     292        if(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS) to: ',rst_file 
     293        CALL xios_get_handle("file_definition", filegroup_hdl ) 
     294        CALL xios_add_child(filegroup_hdl, file_hdl, 'rrestart') 
     295        CALL xios_set_file_attr( "rrestart", name=trim(rst_file), type="one_file", & 
     296             par_access="collective", enabled=.TRUE., mode="read",                 & 
     297             output_freq=xios_timestep) 
     298!define variables for restart context 
     299        DO i = 1, max_rst_fields 
     300         IF( TRIM(rst_rfields(i)%vname) /= "NO_NAME") THEN 
     301           IF( iom_varid( numror, TRIM(rst_rfields(i)%vname), ldstop = .FALSE. ) > 0 ) THEN 
     302                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_rfields(i)%vname)) 
     303                SELECT CASE (TRIM(rst_rfields(i)%grid)) 
     304                 CASE ("grid_N_3D") 
     305                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     306                        domain_ref="grid_N", axis_ref="nav_lev", operation = "instant") 
     307                 CASE ("grid_N") 
     308                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     309                        domain_ref="grid_N", operation = "instant")  
     310                CASE ("grid_vector") 
     311                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     312                         axis_ref="nav_lev", operation = "instant") 
     313                 CASE ("grid_scalar") 
     314                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
     315                        scalar_ref = "grid_scalar", operation = "instant") 
     316                END SELECT 
     317                IF(lwp) WRITE(numout,*) 'XIOS read: ', TRIM(rst_rfields(i)%vname), ' enabled in ', TRIM(rst_file) 
     318           ENDIF 
     319         ENDIF 
     320        END DO 
     321   END SUBROUTINE iom_set_rstr_active 
     322 
     323   SUBROUTINE iom_set_rstw_core(cdmdl) 
     324      !!--------------------------------------------------------------------- 
     325      !!                   ***  SUBROUTINE  iom_set_rstw_core  *** 
     326      !! 
     327      !! ** Purpose :  set variables which are always in restart file  
     328      !!--------------------------------------------------------------------- 
     329   CHARACTER (len=*), INTENT (IN) :: cdmdl ! model OPA or SAS 
     330    
     331   IF(cdmdl == "OPA") THEN 
     332!from restart.F90 
     333   CALL iom_set_rstw_var_active("rdt") 
     334   IF ( .NOT. ln_diurnal_only ) THEN 
     335        CALL iom_set_rstw_var_active('ub'  ) 
     336        CALL iom_set_rstw_var_active('vb'  ) 
     337        CALL iom_set_rstw_var_active('tb'  ) 
     338        CALL iom_set_rstw_var_active('sb'  ) 
     339        CALL iom_set_rstw_var_active('sshb') 
     340        ! 
     341        CALL iom_set_rstw_var_active('un'  ) 
     342        CALL iom_set_rstw_var_active('vn'  ) 
     343        CALL iom_set_rstw_var_active('tn'  ) 
     344        CALL iom_set_rstw_var_active('sn'  ) 
     345        CALL iom_set_rstw_var_active('sshn') 
     346        CALL iom_set_rstw_var_active('rhop') 
     347     ! extra variable needed for the ice sheet coupling 
     348        IF ( ln_iscpl ) THEN 
     349             CALL iom_set_rstw_var_active('tmask') 
     350             CALL iom_set_rstw_var_active('umask') 
     351             CALL iom_set_rstw_var_active('vmask') 
     352             CALL iom_set_rstw_var_active('smask') 
     353             CALL iom_set_rstw_var_active('e3t_n') 
     354             CALL iom_set_rstw_var_active('e3u_n') 
     355             CALL iom_set_rstw_var_active('e3v_n') 
     356             CALL iom_set_rstw_var_active('gdepw_n') 
     357        END IF 
     358      ENDIF 
     359      IF(ln_diurnal) CALL iom_set_rstw_var_active('Dsst') 
     360!from trasbc.F90 
     361         CALL iom_set_rstw_var_active('sbc_hc_b') 
     362         CALL iom_set_rstw_var_active('sbc_sc_b') 
     363   ENDIF 
     364   END SUBROUTINE iom_set_rstw_core 
     365 
     366   SUBROUTINE iom_set_rst_vars(fields) 
     367      !!--------------------------------------------------------------------- 
     368      !!                   ***  SUBROUTINE  iom_set_rstr_active  *** 
     369      !! 
     370      !! ** Purpose :  Fill array fields with the information about all  
     371      !!               possible variables and corresponding grids definition  
     372      !!               for reading/writing restart with XIOS 
     373      !!--------------------------------------------------------------------- 
     374   TYPE(RST_FIELD), INTENT(INOUT) :: fields(max_rst_fields) 
     375 
     376   INTEGER :: i 
     377        i = 0 
     378        i = i + 1; fields(i)%vname="rdt";            fields(i)%grid="grid_scalar" 
     379        i = i + 1; fields(i)%vname="un";             fields(i)%grid="grid_N_3D" 
     380        i = i + 1; fields(i)%vname="ub";             fields(i)%grid="grid_N_3D" 
     381        i = i + 1; fields(i)%vname="vn";             fields(i)%grid="grid_N_3D" 
     382        i = i + 1; fields(i)%vname="vb";             fields(i)%grid="grid_N_3D"   
     383        i = i + 1; fields(i)%vname="tn";             fields(i)%grid="grid_N_3D" 
     384        i = i + 1; fields(i)%vname="tb";             fields(i)%grid="grid_N_3D" 
     385        i = i + 1; fields(i)%vname="sn";             fields(i)%grid="grid_N_3D" 
     386        i = i + 1; fields(i)%vname="sb";             fields(i)%grid="grid_N_3D" 
     387        i = i + 1; fields(i)%vname="sshn";           fields(i)%grid="grid_N" 
     388        i = i + 1; fields(i)%vname="sshb";           fields(i)%grid="grid_N" 
     389        i = i + 1; fields(i)%vname="rhop";           fields(i)%grid="grid_N_3D" 
     390        i = i + 1; fields(i)%vname="kt";             fields(i)%grid="grid_scalar" 
     391        i = i + 1; fields(i)%vname="ndastp";         fields(i)%grid="grid_scalar" 
     392        i = i + 1; fields(i)%vname="adatrj";         fields(i)%grid="grid_scalar" 
     393        i = i + 1; fields(i)%vname="utau_b";         fields(i)%grid="grid_N" 
     394        i = i + 1; fields(i)%vname="vtau_b";         fields(i)%grid="grid_N" 
     395        i = i + 1; fields(i)%vname="qns_b";          fields(i)%grid="grid_N" 
     396        i = i + 1; fields(i)%vname="emp_b";          fields(i)%grid="grid_N" 
     397        i = i + 1; fields(i)%vname="sfx_b";          fields(i)%grid="grid_N" 
     398        i = i + 1; fields(i)%vname="en" ;            fields(i)%grid="grid_N_3D"  
     399        i = i + 1; fields(i)%vname="avt_k";            fields(i)%grid="grid_N_3D" 
     400        i = i + 1; fields(i)%vname="avm_k";            fields(i)%grid="grid_N_3D" 
     401        i = i + 1; fields(i)%vname="dissl";          fields(i)%grid="grid_N_3D" 
     402        i = i + 1; fields(i)%vname="sbc_hc_b";       fields(i)%grid="grid_N" 
     403        i = i + 1; fields(i)%vname="sbc_sc_b";       fields(i)%grid="grid_N" 
     404        i = i + 1; fields(i)%vname="qsr_hc_b";       fields(i)%grid="grid_N_3D" 
     405        i = i + 1; fields(i)%vname="fraqsr_1lev";    fields(i)%grid="grid_N" 
     406        i = i + 1; fields(i)%vname="greenland_icesheet_mass" 
     407                                               fields(i)%grid="grid_scalar" 
     408        i = i + 1; fields(i)%vname="greenland_icesheet_timelapsed" 
     409                                               fields(i)%grid="grid_scalar" 
     410        i = i + 1; fields(i)%vname="greenland_icesheet_mass_roc" 
     411                                               fields(i)%grid="grid_scalar" 
     412        i = i + 1; fields(i)%vname="antarctica_icesheet_mass" 
     413                                               fields(i)%grid="grid_scalar" 
     414        i = i + 1; fields(i)%vname="antarctica_icesheet_timelapsed" 
     415                                               fields(i)%grid="grid_scalar" 
     416        i = i + 1; fields(i)%vname="antarctica_icesheet_mass_roc" 
     417                                               fields(i)%grid="grid_scalar" 
     418        i = i + 1; fields(i)%vname="frc_v";          fields(i)%grid="grid_scalar" 
     419        i = i + 1; fields(i)%vname="frc_t";          fields(i)%grid="grid_scalar" 
     420        i = i + 1; fields(i)%vname="frc_s";          fields(i)%grid="grid_scalar" 
     421        i = i + 1; fields(i)%vname="frc_wn_t";       fields(i)%grid="grid_scalar" 
     422        i = i + 1; fields(i)%vname="frc_wn_s";       fields(i)%grid="grid_scalar" 
     423        i = i + 1; fields(i)%vname="ssh_ini";        fields(i)%grid="grid_N" 
     424        i = i + 1; fields(i)%vname="e3t_ini";        fields(i)%grid="grid_N_3D" 
     425        i = i + 1; fields(i)%vname="hc_loc_ini";     fields(i)%grid="grid_N_3D" 
     426        i = i + 1; fields(i)%vname="sc_loc_ini";     fields(i)%grid="grid_N_3D" 
     427        i = i + 1; fields(i)%vname="ssh_hc_loc_ini"; fields(i)%grid="grid_N" 
     428        i = i + 1; fields(i)%vname="ssh_sc_loc_ini"; fields(i)%grid="grid_N" 
     429        i = i + 1; fields(i)%vname="tilde_e3t_b";    fields(i)%grid="grid_N" 
     430        i = i + 1; fields(i)%vname="tilde_e3t_n";    fields(i)%grid="grid_N" 
     431        i = i + 1; fields(i)%vname="hdiv_lf";        fields(i)%grid="grid_N" 
     432        i = i + 1; fields(i)%vname="ub2_b";          fields(i)%grid="grid_N" 
     433        i = i + 1; fields(i)%vname="vb2_b";          fields(i)%grid="grid_N" 
     434        i = i + 1; fields(i)%vname="sshbb_e";        fields(i)%grid="grid_N" 
     435        i = i + 1; fields(i)%vname="ubb_e";          fields(i)%grid="grid_N" 
     436        i = i + 1; fields(i)%vname="vbb_e";          fields(i)%grid="grid_N" 
     437        i = i + 1; fields(i)%vname="sshb_e";         fields(i)%grid="grid_N" 
     438        i = i + 1; fields(i)%vname="ub_e";           fields(i)%grid="grid_N" 
     439        i = i + 1; fields(i)%vname="vb_e";           fields(i)%grid="grid_N" 
     440        i = i + 1; fields(i)%vname="fwf_isf_b";      fields(i)%grid="grid_N" 
     441        i = i + 1; fields(i)%vname="isf_sc_b";       fields(i)%grid="grid_N" 
     442        i = i + 1; fields(i)%vname="isf_hc_b";       fields(i)%grid="grid_N" 
     443        i = i + 1; fields(i)%vname="ssh_ibb";        fields(i)%grid="grid_N" 
     444        i = i + 1; fields(i)%vname="rnf_b";          fields(i)%grid="grid_N" 
     445        i = i + 1; fields(i)%vname="rnf_hc_b";       fields(i)%grid="grid_N" 
     446        i = i + 1; fields(i)%vname="rnf_sc_b";       fields(i)%grid="grid_N" 
     447        i = i + 1; fields(i)%vname="nn_fsbc";        fields(i)%grid="grid_scalar" 
     448        i = i + 1; fields(i)%vname="ssu_m";          fields(i)%grid="grid_N" 
     449        i = i + 1; fields(i)%vname="ssv_m";          fields(i)%grid="grid_N" 
     450        i = i + 1; fields(i)%vname="sst_m";          fields(i)%grid="grid_N" 
     451        i = i + 1; fields(i)%vname="sss_m";          fields(i)%grid="grid_N" 
     452        i = i + 1; fields(i)%vname="ssh_m";          fields(i)%grid="grid_N" 
     453        i = i + 1; fields(i)%vname="e3t_m";          fields(i)%grid="grid_N" 
     454        i = i + 1; fields(i)%vname="frq_m";          fields(i)%grid="grid_N" 
     455        i = i + 1; fields(i)%vname="avmb";           fields(i)%grid="grid_vector" 
     456        i = i + 1; fields(i)%vname="avtb";           fields(i)%grid="grid_vector" 
     457        i = i + 1; fields(i)%vname="ub2_i_b";        fields(i)%grid="grid_N" 
     458        i = i + 1; fields(i)%vname="vb2_i_b";        fields(i)%grid="grid_N" 
     459        i = i + 1; fields(i)%vname="ntime";          fields(i)%grid="grid_scalar" 
     460        i = i + 1; fields(i)%vname="Dsst";           fields(i)%grid="grid_scalar" 
     461        i = i + 1; fields(i)%vname="tmask";          fields(i)%grid="grid_N_3D" 
     462        i = i + 1; fields(i)%vname="umask";          fields(i)%grid="grid_N_3D" 
     463        i = i + 1; fields(i)%vname="vmask";          fields(i)%grid="grid_N_3D" 
     464        i = i + 1; fields(i)%vname="smask";          fields(i)%grid="grid_N_3D" 
     465        i = i + 1; fields(i)%vname="gdepw_n";        fields(i)%grid="grid_N_3D" 
     466        i = i + 1; fields(i)%vname="e3t_n";          fields(i)%grid="grid_N_3D" 
     467        i = i + 1; fields(i)%vname="e3u_n";          fields(i)%grid="grid_N_3D" 
     468        i = i + 1; fields(i)%vname="e3v_n";          fields(i)%grid="grid_N_3D" 
     469        i = i + 1; fields(i)%vname="surf_ini";       fields(i)%grid="grid_N" 
     470        i = i + 1; fields(i)%vname="e3t_b";          fields(i)%grid="grid_N_3D" 
     471        i = i + 1; fields(i)%vname="hmxl_n";         fields(i)%grid="grid_N_3D" 
     472        i = i + 1; fields(i)%vname="un_bf";          fields(i)%grid="grid_N" 
     473        i = i + 1; fields(i)%vname="vn_bf";          fields(i)%grid="grid_N" 
     474        i = i + 1; fields(i)%vname="hbl";            fields(i)%grid="grid_N" 
     475        i = i + 1; fields(i)%vname="hbli";           fields(i)%grid="grid_N" 
     476        i = i + 1; fields(i)%vname="wn";             fields(i)%grid="grid_N_3D" 
     477 
     478        IF( i-1 > max_rst_fields) THEN 
     479        IF(lwp) write(numout,*) 'E R R O R : iom_set_rst_vars SIZE of RST_FIELD array is too small' 
     480        nstop = nstop + 1 
     481        ENDIF 
     482 
     483   END SUBROUTINE iom_set_rst_vars 
     484 
     485 
     486   SUBROUTINE iom_set_rstw_active(cdrst_file) 
     487      !!--------------------------------------------------------------------- 
     488      !!                   ***  SUBROUTINE  iom_set_rstr_active  *** 
     489      !! 
     490      !! ** Purpose :  define file name in XIOS context for writing restart 
     491      !!               enable variables present in restart file for writing 
     492      !!--------------------------------------------------------------------- 
     493!sets enabled = .TRUE. for each field in restart file 
     494   CHARACTER(len=*) :: cdrst_file 
     495#if defined key_iomput 
     496   TYPE(xios_field) :: field_hdl 
     497   TYPE(xios_file) :: file_hdl 
     498   TYPE(xios_filegroup) :: filegroup_hdl 
     499   INTEGER :: i 
     500   CHARACTER(lc)  ::   clpath 
     501 
     502!set name of the restart file and enable available fields 
     503        IF(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS write) to: ',cdrst_file 
     504        CALL xios_get_handle("file_definition", filegroup_hdl ) 
     505        CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart') 
     506        IF(nxioso.eq.1) THEN  
     507           CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&  
     508                                    mode="write", output_freq=xios_timestep)  
     509           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'  
     510        ELSE   
     511           CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&  
     512                                    mode="write", output_freq=xios_timestep)  
     513           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'  
     514        ENDIF  
     515        CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file)) 
     516!define fields for restart context 
     517        DO i = 1, max_rst_fields 
     518         IF( rst_wfields(i)%active ) THEN 
     519                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_wfields(i)%vname)) 
     520                SELECT CASE (TRIM(rst_wfields(i)%grid)) 
     521                 CASE ("grid_N_3D") 
     522                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     523                        domain_ref="grid_N", axis_ref="nav_lev", prec = 8, operation = "instant") 
     524                 CASE ("grid_N") 
     525                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     526                        domain_ref="grid_N", prec = 8, operation = "instant")  
     527                 CASE ("grid_vector") 
     528                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     529                         axis_ref="nav_lev", prec = 8, operation = "instant") 
     530                 CASE ("grid_scalar") 
     531                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     532                        scalar_ref = "grid_scalar", prec = 8, operation = "instant") 
     533                END SELECT 
     534         ENDIF 
     535        END DO 
     536#endif 
     537   END SUBROUTINE iom_set_rstw_active 
     538 
     539   SUBROUTINE iom_set_rst_context( )  
     540     !!--------------------------------------------------------------------- 
     541      !!                   ***  SUBROUTINE  iom_set_rstr_active  *** 
     542      !! 
     543      !! ** Purpose : Define domain, axis and grid for restart (read/write)  
     544      !!              context  
     545      !!                
     546      !!--------------------------------------------------------------------- 
     547#if defined key_iomput 
     548   TYPE(xios_domaingroup)            :: domaingroup_hdl  
     549   TYPE(xios_domain)                 :: domain_hdl  
     550   TYPE(xios_axisgroup)              :: axisgroup_hdl  
     551   TYPE(xios_axis)                   :: axis_hdl  
     552   TYPE(xios_scalar)                 :: scalar_hdl  
     553   TYPE(xios_scalargroup)            :: scalargroup_hdl  
     554 
     555     CALL xios_get_handle("domain_definition",domaingroup_hdl)  
     556     CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N")  
     557     CALL set_grid("N", glamt, gphit, .TRUE.)  
     558  
     559     CALL xios_get_handle("axis_definition",axisgroup_hdl)  
     560     CALL xios_add_child(axisgroup_hdl, axis_hdl, "nav_lev")  
     561!AGRIF fails to compile when unit= is in call to xios_set_axis_attr 
     562!    CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels",  unit="m", positive="down")  
     563     CALL xios_set_axis_attr( "nav_lev", long_name="Vertical levels in meters", positive="down") 
     564     CALL iom_set_axis_attr( "nav_lev", paxis = gdept_1d )  
     565 
     566     CALL xios_get_handle("scalar_definition", scalargroup_hdl)  
     567     CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar")  
     568#endif 
     569   END SUBROUTINE iom_set_rst_context 
    217570 
    218571   SUBROUTINE iom_swap( cdname ) 
     
    347700            icnt = icnt + 1 
    348701         END DO 
     702      ELSE 
     703         lxios_sini = .TRUE. 
    349704      ENDIF 
    350705      IF( llwrt ) THEN 
     
    530885   !!                   INTERFACE iom_get 
    531886   !!---------------------------------------------------------------------- 
    532    SUBROUTINE iom_g0d( kiomid, cdvar, pvar, ktime ) 
     887   SUBROUTINE iom_g0d( kiomid, cdvar, pvar, ktime, ldxios ) 
    533888      INTEGER         , INTENT(in   )                 ::   kiomid    ! Identifier of the file 
    534889      CHARACTER(len=*), INTENT(in   )                 ::   cdvar     ! Name of the variable 
    535890      REAL(wp)        , INTENT(  out)                 ::   pvar      ! read field 
    536891      INTEGER         , INTENT(in   ),     OPTIONAL   ::   ktime     ! record number 
     892      LOGICAL         , INTENT(in   ),     OPTIONAL   ::   ldxios    ! use xios to read restart 
    537893      ! 
    538894      INTEGER                                         ::   idvar     ! variable id 
     
    542898      CHARACTER(LEN=100)                              ::   clname    ! file name 
    543899      CHARACTER(LEN=1)                                ::   cldmspc   ! 
    544       ! 
    545       itime = 1 
    546       IF( PRESENT(ktime) ) itime = ktime 
    547       ! 
    548       clname = iom_file(kiomid)%name 
    549       clinfo = '          iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar) 
    550       ! 
    551       IF( kiomid > 0 ) THEN 
    552          idvar = iom_varid( kiomid, cdvar ) 
    553          IF( iom_file(kiomid)%nfid > 0 .AND. idvar > 0 ) THEN 
    554             idmspc = iom_file ( kiomid )%ndims( idvar ) 
    555             IF( iom_file(kiomid)%luld(idvar) )  idmspc = idmspc - 1 
    556             WRITE(cldmspc , fmt='(i1)') idmspc 
    557             IF( idmspc > 0 )  CALL ctl_stop( TRIM(clinfo), 'When reading to a 0D array, we do not accept data', & 
    558                                  &                         'with 1 or more spatial dimensions: '//cldmspc//' were found.' , & 
    559                                  &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
    560             SELECT CASE (iom_file(kiomid)%iolib) 
    561             CASE (jpnf90   )   ;   CALL iom_nf90_get(    kiomid, idvar, pvar, itime ) 
    562             CASE DEFAULT 
    563                CALL ctl_stop( 'iom_g0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    564             END SELECT 
    565          ENDIF 
     900      LOGICAL                                         ::   llxios 
     901      ! 
     902      llxios = .FALSE. 
     903      IF( PRESENT(ldxios) ) llxios = ldxios 
     904 
     905      IF(.NOT.llxios) THEN  ! read data using default library 
     906         itime = 1 
     907         IF( PRESENT(ktime) ) itime = ktime 
     908         ! 
     909         clname = iom_file(kiomid)%name 
     910         clinfo = '          iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar) 
     911         ! 
     912         IF( kiomid > 0 ) THEN 
     913            idvar = iom_varid( kiomid, cdvar ) 
     914            IF( iom_file(kiomid)%nfid > 0 .AND. idvar > 0 ) THEN 
     915               idmspc = iom_file ( kiomid )%ndims( idvar ) 
     916               IF( iom_file(kiomid)%luld(idvar) )  idmspc = idmspc - 1 
     917               WRITE(cldmspc , fmt='(i1)') idmspc 
     918               IF( idmspc > 0 )  CALL ctl_stop( TRIM(clinfo), 'When reading to a 0D array, we do not accept data', & 
     919                                    &                         'with 1 or more spatial dimensions: '//cldmspc//' were found.' , & 
     920                                    &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     921               SELECT CASE (iom_file(kiomid)%iolib) 
     922               CASE (jpnf90   )   ;   CALL iom_nf90_get(    kiomid, idvar, pvar, itime ) 
     923               CASE DEFAULT 
     924                  CALL ctl_stop( 'iom_g0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     925               END SELECT 
     926            ENDIF 
     927         ENDIF 
     928      ELSE 
     929         IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar) 
     930         CALL iom_swap( TRIM(crxios_context) ) 
     931         CALL xios_recv_field( trim(cdvar), pvar) 
     932         CALL iom_swap( TRIM(cxios_context) ) 
    566933      ENDIF 
    567934   END SUBROUTINE iom_g0d 
    568935 
    569    SUBROUTINE iom_g1d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount ) 
     936   SUBROUTINE iom_g1d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios ) 
    570937      INTEGER         , INTENT(in   )                         ::   kiomid    ! Identifier of the file 
    571938      INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read 
     
    575942      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kstart    ! start axis position of the reading  
    576943      INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis 
     944      LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios    ! read data using XIOS 
    577945      ! 
    578946      IF( kiomid > 0 ) THEN 
    579947         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r1d=pvar,   & 
    580               &                                                     ktime=ktime, kstart=kstart, kcount=kcount ) 
     948              &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
     949              &                                                     ldxios=ldxios ) 
    581950      ENDIF 
    582951   END SUBROUTINE iom_g1d 
    583952 
    584    SUBROUTINE iom_g2d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr ) 
     953   SUBROUTINE iom_g2d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios) 
    585954      INTEGER         , INTENT(in   )                           ::   kiomid    ! Identifier of the file 
    586955      INTEGER         , INTENT(in   )                           ::   kdom      ! Type of domain to be read 
     
    594963                                                                               ! called open_ocean_jstart to set the start 
    595964                                                                               ! value for the 2nd dimension (netcdf only) 
     965      LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios      ! read data using XIOS 
    596966      ! 
    597967      IF( kiomid > 0 ) THEN 
    598968         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r2d=pvar,   & 
    599969              &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
    600               &                                                     lrowattr=lrowattr ) 
     970              &                                                     lrowattr=lrowattr,  ldxios=ldxios) 
    601971      ENDIF 
    602972   END SUBROUTINE iom_g2d 
    603973 
    604    SUBROUTINE iom_g3d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr ) 
     974   SUBROUTINE iom_g3d( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios ) 
    605975      INTEGER         , INTENT(in   )                             ::   kiomid    ! Identifier of the file 
    606976      INTEGER         , INTENT(in   )                             ::   kdom      ! Type of domain to be read 
     
    614984                                                                                 ! called open_ocean_jstart to set the start 
    615985                                                                                 ! value for the 2nd dimension (netcdf only) 
     986      LOGICAL         , INTENT(in   ),               OPTIONAL ::   ldxios        ! read data using XIOS 
    616987      ! 
    617988      IF( kiomid > 0 ) THEN 
    618989         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r3d=pvar,   & 
    619990              &                                                     ktime=ktime, kstart=kstart, kcount=kcount, & 
    620               &                                                     lrowattr=lrowattr ) 
     991              &                                                     lrowattr=lrowattr, ldxios=ldxios ) 
    621992      ENDIF 
    622993   END SUBROUTINE iom_g3d 
     
    626997         &                  pv_r1d, pv_r2d, pv_r3d,   & 
    627998         &                  ktime , kstart, kcount,   & 
    628          &                  lrowattr                ) 
     999         &                  lrowattr, ldxios        ) 
    6291000      !!----------------------------------------------------------------------- 
    6301001      !!                  ***  ROUTINE  iom_get_123d  *** 
     
    6441015      INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kcount     ! number of points to be read in each axis 
    6451016      LOGICAL                    , INTENT(in   ), OPTIONAL ::   lrowattr   ! logical flag telling iom_get to 
    646       !                                                                    ! look for and use a file attribute 
    647       !                                                                    ! called open_ocean_jstart to set the start 
    648       !                                                                    ! value for the 2nd dimension (netcdf only) 
    649       ! 
     1017                                                                           ! look for and use a file attribute 
     1018                                                                           ! called open_ocean_jstart to set the start 
     1019                                                                           ! value for the 2nd dimension (netcdf only) 
     1020      LOGICAL                    , INTENT(in   ), OPTIONAL ::   ldxios     ! use XIOS to read restart 
     1021      ! 
     1022      LOGICAL                        ::   llxios       ! local definition for XIOS read 
    6501023      LOGICAL                        ::   llnoov      ! local definition to read overlap 
    6511024      LOGICAL                        ::   luse_jattr  ! local definition to read open_ocean_jstart file attribute 
     
    6731046      LOGICAL                        ::   ll_depth_spec ! T => if kstart, kcount present then *only* use values for 3rd spatial dimension. 
    6741047      INTEGER                        ::   inlev       ! number of levels for 3D data 
     1048      REAL(wp)                       ::   gma, gmi 
    6751049      !--------------------------------------------------------------------- 
    6761050      ! 
    6771051      inlev = -1 
    6781052      IF( PRESENT(pv_r3d) )   inlev = SIZE(pv_r3d, 3) 
    679       clname = iom_file(kiomid)%name   !   esier to read 
    680       clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar) 
    681       ! local definition of the domain ? 
     1053      ! 
     1054      llxios = .FALSE. 
     1055      if(PRESENT(ldxios)) llxios = ldxios 
     1056      idvar = iom_varid( kiomid, cdvar )  
    6821057      idom = kdom 
    683       ! do we read the overlap  
    684       ! ugly patch SM+JMM+RB to overwrite global definition in some cases 
    685       llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif  
    686       ! check kcount and kstart optionals parameters... 
    687       IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) ) CALL ctl_stop(trim(clinfo), 'kcount present needs kstart present') 
    688       IF( PRESENT(kstart) .AND. (.NOT. PRESENT(kcount)) ) CALL ctl_stop(trim(clinfo), 'kstart present needs kcount present') 
    689       IF( PRESENT(kstart) .AND. idom /= jpdom_unknown .AND.  idom /= jpdom_autoglo_xy  ) & 
    690      &           CALL ctl_stop(trim(clinfo), 'kstart present needs kdom = jpdom_unknown or kdom = jpdom_autoglo_xy') 
    691  
    692       luse_jattr = .false. 
    693       IF( PRESENT(lrowattr) ) THEN 
    694          IF( lrowattr .AND. idom /= jpdom_data   ) CALL ctl_stop(trim(clinfo), 'lrowattr present and true needs kdom = jpdom_data') 
    695          IF( lrowattr .AND. idom == jpdom_data   ) luse_jattr = .true. 
    696       ENDIF 
    697       IF( luse_jattr ) THEN 
    698          SELECT CASE (iom_file(kiomid)%iolib) 
    699          CASE (jpnf90   )    
    700              ! Ok 
    701          CASE DEFAULT     
    702             CALL ctl_stop( TRIM(clinfo)//' accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    703          END SELECT 
    704       ENDIF 
    705  
    706       ! Search for the variable in the data base (eventually actualize data) 
    707       istop = nstop 
    708       idvar = iom_varid( kiomid, cdvar ) 
    709       ! 
    710       IF( idvar > 0 ) THEN 
    711          ! to write iom_file(kiomid)%dimsz in a shorter way ! 
    712          idimsz(:) = iom_file(kiomid)%dimsz(:, idvar)  
    713          inbdim = iom_file(kiomid)%ndims(idvar)            ! number of dimensions in the file 
    714          idmspc = inbdim                                   ! number of spatial dimensions in the file 
    715          IF( iom_file(kiomid)%luld(idvar) )   idmspc = inbdim - 1 
    716          IF( idmspc > 3 )   CALL ctl_stop(trim(clinfo), 'the file has more than 3 spatial dimensions this case is not coded...')  
     1058      ! 
     1059      IF(.NOT.llxios) THEN 
     1060         clname = iom_file(kiomid)%name   !   esier to read 
     1061         clinfo = '          iom_get_123d, file: '//trim(clname)//', var: '//trim(cdvar) 
     1062         ! local definition of the domain ? 
     1063         ! do we read the overlap  
     1064         ! ugly patch SM+JMM+RB to overwrite global definition in some cases 
     1065         llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif  
     1066         ! check kcount and kstart optionals parameters... 
     1067         IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) ) CALL ctl_stop(trim(clinfo), 'kcount present needs kstart present') 
     1068         IF( PRESENT(kstart) .AND. (.NOT. PRESENT(kcount)) ) CALL ctl_stop(trim(clinfo), 'kstart present needs kcount present') 
     1069         IF( PRESENT(kstart) .AND. idom /= jpdom_unknown .AND.  idom /= jpdom_autoglo_xy  ) & 
     1070     &          CALL ctl_stop(trim(clinfo), 'kstart present needs kdom = jpdom_unknown or kdom = jpdom_autoglo_xy') 
     1071 
     1072         luse_jattr = .false. 
     1073         IF( PRESENT(lrowattr) ) THEN 
     1074            IF( lrowattr .AND. idom /= jpdom_data   ) CALL ctl_stop(trim(clinfo), 'lrowattr present and true needs kdom = jpdom_data') 
     1075            IF( lrowattr .AND. idom == jpdom_data   ) luse_jattr = .true. 
     1076         ENDIF 
     1077         IF( luse_jattr ) THEN 
     1078            SELECT CASE (iom_file(kiomid)%iolib) 
     1079            CASE (jpnf90   )    
     1080                ! Ok 
     1081            CASE DEFAULT     
     1082               CALL ctl_stop( TRIM(clinfo)//' accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1083            END SELECT 
     1084         ENDIF 
     1085 
     1086         ! Search for the variable in the data base (eventually actualize data) 
     1087         istop = nstop 
    7171088         ! 
    718          ! update idom definition... 
    719          ! Identify the domain in case of jpdom_auto(glo/dta) definition 
    720          IF( idom == jpdom_autoglo_xy ) THEN 
    721             ll_depth_spec = .TRUE. 
    722             idom = jpdom_autoglo 
    723          ELSE 
    724             ll_depth_spec = .FALSE. 
    725          ENDIF 
    726          IF( idom == jpdom_autoglo .OR. idom == jpdom_autodta ) THEN             
    727             IF( idom == jpdom_autoglo ) THEN   ;   idom = jpdom_global  
    728             ELSE                               ;   idom = jpdom_data 
     1089         IF( idvar > 0 ) THEN 
     1090            ! to write iom_file(kiomid)%dimsz in a shorter way ! 
     1091            idimsz(:) = iom_file(kiomid)%dimsz(:, idvar)  
     1092            inbdim = iom_file(kiomid)%ndims(idvar)            ! number of dimensions in the file 
     1093            idmspc = inbdim                                   ! number of spatial dimensions in the file 
     1094            IF( iom_file(kiomid)%luld(idvar) )   idmspc = inbdim - 1 
     1095            IF( idmspc > 3 )   CALL ctl_stop(trim(clinfo), 'the file has more than 3 spatial dimensions this case is not coded...')  
     1096            ! 
     1097            ! update idom definition... 
     1098            ! Identify the domain in case of jpdom_auto(glo/dta) definition 
     1099            IF( idom == jpdom_autoglo_xy ) THEN 
     1100               ll_depth_spec = .TRUE. 
     1101               idom = jpdom_autoglo 
     1102            ELSE 
     1103               ll_depth_spec = .FALSE. 
    7291104            ENDIF 
    730             ind1 = INDEX( clname, '_', back = .TRUE. ) + 1 
    731             ind2 = INDEX( clname, '.', back = .TRUE. ) - 1 
    732             IF( ind2 > ind1 ) THEN   ;   IF( VERIFY( clname(ind1:ind2), '0123456789' ) == 0 )   idom = jpdom_local   ;   ENDIF 
    733          ENDIF 
    734          ! Identify the domain in case of jpdom_local definition 
    735          IF( idom == jpdom_local ) THEN 
    736             IF(     idimsz(1) == jpi               .AND. idimsz(2) == jpj               ) THEN   ;   idom = jpdom_local_full 
    737             ELSEIF( idimsz(1) == nlci              .AND. idimsz(2) == nlcj              ) THEN   ;   idom = jpdom_local_noextra 
    738             ELSEIF( idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1) ) THEN   ;   idom = jpdom_local_noovlap 
    739             ELSE   ;   CALL ctl_stop( trim(clinfo), 'impossible to identify the local domain' ) 
     1105            IF( idom == jpdom_autoglo .OR. idom == jpdom_autodta ) THEN             
     1106               IF( idom == jpdom_autoglo ) THEN   ;   idom = jpdom_global  
     1107               ELSE                               ;   idom = jpdom_data 
     1108               ENDIF 
     1109               ind1 = INDEX( clname, '_', back = .TRUE. ) + 1 
     1110               ind2 = INDEX( clname, '.', back = .TRUE. ) - 1 
     1111               IF( ind2 > ind1 ) THEN   ;   IF( VERIFY( clname(ind1:ind2), '0123456789' ) == 0 )   idom = jpdom_local   ;   ENDIF 
    7401112            ENDIF 
    741          ENDIF 
    742          ! 
    743          ! check the consistency between input array and data rank in the file 
    744          ! 
    745          ! initializations 
    746          itime = 1 
    747          IF( PRESENT(ktime) ) itime = ktime 
    748  
    749          irankpv = 1 * COUNT( (/PRESENT(pv_r1d)/) ) + 2 * COUNT( (/PRESENT(pv_r2d)/) ) + 3 * COUNT( (/PRESENT(pv_r3d)/) ) 
    750          WRITE(clrankpv, fmt='(i1)') irankpv 
    751          WRITE(cldmspc , fmt='(i1)') idmspc 
    752          ! 
    753          IF(     idmspc <  irankpv ) THEN  
    754             CALL ctl_stop( TRIM(clinfo), 'The file has only '//cldmspc//' spatial dimension',   & 
    755                &                         'it is impossible to read a '//clrankpv//'D array from this file...' ) 
    756          ELSEIF( idmspc == irankpv ) THEN 
    757             IF( PRESENT(pv_r1d) .AND. idom /= jpdom_unknown )   & 
    758                &   CALL ctl_stop( TRIM(clinfo), 'case not coded...You must use jpdom_unknown' ) 
    759          ELSEIF( idmspc >  irankpv ) THEN 
    760                IF( PRESENT(pv_r2d) .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN 
    761                   CALL ctl_warn( trim(clinfo), '2D array but 3 spatial dimensions for the data...'              ,   & 
    762                         &         'As the size of the z dimension is 1 and as we try to read the first record, ',   & 
    763                         &         'we accept this case, even if there is a possible mix-up between z and time dimension' )    
    764                   idmspc = idmspc - 1 
    765                ELSE 
    766                   CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,'         ,   & 
    767                      &                         'we do not accept data with '//cldmspc//' spatial dimensions',   & 
    768                      &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     1113            ! Identify the domain in case of jpdom_local definition 
     1114            IF( idom == jpdom_local ) THEN 
     1115               IF(     idimsz(1) == jpi               .AND. idimsz(2) == jpj               ) THEN   ;   idom = jpdom_local_full 
     1116               ELSEIF( idimsz(1) == nlci              .AND. idimsz(2) == nlcj              ) THEN   ;   idom = jpdom_local_noextra 
     1117               ELSEIF( idimsz(1) == (nlei - nldi + 1) .AND. idimsz(2) == (nlej - nldj + 1) ) THEN   ;   idom = jpdom_local_noovlap 
     1118               ELSE   ;   CALL ctl_stop( trim(clinfo), 'impossible to identify the local domain' ) 
    7691119               ENDIF 
    770          ENDIF 
    771  
    772          ! 
    773          ! definition of istart and icnt 
    774          ! 
    775          icnt  (:) = 1 
    776          istart(:) = 1 
    777          istart(idmspc+1) = itime 
    778  
    779          IF( PRESENT(kstart) .AND. .NOT. ll_depth_spec ) THEN  
    780             istart(1:idmspc) = kstart(1:idmspc)  
    781             icnt  (1:idmspc) = kcount(1:idmspc) 
    782          ELSE 
    783             IF(idom == jpdom_unknown ) THEN 
    784                icnt(1:idmspc) = idimsz(1:idmspc) 
    785             ELSE  
    786                IF( .NOT. PRESENT(pv_r1d) ) THEN   !   not a 1D array 
    787                   IF(     idom == jpdom_data    ) THEN 
    788                      jstartrow = 1 
    789                      IF( luse_jattr ) THEN 
    790                         CALL iom_getatt(kiomid, 'open_ocean_jstart', jstartrow ) ! -999 is returned if the attribute is not found 
    791                         jstartrow = MAX(1,jstartrow) 
     1120            ENDIF 
     1121            ! 
     1122            ! check the consistency between input array and data rank in the file 
     1123            ! 
     1124            ! initializations 
     1125            itime = 1 
     1126            IF( PRESENT(ktime) ) itime = ktime 
     1127            ! 
     1128            irankpv = 1 * COUNT( (/PRESENT(pv_r1d)/) ) + 2 * COUNT( (/PRESENT(pv_r2d)/) ) + 3 * COUNT( (/PRESENT(pv_r3d)/) ) 
     1129            WRITE(clrankpv, fmt='(i1)') irankpv 
     1130            WRITE(cldmspc , fmt='(i1)') idmspc 
     1131            ! 
     1132            IF(     idmspc <  irankpv ) THEN  
     1133               CALL ctl_stop( TRIM(clinfo), 'The file has only '//cldmspc//' spatial dimension',   & 
     1134                  &                         'it is impossible to read a '//clrankpv//'D array from this file...' ) 
     1135            ELSEIF( idmspc == irankpv ) THEN 
     1136               IF( PRESENT(pv_r1d) .AND. idom /= jpdom_unknown )   & 
     1137                  &   CALL ctl_stop( TRIM(clinfo), 'case not coded...You must use jpdom_unknown' ) 
     1138            ELSEIF( idmspc >  irankpv ) THEN 
     1139                  IF( PRESENT(pv_r2d) .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN 
     1140                     CALL ctl_warn( trim(clinfo), '2D array but 3 spatial dimensions for the data...'              ,   & 
     1141                           &         'As the size of the z dimension is 1 and as we try to read the first record, ',   & 
     1142                           &         'we accept this case, even if there is a possible mix-up between z and time dimension' )    
     1143                     idmspc = idmspc - 1 
     1144                  ELSE 
     1145                     CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,'         ,   & 
     1146                        &                         'we do not accept data with '//cldmspc//' spatial dimensions',   & 
     1147                        &                         'Use ncwa -a to suppress the unnecessary dimensions' ) 
     1148                  ENDIF 
     1149            ENDIF 
     1150            ! 
     1151            ! definition of istart and icnt 
     1152            ! 
     1153            icnt  (:) = 1 
     1154            istart(:) = 1 
     1155            istart(idmspc+1) = itime 
     1156    
     1157            IF( PRESENT(kstart) .AND. .NOT. ll_depth_spec ) THEN  
     1158               istart(1:idmspc) = kstart(1:idmspc)  
     1159               icnt  (1:idmspc) = kcount(1:idmspc) 
     1160            ELSE 
     1161               IF(idom == jpdom_unknown ) THEN 
     1162                  icnt(1:idmspc) = idimsz(1:idmspc) 
     1163               ELSE  
     1164                  IF( .NOT. PRESENT(pv_r1d) ) THEN   !   not a 1D array 
     1165                     IF(     idom == jpdom_data    ) THEN 
     1166                        jstartrow = 1 
     1167                        IF( luse_jattr ) THEN 
     1168                           CALL iom_getatt(kiomid, 'open_ocean_jstart', jstartrow ) ! -999 is returned if the attribute is not found 
     1169                           jstartrow = MAX(1,jstartrow) 
     1170                        ENDIF 
     1171                        istart(1:2) = (/ mig(1), mjg(1) + jstartrow - 1 /)  ! icnt(1:2) done below 
     1172                     ELSEIF( idom == jpdom_global  ) THEN ; istart(1:2) = (/ nimpp , njmpp  /)  ! icnt(1:2) done below 
    7921173                     ENDIF 
    793                      istart(1:2) = (/ mig(1), mjg(1) + jstartrow - 1 /)  ! icnt(1:2) done below 
    794                   ELSEIF( idom == jpdom_global  ) THEN ; istart(1:2) = (/ nimpp , njmpp  /)  ! icnt(1:2) done below 
    795                   ENDIF 
    796                   ! we do not read the overlap                     -> we start to read at nldi, nldj 
     1174                     ! we do not read the overlap                     -> we start to read at nldi, nldj 
    7971175! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    7981176!                  IF( idom /= jpdom_local_noovlap )   istart(1:2) = istart(1:2) + (/ nldi - 1, nldj - 1 /) 
    799                   IF( llnoov .AND. idom /= jpdom_local_noovlap ) istart(1:2) = istart(1:2) + (/ nldi - 1, nldj - 1 /) 
     1177                     IF( llnoov .AND. idom /= jpdom_local_noovlap ) istart(1:2) = istart(1:2) + (/ nldi - 1, nldj - 1 /) 
    8001178                  ! we do not read the overlap and the extra-halos -> from nldi to nlei and from nldj to nlej  
    8011179! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    8021180!                  icnt(1:2) = (/ nlei - nldi + 1, nlej - nldj + 1 /) 
    803                   IF( llnoov ) THEN   ;   icnt(1:2) = (/ nlei - nldi + 1, nlej - nldj + 1 /) 
    804                   ELSE                ;   icnt(1:2) = (/ nlci           , nlcj            /) 
    805                   ENDIF 
    806                   IF( PRESENT(pv_r3d) ) THEN 
    807                      IF( idom == jpdom_data ) THEN                        ;                               icnt(3) = inlev 
    808                      ELSEIF( ll_depth_spec .AND. PRESENT(kstart) ) THEN   ;   istart(3) = kstart(3)   ;   icnt(3) = kcount(3) 
    809                      ELSE                                                 ;                               icnt(3) = inlev 
     1181                     IF( llnoov ) THEN   ;   icnt(1:2) = (/ nlei - nldi + 1, nlej - nldj + 1 /) 
     1182                     ELSE                ;   icnt(1:2) = (/ nlci           , nlcj            /) 
     1183                     ENDIF 
     1184                     IF( PRESENT(pv_r3d) ) THEN 
     1185                        IF( idom == jpdom_data ) THEN                        ;                               icnt(3) = inlev 
     1186                        ELSEIF( ll_depth_spec .AND. PRESENT(kstart) ) THEN   ;   istart(3) = kstart(3)   ;   icnt(3) = kcount(3) 
     1187                        ELSE                                                 ;                               icnt(3) = inlev 
     1188                        ENDIF 
    8101189                     ENDIF 
    8111190                  ENDIF 
    8121191               ENDIF 
    8131192            ENDIF 
    814          ENDIF 
    815  
    816          ! check that istart and icnt can be used with this file 
    817          !- 
    818          DO jl = 1, jpmax_dims 
    819             itmp = istart(jl)+icnt(jl)-1 
    820             IF( itmp > idimsz(jl) .AND. idimsz(jl) /= 0 ) THEN 
    821                WRITE( ctmp1, FMT="('(istart(', i1, ') + icnt(', i1, ') - 1) = ', i5)" ) jl, jl, itmp 
    822                WRITE( ctmp2, FMT="(' is larger than idimsz(', i1,') = ', i5)"         ) jl, idimsz(jl) 
    823                CALL ctl_stop( trim(clinfo), 'start and count too big regarding to the size of the data, ', ctmp1, ctmp2 )      
    824             ENDIF 
    825          END DO 
    826  
    827          ! check that icnt matches the input array 
    828          !-      
    829          IF( idom == jpdom_unknown ) THEN 
    830             IF( irankpv == 1 )        ishape(1:1) = SHAPE(pv_r1d) 
    831             IF( irankpv == 2 )        ishape(1:2) = SHAPE(pv_r2d) 
    832             IF( irankpv == 3 )        ishape(1:3) = SHAPE(pv_r3d) 
    833             ctmp1 = 'd' 
    834          ELSE 
    835             IF( irankpv == 2 ) THEN 
     1193 
     1194            ! check that istart and icnt can be used with this file 
     1195            !- 
     1196            DO jl = 1, jpmax_dims 
     1197               itmp = istart(jl)+icnt(jl)-1 
     1198               IF( itmp > idimsz(jl) .AND. idimsz(jl) /= 0 ) THEN 
     1199                  WRITE( ctmp1, FMT="('(istart(', i1, ') + icnt(', i1, ') - 1) = ', i5)" ) jl, jl, itmp 
     1200                  WRITE( ctmp2, FMT="(' is larger than idimsz(', i1,') = ', i5)"         ) jl, idimsz(jl) 
     1201                  CALL ctl_stop( trim(clinfo), 'start and count too big regarding to the size of the data, ', ctmp1, ctmp2 )      
     1202               ENDIF 
     1203            END DO 
     1204 
     1205            ! check that icnt matches the input array 
     1206            !-      
     1207            IF( idom == jpdom_unknown ) THEN 
     1208               IF( irankpv == 1 )        ishape(1:1) = SHAPE(pv_r1d) 
     1209               IF( irankpv == 2 )        ishape(1:2) = SHAPE(pv_r2d) 
     1210               IF( irankpv == 3 )        ishape(1:3) = SHAPE(pv_r3d) 
     1211               ctmp1 = 'd' 
     1212            ELSE 
     1213               IF( irankpv == 2 ) THEN 
    8361214! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    8371215!               ishape(1:2) = SHAPE(pv_r2d(nldi:nlei,nldj:nlej  ))   ;   ctmp1 = 'd(nldi:nlei,nldj:nlej)' 
    838                IF( llnoov ) THEN ; ishape(1:2)=SHAPE(pv_r2d(nldi:nlei,nldj:nlej  )) ; ctmp1='d(nldi:nlei,nldj:nlej)' 
    839                ELSE              ; ishape(1:2)=SHAPE(pv_r2d(1   :nlci,1   :nlcj  )) ; ctmp1='d(1:nlci,1:nlcj)' 
     1216                  IF( llnoov ) THEN ; ishape(1:2)=SHAPE(pv_r2d(nldi:nlei,nldj:nlej  )) ; ctmp1='d(nldi:nlei,nldj:nlej)' 
     1217                  ELSE              ; ishape(1:2)=SHAPE(pv_r2d(1   :nlci,1   :nlcj  )) ; ctmp1='d(1:nlci,1:nlcj)' 
     1218                  ENDIF 
     1219               ENDIF 
     1220               IF( irankpv == 3 ) THEN  
     1221! JMM + SM: ugly patch before getting the new version of lib_mpp) 
     1222!               ishape(1:3) = SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:))   ;   ctmp1 = 'd(nldi:nlei,nldj:nlej,:)' 
     1223                  IF( llnoov ) THEN ; ishape(1:3)=SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:)) ; ctmp1='d(nldi:nlei,nldj:nlej,:)' 
     1224                  ELSE              ; ishape(1:3)=SHAPE(pv_r3d(1   :nlci,1   :nlcj,:)) ; ctmp1='d(1:nlci,1:nlcj,:)' 
     1225                  ENDIF 
    8401226               ENDIF 
    8411227            ENDIF 
    842             IF( irankpv == 3 ) THEN  
    843 ! JMM + SM: ugly patch before getting the new version of lib_mpp) 
    844 !               ishape(1:3) = SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:))   ;   ctmp1 = 'd(nldi:nlei,nldj:nlej,:)' 
    845                IF( llnoov ) THEN ; ishape(1:3)=SHAPE(pv_r3d(nldi:nlei,nldj:nlej,:)) ; ctmp1='d(nldi:nlei,nldj:nlej,:)' 
    846                ELSE              ; ishape(1:3)=SHAPE(pv_r3d(1   :nlci,1   :nlcj,:)) ; ctmp1='d(1:nlci,1:nlcj,:)' 
    847                ENDIF 
    848             ENDIF 
    849          ENDIF 
    8501228          
    851          DO jl = 1, irankpv 
    852             WRITE( ctmp2, FMT="(', ', i1,'): ', i5,' /= icnt(', i1,'):', i5)" ) jl, ishape(jl), jl, icnt(jl) 
    853             IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pv_r'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) ) 
    854          END DO 
    855  
    856       ENDIF 
    857  
    858       ! read the data 
    859       !-      
    860       IF( idvar > 0 .AND. istop == nstop ) THEN   ! no additional errors until this point... 
    861          ! 
     1229            DO jl = 1, irankpv 
     1230               WRITE( ctmp2, FMT="(', ', i1,'): ', i5,' /= icnt(', i1,'):', i5)" ) jl, ishape(jl), jl, icnt(jl) 
     1231               IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pv_r'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) ) 
     1232            END DO 
     1233 
     1234         ENDIF 
     1235 
     1236         ! read the data 
     1237         !-      
     1238         IF( idvar > 0 .AND. istop == nstop ) THEN   ! no additional errors until this point... 
     1239            ! 
    8621240         ! find the right index of the array to be read 
    8631241! JMM + SM: ugly patch before getting the new version of lib_mpp) 
     
    8651243!         ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
    8661244!         ENDIF 
    867          IF( llnoov ) THEN 
    868             IF( idom /= jpdom_unknown ) THEN   ;   ix1 = nldi   ;   ix2 = nlei      ;   iy1 = nldj   ;   iy2 = nlej 
    869             ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1245            IF( llnoov ) THEN 
     1246               IF( idom /= jpdom_unknown ) THEN   ;   ix1 = nldi   ;   ix2 = nlei      ;   iy1 = nldj   ;   iy2 = nlej 
     1247               ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1248               ENDIF 
     1249            ELSE 
     1250               IF( idom /= jpdom_unknown ) THEN   ;   ix1 = 1      ;   ix2 = nlci      ;   iy1 = 1      ;   iy2 = nlcj 
     1251               ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1252               ENDIF 
     1253            ENDIF 
     1254       
     1255            SELECT CASE (iom_file(kiomid)%iolib) 
     1256            CASE (jpnf90   )   ;   CALL iom_nf90_get(    kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2,   & 
     1257               &                                         pv_r1d, pv_r2d, pv_r3d ) 
     1258            CASE DEFAULT 
     1259               CALL ctl_stop( TRIM(clinfo)//' accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1260            END SELECT 
     1261 
     1262            IF( istop == nstop ) THEN   ! no additional errors until this point... 
     1263               IF(lwp) WRITE(numout,"(10x,' read ',a,' (rec: ',i6,') in ',a,' ok')") TRIM(cdvar), itime, TRIM(iom_file(kiomid)%name) 
     1264              
     1265               !--- overlap areas and extra hallows (mpp) 
     1266               IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown ) THEN 
     1267                  CALL lbc_lnk( pv_r2d,'Z',-999.,'no0' ) 
     1268               ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown ) THEN 
     1269                  ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 
     1270                  IF( icnt(3) == inlev ) THEN 
     1271                     CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
     1272                  ELSE   ! put some arbitrary value (a call to lbc_lnk will be done later...) 
     1273                     DO jj = nlcj+1, jpj   ;   pv_r3d(1:nlci, jj, :) = pv_r3d(1:nlci, nlej, :)   ;   END DO 
     1274                     DO ji = nlci+1, jpi   ;   pv_r3d(ji    , : , :) = pv_r3d(nlei  , :   , :)   ;   END DO 
     1275                  ENDIF 
     1276               ENDIF 
     1277               ! 
     1278            ELSE 
     1279               ! return if istop == nstop is false 
     1280               RETURN 
    8701281            ENDIF 
    8711282         ELSE 
    872             IF( idom /= jpdom_unknown ) THEN   ;   ix1 = 1      ;   ix2 = nlci      ;   iy1 = 1      ;   iy2 = nlcj 
    873             ELSE                               ;   ix1 = 1      ;   ix2 = icnt(1)   ;   iy1 = 1      ;   iy2 = icnt(2) 
     1283            ! return if statment idvar > 0 .AND. istop == nstop is false 
     1284            RETURN 
     1285         ENDIF 
     1286         ! 
     1287      ELSE        ! read using XIOS. Only if KEY_IOMPUT is defined 
     1288#if defined key_iomput 
     1289!would be good to be able to check which context is active and swap only if current is not restart 
     1290         CALL iom_swap( TRIM(crxios_context) )  
     1291         IF( PRESENT(pv_r3d) ) THEN 
     1292            if(lwp) write(numout,*) 'XIOS RST READ (3D): ',trim(cdvar) 
     1293            CALL xios_recv_field( trim(cdvar), pv_r3d) 
     1294            IF(idom /= jpdom_unknown ) then 
     1295                CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
    8741296            ENDIF 
    875          ENDIF 
    876        
    877          SELECT CASE (iom_file(kiomid)%iolib) 
    878          CASE (jpnf90   )   ;   CALL iom_nf90_get(    kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2,   & 
    879             &                                         pv_r1d, pv_r2d, pv_r3d ) 
    880          CASE DEFAULT 
    881             CALL ctl_stop( TRIM(clinfo)//' accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    882          END SELECT 
    883  
    884          IF( istop == nstop ) THEN   ! no additional errors until this point... 
    885             IF(lwp) WRITE(numout,"(10x,' read ',a,' (rec: ',i6,') in ',a,' ok')") TRIM(cdvar), itime, TRIM(iom_file(kiomid)%name) 
    886            
    887             !--- overlap areas and extra hallows (mpp) 
    888             IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown ) THEN 
    889                CALL lbc_lnk( pv_r2d,'Z',-999.,'no0' ) 
    890             ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown ) THEN 
    891                ! this if could be simplified with the new lbc_lnk that works with any size of the 3rd dimension 
    892                IF( icnt(3) == inlev ) THEN 
    893                   CALL lbc_lnk( pv_r3d,'Z',-999.,'no0' ) 
    894                ELSE   ! put some arbitrary value (a call to lbc_lnk will be done later...) 
    895                   DO jj = nlcj+1, jpj   ;   pv_r3d(1:nlci, jj, :) = pv_r3d(1:nlci, nlej, :)   ;   END DO 
    896                   DO ji = nlci+1, jpi   ;   pv_r3d(ji    , : , :) = pv_r3d(nlei  , :   , :)   ;   END DO 
    897                ENDIF 
     1297         ELSEIF( PRESENT(pv_r2d) ) THEN 
     1298            if(lwp) write(numout,*) 'XIOS RST READ (2D): ', trim(cdvar) 
     1299            CALL xios_recv_field( trim(cdvar), pv_r2d) 
     1300            IF(idom /= jpdom_unknown ) THEN 
     1301                CALL lbc_lnk(pv_r2d,'Z',-999.,'no0') 
    8981302            ENDIF 
    899              
    900             ! C1D case : always call lbc_lnk to replicate the central value over the whole 3X3 domain 
    901             IF( lk_c1d .AND. PRESENT(pv_r2d) )   CALL lbc_lnk( pv_r2d,'Z',1. ) 
    902             IF( lk_c1d .AND. PRESENT(pv_r3d) )   CALL lbc_lnk( pv_r3d,'Z',1. ) 
    903      
    904             !--- Apply scale_factor and offset 
    905             zscf = iom_file(kiomid)%scf(idvar)      ! scale factor 
    906             zofs = iom_file(kiomid)%ofs(idvar)      ! offset 
    907             IF(     PRESENT(pv_r1d) ) THEN 
    908                IF( zscf /= 1. )   pv_r1d(:) = pv_r1d(:) * zscf  
    909                IF( zofs /= 0. )   pv_r1d(:) = pv_r1d(:) + zofs 
    910             ELSEIF( PRESENT(pv_r2d) ) THEN 
    911                IF( zscf /= 1.)   pv_r2d(:,:) = pv_r2d(:,:) * zscf 
    912                IF( zofs /= 0.)   pv_r2d(:,:) = pv_r2d(:,:) + zofs 
    913             ELSEIF( PRESENT(pv_r3d) ) THEN 
    914                IF( zscf /= 1.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf 
    915                IF( zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs 
    916             ENDIF 
    917             ! 
    918          ENDIF 
    919          ! 
     1303         ELSEIF( PRESENT(pv_r1d) ) THEN 
     1304            if(lwp) write(numout,*) 'XIOS RST READ (1D): ', trim(cdvar) 
     1305            CALL xios_recv_field( trim(cdvar), pv_r1d) 
     1306         ENDIF 
     1307         CALL iom_swap( TRIM(cxios_context) ) 
     1308#else 
     1309         istop = istop + 1  
     1310         clinfo = 'Can not use XIOS in iom_get_123d, file: '//trim(clname)//', var:'//trim(cdvar) 
     1311#endif 
     1312      ENDIF 
     1313!some final adjustments 
     1314      ! C1D case : always call lbc_lnk to replicate the central value over the whole 3X3 domain 
     1315      IF( lk_c1d .AND. PRESENT(pv_r2d) )   CALL lbc_lnk( pv_r2d,'Z',1. ) 
     1316      IF( lk_c1d .AND. PRESENT(pv_r3d) )   CALL lbc_lnk( pv_r3d,'Z',1. ) 
     1317 
     1318      !--- Apply scale_factor and offset 
     1319      zscf = iom_file(kiomid)%scf(idvar)      ! scale factor 
     1320      zofs = iom_file(kiomid)%ofs(idvar)      ! offset 
     1321      IF(     PRESENT(pv_r1d) ) THEN 
     1322         IF( zscf /= 1. )   pv_r1d(:) = pv_r1d(:) * zscf  
     1323         IF( zofs /= 0. )   pv_r1d(:) = pv_r1d(:) + zofs 
     1324      ELSEIF( PRESENT(pv_r2d) ) THEN 
     1325         IF( zscf /= 1.)   pv_r2d(:,:) = pv_r2d(:,:) * zscf 
     1326         IF( zofs /= 0.)   pv_r2d(:,:) = pv_r2d(:,:) + zofs 
     1327      ELSEIF( PRESENT(pv_r3d) ) THEN 
     1328         IF( zscf /= 1.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf 
     1329         IF( zofs /= 0.)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs 
    9201330      ENDIF 
    9211331      ! 
     
    11191529   !!                   INTERFACE iom_rstput 
    11201530   !!---------------------------------------------------------------------- 
    1121    SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1531   SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    11221532      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    11231533      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    11261536      REAL(wp)        , INTENT(in)                         ::   pvar     ! written field 
    11271537      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1538      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1539      LOGICAL :: llx                ! local xios write flag 
    11281540      INTEGER :: ivid   ! variable id 
    1129       IF( kiomid > 0 ) THEN 
    1130          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1131             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1132             SELECT CASE (iom_file(kiomid)%iolib) 
    1133             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
    1134             CASE DEFAULT 
    1135                CALL ctl_stop( 'iom_rp0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1136             END SELECT 
     1541 
     1542      llx = .FALSE. 
     1543      IF(PRESENT(ldxios)) llx = ldxios 
     1544      IF( llx ) THEN 
     1545#ifdef key_iomput 
     1546      IF( kt == kwrite ) THEN 
     1547          IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
     1548          CALL xios_send_field(trim(cdvar), pvar) 
     1549      ENDIF 
     1550#endif 
     1551      ELSE 
     1552         IF( kiomid > 0 ) THEN 
     1553            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1554               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1555               SELECT CASE (iom_file(kiomid)%iolib) 
     1556               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
     1557               CASE DEFAULT      
     1558                  CALL ctl_stop( 'iom_rp0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1559               END SELECT 
     1560            ENDIF 
    11371561         ENDIF 
    11381562      ENDIF 
    11391563   END SUBROUTINE iom_rp0d 
    11401564 
    1141  
    1142    SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1565   SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    11431566      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    11441567      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    11471570      REAL(wp)        , INTENT(in), DIMENSION(          :) ::   pvar     ! written field 
    11481571      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1572      LOGICAL, OPTIONAL                                    ::   ldxios   ! xios write flag 
     1573      LOGICAL :: llx                ! local xios write flag 
    11491574      INTEGER :: ivid   ! variable id 
    1150       IF( kiomid > 0 ) THEN 
    1151          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1152             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1153             SELECT CASE (iom_file(kiomid)%iolib) 
    1154             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
    1155             CASE DEFAULT 
    1156                CALL ctl_stop( 'iom_rp1d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1157             END SELECT 
     1575 
     1576      llx = .FALSE. 
     1577      IF(PRESENT(ldxios)) llx = ldxios 
     1578      IF( llx ) THEN 
     1579#ifdef key_iomput 
     1580      IF( kt == kwrite ) THEN 
     1581         IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
     1582         CALL xios_send_field(trim(cdvar), pvar) 
     1583      ENDIF 
     1584#endif 
     1585      ELSE 
     1586         IF( kiomid > 0 ) THEN 
     1587            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1588               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1589               SELECT CASE (iom_file(kiomid)%iolib) 
     1590               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
     1591               CASE DEFAULT      
     1592                  CALL ctl_stop( 'iom_rp1d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1593               END SELECT 
     1594            ENDIF 
    11581595         ENDIF 
    11591596      ENDIF 
    11601597   END SUBROUTINE iom_rp1d 
    11611598 
    1162  
    1163    SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1599   SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    11641600      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    11651601      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    11681604      REAL(wp)        , INTENT(in), DIMENSION(:,    :    ) ::   pvar     ! written field 
    11691605      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1606      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1607      LOGICAL :: llx 
    11701608      INTEGER :: ivid   ! variable id 
    1171       IF( kiomid > 0 ) THEN 
    1172          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1173             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1174             SELECT CASE (iom_file(kiomid)%iolib) 
    1175             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
    1176             CASE DEFAULT 
    1177                CALL ctl_stop( 'iom_rp2d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1178             END SELECT 
     1609 
     1610      llx = .FALSE. 
     1611      IF(PRESENT(ldxios)) llx = ldxios 
     1612      IF( llx ) THEN 
     1613#ifdef key_iomput 
     1614      IF( kt == kwrite ) THEN 
     1615         IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
     1616         CALL xios_send_field(trim(cdvar), pvar) 
     1617      ENDIF 
     1618#endif 
     1619      ELSE 
     1620         IF( kiomid > 0 ) THEN 
     1621            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1622               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1623               SELECT CASE (iom_file(kiomid)%iolib) 
     1624               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
     1625               CASE DEFAULT      
     1626                  CALL ctl_stop( 'iom_rp2d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1627               END SELECT 
     1628            ENDIF 
    11791629         ENDIF 
    11801630      ENDIF 
    11811631   END SUBROUTINE iom_rp2d 
    11821632 
    1183  
    1184    SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1633   SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    11851634      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    11861635      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    11891638      REAL(wp)        , INTENT(in),       DIMENSION(:,:,:) ::   pvar     ! written field 
    11901639      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1640      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1641      LOGICAL :: llx                 ! local xios write flag 
    11911642      INTEGER :: ivid   ! variable id 
    1192       IF( kiomid > 0 ) THEN 
    1193          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1194             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1195             SELECT CASE (iom_file(kiomid)%iolib) 
    1196             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
    1197             CASE DEFAULT 
    1198                CALL ctl_stop( 'iom_rp3d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1199             END SELECT 
     1643 
     1644      llx = .FALSE. 
     1645      IF(PRESENT(ldxios)) llx = ldxios 
     1646      IF( llx ) THEN 
     1647#ifdef key_iomput 
     1648      IF( kt == kwrite ) THEN 
     1649         IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
     1650         CALL xios_send_field(trim(cdvar), pvar) 
     1651      ENDIF 
     1652#endif 
     1653      ELSE 
     1654         IF( kiomid > 0 ) THEN 
     1655            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1656               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1657               SELECT CASE (iom_file(kiomid)%iolib) 
     1658               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
     1659               CASE DEFAULT      
     1660                  CALL ctl_stop( 'iom_rp3d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1661               END SELECT 
     1662            ENDIF 
    12001663         ENDIF 
    12011664      ENDIF 
     
    12731736            &    lonvalue_1D=lonvalue, latvalue_1D=latvalue, mask_1D=mask, nvertex=nvertex, bounds_lon_1D=bounds_lon,      & 
    12741737            &    bounds_lat_1D=bounds_lat, area=area, type='curvilinear') 
    1275      ENDIF 
     1738      ENDIF 
    12761739      IF( xios_is_valid_domaingroup(cdid) ) THEN 
    12771740         CALL xios_set_domaingroup_attr( cdid, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj,   & 
     
    13921855      !!---------------------------------------------------------------------- 
    13931856      CHARACTER(LEN=*), INTENT(in) :: cdname 
    1394       !!---------------------------------------------------------------------- 
    1395       IF( xios_is_valid_context(cdname) ) THEN 
     1857      CHARACTER(LEN=120)           :: clname 
     1858      !!---------------------------------------------------------------------- 
     1859      clname = cdname 
     1860      IF( TRIM(Agrif_CFixed()) .NE. '0' ) clname = TRIM(Agrif_CFixed())//"_"//clname  
     1861      IF( xios_is_valid_context(clname) ) THEN 
    13961862         CALL iom_swap( cdname )   ! swap to cdname context 
    13971863         CALL xios_context_finalize() ! finalize the context 
    13981864         IF( cdname /= TRIM(cxios_context) ) CALL iom_swap( TRIM(cxios_context) )   ! return back to nemo context 
    13991865      ENDIF 
     1866      ! 
    14001867   END SUBROUTINE iom_context_finalize 
    14011868 
    14021869 
    1403    SUBROUTINE set_grid( cdgrd, plon, plat ) 
     1870   SUBROUTINE set_grid( cdgrd, plon, plat, ldxios ) 
    14041871      !!---------------------------------------------------------------------- 
    14051872      !!                     ***  ROUTINE set_grid  *** 
     
    14131880      INTEGER  :: ni, nj 
    14141881      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmask 
     1882      LOGICAL, INTENT(IN) :: ldxios 
    14151883      !!---------------------------------------------------------------------- 
    14161884      ! 
     
    14231891         &                                     latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
    14241892      ! 
    1425       IF ( ln_mskland ) THEN 
     1893      IF ( ln_mskland .AND. (.NOT.ldxios) ) THEN 
    14261894         ! mask land points, keep values on coast line -> specific mask for U, V and W points 
    14271895         SELECT CASE ( cdgrd ) 
Note: See TracChangeset for help on using the changeset viewer.