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 13463 for NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/IOM/restart.F90 – NEMO

Ignore:
Timestamp:
2020-09-14T17:40:34+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2195:update to trunk 13461

Location:
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@13382        sette 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/IOM/restart.F90

    r11405 r13463  
    2727   USE in_out_manager  ! I/O manager 
    2828   USE iom             ! I/O module 
    29    USE diurnal_bulk 
     29   USE diu_bulk 
    3030   USE lib_mpp         ! distribued memory computing library 
    3131 
     
    3838   PUBLIC   rst_read_open   ! routine called in rst_read and (possibly) in dom_vvl_init 
    3939 
    40    !! * Substitutions 
    41 #  include "vectopt_loop_substitute.h90" 
    4240   !!---------------------------------------------------------------------- 
    4341   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    7068         IF( ln_rst_list ) THEN 
    7169            nrst_lst = 1 
    72             nitrst = nstocklist( nrst_lst ) 
     70            nitrst = nn_stocklist( nrst_lst ) 
    7371         ELSE 
    7472            nitrst = nitend 
    7573         ENDIF 
    7674      ENDIF 
     75       
     76      IF( .NOT. ln_rst_list .AND. nn_stock == -1 )   RETURN   ! we will never do any restart 
    7777 
    7878      ! frequency-based restart dumping (nn_stock) 
    79       IF( .NOT. ln_rst_list .AND. MOD( kt - 1, nstock ) == 0 ) THEN    
     79      IF( .NOT. ln_rst_list .AND. MOD( kt - 1, nn_stock ) == 0 ) THEN    
    8080         ! we use kt - 1 and not kt - nit000 to keep the same periodicity from the beginning of the experiment 
    81          nitrst = kt + nstock - 1                  ! define the next value of nitrst for restart writing 
     81         nitrst = kt + nn_stock - 1                  ! define the next value of nitrst for restart writing 
    8282         IF( nitrst > nitend )   nitrst = nitend   ! make sure we write a restart at the end of the run 
    8383      ENDIF 
     
    8585      ! we open and define the ocean restart file one time step before writing the data (-> at nitrst - 1) 
    8686      ! except if we write ocean restart files every time step or if an ocean restart file was writen at nitend - 1 
    87       IF( kt == nitrst - 1 .OR. nstock == 1 .OR. ( kt == nitend .AND. .NOT. lrst_oce ) ) THEN 
     87      IF( kt == nitrst - 1 .OR. nn_stock == 1 .OR. ( kt == nitend .AND. .NOT. lrst_oce ) ) THEN 
    8888         IF( nitrst <= nitend .AND. nitrst > 0 ) THEN  
    8989            ! beware of the format used to write kt (default is i8.8, that should be large enough...) 
     
    131131 
    132132 
    133    SUBROUTINE rst_write( kt ) 
     133   SUBROUTINE rst_write( kt, Kbb, Kmm ) 
    134134      !!--------------------------------------------------------------------- 
    135135      !!                   ***  ROUTINE rstwrite  *** 
     
    140140      !!              file, save fields which are necessary for restart 
    141141      !!---------------------------------------------------------------------- 
    142       INTEGER, INTENT(in) ::   kt   ! ocean time-step 
     142      INTEGER, INTENT(in) ::   kt         ! ocean time-step 
     143      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
    143144      !!---------------------------------------------------------------------- 
    144145                     IF(lwxios) CALL iom_swap(      cwxios_context          ) 
    145                      CALL iom_rstput( kt, nitrst, numrow, 'rdt'    , rdt       , ldxios = lwxios)   ! dynamics time step 
     146                     CALL iom_rstput( kt, nitrst, numrow, 'rdt'    , rn_Dt       , ldxios = lwxios)   ! dynamics time step 
    146147                     CALL iom_delay_rst( 'WRITE', 'OCE', numrow )   ! save only ocean delayed global communication variables 
    147148 
    148149      IF ( .NOT. ln_diurnal_only ) THEN 
    149                      CALL iom_rstput( kt, nitrst, numrow, 'ub'     , ub, ldxios = lwxios        )     ! before fields 
    150                      CALL iom_rstput( kt, nitrst, numrow, 'vb'     , vb, ldxios = lwxios        ) 
    151                      CALL iom_rstput( kt, nitrst, numrow, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lwxios ) 
    152                      CALL iom_rstput( kt, nitrst, numrow, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lwxios ) 
    153                      CALL iom_rstput( kt, nitrst, numrow, 'sshb'   , sshb, ldxios = lwxios      ) 
     150                     CALL iom_rstput( kt, nitrst, numrow, 'ub'     , uu(:,:,:       ,Kbb), ldxios = lwxios        )     ! before fields 
     151                     CALL iom_rstput( kt, nitrst, numrow, 'vb'     , vv(:,:,:       ,Kbb), ldxios = lwxios        ) 
     152                     CALL iom_rstput( kt, nitrst, numrow, 'tb'     , ts(:,:,:,jp_tem,Kbb), ldxios = lwxios ) 
     153                     CALL iom_rstput( kt, nitrst, numrow, 'sb'     , ts(:,:,:,jp_sal,Kbb), ldxios = lwxios ) 
     154                     CALL iom_rstput( kt, nitrst, numrow, 'sshb'   ,ssh(:,:         ,Kbb), ldxios = lwxios      ) 
    154155                     ! 
    155                      CALL iom_rstput( kt, nitrst, numrow, 'un'     , un, ldxios = lwxios        )     ! now fields 
    156                      CALL iom_rstput( kt, nitrst, numrow, 'vn'     , vn, ldxios = lwxios        ) 
    157                      CALL iom_rstput( kt, nitrst, numrow, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lwxios ) 
    158                      CALL iom_rstput( kt, nitrst, numrow, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lwxios ) 
    159                      CALL iom_rstput( kt, nitrst, numrow, 'sshn'   , sshn, ldxios = lwxios      ) 
     156                     CALL iom_rstput( kt, nitrst, numrow, 'un'     , uu(:,:,:       ,Kmm), ldxios = lwxios        )     ! now fields 
     157                     CALL iom_rstput( kt, nitrst, numrow, 'vn'     , vv(:,:,:       ,Kmm), ldxios = lwxios        ) 
     158                     CALL iom_rstput( kt, nitrst, numrow, 'tn'     , ts(:,:,:,jp_tem,Kmm), ldxios = lwxios ) 
     159                     CALL iom_rstput( kt, nitrst, numrow, 'sn'     , ts(:,:,:,jp_sal,Kmm), ldxios = lwxios ) 
     160                     CALL iom_rstput( kt, nitrst, numrow, 'sshn'   ,ssh(:,:         ,Kmm), ldxios = lwxios      ) 
    160161                     CALL iom_rstput( kt, nitrst, numrow, 'rhop'   , rhop, ldxios = lwxios      ) 
    161                   ! extra variable needed for the ice sheet coupling 
    162                   IF ( ln_iscpl ) THEN  
    163                      CALL iom_rstput( kt, nitrst, numrow, 'tmask'  , tmask, ldxios = lwxios ) ! need to extrapolate T/S 
    164                      CALL iom_rstput( kt, nitrst, numrow, 'umask'  , umask, ldxios = lwxios ) ! need to correct barotropic velocity 
    165                      CALL iom_rstput( kt, nitrst, numrow, 'vmask'  , vmask, ldxios = lwxios ) ! need to correct barotropic velocity 
    166                      CALL iom_rstput( kt, nitrst, numrow, 'smask'  , ssmask, ldxios = lwxios) ! need to correct barotropic velocity 
    167                      CALL iom_rstput( kt, nitrst, numrow, 'e3t_n', e3t_n(:,:,:), ldxios = lwxios )   ! need to compute temperature correction 
    168                      CALL iom_rstput( kt, nitrst, numrow, 'e3u_n', e3u_n(:,:,:), ldxios = lwxios )   ! need to compute bt conservation 
    169                      CALL iom_rstput( kt, nitrst, numrow, 'e3v_n', e3v_n(:,:,:), ldxios = lwxios )   ! need to compute bt conservation 
    170                      CALL iom_rstput( kt, nitrst, numrow, 'gdepw_n', gdepw_n(:,:,:), ldxios = lwxios ) ! need to compute extrapolation if vvl 
    171                   END IF 
    172162      ENDIF 
    173163       
     
    184174         lrst_oce = .FALSE. 
    185175            IF( ln_rst_list ) THEN 
    186                nrst_lst = MIN(nrst_lst + 1, SIZE(nstocklist,1)) 
    187                nitrst = nstocklist( nrst_lst ) 
     176               nrst_lst = MIN(nrst_lst + 1, SIZE(nn_stocklist,1)) 
     177               nitrst = nn_stocklist( nrst_lst ) 
    188178            ENDIF 
    189179      ENDIF 
     
    224214             IF( .NOT.lxios_set ) THEN 
    225215                 IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS' 
    226                  CALL iom_init( crxios_context, ld_tmppatch = .false. ) 
     216                 CALL iom_init( crxios_context ) 
    227217                 lxios_set = .TRUE. 
    228218             ENDIF 
    229219         ENDIF 
    230220         IF( TRIM(Agrif_CFixed()) /= '0' .AND. lrxios) THEN 
    231              CALL iom_init( crxios_context, ld_tmppatch = .false. ) 
     221             CALL iom_init( crxios_context ) 
    232222             IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS for AGRIF' 
    233223             lxios_set = .TRUE. 
     
    238228 
    239229 
    240    SUBROUTINE rst_read 
     230   SUBROUTINE rst_read( Kbb, Kmm ) 
    241231      !!----------------------------------------------------------------------  
    242232      !!                   ***  ROUTINE rst_read  *** 
     
    246236      !! ** Method  :   Read in restart.nc file fields which are necessary for restart 
    247237      !!---------------------------------------------------------------------- 
     238      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
    248239      REAL(wp) ::   zrdt 
    249240      INTEGER  ::   jk 
     
    259250         IF(lrxios) CALL iom_swap( TRIM(cxios_context) ) 
    260251         IF( zrdt /= rdt )   neuler = 0 
     252         IF( zrdt /= rn_Dt ) THEN 
     253            IF(lwp) WRITE( numout,*) 
     254            IF(lwp) WRITE( numout,*) 'rst_read:  rdt not equal to the read one' 
     255            IF(lwp) WRITE( numout,*) 
     256            IF(lwp) WRITE( numout,*) '      ==>>>   forced euler first time-step' 
     257            l_1st_euler =  .TRUE. 
     258         ENDIF 
    261259      ENDIF 
    262260 
     
    265263      ! Diurnal DSST  
    266264      IF(lrxios) CALL iom_swap( TRIM(crxios_context) ) 
    267       IF( ln_diurnal ) CALL iom_get( numror, jpdom_autoglo, 'Dsst' , x_dsst, ldxios = lrxios )  
     265      IF( ln_diurnal ) CALL iom_get( numror, jpdom_auto, 'Dsst' , x_dsst, ldxios = lrxios )  
    268266      IF ( ln_diurnal_only ) THEN  
    269267         IF(lwp) WRITE( numout, * ) & 
    270          &   "rst_read:- ln_diurnal_only set, setting rhop=rau0"  
    271          rhop = rau0 
    272          CALL iom_get( numror, jpdom_autoglo, 'tn'     , w3d, ldxios = lrxios )  
    273          tsn(:,:,1,jp_tem) = w3d(:,:,1) 
     268         &   "rst_read:- ln_diurnal_only set, setting rhop=rho0"  
     269         rhop = rho0 
     270         CALL iom_get( numror, jpdom_auto, 'tn'     , w3d, ldxios = lrxios )  
     271         ts(:,:,1,jp_tem,Kmm) = w3d(:,:,1) 
    274272         RETURN  
    275273      ENDIF   
    276274       
    277275      IF( iom_varid( numror, 'ub', ldstop = .FALSE. ) > 0 ) THEN 
    278          CALL iom_get( numror, jpdom_autoglo, 'ub'     , ub, ldxios = lrxios                )   ! before fields 
    279          CALL iom_get( numror, jpdom_autoglo, 'vb'     , vb, ldxios = lrxios                ) 
    280          CALL iom_get( numror, jpdom_autoglo, 'tb'     , tsb(:,:,:,jp_tem), ldxios = lrxios ) 
    281          CALL iom_get( numror, jpdom_autoglo, 'sb'     , tsb(:,:,:,jp_sal), ldxios = lrxios ) 
    282          CALL iom_get( numror, jpdom_autoglo, 'sshb'   , sshb, ldxios = lrxios              ) 
     276         ! before fields 
     277         CALL iom_get( numror, jpdom_auto, 'ub'     , uu(:,:,:       ,Kbb), ldxios = lrxios, cd_type = 'U', psgn = -1._wp ) 
     278         CALL iom_get( numror, jpdom_auto, 'vb'     , vv(:,:,:       ,Kbb), ldxios = lrxios, cd_type = 'V', psgn = -1._wp ) 
     279         CALL iom_get( numror, jpdom_auto, 'tb'     , ts(:,:,:,jp_tem,Kbb), ldxios = lrxios ) 
     280         CALL iom_get( numror, jpdom_auto, 'sb'     , ts(:,:,:,jp_sal,Kbb), ldxios = lrxios ) 
     281         CALL iom_get( numror, jpdom_auto, 'sshb'   ,ssh(:,:         ,Kbb), ldxios = lrxios ) 
    283282      ELSE 
    284          neuler = 0 
    285       ENDIF 
    286       ! 
    287       CALL iom_get( numror, jpdom_autoglo, 'un'     , un, ldxios = lrxios )   ! now    fields 
    288       CALL iom_get( numror, jpdom_autoglo, 'vn'     , vn, ldxios = lrxios ) 
    289       CALL iom_get( numror, jpdom_autoglo, 'tn'     , tsn(:,:,:,jp_tem), ldxios = lrxios ) 
    290       CALL iom_get( numror, jpdom_autoglo, 'sn'     , tsn(:,:,:,jp_sal), ldxios = lrxios ) 
    291       CALL iom_get( numror, jpdom_autoglo, 'sshn'   , sshn, ldxios = lrxios ) 
     283         l_1st_euler =  .TRUE.      ! before field not found, forced euler 1st time-step 
     284      ENDIF 
     285      ! 
     286      ! now fields 
     287      CALL iom_get( numror, jpdom_auto, 'un'     , uu(:,:,:       ,Kmm), ldxios = lrxios, cd_type = 'U', psgn = -1._wp ) 
     288      CALL iom_get( numror, jpdom_auto, 'vn'     , vv(:,:,:       ,Kmm), ldxios = lrxios, cd_type = 'V', psgn = -1._wp ) 
     289      CALL iom_get( numror, jpdom_auto, 'tn'     , ts(:,:,:,jp_tem,Kmm), ldxios = lrxios ) 
     290      CALL iom_get( numror, jpdom_auto, 'sn'     , ts(:,:,:,jp_sal,Kmm), ldxios = lrxios ) 
     291      CALL iom_get( numror, jpdom_auto, 'sshn'   ,ssh(:,:         ,Kmm), ldxios = lrxios ) 
    292292      IF( iom_varid( numror, 'rhop', ldstop = .FALSE. ) > 0 ) THEN 
    293          CALL iom_get( numror, jpdom_autoglo, 'rhop'   , rhop, ldxios = lrxios )   ! now    potential density 
     293         CALL iom_get( numror, jpdom_auto, 'rhop'   , rhop, ldxios = lrxios )   ! now    potential density 
    294294      ELSE 
    295          CALL eos( tsn, rhd, rhop, gdept_n(:,:,:) )    
     295         CALL eos( ts(:,:,:,:,Kmm), rhd, rhop, gdept(:,:,:,Kmm) )    
    296296      ENDIF 
    297297      IF(lrxios) CALL iom_swap( TRIM(cxios_context) ) 
    298298      ! 
    299       IF( neuler == 0 ) THEN                                  ! Euler restart (neuler=0) 
    300          tsb  (:,:,:,:) = tsn  (:,:,:,:)                             ! all before fields set to now values 
    301          ub   (:,:,:)   = un   (:,:,:) 
    302          vb   (:,:,:)   = vn   (:,:,:) 
    303          sshb (:,:)     = sshn (:,:) 
    304          ! 
    305          IF( .NOT.ln_linssh ) THEN 
    306             DO jk = 1, jpk 
    307                e3t_b(:,:,jk) = e3t_n(:,:,jk) 
    308             END DO 
    309          ENDIF 
    310          ! 
     299      IF( l_1st_euler ) THEN                                  ! Euler restart  
     300         ts   (:,:,:,:,Kbb) = ts   (:,:,:,:,Kmm)              ! all before fields set to now values 
     301         uu   (:,:,:  ,Kbb) = uu   (:,:,:  ,Kmm) 
     302         vv   (:,:,:  ,Kbb) = vv   (:,:,:  ,Kmm) 
     303         ssh  (:,:    ,Kbb) = ssh  (:,:    ,Kmm) 
    311304      ENDIF 
    312305      ! 
Note: See TracChangeset for help on using the changeset viewer.