New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 9367 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/IOM/restart.F90 – NEMO

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

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

File:
1 edited

Legend:

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

    r6140 r9367  
    2828   USE iom             ! I/O module 
    2929   USE diurnal_bulk 
    30     
     30 
    3131   IMPLICIT NONE 
    3232   PRIVATE 
     
    6161      CHARACTER(LEN=50)   ::   clname   ! ocean output restart file name 
    6262      CHARACTER(lc)       ::   clpath   ! full path to ocean output restart file 
     63      CHARACTER(LEN=52)   ::   clpname   ! ocean output restart file name including prefix for AGRIF 
    6364      !!---------------------------------------------------------------------- 
    6465      ! 
     
    9495            IF(lwp) THEN 
    9596               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 
     97               IF(.NOT.lwxios) THEN 
     98                  SELECT CASE ( jprstlib ) 
     99                  CASE DEFAULT         ;   WRITE(numout,*)                            & 
     100                      '             open ocean restart NetCDF file: ',TRIM(clpath)//TRIM(clname) 
     101                  END SELECT 
     102                  IF ( snc4set%luse )      WRITE(numout,*) '             opened for NetCDF4 chunking and compression' 
     103                  IF( kt == nitrst - 1 ) THEN   ;   WRITE(numout,*) '             kt = nitrst - 1 = ', kt 
     104                  ELSE                          ;   WRITE(numout,*) '             kt = '             , kt 
     105                  ENDIF 
    103106               ENDIF 
    104107            ENDIF 
    105108            ! 
    106             CALL iom_open( TRIM(clpath)//TRIM(clname), numrow, ldwrt = .TRUE., kiolib = jprstlib ) 
     109            IF(.NOT.lwxios) THEN 
     110               CALL iom_open( TRIM(clpath)//TRIM(clname), numrow, ldwrt = .TRUE., kiolib = jprstlib ) 
     111            ELSE 
     112               cwxios_context = "rstw_"//TRIM(ADJUSTL(clkt)) 
     113               IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
     114                  clpname = clname 
     115               ELSE 
     116                  clpname = TRIM(Agrif_CFixed())//"_"//clname    
     117               ENDIF 
     118               CALL iom_init( cwxios_context, TRIM(clpath)//TRIM(clpname)) 
     119               CALL xios_update_calendar(nitrst) 
     120               CALL iom_swap(      cxios_context          ) 
     121            ENDIF 
    107122            lrst_oce = .TRUE. 
    108123         ENDIF 
     
    123138      INTEGER, INTENT(in) ::   kt   ! ocean time-step 
    124139      !!---------------------------------------------------------------------- 
    125  
    126                      CALL iom_rstput( kt, nitrst, numrow, 'rdt'    , rdt       )   ! dynamics and tracer time step 
     140                     IF(lwxios) CALL iom_swap(      cwxios_context          ) 
     141                     CALL iom_rstput( kt, nitrst, numrow, 'rdt'    , rdt       , ldxios = lwxios)   ! dynamics time step 
    127142 
    128143      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      ) 
     144                     CALL iom_rstput( kt, nitrst, numrow, 'ub'     , ub, ldxios = lwxios        )     ! before fields 
     145                     CALL iom_rstput( kt, nitrst, numrow, 'vb'     , vb, ldxios = lwxios        ) 
     146                     CALL iom_rstput( kt, nitrst, numrow, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lwxios ) 
     147                     CALL iom_rstput( kt, nitrst, numrow, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lwxios ) 
     148                     CALL iom_rstput( kt, nitrst, numrow, 'sshb'   , sshb, ldxios = lwxios      ) 
    134149                     ! 
    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  
     150                     CALL iom_rstput( kt, nitrst, numrow, 'un'     , un, ldxios = lwxios        )     ! now fields 
     151                     CALL iom_rstput( kt, nitrst, numrow, 'vn'     , vn, ldxios = lwxios        ) 
     152                     CALL iom_rstput( kt, nitrst, numrow, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lwxios ) 
     153                     CALL iom_rstput( kt, nitrst, numrow, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lwxios ) 
     154                     CALL iom_rstput( kt, nitrst, numrow, 'sshn'   , sshn, ldxios = lwxios      ) 
     155                     CALL iom_rstput( kt, nitrst, numrow, 'rhop'   , rhop, ldxios = lwxios      ) 
    142156                  ! extra variable needed for the ice sheet coupling 
    143157                  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 
     158                     CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask, ldxios = lwxios ) ! need to extrapolate T/S 
     159                     CALL iom_rstput( kt, nitrst, numrow, 'umask'  , umask, ldxios = lwxios ) ! need to correct barotropic velocity 
     160                     CALL iom_rstput( kt, nitrst, numrow, 'vmask'  , vmask, ldxios = lwxios ) ! need to correct barotropic velocity 
     161                     CALL iom_rstput( kt, nitrst, numrow, 'smask'  , ssmask, ldxios = lwxios) ! need to correct barotropic velocity 
     162                     CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t_n(:,:,:), ldxios = lwxios )   ! need to compute temperature correction 
     163                     CALL iom_rstput( kt, nitrst, numrow, 'e3u_n', e3u_n(:,:,:), ldxios = lwxios )   ! need to compute bt conservation 
     164                     CALL iom_rstput( kt, nitrst, numrow, 'e3v_n', e3v_n(:,:,:), ldxios = lwxios )   ! need to compute bt conservation 
     165                     CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', gdepw_n(:,:,:), ldxios = lwxios ) ! need to compute extrapolation if vvl 
    152166                  END IF 
    153167      ENDIF 
    154168       
    155       IF (ln_diurnal) CALL iom_rstput( kt, nitrst, numrow, 'Dsst', x_dsst    
    156  
     169      IF (ln_diurnal) CALL iom_rstput( kt, nitrst, numrow, 'Dsst', x_dsst, ldxios = lwxios 
     170      IF(lwxios) CALL iom_swap(      cxios_context          ) 
    157171      IF( kt == nitrst ) THEN 
    158          CALL iom_close( numrow )     ! close the restart file (only at last time step) 
     172         IF(.NOT.lwxios) THEN 
     173            CALL iom_close( numrow )     ! close the restart file (only at last time step) 
     174         ELSE 
     175            CALL iom_context_finalize(      cwxios_context          ) 
     176         ENDIF 
    159177!!gm         IF( .NOT. lk_trdmld )   lrst_oce = .FALSE. 
    160178!!gm  not sure what to do here   ===>>>  ask to Sebastian 
     
    164182               nitrst = nstocklist( nrst_lst ) 
    165183            ENDIF 
    166             lrst_oce = .FALSE. 
    167184      ENDIF 
    168185      ! 
     
    193210            WRITE(numout,*) '~~~~~~~~' 
    194211         ENDIF 
    195  
     212         lxios_sini = .FALSE. 
    196213         clpath = TRIM(cn_ocerst_indir) 
    197214         IF( clpath(LEN_TRIM(clpath):) /= '/' ) clpath = TRIM(clpath) // '/' 
    198215         CALL iom_open( TRIM(clpath)//cn_ocerst_in, numror, kiolib = jlibalt ) 
    199       ENDIF 
     216! are we using XIOS to read the data? Part above will have to modified once XIOS 
     217! can handle checking if variable is in the restart file (there will be no need to open 
     218! restart) 
     219         IF(.NOT.lxios_set) lrxios = lrxios.AND.lxios_sini 
     220         IF( lrxios) THEN 
     221             crxios_context = 'nemo_rst' 
     222             IF( .NOT.lxios_set ) THEN 
     223                 IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS' 
     224                 CALL iom_init( crxios_context ) 
     225                 lxios_set = .TRUE. 
     226             ENDIF 
     227         ENDIF 
     228         IF( TRIM(Agrif_CFixed()) /= '0' .AND. lrxios) THEN 
     229             CALL iom_init( crxios_context ) 
     230             IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS for AGRIF' 
     231             lxios_set = .TRUE. 
     232         ENDIF  
     233      ENDIF 
     234 
    200235   END SUBROUTINE rst_read_open 
    201236 
     
    211246      REAL(wp) ::   zrdt 
    212247      INTEGER  ::   jk 
     248      REAL(wp), DIMENSION(jpi, jpj, jpk) :: w3d 
    213249      !!---------------------------------------------------------------------- 
    214250 
     
    217253      ! Check dynamics and tracer time-step consistency and force Euler restart if changed 
    218254      IF( iom_varid( numror, 'rdt', ldstop = .FALSE. ) > 0 )   THEN 
    219          CALL iom_get( numror, 'rdt', zrdt ) 
     255         CALL iom_get( numror, 'rdt', zrdt, ldxios = lrxios ) 
    220256         IF( zrdt /= rdt )   neuler = 0 
    221257      ENDIF 
    222258 
    223259      ! Diurnal DSST  
    224       IF( ln_diurnal ) CALL iom_get( numror, jpdom_autoglo, 'Dsst' , x_dsst  )  
     260      IF( ln_diurnal ) CALL iom_get( numror, jpdom_autoglo, 'Dsst' , x_dsst, ldxios = lrxios )  
    225261      IF ( ln_diurnal_only ) THEN  
    226262         IF(lwp) WRITE( numout, * ) & 
    227263         &   "rst_read:- ln_diurnal_only set, setting rhop=rau0"  
    228264         rhop = rau0 
    229          CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,1,jp_tem) )  
     265         CALL iom_get( numror, jpdom_autoglo, 'tn'     , w3d, ldxios = lrxios )  
     266         tsn(:,:,1,jp_tem) = w3d(:,:,1) 
    230267         RETURN  
    231268      ENDIF   
    232269       
    233270      IF( iom_varid( numror, 'ub', ldstop = .FALSE. ) > 0 ) THEN 
    234          CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub      )   ! before fields 
    235          CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb      ) 
    236          CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem) ) 
    237          CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal) ) 
    238          CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb    ) 
     271         CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub, ldxios = lrxios                )   ! before fields 
     272         CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb, ldxios = lrxios                ) 
     273         CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lrxios ) 
     274         CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lrxios ) 
     275         CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb, ldxios = lrxios              ) 
    239276      ELSE 
    240277         neuler = 0 
    241278      ENDIF 
    242279      ! 
    243       CALL iom_get( numror, jpdom_autoglo, 'un'     , un      )   ! now    fields 
    244       CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn      ) 
    245       CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem) ) 
    246       CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal) ) 
    247       CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn    ) 
     280      CALL iom_get( numror, jpdom_autoglo, 'un'     , un, ldxios = lrxios )   ! now    fields 
     281      CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn, ldxios = lrxios ) 
     282      CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lrxios ) 
     283      CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lrxios ) 
     284      CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn, ldxios = lrxios ) 
    248285      IF( iom_varid( numror, 'rhop', ldstop = .FALSE. ) > 0 ) THEN 
    249          CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop    )   ! now    potential density 
     286         CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop, ldxios = lrxios )   ! now    potential density 
    250287      ELSE 
    251288         CALL eos( tsn, rhd, rhop, gdept_n(:,:,:) )    
Note: See TracChangeset for help on using the changeset viewer.