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

Ignore:
Timestamp:
2017-11-21T17:21:22+01:00 (6 years ago)
Author:
andmirek
Message:

#1953 and #1962 merged (and some modifications) with write branch

File:
1 edited

Legend:

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

    r8668 r8770  
    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_fields, 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 
     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 
     211      IF( TRIM(cdname) == TRIM(crxios_context) ) THEN 
     212!set names of the fields in restart file IF using XIOS to read data 
    210213       CALL set_rst_context() 
    211        CALL set_rst_vars() 
     214       CALL iom_set_rst_vars(rst_fields) 
    212215!set which fields are to be read from restart file 
    213216       CALL 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 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  
     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 
    337264 
    338265   SUBROUTINE set_rstr_active() 
     
    408335#endif 
    409336   END SUBROUTINE set_rst_context 
     337 
     338   SUBROUTINE iom_set_rstw_core() 
     339!from restart.F90 
     340   CALL iom_set_rstw_var_active("rdt") 
     341   IF ( .NOT. ln_diurnal_only ) THEN 
     342        CALL iom_set_rstw_var_active('ub'  ) 
     343        CALL iom_set_rstw_var_active('vb'  ) 
     344        CALL iom_set_rstw_var_active('tb'  ) 
     345        CALL iom_set_rstw_var_active('sb'  ) 
     346        CALL iom_set_rstw_var_active('sshb') 
     347        ! 
     348        CALL iom_set_rstw_var_active('un'  ) 
     349        CALL iom_set_rstw_var_active('vn'  ) 
     350        CALL iom_set_rstw_var_active('tn'  ) 
     351        CALL iom_set_rstw_var_active('sn'  ) 
     352        CALL iom_set_rstw_var_active('sshn') 
     353        CALL iom_set_rstw_var_active('rhop') 
     354     ! extra variable needed for the ice sheet coupling 
     355        IF ( ln_iscpl ) THEN 
     356             CALL iom_set_rstw_var_active('tmask') 
     357             CALL iom_set_rstw_var_active('umask') 
     358             CALL iom_set_rstw_var_active('vmask') 
     359             CALL iom_set_rstw_var_active('smask') 
     360             CALL iom_set_rstw_var_active('e3t_n') 
     361             CALL iom_set_rstw_var_active('e3u_n') 
     362             CALL iom_set_rstw_var_active('e3v_n') 
     363             CALL iom_set_rstw_var_active('gdepw_n') 
     364        END IF 
     365      ENDIF 
     366      IF(ln_diurnal) CALL iom_set_rstw_var_active('Dsst') 
     367!from trasbc.F90 
     368         CALL iom_set_rstw_var_active('sbc_hc_b') 
     369         CALL iom_set_rstw_var_active('sbc_sc_b') 
     370   END SUBROUTINE iom_set_rstw_core 
     371 
     372   SUBROUTINE iom_set_rst_vars(fields) 
     373!set names for variables in restart file 
     374   TYPE(RST_FIELD), INTENT(INOUT) :: fields(max_rst_fields) 
     375   INTEGER :: i 
     376        i = 0 
     377        i = i + 1; fields(i)%vname="rdt";            fields(i)%grid="grid_scalar" 
     378        i = i + 1; fields(i)%vname="un";             fields(i)%grid="grid_N_3D" 
     379        i = i + 1; fields(i)%vname="ub";             fields(i)%grid="grid_N_3D" 
     380        i = i + 1; fields(i)%vname="vn";             fields(i)%grid="grid_N_3D" 
     381        i = i + 1; fields(i)%vname="vb";             fields(i)%grid="grid_N_3D"   
     382        i = i + 1; fields(i)%vname="tn";             fields(i)%grid="grid_N_3D" 
     383        i = i + 1; fields(i)%vname="tb";             fields(i)%grid="grid_N_3D" 
     384        i = i + 1; fields(i)%vname="sn";             fields(i)%grid="grid_N_3D" 
     385        i = i + 1; fields(i)%vname="sb";             fields(i)%grid="grid_N_3D" 
     386        i = i + 1; fields(i)%vname="sshn";           fields(i)%grid="grid_N" 
     387        i = i + 1; fields(i)%vname="sshb";           fields(i)%grid="grid_N" 
     388        i = i + 1; fields(i)%vname="rhop";           fields(i)%grid="grid_N_3D" 
     389        i = i + 1; fields(i)%vname="kt";             fields(i)%grid="grid_scalar" 
     390        i = i + 1; fields(i)%vname="ndastp";         fields(i)%grid="grid_scalar" 
     391        i = i + 1; fields(i)%vname="adatrj";         fields(i)%grid="grid_scalar" 
     392        i = i + 1; fields(i)%vname="utau_b";         fields(i)%grid="grid_N" 
     393        i = i + 1; fields(i)%vname="vtau_b";         fields(i)%grid="grid_N" 
     394        i = i + 1; fields(i)%vname="qns_b";          fields(i)%grid="grid_N" 
     395        i = i + 1; fields(i)%vname="emp_b";          fields(i)%grid="grid_N" 
     396        i = i + 1; fields(i)%vname="sfx_b";          fields(i)%grid="grid_N" 
     397        i = i + 1; fields(i)%vname="en" ;            fields(i)%grid="grid_N_3D"  
     398        i = i + 1; fields(i)%vname="avt";            fields(i)%grid="grid_N_3D" 
     399        i = i + 1; fields(i)%vname="avm";            fields(i)%grid="grid_N_3D" 
     400        i = i + 1; fields(i)%vname="avmu";           fields(i)%grid="grid_N_3D" 
     401        i = i + 1; fields(i)%vname="avmv";           fields(i)%grid="grid_N_3D" 
     402        i = i + 1; fields(i)%vname="dissl";          fields(i)%grid="grid_N_3D" 
     403        i = i + 1; fields(i)%vname="sbc_hc_b";       fields(i)%grid="grid_N" 
     404        i = i + 1; fields(i)%vname="sbc_sc_b";       fields(i)%grid="grid_N" 
     405        i = i + 1; fields(i)%vname="qsr_hc_b";       fields(i)%grid="grid_N_3D" 
     406        i = i + 1; fields(i)%vname="fraqsr_1lev";    fields(i)%grid="grid_N" 
     407        i = i + 1; fields(i)%vname="greenland_icesheet_mass" 
     408                                               fields(i)%grid="grid_scalar" 
     409        i = i + 1; fields(i)%vname="greenland_icesheet_timelapsed" 
     410                                               fields(i)%grid="grid_scalar" 
     411        i = i + 1; fields(i)%vname="greenland_icesheet_mass_roc" 
     412                                               fields(i)%grid="grid_scalar" 
     413        i = i + 1; fields(i)%vname="antarctica_icesheet_mass" 
     414                                               fields(i)%grid="grid_scalar" 
     415        i = i + 1; fields(i)%vname="antarctica_icesheet_timelapsed" 
     416                                               fields(i)%grid="grid_scalar" 
     417        i = i + 1; fields(i)%vname="antarctica_icesheet_mass_roc" 
     418                                               fields(i)%grid="grid_scalar" 
     419        i = i + 1; fields(i)%vname="frc_v";          fields(i)%grid="grid_scalar" 
     420        i = i + 1; fields(i)%vname="frc_t";          fields(i)%grid="grid_scalar" 
     421        i = i + 1; fields(i)%vname="frc_s";          fields(i)%grid="grid_scalar" 
     422        i = i + 1; fields(i)%vname="frc_wn_t";       fields(i)%grid="grid_scalar" 
     423        i = i + 1; fields(i)%vname="frc_wn_s";       fields(i)%grid="grid_scalar" 
     424        i = i + 1; fields(i)%vname="ssh_ini";        fields(i)%grid="grid_N" 
     425        i = i + 1; fields(i)%vname="e3t_ini";        fields(i)%grid="grid_N_3D" 
     426        i = i + 1; fields(i)%vname="hc_loc_ini";     fields(i)%grid="grid_N_3D" 
     427        i = i + 1; fields(i)%vname="sc_loc_ini";     fields(i)%grid="grid_N_3D" 
     428        i = i + 1; fields(i)%vname="ssh_hc_loc_ini"; fields(i)%grid="grid_N" 
     429        i = i + 1; fields(i)%vname="ssh_sc_loc_ini"; fields(i)%grid="grid_N" 
     430        i = i + 1; fields(i)%vname="tilde_e3t_b";    fields(i)%grid="grid_N" 
     431        i = i + 1; fields(i)%vname="tilde_e3t_n";    fields(i)%grid="grid_N" 
     432        i = i + 1; fields(i)%vname="hdiv_lf";        fields(i)%grid="grid_N" 
     433        i = i + 1; fields(i)%vname="ub2_b";          fields(i)%grid="grid_N" 
     434        i = i + 1; fields(i)%vname="vb2_b";          fields(i)%grid="grid_N" 
     435        i = i + 1; fields(i)%vname="sshbb_e";        fields(i)%grid="grid_N" 
     436        i = i + 1; fields(i)%vname="ubb_e";          fields(i)%grid="grid_N" 
     437        i = i + 1; fields(i)%vname="vbb_e";          fields(i)%grid="grid_N" 
     438        i = i + 1; fields(i)%vname="sshb_e";         fields(i)%grid="grid_N" 
     439        i = i + 1; fields(i)%vname="ub_e";           fields(i)%grid="grid_N" 
     440        i = i + 1; fields(i)%vname="vb_e";           fields(i)%grid="grid_N" 
     441        i = i + 1; fields(i)%vname="fwf_isf_b";      fields(i)%grid="grid_N" 
     442        i = i + 1; fields(i)%vname="isf_sc_b";       fields(i)%grid="grid_N" 
     443        i = i + 1; fields(i)%vname="isf_hc_b";       fields(i)%grid="grid_N" 
     444        i = i + 1; fields(i)%vname="ssh_ibb";        fields(i)%grid="grid_N" 
     445        i = i + 1; fields(i)%vname="rnf_b";          fields(i)%grid="grid_N" 
     446        i = i + 1; fields(i)%vname="rnf_hc_b";       fields(i)%grid="grid_N" 
     447        i = i + 1; fields(i)%vname="rnf_sc_b";       fields(i)%grid="grid_N" 
     448        i = i + 1; fields(i)%vname="nn_fsbc";        fields(i)%grid="grid_scalar" 
     449        i = i + 1; fields(i)%vname="ssu_m";          fields(i)%grid="grid_N" 
     450        i = i + 1; fields(i)%vname="ssv_m";          fields(i)%grid="grid_N" 
     451        i = i + 1; fields(i)%vname="sst_m";          fields(i)%grid="grid_N" 
     452        i = i + 1; fields(i)%vname="sss_m";          fields(i)%grid="grid_N" 
     453        i = i + 1; fields(i)%vname="ssh_m";          fields(i)%grid="grid_N" 
     454        i = i + 1; fields(i)%vname="e3t_m";          fields(i)%grid="grid_N" 
     455        i = i + 1; fields(i)%vname="frq_m";          fields(i)%grid="grid_N" 
     456        i = i + 1; fields(i)%vname="avmb";           fields(i)%grid="grid_vector" 
     457        i = i + 1; fields(i)%vname="avtb";           fields(i)%grid="grid_vector" 
     458        i = i + 1; fields(i)%vname="ub2_i_b";        fields(i)%grid="grid_N" 
     459        i = i + 1; fields(i)%vname="vb2_i_b";        fields(i)%grid="grid_N" 
     460        i = i + 1; fields(i)%vname="ntime";          fields(i)%grid="grid_scalar" 
     461        i = i + 1; fields(i)%vname="Dsst";           fields(i)%grid="grid_scalar" 
     462        i = i + 1; fields(i)%vname="tmask";          fields(i)%grid="grid_N_3D" 
     463        i = i + 1; fields(i)%vname="umask";          fields(i)%grid="grid_N_3D" 
     464        i = i + 1; fields(i)%vname="vmask";          fields(i)%grid="grid_N_3D" 
     465        i = i + 1; fields(i)%vname="smask";          fields(i)%grid="grid_N_3D" 
     466        i = i + 1; fields(i)%vname="gdepw_n";        fields(i)%grid="grid_N_3D" 
     467        i = i + 1; fields(i)%vname="e3t_n";          fields(i)%grid="grid_N_3D" 
     468        i = i + 1; fields(i)%vname="e3u_n";          fields(i)%grid="grid_N_3D" 
     469        i = i + 1; fields(i)%vname="e3v_n";          fields(i)%grid="grid_N_3D" 
     470        i = i + 1; fields(i)%vname="surf_ini";       fields(i)%grid="grid_N" 
     471        i = i + 1; fields(i)%vname="e3t_b";          fields(i)%grid="grid_N_3D" 
     472        i = i + 1; fields(i)%vname="mxln";           fields(i)%grid="grid_N_3D" 
     473 
     474        IF( i-1 > max_rst_fields) THEN 
     475        IF(lwp) write(numout,*) 'E R R O R : iom_set_rst_vars SIZE of RST_FIELD array is too small' 
     476        nstop = nstop + 1 
     477        ENDIF 
     478 
     479   END SUBROUTINE iom_set_rst_vars 
     480 
     481 
     482   SUBROUTINE iom_set_rstw_active(cdrst_file) 
     483!sets enabled = .TRUE. for each field in restart file 
     484   CHARACTER(len=*) :: cdrst_file 
     485#if defined key_iomput 
     486   TYPE(xios_field) :: field_hdl 
     487   TYPE(xios_file) :: file_hdl 
     488   TYPE(xios_filegroup) :: filegroup_hdl 
     489   INTEGER :: i 
     490   CHARACTER(lc)  ::   clpath 
     491 
     492!set name of the restart file and enable available fields 
     493        IF(lwp) WRITE(numout,*) 'Setting restart filename (for XIOS write) to: ',cdrst_file 
     494        CALL xios_get_handle("file_definition", filegroup_hdl ) 
     495        CALL xios_add_child(filegroup_hdl, file_hdl, 'wrestart') 
     496        IF(nxioso.eq.1) THEN  
     497           CALL xios_set_file_attr( "wrestart", type="one_file", enabled=.TRUE.,&  
     498                                    mode="write", output_freq=xios_timestep)  
     499           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in one_file mode'  
     500        ELSE   
     501           CALL xios_set_file_attr( "wrestart", type="multiple_file", enabled=.TRUE.,&  
     502                                    mode="write", output_freq=xios_timestep)  
     503           if(lwp) write(numout,*) 'OPEN ', trim(cdrst_file), ' in multiple_file mode'  
     504        ENDIF  
     505        CALL xios_set_file_attr( "wrestart", name=trim(cdrst_file)) 
     506!defin files for restart context 
     507        DO i = 1, max_rst_fields 
     508         IF( rst_wfields(i)%active ) THEN 
     509                CALL xios_add_child(file_hdl, field_hdl, TRIM(rst_wfields(i)%vname)) 
     510                SELECT CASE (TRIM(rst_wfields(i)%grid)) 
     511                 CASE ("grid_N_3D") 
     512                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     513                        domain_ref="grid_N", axis_ref="deptht", prec = 8, operation = "instant") 
     514                 CASE ("grid_N") 
     515                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     516                        domain_ref="grid_N", prec = 8, operation = "instant")  
     517                 CASE ("grid_vector") 
     518                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     519                         axis_ref="deptht", prec = 8, operation = "instant") 
     520                 CASE ("grid_scalar") 
     521                    CALL xios_set_attr (field_hdl, enabled = .TRUE., name = TRIM(rst_wfields(i)%vname), & 
     522                        scalar_ref = "grid_scalar", prec = 8, operation = "instant") 
     523                END SELECT 
     524         ENDIF 
     525        END DO 
     526#endif 
     527   END SUBROUTINE iom_set_rstw_active 
     528 
     529   SUBROUTINE iom_set_rst_context( )  
     530#if defined key_iomput 
     531   TYPE(xios_domaingroup)            :: domaingroup_hdl  
     532   TYPE(xios_domain)                 :: domain_hdl  
     533   TYPE(xios_axisgroup)              :: axisgroup_hdl  
     534   TYPE(xios_axis)                   :: axis_hdl  
     535   TYPE(xios_scalar)                 :: scalar_hdl  
     536   TYPE(xios_scalargroup)            :: scalargroup_hdl  
     537 
     538     CALL xios_get_handle("domain_definition",domaingroup_hdl)  
     539     CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N")  
     540     CALL set_grid("N", glamt, gphit, .TRUE.)  
     541  
     542     CALL xios_get_handle("axis_definition",axisgroup_hdl)  
     543     CALL xios_add_child(axisgroup_hdl, axis_hdl, "deptht")  
     544!AGRIF fails to compile when unit= is in call to xios_set_axis_attr 
     545!    CALL xios_set_axis_attr( "deptht", long_name="Vertical levels",  unit="m", positive="down")  
     546     CALL xios_set_axis_attr( "deptht", long_name="Vertical levels in meters", positive="down") 
     547     CALL iom_set_axis_attr( "deptht", paxis = gdept_1d )  
     548 
     549     CALL xios_get_handle("scalar_definition", scalargroup_hdl)  
     550     CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar")  
     551#endif 
     552   END SUBROUTINE iom_set_rst_context 
    410553 
    411554   SUBROUTINE iom_swap( cdname ) 
     
    13631506   !!                   INTERFACE iom_rstput 
    13641507   !!---------------------------------------------------------------------- 
    1365    SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1508   SUBROUTINE iom_rp0d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    13661509      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    13671510      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    13701513      REAL(wp)        , INTENT(in)                         ::   pvar     ! written field 
    13711514      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1515      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1516      LOGICAL :: llx                ! local xios write flag 
    13721517      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 
     1518 
     1519      llx = .FALSE. 
     1520      IF(PRESENT(ldxios)) llx = ldxios 
     1521      IF( llx ) THEN 
     1522#ifdef key_iomput 
     1523      IF( kt == kwrite ) THEN 
     1524          IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 
     1525          CALL xios_send_field(trim(cdvar), pvar) 
     1526      ENDIF 
     1527#endif 
     1528      ELSE 
     1529         IF( kiomid > 0 ) THEN 
     1530            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1531               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1532               SELECT CASE (iom_file(kiomid)%iolib) 
     1533               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 
     1534               CASE DEFAULT      
     1535                  CALL ctl_stop( 'iom_rp0d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1536               END SELECT 
     1537            ENDIF 
    13811538         ENDIF 
    13821539      ENDIF 
    13831540   END SUBROUTINE iom_rp0d 
    13841541 
    1385    SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1542   SUBROUTINE iom_rp1d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    13861543      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    13871544      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    13901547      REAL(wp)        , INTENT(in), DIMENSION(          :) ::   pvar     ! written field 
    13911548      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1549      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1550      LOGICAL :: llx                ! local xios write flag 
    13921551      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 
     1552 
     1553      llx = .FALSE. 
     1554      IF(PRESENT(ldxios)) llx = ldxios 
     1555      IF( llx ) THEN 
     1556#ifdef key_iomput 
     1557      IF( kt == kwrite ) THEN 
     1558         IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 
     1559         CALL xios_send_field(trim(cdvar), pvar) 
     1560      ENDIF 
     1561#endif 
     1562      ELSE 
     1563         IF( kiomid > 0 ) THEN 
     1564            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1565               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1566               SELECT CASE (iom_file(kiomid)%iolib) 
     1567               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 
     1568               CASE DEFAULT      
     1569                  CALL ctl_stop( 'iom_rp1d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1570               END SELECT 
     1571            ENDIF 
    14011572         ENDIF 
    14021573      ENDIF 
    14031574   END SUBROUTINE iom_rp1d 
    14041575 
    1405    SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1576   SUBROUTINE iom_rp2d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    14061577      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    14071578      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    14101581      REAL(wp)        , INTENT(in), DIMENSION(:,    :    ) ::   pvar     ! written field 
    14111582      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1583      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1584      LOGICAL :: llx 
    14121585      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 
     1586 
     1587      llx = .FALSE. 
     1588      IF(PRESENT(ldxios)) llx = ldxios 
     1589      IF( llx ) THEN 
     1590#ifdef key_iomput 
     1591      IF( kt == kwrite ) THEN 
     1592         IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 
     1593         CALL xios_send_field(trim(cdvar), pvar) 
     1594      ENDIF 
     1595#endif 
     1596      ELSE 
     1597         IF( kiomid > 0 ) THEN 
     1598            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1599               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1600               SELECT CASE (iom_file(kiomid)%iolib) 
     1601               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 
     1602               CASE DEFAULT      
     1603                  CALL ctl_stop( 'iom_rp2d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1604               END SELECT 
     1605            ENDIF 
    14211606         ENDIF 
    14221607      ENDIF 
    14231608   END SUBROUTINE iom_rp2d 
    14241609 
    1425    SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype ) 
     1610   SUBROUTINE iom_rp3d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 
    14261611      INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step 
    14271612      INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step 
     
    14301615      REAL(wp)        , INTENT(in),       DIMENSION(:,:,:) ::   pvar     ! written field 
    14311616      INTEGER         , INTENT(in), OPTIONAL               ::   ktype    ! variable external type 
     1617      LOGICAL, OPTIONAL :: ldxios   ! xios write flag 
     1618      LOGICAL :: llx                 ! local xios write flag 
    14321619      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 
     1620 
     1621      llx = .FALSE. 
     1622      IF(PRESENT(ldxios)) llx = ldxios 
     1623      IF( llx ) THEN 
     1624#ifdef key_iomput 
     1625      IF( kt == kwrite ) THEN 
     1626         IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 
     1627         CALL xios_send_field(trim(cdvar), pvar) 
     1628      ENDIF 
     1629#endif 
     1630      ELSE 
     1631         IF( kiomid > 0 ) THEN 
     1632            IF( iom_file(kiomid)%nfid > 0 ) THEN 
     1633               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 
     1634               SELECT CASE (iom_file(kiomid)%iolib) 
     1635               CASE (jpnf90   )   ;   CALL iom_nf90_rstput(   kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 
     1636               CASE DEFAULT      
     1637                  CALL ctl_stop( 'iom_rp3d: accepted IO library is only jpnf90 (jpioipsl option has been removed)' ) 
     1638               END SELECT 
     1639            ENDIF 
    14411640         ENDIF 
    14421641      ENDIF 
     
    16161815   SUBROUTINE iom_context_finalize( cdname ) 
    16171816      CHARACTER(LEN=*), INTENT(in) :: cdname 
    1618       ! 
    1619       IF( xios_is_valid_context(cdname) ) THEN 
     1817      CHARACTER(LEN=120)           :: clname 
     1818      ! 
     1819      clname = cdname 
     1820      IF( TRIM(Agrif_CFixed()) .NE. '0' ) clname = TRIM(Agrif_CFixed())//"_"//clname  
     1821 
     1822      IF( xios_is_valid_context(clname) ) THEN 
    16201823         CALL iom_swap( cdname )   ! swap to cdname context 
    16211824         CALL xios_context_finalize() ! finalize the context 
     
    16451848      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) 
    16461849      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 /)),   & 
     1850      if(.NOT.ldxios) CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)),   & 
    16481851         &                                     latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))   
    16491852 
Note: See TracChangeset for help on using the changeset viewer.