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 8801 for branches/2017/dev_r8600_xios_read_write_v2/NEMOGCM/NEMO/OPA_SRC/IOM – NEMO

Ignore:
Timestamp:
2017-11-23T16:52:17+01:00 (7 years ago)
Author:
andmirek
Message:

#1953 and #1962 merge dev_r8600_xios_read_write r8793

Location:
branches/2017/dev_r8600_xios_read_write_v2/NEMOGCM/NEMO/OPA_SRC/IOM
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8600_xios_read_write_v2/NEMOGCM/NEMO/OPA_SRC/IOM/in_out_manager.F90

    r8800 r8801  
    4545   INTEGER       ::   nn_chunksz       !: chunksize (bytes) for NetCDF file (works only with iom_nf90 routines) 
    4646   LOGICAL       ::   ln_xios_read     !: use xios to read single file restart 
     47   INTEGER       ::   nn_wxios         !: write resart using xios 0 - no, 1 - single, 2 - multiple file output 
    4748 
    4849#if defined key_netcdf4 
     
    152153   CHARACTER(lc) ::   cxios_context         !: context name used in xios 
    153154   CHARACTER(lc) ::   crxios_context         !: context name used in xios to read restart 
     155   CHARACTER(lc) ::   cwxios_context        !: context name used in xios to write restart file 
    154156 
    155157   !!---------------------------------------------------------------------- 
  • branches/2017/dev_r8600_xios_read_write_v2/NEMOGCM/NEMO/OPA_SRC/IOM/iom.F90

    r8800 r8801  
    4141   USE dianam          ! build name of file 
    4242   USE xios 
    43    USE iom_def, ONLY : max_rst_fields, rst_fields 
     43   USE iom_def, ONLY : max_rst_fields, rst_rfields, rst_wfields, RST_FIELD 
    4444# endif 
    4545   USE ioipsl, ONLY :  ju2ymds    ! for calendar 
    4646   USE crs             ! Grid coarsening 
    4747   USE lib_fortran  
     48   USE diurnal_bulk, ONLY : ln_diurnal_only, ln_diurnal 
    4849 
    4950   IMPLICIT NONE 
     
    6566   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 
    6667   PRIVATE set_grid, set_grid_bounds, set_scalar, set_xmlatt, set_mooring, iom_update_file_name, iom_sdate 
    67    PRIVATE set_rst_vars, set_rstr_active, set_rst_context 
     68   PRIVATE iom_set_rst_context, iom_set_rstw_active, iom_set_rstr_active 
     69   PUBLIC iom_set_rstw_var_active, iom_set_rst_vars 
    6870# endif 
    6971 
     
    9294CONTAINS 
    9395 
    94    SUBROUTINE iom_init( cdname )  
     96   SUBROUTINE iom_init( cdname, fname )  
    9597      !!---------------------------------------------------------------------- 
    9698      !!                     ***  ROUTINE   *** 
     
    100102      !!---------------------------------------------------------------------- 
    101103      CHARACTER(len=*), INTENT(in)  :: cdname 
     104      CHARACTER(len=*), OPTIONAL, INTENT(in)  :: fname 
    102105#if defined key_iomput 
    103106 
    104107      TYPE(xios_duration) :: dtime    = xios_duration(0, 0, 0, 0, 0, 0) 
    105108      TYPE(xios_date)     :: start_date 
    106       CHARACTER(len=10) :: clname 
     109      CHARACTER(len=lc) :: clname 
    107110      INTEGER           :: ji, jkmin 
    108111      LOGICAL :: llrst_context              ! is context related to restart 
     
    117120      CALL xios_context_initialize(TRIM(clname), mpi_comm_opa) 
    118121      CALL iom_swap( cdname ) 
    119       llrst_context =  (TRIM(cdname) == TRIM(crxios_context)) 
     122      llrst_context =  (TRIM(cdname) == TRIM(crxios_context) .OR. TRIM(cdname) == TRIM(cwxios_context)) 
    120123 
    121124      ! Calendar type is now defined in xml file  
     
    162165         CALL dom_grid_glo   ! Return to parent grid domain 
    163166         ! 
    164          IF( ln_cfmeta .AND. TRIM(cdname) .NE. TRIM(crxios_context)) THEN   ! Add additional grid metadata 
     167         IF( ln_cfmeta .AND. .NOT. llrst_context) THEN   ! Add additional grid metadata 
    165168            CALL iom_set_domain_attr("grid_T", area = e1e2t_crs(nldi:nlei, nldj:nlej)) 
    166169            CALL iom_set_domain_attr("grid_U", area = e1u_crs(nldi:nlei, nldj:nlej) * e2u_crs(nldi:nlei, nldj:nlej)) 
     
    206209      ENDIF    
    207210      ! automatic definitions of some of the xml attributs 
    208       IF( llrst_context ) THEN 
    209 !set names of the fields in restart file IF using XIOS to read/write data 
    210        CALL set_rst_context() 
    211        CALL set_rst_vars() 
     211      IF( TRIM(cdname) == TRIM(crxios_context) ) THEN 
     212!set names of the fields in restart file IF using XIOS to read data 
     213       CALL iom_set_rst_context() 
     214       CALL iom_set_rst_vars(rst_rfields) 
    212215!set which fields are to be read from restart file 
    213        CALL set_rstr_active() 
     216       CALL iom_set_rstr_active() 
     217      ELSE IF( TRIM(cdname) == TRIM(cwxios_context) ) THEN 
     218!set names of the fields in restart file IF using XIOS to write data 
     219       CALL iom_set_rst_context() 
     220       CALL iom_set_rst_vars(rst_wfields) 
     221!set which fields are to be read from restart file 
     222       CALL iom_set_rstw_active(fname) 
    214223      ELSE 
    215224       CALL set_xmlatt 
     
    229238   END SUBROUTINE iom_init 
    230239 
    231     
    232    SUBROUTINE set_rst_vars() 
    233 !set names for variables in restart file 
     240   SUBROUTINE iom_set_rstw_var_active(field) 
     241   CHARACTER(len = *), INTENT(IN) :: field 
    234242   INTEGER :: i 
    235         rst_fields(:)%vname="NO_NAME";         rst_fields(:)%grid="NO_GRID" 
    236         i = 0 
    237         i = i + 1; rst_fields(i)%vname="rdt";            rst_fields(i)% grid="grid_scalar" 
    238         i = i + 1; rst_fields(i)%vname="un";             rst_fields(i)% grid="grid_N_3D" 
    239         i = i + 1; rst_fields(i)%vname="ub";             rst_fields(i)% grid="grid_N_3D" 
    240         i = i + 1; rst_fields(i)%vname="vn";             rst_fields(i)% grid="grid_N_3D" 
    241         i = i + 1; rst_fields(i)%vname="vb";             rst_fields(i)% grid="grid_N_3D"   
    242         i = i + 1; rst_fields(i)%vname="tn";             rst_fields(i)% grid="grid_N_3D" 
    243         i = i + 1; rst_fields(i)%vname="tb";             rst_fields(i)% grid="grid_N_3D" 
    244         i = i + 1; rst_fields(i)%vname="sn";             rst_fields(i)% grid="grid_N_3D" 
    245         i = i + 1; rst_fields(i)%vname="sb";             rst_fields(i)%grid="grid_N_3D" 
    246         i = i + 1; rst_fields(i)%vname="sshn";           rst_fields(i)%grid="grid_N" 
    247         i = i + 1; rst_fields(i)%vname="sshb";           rst_fields(i)%grid="grid_N" 
    248         i = i + 1; rst_fields(i)%vname="rhop";           rst_fields(i)%grid="grid_N_3D" 
    249         i = i + 1; rst_fields(i)%vname="kt";             rst_fields(i)%grid="grid_scalar" 
    250         i = i + 1; rst_fields(i)%vname="ndastp";         rst_fields(i)%grid="grid_scalar" 
    251         i = i + 1; rst_fields(i)%vname="adatrj";         rst_fields(i)%grid="grid_scalar" 
    252         i = i + 1; rst_fields(i)%vname="utau_b";         rst_fields(i)%grid="grid_N" 
    253         i = i + 1; rst_fields(i)%vname="vtau_b";         rst_fields(i)%grid="grid_N" 
    254         i = i + 1; rst_fields(i)%vname="qns_b";          rst_fields(i)%grid="grid_N" 
    255         i = i + 1; rst_fields(i)%vname="emp_b";          rst_fields(i)%grid="grid_N" 
    256         i = i + 1; rst_fields(i)%vname="sfx_b";          rst_fields(i)%grid="grid_N" 
    257         i = i + 1; rst_fields(i)%vname="en" ;            rst_fields(i)%grid="grid_N_3D"  
    258         i = i + 1; rst_fields(i)%vname="avt";            rst_fields(i)%grid="grid_N_3D" 
    259         i = i + 1; rst_fields(i)%vname="avm";            rst_fields(i)%grid="grid_N_3D" 
    260         i = i + 1; rst_fields(i)%vname="avmu";           rst_fields(i)%grid="grid_N_3D" 
    261         i = i + 1; rst_fields(i)%vname="avmv";           rst_fields(i)%grid="grid_N_3D" 
    262         i = i + 1; rst_fields(i)%vname="dissl";          rst_fields(i)%grid="grid_N_3D" 
    263         i = i + 1; rst_fields(i)%vname="sbc_hc_b";       rst_fields(i)%grid="grid_N" 
    264         i = i + 1; rst_fields(i)%vname="sbc_sc_b";       rst_fields(i)%grid="grid_N" 
    265         i = i + 1; rst_fields(i)%vname="qsr_hc_b";       rst_fields(i)%grid="grid_N_3D" 
    266         i = i + 1; rst_fields(i)%vname="fraqsr_1lev";    rst_fields(i)%grid="grid_N" 
    267         i = i + 1; rst_fields(i)%vname="greenland_icesheet_mass" 
    268                                                rst_fields(i)%grid="grid_scalar" 
    269         i = i + 1; rst_fields(i)%vname="greenland_icesheet_timelapsed" 
    270                                                rst_fields(i)%grid="grid_scalar" 
    271         i = i + 1; rst_fields(i)%vname="greenland_icesheet_mass_roc" 
    272                                                rst_fields(i)%grid="grid_scalar" 
    273         i = i + 1; rst_fields(i)%vname="antarctica_icesheet_mass" 
    274                                                rst_fields(i)%grid="grid_scalar" 
    275         i = i + 1; rst_fields(i)%vname="antarctica_icesheet_timelapsed" 
    276                                                rst_fields(i)%grid="grid_scalar" 
    277         i = i + 1; rst_fields(i)%vname="antarctica_icesheet_mass_roc" 
    278                                                rst_fields(i)%grid="grid_scalar" 
    279         i = i + 1; rst_fields(i)%vname="frc_v";          rst_fields(i)%grid="grid_scalar" 
    280         i = i + 1; rst_fields(i)%vname="frc_t";          rst_fields(i)%grid="grid_scalar" 
    281         i = i + 1; rst_fields(i)%vname="frc_s";          rst_fields(i)%grid="grid_scalar" 
    282         i = i + 1; rst_fields(i)%vname="frc_wn_t";       rst_fields(i)%grid="grid_scalar" 
    283         i = i + 1; rst_fields(i)%vname="frc_wn_s";       rst_fields(i)%grid="grid_scalar" 
    284         i = i + 1; rst_fields(i)%vname="ssh_ini";        rst_fields(i)%grid="grid_N" 
    285         i = i + 1; rst_fields(i)%vname="e3t_ini";        rst_fields(i)%grid="grid_N_3D" 
    286         i = i + 1; rst_fields(i)%vname="hc_loc_ini";     rst_fields(i)%grid="grid_N_3D" 
    287         i = i + 1; rst_fields(i)%vname="sc_loc_ini";     rst_fields(i)%grid="grid_N_3D" 
    288         i = i + 1; rst_fields(i)%vname="ssh_hc_loc_ini"; rst_fields(i)%grid="grid_N" 
    289         i = i + 1; rst_fields(i)%vname="ssh_sc_loc_ini"; rst_fields(i)%grid="grid_N" 
    290         i = i + 1; rst_fields(i)%vname="tilde_e3t_b";    rst_fields(i)%grid="grid_N" 
    291         i = i + 1; rst_fields(i)%vname="tilde_e3t_n";    rst_fields(i)%grid="grid_N" 
    292         i = i + 1; rst_fields(i)%vname="hdiv_lf";        rst_fields(i)%grid="grid_N" 
    293         i = i + 1; rst_fields(i)%vname="ub2_b";          rst_fields(i)%grid="grid_N" 
    294         i = i + 1; rst_fields(i)%vname="vb2_b";          rst_fields(i)%grid="grid_N" 
    295         i = i + 1; rst_fields(i)%vname="sshbb_e";        rst_fields(i)%grid="grid_N" 
    296         i = i + 1; rst_fields(i)%vname="ubb_e";          rst_fields(i)%grid="grid_N" 
    297         i = i + 1; rst_fields(i)%vname="vbb_e";          rst_fields(i)%grid="grid_N" 
    298         i = i + 1; rst_fields(i)%vname="sshb_e";         rst_fields(i)%grid="grid_N" 
    299         i = i + 1; rst_fields(i)%vname="ub_e";           rst_fields(i)%grid="grid_N" 
    300         i = i + 1; rst_fields(i)%vname="vb_e";           rst_fields(i)%grid="grid_N" 
    301         i = i + 1; rst_fields(i)%vname="fwf_isf_b";      rst_fields(i)%grid="grid_N" 
    302         i = i + 1; rst_fields(i)%vname="isf_sc_b";       rst_fields(i)%grid="grid_N" 
    303         i = i + 1; rst_fields(i)%vname="isf_hc_b";       rst_fields(i)%grid="grid_N" 
    304         i = i + 1; rst_fields(i)%vname="ssh_ibb";        rst_fields(i)%grid="grid_N" 
    305         i = i + 1; rst_fields(i)%vname="rnf_b";          rst_fields(i)%grid="grid_N" 
    306         i = i + 1; rst_fields(i)%vname="rnf_hc_b";       rst_fields(i)%grid="grid_N" 
    307         i = i + 1; rst_fields(i)%vname="rnf_sc_b";       rst_fields(i)%grid="grid_N" 
    308         i = i + 1; rst_fields(i)%vname="nn_fsbc";        rst_fields(i)%grid="grid_scalar" 
    309         i = i + 1; rst_fields(i)%vname="ssu_m";          rst_fields(i)%grid="grid_N" 
    310         i = i + 1; rst_fields(i)%vname="ssv_m";          rst_fields(i)%grid="grid_N" 
    311         i = i + 1; rst_fields(i)%vname="sst_m";          rst_fields(i)%grid="grid_N" 
    312         i = i + 1; rst_fields(i)%vname="sss_m";          rst_fields(i)%grid="grid_N" 
    313         i = i + 1; rst_fields(i)%vname="ssh_m";          rst_fields(i)%grid="grid_N" 
    314         i = i + 1; rst_fields(i)%vname="e3t_m";          rst_fields(i)%grid="grid_N" 
    315         i = i + 1; rst_fields(i)%vname="frq_m";          rst_fields(i)%grid="grid_N" 
    316         i = i + 1; rst_fields(i)%vname="avmb";           rst_fields(i)%grid="grid_vector" 
    317         i = i + 1; rst_fields(i)%vname="avtb";           rst_fields(i)%grid="grid_vector" 
    318         i = i + 1; rst_fields(i)%vname="ub2_i_b";        rst_fields(i)%grid="grid_N" 
    319         i = i + 1; rst_fields(i)%vname="vb2_i_b";        rst_fields(i)%grid="grid_N" 
    320         i = i + 1; rst_fields(i)%vname="ntime";          rst_fields(i)%grid="grid_scalar" 
    321         i = i + 1; rst_fields(i)%vname="Dsst";           rst_fields(i)%grid="grid_scalar" 
    322         i = i + 1; rst_fields(i)%vname="tmask";          rst_fields(i)%grid="grid_N_3D" 
    323         i = i + 1; rst_fields(i)%vname="umask";          rst_fields(i)%grid="grid_N_3D" 
    324         i = i + 1; rst_fields(i)%vname="vmask";          rst_fields(i)%grid="grid_N_3D" 
    325         i = i + 1; rst_fields(i)%vname="smask";          rst_fields(i)%grid="grid_N_3D" 
    326         i = i + 1; rst_fields(i)%vname="gdepw_n";        rst_fields(i)%grid="grid_N_3D" 
    327         i = i + 1; rst_fields(i)%vname="e3t_n";          rst_fields(i)%grid="grid_N_3D" 
    328         i = i + 1; rst_fields(i)%vname="e3u_n";          rst_fields(i)%grid="grid_N_3D" 
    329         i = i + 1; rst_fields(i)%vname="e3v_n";          rst_fields(i)%grid="grid_N_3D" 
    330         i = i + 1; rst_fields(i)%vname="surf_ini";       rst_fields(i)%grid="grid_N" 
    331         i = i + 1; rst_fields(i)%vname="e3t_b";          rst_fields(i)%grid="grid_N_3D" 
    332         i = i + 1; rst_fields(i)%vname="e3t_n";          rst_fields(i)%grid="grid_N_3D" 
    333         i = i + 1; rst_fields(i)%vname="mxln";           rst_fields(i)%grid="grid_N_3D" 
    334         i = i + 1; rst_fields(i)%vname="e3t_m";          rst_fields(i)%grid="grid_N_3D" 
    335    END SUBROUTINE set_rst_vars 
    336  
    337  
    338    SUBROUTINE set_rstr_active() 
     243   LOGICAL :: llis_set 
     244 
     245   llis_set = .FALSE. 
     246 
     247   DO i = 1, max_rst_fields 
     248       IF(TRIM(rst_wfields(i)%vname) == field) THEN  
     249          rst_wfields(i)%active = .TRUE. 
     250          llis_set = .TRUE. 
     251          EXIT 
     252       ENDIF 
     253   ENDDO 
     254!Warn if variable is not in defined in rst_wfields 
     255   IF(.NOT.llis_set) THEN 
     256      IF(lwp) THEN 
     257         write(numout,cform_err) 
     258         write(numout,*) 'iom_set_rstw_var_active: variable ', field ,' is available for writing but not defined'  
     259      ENDIF 
     260        nstop = nstop + 1 
     261   ENDIF 
     262 
     263   END SUBROUTINE iom_set_rstw_var_active 
     264 
     265   SUBROUTINE iom_set_rstr_active() 
    339266!sets enabled = .TRUE. for each field in restart file 
    340267   CHARACTER(len=256) :: rst_file 
     
    361288!defin files for restart context 
    362289        DO i = 1, max_rst_fields 
    363          IF( TRIM(rst_fields(i)%vname) /= "NO_NAME") THEN 
    364            IF( iom_varid( numror, TRIM(rst_fields(i)%vname), ldstop = .FALSE. ) > 0 ) THEN 
    365                 CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_fields(i)%vname)) 
    366                 SELECT CASE (TRIM(rst_fields(i)%grid)) 
     290         IF( TRIM(rst_rfields(i)%vname) /= "NO_NAME") THEN 
     291           IF( iom_varid( numror, TRIM(rst_rfields(i)%vname), ldstop = .FALSE. ) > 0 ) THEN 
     292                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_rfields(i)%vname)) 
     293                SELECT CASE (TRIM(rst_rfields(i)%grid)) 
    367294                 CASE ("grid_N_3D") 
    368                     CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_fields(i)%vname), & 
     295                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
    369296                        domain_ref="grid_N", axis_ref="deptht", operation = "instant") 
    370297                 CASE ("grid_N") 
    371                     CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_fields(i)%vname), & 
     298                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
    372299                        domain_ref="grid_N", operation = "instant")  
    373300                CASE ("grid_vector") 
    374                     CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_fields(i)%vname), & 
     301                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
    375302                         axis_ref="deptht", operation = "instant") 
    376303                 CASE ("grid_scalar") 
    377                     CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_fields(i)%vname), & 
     304                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_rfields(i)%vname), & 
    378305                        scalar_ref = "grid_scalar", operation = "instant") 
    379306                END SELECT 
    380                 IF(lwp) WRITE(numout,*) 'XIOS read: ', TRIM(rst_fields(i)%vname), ' enabled in ', TRIM(rst_file) 
     307                IF(lwp) WRITE(numout,*) 'XIOS read: ', TRIM(rst_rfields(i)%vname), ' enabled in ', TRIM(rst_file) 
    381308           ENDIF 
    382309         ENDIF 
    383310        END DO 
    384    END SUBROUTINE set_rstr_active 
    385  
    386    SUBROUTINE set_rst_context( )  
     311   END SUBROUTINE iom_set_rstr_active 
     312 
     313   SUBROUTINE iom_set_rstw_core() 
     314!from restart.F90 
     315   CALL iom_set_rstw_var_active("rdt") 
     316   IF ( .NOT. ln_diurnal_only ) THEN 
     317        CALL iom_set_rstw_var_active('ub'  ) 
     318        CALL iom_set_rstw_var_active('vb'  ) 
     319        CALL iom_set_rstw_var_active('tb'  ) 
     320        CALL iom_set_rstw_var_active('sb'  ) 
     321        CALL iom_set_rstw_var_active('sshb') 
     322        ! 
     323        CALL iom_set_rstw_var_active('un'  ) 
     324        CALL iom_set_rstw_var_active('vn'  ) 
     325        CALL iom_set_rstw_var_active('tn'  ) 
     326        CALL iom_set_rstw_var_active('sn'  ) 
     327        CALL iom_set_rstw_var_active('sshn') 
     328        CALL iom_set_rstw_var_active('rhop') 
     329     ! extra variable needed for the ice sheet coupling 
     330        IF ( ln_iscpl ) THEN 
     331             CALL iom_set_rstw_var_active('tmask') 
     332             CALL iom_set_rstw_var_active('umask') 
     333             CALL iom_set_rstw_var_active('vmask') 
     334             CALL iom_set_rstw_var_active('smask') 
     335             CALL iom_set_rstw_var_active('e3t_n') 
     336             CALL iom_set_rstw_var_active('e3u_n') 
     337             CALL iom_set_rstw_var_active('e3v_n') 
     338             CALL iom_set_rstw_var_active('gdepw_n') 
     339        END IF 
     340      ENDIF 
     341      IF(ln_diurnal) CALL iom_set_rstw_var_active('Dsst') 
     342!from trasbc.F90 
     343         CALL iom_set_rstw_var_active('sbc_hc_b') 
     344         CALL iom_set_rstw_var_active('sbc_sc_b') 
     345   END SUBROUTINE iom_set_rstw_core 
     346 
     347   SUBROUTINE iom_set_rst_vars(fields) 
     348!set names for variables in restart file 
     349   TYPE(RST_FIELD), INTENT(INOUT) :: fields(max_rst_fields) 
     350   INTEGER :: i 
     351        i = 0 
     352        i = i + 1; fields(i)%vname="rdt";            fields(i)%grid="grid_scalar" 
     353        i = i + 1; fields(i)%vname="un";             fields(i)%grid="grid_N_3D" 
     354        i = i + 1; fields(i)%vname="ub";             fields(i)%grid="grid_N_3D" 
     355        i = i + 1; fields(i)%vname="vn";             fields(i)%grid="grid_N_3D" 
     356        i = i + 1; fields(i)%vname="vb";             fields(i)%grid="grid_N_3D"   
     357        i = i + 1; fields(i)%vname="tn";             fields(i)%grid="grid_N_3D" 
     358        i = i + 1; fields(i)%vname="tb";             fields(i)%grid="grid_N_3D" 
     359        i = i + 1; fields(i)%vname="sn";             fields(i)%grid="grid_N_3D" 
     360        i = i + 1; fields(i)%vname="sb";             fields(i)%grid="grid_N_3D" 
     361        i = i + 1; fields(i)%vname="sshn";           fields(i)%grid="grid_N" 
     362        i = i + 1; fields(i)%vname="sshb";           fields(i)%grid="grid_N" 
     363        i = i + 1; fields(i)%vname="rhop";           fields(i)%grid="grid_N_3D" 
     364        i = i + 1; fields(i)%vname="kt";             fields(i)%grid="grid_scalar" 
     365        i = i + 1; fields(i)%vname="ndastp";         fields(i)%grid="grid_scalar" 
     366        i = i + 1; fields(i)%vname="adatrj";         fields(i)%grid="grid_scalar" 
     367        i = i + 1; fields(i)%vname="utau_b";         fields(i)%grid="grid_N" 
     368        i = i + 1; fields(i)%vname="vtau_b";         fields(i)%grid="grid_N" 
     369        i = i + 1; fields(i)%vname="qns_b";          fields(i)%grid="grid_N" 
     370        i = i + 1; fields(i)%vname="emp_b";          fields(i)%grid="grid_N" 
     371        i = i + 1; fields(i)%vname="sfx_b";          fields(i)%grid="grid_N" 
     372        i = i + 1; fields(i)%vname="en" ;            fields(i)%grid="grid_N_3D"  
     373        i = i + 1; fields(i)%vname="avt";            fields(i)%grid="grid_N_3D" 
     374        i = i + 1; fields(i)%vname="avm";            fields(i)%grid="grid_N_3D" 
     375        i = i + 1; fields(i)%vname="avmu";           fields(i)%grid="grid_N_3D" 
     376        i = i + 1; fields(i)%vname="avmv";           fields(i)%grid="grid_N_3D" 
     377        i = i + 1; fields(i)%vname="dissl";          fields(i)%grid="grid_N_3D" 
     378        i = i + 1; fields(i)%vname="sbc_hc_b";       fields(i)%grid="grid_N" 
     379        i = i + 1; fields(i)%vname="sbc_sc_b";       fields(i)%grid="grid_N" 
     380        i = i + 1; fields(i)%vname="qsr_hc_b";       fields(i)%grid="grid_N_3D" 
     381        i = i + 1; fields(i)%vname="fraqsr_1lev";    fields(i)%grid="grid_N" 
     382        i = i + 1; fields(i)%vname="greenland_icesheet_mass" 
     383                                               fields(i)%grid="grid_scalar" 
     384        i = i + 1; fields(i)%vname="greenland_icesheet_timelapsed" 
     385                                               fields(i)%grid="grid_scalar" 
     386        i = i + 1; fields(i)%vname="greenland_icesheet_mass_roc" 
     387                                               fields(i)%grid="grid_scalar" 
     388        i = i + 1; fields(i)%vname="antarctica_icesheet_mass" 
     389                                               fields(i)%grid="grid_scalar" 
     390        i = i + 1; fields(i)%vname="antarctica_icesheet_timelapsed" 
     391                                               fields(i)%grid="grid_scalar" 
     392        i = i + 1; fields(i)%vname="antarctica_icesheet_mass_roc" 
     393                                               fields(i)%grid="grid_scalar" 
     394        i = i + 1; fields(i)%vname="frc_v";          fields(i)%grid="grid_scalar" 
     395        i = i + 1; fields(i)%vname="frc_t";          fields(i)%grid="grid_scalar" 
     396        i = i + 1; fields(i)%vname="frc_s";          fields(i)%grid="grid_scalar" 
     397        i = i + 1; fields(i)%vname="frc_wn_t";       fields(i)%grid="grid_scalar" 
     398        i = i + 1; fields(i)%vname="frc_wn_s";       fields(i)%grid="grid_scalar" 
     399        i = i + 1; fields(i)%vname="ssh_ini";        fields(i)%grid="grid_N" 
     400        i = i + 1; fields(i)%vname="e3t_ini";        fields(i)%grid="grid_N_3D" 
     401        i = i + 1; fields(i)%vname="hc_loc_ini";     fields(i)%grid="grid_N_3D" 
     402        i = i + 1; fields(i)%vname="sc_loc_ini";     fields(i)%grid="grid_N_3D" 
     403        i = i + 1; fields(i)%vname="ssh_hc_loc_ini"; fields(i)%grid="grid_N" 
     404        i = i + 1; fields(i)%vname="ssh_sc_loc_ini"; fields(i)%grid="grid_N" 
     405        i = i + 1; fields(i)%vname="tilde_e3t_b";    fields(i)%grid="grid_N" 
     406        i = i + 1; fields(i)%vname="tilde_e3t_n";    fields(i)%grid="grid_N" 
     407        i = i + 1; fields(i)%vname="hdiv_lf";        fields(i)%grid="grid_N" 
     408        i = i + 1; fields(i)%vname="ub2_b";          fields(i)%grid="grid_N" 
     409        i = i + 1; fields(i)%vname="vb2_b";          fields(i)%grid="grid_N" 
     410        i = i + 1; fields(i)%vname="sshbb_e";        fields(i)%grid="grid_N" 
     411        i = i + 1; fields(i)%vname="ubb_e";          fields(i)%grid="grid_N" 
     412        i = i + 1; fields(i)%vname="vbb_e";          fields(i)%grid="grid_N" 
     413        i = i + 1; fields(i)%vname="sshb_e";         fields(i)%grid="grid_N" 
     414        i = i + 1; fields(i)%vname="ub_e";           fields(i)%grid="grid_N" 
     415        i = i + 1; fields(i)%vname="vb_e";           fields(i)%grid="grid_N" 
     416        i = i + 1; fields(i)%vname="fwf_isf_b";      fields(i)%grid="grid_N" 
     417        i = i + 1; fields(i)%vname="isf_sc_b";       fields(i)%grid="grid_N" 
     418        i = i + 1; fields(i)%vname="isf_hc_b";       fields(i)%grid="grid_N" 
     419        i = i + 1; fields(i)%vname="ssh_ibb";        fields(i)%grid="grid_N" 
     420        i = i + 1; fields(i)%vname="rnf_b";          fields(i)%grid="grid_N" 
     421        i = i + 1; fields(i)%vname="rnf_hc_b";       fields(i)%grid="grid_N" 
     422        i = i + 1; fields(i)%vname="rnf_sc_b";       fields(i)%grid="grid_N" 
     423        i = i + 1; fields(i)%vname="nn_fsbc";        fields(i)%grid="grid_scalar" 
     424        i = i + 1; fields(i)%vname="ssu_m";          fields(i)%grid="grid_N" 
     425        i = i + 1; fields(i)%vname="ssv_m";          fields(i)%grid="grid_N" 
     426        i = i + 1; fields(i)%vname="sst_m";          fields(i)%grid="grid_N" 
     427        i = i + 1; fields(i)%vname="sss_m";          fields(i)%grid="grid_N" 
     428        i = i + 1; fields(i)%vname="ssh_m";          fields(i)%grid="grid_N" 
     429        i = i + 1; fields(i)%vname="e3t_m";          fields(i)%grid="grid_N" 
     430        i = i + 1; fields(i)%vname="frq_m";          fields(i)%grid="grid_N" 
     431        i = i + 1; fields(i)%vname="avmb";           fields(i)%grid="grid_vector" 
     432        i = i + 1; fields(i)%vname="avtb";           fields(i)%grid="grid_vector" 
     433        i = i + 1; fields(i)%vname="ub2_i_b";        fields(i)%grid="grid_N" 
     434        i = i + 1; fields(i)%vname="vb2_i_b";        fields(i)%grid="grid_N" 
     435        i = i + 1; fields(i)%vname="ntime";          fields(i)%grid="grid_scalar" 
     436        i = i + 1; fields(i)%vname="Dsst";           fields(i)%grid="grid_scalar" 
     437        i = i + 1; fields(i)%vname="tmask";          fields(i)%grid="grid_N_3D" 
     438        i = i + 1; fields(i)%vname="umask";          fields(i)%grid="grid_N_3D" 
     439        i = i + 1; fields(i)%vname="vmask";          fields(i)%grid="grid_N_3D" 
     440        i = i + 1; fields(i)%vname="smask";          fields(i)%grid="grid_N_3D" 
     441        i = i + 1; fields(i)%vname="gdepw_n";        fields(i)%grid="grid_N_3D" 
     442        i = i + 1; fields(i)%vname="e3t_n";          fields(i)%grid="grid_N_3D" 
     443        i = i + 1; fields(i)%vname="e3u_n";          fields(i)%grid="grid_N_3D" 
     444        i = i + 1; fields(i)%vname="e3v_n";          fields(i)%grid="grid_N_3D" 
     445        i = i + 1; fields(i)%vname="surf_ini";       fields(i)%grid="grid_N" 
     446        i = i + 1; fields(i)%vname="e3t_b";          fields(i)%grid="grid_N_3D" 
     447        i = i + 1; fields(i)%vname="mxln";           fields(i)%grid="grid_N_3D" 
     448 
     449        IF( i-1 > max_rst_fields) THEN 
     450        IF(lwp) write(numout,*) 'E R R O R : iom_set_rst_vars SIZE of RST_FIELD array is too small' 
     451        nstop = nstop + 1 
     452        ENDIF 
     453 
     454   END SUBROUTINE iom_set_rst_vars 
     455 
     456 
     457   SUBROUTINE iom_set_rstw_active(cdrst_file) 
     458!sets enabled = .TRUE. for each field in restart file 
     459   CHARACTER(len=*) :: cdrst_file 
     460#if defined key_iomput 
     461   TYPE(xios_field) :: field_hdl 
     462   TYPE(xios_file) :: file_hdl 
     463   TYPE(xios_filegroup) :: filegroup_hdl 
     464   INTEGER :: i 
     465   CHARACTER(lc)  ::   clpath 
     466 
     467!set name of the restart file and enable available fields 
     468        IF(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS write) to: ',cdrst_file 
     469        CALL xios_get_handle("file_definition", filegroup_hdl ) 
     470        CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart') 
     471        IF(nxioso.eq.1) THEN  
     472           CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&  
     473                                    mode="write", output_freq=xios_timestep)  
     474           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'  
     475        ELSE   
     476           CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&  
     477                                    mode="write", output_freq=xios_timestep)  
     478           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'  
     479        ENDIF  
     480        CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file)) 
     481!defin files for restart context 
     482        DO i = 1, max_rst_fields 
     483         IF( rst_wfields(i)%active ) THEN 
     484                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_wfields(i)%vname)) 
     485                SELECT CASE (TRIM(rst_wfields(i)%grid)) 
     486                 CASE ("grid_N_3D") 
     487                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     488                        domain_ref="grid_N", axis_ref="deptht", prec = 8, operation = "instant") 
     489                 CASE ("grid_N") 
     490                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     491                        domain_ref="grid_N", prec = 8, operation = "instant")  
     492                 CASE ("grid_vector") 
     493                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     494                         axis_ref="deptht", prec = 8, operation = "instant") 
     495                 CASE ("grid_scalar") 
     496                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     497                        scalar_ref = "grid_scalar", prec = 8, operation = "instant") 
     498                END SELECT 
     499         ENDIF 
     500        END DO 
     501#endif 
     502   END SUBROUTINE iom_set_rstw_active 
     503 
     504   SUBROUTINE iom_set_rst_context( )  
    387505#if defined key_iomput 
    388506   TYPE(xios_domaingroup)            :: domaingroup_hdl  
     
    407525     CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar")  
    408526#endif 
    409    END SUBROUTINE set_rst_context 
     527   END SUBROUTINE iom_set_rst_context 
    410528 
    411529   SUBROUTINE iom_swap( cdname ) 
     
    418536#if defined key_iomput 
    419537      TYPE(xios_context) :: nemo_hdl 
    420  
    421538      IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    422539        CALL xios_get_handle(TRIM(cdname),nemo_hdl) 
     
    13631480   !!                   INTERFACE iom_rstput 
    13641481   !!---------------------------------------------------------------------- 
    1365    SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1482   SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    13661483      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    13671484      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    13701487      REAL(wp)        , INTENT(in)                         ::   pvar     ! written field 
    13711488      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1489      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1490      LOGICAL :: llx                ! local xios write flag 
    13721491      INTEGER :: ivid   ! variable id 
    1373       IF( kiomid > 0 ) THEN 
    1374          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1375             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1376             SELECT CASE (iom_file(kiomid)%iolib) 
    1377             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
    1378             CASE DEFAULT 
    1379                CALL ctl_stop( 'iom_rp0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1380             END SELECT 
     1492 
     1493      llx = .FALSE. 
     1494      IF(PRESENT(ldxios)) llx = ldxios 
     1495      IF( llx ) THEN 
     1496#ifdef key_iomput 
     1497      IF( kt == kwrite ) THEN 
     1498          IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
     1499          CALL xios_send_field(trim(cdvar), pvar) 
     1500      ENDIF 
     1501#endif 
     1502      ELSE 
     1503         IF( kiomid > 0 ) THEN 
     1504            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1505               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1506               SELECT CASE (iom_file(kiomid)%iolib) 
     1507               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
     1508               CASE DEFAULT      
     1509                  CALL ctl_stop( 'iom_rp0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1510               END SELECT 
     1511            ENDIF 
    13811512         ENDIF 
    13821513      ENDIF 
    13831514   END SUBROUTINE iom_rp0d 
    13841515 
    1385    SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1516   SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    13861517      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    13871518      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    13901521      REAL(wp)        , INTENT(in), DIMENSION(          :) ::   pvar     ! written field 
    13911522      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1523      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1524      LOGICAL :: llx                ! local xios write flag 
    13921525      INTEGER :: ivid   ! variable id 
    1393       IF( kiomid > 0 ) THEN 
    1394          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1395             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1396             SELECT CASE (iom_file(kiomid)%iolib) 
    1397             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
    1398             CASE DEFAULT 
    1399                CALL ctl_stop( 'iom_rp1d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1400             END SELECT 
     1526 
     1527      llx = .FALSE. 
     1528      IF(PRESENT(ldxios)) llx = ldxios 
     1529      IF( llx ) THEN 
     1530#ifdef key_iomput 
     1531      IF( kt == kwrite ) THEN 
     1532         IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
     1533         CALL xios_send_field(trim(cdvar), pvar) 
     1534      ENDIF 
     1535#endif 
     1536      ELSE 
     1537         IF( kiomid > 0 ) THEN 
     1538            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1539               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1540               SELECT CASE (iom_file(kiomid)%iolib) 
     1541               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
     1542               CASE DEFAULT      
     1543                  CALL ctl_stop( 'iom_rp1d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1544               END SELECT 
     1545            ENDIF 
    14011546         ENDIF 
    14021547      ENDIF 
    14031548   END SUBROUTINE iom_rp1d 
    14041549 
    1405    SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1550   SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    14061551      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    14071552      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    14101555      REAL(wp)        , INTENT(in), DIMENSION(:,    :    ) ::   pvar     ! written field 
    14111556      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1557      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1558      LOGICAL :: llx 
    14121559      INTEGER :: ivid   ! variable id 
    1413       IF( kiomid > 0 ) THEN 
    1414          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1415             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1416             SELECT CASE (iom_file(kiomid)%iolib) 
    1417             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
    1418             CASE DEFAULT 
    1419                CALL ctl_stop( 'iom_rp2d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1420             END SELECT 
     1560 
     1561      llx = .FALSE. 
     1562      IF(PRESENT(ldxios)) llx = ldxios 
     1563      IF( llx ) THEN 
     1564#ifdef key_iomput 
     1565      IF( kt == kwrite ) THEN 
     1566         IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
     1567         CALL xios_send_field(trim(cdvar), pvar) 
     1568      ENDIF 
     1569#endif 
     1570      ELSE 
     1571         IF( kiomid > 0 ) THEN 
     1572            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1573               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1574               SELECT CASE (iom_file(kiomid)%iolib) 
     1575               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
     1576               CASE DEFAULT      
     1577                  CALL ctl_stop( 'iom_rp2d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1578               END SELECT 
     1579            ENDIF 
    14211580         ENDIF 
    14221581      ENDIF 
    14231582   END SUBROUTINE iom_rp2d 
    14241583 
    1425    SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1584   SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    14261585      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    14271586      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    14301589      REAL(wp)        , INTENT(in),       DIMENSION(:,:,:) ::   pvar     ! written field 
    14311590      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1591      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1592      LOGICAL :: llx                 ! local xios write flag 
    14321593      INTEGER :: ivid   ! variable id 
    1433       IF( kiomid > 0 ) THEN 
    1434          IF( iom_file(kiomid)%nfid > 0 ) THEN 
    1435             ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
    1436             SELECT CASE (iom_file(kiomid)%iolib) 
    1437             CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
    1438             CASE DEFAULT 
    1439                CALL ctl_stop( 'iom_rp3d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
    1440             END SELECT 
     1594 
     1595      llx = .FALSE. 
     1596      IF(PRESENT(ldxios)) llx = ldxios 
     1597      IF( llx ) THEN 
     1598#ifdef key_iomput 
     1599      IF( kt == kwrite ) THEN 
     1600         IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
     1601         CALL xios_send_field(trim(cdvar), pvar) 
     1602      ENDIF 
     1603#endif 
     1604      ELSE 
     1605         IF( kiomid > 0 ) THEN 
     1606            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1607               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1608               SELECT CASE (iom_file(kiomid)%iolib) 
     1609               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
     1610               CASE DEFAULT      
     1611                  CALL ctl_stop( 'iom_rp3d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1612               END SELECT 
     1613            ENDIF 
    14411614         ENDIF 
    14421615      ENDIF 
     
    16161789   SUBROUTINE iom_context_finalize( cdname ) 
    16171790      CHARACTER(LEN=*), INTENT(in) :: cdname 
    1618       ! 
    1619       IF( xios_is_valid_context(cdname) ) THEN 
     1791      CHARACTER(LEN=120)           :: clname 
     1792      ! 
     1793      clname = cdname 
     1794      IF( TRIM(Agrif_CFixed()) .NE. '0' ) clname = TRIM(Agrif_CFixed())//"_"//clname  
     1795 
     1796      IF( xios_is_valid_context(clname) ) THEN 
    16201797         CALL iom_swap( cdname )   ! swap to cdname context 
    16211798         CALL xios_context_finalize() ! finalize the context 
     
    16451822      CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-2, jbegin=njmpp+nldj-2, ni=ni, nj=nj) 
    16461823      CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 
    1647       CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)),   & 
     1824      if(.NOT.ldxios) CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)),   & 
    16481825         &                                     latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
    16491826 
  • branches/2017/dev_r8600_xios_read_write_v2/NEMOGCM/NEMO/OPA_SRC/IOM/iom_def.F90

    r8800 r8801  
    4444   INTEGER, PARAMETER, PUBLIC ::   jpmax_digits =  5   !: maximum number of digits for the cpu number in the file name 
    4545 
     46 
    4647!$AGRIF_DO_NOT_TREAT 
    4748   INTEGER, PUBLIC            ::   iom_open_init = 0   !: used to initialize iom_file(:)%nfid to 0 
     49!XIOS write restart    
     50   LOGICAL, PUBLIC            ::   lwxios          !: write single file restart using XIOS 
     51   INTEGER, PUBLIC            ::   nxioso          !: type of restart file when writing using XIOS 1 - single, 2 - multiple 
    4852!XIOS read restart    
    49    LOGICAL, PUBLIC            ::   lxios_read          !: read single file restart using XIOS 
     53   LOGICAL, PUBLIC            ::   lrxios          !: read single file restart using XIOS 
    5054   LOGICAL, PUBLIC            ::   lxios_sini = .FALSE. ! is restart in a single file 
    5155   LOGICAL, PUBLIC            ::   lxios_set  = .FALSE.  
     56 
     57 
    5258 
    5359   TYPE, PUBLIC ::   file_descriptor 
     
    7076   END TYPE file_descriptor 
    7177   TYPE(file_descriptor), DIMENSION(jpmax_files), PUBLIC ::   iom_file !: array containing the info for all opened files 
    72  
    7378   INTEGER, PARAMETER, PUBLIC                   :: max_rst_fields = 95   
    74  
     79   TYPE, PUBLIC :: RST_FIELD   
     80    CHARACTER(len=30) :: vname = "NO_NAME" ! names of variables in restart file 
     81    CHARACTER(len=30) :: grid = "NO_GRID" 
     82    LOGICAL           :: active =.FALSE. ! for restart write only: true - write field, false do not write field 
     83   END TYPE RST_FIELD 
    7584!$AGRIF_END_DO_NOT_TREAT 
    7685 
    77    TYPE, PUBLIC :: RST_FIELD   
    78     CHARACTER(len=30) :: vname ! names of variables in restart file 
    79     CHARACTER(len=30) :: grid 
    80    END TYPE RST_FIELD 
    81    TYPE(RST_FIELD), PUBLIC :: rst_fields(max_rst_fields) 
     86   TYPE(RST_FIELD), PUBLIC :: rst_wfields(max_rst_fields), rst_rfields(max_rst_fields) 
    8287 
    8388   !!===================================================================== 
  • branches/2017/dev_r8600_xios_read_write_v2/NEMOGCM/NEMO/OPA_SRC/IOM/restart.F90

    r8800 r8801  
    2828   USE iom             ! I/O module 
    2929   USE diurnal_bulk 
    30     
     30   USE iom_def, ONLY : lwxios 
     31 
    3132   IMPLICIT NONE 
    3233   PRIVATE 
     
    6162      CHARACTER(LEN=50)   ::   clname   ! ocean output restart file name 
    6263      CHARACTER(lc)       ::   clpath   ! full path to ocean output restart file 
     64      CHARACTER(LEN=52)   ::   clpname   ! ocean output restart file name including prefix for AGRIF 
    6365      !!---------------------------------------------------------------------- 
    6466      ! 
     
    9496            IF(lwp) THEN 
    9597               WRITE(numout,*) 
    96                SELECT CASE ( jprstlib ) 
    97                CASE DEFAULT         ;   WRITE(numout,*)                            & 
    98                    '             open ocean restart NetCDF file: ',TRIM(clpath)//clname 
    99                END SELECT 
    100                IF ( snc4set%luse )      WRITE(numout,*) '             opened for NetCDF4 chunking and compression' 
    101                IF( kt == nitrst - 1 ) THEN   ;   WRITE(numout,*) '             kt = nitrst - 1 = ', kt 
    102                ELSE                          ;   WRITE(numout,*) '             kt = '             , kt 
     98               IF(.NOT.lwxios) THEN 
     99                  SELECT CASE ( jprstlib ) 
     100                  CASE DEFAULT         ;   WRITE(numout,*)                            & 
     101                      '             open ocean restart NetCDF file: ',TRIM(clpath)//TRIM(clname) 
     102                  END SELECT 
     103                  IF ( snc4set%luse )      WRITE(numout,*) '             opened for NetCDF4 chunking and compression' 
     104                  IF( kt == nitrst - 1 ) THEN   ;   WRITE(numout,*) '             kt = nitrst - 1 = ', kt 
     105                  ELSE                          ;   WRITE(numout,*) '             kt = '             , kt 
     106                  ENDIF 
    103107               ENDIF 
    104108            ENDIF 
    105109            ! 
    106             CALL iom_open( TRIM(clpath)//TRIM(clname), numrow, ldwrt = .TRUE., kiolib = jprstlib ) 
     110            IF(.NOT.lwxios) THEN 
     111               CALL iom_open( TRIM(clpath)//TRIM(clname), numrow, ldwrt = .TRUE., kiolib = jprstlib ) 
     112            ELSE 
     113               cwxios_context = "rstw_"//TRIM(ADJUSTL(clkt)) 
     114               IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
     115                  clpname = clname 
     116               ELSE 
     117                  clpname = TRIM(Agrif_CFixed())//"_"//clname    
     118               ENDIF 
     119               CALL iom_init( cwxios_context, TRIM(clpath)//TRIM(clpname)) 
     120               CALL xios_update_calendar(nitrst) 
     121               CALL iom_swap(      cxios_context          ) 
     122            ENDIF 
    107123            lrst_oce = .TRUE. 
    108124         ENDIF 
     
    123139      INTEGER, INTENT(in) ::   kt   ! ocean time-step 
    124140      !!---------------------------------------------------------------------- 
    125  
    126                      CALL iom_rstput( kt, nitrst, numrow, 'rdt'    , rdt       )   ! dynamics and tracer time step 
     141                     IF(lwxios) CALL iom_swap(      cwxios_context          ) 
     142                     CALL iom_rstput( kt, nitrst, numrow, 'rdt'    , rdt       , ldxios = lwxios)   ! dynamics time step 
    127143 
    128144      IF ( .NOT. ln_diurnal_only ) THEN 
    129                      CALL iom_rstput( kt, nitrst, numrow, 'ub'     , ub        )     ! before fields 
    130                      CALL iom_rstput( kt, nitrst, numrow, 'vb'     , vb        ) 
    131                      CALL iom_rstput( kt, nitrst, numrow, 'tb'     , tsb(:,:,:,jp_tem) ) 
    132                      CALL iom_rstput( kt, nitrst, numrow, 'sb'     , tsb(:,:,:,jp_sal) ) 
    133                      CALL iom_rstput( kt, nitrst, numrow, 'sshb'   , sshb      ) 
     145                     CALL iom_rstput( kt, nitrst, numrow, 'ub'     , ub, ldxios = lwxios        )     ! before fields 
     146                     CALL iom_rstput( kt, nitrst, numrow, 'vb'     , vb, ldxios = lwxios        ) 
     147                     CALL iom_rstput( kt, nitrst, numrow, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lwxios ) 
     148                     CALL iom_rstput( kt, nitrst, numrow, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lwxios ) 
     149                     CALL iom_rstput( kt, nitrst, numrow, 'sshb'   , sshb, ldxios = lwxios      ) 
    134150                     ! 
    135                      CALL iom_rstput( kt, nitrst, numrow, 'un'     , un        )     ! now fields 
    136                      CALL iom_rstput( kt, nitrst, numrow, 'vn'     , vn        ) 
    137                      CALL iom_rstput( kt, nitrst, numrow, 'tn'     , tsn(:,:,:,jp_tem) ) 
    138                      CALL iom_rstput( kt, nitrst, numrow, 'sn'     , tsn(:,:,:,jp_sal) ) 
    139                      CALL iom_rstput( kt, nitrst, numrow, 'sshn'   , sshn      ) 
    140                      CALL iom_rstput( kt, nitrst, numrow, 'rhop'   , rhop      ) 
    141  
     151                     CALL iom_rstput( kt, nitrst, numrow, 'un'     , un, ldxios = lwxios        )     ! now fields 
     152                     CALL iom_rstput( kt, nitrst, numrow, 'vn'     , vn, ldxios = lwxios        ) 
     153                     CALL iom_rstput( kt, nitrst, numrow, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lwxios ) 
     154                     CALL iom_rstput( kt, nitrst, numrow, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lwxios ) 
     155                     CALL iom_rstput( kt, nitrst, numrow, 'sshn'   , sshn, ldxios = lwxios      ) 
     156                     CALL iom_rstput( kt, nitrst, numrow, 'rhop'   , rhop, ldxios = lwxios      ) 
    142157                  ! extra variable needed for the ice sheet coupling 
    143158                  IF ( ln_iscpl ) THEN  
    144                      CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask    ) ! need to extrapolate T/S 
    145                      CALL iom_rstput( kt, nitrst, numrow, 'umask'  , umask    ) ! need to correct barotropic velocity 
    146                      CALL iom_rstput( kt, nitrst, numrow, 'vmask'  , vmask    ) ! need to correct barotropic velocity 
    147                      CALL iom_rstput( kt, nitrst, numrow, 'smask'  , ssmask    ) ! need to correct barotropic velocity 
    148                      CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t_n(:,:,:) )   ! need to compute temperature correction 
    149                      CALL iom_rstput( kt, nitrst, numrow, 'e3u_n', e3u_n(:,:,:) )   ! need to compute bt conservation 
    150                      CALL iom_rstput( kt, nitrst, numrow, 'e3v_n', e3v_n(:,:,:) )   ! need to compute bt conservation 
    151                      CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', gdepw_n(:,:,:) ) ! need to compute extrapolation if vvl 
     159                     CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask, ldxios = lwxios ) ! need to extrapolate T/S 
     160                     CALL iom_rstput( kt, nitrst, numrow, 'umask'  , umask, ldxios = lwxios ) ! need to correct barotropic velocity 
     161                     CALL iom_rstput( kt, nitrst, numrow, 'vmask'  , vmask, ldxios = lwxios ) ! need to correct barotropic velocity 
     162                     CALL iom_rstput( kt, nitrst, numrow, 'smask'  , ssmask, ldxios = lwxios) ! need to correct barotropic velocity 
     163                     CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t_n(:,:,:), ldxios = lwxios )   ! need to compute temperature correction 
     164                     CALL iom_rstput( kt, nitrst, numrow, 'e3u_n', e3u_n(:,:,:), ldxios = lwxios )   ! need to compute bt conservation 
     165                     CALL iom_rstput( kt, nitrst, numrow, 'e3v_n', e3v_n(:,:,:), ldxios = lwxios )   ! need to compute bt conservation 
     166                     CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', gdepw_n(:,:,:), ldxios = lwxios ) ! need to compute extrapolation if vvl 
    152167                  END IF 
    153168      ENDIF 
    154169       
    155       IF (ln_diurnal) CALL iom_rstput( kt, nitrst, numrow, 'Dsst', x_dsst    
    156  
     170      IF (ln_diurnal) CALL iom_rstput( kt, nitrst, numrow, 'Dsst', x_dsst, ldxios = lwxios 
     171      IF(lwxios) CALL iom_swap(      cxios_context          ) 
    157172      IF( kt == nitrst ) THEN 
    158          CALL iom_close( numrow )     ! close the restart file (only at last time step) 
     173         IF(.NOT.lwxios) THEN 
     174            CALL iom_close( numrow )     ! close the restart file (only at last time step) 
     175         ELSE 
     176            CALL iom_context_finalize(      cwxios_context          ) 
     177         ENDIF 
    159178!!gm         IF( .NOT. lk_trdmld )   lrst_oce = .FALSE. 
    160179!!gm  not sure what to do here   ===>>>  ask to Sebastian 
     
    164183               nitrst = nstocklist( nrst_lst ) 
    165184            ENDIF 
    166             lrst_oce = .FALSE. 
    167185      ENDIF 
    168186      ! 
     
    200218! can handle checking if variable is in the restart file (there will be no need to open 
    201219! restart) 
    202          IF(.NOT.lxios_set) lxios_read = lxios_read.AND.lxios_sini 
    203          IF( lxios_read) THEN 
     220         IF(.NOT.lxios_set) lrxios = lrxios.AND.lxios_sini 
     221         IF( lrxios) THEN 
    204222           crxios_context = 'nemo_rst' 
    205223         if(.NOT.lxios_set) then 
     
    209227         endif 
    210228         ENDIF 
    211          IF( TRIM(Agrif_CFixed()) /= '0' .AND. lxios_read) THEN 
     229         IF( TRIM(Agrif_CFixed()) /= '0' .AND. lrxios) THEN 
    212230            CALL iom_init( crxios_context ) 
    213231            IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS for AGRIF' 
     
    231249      TYPE(xios_duration):: dtime 
    232250      integer::ni,nj,nk 
     251      REAL(wp), DIMENSION(jpi, jpj, jpk) :: w3d  
    233252      !!---------------------------------------------------------------------- 
    234253 
     
    237256      ! Check dynamics and tracer time-step consistency and force Euler restart if changed 
    238257      IF( iom_varid( numror, 'rdt', ldstop = .FALSE. ) > 0 )   THEN 
    239          CALL iom_get( numror, 'rdt', zrdt, ldxios = lxios_read ) 
     258         CALL iom_get( numror, 'rdt', zrdt, ldxios = lrxios ) 
    240259         IF( zrdt /= rdt )   neuler = 0 
    241260      ENDIF 
    242261 
    243262      ! Diurnal DSST  
    244       IF( ln_diurnal ) CALL iom_get( numror, jpdom_autoglo, 'Dsst' , x_dsst, ldxios = lxios_read )  
     263      IF( ln_diurnal ) CALL iom_get( numror, jpdom_autoglo, 'Dsst' , x_dsst, ldxios = lrxios )  
    245264      IF ( ln_diurnal_only ) THEN  
    246265         IF(lwp) WRITE( numout, * ) & 
    247266         &   "rst_read:- ln_diurnal_only set, setting rhop=rau0"  
    248267         rhop = rau0 
    249          CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,1,jp_tem), ldxios = lxios_read )  
     268         CALL iom_get( numror, jpdom_autoglo, 'tn'     , w3d, ldxios = lrxios )  
     269         tsn(:,:,1,jp_tem) = w3d(:,:,1) 
    250270         RETURN  
    251271      ENDIF   
    252272       
    253273      IF( iom_varid( numror, 'ub', ldstop = .FALSE. ) > 0 ) THEN 
    254          CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub, ldxios = lxios_read                )   ! before fields 
    255          CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb, ldxios = lxios_read                ) 
    256          CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lxios_read ) 
    257          CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lxios_read ) 
    258          CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb, ldxios = lxios_read              ) 
     274         CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub, ldxios = lrxios                )   ! before fields 
     275         CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb, ldxios = lrxios                ) 
     276         CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lrxios ) 
     277         CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lrxios ) 
     278         CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb, ldxios = lrxios              ) 
    259279      ELSE 
    260280         neuler = 0 
    261281      ENDIF 
    262282      ! 
    263       CALL iom_get( numror, jpdom_autoglo, 'un'     , un, ldxios = lxios_read )   ! now    fields 
    264       CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn, ldxios = lxios_read ) 
    265       CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lxios_read ) 
    266       CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lxios_read ) 
    267       CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn, ldxios = lxios_read ) 
     283      CALL iom_get( numror, jpdom_autoglo, 'un'     , un, ldxios = lrxios )   ! now    fields 
     284      CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn, ldxios = lrxios ) 
     285      CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lrxios ) 
     286      CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lrxios ) 
     287      CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn, ldxios = lrxios ) 
    268288      IF( iom_varid( numror, 'rhop', ldstop = .FALSE. ) > 0 ) THEN 
    269          CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop, ldxios = lxios_read )   ! now    potential density 
     289         CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop, ldxios = lrxios )   ! now    potential density 
    270290      ELSE 
    271291         CALL eos( tsn, rhd, rhop, gdept_n(:,:,:) )    
Note: See TracChangeset for help on using the changeset viewer.