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/DYN – 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:
1 deleted
18 edited
2 copied

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/DYN/divhor.F90

    r10425 r13463  
    2020   USE oce             ! ocean dynamics and tracers 
    2121   USE dom_oce         ! ocean space and time domain 
    22    USE sbc_oce, ONLY : ln_rnf, ln_isf ! surface boundary condition: ocean 
    23    USE sbcrnf          ! river runoff  
    24    USE sbcisf          ! ice shelf 
    25    USE iscplhsb        ! ice sheet / ocean coupling 
    26    USE iscplini        ! ice sheet / ocean coupling 
     22   USE sbc_oce, ONLY : ln_rnf      ! river runoff 
     23   USE sbcrnf , ONLY : sbc_rnf_div ! river runoff  
     24   USE isf_oce, ONLY : ln_isf      ! ice shelf 
     25   USE isfhdiv, ONLY : isf_hdiv    ! ice shelf 
    2726#if defined key_asminc    
    2827   USE asminc          ! Assimilation increment 
     
    4039 
    4140   !! * Substitutions 
    42 #  include "vectopt_loop_substitute.h90" 
     41#  include "do_loop_substitute.h90" 
     42#  include "domzgr_substitute.h90" 
    4343   !!---------------------------------------------------------------------- 
    4444   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4848CONTAINS 
    4949 
    50    SUBROUTINE div_hor( kt ) 
     50   SUBROUTINE div_hor( kt, Kbb, Kmm ) 
    5151      !!---------------------------------------------------------------------- 
    5252      !!                  ***  ROUTINE div_hor  *** 
     
    5555      !! 
    5656      !! ** Method  :   the now divergence is computed as : 
    57       !!         hdivn = 1/(e1e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] ) 
     57      !!         hdiv = 1/(e1e2t*e3t) ( di[e2u*e3u un] + dj[e1v*e3v vn] ) 
    5858      !!      and correct with runoff inflow (div_rnf) and cross land flow (div_cla)  
    5959      !! 
    60       !! ** Action  : - update hdivn, the now horizontal divergence 
     60      !! ** Action  : - update hdiv, the now horizontal divergence 
    6161      !!---------------------------------------------------------------------- 
    62       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     62      INTEGER, INTENT(in) ::   kt        ! ocean time-step index 
     63      INTEGER, INTENT(in) ::   Kbb, Kmm  ! ocean time level indices 
    6364      ! 
    6465      INTEGER  ::   ji, jj, jk    ! dummy loop indices 
    6566      REAL(wp) ::   zraur, zdep   ! local scalars 
     67      REAL(wp), DIMENSION(jpi,jpj) :: ztmp 
    6668      !!---------------------------------------------------------------------- 
    6769      ! 
     
    7274         IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence ' 
    7375         IF(lwp) WRITE(numout,*) '~~~~~~~   ' 
     76         hdiv(:,:,:) = 0._wp    ! initialize hdiv for the halos at the first time step 
    7477      ENDIF 
    7578      ! 
    76       DO jk = 1, jpkm1                                      !==  Horizontal divergence  ==! 
    77          DO jj = 2, jpjm1 
    78             DO ji = fs_2, fs_jpim1   ! vector opt. 
    79                hdivn(ji,jj,jk) = (  e2u(ji  ,jj) * e3u_n(ji  ,jj,jk) * un(ji  ,jj,jk)      & 
    80                   &               - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * un(ji-1,jj,jk)      & 
    81                   &               + e1v(ji,jj  ) * e3v_n(ji,jj  ,jk) * vn(ji,jj  ,jk)      & 
    82                   &               - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vn(ji,jj-1,jk)  )   & 
    83                   &            * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk) 
    84             END DO   
    85          END DO   
    86       END DO 
    87 #if defined key_agrif 
    88       IF( .NOT. Agrif_Root() ) THEN 
    89          IF( nbondi == -1 .OR. nbondi == 2 )   hdivn(   2   ,  :   ,:) = 0._wp      ! west 
    90          IF( nbondi ==  1 .OR. nbondi == 2 )   hdivn( nlci-1,  :   ,:) = 0._wp      ! east 
    91          IF( nbondj == -1 .OR. nbondj == 2 )   hdivn(   :   ,  2   ,:) = 0._wp      ! south 
    92          IF( nbondj ==  1 .OR. nbondj == 2 )   hdivn(   :   ,nlcj-1,:) = 0._wp      ! north 
    93       ENDIF 
     79      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     80         hdiv(ji,jj,jk) = (  e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm) * uu(ji  ,jj,jk,Kmm)      & 
     81            &               - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * uu(ji-1,jj,jk,Kmm)      & 
     82            &               + e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm) * vv(ji,jj  ,jk,Kmm)      & 
     83            &               - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vv(ji,jj-1,jk,Kmm)  )   & 
     84            &            * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
     85      END_3D 
     86      ! 
     87      IF( ln_rnf )   CALL sbc_rnf_div( hdiv, Kmm )                     !==  runoffs    ==!   (update hdiv field) 
     88      ! 
     89#if defined key_asminc  
     90      IF( ln_sshinc .AND. ln_asmiau )   CALL ssh_asm_div( kt, Kbb, Kmm, hdiv )   !==  SSH assimilation  ==!   (update hdiv field) 
     91      !  
    9492#endif 
    9593      ! 
    96       IF( ln_rnf )   CALL sbc_rnf_div( hdivn )              !==  runoffs    ==!   (update hdivn field) 
     94      IF( ln_isf )                      CALL isf_hdiv( kt, Kmm, hdiv )           !==  ice shelf         ==!   (update hdiv field) 
    9795      ! 
    98 #if defined key_asminc  
    99       IF( ln_sshinc .AND. ln_asmiau )   CALL ssh_asm_div( kt, hdivn )   !==  SSH assimilation  ==!   (update hdivn field) 
    100       !  
    101 #endif 
    102       IF( ln_isf )   CALL sbc_isf_div( hdivn )      !==  ice shelf  ==!   (update hdivn field) 
    103       ! 
    104       IF( ln_iscpl .AND. ln_hsb )   CALL iscpl_div( hdivn ) !==  ice sheet  ==!   (update hdivn field) 
    105       ! 
    106       CALL lbc_lnk( 'divhor', hdivn, 'T', 1. )   !   (no sign change) 
     96      CALL lbc_lnk( 'divhor', hdiv, 'T', 1.0_wp )   !   (no sign change) 
    10797      ! 
    10898      IF( ln_timing )   CALL timing_stop('div_hor') 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynadv.F90

    r10068 r13463  
    4444   INTEGER, PUBLIC, PARAMETER ::   np_FLX_ubs = 3   ! flux   form : 3rd order Upstream Biased Scheme 
    4545 
    46    !! * Substitutions 
    47 #  include "vectopt_loop_substitute.h90" 
    4846   !!---------------------------------------------------------------------- 
    4947   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    5351CONTAINS 
    5452 
    55    SUBROUTINE dyn_adv( kt ) 
     53   SUBROUTINE dyn_adv( kt, Kbb, Kmm, puu, pvv, Krhs ) 
    5654      !!--------------------------------------------------------------------- 
    5755      !!                  ***  ROUTINE dyn_adv  *** 
     
    5957      !! ** Purpose :   compute the ocean momentum advection trend. 
    6058      !! 
    61       !! ** Method  : - Update (ua,va) with the advection term following n_dynadv 
     59      !! ** Method  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the advection term following n_dynadv 
    6260      !! 
    6361      !!      NB: in flux form advection (ln_dynadv_cen2 or ln_dynadv_ubs=T)  
     
    6664      !!      (see dynvor module). 
    6765      !!---------------------------------------------------------------------- 
    68       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     66      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index 
     67      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices 
     68      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation 
    6969      !!---------------------------------------------------------------------- 
    7070      ! 
     
    7373      SELECT CASE( n_dynadv )    !==  compute advection trend and add it to general trend  ==! 
    7474      CASE( np_VEC_c2  )      
    75          CALL dyn_keg     ( kt, nn_dynkeg )    ! vector form : horizontal gradient of kinetic energy 
    76          CALL dyn_zad     ( kt )               ! vector form : vertical advection 
     75         CALL dyn_keg     ( kt, nn_dynkeg,      Kmm, puu, pvv, Krhs )    ! vector form : horizontal gradient of kinetic energy 
     76         CALL dyn_zad     ( kt,                 Kmm, puu, pvv, Krhs )    ! vector form : vertical advection 
    7777      CASE( np_FLX_c2  )  
    78          CALL dyn_adv_cen2( kt )               ! 2nd order centered scheme 
     78         CALL dyn_adv_cen2( kt,                 Kmm, puu, pvv, Krhs )    ! 2nd order centered scheme 
    7979      CASE( np_FLX_ubs )    
    80          CALL dyn_adv_ubs ( kt )               ! 3rd order UBS      scheme (UP3) 
     80         CALL dyn_adv_ubs ( kt,            Kbb, Kmm, puu, pvv, Krhs )    ! 3rd order UBS      scheme (UP3) 
    8181      END SELECT 
    8282      ! 
     
    104104      ENDIF 
    105105      ! 
    106       REWIND( numnam_ref )              ! Namelist namdyn_adv in reference namelist : Momentum advection scheme 
    107106      READ  ( numnam_ref, namdyn_adv, IOSTAT = ios, ERR = 901) 
    108 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_adv in reference namelist', lwp ) 
    109       REWIND( numnam_cfg )              ! Namelist namdyn_adv in configuration namelist : Momentum advection scheme 
     107901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_adv in reference namelist' ) 
    110108      READ  ( numnam_cfg, namdyn_adv, IOSTAT = ios, ERR = 902 ) 
    111 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_adv in configuration namelist', lwp ) 
     109902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_adv in configuration namelist' ) 
    112110      IF(lwm) WRITE ( numond, namdyn_adv ) 
    113111 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynadv_cen2.F90

    r10068 r13463  
    2727 
    2828   !! * Substitutions 
    29 #  include "vectopt_loop_substitute.h90" 
     29#  include "do_loop_substitute.h90" 
     30#  include "domzgr_substitute.h90" 
    3031   !!---------------------------------------------------------------------- 
    3132   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    3536CONTAINS 
    3637 
    37    SUBROUTINE dyn_adv_cen2( kt ) 
     38   SUBROUTINE dyn_adv_cen2( kt, Kmm, puu, pvv, Krhs ) 
    3839      !!---------------------------------------------------------------------- 
    3940      !!                  ***  ROUTINE dyn_adv_cen2  *** 
     
    4445      !! ** Method  :   Trend evaluated using now fields (centered in time)  
    4546      !! 
    46       !! ** Action  :   (ua,va) updated with the now vorticity term trend 
     47      !! ** Action  :   (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the now vorticity term trend 
    4748      !!---------------------------------------------------------------------- 
    48       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     49      INTEGER                             , INTENT( in )  ::  kt           ! ocean time-step index 
     50      INTEGER                             , INTENT( in )  ::  Kmm, Krhs    ! ocean time level indices 
     51      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv     ! ocean velocities and RHS of momentum equation 
    4952      ! 
    5053      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    6063      ! 
    6164      IF( l_trddyn ) THEN           ! trends: store the input trends 
    62          zfu_uw(:,:,:) = ua(:,:,:) 
    63          zfv_vw(:,:,:) = va(:,:,:) 
     65         zfu_uw(:,:,:) = puu(:,:,:,Krhs) 
     66         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) 
    6467      ENDIF 
    6568      ! 
     
    6770      ! 
    6871      DO jk = 1, jpkm1                    ! horizontal transport 
    69          zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 
    70          zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
    71          DO jj = 1, jpjm1                 ! horizontal momentum fluxes (at T- and F-point) 
    72             DO ji = 1, fs_jpim1   ! vector opt. 
    73                zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji+1,jj  ,jk) ) 
    74                zfv_f(ji  ,jj  ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji  ,jj+1,jk) ) 
    75                zfu_f(ji  ,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji+1,jj  ,jk) ) 
    76                zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji  ,jj+1,jk) ) 
    77             END DO 
    78          END DO 
    79          DO jj = 2, jpjm1                 ! divergence of horizontal momentum fluxes 
    80             DO ji = fs_2, fs_jpim1   ! vector opt. 
    81                ua(ji,jj,jk) = ua(ji,jj,jk) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    & 
    82                   &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    83                va(ji,jj,jk) = va(ji,jj,jk) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    & 
    84                   &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    85             END DO 
    86          END DO 
     72         zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 
     73         zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 
     74         DO_2D( 1, 0, 1, 0 ) 
     75            zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) ) 
     76            zfv_f(ji  ,jj  ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) 
     77            zfu_f(ji  ,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) 
     78            zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji  ,jj+1,jk,Kmm) ) 
     79         END_2D 
     80         DO_2D( 0, 0, 0, 0 ) 
     81            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    & 
     82               &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj)   & 
     83               &                           / e3u(ji,jj,jk,Kmm) 
     84            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    & 
     85               &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj)   & 
     86               &                           / e3v(ji,jj,jk,Kmm) 
     87         END_2D 
    8788      END DO 
    8889      ! 
    8990      IF( l_trddyn ) THEN           ! trends: send trend to trddyn for diagnostic 
    90          zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:) 
    91          zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:) 
    92          CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt ) 
    93          zfu_t(:,:,:) = ua(:,:,:) 
    94          zfv_t(:,:,:) = va(:,:,:) 
     91         zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:) 
     92         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:) 
     93         CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm ) 
     94         zfu_t(:,:,:) = puu(:,:,:,Krhs) 
     95         zfv_t(:,:,:) = pvv(:,:,:,Krhs) 
    9596      ENDIF 
    9697      ! 
    9798      !                             !==  Vertical advection  ==! 
    9899      ! 
    99       DO jj = 2, jpjm1                    ! surface/bottom advective fluxes set to zero 
    100          DO ji = fs_2, fs_jpim1 
    101             zfu_uw(ji,jj,jpk) = 0._wp   ;   zfv_vw(ji,jj,jpk) = 0._wp 
    102             zfu_uw(ji,jj, 1 ) = 0._wp   ;   zfv_vw(ji,jj, 1 ) = 0._wp 
    103          END DO 
    104       END DO 
     100      DO_2D( 0, 0, 0, 0 ) 
     101         zfu_uw(ji,jj,jpk) = 0._wp   ;   zfv_vw(ji,jj,jpk) = 0._wp 
     102         zfu_uw(ji,jj, 1 ) = 0._wp   ;   zfv_vw(ji,jj, 1 ) = 0._wp 
     103      END_2D 
    105104      IF( ln_linssh ) THEN                ! linear free surface: advection through the surface 
    106          DO jj = 2, jpjm1 
    107             DO ji = fs_2, fs_jpim1 
    108                zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji+1,jj) * wn(ji+1,jj,1) ) * un(ji,jj,1) 
    109                zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji,jj+1) * wn(ji,jj+1,1) ) * vn(ji,jj,1) 
    110             END DO 
    111          END DO 
     105         DO_2D( 0, 0, 0, 0 ) 
     106            zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * puu(ji,jj,1,Kmm) 
     107            zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm) 
     108         END_2D 
    112109      ENDIF 
    113110      DO jk = 2, jpkm1                    ! interior advective fluxes 
    114          DO jj = 2, jpj                       ! 1/4 * Vertical transport 
    115             DO ji = 2, jpi 
    116                zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
    117             END DO 
    118          END DO 
    119          DO jj = 2, jpjm1 
    120             DO ji = fs_2, fs_jpim1   ! vector opt. 
    121                zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj  ,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 
    122                zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji  ,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 
    123             END DO 
    124          END DO 
     111         DO_2D( 0, 1, 0, 1 ) 
     112            zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 
     113         END_2D 
     114         DO_2D( 0, 0, 0, 0 ) 
     115            zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj  ,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) ) 
     116            zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji  ,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) ) 
     117         END_2D 
    125118      END DO 
    126       DO jk = 1, jpkm1                    ! divergence of vertical momentum flux divergence 
    127          DO jj = 2, jpjm1  
    128             DO ji = fs_2, fs_jpim1   ! vector opt. 
    129                ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    130                va(ji,jj,jk) = va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    131             END DO 
    132          END DO 
    133       END DO 
     119      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     120         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   & 
     121            &                                      / e3u(ji,jj,jk,Kmm) 
     122         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   & 
     123            &                                      / e3v(ji,jj,jk,Kmm) 
     124      END_3D 
    134125      ! 
    135126      IF( l_trddyn ) THEN                 ! trends: send trend to trddyn for diagnostic 
    136          zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:) 
    137          zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:) 
    138          CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt ) 
     127         zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:) 
     128         zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:) 
     129         CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm ) 
    139130      ENDIF 
    140131      !                                   ! Control print 
    141       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' cen2 adv - Ua: ', mask1=umask,   & 
    142          &                       tab3d_2=va, clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     132      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' cen2 adv - Ua: ', mask1=umask,   & 
     133         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    143134      ! 
    144135   END SUBROUTINE dyn_adv_cen2 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynadv_ubs.F90

    r10425 r13463  
    3333 
    3434   !! * Substitutions 
    35 #  include "vectopt_loop_substitute.h90" 
     35#  include "do_loop_substitute.h90" 
     36#  include "domzgr_substitute.h90" 
    3637   !!---------------------------------------------------------------------- 
    3738   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4142CONTAINS 
    4243 
    43    SUBROUTINE dyn_adv_ubs( kt ) 
     44   SUBROUTINE dyn_adv_ubs( kt, Kbb, Kmm, puu, pvv, Krhs ) 
    4445      !!---------------------------------------------------------------------- 
    4546      !!                  ***  ROUTINE dyn_adv_ubs  *** 
     
    6465      !!      gamma1=1/3 and gamma2=1/32. 
    6566      !! 
    66       !! ** Action : - (ua,va) updated with the 3D advective momentum trends 
     67      !! ** Action : - (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the 3D advective momentum trends 
    6768      !! 
    6869      !! Reference : Shchepetkin & McWilliams, 2005, Ocean Modelling.  
    6970      !!---------------------------------------------------------------------- 
    70       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     71      INTEGER                             , INTENT( in )  ::  kt              ! ocean time-step index 
     72      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs  ! ocean time level indices 
     73      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv        ! ocean velocities and RHS of momentum equation 
    7174      ! 
    7275      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    9598      ! 
    9699      IF( l_trddyn ) THEN           ! trends: store the input trends 
    97          zfu_uw(:,:,:) = ua(:,:,:) 
    98          zfv_vw(:,:,:) = va(:,:,:) 
     100         zfu_uw(:,:,:) = puu(:,:,:,Krhs) 
     101         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) 
    99102      ENDIF 
    100103      !                                      ! =========================== ! 
     
    102105         !                                   ! =========================== ! 
    103106         !                                         ! horizontal volume fluxes 
    104          zfu(:,:,jk) = e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 
    105          zfv(:,:,jk) = e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
     107         zfu(:,:,jk) = e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 
     108         zfv(:,:,jk) = e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 
    106109         !             
    107          DO jj = 2, jpjm1                          ! laplacian 
    108             DO ji = fs_2, fs_jpim1   ! vector opt. 
    109                zlu_uu(ji,jj,jk,1) = ( ub (ji+1,jj  ,jk) - 2.*ub (ji,jj,jk) + ub (ji-1,jj  ,jk) ) * umask(ji,jj,jk) 
    110                zlv_vv(ji,jj,jk,1) = ( vb (ji  ,jj+1,jk) - 2.*vb (ji,jj,jk) + vb (ji  ,jj-1,jk) ) * vmask(ji,jj,jk) 
    111                zlu_uv(ji,jj,jk,1) = ( ub (ji  ,jj+1,jk) - ub (ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
    112                   &               - ( ub (ji  ,jj  ,jk) - ub (ji  ,jj-1,jk) ) * fmask(ji  ,jj-1,jk) 
    113                zlv_vu(ji,jj,jk,1) = ( vb (ji+1,jj  ,jk) - vb (ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
    114                   &               - ( vb (ji  ,jj  ,jk) - vb (ji-1,jj  ,jk) ) * fmask(ji-1,jj  ,jk) 
    115                ! 
    116                zlu_uu(ji,jj,jk,2) = ( zfu(ji+1,jj  ,jk) - 2.*zfu(ji,jj,jk) + zfu(ji-1,jj  ,jk) ) * umask(ji,jj,jk) 
    117                zlv_vv(ji,jj,jk,2) = ( zfv(ji  ,jj+1,jk) - 2.*zfv(ji,jj,jk) + zfv(ji  ,jj-1,jk) ) * vmask(ji,jj,jk) 
    118                zlu_uv(ji,jj,jk,2) = ( zfu(ji  ,jj+1,jk) - zfu(ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
    119                   &               - ( zfu(ji  ,jj  ,jk) - zfu(ji  ,jj-1,jk) ) * fmask(ji  ,jj-1,jk) 
    120                zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj  ,jk) - zfv(ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
    121                   &               - ( zfv(ji  ,jj  ,jk) - zfv(ji-1,jj  ,jk) ) * fmask(ji-1,jj  ,jk) 
    122             END DO 
    123          END DO 
     110         DO_2D( 0, 0, 0, 0 ) 
     111            zlu_uu(ji,jj,jk,1) = ( puu (ji+1,jj  ,jk,Kbb) - 2.*puu (ji,jj,jk,Kbb) + puu (ji-1,jj  ,jk,Kbb) ) * umask(ji,jj,jk) 
     112            zlv_vv(ji,jj,jk,1) = ( pvv (ji  ,jj+1,jk,Kbb) - 2.*pvv (ji,jj,jk,Kbb) + pvv (ji  ,jj-1,jk,Kbb) ) * vmask(ji,jj,jk) 
     113            zlu_uv(ji,jj,jk,1) = ( puu (ji  ,jj+1,jk,Kbb) - puu (ji  ,jj  ,jk,Kbb) ) * fmask(ji  ,jj  ,jk)   & 
     114               &               - ( puu (ji  ,jj  ,jk,Kbb) - puu (ji  ,jj-1,jk,Kbb) ) * fmask(ji  ,jj-1,jk) 
     115            zlv_vu(ji,jj,jk,1) = ( pvv (ji+1,jj  ,jk,Kbb) - pvv (ji  ,jj  ,jk,Kbb) ) * fmask(ji  ,jj  ,jk)   & 
     116               &               - ( pvv (ji  ,jj  ,jk,Kbb) - pvv (ji-1,jj  ,jk,Kbb) ) * fmask(ji-1,jj  ,jk) 
     117            ! 
     118            zlu_uu(ji,jj,jk,2) = ( zfu(ji+1,jj  ,jk) - 2.*zfu(ji,jj,jk) + zfu(ji-1,jj  ,jk) ) * umask(ji,jj,jk) 
     119            zlv_vv(ji,jj,jk,2) = ( zfv(ji  ,jj+1,jk) - 2.*zfv(ji,jj,jk) + zfv(ji  ,jj-1,jk) ) * vmask(ji,jj,jk) 
     120            zlu_uv(ji,jj,jk,2) = ( zfu(ji  ,jj+1,jk) - zfu(ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
     121               &               - ( zfu(ji  ,jj  ,jk) - zfu(ji  ,jj-1,jk) ) * fmask(ji  ,jj-1,jk) 
     122            zlv_vu(ji,jj,jk,2) = ( zfv(ji+1,jj  ,jk) - zfv(ji  ,jj  ,jk) ) * fmask(ji  ,jj  ,jk)   & 
     123               &               - ( zfv(ji  ,jj  ,jk) - zfv(ji-1,jj  ,jk) ) * fmask(ji-1,jj  ,jk) 
     124         END_2D 
    124125      END DO 
    125       CALL lbc_lnk_multi( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', 1. , zlu_uv(:,:,:,1), 'U', 1.,  & 
    126                       &   zlu_uu(:,:,:,2), 'U', 1. , zlu_uv(:,:,:,2), 'U', 1.,  &  
    127                       &   zlv_vv(:,:,:,1), 'V', 1. , zlv_vu(:,:,:,1), 'V', 1.,  & 
    128                       &   zlv_vv(:,:,:,2), 'V', 1. , zlv_vu(:,:,:,2), 'V', 1.   ) 
     126      CALL lbc_lnk_multi( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', 1.0_wp , zlu_uv(:,:,:,1), 'U', 1.0_wp,  & 
     127                      &   zlu_uu(:,:,:,2), 'U', 1.0_wp , zlu_uv(:,:,:,2), 'U', 1.0_wp,  &  
     128                      &   zlv_vv(:,:,:,1), 'V', 1.0_wp , zlv_vu(:,:,:,1), 'V', 1.0_wp,  & 
     129                      &   zlv_vv(:,:,:,2), 'V', 1.0_wp , zlv_vu(:,:,:,2), 'V', 1.0_wp   ) 
    129130      ! 
    130131      !                                      ! ====================== ! 
     
    132133      DO jk = 1, jpkm1                       ! ====================== ! 
    133134         !                                         ! horizontal volume fluxes 
    134          zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 
    135          zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
     135         zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 
     136         zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 
    136137         ! 
    137          DO jj = 1, jpjm1                          ! horizontal momentum fluxes at T- and F-point 
    138             DO ji = 1, fs_jpim1   ! vector opt. 
    139                zui = ( un(ji,jj,jk) + un(ji+1,jj  ,jk) ) 
    140                zvj = ( vn(ji,jj,jk) + vn(ji  ,jj+1,jk) ) 
    141                ! 
    142                IF( zui > 0 ) THEN   ;   zl_u = zlu_uu(ji  ,jj,jk,1) 
    143                ELSE                 ;   zl_u = zlu_uu(ji+1,jj,jk,1) 
    144                ENDIF 
    145                IF( zvj > 0 ) THEN   ;   zl_v = zlv_vv(ji,jj  ,jk,1) 
    146                ELSE                 ;   zl_v = zlv_vv(ji,jj+1,jk,1) 
    147                ENDIF 
    148                ! 
    149                zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj  ,jk)                               & 
    150                   &                    - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj  ,jk,2) )  )   & 
    151                   &                * ( zui - gamma1 * zl_u) 
    152                zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji  ,jj+1,jk)                               & 
    153                   &                    - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji  ,jj+1,jk,2) )  )   & 
    154                   &                * ( zvj - gamma1 * zl_v) 
    155                ! 
    156                zfuj = ( zfu(ji,jj,jk) + zfu(ji  ,jj+1,jk) ) 
    157                zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj  ,jk) ) 
    158                IF( zfuj > 0 ) THEN   ;    zl_v = zlv_vu( ji  ,jj  ,jk,1) 
    159                ELSE                  ;    zl_v = zlv_vu( ji+1,jj,jk,1) 
    160                ENDIF 
    161                IF( zfvi > 0 ) THEN   ;    zl_u = zlu_uv( ji,jj  ,jk,1) 
    162                ELSE                  ;    zl_u = zlu_uv( ji,jj+1,jk,1) 
    163                ENDIF 
    164                ! 
    165                zfv_f(ji  ,jj  ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj  ,jk,2) )  )   & 
    166                   &                * ( un(ji,jj,jk) + un(ji  ,jj+1,jk) - gamma1 * zl_u ) 
    167                zfu_f(ji  ,jj  ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji  ,jj+1,jk,2) )  )   & 
    168                   &                * ( vn(ji,jj,jk) + vn(ji+1,jj  ,jk) - gamma1 * zl_v ) 
    169             END DO 
    170          END DO 
    171          DO jj = 2, jpjm1                          ! divergence of horizontal momentum fluxes 
    172             DO ji = fs_2, fs_jpim1   ! vector opt. 
    173                ua(ji,jj,jk) = ua(ji,jj,jk) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    & 
    174                   &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    175                va(ji,jj,jk) = va(ji,jj,jk) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    & 
    176                   &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    177             END DO 
    178          END DO 
     138         DO_2D( 1, 0, 1, 0 ) 
     139            zui = ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj  ,jk,Kmm) ) 
     140            zvj = ( pvv(ji,jj,jk,Kmm) + pvv(ji  ,jj+1,jk,Kmm) ) 
     141            ! 
     142            IF( zui > 0 ) THEN   ;   zl_u = zlu_uu(ji  ,jj,jk,1) 
     143            ELSE                 ;   zl_u = zlu_uu(ji+1,jj,jk,1) 
     144            ENDIF 
     145            IF( zvj > 0 ) THEN   ;   zl_v = zlv_vv(ji,jj  ,jk,1) 
     146            ELSE                 ;   zl_v = zlv_vv(ji,jj+1,jk,1) 
     147            ENDIF 
     148            ! 
     149            zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj  ,jk)                               & 
     150               &                    - gamma2 * ( zlu_uu(ji,jj,jk,2) + zlu_uu(ji+1,jj  ,jk,2) )  )   & 
     151               &                * ( zui - gamma1 * zl_u) 
     152            zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji  ,jj+1,jk)                               & 
     153               &                    - gamma2 * ( zlv_vv(ji,jj,jk,2) + zlv_vv(ji  ,jj+1,jk,2) )  )   & 
     154               &                * ( zvj - gamma1 * zl_v) 
     155            ! 
     156            zfuj = ( zfu(ji,jj,jk) + zfu(ji  ,jj+1,jk) ) 
     157            zfvi = ( zfv(ji,jj,jk) + zfv(ji+1,jj  ,jk) ) 
     158            IF( zfuj > 0 ) THEN   ;    zl_v = zlv_vu( ji  ,jj  ,jk,1) 
     159            ELSE                  ;    zl_v = zlv_vu( ji+1,jj,jk,1) 
     160            ENDIF 
     161            IF( zfvi > 0 ) THEN   ;    zl_u = zlu_uv( ji,jj  ,jk,1) 
     162            ELSE                  ;    zl_u = zlu_uv( ji,jj+1,jk,1) 
     163            ENDIF 
     164            ! 
     165            zfv_f(ji  ,jj  ,jk) = ( zfvi - gamma2 * ( zlv_vu(ji,jj,jk,2) + zlv_vu(ji+1,jj  ,jk,2) )  )   & 
     166               &                * ( puu(ji,jj,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) - gamma1 * zl_u ) 
     167            zfu_f(ji  ,jj  ,jk) = ( zfuj - gamma2 * ( zlu_uv(ji,jj,jk,2) + zlu_uv(ji  ,jj+1,jk,2) )  )   & 
     168               &                * ( pvv(ji,jj,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) - gamma1 * zl_v ) 
     169         END_2D 
     170         DO_2D( 0, 0, 0, 0 ) 
     171            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    & 
     172               &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) * r1_e1e2u(ji,jj)   & 
     173               &                           / e3u(ji,jj,jk,Kmm) 
     174            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    & 
     175               &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) * r1_e1e2v(ji,jj)   & 
     176               &                           / e3v(ji,jj,jk,Kmm) 
     177         END_2D 
    179178      END DO 
    180179      IF( l_trddyn ) THEN                          ! trends: send trends to trddyn for diagnostic 
    181          zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:) 
    182          zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:) 
    183          CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt ) 
    184          zfu_t(:,:,:) = ua(:,:,:) 
    185          zfv_t(:,:,:) = va(:,:,:) 
     180         zfu_uw(:,:,:) = puu(:,:,:,Krhs) - zfu_uw(:,:,:) 
     181         zfv_vw(:,:,:) = pvv(:,:,:,Krhs) - zfv_vw(:,:,:) 
     182         CALL trd_dyn( zfu_uw, zfv_vw, jpdyn_keg, kt, Kmm ) 
     183         zfu_t(:,:,:) = puu(:,:,:,Krhs) 
     184         zfv_t(:,:,:) = pvv(:,:,:,Krhs) 
    186185      ENDIF 
    187186      !                                      ! ==================== ! 
    188187      !                                      !  Vertical advection  ! 
    189188      !                                      ! ==================== ! 
    190       DO jj = 2, jpjm1                             ! surface/bottom advective fluxes set to zero                   
    191          DO ji = fs_2, fs_jpim1 
    192             zfu_uw(ji,jj,jpk) = 0._wp 
    193             zfv_vw(ji,jj,jpk) = 0._wp 
    194             zfu_uw(ji,jj, 1 ) = 0._wp 
    195             zfv_vw(ji,jj, 1 ) = 0._wp 
    196          END DO 
     189      DO_2D( 0, 0, 0, 0 ) 
     190         zfu_uw(ji,jj,jpk) = 0._wp 
     191         zfv_vw(ji,jj,jpk) = 0._wp 
     192         zfu_uw(ji,jj, 1 ) = 0._wp 
     193         zfv_vw(ji,jj, 1 ) = 0._wp 
     194      END_2D 
     195      IF( ln_linssh ) THEN                         ! constant volume : advection through the surface 
     196         DO_2D( 0, 0, 0, 0 ) 
     197            zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji+1,jj) * ww(ji+1,jj,1) ) * puu(ji,jj,1,Kmm) 
     198            zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * ww(ji,jj,1) + e1e2t(ji,jj+1) * ww(ji,jj+1,1) ) * pvv(ji,jj,1,Kmm) 
     199         END_2D 
     200      ENDIF 
     201      DO jk = 2, jpkm1                          ! interior fluxes 
     202         DO_2D( 0, 1, 0, 1 ) 
     203            zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 
     204         END_2D 
     205         DO_2D( 0, 0, 0, 0 ) 
     206            zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji,jj,jk-1,Kmm) ) 
     207            zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( pvv(ji,jj,jk,Kmm) + pvv(ji,jj,jk-1,Kmm) ) 
     208         END_2D 
    197209      END DO 
    198       IF( ln_linssh ) THEN                         ! constant volume : advection through the surface 
    199          DO jj = 2, jpjm1 
    200             DO ji = fs_2, fs_jpim1 
    201                zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji+1,jj) * wn(ji+1,jj,1) ) * un(ji,jj,1) 
    202                zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji,jj+1) * wn(ji,jj+1,1) ) * vn(ji,jj,1) 
    203             END DO 
    204          END DO 
    205       ENDIF 
    206       DO jk = 2, jpkm1                          ! interior fluxes 
    207          DO jj = 2, jpj 
    208             DO ji = 2, jpi 
    209                zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
    210             END DO 
    211          END DO 
    212          DO jj = 2, jpjm1 
    213             DO ji = fs_2, fs_jpim1   ! vector opt. 
    214                zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 
    215                zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 
    216             END DO 
    217          END DO 
    218       END DO 
    219       DO jk = 1, jpkm1                          ! divergence of vertical momentum flux divergence 
    220          DO jj = 2, jpjm1 
    221             DO ji = fs_2, fs_jpim1   ! vector opt. 
    222                ua(ji,jj,jk) =  ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    223                va(ji,jj,jk) =  va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    224             END DO 
    225          END DO 
    226       END DO 
     210      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     211         puu(ji,jj,jk,Krhs) =  puu(ji,jj,jk,Krhs) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   & 
     212            &                                       / e3u(ji,jj,jk,Kmm) 
     213         pvv(ji,jj,jk,Krhs) =  pvv(ji,jj,jk,Krhs) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   & 
     214            &                                       / e3v(ji,jj,jk,Kmm) 
     215      END_3D 
    227216      ! 
    228217      IF( l_trddyn ) THEN                       ! save the vertical advection trend for diagnostic 
    229          zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:) 
    230          zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:) 
    231          CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt ) 
     218         zfu_t(:,:,:) = puu(:,:,:,Krhs) - zfu_t(:,:,:) 
     219         zfv_t(:,:,:) = pvv(:,:,:,Krhs) - zfv_t(:,:,:) 
     220         CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt, Kmm ) 
    232221      ENDIF 
    233222      !                                         ! Control print 
    234       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' ubs2 adv - Ua: ', mask1=umask,   & 
    235          &                       tab3d_2=va, clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     223      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ubs2 adv - Ua: ', mask1=umask,   & 
     224         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    236225      ! 
    237226   END SUBROUTINE dyn_adv_ubs 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynhpg.F90

    r10491 r13463  
    3131   !!---------------------------------------------------------------------- 
    3232   USE oce             ! ocean dynamics and tracers 
     33   USE isf_oce , ONLY : risfload  ! ice shelf  (risfload variable) 
     34   USE isfload , ONLY : isf_load  ! ice shelf  (isf_load routine ) 
    3335   USE sbc_oce         ! surface variable (only for the flag with ice shelf) 
    3436   USE dom_oce         ! ocean space and time domain 
     
    3739   USE trd_oce         ! trends: ocean variables 
    3840   USE trddyn          ! trend manager: dynamics 
    39 !jc   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
     41   USE zpshde          ! partial step: hor. derivative     (zps_hde routine) 
    4042   ! 
    4143   USE in_out_manager  ! I/O manager 
     
    7375 
    7476   !! * Substitutions 
    75 #  include "vectopt_loop_substitute.h90" 
     77#  include "do_loop_substitute.h90" 
     78#  include "domzgr_substitute.h90" 
     79 
    7680   !!---------------------------------------------------------------------- 
    7781   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    8185CONTAINS 
    8286 
    83    SUBROUTINE dyn_hpg( kt ) 
     87   SUBROUTINE dyn_hpg( kt, Kmm, puu, pvv, Krhs ) 
    8488      !!--------------------------------------------------------------------- 
    8589      !!                  ***  ROUTINE dyn_hpg  *** 
     
    8892      !!              using the scheme defined in the namelist 
    8993      !! 
    90       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     94      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
    9195      !!             - send trends to trd_dyn for futher diagnostics (l_trddyn=T) 
    9296      !!---------------------------------------------------------------------- 
    93       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     97      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     98      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     99      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
     100      ! 
    94101      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
    95102      !!---------------------------------------------------------------------- 
     
    97104      IF( ln_timing )   CALL timing_start('dyn_hpg') 
    98105      ! 
    99       IF( l_trddyn ) THEN                    ! Temporary saving of ua and va trends (l_trddyn) 
     106      IF( l_trddyn ) THEN                    ! Temporary saving of puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends (l_trddyn) 
    100107         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    101          ztrdu(:,:,:) = ua(:,:,:) 
    102          ztrdv(:,:,:) = va(:,:,:) 
     108         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
     109         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    103110      ENDIF 
    104111      ! 
    105112      SELECT CASE ( nhpg )      ! Hydrostatic pressure gradient computation 
    106       CASE ( np_zco )   ;   CALL hpg_zco    ( kt )      ! z-coordinate 
    107       CASE ( np_zps )   ;   CALL hpg_zps    ( kt )      ! z-coordinate plus partial steps (interpolation) 
    108       CASE ( np_sco )   ;   CALL hpg_sco    ( kt )      ! s-coordinate (standard jacobian formulation) 
    109       CASE ( np_djc )   ;   CALL hpg_djc    ( kt )      ! s-coordinate (Density Jacobian with Cubic polynomial) 
    110       CASE ( np_prj )   ;   CALL hpg_prj    ( kt )      ! s-coordinate (Pressure Jacobian scheme) 
    111       CASE ( np_isf )   ;   CALL hpg_isf    ( kt )      ! s-coordinate similar to sco modify for ice shelf 
     113      CASE ( np_zco )   ;   CALL hpg_zco    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate 
     114      CASE ( np_zps )   ;   CALL hpg_zps    ( kt, Kmm, puu, pvv, Krhs )  ! z-coordinate plus partial steps (interpolation) 
     115      CASE ( np_sco )   ;   CALL hpg_sco    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (standard jacobian formulation) 
     116      CASE ( np_djc )   ;   CALL hpg_djc    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Density Jacobian with Cubic polynomial) 
     117      CASE ( np_prj )   ;   CALL hpg_prj    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate (Pressure Jacobian scheme) 
     118      CASE ( np_isf )   ;   CALL hpg_isf    ( kt, Kmm, puu, pvv, Krhs )  ! s-coordinate similar to sco modify for ice shelf 
    112119      END SELECT 
    113120      ! 
    114121      IF( l_trddyn ) THEN      ! save the hydrostatic pressure gradient trends for momentum trend diagnostics 
    115          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    116          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    117          CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt ) 
     122         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     123         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     124         CALL trd_dyn( ztrdu, ztrdv, jpdyn_hpg, kt, Kmm ) 
    118125         DEALLOCATE( ztrdu , ztrdv ) 
    119126      ENDIF 
    120127      ! 
    121       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' hpg  - Ua: ', mask1=umask,   & 
    122          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     128      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' hpg  - Ua: ', mask1=umask,   & 
     129         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    123130      ! 
    124131      IF( ln_timing )   CALL timing_stop('dyn_hpg') 
     
    127134 
    128135 
    129    SUBROUTINE dyn_hpg_init 
     136   SUBROUTINE dyn_hpg_init( Kmm ) 
    130137      !!---------------------------------------------------------------------- 
    131138      !!                 ***  ROUTINE dyn_hpg_init  *** 
     
    137144      !!      with the type of vertical coordinate used (zco, zps, sco) 
    138145      !!---------------------------------------------------------------------- 
     146      INTEGER, INTENT( in ) :: Kmm   ! ocean time level index 
     147      ! 
    139148      INTEGER ::   ioptio = 0      ! temporary integer 
    140149      INTEGER ::   ios             ! Local integer output status for namelist read 
     
    150159      !!---------------------------------------------------------------------- 
    151160      ! 
    152       REWIND( numnam_ref )              ! Namelist namdyn_hpg in reference namelist : Hydrostatic pressure gradient 
    153161      READ  ( numnam_ref, namdyn_hpg, IOSTAT = ios, ERR = 901) 
    154 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist', lwp ) 
    155       ! 
    156       REWIND( numnam_cfg )              ! Namelist namdyn_hpg in configuration namelist : Hydrostatic pressure gradient 
     162901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_hpg in reference namelist' ) 
     163      ! 
    157164      READ  ( numnam_cfg, namdyn_hpg, IOSTAT = ios, ERR = 902 ) 
    158 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist', lwp ) 
     165902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_hpg in configuration namelist' ) 
    159166      IF(lwm) WRITE ( numond, namdyn_hpg ) 
    160167      ! 
     
    213220      ENDIF 
    214221      !                           
    215       IF ( .NOT. ln_isfcav ) THEN     !--- no ice shelf load 
    216          riceload(:,:) = 0._wp 
    217          ! 
    218       ELSE                            !--- set an ice shelf load 
    219          ! 
    220          IF(lwp) WRITE(numout,*) 
    221          IF(lwp) WRITE(numout,*) '   ice shelf case: set the ice-shelf load' 
    222          ALLOCATE( zts_top(jpi,jpj,jpts) , zrhd(jpi,jpj,jpk) , zrhdtop_isf(jpi,jpj) , ziceload(jpi,jpj) )  
    223          ! 
    224          znad = 1._wp                     !- To use density and not density anomaly 
    225          ! 
    226          !                                !- assume water displaced by the ice shelf is at T=-1.9 and S=34.4 (rude) 
    227          zts_top(:,:,jp_tem) = -1.9_wp   ;   zts_top(:,:,jp_sal) = 34.4_wp 
    228          ! 
    229          DO jk = 1, jpk                   !- compute density of the water displaced by the ice shelf  
    230             CALL eos( zts_top(:,:,:), gdept_n(:,:,jk), zrhd(:,:,jk) ) 
    231          END DO 
    232          ! 
    233          !                                !- compute rhd at the ice/oce interface (ice shelf side) 
    234          CALL eos( zts_top , risfdep, zrhdtop_isf ) 
    235          ! 
    236          !                                !- Surface value + ice shelf gradient 
    237          ziceload = 0._wp                       ! compute pressure due to ice shelf load  
    238          DO jj = 1, jpj                         ! (used to compute hpgi/j for all the level from 1 to miku/v) 
    239             DO ji = 1, jpi                      ! divided by 2 later 
    240                ikt = mikt(ji,jj) 
    241                ziceload(ji,jj) = ziceload(ji,jj) + (znad + zrhd(ji,jj,1) ) * e3w_n(ji,jj,1) * (1._wp - tmask(ji,jj,1)) 
    242                DO jk = 2, ikt-1 
    243                   ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhd(ji,jj,jk-1) + zrhd(ji,jj,jk)) * e3w_n(ji,jj,jk) & 
    244                      &                              * (1._wp - tmask(ji,jj,jk)) 
    245                END DO 
    246                IF (ikt  >=  2) ziceload(ji,jj) = ziceload(ji,jj) + (2._wp * znad + zrhdtop_isf(ji,jj) + zrhd(ji,jj,ikt-1)) & 
    247                   &                                              * ( risfdep(ji,jj) - gdept_n(ji,jj,ikt-1) ) 
    248             END DO 
    249          END DO 
    250          riceload(:,:) = ziceload(:,:)  ! need to be saved for diaar5 
    251          ! 
    252          DEALLOCATE( zts_top , zrhd , zrhdtop_isf , ziceload )  
    253       ENDIF 
    254       ! 
    255222   END SUBROUTINE dyn_hpg_init 
    256223 
    257224 
    258    SUBROUTINE hpg_zco( kt ) 
     225   SUBROUTINE hpg_zco( kt, Kmm, puu, pvv, Krhs ) 
    259226      !!--------------------------------------------------------------------- 
    260227      !!                  ***  ROUTINE hpg_zco  *** 
     
    266233      !!      level:    zhpi = grav ..... 
    267234      !!                zhpj = grav ..... 
    268       !!      add it to the general momentum trend (ua,va). 
    269       !!            ua = ua - 1/e1u * zhpi 
    270       !!            va = va - 1/e2v * zhpj 
    271       !! 
    272       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    273       !!---------------------------------------------------------------------- 
    274       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     235      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     236      !!            puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     237      !!            pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     238      !! 
     239      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     240      !!---------------------------------------------------------------------- 
     241      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     242      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     243      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    275244      ! 
    276245      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
     
    288257 
    289258      ! Surface value 
    290       DO jj = 2, jpjm1 
    291          DO ji = fs_2, fs_jpim1   ! vector opt. 
    292             zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    293             ! hydrostatic pressure gradient 
    294             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
    295             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    296             ! add to the general momentum trend 
    297             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    298             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    299          END DO 
    300       END DO 
     259      DO_2D( 0, 0, 0, 0 ) 
     260         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
     261         ! hydrostatic pressure gradient 
     262         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     263         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     264         ! add to the general momentum trend 
     265         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     266         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     267      END_2D 
    301268 
    302269      ! 
    303270      ! interior value (2=<jk=<jpkm1) 
    304       DO jk = 2, jpkm1 
    305          DO jj = 2, jpjm1 
    306             DO ji = fs_2, fs_jpim1   ! vector opt. 
    307                zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    308                ! hydrostatic pressure gradient 
    309                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    310                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
    311                   &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    312  
    313                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    314                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
    315                   &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    316                ! add to the general momentum trend 
    317                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    318                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    319             END DO 
    320          END DO 
    321       END DO 
     271      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     272         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
     273         ! hydrostatic pressure gradient 
     274         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
     275            &           + zcoef1 * (  ( rhd(ji+1,jj,jk)+rhd(ji+1,jj,jk-1) )    & 
     276            &                       - ( rhd(ji  ,jj,jk)+rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     277 
     278         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
     279            &           + zcoef1 * (  ( rhd(ji,jj+1,jk)+rhd(ji,jj+1,jk-1) )    & 
     280            &                       - ( rhd(ji,jj,  jk)+rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     281         ! add to the general momentum trend 
     282         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     283         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     284      END_3D 
    322285      ! 
    323286   END SUBROUTINE hpg_zco 
    324287 
    325288 
    326    SUBROUTINE hpg_zps( kt ) 
     289   SUBROUTINE hpg_zps( kt, Kmm, puu, pvv, Krhs ) 
    327290      !!--------------------------------------------------------------------- 
    328291      !!                 ***  ROUTINE hpg_zps  *** 
     
    330293      !! ** Method  :   z-coordinate plus partial steps case.  blahblah... 
    331294      !! 
    332       !! ** Action  : - Update (ua,va) with the now hydrastatic pressure trend 
    333       !!---------------------------------------------------------------------- 
    334       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     295      !! ** Action  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     296      !!---------------------------------------------------------------------- 
     297      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     298      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     299      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    335300      !! 
    336301      INTEGER  ::   ji, jj, jk                       ! dummy loop indices 
     
    338303      REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
    339304      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zhpi, zhpj 
     305      REAL(wp), DIMENSION(jpi,jpj) :: zgtsu, zgtsv, zgru, zgrv 
    340306      !!---------------------------------------------------------------------- 
    341307      ! 
     
    346312      ENDIF 
    347313 
    348       ! Partial steps: bottom before horizontal gradient of t, s, rd at the last ocean level 
    349 !jc      CALL zps_hde    ( kt, jpts, tsn, gtsu, gtsv, rhd, gru , grv ) 
     314      ! Partial steps: Compute NOW horizontal gradient of t, s, rd at the last ocean level 
     315      CALL zps_hde( kt, Kmm, jpts, ts(:,:,:,:,Kmm), zgtsu, zgtsv, rhd, zgru , zgrv ) 
    350316 
    351317      ! Local constant initialization 
     
    353319 
    354320      !  Surface value (also valid in partial step case) 
    355       DO jj = 2, jpjm1 
    356          DO ji = fs_2, fs_jpim1   ! vector opt. 
    357             zcoef1 = zcoef0 * e3w_n(ji,jj,1) 
    358             ! hydrostatic pressure gradient 
    359             zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
    360             zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
    361             ! add to the general momentum trend 
    362             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    363             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    364          END DO 
    365       END DO 
     321      DO_2D( 0, 0, 0, 0 ) 
     322         zcoef1 = zcoef0 * e3w(ji,jj,1,Kmm) 
     323         ! hydrostatic pressure gradient 
     324         zhpi(ji,jj,1) = zcoef1 * ( rhd(ji+1,jj  ,1) - rhd(ji,jj,1) ) * r1_e1u(ji,jj) 
     325         zhpj(ji,jj,1) = zcoef1 * ( rhd(ji  ,jj+1,1) - rhd(ji,jj,1) ) * r1_e2v(ji,jj) 
     326         ! add to the general momentum trend 
     327         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     328         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     329      END_2D 
    366330 
    367331      ! interior value (2=<jk=<jpkm1) 
    368       DO jk = 2, jpkm1 
    369          DO jj = 2, jpjm1 
    370             DO ji = fs_2, fs_jpim1   ! vector opt. 
    371                zcoef1 = zcoef0 * e3w_n(ji,jj,jk) 
    372                ! hydrostatic pressure gradient 
    373                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
    374                   &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
    375                   &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    376  
    377                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
    378                   &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
    379                   &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
    380                ! add to the general momentum trend 
    381                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    382                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    383             END DO 
    384          END DO 
    385       END DO 
    386  
    387       ! partial steps correction at the last level  (use gru & grv computed in zpshde.F90) 
    388       DO jj = 2, jpjm1 
    389          DO ji = 2, jpim1 
    390             iku = mbku(ji,jj) 
    391             ikv = mbkv(ji,jj) 
    392             zcoef2 = zcoef0 * MIN( e3w_n(ji,jj,iku), e3w_n(ji+1,jj  ,iku) ) 
    393             zcoef3 = zcoef0 * MIN( e3w_n(ji,jj,ikv), e3w_n(ji  ,jj+1,ikv) ) 
    394             IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
    395                ua  (ji,jj,iku) = ua(ji,jj,iku) - zhpi(ji,jj,iku)         ! subtract old value 
    396                zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
    397                   &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + gru(ji,jj) ) * r1_e1u(ji,jj) 
    398                ua  (ji,jj,iku) = ua(ji,jj,iku) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
    399             ENDIF 
    400             IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more) 
    401                va  (ji,jj,ikv) = va(ji,jj,ikv) - zhpj(ji,jj,ikv)         ! subtract old value 
    402                zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
    403                   &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + grv(ji,jj) ) * r1_e2v(ji,jj) 
    404                va  (ji,jj,ikv) = va(ji,jj,ikv) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
    405             ENDIF 
    406          END DO 
    407       END DO 
     332      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     333         zcoef1 = zcoef0 * e3w(ji,jj,jk,Kmm) 
     334         ! hydrostatic pressure gradient 
     335         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)   & 
     336            &           + zcoef1 * (  ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) )   & 
     337            &                       - ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     338 
     339         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)   & 
     340            &           + zcoef1 * (  ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) )   & 
     341            &                       - ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) )  ) * r1_e2v(ji,jj) 
     342         ! add to the general momentum trend 
     343         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     344         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     345      END_3D 
     346 
     347      ! partial steps correction at the last level  (use zgru & zgrv computed in zpshde.F90) 
     348      DO_2D( 0, 0, 0, 0 ) 
     349         iku = mbku(ji,jj) 
     350         ikv = mbkv(ji,jj) 
     351         zcoef2 = zcoef0 * MIN( e3w(ji,jj,iku,Kmm), e3w(ji+1,jj  ,iku,Kmm) ) 
     352         zcoef3 = zcoef0 * MIN( e3w(ji,jj,ikv,Kmm), e3w(ji  ,jj+1,ikv,Kmm) ) 
     353         IF( iku > 1 ) THEN            ! on i-direction (level 2 or more) 
     354            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) - zhpi(ji,jj,iku)         ! subtract old value 
     355            zhpi(ji,jj,iku) = zhpi(ji,jj,iku-1)                   &   ! compute the new one 
     356               &            + zcoef2 * ( rhd(ji+1,jj,iku-1) - rhd(ji,jj,iku-1) + zgru(ji,jj) ) * r1_e1u(ji,jj) 
     357            puu  (ji,jj,iku,Krhs) = puu(ji,jj,iku,Krhs) + zhpi(ji,jj,iku)         ! add the new one to the general momentum trend 
     358         ENDIF 
     359         IF( ikv > 1 ) THEN            ! on j-direction (level 2 or more) 
     360            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) - zhpj(ji,jj,ikv)         ! subtract old value 
     361            zhpj(ji,jj,ikv) = zhpj(ji,jj,ikv-1)                   &   ! compute the new one 
     362               &            + zcoef3 * ( rhd(ji,jj+1,ikv-1) - rhd(ji,jj,ikv-1) + zgrv(ji,jj) ) * r1_e2v(ji,jj) 
     363            pvv  (ji,jj,ikv,Krhs) = pvv(ji,jj,ikv,Krhs) + zhpj(ji,jj,ikv)         ! add the new one to the general momentum trend 
     364         ENDIF 
     365      END_2D 
    408366      ! 
    409367   END SUBROUTINE hpg_zps 
    410368 
    411369 
    412    SUBROUTINE hpg_sco( kt ) 
     370   SUBROUTINE hpg_sco( kt, Kmm, puu, pvv, Krhs ) 
    413371      !!--------------------------------------------------------------------- 
    414372      !!                  ***  ROUTINE hpg_sco  *** 
     
    422380      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ] 
    423381      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ] 
    424       !!      add it to the general momentum trend (ua,va). 
    425       !!         ua = ua - 1/e1u * zhpi 
    426       !!         va = va - 1/e2v * zhpj 
    427       !! 
    428       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    429       !!---------------------------------------------------------------------- 
    430       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     382      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     383      !!         puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     384      !!         pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     385      !! 
     386      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     387      !!---------------------------------------------------------------------- 
     388      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     389      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     390      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    431391      !! 
    432392      INTEGER  ::   ji, jj, jk, jii, jjj                 ! dummy loop indices 
     
    451411      ! 
    452412      IF( ln_wd_il ) THEN 
    453         DO jj = 2, jpjm1 
    454            DO ji = 2, jpim1  
    455              ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji+1,jj) ) >                & 
    456                   &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
    457                   &    MAX(  sshn(ji,jj) +  ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    458                   &                                                       > rn_wdmin1 + rn_wdmin2 
    459              ll_tmp2 = ( ABS( sshn(ji,jj)              -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (       & 
    460                   &    MAX(   sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    461                   &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    462  
    463              IF(ll_tmp1) THEN 
    464                zcpx(ji,jj) = 1.0_wp 
    465              ELSE IF(ll_tmp2) THEN 
    466                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    467                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    468                            &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    469              ELSE 
    470                zcpx(ji,jj) = 0._wp 
    471              END IF 
    472        
    473              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    474                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    475                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    476                   &                                                      > rn_wdmin1 + rn_wdmin2 
    477              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (        & 
    478                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    479                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    480  
    481              IF(ll_tmp1) THEN 
    482                zcpy(ji,jj) = 1.0_wp 
    483              ELSE IF(ll_tmp2) THEN 
    484                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    485                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    486                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    487              ELSE 
    488                zcpy(ji,jj) = 0._wp 
    489              END IF 
    490            END DO 
    491         END DO 
    492         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
     413        DO_2D( 0, 0, 0, 0 ) 
     414          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)               ,  ssh(ji+1,jj,Kmm) ) >                & 
     415               &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
     416               &    MAX(  ssh(ji,jj,Kmm) +  ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     417               &                                                       > rn_wdmin1 + rn_wdmin2 
     418          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)              -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (       & 
     419               &    MAX(   ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     420               &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     421 
     422          IF(ll_tmp1) THEN 
     423            zcpx(ji,jj) = 1.0_wp 
     424          ELSE IF(ll_tmp2) THEN 
     425            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     426            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     427                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) ) 
     428          ELSE 
     429            zcpx(ji,jj) = 0._wp 
     430          END IF 
     431    
     432          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     433               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     434               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     435               &                                                      > rn_wdmin1 + rn_wdmin2 
     436          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (        & 
     437               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     438               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     439 
     440          IF(ll_tmp1) THEN 
     441            zcpy(ji,jj) = 1.0_wp 
     442          ELSE IF(ll_tmp2) THEN 
     443            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     444            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     445                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     446          ELSE 
     447            zcpy(ji,jj) = 0._wp 
     448          END IF 
     449        END_2D 
     450        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    493451      END IF 
    494452 
    495453      ! Surface value 
    496       DO jj = 2, jpjm1 
    497          DO ji = fs_2, fs_jpim1   ! vector opt. 
    498             ! hydrostatic pressure gradient along s-surfaces 
    499             zhpi(ji,jj,1) = zcoef0 * (  e3w_n(ji+1,jj  ,1) * ( znad + rhd(ji+1,jj  ,1) )    & 
    500                &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e1u(ji,jj) 
    501             zhpj(ji,jj,1) = zcoef0 * (  e3w_n(ji  ,jj+1,1) * ( znad + rhd(ji  ,jj+1,1) )    & 
    502                &                      - e3w_n(ji  ,jj  ,1) * ( znad + rhd(ji  ,jj  ,1) )  ) * r1_e2v(ji,jj) 
    503             ! s-coordinate pressure gradient correction 
    504             zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    505                &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
    506             zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    507                &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    508             ! 
    509             IF( ln_wd_il ) THEN 
    510                zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    511                zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    512                zuap = zuap * zcpx(ji,jj) 
    513                zvap = zvap * zcpy(ji,jj) 
    514             ENDIF 
    515             ! 
    516             ! add to the general momentum trend 
    517             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
    518             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) + zvap 
    519          END DO 
    520       END DO 
     454      DO_2D( 0, 0, 0, 0 ) 
     455         ! hydrostatic pressure gradient along s-surfaces 
     456         zhpi(ji,jj,1) =   & 
     457            &  zcoef0 * (  e3w(ji+1,jj  ,1,Kmm) * ( znad + rhd(ji+1,jj  ,1) )    & 
     458            &            - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) & 
     459            &           * r1_e1u(ji,jj) 
     460         zhpj(ji,jj,1) =   & 
     461            &  zcoef0 * (  e3w(ji  ,jj+1,1,Kmm) * ( znad + rhd(ji  ,jj+1,1) )    & 
     462            &            - e3w(ji  ,jj  ,1,Kmm) * ( znad + rhd(ji  ,jj  ,1) )  ) & 
     463            &           * r1_e2v(ji,jj) 
     464         ! s-coordinate pressure gradient correction 
     465         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     466            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
     467         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     468            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
     469         ! 
     470         IF( ln_wd_il ) THEN 
     471            zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     472            zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     473            zuap = zuap * zcpx(ji,jj) 
     474            zvap = zvap * zcpy(ji,jj) 
     475         ENDIF 
     476         ! 
     477         ! add to the general momentum trend 
     478         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) + zuap 
     479         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) + zvap 
     480      END_2D 
    521481 
    522482      ! interior value (2=<jk=<jpkm1) 
    523       DO jk = 2, jpkm1 
    524          DO jj = 2, jpjm1 
    525             DO ji = fs_2, fs_jpim1   ! vector opt. 
    526                ! hydrostatic pressure gradient along s-surfaces 
    527                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
    528                   &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
    529                   &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
    530                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
    531                   &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
    532                   &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
    533                ! s-coordinate pressure gradient correction 
    534                zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    535                   &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) * r1_e1u(ji,jj) 
    536                zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
    537                   &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) * r1_e2v(ji,jj) 
    538                ! 
    539                IF( ln_wd_il ) THEN 
    540                   zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    541                   zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    542                   zuap = zuap * zcpx(ji,jj) 
    543                   zvap = zvap * zcpy(ji,jj) 
    544                ENDIF 
    545                ! 
    546                ! add to the general momentum trend 
    547                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
    548                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) + zvap 
    549             END DO 
    550          END DO 
    551       END DO 
     483      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     484         ! hydrostatic pressure gradient along s-surfaces 
     485         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 * r1_e1u(ji,jj)   & 
     486            &           * (  e3w(ji+1,jj,jk,Kmm) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad )   & 
     487            &              - e3w(ji  ,jj,jk,Kmm) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad )  ) 
     488         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 * r1_e2v(ji,jj)   & 
     489            &           * (  e3w(ji,jj+1,jk,Kmm) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad )   & 
     490            &              - e3w(ji,jj  ,jk,Kmm) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad )  ) 
     491         ! s-coordinate pressure gradient correction 
     492         zuap = -zcoef0 * ( rhd    (ji+1,jj  ,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     493            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) * r1_e1u(ji,jj) 
     494         zvap = -zcoef0 * ( rhd    (ji  ,jj+1,jk) + rhd    (ji,jj,jk) + 2._wp * znad )   & 
     495            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) * r1_e2v(ji,jj) 
     496         ! 
     497         IF( ln_wd_il ) THEN 
     498            zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     499            zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     500            zuap = zuap * zcpx(ji,jj) 
     501            zvap = zvap * zcpy(ji,jj) 
     502         ENDIF 
     503         ! 
     504         ! add to the general momentum trend 
     505         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) + zuap 
     506         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) + zvap 
     507      END_3D 
    552508      ! 
    553509      IF( ln_wd_il )  DEALLOCATE( zcpx , zcpy ) 
     
    556512 
    557513 
    558    SUBROUTINE hpg_isf( kt ) 
     514   SUBROUTINE hpg_isf( kt, Kmm, puu, pvv, Krhs ) 
    559515      !!--------------------------------------------------------------------- 
    560516      !!                  ***  ROUTINE hpg_isf  *** 
     
    568524      !!         zhpi = grav .....  + 1/e1u mi(rhd) di[ grav dep3w ] 
    569525      !!         zhpj = grav .....  + 1/e2v mj(rhd) dj[ grav dep3w ] 
    570       !!      add it to the general momentum trend (ua,va). 
    571       !!         ua = ua - 1/e1u * zhpi 
    572       !!         va = va - 1/e2v * zhpj 
    573       !!      iceload is added and partial cell case are added to the top and bottom 
     526      !!      add it to the general momentum trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)). 
     527      !!         puu(:,:,:,Krhs) = puu(:,:,:,Krhs) - 1/e1u * zhpi 
     528      !!         pvv(:,:,:,Krhs) = pvv(:,:,:,Krhs) - 1/e2v * zhpj 
     529      !!      iceload is added 
    574530      !!       
    575       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
    576       !!---------------------------------------------------------------------- 
    577       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     531      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
     532      !!---------------------------------------------------------------------- 
     533      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     534      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     535      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    578536      !! 
    579537      INTEGER  ::   ji, jj, jk, ikt, iktp1i, iktp1j   ! dummy loop indices 
     
    596554        DO jj = 1, jpj 
    597555          ikt = mikt(ji,jj) 
    598           zts_top(ji,jj,1) = tsn(ji,jj,ikt,1) 
    599           zts_top(ji,jj,2) = tsn(ji,jj,ikt,2) 
     556          zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 
     557          zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 
    600558        END DO 
    601559      END DO 
     
    605563!===== Compute surface value =====================================================  
    606564!================================================================================== 
    607       DO jj = 2, jpjm1 
    608          DO ji = fs_2, fs_jpim1   ! vector opt. 
    609             ikt    = mikt(ji,jj) 
    610             iktp1i = mikt(ji+1,jj) 
    611             iktp1j = mikt(ji,jj+1) 
    612             ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
    613             ! we assume ISF is in isostatic equilibrium 
    614             zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w_n(ji+1,jj,iktp1i)                                    & 
    615                &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
    616                &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         & 
    617                &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    618                &                                  + ( riceload(ji+1,jj) - riceload(ji,jj))                            )  
    619             zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w_n(ji,jj+1,iktp1j)                                    & 
    620                &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
    621                &                                  - 0.5_wp * e3w_n(ji,jj,ikt)                                         &  
    622                &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
    623                &                                  + ( riceload(ji,jj+1) - riceload(ji,jj))                            )  
    624             ! s-coordinate pressure gradient correction (=0 if z coordinate) 
    625             zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    626                &           * ( gde3w_n(ji+1,jj,1) - gde3w_n(ji,jj,1) ) * r1_e1u(ji,jj) 
    627             zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
    628                &           * ( gde3w_n(ji,jj+1,1) - gde3w_n(ji,jj,1) ) * r1_e2v(ji,jj) 
    629             ! add to the general momentum trend 
    630             ua(ji,jj,1) = ua(ji,jj,1) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
    631             va(ji,jj,1) = va(ji,jj,1) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
    632          END DO 
    633       END DO 
     565      DO_2D( 0, 0, 0, 0 ) 
     566         ikt    = mikt(ji,jj) 
     567         iktp1i = mikt(ji+1,jj) 
     568         iktp1j = mikt(ji,jj+1) 
     569         ! hydrostatic pressure gradient along s-surfaces and ice shelf pressure 
     570         ! we assume ISF is in isostatic equilibrium 
     571         zhpi(ji,jj,1) = zcoef0 / e1u(ji,jj) * ( 0.5_wp * e3w(ji+1,jj,iktp1i,Kmm)                                    & 
     572            &                                    * ( 2._wp * znad + rhd(ji+1,jj,iktp1i) + zrhdtop_oce(ji+1,jj) )   & 
     573            &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         & 
     574            &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     575            &                                  + ( risfload(ji+1,jj) - risfload(ji,jj))                            )  
     576         zhpj(ji,jj,1) = zcoef0 / e2v(ji,jj) * ( 0.5_wp * e3w(ji,jj+1,iktp1j,Kmm)                                    & 
     577            &                                    * ( 2._wp * znad + rhd(ji,jj+1,iktp1j) + zrhdtop_oce(ji,jj+1) )   & 
     578            &                                  - 0.5_wp * e3w(ji,jj,ikt,Kmm)                                         &  
     579            &                                    * ( 2._wp * znad + rhd(ji,jj,ikt) + zrhdtop_oce(ji,jj) )          & 
     580            &                                  + ( risfload(ji,jj+1) - risfload(ji,jj))                            )  
     581         ! s-coordinate pressure gradient correction (=0 if z coordinate) 
     582         zuap = -zcoef0 * ( rhd    (ji+1,jj,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     583            &           * ( gde3w(ji+1,jj,1) - gde3w(ji,jj,1) ) * r1_e1u(ji,jj) 
     584         zvap = -zcoef0 * ( rhd    (ji,jj+1,1) + rhd    (ji,jj,1) + 2._wp * znad )   & 
     585            &           * ( gde3w(ji,jj+1,1) - gde3w(ji,jj,1) ) * r1_e2v(ji,jj) 
     586         ! add to the general momentum trend 
     587         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + (zhpi(ji,jj,1) + zuap) * umask(ji,jj,1) 
     588         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + (zhpj(ji,jj,1) + zvap) * vmask(ji,jj,1) 
     589      END_2D 
    634590!==================================================================================      
    635591!===== Compute interior value =====================================================  
    636592!================================================================================== 
    637593      ! interior value (2=<jk=<jpkm1) 
    638       DO jk = 2, jpkm1 
    639          DO jj = 2, jpjm1 
    640             DO ji = fs_2, fs_jpim1   ! vector opt. 
    641                ! hydrostatic pressure gradient along s-surfaces 
    642                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
    643                   &           * (  e3w_n(ji+1,jj,jk) * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
    644                   &              - e3w_n(ji  ,jj,jk) * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
    645                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
    646                   &           * (  e3w_n(ji,jj+1,jk) * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
    647                   &              - e3w_n(ji,jj  ,jk) * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
    648                ! s-coordinate pressure gradient correction 
    649                zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    650                   &           * ( gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk) ) / e1u(ji,jj) 
    651                zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    652                   &           * ( gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk) ) / e2v(ji,jj) 
    653                ! add to the general momentum trend 
    654                ua(ji,jj,jk) = ua(ji,jj,jk) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
    655                va(ji,jj,jk) = va(ji,jj,jk) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
    656             END DO 
    657          END DO 
    658       END DO 
     594      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     595         ! hydrostatic pressure gradient along s-surfaces 
     596         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + zcoef0 / e1u(ji,jj)   & 
     597            &           * (  e3w(ji+1,jj,jk,Kmm)                   & 
     598            &                  * ( rhd(ji+1,jj,jk) + rhd(ji+1,jj,jk-1) + 2*znad ) * wmask(ji+1,jj,jk)   & 
     599            &              - e3w(ji  ,jj,jk,Kmm)                   & 
     600            &                  * ( rhd(ji  ,jj,jk) + rhd(ji  ,jj,jk-1) + 2*znad ) * wmask(ji  ,jj,jk)   ) 
     601         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1) + zcoef0 / e2v(ji,jj)   & 
     602            &           * (  e3w(ji,jj+1,jk,Kmm)                   & 
     603            &                  * ( rhd(ji,jj+1,jk) + rhd(ji,jj+1,jk-1) + 2*znad ) * wmask(ji,jj+1,jk)   & 
     604            &              - e3w(ji,jj  ,jk,Kmm)                   & 
     605            &                  * ( rhd(ji,jj,  jk) + rhd(ji,jj  ,jk-1) + 2*znad ) * wmask(ji,jj  ,jk)   ) 
     606         ! s-coordinate pressure gradient correction 
     607         zuap = -zcoef0 * ( rhd   (ji+1,jj  ,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     608            &           * ( gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk) ) / e1u(ji,jj) 
     609         zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
     610            &           * ( gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk) ) / e2v(ji,jj) 
     611         ! add to the general momentum trend 
     612         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zhpi(ji,jj,jk) + zuap) * umask(ji,jj,jk) 
     613         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zhpj(ji,jj,jk) + zvap) * vmask(ji,jj,jk) 
     614      END_3D 
    659615      ! 
    660616   END SUBROUTINE hpg_isf 
    661617 
    662618 
    663    SUBROUTINE hpg_djc( kt ) 
     619   SUBROUTINE hpg_djc( kt, Kmm, puu, pvv, Krhs ) 
    664620      !!--------------------------------------------------------------------- 
    665621      !!                  ***  ROUTINE hpg_djc  *** 
     
    669625      !! Reference: Shchepetkin and McWilliams, J. Geophys. Res., 108(C3), 3090, 2003 
    670626      !!---------------------------------------------------------------------- 
    671       INTEGER, INTENT(in) ::   kt    ! ocean time-step index 
     627      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     628      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     629      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    672630      !! 
    673631      INTEGER  ::   ji, jj, jk          ! dummy loop indices 
     
    685643      IF( ln_wd_il ) THEN 
    686644         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
    687         DO jj = 2, jpjm1 
    688            DO ji = 2, jpim1  
    689              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    690                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    691                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    692                   &                                                      > rn_wdmin1 + rn_wdmin2 
    693              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (        & 
    694                   &    MAX(   sshn(ji,jj)             ,  sshn(ji+1,jj) ) >                & 
    695                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    696              IF(ll_tmp1) THEN 
    697                zcpx(ji,jj) = 1.0_wp 
    698              ELSE IF(ll_tmp2) THEN 
    699                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    700                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    701                            &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    702              ELSE 
    703                zcpx(ji,jj) = 0._wp 
    704              END IF 
    705        
    706              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    707                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    708                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    709                   &                                                      > rn_wdmin1 + rn_wdmin2 
    710              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (        & 
    711                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    712                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    713  
    714              IF(ll_tmp1) THEN 
    715                zcpy(ji,jj) = 1.0_wp 
    716              ELSE IF(ll_tmp2) THEN 
    717                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    718                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    719                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    720              ELSE 
    721                zcpy(ji,jj) = 0._wp 
    722              END IF 
    723            END DO 
    724         END DO 
    725         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
     645        DO_2D( 0, 0, 0, 0 ) 
     646          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     647               &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
     648               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     649               &                                                      > rn_wdmin1 + rn_wdmin2 
     650          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (        & 
     651               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
     652               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     653          IF(ll_tmp1) THEN 
     654            zcpx(ji,jj) = 1.0_wp 
     655          ELSE IF(ll_tmp2) THEN 
     656            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     657            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     658                        &    / (ssh(ji+1,jj,Kmm) - ssh(ji  ,jj,Kmm)) ) 
     659          ELSE 
     660            zcpx(ji,jj) = 0._wp 
     661          END IF 
     662    
     663          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     664               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     665               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     666               &                                                      > rn_wdmin1 + rn_wdmin2 
     667          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (        & 
     668               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     669               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     670 
     671          IF(ll_tmp1) THEN 
     672            zcpy(ji,jj) = 1.0_wp 
     673          ELSE IF(ll_tmp2) THEN 
     674            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     675            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     676                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     677          ELSE 
     678            zcpy(ji,jj) = 0._wp 
     679          END IF 
     680        END_2D 
     681        CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    726682      END IF 
    727683 
     
    743699!!bug gm   Not a true bug, but... dzz=e3w  for dzx, dzy verify what it is really 
    744700 
    745       DO jk = 2, jpkm1 
    746          DO jj = 2, jpjm1 
    747             DO ji = fs_2, fs_jpim1   ! vector opt. 
    748                drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
    749                dzz  (ji,jj,jk) = gde3w_n(ji  ,jj  ,jk) - gde3w_n(ji,jj,jk-1) 
    750                drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
    751                dzx  (ji,jj,jk) = gde3w_n(ji+1,jj  ,jk) - gde3w_n(ji,jj,jk  ) 
    752                drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
    753                dzy  (ji,jj,jk) = gde3w_n(ji  ,jj+1,jk) - gde3w_n(ji,jj,jk  ) 
    754             END DO 
    755          END DO 
    756       END DO 
     701      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     702         drhoz(ji,jj,jk) = rhd    (ji  ,jj  ,jk) - rhd    (ji,jj,jk-1) 
     703         dzz  (ji,jj,jk) = gde3w(ji  ,jj  ,jk) - gde3w(ji,jj,jk-1) 
     704         drhox(ji,jj,jk) = rhd    (ji+1,jj  ,jk) - rhd    (ji,jj,jk  ) 
     705         dzx  (ji,jj,jk) = gde3w(ji+1,jj  ,jk) - gde3w(ji,jj,jk  ) 
     706         drhoy(ji,jj,jk) = rhd    (ji  ,jj+1,jk) - rhd    (ji,jj,jk  ) 
     707         dzy  (ji,jj,jk) = gde3w(ji  ,jj+1,jk) - gde3w(ji,jj,jk  ) 
     708      END_3D 
    757709 
    758710      !------------------------------------------------------------------------- 
     
    764716!!bug  gm  idem for drhox, drhoy et ji=jpi and jj=jpj 
    765717 
    766       DO jk = 2, jpkm1 
    767          DO jj = 2, jpjm1 
    768             DO ji = fs_2, fs_jpim1   ! vector opt. 
    769                cffw = 2._wp * drhoz(ji  ,jj  ,jk) * drhoz(ji,jj,jk-1) 
    770  
    771                cffu = 2._wp * drhox(ji+1,jj  ,jk) * drhox(ji,jj,jk  ) 
    772                cffx = 2._wp * dzx  (ji+1,jj  ,jk) * dzx  (ji,jj,jk  ) 
    773  
    774                cffv = 2._wp * drhoy(ji  ,jj+1,jk) * drhoy(ji,jj,jk  ) 
    775                cffy = 2._wp * dzy  (ji  ,jj+1,jk) * dzy  (ji,jj,jk  ) 
    776  
    777                IF( cffw > zep) THEN 
    778                   drhow(ji,jj,jk) = 2._wp *   drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1)   & 
    779                      &                    / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 
    780                ELSE 
    781                   drhow(ji,jj,jk) = 0._wp 
    782                ENDIF 
    783  
    784                dzw(ji,jj,jk) = 2._wp *   dzz(ji,jj,jk) * dzz(ji,jj,jk-1)   & 
    785                   &                  / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 
    786  
    787                IF( cffu > zep ) THEN 
    788                   drhou(ji,jj,jk) = 2._wp *   drhox(ji+1,jj,jk) * drhox(ji,jj,jk)   & 
    789                      &                    / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 
    790                ELSE 
    791                   drhou(ji,jj,jk ) = 0._wp 
    792                ENDIF 
    793  
    794                IF( cffx > zep ) THEN 
    795                   dzu(ji,jj,jk) = 2._wp *   dzx(ji+1,jj,jk) * dzx(ji,jj,jk)   & 
    796                      &                  / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 
    797                ELSE 
    798                   dzu(ji,jj,jk) = 0._wp 
    799                ENDIF 
    800  
    801                IF( cffv > zep ) THEN 
    802                   drhov(ji,jj,jk) = 2._wp *   drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk)   & 
    803                      &                    / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 
    804                ELSE 
    805                   drhov(ji,jj,jk) = 0._wp 
    806                ENDIF 
    807  
    808                IF( cffy > zep ) THEN 
    809                   dzv(ji,jj,jk) = 2._wp *   dzy(ji,jj+1,jk) * dzy(ji,jj,jk)   & 
    810                      &                  / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 
    811                ELSE 
    812                   dzv(ji,jj,jk) = 0._wp 
    813                ENDIF 
    814  
    815             END DO 
    816          END DO 
    817       END DO 
     718      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     719         cffw = 2._wp * drhoz(ji  ,jj  ,jk) * drhoz(ji,jj,jk-1) 
     720 
     721         cffu = 2._wp * drhox(ji+1,jj  ,jk) * drhox(ji,jj,jk  ) 
     722         cffx = 2._wp * dzx  (ji+1,jj  ,jk) * dzx  (ji,jj,jk  ) 
     723 
     724         cffv = 2._wp * drhoy(ji  ,jj+1,jk) * drhoy(ji,jj,jk  ) 
     725         cffy = 2._wp * dzy  (ji  ,jj+1,jk) * dzy  (ji,jj,jk  ) 
     726 
     727         IF( cffw > zep) THEN 
     728            drhow(ji,jj,jk) = 2._wp *   drhoz(ji,jj,jk) * drhoz(ji,jj,jk-1)   & 
     729               &                    / ( drhoz(ji,jj,jk) + drhoz(ji,jj,jk-1) ) 
     730         ELSE 
     731            drhow(ji,jj,jk) = 0._wp 
     732         ENDIF 
     733 
     734         dzw(ji,jj,jk) = 2._wp *   dzz(ji,jj,jk) * dzz(ji,jj,jk-1)   & 
     735            &                  / ( dzz(ji,jj,jk) + dzz(ji,jj,jk-1) ) 
     736 
     737         IF( cffu > zep ) THEN 
     738            drhou(ji,jj,jk) = 2._wp *   drhox(ji+1,jj,jk) * drhox(ji,jj,jk)   & 
     739               &                    / ( drhox(ji+1,jj,jk) + drhox(ji,jj,jk) ) 
     740         ELSE 
     741            drhou(ji,jj,jk ) = 0._wp 
     742         ENDIF 
     743 
     744         IF( cffx > zep ) THEN 
     745            dzu(ji,jj,jk) = 2._wp *   dzx(ji+1,jj,jk) * dzx(ji,jj,jk)   & 
     746               &                  / ( dzx(ji+1,jj,jk) + dzx(ji,jj,jk) ) 
     747         ELSE 
     748            dzu(ji,jj,jk) = 0._wp 
     749         ENDIF 
     750 
     751         IF( cffv > zep ) THEN 
     752            drhov(ji,jj,jk) = 2._wp *   drhoy(ji,jj+1,jk) * drhoy(ji,jj,jk)   & 
     753               &                    / ( drhoy(ji,jj+1,jk) + drhoy(ji,jj,jk) ) 
     754         ELSE 
     755            drhov(ji,jj,jk) = 0._wp 
     756         ENDIF 
     757 
     758         IF( cffy > zep ) THEN 
     759            dzv(ji,jj,jk) = 2._wp *   dzy(ji,jj+1,jk) * dzy(ji,jj,jk)   & 
     760               &                  / ( dzy(ji,jj+1,jk) + dzy(ji,jj,jk) ) 
     761         ELSE 
     762            dzv(ji,jj,jk) = 0._wp 
     763         ENDIF 
     764 
     765      END_3D 
    818766 
    819767      !---------------------------------------------------------------------------------- 
     
    833781      !------------------------------------------------------------- 
    834782 
    835 !!bug gm   :  e3w-gde3w = 0.5*e3w  ....  and gde3w(2)-gde3w(1)=e3w(2) ....   to be verified 
    836 !          true if gde3w is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
    837  
    838       DO jj = 2, jpjm1 
    839          DO ji = fs_2, fs_jpim1   ! vector opt. 
    840             rho_k(ji,jj,1) = -grav * ( e3w_n(ji,jj,1) - gde3w_n(ji,jj,1) )               & 
    841                &                   * (  rhd(ji,jj,1)                                     & 
    842                &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
    843                &                              * ( e3w_n  (ji,jj,1) - gde3w_n(ji,jj,1) )  & 
    844                &                              / ( gde3w_n(ji,jj,2) - gde3w_n(ji,jj,1) )  ) 
    845          END DO 
    846       END DO 
     783!!bug gm   :  e3w-gde3w(:,:,:) = 0.5*e3w  ....  and gde3w(:,:,2)-gde3w(:,:,1)=e3w(:,:,2,Kmm) ....   to be verified 
     784!          true if gde3w(:,:,:) is really defined as the sum of the e3w scale factors as, it seems to me, it should be 
     785 
     786      DO_2D( 0, 0, 0, 0 ) 
     787         rho_k(ji,jj,1) = -grav * ( e3w(ji,jj,1,Kmm) - gde3w(ji,jj,1) )               & 
     788            &                   * (  rhd(ji,jj,1)                                     & 
     789            &                     + 0.5_wp * ( rhd    (ji,jj,2) - rhd    (ji,jj,1) )  & 
     790            &                              * ( e3w  (ji,jj,1,Kmm) - gde3w(ji,jj,1) )  & 
     791            &                              / ( gde3w(ji,jj,2) - gde3w(ji,jj,1) )  ) 
     792      END_2D 
    847793 
    848794!!bug gm    : here also, simplification is possible 
    849795!!bug gm    : optimisation: 1/10 and 1/12 the division should be done before the loop 
    850796 
    851       DO jk = 2, jpkm1 
    852          DO jj = 2, jpjm1 
    853             DO ji = fs_2, fs_jpim1   ! vector opt. 
    854  
    855                rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
    856                   &                     * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) )                                   & 
    857                   &            - grav * z1_10 * (                                                                   & 
    858                   &     ( drhow  (ji,jj,jk) - drhow  (ji,jj,jk-1) )                                                     & 
    859                   &   * ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
    860                   &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
    861                   &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
    862                   &                             ) 
    863  
    864                rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
    865                   &                     * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) )                                   & 
    866                   &            - grav* z1_10 * (                                                                    & 
    867                   &     ( drhou  (ji+1,jj,jk) - drhou  (ji,jj,jk) )                                                     & 
    868                   &   * ( gde3w_n(ji+1,jj,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
    869                   &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
    870                   &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
    871                   &                            ) 
    872  
    873                rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
    874                   &                     * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) )                                   & 
    875                   &            - grav* z1_10 * (                                                                    & 
    876                   &     ( drhov  (ji,jj+1,jk) - drhov  (ji,jj,jk) )                                                     & 
    877                   &   * ( gde3w_n(ji,jj+1,jk) - gde3w_n(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
    878                   &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
    879                   &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
    880                   &                            ) 
    881  
    882             END DO 
    883          END DO 
    884       END DO 
    885       CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1., rho_i, 'U', 1., rho_j, 'V', 1. ) 
     797      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     798 
     799         rho_k(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj,jk) + rhd    (ji,jj,jk-1) )                                   & 
     800            &                     * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) )                                   & 
     801            &            - grav * z1_10 * (                                                                   & 
     802            &     ( drhow  (ji,jj,jk) - drhow  (ji,jj,jk-1) )                                                     & 
     803            &   * ( gde3w(ji,jj,jk) - gde3w(ji,jj,jk-1) - z1_12 * ( dzw  (ji,jj,jk) + dzw  (ji,jj,jk-1) ) )   & 
     804            &   - ( dzw    (ji,jj,jk) - dzw    (ji,jj,jk-1) )                                                     & 
     805            &   * ( rhd    (ji,jj,jk) - rhd    (ji,jj,jk-1) - z1_12 * ( drhow(ji,jj,jk) + drhow(ji,jj,jk-1) ) )   & 
     806            &                             ) 
     807 
     808         rho_i(ji,jj,jk) = zcoef0 * ( rhd    (ji+1,jj,jk) + rhd    (ji,jj,jk) )                                   & 
     809            &                     * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) )                                   & 
     810            &            - grav* z1_10 * (                                                                    & 
     811            &     ( drhou  (ji+1,jj,jk) - drhou  (ji,jj,jk) )                                                     & 
     812            &   * ( gde3w(ji+1,jj,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzu  (ji+1,jj,jk) + dzu  (ji,jj,jk) ) )   & 
     813            &   - ( dzu    (ji+1,jj,jk) - dzu    (ji,jj,jk) )                                                     & 
     814            &   * ( rhd    (ji+1,jj,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhou(ji+1,jj,jk) + drhou(ji,jj,jk) ) )   & 
     815            &                            ) 
     816 
     817         rho_j(ji,jj,jk) = zcoef0 * ( rhd    (ji,jj+1,jk) + rhd    (ji,jj,jk) )                                 & 
     818            &                     * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) )                                   & 
     819            &            - grav* z1_10 * (                                                                    & 
     820            &     ( drhov  (ji,jj+1,jk) - drhov  (ji,jj,jk) )                                                     & 
     821            &   * ( gde3w(ji,jj+1,jk) - gde3w(ji,jj,jk) - z1_12 * ( dzv  (ji,jj+1,jk) + dzv  (ji,jj,jk) ) )   & 
     822            &   - ( dzv    (ji,jj+1,jk) - dzv    (ji,jj,jk) )                                                     & 
     823            &   * ( rhd    (ji,jj+1,jk) - rhd    (ji,jj,jk) - z1_12 * ( drhov(ji,jj+1,jk) + drhov(ji,jj,jk) ) )   & 
     824            &                            ) 
     825 
     826      END_3D 
     827      CALL lbc_lnk_multi( 'dynhpg', rho_k, 'W', 1.0_wp, rho_i, 'U', 1.0_wp, rho_j, 'V', 1.0_wp ) 
    886828 
    887829      ! --------------- 
    888830      !  Surface value 
    889831      ! --------------- 
    890       DO jj = 2, jpjm1 
    891          DO ji = fs_2, fs_jpim1   ! vector opt. 
    892             zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
    893             zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
    894             IF( ln_wd_il ) THEN 
    895               zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
    896               zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
    897             ENDIF 
    898             ! add to the general momentum trend 
    899             ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
    900             va(ji,jj,1) = va(ji,jj,1) + zhpj(ji,jj,1) 
    901          END DO 
    902       END DO 
     832      DO_2D( 0, 0, 0, 0 ) 
     833         zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) * r1_e1u(ji,jj) 
     834         zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) * r1_e2v(ji,jj) 
     835         IF( ln_wd_il ) THEN 
     836           zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     837           zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj)  
     838         ENDIF 
     839         ! add to the general momentum trend 
     840         puu(ji,jj,1,Krhs) = puu(ji,jj,1,Krhs) + zhpi(ji,jj,1) 
     841         pvv(ji,jj,1,Krhs) = pvv(ji,jj,1,Krhs) + zhpj(ji,jj,1) 
     842      END_2D 
    903843 
    904844      ! ---------------- 
    905845      !  interior value   (2=<jk=<jpkm1) 
    906846      ! ---------------- 
    907       DO jk = 2, jpkm1 
    908          DO jj = 2, jpjm1 
    909             DO ji = fs_2, fs_jpim1   ! vector opt. 
    910                ! hydrostatic pressure gradient along s-surfaces 
    911                zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
    912                   &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
    913                   &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
    914                zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
    915                   &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
    916                   &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
    917                IF( ln_wd_il ) THEN 
    918                  zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
    919                  zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
    920                ENDIF 
    921                ! add to the general momentum trend 
    922                ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
    923                va(ji,jj,jk) = va(ji,jj,jk) + zhpj(ji,jj,jk) 
    924             END DO 
    925          END DO 
    926       END DO 
     847      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     848         ! hydrostatic pressure gradient along s-surfaces 
     849         zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1)                                & 
     850            &           + (  ( rho_k(ji+1,jj,jk) - rho_k(ji,jj,jk  ) )    & 
     851            &              - ( rho_i(ji  ,jj,jk) - rho_i(ji,jj,jk-1) )  ) * r1_e1u(ji,jj) 
     852         zhpj(ji,jj,jk) = zhpj(ji,jj,jk-1)                                & 
     853            &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
     854            &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) * r1_e2v(ji,jj) 
     855         IF( ln_wd_il ) THEN 
     856           zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     857           zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj)  
     858         ENDIF 
     859         ! add to the general momentum trend 
     860         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + zhpi(ji,jj,jk) 
     861         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + zhpj(ji,jj,jk) 
     862      END_3D 
    927863      ! 
    928864      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy ) 
     
    931867 
    932868 
    933    SUBROUTINE hpg_prj( kt ) 
     869   SUBROUTINE hpg_prj( kt, Kmm, puu, pvv, Krhs ) 
    934870      !!--------------------------------------------------------------------- 
    935871      !!                  ***  ROUTINE hpg_prj  *** 
     
    940876      !!      all vertical coordinate systems 
    941877      !! 
    942       !! ** Action : - Update (ua,va) with the now hydrastatic pressure trend 
     878      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now hydrastatic pressure trend 
    943879      !!---------------------------------------------------------------------- 
    944880      INTEGER, PARAMETER  :: polynomial_type = 1    ! 1: cubic spline, 2: linear 
    945       INTEGER, INTENT(in) ::   kt                   ! ocean time-step index 
     881      INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index 
     882      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
     883      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    946884      !! 
    947885      INTEGER  ::   ji, jj, jk, jkk                 ! dummy loop indices 
     
    973911      IF( ln_wd_il ) THEN 
    974912         ALLOCATE( zcpx(jpi,jpj) , zcpy(jpi,jpj) ) 
    975          DO jj = 2, jpjm1 
    976            DO ji = 2, jpim1  
    977              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    978                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
    979                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    980                   &                                                      > rn_wdmin1 + rn_wdmin2 
    981              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji+1,jj) ) > 1.E-12 ) .AND. (         & 
    982                   &    MAX(   sshn(ji,jj)             ,  sshn(ji+1,jj) ) >                & 
    983                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    984  
    985              IF(ll_tmp1) THEN 
    986                zcpx(ji,jj) = 1.0_wp 
    987              ELSE IF(ll_tmp2) THEN 
    988                ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    989                zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    990                            &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    991                
    992                 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
    993              ELSE 
    994                zcpx(ji,jj) = 0._wp 
    995              END IF 
    996        
    997              ll_tmp1 = MIN(  sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    998                   &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
    999                   &    MAX(  sshn(ji,jj) + ht_0(ji,jj),  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    1000                   &                                                      > rn_wdmin1 + rn_wdmin2 
    1001              ll_tmp2 = ( ABS( sshn(ji,jj)             -  sshn(ji,jj+1) ) > 1.E-12 ) .AND. (      & 
    1002                   &    MAX(   sshn(ji,jj)             ,  sshn(ji,jj+1) ) >                & 
    1003                   &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    1004  
    1005              IF(ll_tmp1) THEN 
    1006                zcpy(ji,jj) = 1.0_wp 
    1007              ELSE IF(ll_tmp2) THEN 
    1008                ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    1009                zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    1010                            &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    1011                 zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
    1012  
    1013                ELSE 
    1014                   zcpy(ji,jj) = 0._wp 
    1015                ENDIF 
    1016             END DO 
    1017          END DO 
    1018          CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1., zcpy, 'V', 1. ) 
     913         DO_2D( 0, 0, 0, 0 ) 
     914          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji+1,jj,Kmm) ) >                & 
     915               &    MAX( -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) .AND.            & 
     916               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) )  & 
     917               &                                                      > rn_wdmin1 + rn_wdmin2 
     918          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. (         & 
     919               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji+1,jj,Kmm) ) >                & 
     920               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     921 
     922          IF(ll_tmp1) THEN 
     923            zcpx(ji,jj) = 1.0_wp 
     924          ELSE IF(ll_tmp2) THEN 
     925            ! no worries about  ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm) = 0, it won't happen ! here 
     926            zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     927                        &    / (ssh(ji+1,jj,Kmm) -  ssh(ji  ,jj,Kmm)) ) 
     928            
     929             zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     930          ELSE 
     931            zcpx(ji,jj) = 0._wp 
     932          END IF 
     933    
     934          ll_tmp1 = MIN(  ssh(ji,jj,Kmm)              ,  ssh(ji,jj+1,Kmm) ) >                & 
     935               &    MAX( -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) .AND.            & 
     936               &    MAX(  ssh(ji,jj,Kmm) + ht_0(ji,jj),  ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) )  & 
     937               &                                                      > rn_wdmin1 + rn_wdmin2 
     938          ll_tmp2 = ( ABS( ssh(ji,jj,Kmm)             -  ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. (      & 
     939               &    MAX(   ssh(ji,jj,Kmm)             ,  ssh(ji,jj+1,Kmm) ) >                & 
     940               &    MAX(  -ht_0(ji,jj)             , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     941 
     942          IF(ll_tmp1) THEN 
     943            zcpy(ji,jj) = 1.0_wp 
     944          ELSE IF(ll_tmp2) THEN 
     945            ! no worries about  ssh(ji,jj+1,Kmm) -  ssh(ji,jj  ,Kmm) = 0, it won't happen ! here 
     946            zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 
     947                        &    / (ssh(ji,jj+1,Kmm) - ssh(ji,jj  ,Kmm)) ) 
     948             zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
     949 
     950            ELSE 
     951               zcpy(ji,jj) = 0._wp 
     952            ENDIF 
     953         END_2D 
     954         CALL lbc_lnk_multi( 'dynhpg', zcpx, 'U', 1.0_wp, zcpy, 'V', 1.0_wp ) 
    1019955      ENDIF 
    1020956 
     
    1024960 
    1025961      ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 
    1026       DO jj = 1, jpj 
    1027         DO ji = 1, jpi 
    1028           jk = mbkt(ji,jj)+1 
    1029           IF(     jk <=  0   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
    1030           ELSEIF( jk ==  1   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
    1031           ELSEIF( jk < jpkm1 ) THEN 
    1032              DO jkk = jk+1, jpk 
    1033                 zrhh(ji,jj,jkk) = interp1(gde3w_n(ji,jj,jkk  ), gde3w_n(ji,jj,jkk-1),   & 
    1034                    &                      gde3w_n(ji,jj,jkk-2), rhd    (ji,jj,jkk-1), rhd(ji,jj,jkk-2)) 
    1035              END DO 
    1036           ENDIF 
    1037         END DO 
    1038       END DO 
     962      DO_2D( 1, 1, 1, 1 ) 
     963       jk = mbkt(ji,jj) 
     964       IF(     jk <=  1   ) THEN   ;   zrhh(ji,jj,    :   ) = 0._wp 
     965       ELSEIF( jk ==  2   ) THEN   ;   zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 
     966       ELSEIF( jk < jpkm1 ) THEN 
     967          DO jkk = jk+1, jpk 
     968             zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   & 
     969                &                      gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 
     970          END DO 
     971       ENDIF 
     972      END_2D 
    1039973 
    1040974      ! Transfer the depth of "T(:,:,:)" to vertical coordinate "zdept(:,:,:)" 
    1041       DO jj = 1, jpj 
    1042          DO ji = 1, jpi 
    1043             zdept(ji,jj,1) = 0.5_wp * e3w_n(ji,jj,1) - sshn(ji,jj) * znad 
    1044          END DO 
    1045       END DO 
    1046  
    1047       DO jk = 2, jpk 
    1048          DO jj = 1, jpj 
    1049             DO ji = 1, jpi 
    1050                zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w_n(ji,jj,jk) 
    1051             END DO 
    1052          END DO 
    1053       END DO 
     975      DO_2D( 1, 1, 1, 1 ) 
     976         zdept(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) - ssh(ji,jj,Kmm) * znad 
     977      END_2D 
     978 
     979      DO_3D( 1, 1, 1, 1, 2, jpk ) 
     980         zdept(ji,jj,jk) = zdept(ji,jj,jk-1) + e3w(ji,jj,jk,Kmm) 
     981      END_3D 
    1054982 
    1055983      fsp(:,:,:) = zrhh (:,:,:) 
     
    1062990 
    1063991      ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 
    1064       DO jj = 2, jpj 
    1065         DO ji = 2, jpi 
    1066           zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
    1067              &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w_n(ji,jj,1) 
    1068  
    1069           ! assuming linear profile across the top half surface layer 
    1070           zhpi(ji,jj,1) =  0.5_wp * e3w_n(ji,jj,1) * zrhdt1 
    1071         END DO 
    1072       END DO 
     992      DO_2D( 0, 1, 0, 1 ) 
     993       zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1),  & 
     994          &                                              csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 
     995 
     996       ! assuming linear profile across the top half surface layer 
     997       zhpi(ji,jj,1) =  0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 
     998      END_2D 
    1073999 
    10741000      ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 
    1075       DO jk = 2, jpkm1 
    1076         DO jj = 2, jpj 
    1077           DO ji = 2, jpi 
    1078             zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
    1079                &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
    1080                &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
    1081                &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
    1082           END DO 
    1083         END DO 
    1084       END DO 
     1001      DO_3D( 0, 1, 0, 1, 2, jpkm1 ) 
     1002      zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) +                                  & 
     1003         &             integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk),   & 
     1004         &                           asp  (ji,jj,jk-1), bsp  (ji,jj,jk-1), & 
     1005         &                           csp  (ji,jj,jk-1), dsp  (ji,jj,jk-1)  ) 
     1006      END_3D 
    10851007 
    10861008      ! Z coordinate of U(ji,jj,1:jpkm1) and V(ji,jj,1:jpkm1) 
    10871009 
    10881010      ! Prepare zsshu_n and zsshv_n 
    1089       DO jj = 2, jpjm1 
    1090         DO ji = 2, jpim1 
     1011      DO_2D( 0, 0, 0, 0 ) 
    10911012!!gm BUG ?    if it is ssh at u- & v-point then it should be: 
    1092 !          zsshu_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji+1,jj) * sshn(ji+1,jj)) * & 
     1013!          zsshu_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji+1,jj) * ssh(ji+1,jj,Kmm)) * & 
    10931014!                         & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1094 !          zsshv_n(ji,jj) = (e1e2t(ji,jj) * sshn(ji,jj) + e1e2t(ji,jj+1) * sshn(ji,jj+1)) * & 
     1015!          zsshv_n(ji,jj) = (e1e2t(ji,jj) * ssh(ji,jj,Kmm) + e1e2t(ji,jj+1) * ssh(ji,jj+1,Kmm)) * & 
    10951016!                         & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    10961017!!gm not this: 
    1097           zsshu_n(ji,jj) = (e1e2u(ji,jj) * sshn(ji,jj) + e1e2u(ji+1, jj) * sshn(ji+1,jj)) * & 
    1098                          & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
    1099           zsshv_n(ji,jj) = (e1e2v(ji,jj) * sshn(ji,jj) + e1e2v(ji+1, jj) * sshn(ji,jj+1)) * & 
    1100                          & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
    1101         END DO 
    1102       END DO 
    1103  
    1104       CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1., zsshv_n, 'V', 1. ) 
    1105  
    1106       DO jj = 2, jpjm1 
    1107         DO ji = 2, jpim1 
    1108           zu(ji,jj,1) = - ( e3u_n(ji,jj,1) - zsshu_n(ji,jj) * znad)  
    1109           zv(ji,jj,1) = - ( e3v_n(ji,jj,1) - zsshv_n(ji,jj) * znad) 
    1110         END DO 
    1111       END DO 
    1112  
    1113       DO jk = 2, jpkm1 
    1114         DO jj = 2, jpjm1 
    1115           DO ji = 2, jpim1 
    1116             zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u_n(ji,jj,jk) 
    1117             zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v_n(ji,jj,jk) 
    1118           END DO 
    1119         END DO 
    1120       END DO 
    1121  
    1122       DO jk = 1, jpkm1 
    1123         DO jj = 2, jpjm1 
    1124           DO ji = 2, jpim1 
    1125             zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u_n(ji,jj,jk) 
    1126             zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v_n(ji,jj,jk) 
    1127           END DO 
    1128         END DO 
    1129       END DO 
    1130  
    1131       DO jk = 1, jpkm1 
    1132         DO jj = 2, jpjm1 
    1133           DO ji = 2, jpim1 
    1134             zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1135             zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
    1136             zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1137             zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
    1138           END DO 
    1139         END DO 
    1140       END DO 
    1141  
    1142  
    1143       DO jk = 1, jpkm1 
    1144         DO jj = 2, jpjm1 
    1145           DO ji = 2, jpim1 
    1146             zpwes = 0._wp; zpwed = 0._wp 
    1147             zpnss = 0._wp; zpnsd = 0._wp 
    1148             zuijk = zu(ji,jj,jk) 
    1149             zvijk = zv(ji,jj,jk) 
    1150  
    1151             !!!!!     for u equation 
    1152             IF( jk <= mbku(ji,jj) ) THEN 
    1153                IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
    1154                  jis = ji + 1; jid = ji 
    1155                ELSE 
    1156                  jis = ji;     jid = ji +1 
    1157                ENDIF 
    1158  
    1159                ! integrate the pressure on the shallow side 
    1160                jk1 = jk 
    1161                DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
    1162                  IF( jk1 == mbku(ji,jj) ) THEN 
    1163                    zuijk = -zdept(jis,jj,jk1) 
    1164                    EXIT 
    1165                  ENDIF 
    1166                  zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
    1167                  zpwes = zpwes +                                    & 
    1168                       integ_spline(zdept(jis,jj,jk1), zdeps,            & 
    1169                              asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
    1170                              csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
    1171                  jk1 = jk1 + 1 
    1172                END DO 
    1173  
    1174                ! integrate the pressure on the deep side 
    1175                jk1 = jk 
    1176                DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
    1177                  IF( jk1 == 1 ) THEN 
    1178                    zdeps = zdept(jid,jj,1) + MIN(zuijk, sshn(jid,jj)*znad) 
    1179                    zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
    1180                                                      bsp(jid,jj,1),   csp(jid,jj,1), & 
    1181                                                      dsp(jid,jj,1)) * zdeps 
    1182                    zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
    1183                    EXIT 
    1184                  ENDIF 
    1185                  zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
    1186                  zpwed = zpwed +                                        & 
    1187                         integ_spline(zdeps,              zdept(jid,jj,jk1), & 
    1188                                asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
    1189                                csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
    1190                  jk1 = jk1 - 1 
    1191                END DO 
    1192  
    1193                ! update the momentum trends in u direction 
    1194  
    1195                zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
    1196                IF( .NOT.ln_linssh ) THEN 
    1197                  zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
    1198                     &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (sshn(ji+1,jj)-sshn(ji,jj)) ) 
    1199                 ELSE 
    1200                  zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
    1201                ENDIF 
    1202                IF( ln_wd_il ) THEN 
    1203                   zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1204                   zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
    1205                ENDIF 
    1206                ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
    1207             ENDIF 
    1208  
    1209             !!!!!     for v equation 
    1210             IF( jk <= mbkv(ji,jj) ) THEN 
    1211                IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
    1212                  jjs = jj + 1; jjd = jj 
    1213                ELSE 
    1214                  jjs = jj    ; jjd = jj + 1 
    1215                ENDIF 
    1216  
    1217                ! integrate the pressure on the shallow side 
    1218                jk1 = jk 
    1219                DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
    1220                  IF( jk1 == mbkv(ji,jj) ) THEN 
    1221                    zvijk = -zdept(ji,jjs,jk1) 
    1222                    EXIT 
    1223                  ENDIF 
    1224                  zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
    1225                  zpnss = zpnss +                                      & 
    1226                         integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
    1227                                asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
    1228                                csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
    1229                  jk1 = jk1 + 1 
    1230                END DO 
    1231  
    1232                ! integrate the pressure on the deep side 
    1233                jk1 = jk 
    1234                DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
    1235                  IF( jk1 == 1 ) THEN 
    1236                    zdeps = zdept(ji,jjd,1) + MIN(zvijk, sshn(ji,jjd)*znad) 
    1237                    zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
    1238                                                      bsp(ji,jjd,1),   csp(ji,jjd,1), & 
    1239                                                      dsp(ji,jjd,1) ) * zdeps 
    1240                    zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
    1241                    EXIT 
    1242                  ENDIF 
    1243                  zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
    1244                  zpnsd = zpnsd +                                        & 
    1245                         integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
    1246                                asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
    1247                                csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
    1248                  jk1 = jk1 - 1 
    1249                END DO 
    1250  
    1251  
    1252                ! update the momentum trends in v direction 
    1253  
    1254                zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
    1255                IF( .NOT.ln_linssh ) THEN 
    1256                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
    1257                           ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (sshn(ji,jj+1)-sshn(ji,jj)) ) 
    1258                ELSE 
    1259                   zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
    1260                ENDIF 
    1261                IF( ln_wd_il ) THEN 
    1262                   zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1263                   zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
    1264                ENDIF 
    1265  
    1266                va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
    1267             ENDIF 
    1268                ! 
    1269             END DO 
     1018       zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 
     1019                      & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp  
     1020       zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 
     1021                      & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp  
     1022      END_2D 
     1023 
     1024      CALL lbc_lnk_multi ('dynhpg', zsshu_n, 'U', 1.0_wp, zsshv_n, 'V', 1.0_wp ) 
     1025 
     1026      DO_2D( 0, 0, 0, 0 ) 
     1027       zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) * znad)  
     1028       zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) * znad) 
     1029      END_2D 
     1030 
     1031      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     1032      zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 
     1033      zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 
     1034      END_3D 
     1035 
     1036      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     1037      zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 
     1038      zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 
     1039      END_3D 
     1040 
     1041      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     1042      zu(ji,jj,jk) = MIN(  zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1043      zu(ji,jj,jk) = MAX(  zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) )  ) 
     1044      zv(ji,jj,jk) = MIN(  zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1045      zv(ji,jj,jk) = MAX(  zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) )  ) 
     1046      END_3D 
     1047 
     1048 
     1049      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     1050      zpwes = 0._wp; zpwed = 0._wp 
     1051      zpnss = 0._wp; zpnsd = 0._wp 
     1052      zuijk = zu(ji,jj,jk) 
     1053      zvijk = zv(ji,jj,jk) 
     1054 
     1055      !!!!!     for u equation 
     1056      IF( jk <= mbku(ji,jj) ) THEN 
     1057         IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 
     1058           jis = ji + 1; jid = ji 
     1059         ELSE 
     1060           jis = ji;     jid = ji +1 
     1061         ENDIF 
     1062 
     1063         ! integrate the pressure on the shallow side 
     1064         jk1 = jk 
     1065         DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 
     1066           IF( jk1 == mbku(ji,jj) ) THEN 
     1067             zuijk = -zdept(jis,jj,jk1) 
     1068             EXIT 
     1069           ENDIF 
     1070           zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 
     1071           zpwes = zpwes +                                    & 
     1072                integ_spline(zdept(jis,jj,jk1), zdeps,            & 
     1073                       asp(jis,jj,jk1),    bsp(jis,jj,jk1), & 
     1074                       csp(jis,jj,jk1),    dsp(jis,jj,jk1)) 
     1075           jk1 = jk1 + 1 
    12701076         END DO 
    1271       END DO 
     1077 
     1078         ! integrate the pressure on the deep side 
     1079         jk1 = jk 
     1080         DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 
     1081           IF( jk1 == 1 ) THEN 
     1082             zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 
     1083             zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 
     1084                                               bsp(jid,jj,1),   csp(jid,jj,1), & 
     1085                                               dsp(jid,jj,1)) * zdeps 
     1086             zpwed  = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 
     1087             EXIT 
     1088           ENDIF 
     1089           zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 
     1090           zpwed = zpwed +                                        & 
     1091                  integ_spline(zdeps,              zdept(jid,jj,jk1), & 
     1092                         asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1),  & 
     1093                         csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 
     1094           jk1 = jk1 - 1 
     1095         END DO 
     1096 
     1097         ! update the momentum trends in u direction 
     1098 
     1099         zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 
     1100         IF( .NOT.ln_linssh ) THEN 
     1101           zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 
     1102              &    ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 
     1103          ELSE 
     1104           zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 
     1105         ENDIF 
     1106         IF( ln_wd_il ) THEN 
     1107            zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1108            zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 
     1109         ENDIF 
     1110         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
     1111      ENDIF 
     1112 
     1113      !!!!!     for v equation 
     1114      IF( jk <= mbkv(ji,jj) ) THEN 
     1115         IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 
     1116           jjs = jj + 1; jjd = jj 
     1117         ELSE 
     1118           jjs = jj    ; jjd = jj + 1 
     1119         ENDIF 
     1120 
     1121         ! integrate the pressure on the shallow side 
     1122         jk1 = jk 
     1123         DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 
     1124           IF( jk1 == mbkv(ji,jj) ) THEN 
     1125             zvijk = -zdept(ji,jjs,jk1) 
     1126             EXIT 
     1127           ENDIF 
     1128           zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 
     1129           zpnss = zpnss +                                      & 
     1130                  integ_spline(zdept(ji,jjs,jk1), zdeps,            & 
     1131                         asp(ji,jjs,jk1),    bsp(ji,jjs,jk1), & 
     1132                         csp(ji,jjs,jk1),    dsp(ji,jjs,jk1) ) 
     1133           jk1 = jk1 + 1 
     1134         END DO 
     1135 
     1136         ! integrate the pressure on the deep side 
     1137         jk1 = jk 
     1138         DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 
     1139           IF( jk1 == 1 ) THEN 
     1140             zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 
     1141             zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 
     1142                                               bsp(ji,jjd,1),   csp(ji,jjd,1), & 
     1143                                               dsp(ji,jjd,1) ) * zdeps 
     1144             zpnsd  = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 
     1145             EXIT 
     1146           ENDIF 
     1147           zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 
     1148           zpnsd = zpnsd +                                        & 
     1149                  integ_spline(zdeps,              zdept(ji,jjd,jk1), & 
     1150                         asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 
     1151                         csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 
     1152           jk1 = jk1 - 1 
     1153         END DO 
     1154 
     1155 
     1156         ! update the momentum trends in v direction 
     1157 
     1158         zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 
     1159         IF( .NOT.ln_linssh ) THEN 
     1160            zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 
     1161                    ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 
     1162         ELSE 
     1163            zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 
     1164         ENDIF 
     1165         IF( ln_wd_il ) THEN 
     1166            zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)  
     1167            zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)  
     1168         ENDIF 
     1169 
     1170         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
     1171      ENDIF 
     1172         ! 
     1173      END_3D 
    12721174      ! 
    12731175      IF( ln_wd_il )   DEALLOCATE( zcpx, zcpy ) 
     
    14671369   !!====================================================================== 
    14681370END MODULE dynhpg 
    1469  
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynkeg.F90

    r10996 r13463  
    3636    
    3737   !! * Substitutions 
    38 #  include "vectopt_loop_substitute.h90" 
     38#  include "do_loop_substitute.h90" 
    3939   !!---------------------------------------------------------------------- 
    4040   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4444CONTAINS 
    4545 
    46    SUBROUTINE dyn_keg( kt, kscheme ) 
     46   SUBROUTINE dyn_keg( kt, kscheme, Kmm, puu, pvv, Krhs ) 
    4747      !!---------------------------------------------------------------------- 
    4848      !!                  ***  ROUTINE dyn_keg  *** 
     
    5757      !!              * kscheme = nkeg_HW : Hollingsworth correction following 
    5858      !!      Arakawa (2001). The now horizontal kinetic energy is given by: 
    59       !!         zhke = 1/6 [ mi-1(  2 * un^2 + ((un(j+1)+un(j-1))/2)^2  ) 
    60       !!                    + mj-1(  2 * vn^2 + ((vn(i+1)+vn(i-1))/2)^2  ) ] 
     59      !!         zhke = 1/6 [ mi-1(  2 * un^2 + ((u(j+1)+u(j-1))/2)^2  ) 
     60      !!                    + mj-1(  2 * vn^2 + ((v(i+1)+v(i-1))/2)^2  ) ] 
    6161      !!       
    6262      !!      Take its horizontal gradient and add it to the general momentum 
    63       !!      trend (ua,va). 
    64       !!         ua = ua - 1/e1u di[ zhke ] 
    65       !!         va = va - 1/e2v dj[ zhke ] 
     63      !!      trend. 
     64      !!         u(rhs) = u(rhs) - 1/e1u di[ zhke ] 
     65      !!         v(rhs) = v(rhs) - 1/e2v dj[ zhke ] 
    6666      !! 
    67       !! ** Action : - Update the (ua, va) with the hor. ke gradient trend 
     67      !! ** Action : - Update the (puu(:,:,:,Krhs), pvv(:,:,:,Krhs)) with the hor. ke gradient trend 
    6868      !!             - send this trends to trd_dyn (l_trddyn=T) for post-processing 
    6969      !! 
     
    7171      !!                 Hollingsworth et al., Quart. J. Roy. Meteor. Soc., 1983. 
    7272      !!---------------------------------------------------------------------- 
    73       INTEGER, INTENT( in ) ::   kt        ! ocean time-step index 
    74       INTEGER, INTENT( in ) ::   kscheme   ! =0/1   type of KEG scheme  
     73      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index 
     74      INTEGER                             , INTENT( in )  ::  kscheme          ! =0/1   type of KEG scheme  
     75      INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices 
     76      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation 
    7577      ! 
    76       INTEGER  ::   ji, jj, jk, jb           ! dummy loop indices 
    77       INTEGER  ::   ifu, ifv, igrd, ib_bdy   ! local integers 
     78      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
    7879      REAL(wp) ::   zu, zv                   ! local scalars 
    7980      REAL(wp), DIMENSION(jpi,jpj,jpk)        ::   zhke 
    8081      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv  
    81       REAL(wp)  :: zweightu, zweightv 
    8282      !!---------------------------------------------------------------------- 
    8383      ! 
     
    9292      IF( l_trddyn ) THEN           ! Save the input trends 
    9393         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    94          ztrdu(:,:,:) = ua(:,:,:)  
    95          ztrdv(:,:,:) = va(:,:,:)  
     94         ztrdu(:,:,:) = puu(:,:,:,Krhs)  
     95         ztrdv(:,:,:) = pvv(:,:,:,Krhs)  
    9696      ENDIF 
    9797       
     
    101101      ! 
    102102      CASE ( nkeg_C2 )                          !--  Standard scheme  --! 
    103          DO jk = 1, jpkm1 
    104             DO jj = 2, jpj 
    105                DO ji = fs_2, jpi   ! vector opt. 
    106                   zu =    un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   & 
    107                      &  + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk) 
    108                   zv =    vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   & 
    109                      &  + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk) 
    110                   zhke(ji,jj,jk) = 0.25_wp * ( zv + zu ) 
    111                END DO   
    112             END DO 
    113          END DO 
    114          ! 
    115          IF (ln_bdy) THEN 
    116             ! Maria Luneva & Fred Wobus: July-2016 
    117             ! compensate for lack of turbulent kinetic energy on liquid bdy points 
    118             DO ib_bdy = 1, nb_bdy 
    119                IF( cn_dyn3d(ib_bdy) /= 'none' ) THEN 
    120                   igrd = 1           ! compensating null velocity on the bdy 
    121                   DO jb = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    122                      ji   = idx_bdy(ib_bdy)%nbi(jb,igrd)   ! maximum extent : from 2 to jpi-1 
    123                      jj   = idx_bdy(ib_bdy)%nbj(jb,igrd)   ! maximum extent : from 2 to jpj-1 
    124                      DO jk = 1, jpkm1 
    125                         zhke(ji,jj,jk) = 0._wp 
    126                         zweightu = umask(ji-1,jj  ,jk) + umask(ji,jj,jk) 
    127                         zweightv = vmask(ji  ,jj-1,jk) + vmask(ji,jj,jk) 
    128                         zu = un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)  +  un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk) 
    129                         zv = vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)  +  vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk) 
    130                         IF( zweightu > 0._wp )   zhke(ji,jj,jk) =  zhke(ji,jj,jk) + zu / (2._wp * zweightu)  
    131                         IF( zweightv > 0._wp )   zhke(ji,jj,jk) =  zhke(ji,jj,jk) + zv / (2._wp * zweightv)  
    132                      END DO 
    133                   END DO 
    134                END IF 
    135                CALL lbc_bdy_lnk( 'dynkeg', zhke, 'T', 1., ib_bdy )   ! send 2 and recv jpi, jpj used in the computation of the speed tendencies 
    136             END DO 
    137          END IF 
    138          ! 
     103         DO_3D( 0, 1, 0, 1, 1, jpkm1 ) 
     104            zu =    puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)   & 
     105               &  + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm) 
     106            zv =    pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)   & 
     107               &  + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm) 
     108            zhke(ji,jj,jk) = 0.25_wp * ( zv + zu ) 
     109         END_3D 
    139110      CASE ( nkeg_HW )                          !--  Hollingsworth scheme  --! 
    140          DO jk = 1, jpkm1 
    141             DO jj = 2, jpjm1        
    142                DO ji = fs_2, jpim1   ! vector opt. 
    143                   zu = 8._wp * ( un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)    & 
    144                      &         + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk) )  & 
    145                      &   +     ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) * ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) )   & 
    146                      &   +     ( un(ji  ,jj-1,jk) + un(ji  ,jj+1,jk) ) * ( un(ji  ,jj-1,jk) + un(ji  ,jj+1,jk) ) 
    147                      ! 
    148                   zv = 8._wp * ( vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)    & 
    149                      &         + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk) )  & 
    150                      &  +      ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) * ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) )   & 
    151                      &  +      ( vn(ji-1,jj  ,jk) + vn(ji+1,jj  ,jk) ) * ( vn(ji-1,jj  ,jk) + vn(ji+1,jj  ,jk) ) 
    152                   zhke(ji,jj,jk) = r1_48 * ( zv + zu ) 
    153                END DO   
    154             END DO 
    155          END DO 
    156          IF (ln_bdy) THEN 
    157             ! Maria Luneva & Fred Wobus: July-2016 
    158             ! compensate for lack of turbulent kinetic energy on liquid bdy points 
    159             DO ib_bdy = 1, nb_bdy 
    160                IF( cn_dyn3d(ib_bdy) /= 'none' ) THEN 
    161                   igrd = 1           ! compensation null velocity on land at the bdy 
    162                   DO jb = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    163                      ji   = idx_bdy(ib_bdy)%nbi(jb,igrd)   ! maximum extent : from 2 to jpi-1 
    164                      jj   = idx_bdy(ib_bdy)%nbj(jb,igrd)   ! maximum extent : from 2 to jpj-1 
    165                      DO jk = 1, jpkm1 
    166                         zhke(ji,jj,jk) = 0._wp 
    167                         zweightu = 8._wp * ( umask(ji-1,jj  ,jk) + umask(ji  ,jj  ,jk) ) & 
    168                              &   + 2._wp * ( umask(ji-1,jj-1,jk) + umask(ji-1,jj+1,jk) + umask(ji  ,jj-1,jk) + umask(ji  ,jj+1,jk) )  
    169                         zweightv = 8._wp * ( vmask(ji  ,jj-1,jk) + vmask(ji  ,jj-1,jk) ) & 
    170                              &   + 2._wp * ( vmask(ji-1,jj-1,jk) + vmask(ji+1,jj-1,jk) + vmask(ji-1,jj  ,jk) + vmask(ji+1,jj  ,jk) ) 
    171                         zu = 8._wp * ( un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)    & 
    172                            &         + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk) )  & 
    173                            &   +     ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) ) * ( un(ji-1,jj-1,jk) + un(ji-1,jj+1,jk) )   & 
    174                            &   +     ( un(ji  ,jj-1,jk) + un(ji  ,jj+1,jk) ) * ( un(ji  ,jj-1,jk) + un(ji  ,jj+1,jk) ) 
    175                         zv = 8._wp * ( vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)    & 
    176                            &         + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk) )  & 
    177                            &  +      ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) ) * ( vn(ji-1,jj-1,jk) + vn(ji+1,jj-1,jk) )   & 
    178                            &  +      ( vn(ji-1,jj  ,jk) + vn(ji+1,jj  ,jk) ) * ( vn(ji-1,jj  ,jk) + vn(ji+1,jj  ,jk) ) 
    179                         IF( zweightu > 0._wp )   zhke(ji,jj,jk) =  zhke(ji,jj,jk) +  zu / ( 2._wp * zweightu ) 
    180                         IF( zweightv > 0._wp )   zhke(ji,jj,jk) =  zhke(ji,jj,jk) +  zv / ( 2._wp * zweightv ) 
    181                      END DO 
    182                   END DO 
    183                END IF 
    184             END DO 
    185          END IF 
    186          CALL lbc_lnk( 'dynkeg', zhke, 'T', 1. ) 
     111         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     112            zu = 8._wp * ( puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)    & 
     113               &         + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm) )  & 
     114               &   +     ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) ) * ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) )   & 
     115               &   +     ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) * ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) 
     116               ! 
     117            zv = 8._wp * ( pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)    & 
     118               &         + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm) )  & 
     119               &  +      ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) )   & 
     120               &  +      ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) * ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) 
     121            zhke(ji,jj,jk) = r1_48 * ( zv + zu ) 
     122         END_3D 
     123         CALL lbc_lnk( 'dynkeg', zhke, 'T', 1.0_wp ) 
    187124         ! 
    188125      END SELECT  
    189126      ! 
    190       DO jk = 1, jpkm1                    !==  grad( KE ) added to the general momentum trends  ==! 
    191          DO jj = 2, jpjm1 
    192             DO ji = fs_2, fs_jpim1   ! vector opt. 
    193                ua(ji,jj,jk) = ua(ji,jj,jk) - ( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 
    194                va(ji,jj,jk) = va(ji,jj,jk) - ( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 
    195             END DO  
    196          END DO 
    197       END DO 
     127      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     128         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj) 
     129         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj) 
     130      END_3D 
    198131      ! 
    199132      IF( l_trddyn ) THEN                 ! save the Kinetic Energy trends for diagnostic 
    200          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    201          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    202          CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt ) 
     133         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     134         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     135         CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt, Kmm ) 
    203136         DEALLOCATE( ztrdu , ztrdv ) 
    204137      ENDIF 
    205138      ! 
    206       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' keg  - Ua: ', mask1=umask,   & 
    207          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     139      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' keg  - Ua: ', mask1=umask,   & 
     140         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    208141      ! 
    209142      IF( ln_timing )   CALL timing_stop('dyn_keg') 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynldf.F90

    r10068 r13463  
    3434   PUBLIC   dyn_ldf_init  ! called by opa  module  
    3535 
    36    !! * Substitutions 
    37 #  include "vectopt_loop_substitute.h90" 
    3836   !!---------------------------------------------------------------------- 
    3937   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4341CONTAINS 
    4442 
    45    SUBROUTINE dyn_ldf( kt ) 
     43   SUBROUTINE dyn_ldf( kt, Kbb, Kmm, puu, pvv, Krhs ) 
    4644      !!---------------------------------------------------------------------- 
    4745      !!                  ***  ROUTINE dyn_ldf  *** 
     
    4947      !! ** Purpose :   compute the lateral ocean dynamics physics. 
    5048      !!---------------------------------------------------------------------- 
    51       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     49      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index 
     50      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices 
     51      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation 
    5252      ! 
    5353      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
     
    5858      IF( l_trddyn )   THEN                      ! temporary save of momentum trends 
    5959         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
    60          ztrdu(:,:,:) = ua(:,:,:)  
    61          ztrdv(:,:,:) = va(:,:,:)  
     60         ztrdu(:,:,:) = puu(:,:,:,Krhs)  
     61         ztrdv(:,:,:) = pvv(:,:,:,Krhs)  
    6262      ENDIF 
    6363 
    6464      SELECT CASE ( nldf_dyn )                   ! compute lateral mixing trend and add it to the general trend 
    6565      ! 
    66       CASE ( np_lap   )    ;   CALL dyn_ldf_lap( kt, ub, vb, ua, va, 1 )      ! iso-level    laplacian 
    67       CASE ( np_lap_i )    ;   CALL dyn_ldf_iso( kt )                         ! rotated      laplacian 
    68       CASE ( np_blp   )    ;   CALL dyn_ldf_blp( kt, ub, vb, ua, va    )      ! iso-level bi-laplacian 
     66      CASE ( np_lap   )   
     67         CALL dyn_ldf_lap( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs), 1 ) ! iso-level    laplacian 
     68      CASE ( np_lap_i )  
     69         CALL dyn_ldf_iso( kt, Kbb, Kmm, puu, pvv, Krhs    )                                                   ! rotated      laplacian 
     70      CASE ( np_blp   )   
     71         CALL dyn_ldf_blp( kt, Kbb, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs)    ) ! iso-level bi-laplacian 
    6972      ! 
    7073      END SELECT 
    7174 
    7275      IF( l_trddyn ) THEN                        ! save the horizontal diffusive trends for further diagnostics 
    73          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    74          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    75          CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt ) 
     76         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     77         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     78         CALL trd_dyn( ztrdu, ztrdv, jpdyn_ldf, kt, Kmm ) 
    7679         DEALLOCATE ( ztrdu , ztrdv ) 
    7780      ENDIF 
    7881      !                                          ! print sum trends (used for debugging) 
    79       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' ldf  - Ua: ', mask1=umask,   & 
    80          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     82      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ldf  - Ua: ', mask1=umask,   & 
     83         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    8184      ! 
    8285      IF( ln_timing )   CALL timing_stop('dyn_ldf') 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynldf_iso.F90

    r10425 r13463  
    4141 
    4242   !! * Substitutions 
    43 #  include "vectopt_loop_substitute.h90" 
     43#  include "do_loop_substitute.h90" 
     44#  include "domzgr_substitute.h90" 
    4445   !!---------------------------------------------------------------------- 
    4546   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    6061 
    6162 
    62    SUBROUTINE dyn_ldf_iso( kt ) 
     63   SUBROUTINE dyn_ldf_iso( kt, Kbb, Kmm, puu, pvv, Krhs ) 
    6364      !!---------------------------------------------------------------------- 
    6465      !!                     ***  ROUTINE dyn_ldf_iso  *** 
     
    8182      !!      horizontal fluxes associated with the rotated lateral mixing: 
    8283      !!      u-component: 
    83       !!         ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t  di[ ub ] 
    84       !!               -  ahmt              e2t * mi-1(uslp) dk[ mi(mk(ub)) ] 
    85       !!         zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f  dj[ ub ] 
    86       !!               -  ahmf              e1f * mi(vslp)   dk[ mj(mk(ub)) ] 
     84      !!         ziut = ( ahmt + rn_ahm_b ) e2t * e3t / e1t  di[ uu ] 
     85      !!               -  ahmt              e2t * mi-1(uslp) dk[ mi(mk(uu)) ] 
     86      !!         zjuf = ( ahmf + rn_ahm_b ) e1f * e3f / e2f  dj[ uu ] 
     87      !!               -  ahmf              e1f * mi(vslp)   dk[ mj(mk(uu)) ] 
    8788      !!      v-component: 
    88       !!         zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t  di[ vb ] 
    89       !!               -  ahmf              e2t * mj(uslp)   dk[ mi(mk(vb)) ] 
    90       !!         zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f  dj[ ub ] 
    91       !!               -  ahmt              e1f * mj-1(vslp) dk[ mj(mk(vb)) ] 
     89      !!         zivf = ( ahmf + rn_ahm_b ) e2t * e3t / e1t  di[ vv ] 
     90      !!               -  ahmf              e2t * mj(uslp)   dk[ mi(mk(vv)) ] 
     91      !!         zjvt = ( ahmt + rn_ahm_b ) e1f * e3f / e2f  dj[ vv ] 
     92      !!               -  ahmt              e1f * mj-1(vslp) dk[ mj(mk(vv)) ] 
    9293      !!      take the horizontal divergence of the fluxes: 
    9394      !!         diffu = 1/(e1u*e2u*e3u) {  di  [ ziut ] + dj-1[ zjuf ]  } 
    9495      !!         diffv = 1/(e1v*e2v*e3v) {  di-1[ zivf ] + dj  [ zjvt ]  } 
    95       !!      Add this trend to the general trend (ua,va): 
    96       !!         ua = ua + diffu 
     96      !!      Add this trend to the general trend (uu(rhs),vv(rhs)): 
     97      !!         uu(rhs) = uu(rhs) + diffu 
    9798      !!      CAUTION: here the isopycnal part is with a coeff. of aht. This 
    9899      !!      should be modified for applications others than orca_r2 (!!bug) 
    99100      !! 
    100101      !! ** Action : 
    101       !!       -(ua,va) updated with the before geopotential harmonic mixing trend 
     102      !!       -(puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) updated with the before geopotential harmonic mixing trend 
    102103      !!       -(akzu,akzv) to accompt for the diagonal vertical component 
    103104      !!                    of the rotated operator in dynzdf module 
    104105      !!---------------------------------------------------------------------- 
    105       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     106      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index 
     107      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices 
     108      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation 
    106109      ! 
    107110      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    125128      IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 
    126129         ! 
    127          DO jk = 1, jpk         ! set the slopes of iso-level 
    128             DO jj = 2, jpjm1 
    129                DO ji = 2, jpim1 
    130                   uslp (ji,jj,jk) = - ( gdept_b(ji+1,jj,jk) - gdept_b(ji ,jj ,jk) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 
    131                   vslp (ji,jj,jk) = - ( gdept_b(ji,jj+1,jk) - gdept_b(ji ,jj ,jk) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 
    132                   wslpi(ji,jj,jk) = - ( gdepw_b(ji+1,jj,jk) - gdepw_b(ji-1,jj,jk) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5 
    133                   wslpj(ji,jj,jk) = - ( gdepw_b(ji,jj+1,jk) - gdepw_b(ji,jj-1,jk) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5 
    134                END DO 
    135             END DO 
    136          END DO 
     130         DO_3D( 0, 0, 0, 0, 1, jpk ) 
     131            uslp (ji,jj,jk) = - ( gdept(ji+1,jj,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 
     132            vslp (ji,jj,jk) = - ( gdept(ji,jj+1,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 
     133            wslpi(ji,jj,jk) = - ( gdepw(ji+1,jj,jk,Kbb) - gdepw(ji-1,jj,jk,Kbb) ) * r1_e1t(ji,jj) * tmask(ji,jj,jk) * 0.5 
     134            wslpj(ji,jj,jk) = - ( gdepw(ji,jj+1,jk,Kbb) - gdepw(ji,jj-1,jk,Kbb) ) * r1_e2t(ji,jj) * tmask(ji,jj,jk) * 0.5 
     135         END_3D 
    137136         ! Lateral boundary conditions on the slopes 
    138          CALL lbc_lnk_multi( 'dynldf_iso', uslp , 'U', -1., vslp , 'V', -1., wslpi, 'W', -1., wslpj, 'W', -1. ) 
     137         CALL lbc_lnk_multi( 'dynldf_iso', uslp , 'U', -1.0_wp, vslp , 'V', -1.0_wp, wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp ) 
    139138         ! 
    140139       ENDIF 
     
    151150         !                             zdkv(jk=1)=zdkv(jk=2) 
    152151 
    153          zdk1u(:,:) = ( ub(:,:,jk) -ub(:,:,jk+1) ) * umask(:,:,jk+1) 
    154          zdk1v(:,:) = ( vb(:,:,jk) -vb(:,:,jk+1) ) * vmask(:,:,jk+1) 
     152         zdk1u(:,:) = ( puu(:,:,jk,Kbb) -puu(:,:,jk+1,Kbb) ) * umask(:,:,jk+1) 
     153         zdk1v(:,:) = ( pvv(:,:,jk,Kbb) -pvv(:,:,jk+1,Kbb) ) * vmask(:,:,jk+1) 
    155154 
    156155         IF( jk == 1 ) THEN 
     
    158157            zdkv(:,:) = zdk1v(:,:) 
    159158         ELSE 
    160             zdku(:,:) = ( ub(:,:,jk-1) - ub(:,:,jk) ) * umask(:,:,jk) 
    161             zdkv(:,:) = ( vb(:,:,jk-1) - vb(:,:,jk) ) * vmask(:,:,jk) 
     159            zdku(:,:) = ( puu(:,:,jk-1,Kbb) - puu(:,:,jk,Kbb) ) * umask(:,:,jk) 
     160            zdkv(:,:) = ( pvv(:,:,jk-1,Kbb) - pvv(:,:,jk,Kbb) ) * vmask(:,:,jk) 
    162161         ENDIF 
    163162 
     
    169168 
    170169         IF( ln_zps ) THEN      ! z-coordinate - partial steps : min(e3u) 
    171             DO jj = 2, jpjm1 
    172                DO ji = fs_2, jpi   ! vector opt. 
    173                   zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * MIN( e3u_n(ji,jj,jk), e3u_n(ji-1,jj,jk) ) * r1_e1t(ji,jj) 
    174  
    175                   zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)     & 
    176                      &                 + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
    177  
    178                   zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    179     
    180                   ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )    & 
    181                      &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)      & 
    182                      &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
    183                END DO 
    184             END DO 
     170            DO_2D( 0, 0, 0, 1 ) 
     171               zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj)   & 
     172                  &    * MIN( e3u(ji  ,jj,jk,Kmm),                & 
     173                  &           e3u(ji-1,jj,jk,Kmm) ) * r1_e1t(ji,jj) 
     174 
     175               zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  )+umask(ji,jj,jk+1)     & 
     176                  &                 + umask(ji-1,jj,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
     177 
     178               zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     179 
     180               ziut(ji,jj) = (  zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) )    & 
     181                  &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)      & 
     182                  &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
     183            END_2D 
    185184         ELSE                   ! other coordinate system (zco or sco) : e3t 
    186             DO jj = 2, jpjm1 
    187                DO ji = fs_2, jpi   ! vector opt. 
    188                   zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e2t(ji,jj) * e3t_n(ji,jj,jk) * r1_e1t(ji,jj) 
    189  
    190                   zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  ) + umask(ji,jj,jk+1)     & 
    191                      &                 + umask(ji-1,jj,jk+1) + umask(ji,jj,jk  ) , 1._wp ) 
    192  
    193                   zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
    194  
    195                   ziut(ji,jj) = (  zabe1 * ( ub(ji,jj,jk) - ub(ji-1,jj,jk) )   & 
    196                      &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     & 
    197                      &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
    198                END DO 
    199             END DO 
     185            DO_2D( 0, 0, 0, 1 ) 
     186               zabe1 = ( ahmt(ji,jj,jk)+rn_ahm_b )   & 
     187                  &     * e2t(ji,jj) * e3t(ji,jj,jk,Kmm) * r1_e1t(ji,jj) 
     188 
     189               zmskt = 1._wp / MAX(   umask(ji-1,jj,jk  ) + umask(ji,jj,jk+1)     & 
     190                  &                 + umask(ji-1,jj,jk+1) + umask(ji,jj,jk  ) , 1._wp ) 
     191 
     192               zcof1 = - zaht_0 * e2t(ji,jj) * zmskt * 0.5  * ( uslp(ji-1,jj,jk) + uslp(ji,jj,jk) ) 
     193 
     194               ziut(ji,jj) = (  zabe1 * ( puu(ji,jj,jk,Kbb) - puu(ji-1,jj,jk,Kbb) )   & 
     195                  &           + zcof1 * ( zdku (ji,jj) + zdk1u(ji-1,jj)     & 
     196                  &                      +zdk1u(ji,jj) + zdku (ji-1,jj) )  ) * tmask(ji,jj,jk) 
     197            END_2D 
    200198         ENDIF 
    201199 
    202200         ! j-flux at f-point 
    203          DO jj = 1, jpjm1 
    204             DO ji = 1, fs_jpim1   ! vector opt. 
    205                zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e1f(ji,jj) * e3f_n(ji,jj,jk) * r1_e2f(ji,jj) 
    206  
    207                zmskf = 1._wp / MAX(   umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)     & 
    208                   &                 + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
    209  
    210                zcof2 = - zaht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
    211  
    212                zjuf(ji,jj) = (  zabe2 * ( ub(ji,jj+1,jk) - ub(ji,jj,jk) )   & 
    213                   &           + zcof2 * ( zdku (ji,jj+1) + zdk1u(ji,jj)     & 
    214                   &                      +zdk1u(ji,jj+1) + zdku (ji,jj) )  ) * fmask(ji,jj,jk) 
    215             END DO 
    216          END DO 
     201         DO_2D( 1, 0, 1, 0 ) 
     202            zabe2 = ( ahmf(ji,jj,jk) + rn_ahm_b )   & 
     203               &     * e1f(ji,jj) * e3f(ji,jj,jk) * r1_e2f(ji,jj) 
     204 
     205            zmskf = 1._wp / MAX(   umask(ji,jj+1,jk  )+umask(ji,jj,jk+1)     & 
     206               &                 + umask(ji,jj+1,jk+1)+umask(ji,jj,jk  ) , 1._wp ) 
     207 
     208            zcof2 = - zaht_0 * e1f(ji,jj) * zmskf * 0.5  * ( vslp(ji+1,jj,jk) + vslp(ji,jj,jk) ) 
     209 
     210            zjuf(ji,jj) = (  zabe2 * ( puu(ji,jj+1,jk,Kbb) - puu(ji,jj,jk,Kbb) )   & 
     211               &           + zcof2 * ( zdku (ji,jj+1) + zdk1u(ji,jj)     & 
     212               &                      +zdk1u(ji,jj+1) + zdku (ji,jj) )  ) * fmask(ji,jj,jk) 
     213         END_2D 
    217214 
    218215         !                                |   t   | 
     
    222219         ! i-flux at f-point              |   t   | 
    223220 
    224          DO jj = 2, jpjm1 
    225             DO ji = 1, fs_jpim1   ! vector opt. 
    226                zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b ) * e2f(ji,jj) * e3f_n(ji,jj,jk) * r1_e1f(ji,jj) 
    227  
    228                zmskf = 1._wp / MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)     & 
    229                   &                + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
    230  
    231                zcof1 = - zaht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
    232  
    233                zivf(ji,jj) = (  zabe1 * ( vb(ji+1,jj,jk) - vb(ji,jj,jk) )    & 
    234                   &           + zcof1 * (  zdkv (ji,jj) + zdk1v(ji+1,jj)      & 
    235                   &                      + zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk) 
    236             END DO 
    237          END DO 
     221         DO_2D( 0, 0, 1, 0 ) 
     222            zabe1 = ( ahmf(ji,jj,jk) + rn_ahm_b )   & 
     223               &     * e2f(ji,jj) * e3f(ji,jj,jk) * r1_e1f(ji,jj) 
     224 
     225            zmskf = 1._wp / MAX(  vmask(ji+1,jj,jk  )+vmask(ji,jj,jk+1)     & 
     226               &                + vmask(ji+1,jj,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
     227 
     228            zcof1 = - zaht_0 * e2f(ji,jj) * zmskf * 0.5 * ( uslp(ji,jj+1,jk) + uslp(ji,jj,jk) ) 
     229 
     230            zivf(ji,jj) = (  zabe1 * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji,jj,jk,Kbb) )    & 
     231               &           + zcof1 * (  zdkv (ji,jj) + zdk1v(ji+1,jj)      & 
     232               &                      + zdk1v(ji,jj) + zdkv (ji+1,jj) )  ) * fmask(ji,jj,jk) 
     233         END_2D 
    238234 
    239235         ! j-flux at t-point 
    240236         IF( ln_zps ) THEN      ! z-coordinate - partial steps : min(e3u) 
    241             DO jj = 2, jpj 
    242                DO ji = 1, fs_jpim1   ! vector opt. 
    243                   zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * MIN( e3v_n(ji,jj,jk), e3v_n(ji,jj-1,jk) ) * r1_e2t(ji,jj) 
    244  
    245                   zmskt = 1._wp / MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)     & 
    246                      &                + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
    247  
    248                   zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    249  
    250                   zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )    & 
    251                      &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)      & 
    252                      &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
    253                END DO 
    254             END DO 
     237            DO_2D( 0, 1, 1, 0 ) 
     238               zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj)   & 
     239                  &     * MIN( e3v(ji,jj  ,jk,Kmm),                 & 
     240                  &            e3v(ji,jj-1,jk,Kmm) ) * r1_e2t(ji,jj) 
     241 
     242               zmskt = 1._wp / MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)     & 
     243                  &                + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ) , 1._wp ) 
     244 
     245               zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     246 
     247               zjvt(ji,jj) = (  zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) )    & 
     248                  &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)      & 
     249                  &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
     250            END_2D 
    255251         ELSE                   ! other coordinate system (zco or sco) : e3t 
    256             DO jj = 2, jpj 
    257                DO ji = 1, fs_jpim1   ! vector opt. 
    258                   zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b ) * e1t(ji,jj) * e3t_n(ji,jj,jk) * r1_e2t(ji,jj) 
    259  
    260                   zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
    261                      &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
    262  
    263                   zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
    264  
    265                   zjvt(ji,jj) = (  zabe2 * ( vb(ji,jj,jk) - vb(ji,jj-1,jk) )   & 
    266                      &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)     & 
    267                      &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
    268                END DO 
    269             END DO 
     252            DO_2D( 0, 1, 1, 0 ) 
     253               zabe2 = ( ahmt(ji,jj,jk)+rn_ahm_b )   & 
     254                  &     * e1t(ji,jj) * e3t(ji,jj,jk,Kmm) * r1_e2t(ji,jj) 
     255 
     256               zmskt = 1./MAX(  vmask(ji,jj-1,jk  )+vmask(ji,jj,jk+1)   & 
     257                  &           + vmask(ji,jj-1,jk+1)+vmask(ji,jj,jk  ), 1. ) 
     258 
     259               zcof2 = - zaht_0 * e1t(ji,jj) * zmskt * 0.5 * ( vslp(ji,jj-1,jk) + vslp(ji,jj,jk) ) 
     260 
     261               zjvt(ji,jj) = (  zabe2 * ( pvv(ji,jj,jk,Kbb) - pvv(ji,jj-1,jk,Kbb) )   & 
     262                  &           + zcof2 * ( zdkv (ji,jj-1) + zdk1v(ji,jj)     & 
     263                  &                      +zdk1v(ji,jj-1) + zdkv (ji,jj) )  ) * tmask(ji,jj,jk) 
     264            END_2D 
    270265         ENDIF 
    271266 
     
    273268         ! Second derivative (divergence) and add to the general trend 
    274269         ! ----------------------------------------------------------- 
    275          DO jj = 2, jpjm1 
    276             DO ji = 2, jpim1          !!gm Question vectop possible??? !!bug 
    277                ua(ji,jj,jk) = ua(ji,jj,jk) + (  ziut(ji+1,jj) - ziut(ji,jj  )    & 
    278                   &                           + zjuf(ji  ,jj) - zjuf(ji,jj-1)  ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    279                va(ji,jj,jk) = va(ji,jj,jk) + (  zivf(ji,jj  ) - zivf(ji-1,jj)    & 
    280                   &                           + zjvt(ji,jj+1) - zjvt(ji,jj  )  ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    281             END DO 
    282          END DO 
     270         DO_2D( 0, 0, 0, 0 ) 
     271            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (  ziut(ji+1,jj) - ziut(ji,jj  )    & 
     272               &                           + zjuf(ji  ,jj) - zjuf(ji,jj-1)  ) * r1_e1e2u(ji,jj)   & 
     273               &                           / e3u(ji,jj,jk,Kmm) 
     274            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (  zivf(ji,jj  ) - zivf(ji-1,jj)    & 
     275               &                           + zjvt(ji,jj+1) - zjvt(ji,jj  )  ) * r1_e1e2v(ji,jj)   & 
     276               &                           / e3v(ji,jj,jk,Kmm) 
     277         END_2D 
    283278         !                                             ! =============== 
    284279      END DO                                           !   End of slab 
     
    286281 
    287282      ! print sum trends (used for debugging) 
    288       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' ldfh - Ua: ', mask1=umask, & 
    289          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     283      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ldfh - Ua: ', mask1=umask, & 
     284         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    290285 
    291286 
     
    306301            DO ji = 2, jpi 
    307302               ! i-gradient of u at jj 
    308                zdiu (ji,jk) = tmask(ji,jj  ,jk) * ( ub(ji,jj  ,jk) - ub(ji-1,jj  ,jk) ) 
     303               zdiu (ji,jk) = tmask(ji,jj  ,jk) * ( puu(ji,jj  ,jk,Kbb) - puu(ji-1,jj  ,jk,Kbb) ) 
    309304               ! j-gradient of u and v at jj 
    310                zdju (ji,jk) = fmask(ji,jj  ,jk) * ( ub(ji,jj+1,jk) - ub(ji  ,jj  ,jk) ) 
    311                zdjv (ji,jk) = tmask(ji,jj  ,jk) * ( vb(ji,jj  ,jk) - vb(ji  ,jj-1,jk) ) 
     305               zdju (ji,jk) = fmask(ji,jj  ,jk) * ( puu(ji,jj+1,jk,Kbb) - puu(ji  ,jj  ,jk,Kbb) ) 
     306               zdjv (ji,jk) = tmask(ji,jj  ,jk) * ( pvv(ji,jj  ,jk,Kbb) - pvv(ji  ,jj-1,jk,Kbb) ) 
    312307               ! j-gradient of u and v at jj+1 
    313                zdj1u(ji,jk) = fmask(ji,jj-1,jk) * ( ub(ji,jj  ,jk) - ub(ji  ,jj-1,jk) ) 
    314                zdj1v(ji,jk) = tmask(ji,jj+1,jk) * ( vb(ji,jj+1,jk) - vb(ji  ,jj  ,jk) ) 
     308               zdj1u(ji,jk) = fmask(ji,jj-1,jk) * ( puu(ji,jj  ,jk,Kbb) - puu(ji  ,jj-1,jk,Kbb) ) 
     309               zdj1v(ji,jk) = tmask(ji,jj+1,jk) * ( pvv(ji,jj+1,jk,Kbb) - pvv(ji  ,jj  ,jk,Kbb) ) 
    315310            END DO 
    316311         END DO 
     
    318313            DO ji = 1, jpim1 
    319314               ! i-gradient of v at jj 
    320                zdiv (ji,jk) = fmask(ji,jj  ,jk) * ( vb(ji+1,jj,jk) - vb(ji  ,jj  ,jk) ) 
     315               zdiv (ji,jk) = fmask(ji,jj  ,jk) * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji  ,jj  ,jk,Kbb) ) 
    321316            END DO 
    322317         END DO 
     
    391386         DO jk = 1, jpkm1 
    392387            DO ji = 2, jpim1 
    393                ua(ji,jj,jk) = ua(ji,jj,jk) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    394                va(ji,jj,jk) = va(ji,jj,jk) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
     388               puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj)   & 
     389                  &               / e3u(ji,jj,jk,Kmm) 
     390               pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + ( zfvw(ji,jk) - zfvw(ji,jk+1) ) * r1_e1e2v(ji,jj)   & 
     391                  &               / e3v(ji,jj,jk,Kmm) 
    395392            END DO 
    396393         END DO 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynldf_lap_blp.F90

    r10425 r13463  
    2727 
    2828   !! * Substitutions 
    29 #  include "vectopt_loop_substitute.h90" 
     29#  include "do_loop_substitute.h90" 
     30#  include "domzgr_substitute.h90" 
    3031   !!---------------------------------------------------------------------- 
    3132   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    3536CONTAINS 
    3637 
    37    SUBROUTINE dyn_ldf_lap( kt, pub, pvb, pua, pva, kpass ) 
     38   SUBROUTINE dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 
    3839      !!---------------------------------------------------------------------- 
    3940      !!                     ***  ROUTINE dyn_ldf_lap  *** 
     
    4546      !!      writen as :   grad_h( ahmt div_h(U )) - curl_h( ahmf curl_z(U) )  
    4647      !! 
    47       !! ** Action : - pua, pva increased by the harmonic operator applied on pub, pvb. 
     48      !! ** Action : - pu_rhs, pv_rhs increased by the harmonic operator applied on pu, pv. 
    4849      !!---------------------------------------------------------------------- 
    4950      INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index 
     51      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices 
    5052      INTEGER                         , INTENT(in   ) ::   kpass      ! =1/2 first or second passage 
    51       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pub, pvb   ! before velocity  [m/s] 
    52       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva   ! velocity trend   [m/s2] 
     53      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity  [m/s] 
     54      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2] 
    5355      ! 
    5456      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    7173      DO jk = 1, jpkm1                                 ! Horizontal slab 
    7274         !                                             ! =============== 
    73          DO jj = 2, jpj 
    74             DO ji = fs_2, jpi   ! vector opt. 
    75                !                                      ! ahm * e3 * curl  (computed from 1 to jpim1/jpjm1) 
    76 !!gm open question here : e3f  at before or now ?    probably now... 
    77 !!gm note that ahmf has already been multiplied by fmask 
    78                zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f_n(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       & 
    79                   &     * (  e2v(ji  ,jj-1) * pvb(ji  ,jj-1,jk) - e2v(ji-1,jj-1) * pvb(ji-1,jj-1,jk)  & 
    80                   &        - e1u(ji-1,jj  ) * pub(ji-1,jj  ,jk) + e1u(ji-1,jj-1) * pub(ji-1,jj-1,jk)  ) 
    81                !                                      ! ahm * div        (computed from 2 to jpi/jpj) 
    82 !!gm note that ahmt has already been multiplied by tmask 
    83                zdiv(ji,jj)     = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t_b(ji,jj,jk)                                         & 
    84                   &     * (  e2u(ji,jj)*e3u_b(ji,jj,jk) * pub(ji,jj,jk) - e2u(ji-1,jj)*e3u_b(ji-1,jj,jk) * pub(ji-1,jj,jk)  & 
    85                   &        + e1v(ji,jj)*e3v_b(ji,jj,jk) * pvb(ji,jj,jk) - e1v(ji,jj-1)*e3v_b(ji,jj-1,jk) * pvb(ji,jj-1,jk)  ) 
    86             END DO   
    87          END DO   
     75         DO_2D( 0, 1, 0, 1 ) 
     76            !                                      ! ahm * e3 * curl  (computed from 1 to jpim1/jpjm1) 
     77            zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1)       &   ! ahmf already * by fmask 
     78               &     * (  e2v(ji  ,jj-1) * pv(ji  ,jj-1,jk) - e2v(ji-1,jj-1) * pv(ji-1,jj-1,jk)  & 
     79               &        - e1u(ji-1,jj  ) * pu(ji-1,jj  ,jk) + e1u(ji-1,jj-1) * pu(ji-1,jj-1,jk)  ) 
     80            !                                      ! ahm * div        (computed from 2 to jpi/jpj) 
     81            zdiv(ji,jj)     = ahmt(ji,jj,jk) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kbb)               &   ! ahmt already * by tmask 
     82               &     * (  e2u(ji,jj)*e3u(ji,jj,jk,Kbb) * pu(ji,jj,jk) - e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kbb) * pu(ji-1,jj,jk)  & 
     83               &        + e1v(ji,jj)*e3v(ji,jj,jk,Kbb) * pv(ji,jj,jk) - e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kbb) * pv(ji,jj-1,jk)  ) 
     84         END_2D 
    8885         ! 
    89          DO jj = 2, jpjm1                             ! - curl( curl) + grad( div ) 
    90             DO ji = fs_2, fs_jpim1   ! vector opt. 
    91                pua(ji,jj,jk) = pua(ji,jj,jk) + zsign * (                                                 & 
    92                   &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u_n(ji,jj,jk)   & 
    93                   &              + ( zdiv(ji+1,jj) - zdiv(ji,jj  ) ) * r1_e1u(ji,jj)                     ) 
    94                   ! 
    95                pva(ji,jj,jk) = pva(ji,jj,jk) + zsign * (                                                 & 
    96                   &                ( zcur(ji,jj  ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v_n(ji,jj,jk)   & 
    97                   &              + ( zdiv(ji,jj+1) - zdiv(ji  ,jj) ) * r1_e2v(ji,jj)                     ) 
    98             END DO 
    99          END DO 
     86         DO_2D( 0, 0, 0, 0 ) 
     87            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * umask(ji,jj,jk) * (    &    ! * by umask is mandatory for dyn_ldf_blp use 
     88               &              - ( zcur(ji  ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   & 
     89               &              + ( zdiv(ji+1,jj) - zdiv(ji,jj  ) ) * r1_e1u(ji,jj)                      ) 
     90               ! 
     91            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zsign * vmask(ji,jj,jk) * (    &    ! * by vmask is mandatory for dyn_ldf_blp use 
     92               &                ( zcur(ji,jj  ) - zcur(ji-1,jj) ) * r1_e1v(ji,jj) / e3v(ji,jj,jk,Kmm)   & 
     93               &              + ( zdiv(ji,jj+1) - zdiv(ji  ,jj) ) * r1_e2v(ji,jj)                      ) 
     94         END_2D 
    10095         !                                             ! =============== 
    10196      END DO                                           !   End of slab 
     
    105100 
    106101 
    107    SUBROUTINE dyn_ldf_blp( kt, pub, pvb, pua, pva ) 
     102   SUBROUTINE dyn_ldf_blp( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs ) 
    108103      !!---------------------------------------------------------------------- 
    109104      !!                 ***  ROUTINE dyn_ldf_blp  *** 
     
    116111      !!      It is computed by two successive calls to dyn_ldf_lap routine 
    117112      !! 
    118       !! ** Action :   pta   updated with the before rotated bilaplacian diffusion 
     113      !! ** Action :   pt(:,:,:,:,Krhs)   updated with the before rotated bilaplacian diffusion 
    119114      !!---------------------------------------------------------------------- 
    120115      INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index 
    121       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pub, pvb   ! before velocity fields 
    122       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva   ! momentum trend 
     116      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices 
     117      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity fields 
     118      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! momentum trend 
    123119      ! 
    124120      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zulap, zvlap   ! laplacian at u- and v-point 
     
    134130      zvlap(:,:,:) = 0._wp 
    135131      ! 
    136       CALL dyn_ldf_lap( kt, pub, pvb, zulap, zvlap, 1 )   ! rotated laplacian applied to ptb (output in zlap) 
     132      CALL dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, zulap, zvlap, 1 )   ! rotated laplacian applied to pt (output in zlap,Kbb) 
    137133      ! 
    138       CALL lbc_lnk_multi( 'dynldf_lap_blp', zulap, 'U', -1., zvlap, 'V', -1. )             ! Lateral boundary conditions 
     134      CALL lbc_lnk_multi( 'dynldf_lap_blp', zulap, 'U', -1.0_wp, zvlap, 'V', -1.0_wp )             ! Lateral boundary conditions 
    139135      ! 
    140       CALL dyn_ldf_lap( kt, zulap, zvlap, pua, pva, 2 )   ! rotated laplacian applied to zlap (output in pta) 
     136      CALL dyn_ldf_lap( kt, Kbb, Kmm, zulap, zvlap, pu_rhs, pv_rhs, 2 )   ! rotated laplacian applied to zlap (output in pt(:,:,:,:,Krhs)) 
    141137      ! 
    142138   END SUBROUTINE dyn_ldf_blp 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynspg.F90

    r10068 r13463  
    2121   USE dynspg_exp     ! surface pressure gradient     (dyn_spg_exp routine) 
    2222   USE dynspg_ts      ! surface pressure gradient     (dyn_spg_ts  routine) 
    23    USE sbctide        !  
    24    USE updtide        !  
     23   USE tide_mod       ! 
    2524   USE trd_oce        ! trends: ocean variables 
    2625   USE trddyn         ! trend manager: dynamics 
     
    4342   INTEGER, PARAMETER ::   np_EXP = 0   !       explicit time stepping 
    4443   INTEGER, PARAMETER ::   np_NO  =-1   ! no surface pressure gradient, no scheme 
     44   ! 
     45   REAL(wp) ::   zt0step !   Time of day at the beginning of the time step 
    4546 
    4647   !! * Substitutions 
    47 #  include "vectopt_loop_substitute.h90" 
     48#  include "do_loop_substitute.h90" 
    4849   !!---------------------------------------------------------------------- 
    4950   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    5354CONTAINS 
    5455 
    55    SUBROUTINE dyn_spg( kt ) 
     56   SUBROUTINE dyn_spg( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) 
    5657      !!---------------------------------------------------------------------- 
    5758      !!                  ***  ROUTINE dyn_spg  *** 
     
    6667      !!              ln_apr_dyn=T : the atmospheric pressure forcing is applied  
    6768      !!             as the gradient of the inverse barometer ssh: 
    68       !!                apgu = - 1/rau0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb] 
    69       !!                apgv = - 1/rau0 dj[apr] = 0.5*grav dj[ssh_ib+ssh_ibb] 
    70       !!             Note that as all external forcing a time averaging over a two rdt 
     69      !!                apgu = - 1/rho0 di[apr] = 0.5*grav di[ssh_ib+ssh_ibb] 
     70      !!                apgv = - 1/rho0 dj[apr] = 0.5*grav dj[ssh_ib+ssh_ibb] 
     71      !!             Note that as all external forcing a time averaging over a two rn_Dt 
    7172      !!             period is used to prevent the divergence of odd and even time step. 
    7273      !!---------------------------------------------------------------------- 
    73       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     74      INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index 
     75      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices 
     76      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation 
     77      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout) ::  pssh, puu_b, pvv_b  ! SSH and barotropic velocities at main time levels 
    7478      ! 
    7579      INTEGER  ::   ji, jj, jk                   ! dummy loop indices 
    76       REAL(wp) ::   z2dt, zg_2, zintp, zgrau0r, zld   ! local scalars 
     80      REAL(wp) ::   z2dt, zg_2, zintp, zgrho0r, zld   ! local scalars 
    7781      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zpice 
    7882      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
     
    8387      IF( l_trddyn )   THEN                      ! temporary save of ta and sa trends 
    8488         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )  
    85          ztrdu(:,:,:) = ua(:,:,:) 
    86          ztrdv(:,:,:) = va(:,:,:) 
     89         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
     90         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    8791      ENDIF 
    8892      ! 
     
    9195         .OR.  ln_ice_embd ) THEN                                            ! embedded sea-ice 
    9296         ! 
    93          DO jj = 2, jpjm1 
    94             DO ji = fs_2, fs_jpim1   ! vector opt. 
    95                spgu(ji,jj) = 0._wp 
    96                spgv(ji,jj) = 0._wp 
    97             END DO 
    98          END DO          
     97         DO_2D( 0, 0, 0, 0 ) 
     98            spgu(ji,jj) = 0._wp 
     99            spgv(ji,jj) = 0._wp 
     100         END_2D 
    99101         ! 
    100102         IF( ln_apr_dyn .AND. .NOT.ln_dynspg_ts ) THEN   !==  Atmospheric pressure gradient (added later in time-split case) ==! 
    101103            zg_2 = grav * 0.5 
    102             DO jj = 2, jpjm1                          ! gradient of Patm using inverse barometer ssh 
    103                DO ji = fs_2, fs_jpim1   ! vector opt. 
    104                   spgu(ji,jj) = spgu(ji,jj) + zg_2 * (  ssh_ib (ji+1,jj) - ssh_ib (ji,jj)    & 
    105                      &                                + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    106                   spgv(ji,jj) = spgv(ji,jj) + zg_2 * (  ssh_ib (ji,jj+1) - ssh_ib (ji,jj)    & 
    107                      &                                + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    108                END DO 
    109             END DO 
     104            DO_2D( 0, 0, 0, 0 ) 
     105               spgu(ji,jj) = spgu(ji,jj) + zg_2 * (  ssh_ib (ji+1,jj) - ssh_ib (ji,jj)    & 
     106                  &                                + ssh_ibb(ji+1,jj) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
     107               spgv(ji,jj) = spgv(ji,jj) + zg_2 * (  ssh_ib (ji,jj+1) - ssh_ib (ji,jj)    & 
     108                  &                                + ssh_ibb(ji,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
     109            END_2D 
    110110         ENDIF 
    111111         ! 
     
    113113         IF( .NOT.ln_dynspg_ts .AND. ( ln_tide_pot .AND. ln_tide )  ) THEN   ! N.B. added directly at sub-time-step in ts-case 
    114114            ! 
    115             CALL upd_tide( kt )                      ! update tide potential 
     115            ! Update tide potential at the beginning of current time step 
     116            zt0step = REAL(nsec_day, wp)-0.5_wp*rn_Dt 
     117            CALL upd_tide(zt0step, Kmm) 
    116118            ! 
    117             DO jj = 2, jpjm1                         ! add tide potential forcing 
    118                DO ji = fs_2, fs_jpim1   ! vector opt. 
    119                   spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
    120                   spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
    121                END DO  
    122             END DO 
     119            DO_2D( 0, 0, 0, 0 ) 
     120               spgu(ji,jj) = spgu(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
     121               spgv(ji,jj) = spgv(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
     122            END_2D 
    123123            ! 
    124124            IF (ln_scal_load) THEN 
    125125               zld = rn_scal_load * grav 
    126                DO jj = 2, jpjm1                    ! add scalar approximation for load potential 
    127                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    128                      spgu(ji,jj) = spgu(ji,jj) + zld * ( sshn(ji+1,jj) - sshn(ji,jj) ) * r1_e1u(ji,jj) 
    129                      spgv(ji,jj) = spgv(ji,jj) + zld * ( sshn(ji,jj+1) - sshn(ji,jj) ) * r1_e2v(ji,jj) 
    130                   END DO  
    131                END DO 
     126               DO_2D( 0, 0, 0, 0 ) 
     127                  spgu(ji,jj) = spgu(ji,jj) + zld * ( pssh(ji+1,jj,Kmm) - pssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
     128                  spgv(ji,jj) = spgv(ji,jj) + zld * ( pssh(ji,jj+1,Kmm) - pssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
     129               END_2D 
    132130            ENDIF 
    133131         ENDIF 
     
    136134            ALLOCATE( zpice(jpi,jpj) ) 
    137135            zintp = REAL( MOD( kt-1, nn_fsbc ) ) / REAL( nn_fsbc ) 
    138             zgrau0r     = - grav * r1_rau0 
    139             zpice(:,:) = (  zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:)  ) * zgrau0r 
    140             DO jj = 2, jpjm1 
    141                DO ji = fs_2, fs_jpim1   ! vector opt. 
    142                   spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 
    143                   spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 
    144                END DO 
    145             END DO 
     136            zgrho0r     = - grav * r1_rho0 
     137            zpice(:,:) = (  zintp * snwice_mass(:,:) + ( 1.- zintp ) * snwice_mass_b(:,:)  ) * zgrho0r 
     138            DO_2D( 0, 0, 0, 0 ) 
     139               spgu(ji,jj) = spgu(ji,jj) + ( zpice(ji+1,jj) - zpice(ji,jj) ) * r1_e1u(ji,jj) 
     140               spgv(ji,jj) = spgv(ji,jj) + ( zpice(ji,jj+1) - zpice(ji,jj) ) * r1_e2v(ji,jj) 
     141            END_2D 
    146142            DEALLOCATE( zpice )          
    147143         ENDIF 
    148144         ! 
    149          DO jk = 1, jpkm1                    !== Add all terms to the general trend 
    150             DO jj = 2, jpjm1 
    151                DO ji = fs_2, fs_jpim1   ! vector opt. 
    152                   ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
    153                   va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
    154                END DO 
    155             END DO 
    156          END DO     
     145         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     146            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + spgu(ji,jj) 
     147            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + spgv(ji,jj) 
     148         END_3D 
    157149         ! 
    158150!!gm add here a call to dyn_trd for ice pressure gradient, the surf pressure trends ???? 
     
    161153      ! 
    162154      SELECT CASE ( nspg )                   !== surface pressure gradient computed and add to the general trend ==! 
    163       CASE ( np_EXP )   ;   CALL dyn_spg_exp( kt )              ! explicit 
    164       CASE ( np_TS  )   ;   CALL dyn_spg_ts ( kt )              ! time-splitting 
     155      CASE ( np_EXP )   ;   CALL dyn_spg_exp( kt,      Kmm,       puu, pvv, Krhs )                    ! explicit 
     156      CASE ( np_TS  )   ;   CALL dyn_spg_ts ( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) ! time-splitting 
    165157      END SELECT 
    166158      !                     
    167159      IF( l_trddyn )   THEN                  ! save the surface pressure gradient trends for further diagnostics 
    168          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    169          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    170          CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt ) 
     160         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     161         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     162         CALL trd_dyn( ztrdu, ztrdv, jpdyn_spg, kt, Kmm ) 
    171163         DEALLOCATE( ztrdu , ztrdv )  
    172164      ENDIF 
    173165      !                                      ! print mean trends (used for debugging) 
    174       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' spg  - Ua: ', mask1=umask, & 
    175          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     166      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' spg  - Ua: ', mask1=umask, & 
     167         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    176168      ! 
    177169      IF( ln_timing )   CALL timing_stop('dyn_spg') 
     
    191183      NAMELIST/namdyn_spg/ ln_dynspg_exp       , ln_dynspg_ts,   & 
    192184      &                    ln_bt_fw, ln_bt_av  , ln_bt_auto  ,   & 
    193       &                    nn_baro , rn_bt_cmax, nn_bt_flt, rn_bt_alpha 
     185      &                    nn_e , rn_bt_cmax, nn_bt_flt, rn_bt_alpha 
    194186      !!---------------------------------------------------------------------- 
    195187      ! 
     
    200192      ENDIF 
    201193      ! 
    202       REWIND( numnam_ref )              ! Namelist namdyn_spg in reference namelist : Free surface 
    203194      READ  ( numnam_ref, namdyn_spg, IOSTAT = ios, ERR = 901) 
    204 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_spg in reference namelist', lwp ) 
    205       ! 
    206       REWIND( numnam_cfg )              ! Namelist namdyn_spg in configuration namelist : Free surface 
     195901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_spg in reference namelist' ) 
     196      ! 
    207197      READ  ( numnam_cfg, namdyn_spg, IOSTAT = ios, ERR = 902 ) 
    208 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_spg in configuration namelist', lwp ) 
     198902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_spg in configuration namelist' ) 
    209199      IF(lwm) WRITE ( numond, namdyn_spg ) 
    210200      ! 
     
    232222      ! 
    233223      IF( nspg == np_TS ) THEN   ! split-explicit scheme initialisation 
    234          CALL dyn_spg_ts_init          ! do it first: set nn_baro used to allocate some arrays later on 
     224         CALL dyn_spg_ts_init          ! do it first: set nn_e used to allocate some arrays later on 
    235225      ENDIF 
    236226      ! 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynspg_exp.F90

    r10068 r13463  
    3030 
    3131   !! * Substitutions 
    32 #  include "vectopt_loop_substitute.h90" 
     32#  include "do_loop_substitute.h90" 
    3333   !!---------------------------------------------------------------------- 
    3434   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    3838CONTAINS 
    3939 
    40    SUBROUTINE dyn_spg_exp( kt ) 
     40   SUBROUTINE dyn_spg_exp( kt, Kmm, puu, pvv, Krhs ) 
    4141      !!---------------------------------------------------------------------- 
    4242      !!                  ***  routine dyn_spg_exp  *** 
     
    4848      !! ** Method  :   Explicit free surface formulation. Add to the general 
    4949      !!              momentum trend the surface pressure gradient : 
    50       !!                      (ua,va) = (ua,va) + (spgu,spgv) 
    51       !!              where spgu = -1/rau0 d/dx(ps) = -g/e1u di( sshn ) 
    52       !!                    spgv = -1/rau0 d/dy(ps) = -g/e2v dj( sshn ) 
     50      !!                      (uu(rhs),vv(rhs)) = (uu(rhs),vv(rhs)) + (spgu,spgv) 
     51      !!              where spgu = -1/rho0 d/dx(ps) = -g/e1u di( ssh(now) ) 
     52      !!                    spgv = -1/rho0 d/dy(ps) = -g/e2v dj( ssh(now) ) 
    5353      !! 
    54       !! ** Action :   (ua,va)   trend of horizontal velocity increased by  
     54      !! ** Action :   (puu(:,:,:,Krhs),pvv(:,:,:,Krhs))   trend of horizontal velocity increased by  
    5555      !!                         the surf. pressure gradient trend 
    5656      !!--------------------------------------------------------------------- 
    57       INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
     57      INTEGER                             , INTENT( in )  ::  kt        ! ocean time-step index 
     58      INTEGER                             , INTENT( in )  ::  Kmm, Krhs ! ocean time level indices 
     59      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv  ! ocean velocities and RHS of momentum equation 
    5860      !! 
    5961      INTEGER ::   ji, jj, jk   ! dummy loop indices 
     
    7274      IF( ln_linssh ) THEN          !* linear free surface : add the surface pressure gradient trend 
    7375         ! 
    74          DO jj = 2, jpjm1                    ! now surface pressure gradient 
    75             DO ji = fs_2, fs_jpim1   ! vector opt. 
    76                spgu(ji,jj) = - grav * ( sshn(ji+1,jj) - sshn(ji,jj) ) * r1_e1u(ji,jj) 
    77                spgv(ji,jj) = - grav * ( sshn(ji,jj+1) - sshn(ji,jj) ) * r1_e2v(ji,jj) 
    78             END DO  
    79          END DO 
     76         DO_2D( 0, 0, 0, 0 ) 
     77            spgu(ji,jj) = - grav * ( ssh(ji+1,jj,Kmm) - ssh(ji,jj,Kmm) ) * r1_e1u(ji,jj) 
     78            spgv(ji,jj) = - grav * ( ssh(ji,jj+1,Kmm) - ssh(ji,jj,Kmm) ) * r1_e2v(ji,jj) 
     79         END_2D 
    8080         ! 
    81          DO jk = 1, jpkm1                    ! Add it to the general trend 
    82             DO jj = 2, jpjm1 
    83                DO ji = fs_2, fs_jpim1   ! vector opt. 
    84                   ua(ji,jj,jk) = ua(ji,jj,jk) + spgu(ji,jj) 
    85                   va(ji,jj,jk) = va(ji,jj,jk) + spgv(ji,jj) 
    86                END DO 
    87             END DO 
    88          END DO 
     81         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     82            puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + spgu(ji,jj) 
     83            pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + spgv(ji,jj) 
     84         END_3D 
    8985         ! 
    9086      ENDIF 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynspg_ts.F90

    r11405 r13463  
    11MODULE dynspg_ts 
    22 
    3    !! Includes ROMS wd scheme with diagnostic outputs ; un and ua updates are commented out !  
     3   !! Includes ROMS wd scheme with diagnostic outputs ; puu(:,:,:,Kmm) and puu(:,:,:,Krhs) updates are commented out !  
    44 
    55   !!====================================================================== 
     
    3131   USE dom_oce         ! ocean space and time domain 
    3232   USE sbc_oce         ! surface boundary condition: ocean 
     33   USE isf_oce         ! ice shelf variable (fwfisf) 
    3334   USE zdf_oce         ! vertical physics: variables 
    3435   USE zdfdrg          ! vertical physics: top/bottom drag coef. 
    35    USE sbcisf          ! ice shelf variable (fwfisf) 
    3636   USE sbcapr          ! surface boundary condition: atmospheric pressure 
    3737   USE dynadv    , ONLY: ln_dynadv_vec 
     
    4444   USE bdytides        ! open boundary condition data 
    4545   USE bdydyn2d        ! open boundary conditions on barotropic variables 
    46    USE sbctide         ! tides 
    47    USE updtide         ! tide potential 
     46   USE tide_mod        ! 
    4847   USE sbcwave         ! surface wave 
    49    USE diatmb          ! Top,middle,bottom output 
    5048#if defined key_agrif 
    5149   USE agrif_oce_interp ! agrif 
     
    6260   USE iom             ! IOM library 
    6361   USE restart         ! only for lrst_oce 
    64    USE diatmb          ! Top,middle,bottom output 
     62 
     63   USE iom   ! to remove 
    6564 
    6665   IMPLICIT NONE 
     
    7372   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv   !: Advection vel. at "now" barocl. step 
    7473   ! 
    75    INTEGER, SAVE :: icycle      ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro 
    76    REAL(wp),SAVE :: rdtbt       ! Barotropic time step 
     74   INTEGER, SAVE :: icycle      ! Number of barotropic sub-steps for each internal step nn_e <= 2.5 nn_e 
     75   REAL(wp),SAVE :: rDt_e       ! Barotropic time step 
    7776   ! 
    7877   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)   ::   wgtbtp1, wgtbtp2   ! 1st & 2nd weights used in time filtering of barotropic fields 
     
    8786 
    8887   !! * Substitutions 
    89 #  include "vectopt_loop_substitute.h90" 
     88#  include "do_loop_substitute.h90" 
     89#  include "domzgr_substitute.h90" 
    9090   !!---------------------------------------------------------------------- 
    9191   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    103103      ierr(:) = 0 
    104104      ! 
    105       ALLOCATE( wgtbtp1(3*nn_baro), wgtbtp2(3*nn_baro), zwz(jpi,jpj), STAT=ierr(1) ) 
    106       ! 
     105      ALLOCATE( wgtbtp1(3*nn_e), wgtbtp2(3*nn_e), zwz(jpi,jpj), STAT=ierr(1) ) 
    107106      IF( ln_dynvor_een .OR. ln_dynvor_eeT )   & 
    108          &     ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , &  
    109          &               ftsw(jpi,jpj) , ftse(jpi,jpj) , STAT=ierr(2) ) 
     107         &     ALLOCATE( ftnw(jpi,jpj) , ftne(jpi,jpj) , ftsw(jpi,jpj) , ftse(jpi,jpj), STAT=ierr(2)   ) 
    110108         ! 
    111109      ALLOCATE( un_adv(jpi,jpj), vn_adv(jpi,jpj)                    , STAT=ierr(3) ) 
     
    119117 
    120118 
    121    SUBROUTINE dyn_spg_ts( kt ) 
     119   SUBROUTINE dyn_spg_ts( kt, Kbb, Kmm, Krhs, puu, pvv, pssh, puu_b, pvv_b, Kaa ) 
    122120      !!---------------------------------------------------------------------- 
    123121      !! 
     
    134132      !! 
    135133      !! ** Action : 
    136       !!      -Update the filtered free surface at step "n+1"      : ssha 
    137       !!      -Update filtered barotropic velocities at step "n+1" : ua_b, va_b 
     134      !!      -Update the filtered free surface at step "n+1"      : pssh(:,:,Kaa) 
     135      !!      -Update filtered barotropic velocities at step "n+1" : puu_b(:,:,:,Kaa), vv_b(:,:,:,Kaa) 
    138136      !!      -Compute barotropic advective fluxes at step "n"     : un_adv, vn_adv 
    139137      !!      These are used to advect tracers and are compliant with discrete 
    140138      !!      continuity equation taken at the baroclinic time steps. This  
    141139      !!      ensures tracers conservation. 
    142       !!      - (ua, va) momentum trend updated with barotropic component. 
     140      !!      - (puu(:,:,:,Krhs), pvv(:,:,:,Krhs)) momentum trend updated with barotropic component. 
    143141      !! 
    144142      !! References : Shchepetkin and McWilliams, Ocean Modelling, 2005.  
    145143      !!--------------------------------------------------------------------- 
    146       INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
     144      INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index 
     145      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices 
     146      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation 
     147      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout) ::  pssh, puu_b, pvv_b  ! SSH and barotropic velocities at main time levels 
    147148      ! 
    148149      INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices 
    149150      LOGICAL  ::   ll_fw_start           ! =T : forward integration  
    150151      LOGICAL  ::   ll_init               ! =T : special startup of 2d equations 
    151       LOGICAL  ::   ll_tmp1, ll_tmp2      ! local logical variables used in W/D 
    152       INTEGER  ::   ikbu, iktu, noffset   ! local integers 
    153       INTEGER  ::   ikbv, iktv            !   -      - 
    154       REAL(wp) ::   r1_2dt_b, z2dt_bf               ! local scalars 
    155       REAL(wp) ::   zx1, zx2, zu_spg, zhura, z1_hu  !   -      - 
    156       REAL(wp) ::   zy1, zy2, zv_spg, zhvra, z1_hv  !   -      - 
     152      INTEGER  ::   noffset               ! local integers  : time offset for bdy update 
     153      REAL(wp) ::   r1_Dt_b, z1_hu, z1_hv          ! local scalars 
    157154      REAL(wp) ::   za0, za1, za2, za3              !   -      - 
    158       REAL(wp) ::   zmdi, zztmp            , z1_ht  !   -      - 
    159       REAL(wp), DIMENSION(jpi,jpj) :: zsshp2_e, zhf 
    160       REAL(wp), DIMENSION(jpi,jpj) :: zwx, zu_trd, zu_frc, zssh_frc 
    161       REAL(wp), DIMENSION(jpi,jpj) :: zwy, zv_trd, zv_frc, zhdiv 
    162       REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhust_e, zhtp2_e 
    163       REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zhvst_e 
     155      REAL(wp) ::   zztmp, zldg               !   -      - 
     156      REAL(wp) ::   zhu_bck, zhv_bck, zhdiv         !   -      - 
     157      REAL(wp) ::   zun_save, zvn_save              !   -      - 
     158      REAL(wp), DIMENSION(jpi,jpj) :: zu_trd, zu_frc, zu_spg, zssh_frc 
     159      REAL(wp), DIMENSION(jpi,jpj) :: zv_trd, zv_frc, zv_spg 
     160      REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhtp2_e 
     161      REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zsshp2_e 
    164162      REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points 
     163      REAL(wp), DIMENSION(jpi,jpj) :: zhU, zhV         ! fluxes 
     164      REAL(wp), DIMENSION(jpi, jpj, jpk) :: ze3u, ze3v 
    165165      ! 
    166166      REAL(wp) ::   zwdramp                     ! local scalar - only used if ln_wd_dl = .True.  
     
    172172      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: ztwdmask, zuwdmask, zvwdmask ! ROMS wetting and drying masks at t,u,v points 
    173173      REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zuwdav2, zvwdav2    ! averages over the sub-steps of zuwdmask and zvwdmask 
     174      REAL(wp) ::   zt0substep !   Time of day at the beginning of the time substep 
    174175      !!---------------------------------------------------------------------- 
    175176      ! 
     
    178179      IF( ln_wd_dl ) ALLOCATE( ztwdmask(jpi,jpj), zuwdmask(jpi,jpj), zvwdmask(jpi,jpj), zuwdav2(jpi,jpj), zvwdav2(jpi,jpj)) 
    179180      ! 
    180       zmdi=1.e+20                               !  missing data indicator for masking 
    181       ! 
    182181      zwdramp = r_rn_wdmin1               ! simplest ramp  
    183182!     zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 
    184       !                                         ! reciprocal of baroclinic time step  
    185       IF( kt == nit000 .AND. neuler == 0 ) THEN   ;   z2dt_bf =          rdt 
    186       ELSE                                        ;   z2dt_bf = 2.0_wp * rdt 
    187       ENDIF 
    188       r1_2dt_b = 1.0_wp / z2dt_bf  
     183      !                                         ! inverse of baroclinic time step  
     184      r1_Dt_b = 1._wp / rDt  
    189185      ! 
    190186      ll_init     = ln_bt_av                    ! if no time averaging, then no specific restart  
    191187      ll_fw_start = .FALSE. 
    192188      !                                         ! time offset in steps for bdy data update 
    193       IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_baro 
     189      IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_e 
    194190      ELSE                       ;   noffset =   0  
    195191      ENDIF 
     
    202198         IF(lwp) WRITE(numout,*) 
    203199         ! 
    204          IF( neuler == 0 )   ll_init=.TRUE. 
    205          ! 
    206          IF( ln_bt_fw .OR. neuler == 0 ) THEN 
     200         IF( l_1st_euler )   ll_init=.TRUE. 
     201         ! 
     202         IF( ln_bt_fw .OR. l_1st_euler ) THEN 
    207203            ll_fw_start =.TRUE. 
    208204            noffset     = 0 
     
    210206            ll_fw_start =.FALSE. 
    211207         ENDIF 
    212          ! 
    213          ! Set averaging weights and cycle length: 
     208         !                    ! Set averaging weights and cycle length: 
    214209         CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
    215210         ! 
    216       ENDIF 
    217       ! 
    218       IF( ln_isfcav ) THEN    ! top+bottom friction (ocean cavities) 
    219          DO jj = 2, jpjm1 
    220             DO ji = fs_2, fs_jpim1   ! vector opt. 
    221                zCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
    222                zCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) 
    223             END DO 
    224          END DO 
    225       ELSE                    ! bottom friction only 
    226          DO jj = 2, jpjm1 
    227             DO ji = fs_2, fs_jpim1   ! vector opt. 
    228                zCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 
    229                zCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 
    230             END DO 
    231          END DO 
    232       ENDIF 
    233       ! 
    234       ! Set arrays to remove/compute coriolis trend. 
    235       ! Do it once at kt=nit000 if volume is fixed, else at each long time step. 
    236       ! Note that these arrays are also used during barotropic loop. These are however frozen 
    237       ! although they should be updated in the variable volume case. Not a big approximation. 
    238       ! To remove this approximation, copy lines below inside barotropic loop 
    239       ! and update depths at T-F points (ht and zhf resp.) at each barotropic time step 
    240       ! 
    241       IF( kt == nit000 .OR. .NOT.ln_linssh ) THEN 
    242          ! 
    243          SELECT CASE( nvor_scheme ) 
    244          CASE( np_EEN )                != EEN scheme using e3f (energy & enstrophy scheme) 
    245             SELECT CASE( nn_een_e3f )              !* ff_f/e3 at F-point 
    246             CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
    247                DO jj = 1, jpjm1 
    248                   DO ji = 1, jpim1 
    249                      zwz(ji,jj) =   ( ht_n(ji  ,jj+1) + ht_n(ji+1,jj+1) +                    & 
    250                         &             ht_n(ji  ,jj  ) + ht_n(ji+1,jj  )   ) * 0.25_wp   
    251                      IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 
    252                   END DO 
    253                END DO 
    254             CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
    255                DO jj = 1, jpjm1 
    256                   DO ji = 1, jpim1 
    257                      zwz(ji,jj) =             (  ht_n  (ji  ,jj+1) + ht_n  (ji+1,jj+1)      & 
    258                         &                      + ht_n  (ji  ,jj  ) + ht_n  (ji+1,jj  )  )   & 
    259                         &       / ( MAX( 1._wp,  ssmask(ji  ,jj+1) + ssmask(ji+1,jj+1)      & 
    260                         &                      + ssmask(ji  ,jj  ) + ssmask(ji+1,jj  )  )   ) 
    261                      IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 
    262                   END DO 
    263                END DO 
    264             END SELECT 
    265             CALL lbc_lnk( 'dynspg_ts', zwz, 'F', 1._wp ) 
    266             ! 
    267             ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
    268             DO jj = 2, jpj 
    269                DO ji = 2, jpi 
    270                   ftne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
    271                   ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
    272                   ftse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1) 
    273                   ftsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  ) 
    274                END DO 
    275             END DO 
    276             ! 
    277          CASE( np_EET )                  != EEN scheme using e3t (energy conserving scheme) 
    278             ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
    279             DO jj = 2, jpj 
    280                DO ji = 2, jpi 
    281                   z1_ht = ssmask(ji,jj) / ( ht_n(ji,jj) + 1._wp - ssmask(ji,jj) ) 
    282                   ftne(ji,jj) = ( ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) ) * z1_ht 
    283                   ftnw(ji,jj) = ( ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) ) * z1_ht 
    284                   ftse(ji,jj) = ( ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) ) * z1_ht 
    285                   ftsw(ji,jj) = ( ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) ) * z1_ht 
    286                END DO 
    287             END DO 
    288             ! 
    289          CASE( np_ENE, np_ENS , np_MIX )  != all other schemes (ENE, ENS, MIX) except ENT ! 
    290             ! 
    291             zwz(:,:) = 0._wp 
    292             zhf(:,:) = 0._wp 
    293              
    294 !!gm  assume 0 in both cases (which is almost surely WRONG ! ) as hvatf has been removed  
    295 !!gm    A priori a better value should be something like : 
    296 !!gm          zhf(i,j) = masked sum of  ht(i,j) , ht(i+1,j) , ht(i,j+1) , (i+1,j+1)  
    297 !!gm                     divided by the sum of the corresponding mask  
    298 !!gm  
    299 !!             
    300             IF( .NOT.ln_sco ) THEN 
    301    
    302    !!gm  agree the JC comment  : this should be done in a much clear way 
    303    
    304    ! JC: It not clear yet what should be the depth at f-points over land in z-coordinate case 
    305    !     Set it to zero for the time being  
    306    !              IF( rn_hmin < 0._wp ) THEN    ;   jk = - INT( rn_hmin )                                      ! from a nb of level 
    307    !              ELSE                          ;   jk = MINLOC( gdepw_0, mask = gdepw_0 > rn_hmin, dim = 1 )  ! from a depth 
    308    !              ENDIF 
    309    !              zhf(:,:) = gdepw_0(:,:,jk+1) 
    310                ! 
    311             ELSE 
    312                ! 
    313                !zhf(:,:) = hbatf(:,:) 
    314                DO jj = 1, jpjm1 
    315                   DO ji = 1, jpim1 
    316                      zhf(ji,jj) =    (   ht_0  (ji,jj  ) + ht_0  (ji+1,jj  )          & 
    317                         &              + ht_0  (ji,jj+1) + ht_0  (ji+1,jj+1)   )      & 
    318                         &       / MAX(   ssmask(ji,jj  ) + ssmask(ji+1,jj  )          & 
    319                         &              + ssmask(ji,jj+1) + ssmask(ji+1,jj+1) , 1._wp  ) 
    320                   END DO 
    321                END DO 
    322             ENDIF 
    323             ! 
    324             DO jj = 1, jpjm1 
    325                zhf(:,jj) = zhf(:,jj) * (1._wp- umask(:,jj,1) * umask(:,jj+1,1)) 
    326             END DO 
    327             ! 
    328             DO jk = 1, jpkm1 
    329                DO jj = 1, jpjm1 
    330                   zhf(:,jj) = zhf(:,jj) + e3f_n(:,jj,jk) * umask(:,jj,jk) * umask(:,jj+1,jk) 
    331                END DO 
    332             END DO 
    333             CALL lbc_lnk( 'dynspg_ts', zhf, 'F', 1._wp ) 
    334             ! JC: TBC. hf should be greater than 0  
    335             DO jj = 1, jpj 
    336                DO ji = 1, jpi 
    337                   IF( zhf(ji,jj) /= 0._wp )   zwz(ji,jj) = 1._wp / zhf(ji,jj) ! zhf is actually hf here but it saves an array 
    338                END DO 
    339             END DO 
    340             zwz(:,:) = ff_f(:,:) * zwz(:,:) 
    341          END SELECT 
    342       ENDIF 
    343       ! 
    344       ! If forward start at previous time step, and centered integration,  
    345       ! then update averaging weights: 
    346       IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 
    347          ll_fw_start=.FALSE. 
    348          CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
    349       ENDIF 
    350                            
     211      ELSEIF( kt == nit000 + 1 ) THEN           !* initialisation 2nd time-step 
     212         ! 
     213         IF( .NOT.ln_bt_fw ) THEN 
     214            ! If we did an Euler timestep on the first timestep we need to reset ll_fw_start 
     215            ! and the averaging weights. We don't have an easy way of telling whether we did 
     216            ! an Euler timestep on the first timestep (because l_1st_euler is reset to .false. 
     217            ! at the end of the first timestep) so just do this in all cases.  
     218            ll_fw_start = .FALSE. 
     219            CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
     220         ENDIF 
     221         ! 
     222      ENDIF 
     223      ! 
    351224      ! ----------------------------------------------------------------------------- 
    352225      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step) 
     
    354227      !       
    355228      ! 
    356       !                                   !* e3*d/dt(Ua) (Vertically integrated) 
    357       !                                   ! -------------------------------------------------- 
    358       zu_frc(:,:) = 0._wp 
    359       zv_frc(:,:) = 0._wp 
    360       ! 
    361       DO jk = 1, jpkm1 
    362          zu_frc(:,:) = zu_frc(:,:) + e3u_n(:,:,jk) * ua(:,:,jk) * umask(:,:,jk) 
    363          zv_frc(:,:) = zv_frc(:,:) + e3v_n(:,:,jk) * va(:,:,jk) * vmask(:,:,jk)          
     229      !                                   !=  zu_frc =  1/H e3*d/dt(Ua)  =!  (Vertical mean of Ua, the 3D trends) 
     230      !                                   !  ---------------------------  ! 
     231      DO jk = 1 , jpk 
     232         ze3u(:,:,jk) = e3u(:,:,jk,Kmm) 
     233         ze3v(:,:,jk) = e3v(:,:,jk,Kmm) 
    364234      END DO 
    365235      ! 
    366       zu_frc(:,:) = zu_frc(:,:) * r1_hu_n(:,:) 
    367       zv_frc(:,:) = zv_frc(:,:) * r1_hv_n(:,:) 
    368       ! 
    369       ! 
    370       !                                   !* baroclinic momentum trend (remove the vertical mean trend) 
    371       DO jk = 1, jpkm1                    ! ----------------------------------------------------------- 
    372          DO jj = 2, jpjm1 
    373             DO ji = fs_2, fs_jpim1   ! vector opt. 
    374                ua(ji,jj,jk) = ua(ji,jj,jk) - zu_frc(ji,jj) * umask(ji,jj,jk) 
    375                va(ji,jj,jk) = va(ji,jj,jk) - zv_frc(ji,jj) * vmask(ji,jj,jk) 
    376             END DO 
    377          END DO 
     236      zu_frc(:,:) = SUM( ze3u(:,:,:) * uu(:,:,:,Krhs) * umask(:,:,:) , DIM=3 ) * r1_hu(:,:,Kmm) 
     237      zv_frc(:,:) = SUM( ze3v(:,:,:) * vv(:,:,:,Krhs) * vmask(:,:,:) , DIM=3 ) * r1_hv(:,:,Kmm) 
     238      ! 
     239      ! 
     240      !                                   !=  U(Krhs) => baroclinic trend  =!   (remove its vertical mean) 
     241      DO jk = 1, jpkm1                    !  -----------------------------  ! 
     242         uu(:,:,jk,Krhs) = ( uu(:,:,jk,Krhs) - zu_frc(:,:) ) * umask(:,:,jk) 
     243         vv(:,:,jk,Krhs) = ( vv(:,:,jk,Krhs) - zv_frc(:,:) ) * vmask(:,:,jk) 
    378244      END DO 
    379245       
     
    381247!!gm  Is it correct to do so ?   I think so... 
    382248       
    383        
    384       !                                   !* barotropic Coriolis trends (vorticity scheme dependent) 
    385       !                                   ! -------------------------------------------------------- 
    386       ! 
    387       zwx(:,:) = un_b(:,:) * hu_n(:,:) * e2u(:,:)        ! now fluxes  
    388       zwy(:,:) = vn_b(:,:) * hv_n(:,:) * e1v(:,:) 
    389       ! 
    390       SELECT CASE( nvor_scheme ) 
    391       CASE( np_ENT )                ! enstrophy conserving scheme (f-point) 
    392          DO jj = 2, jpjm1 
    393             DO ji = 2, jpim1   ! vector opt. 
    394                zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * r1_hu_n(ji,jj)                    & 
    395                   &               * (  e1e2t(ji+1,jj)*ht_n(ji+1,jj)*ff_t(ji+1,jj) * ( vn_b(ji+1,jj) + vn_b(ji+1,jj-1) )   & 
    396                   &                  + e1e2t(ji  ,jj)*ht_n(ji  ,jj)*ff_t(ji  ,jj) * ( vn_b(ji  ,jj) + vn_b(ji  ,jj-1) )   ) 
    397                   ! 
    398                zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * r1_hv_n(ji,jj)                    & 
    399                   &               * (  e1e2t(ji,jj+1)*ht_n(ji,jj+1)*ff_t(ji,jj+1) * ( un_b(ji,jj+1) + un_b(ji-1,jj+1) )   &  
    400                   &                  + e1e2t(ji,jj  )*ht_n(ji,jj  )*ff_t(ji,jj  ) * ( un_b(ji,jj  ) + un_b(ji-1,jj  ) )   )  
    401             END DO   
    402          END DO   
    403          !          
    404       CASE( np_ENE , np_MIX )        ! energy conserving scheme (t-point) ENE or MIX 
    405          DO jj = 2, jpjm1 
    406             DO ji = fs_2, fs_jpim1   ! vector opt. 
    407                zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) * r1_e1u(ji,jj) 
    408                zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    409                zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 
    410                zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    411                ! energy conserving formulation for planetary vorticity term 
    412                zu_trd(ji,jj) =   r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    413                zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    414             END DO 
    415          END DO 
    416          ! 
    417       CASE( np_ENS )                ! enstrophy conserving scheme (f-point) 
    418          DO jj = 2, jpjm1 
    419             DO ji = fs_2, fs_jpim1   ! vector opt. 
    420                zy1 =   r1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    421                  &            + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    422                zx1 = - r1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    423                  &            + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    424                zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    425                zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
    426             END DO 
    427          END DO 
    428          ! 
    429       CASE( np_EET , np_EEN )      ! energy & enstrophy scheme (using e3t or e3f)          
    430          DO jj = 2, jpjm1 
    431             DO ji = fs_2, fs_jpim1   ! vector opt. 
    432                zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    433                 &                                         + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    434                 &                                         + ftse(ji,jj  ) * zwy(ji  ,jj-1) & 
    435                 &                                         + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    436                zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
    437                 &                                         + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    438                 &                                         + ftnw(ji,jj  ) * zwx(ji-1,jj  ) & 
    439                 &                                         + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    440             END DO 
    441          END DO 
    442          ! 
    443       END SELECT 
    444       ! 
    445       !                                   !* Right-Hand-Side of the barotropic momentum equation 
    446       !                                   ! ---------------------------------------------------- 
    447       IF( .NOT.ln_linssh ) THEN                 ! Variable volume : remove surface pressure gradient 
    448          IF( ln_wd_il ) THEN                        ! Calculating and applying W/D gravity filters 
    449             DO jj = 2, jpjm1 
    450                DO ji = 2, jpim1  
    451                   ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji+1,jj) ) >                & 
    452                      &      MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
    453                      &      MAX(  sshn(ji,jj) + ht_0(ji,jj) ,  sshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
    454                      &                                                         > rn_wdmin1 + rn_wdmin2 
    455                   ll_tmp2 = ( ABS( sshn(ji+1,jj)            -  sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
    456                      &      MAX(   sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
    457                      &      MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    458                   IF(ll_tmp1) THEN 
    459                      zcpx(ji,jj) = 1.0_wp 
    460                   ELSEIF(ll_tmp2) THEN 
    461                      ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    462                      zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
    463                                  &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
    464                      zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
    465                   ELSE 
    466                      zcpx(ji,jj) = 0._wp 
    467                   ENDIF 
    468                   ! 
    469                   ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji,jj+1) ) >                & 
    470                      &      MAX( -ht_0(ji,jj)               , -ht_0(ji,jj+1) ) .AND.            & 
    471                      &      MAX(  sshn(ji,jj) + ht_0(ji,jj) ,  sshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
    472                      &                                                       > rn_wdmin1 + rn_wdmin2 
    473                   ll_tmp2 = ( ABS( sshn(ji,jj)              -  sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
    474                      &      MAX(   sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
    475                      &      MAX(  -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    476    
    477                   IF(ll_tmp1) THEN 
    478                      zcpy(ji,jj) = 1.0_wp 
    479                   ELSE IF(ll_tmp2) THEN 
    480                      ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    481                      zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
    482                         &             / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
    483                      zcpy(ji,jj) = MAX(  0._wp , MIN( zcpy(ji,jj) , 1.0_wp )  ) 
    484                   ELSE 
    485                      zcpy(ji,jj) = 0._wp 
    486                   ENDIF 
    487                END DO 
    488             END DO 
    489             ! 
    490             DO jj = 2, jpjm1 
    491                DO ji = 2, jpim1 
    492                   zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) )   & 
    493                      &                          * r1_e1u(ji,jj) * zcpx(ji,jj)  * wdrampu(ji,jj)  !jth 
    494                   zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) )   & 
    495                      &                          * r1_e2v(ji,jj) * zcpy(ji,jj)  * wdrampv(ji,jj)  !jth 
    496                END DO 
    497             END DO 
    498             ! 
    499          ELSE 
    500             ! 
    501             DO jj = 2, jpjm1 
    502                DO ji = fs_2, fs_jpim1   ! vector opt. 
    503                   zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) * r1_e1u(ji,jj) 
    504                   zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) * r1_e2v(ji,jj)  
    505                END DO 
    506             END DO 
    507          ENDIF 
    508          ! 
    509       ENDIF 
    510       ! 
    511       DO jj = 2, jpjm1                          ! Remove coriolis term (and possibly spg) from barotropic trend 
    512          DO ji = fs_2, fs_jpim1 
    513              zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj) 
    514              zv_frc(ji,jj) = zv_frc(ji,jj) - zv_trd(ji,jj) * ssvmask(ji,jj) 
    515           END DO 
    516       END DO  
    517       ! 
    518       !                                         ! Add bottom stress contribution from baroclinic velocities:       
    519       IF (ln_bt_fw) THEN 
    520          DO jj = 2, jpjm1                           
    521             DO ji = fs_2, fs_jpim1   ! vector opt. 
    522                ikbu = mbku(ji,jj)        
    523                ikbv = mbkv(ji,jj)     
    524                zwx(ji,jj) = un(ji,jj,ikbu) - un_b(ji,jj) ! NOW bottom baroclinic velocities 
    525                zwy(ji,jj) = vn(ji,jj,ikbv) - vn_b(ji,jj) 
    526             END DO 
    527          END DO 
     249      !                                   !=  remove 2D Coriolis and pressure gradient trends  =! 
     250      !                                   !  -------------------------------------------------  ! 
     251      ! 
     252      IF( kt == nit000 .OR. .NOT. ln_linssh )   CALL dyn_cor_2D_init( Kmm )   ! Set zwz, the barotropic Coriolis force coefficient 
     253      !       ! recompute zwz = f/depth  at every time step for (.NOT.ln_linssh) as the water colomn height changes 
     254      ! 
     255      !                                         !* 2D Coriolis trends 
     256      zhU(:,:) = puu_b(:,:,Kmm) * hu(:,:,Kmm) * e2u(:,:)        ! now fluxes  
     257      zhV(:,:) = pvv_b(:,:,Kmm) * hv(:,:,Kmm) * e1v(:,:)        ! NB: FULL domain : put a value in last row and column 
     258      ! 
     259      CALL dyn_cor_2d( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in 
     260         &                                                                     zu_trd, zv_trd   )   ! ==>> out 
     261      ! 
     262      IF( .NOT.ln_linssh ) THEN                 !* surface pressure gradient   (variable volume only) 
     263         ! 
     264         IF( ln_wd_il ) THEN                       ! W/D : limiter applied to spgspg 
     265            CALL wad_spg( pssh(:,:,Kmm), zcpx, zcpy )          ! Calculating W/D gravity filters, zcpx and zcpy 
     266            DO_2D( 0, 0, 0, 0 ) 
     267               zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( pssh(ji+1,jj  ,Kmm) - pssh(ji  ,jj ,Kmm) )   & 
     268                  &                          * r1_e1u(ji,jj) * zcpx(ji,jj)  * wdrampu(ji,jj)  !jth 
     269               zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( pssh(ji  ,jj+1,Kmm) - pssh(ji  ,jj ,Kmm) )   & 
     270                  &                          * r1_e2v(ji,jj) * zcpy(ji,jj)  * wdrampv(ji,jj)  !jth 
     271            END_2D 
     272         ELSE                                      ! now suface pressure gradient 
     273            DO_2D( 0, 0, 0, 0 ) 
     274               zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  pssh(ji+1,jj  ,Kmm) - pssh(ji  ,jj  ,Kmm)  ) * r1_e1u(ji,jj) 
     275               zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  pssh(ji  ,jj+1,Kmm) - pssh(ji  ,jj  ,Kmm)  ) * r1_e2v(ji,jj)  
     276            END_2D 
     277         ENDIF 
     278         ! 
     279      ENDIF 
     280      ! 
     281      DO_2D( 0, 0, 0, 0 ) 
     282          zu_frc(ji,jj) = zu_frc(ji,jj) - zu_trd(ji,jj) * ssumask(ji,jj) 
     283          zv_frc(ji,jj) = zv_frc(ji,jj) - zv_trd(ji,jj) * ssvmask(ji,jj) 
     284      END_2D 
     285      ! 
     286      !                                   !=  Add bottom stress contribution from baroclinic velocities  =! 
     287      !                                   !  -----------------------------------------------------------  ! 
     288      CALL dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, zu_frc, zv_frc,  zCdU_u, zCdU_v )      ! also provide the barotropic drag coefficients 
     289      !                                   !=  Add atmospheric pressure forcing  =! 
     290      !                                   !  ----------------------------------  ! 
     291      IF( ln_apr_dyn ) THEN 
     292         IF( ln_bt_fw ) THEN                          ! FORWARD integration: use kt+1/2 pressure (NOW+1/2) 
     293            DO_2D( 0, 0, 0, 0 ) 
     294               zu_frc(ji,jj) = zu_frc(ji,jj) + grav * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj) 
     295               zv_frc(ji,jj) = zv_frc(ji,jj) + grav * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj) 
     296            END_2D 
     297         ELSE                                         ! CENTRED integration: use kt-1/2 + kt+1/2 pressure (NOW) 
     298            zztmp = grav * r1_2 
     299            DO_2D( 0, 0, 0, 0 ) 
     300               zu_frc(ji,jj) = zu_frc(ji,jj) + zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)  & 
     301                    &                                   + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
     302               zv_frc(ji,jj) = zv_frc(ji,jj) + zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)  & 
     303                    &                                   + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
     304            END_2D 
     305         ENDIF 
     306      ENDIF 
     307      ! 
     308      !                                   !=  Add atmospheric pressure forcing  =! 
     309      !                                   !  ----------------------------------  ! 
     310      IF( ln_bt_fw ) THEN                        ! Add wind forcing 
     311         DO_2D( 0, 0, 0, 0 ) 
     312            zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rho0 * utau(ji,jj) * r1_hu(ji,jj,Kmm) 
     313            zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rho0 * vtau(ji,jj) * r1_hv(ji,jj,Kmm) 
     314         END_2D 
    528315      ELSE 
    529          DO jj = 2, jpjm1 
    530             DO ji = fs_2, fs_jpim1   ! vector opt. 
    531                ikbu = mbku(ji,jj)        
    532                ikbv = mbkv(ji,jj)     
    533                zwx(ji,jj) = ub(ji,jj,ikbu) - ub_b(ji,jj) ! BEFORE bottom baroclinic velocities 
    534                zwy(ji,jj) = vb(ji,jj,ikbv) - vb_b(ji,jj) 
    535             END DO 
    536          END DO 
    537       ENDIF 
    538       ! 
    539       ! Note that the "unclipped" bottom friction parameter is used even with explicit drag 
    540       IF( ln_wd_il ) THEN 
    541          zztmp = -1._wp / rdtbt 
    542          DO jj = 2, jpjm1 
    543             DO ji = fs_2, fs_jpim1   ! vector opt. 
    544                zu_frc(ji,jj) = zu_frc(ji,jj) + &  
    545                & MAX(r1_hu_n(ji,jj) * r1_2 * ( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ), zztmp ) * zwx(ji,jj) *  wdrampu(ji,jj) 
    546                zv_frc(ji,jj) = zv_frc(ji,jj) + &  
    547                & MAX(r1_hv_n(ji,jj) * r1_2 * ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ), zztmp ) * zwy(ji,jj) *  wdrampv(ji,jj) 
    548             END DO 
    549          END DO 
    550       ELSE 
    551          DO jj = 2, jpjm1 
    552             DO ji = fs_2, fs_jpim1   ! vector opt. 
    553                zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * r1_2 * ( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zwx(ji,jj) 
    554                zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * r1_2 * ( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zwy(ji,jj) 
    555             END DO 
    556          END DO 
     316         zztmp = r1_rho0 * r1_2 
     317         DO_2D( 0, 0, 0, 0 ) 
     318            zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu(ji,jj,Kmm) 
     319            zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv(ji,jj,Kmm) 
     320         END_2D 
     321      ENDIF   
     322      ! 
     323      !              !----------------! 
     324      !              !==  sssh_frc  ==!   Right-Hand-Side of the barotropic ssh equation   (over the FULL domain) 
     325      !              !----------------! 
     326      !                                   !=  Net water flux forcing applied to a water column  =! 
     327      !                                   ! ---------------------------------------------------  ! 
     328      IF (ln_bt_fw) THEN                          ! FORWARD integration: use kt+1/2 fluxes (NOW+1/2) 
     329         zssh_frc(:,:) = r1_rho0 * ( emp(:,:) - rnf(:,:) + fwfisf_cav(:,:) + fwfisf_par(:,:) ) 
     330      ELSE                                        ! CENTRED integration: use kt-1/2 + kt+1/2 fluxes (NOW) 
     331         zztmp = r1_rho0 * r1_2 
     332         zssh_frc(:,:) = zztmp * (  emp(:,:)        + emp_b(:,:)                    & 
     333                &                 - rnf(:,:)        - rnf_b(:,:)                    & 
     334                &                 + fwfisf_cav(:,:) + fwfisf_cav_b(:,:)             & 
     335                &                 + fwfisf_par(:,:) + fwfisf_par_b(:,:)             ) 
     336      ENDIF 
     337      !                                   !=  Add Stokes drift divergence  =!   (if exist) 
     338      IF( ln_sdw ) THEN                   !  -----------------------------  ! 
     339         zssh_frc(:,:) = zssh_frc(:,:) + div_sd(:,:) 
     340      ENDIF 
     341      ! 
     342      !                                         ! ice sheet coupling 
     343      IF ( ln_isf .AND. ln_isfcpl ) THEN 
     344         ! 
     345         ! ice sheet coupling 
     346         IF( ln_rstart .AND. kt == nit000 ) THEN 
     347            zssh_frc(:,:) = zssh_frc(:,:) + risfcpl_ssh(:,:) 
     348         END IF 
     349         ! 
     350         ! conservation option 
     351         IF( ln_isfcpl_cons ) THEN 
     352            zssh_frc(:,:) = zssh_frc(:,:) + risfcpl_cons_ssh(:,:) 
     353         END IF 
     354         ! 
    557355      END IF 
    558356      ! 
    559       IF( ln_isfcav ) THEN       ! Add TOP stress contribution from baroclinic velocities:       
    560          IF( ln_bt_fw ) THEN 
    561             DO jj = 2, jpjm1 
    562                DO ji = fs_2, fs_jpim1   ! vector opt. 
    563                   iktu = miku(ji,jj) 
    564                   iktv = mikv(ji,jj) 
    565                   zwx(ji,jj) = un(ji,jj,iktu) - un_b(ji,jj) ! NOW top baroclinic velocities 
    566                   zwy(ji,jj) = vn(ji,jj,iktv) - vn_b(ji,jj) 
    567                END DO 
    568             END DO 
    569          ELSE 
    570             DO jj = 2, jpjm1 
    571                DO ji = fs_2, fs_jpim1   ! vector opt. 
    572                   iktu = miku(ji,jj) 
    573                   iktv = mikv(ji,jj) 
    574                   zwx(ji,jj) = ub(ji,jj,iktu) - ub_b(ji,jj) ! BEFORE top baroclinic velocities 
    575                   zwy(ji,jj) = vb(ji,jj,iktv) - vb_b(ji,jj) 
    576                END DO 
    577             END DO 
    578          ENDIF 
    579          ! 
    580          ! Note that the "unclipped" top friction parameter is used even with explicit drag 
    581          DO jj = 2, jpjm1               
    582             DO ji = fs_2, fs_jpim1   ! vector opt. 
    583                zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * r1_2 * ( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zwx(ji,jj) 
    584                zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * r1_2 * ( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zwy(ji,jj) 
    585             END DO 
    586          END DO 
    587       ENDIF 
    588       !        
    589       IF( ln_bt_fw ) THEN                        ! Add wind forcing 
    590          DO jj = 2, jpjm1 
    591             DO ji = fs_2, fs_jpim1   ! vector opt. 
    592                zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rau0 * utau(ji,jj) * r1_hu_n(ji,jj) 
    593                zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rau0 * vtau(ji,jj) * r1_hv_n(ji,jj) 
    594             END DO 
    595          END DO 
    596       ELSE 
    597          zztmp = r1_rau0 * r1_2 
    598          DO jj = 2, jpjm1 
    599             DO ji = fs_2, fs_jpim1   ! vector opt. 
    600                zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu_n(ji,jj) 
    601                zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv_n(ji,jj) 
    602             END DO 
    603          END DO 
    604       ENDIF   
    605       ! 
    606       IF( ln_apr_dyn ) THEN                     ! Add atm pressure forcing 
    607          IF( ln_bt_fw ) THEN 
    608             DO jj = 2, jpjm1               
    609                DO ji = fs_2, fs_jpim1   ! vector opt. 
    610                   zu_spg =  grav * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj) ) * r1_e1u(ji,jj) 
    611                   zv_spg =  grav * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj) ) * r1_e2v(ji,jj) 
    612                   zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 
    613                   zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg 
    614                END DO 
    615             END DO 
    616          ELSE 
    617             zztmp = grav * r1_2 
    618             DO jj = 2, jpjm1               
    619                DO ji = fs_2, fs_jpim1   ! vector opt. 
    620                   zu_spg = zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)    & 
    621                       &             + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    622                   zv_spg = zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)    & 
    623                       &             + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    624                   zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 
    625                   zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg 
    626                END DO 
    627             END DO 
    628          ENDIF  
    629       ENDIF 
    630       !                                   !* Right-Hand-Side of the barotropic ssh equation 
    631       !                                   ! ----------------------------------------------- 
    632       !                                         ! Surface net water flux and rivers 
    633       IF (ln_bt_fw) THEN 
    634          zssh_frc(:,:) = r1_rau0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
    635       ELSE 
    636          zztmp = r1_rau0 * r1_2 
    637          zssh_frc(:,:) = zztmp * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
    638                 &                 + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
    639       ENDIF 
    640       ! 
    641       IF( ln_sdw ) THEN                         ! Stokes drift divergence added if necessary 
    642          zssh_frc(:,:) = zssh_frc(:,:) + div_sd(:,:) 
    643       ENDIF 
    644       ! 
    645357#if defined key_asminc 
    646       !                                         ! Include the IAU weighted SSH increment 
     358      !                                   !=  Add the IAU weighted SSH increment  =! 
     359      !                                   !  ------------------------------------  ! 
    647360      IF( lk_asminc .AND. ln_sshinc .AND. ln_asmiau ) THEN 
    648361         zssh_frc(:,:) = zssh_frc(:,:) - ssh_iau(:,:) 
    649362      ENDIF 
    650363#endif 
    651       !                                   !* Fill boundary data arrays for AGRIF 
     364      !                                   != Fill boundary data arrays for AGRIF 
    652365      !                                   ! ------------------------------------ 
    653366#if defined key_agrif 
     
    671384         vb_e   (:,:) = 0._wp 
    672385      ENDIF 
    673  
     386      ! 
     387      IF( ln_linssh ) THEN    ! mid-step ocean depth is fixed (hup2_e=hu_n=hu_0) 
     388         zhup2_e(:,:) = hu(:,:,Kmm) 
     389         zhvp2_e(:,:) = hv(:,:,Kmm) 
     390         zhtp2_e(:,:) = ht(:,:) 
     391      ENDIF 
    674392      ! 
    675393      IF (ln_bt_fw) THEN                  ! FORWARD integration: start from NOW fields                     
    676          sshn_e(:,:) =    sshn(:,:)             
    677          un_e  (:,:) =    un_b(:,:)             
    678          vn_e  (:,:) =    vn_b(:,:) 
    679          ! 
    680          hu_e  (:,:) =    hu_n(:,:)        
    681          hv_e  (:,:) =    hv_n(:,:)  
    682          hur_e (:,:) = r1_hu_n(:,:)     
    683          hvr_e (:,:) = r1_hv_n(:,:) 
     394         sshn_e(:,:) =    pssh(:,:,Kmm)             
     395         un_e  (:,:) =    puu_b(:,:,Kmm)             
     396         vn_e  (:,:) =    pvv_b(:,:,Kmm) 
     397         ! 
     398         hu_e  (:,:) =    hu(:,:,Kmm)        
     399         hv_e  (:,:) =    hv(:,:,Kmm)  
     400         hur_e (:,:) = r1_hu(:,:,Kmm)     
     401         hvr_e (:,:) = r1_hv(:,:,Kmm) 
    684402      ELSE                                ! CENTRED integration: start from BEFORE fields 
    685          sshn_e(:,:) =    sshb(:,:) 
    686          un_e  (:,:) =    ub_b(:,:)          
    687          vn_e  (:,:) =    vb_b(:,:) 
    688          ! 
    689          hu_e  (:,:) =    hu_b(:,:)        
    690          hv_e  (:,:) =    hv_b(:,:)  
    691          hur_e (:,:) = r1_hu_b(:,:)     
    692          hvr_e (:,:) = r1_hv_b(:,:) 
    693       ENDIF 
    694       ! 
    695       ! 
     403         sshn_e(:,:) =    pssh(:,:,Kbb) 
     404         un_e  (:,:) =    puu_b(:,:,Kbb)          
     405         vn_e  (:,:) =    pvv_b(:,:,Kbb) 
     406         ! 
     407         hu_e  (:,:) =    hu(:,:,Kbb)        
     408         hv_e  (:,:) =    hv(:,:,Kbb)  
     409         hur_e (:,:) = r1_hu(:,:,Kbb)     
     410         hvr_e (:,:) = r1_hv(:,:,Kbb) 
     411      ENDIF 
    696412      ! 
    697413      ! Initialize sums: 
    698       ua_b  (:,:) = 0._wp       ! After barotropic velocities (or transport if flux form)           
    699       va_b  (:,:) = 0._wp 
    700       ssha  (:,:) = 0._wp       ! Sum for after averaged sea level 
     414      puu_b  (:,:,Kaa) = 0._wp       ! After barotropic velocities (or transport if flux form)           
     415      pvv_b  (:,:,Kaa) = 0._wp 
     416      pssh  (:,:,Kaa) = 0._wp       ! Sum for after averaged sea level 
    701417      un_adv(:,:) = 0._wp       ! Sum for now transport issued from ts loop 
    702418      vn_adv(:,:) = 0._wp 
     
    714430         ! 
    715431         l_full_nf_update = jn == icycle   ! false: disable full North fold update (performances) for jn = 1 to icycle-1 
    716          !                                                !  ------------------ 
    717          !                                                !* Update the forcing (BDY and tides) 
    718          !                                                !  ------------------ 
    719          ! Update only tidal forcing at open boundaries 
    720          IF( ln_bdy      .AND. ln_tide )   CALL bdy_dta_tides( kt, kit=jn, time_offset= noffset+1 ) 
    721          IF( ln_tide_pot .AND. ln_tide )   CALL upd_tide     ( kt, kit=jn, time_offset= noffset   ) 
    722          ! 
    723          ! Set extrapolation coefficients for predictor step: 
     432         ! 
     433         !                    !==  Update the forcing ==! (BDY and tides) 
     434         ! 
     435         IF( ln_bdy      .AND. ln_tide )   CALL bdy_dta_tides( kt, kit=jn, pt_offset= REAL(noffset+1,wp) ) 
     436         ! Update tide potential at the beginning of current time substep 
     437         IF( ln_tide_pot .AND. ln_tide ) THEN 
     438            zt0substep = REAL(nsec_day, wp) - 0.5_wp*rn_Dt + (jn + noffset - 1) * rn_Dt / REAL(nn_e, wp) 
     439            CALL upd_tide(zt0substep, Kmm) 
     440         END IF 
     441         ! 
     442         !                    !==  extrapolation at mid-step  ==!   (jn+1/2) 
     443         ! 
     444         !                       !* Set extrapolation coefficients for predictor step: 
    724445         IF ((jn<3).AND.ll_init) THEN      ! Forward            
    725446           za1 = 1._wp                                           
     
    731452           za3 =  0.281105_wp              ! za3 = bet 
    732453         ENDIF 
    733  
    734          ! Extrapolate barotropic velocities at step jit+0.5: 
     454         ! 
     455         !                       !* Extrapolate barotropic velocities at mid-step (jn+1/2) 
     456         !--        m+1/2               m                m-1           m-2       --! 
     457         !--       u      = (3/2+beta) u   -(1/2+2beta) u      + beta u          --! 
     458         !-------------------------------------------------------------------------! 
    735459         ua_e(:,:) = za1 * un_e(:,:) + za2 * ub_e(:,:) + za3 * ubb_e(:,:) 
    736460         va_e(:,:) = za1 * vn_e(:,:) + za2 * vb_e(:,:) + za3 * vbb_e(:,:) 
     
    739463            !                                             !  ------------------ 
    740464            ! Extrapolate Sea Level at step jit+0.5: 
     465            !--         m+1/2                 m                  m-1             m-2       --! 
     466            !--      ssh      = (3/2+beta) ssh   -(1/2+2beta) ssh      + beta ssh          --! 
     467            !--------------------------------------------------------------------------------! 
    741468            zsshp2_e(:,:) = za1 * sshn_e(:,:)  + za2 * sshb_e(:,:) + za3 * sshbb_e(:,:) 
    742469             
    743             ! set wetting & drying mask at tracer points for this barotropic sub-step  
    744             IF ( ln_wd_dl ) THEN  
    745                ! 
    746                IF ( ln_wd_dl_rmp ) THEN  
    747                   DO jj = 1, jpj                                  
    748                      DO ji = 1, jpi   ! vector opt.   
    749                         IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  2._wp * rn_wdmin1 ) THEN  
    750 !                        IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  rn_wdmin2 ) THEN  
    751                            ztwdmask(ji,jj) = 1._wp 
    752                         ELSE IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN 
    753                            ztwdmask(ji,jj) = (tanh(50._wp*( ( zsshp2_e(ji,jj) + ht_0(ji,jj) -  rn_wdmin1 )*r_rn_wdmin1)) )  
    754                         ELSE  
    755                            ztwdmask(ji,jj) = 0._wp 
    756                         END IF 
    757                      END DO 
    758                   END DO 
    759                ELSE 
    760                   DO jj = 1, jpj                                  
    761                      DO ji = 1, jpi   ! vector opt.   
    762                         IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN  
    763                            ztwdmask(ji,jj) = 1._wp 
    764                         ELSE  
    765                            ztwdmask(ji,jj) = 0._wp 
    766                         ENDIF 
    767                      END DO 
    768                   END DO 
    769                ENDIF  
    770                ! 
    771             ENDIF  
     470            ! set wetting & drying mask at tracer points for this barotropic mid-step 
     471            IF( ln_wd_dl )   CALL wad_tmsk( zsshp2_e, ztwdmask ) 
    772472            ! 
    773             DO jj = 2, jpjm1                                    ! Sea Surface Height at u- & v-points 
    774                DO ji = 2, fs_jpim1   ! Vector opt. 
    775                   zwx(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj)     & 
    776                      &              * ( e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
    777                      &              +   e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) 
    778                   zwy(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj)     & 
    779                      &              * ( e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
    780                      &              +   e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) 
    781                END DO 
    782             END DO 
    783             CALL lbc_lnk_multi( 'dynspg_ts', zwx, 'U', 1._wp, zwy, 'V', 1._wp ) 
     473            !                          ! ocean t-depth at mid-step 
     474            zhtp2_e(:,:) = ht_0(:,:) + zsshp2_e(:,:) 
    784475            ! 
    785             zhup2_e(:,:) = hu_0(:,:) + zwx(:,:)                ! Ocean depth at U- and V-points 
    786             zhvp2_e(:,:) = hv_0(:,:) + zwy(:,:) 
    787             zhtp2_e(:,:) = ht_0(:,:) + zsshp2_e(:,:) 
    788          ELSE 
    789             zhup2_e(:,:) = hu_n(:,:) 
    790             zhvp2_e(:,:) = hv_n(:,:) 
    791             zhtp2_e(:,:) = ht_n(:,:) 
    792          ENDIF 
    793          !                                                !* after ssh 
    794          !                                                !  ----------- 
    795          ! 
    796          ! Enforce volume conservation at open boundaries: 
     476            !                          ! ocean u- and v-depth at mid-step   (separate DO-loops remove the need of a lbc_lnk) 
     477            DO_2D( 1, 1, 1, 0 ) 
     478               zhup2_e(ji,jj) = hu_0(ji,jj) + r1_2 * r1_e1e2u(ji,jj)                        & 
     479                    &                              * (  e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
     480                    &                                 + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj)  ) * ssumask(ji,jj) 
     481            END_2D 
     482            DO_2D( 1, 0, 1, 1 ) 
     483               zhvp2_e(ji,jj) = hv_0(ji,jj) + r1_2 * r1_e1e2v(ji,jj)                        & 
     484                    &                              * (  e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
     485                    &                                 + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1)  ) * ssvmask(ji,jj) 
     486            END_2D 
     487            ! 
     488         ENDIF 
     489         ! 
     490         !                    !==  after SSH  ==!   (jn+1) 
     491         ! 
     492         !                             ! update (ua_e,va_e) to enforce volume conservation at open boundaries 
     493         !                             ! values of zhup2_e and zhvp2_e on the halo are not needed in bdy_vol2d 
    797494         IF( ln_bdy .AND. ln_vol ) CALL bdy_vol2d( kt, jn, ua_e, va_e, zhup2_e, zhvp2_e ) 
    798          ! 
    799          zwx(:,:) = e2u(:,:) * ua_e(:,:) * zhup2_e(:,:)         ! fluxes at jn+0.5 
    800          zwy(:,:) = e1v(:,:) * va_e(:,:) * zhvp2_e(:,:) 
     495         !       
     496         !                             ! resulting flux at mid-step (not over the full domain) 
     497         zhU(1:jpim1,1:jpj  ) = e2u(1:jpim1,1:jpj  ) * ua_e(1:jpim1,1:jpj  ) * zhup2_e(1:jpim1,1:jpj  )   ! not jpi-column 
     498         zhV(1:jpi  ,1:jpjm1) = e1v(1:jpi  ,1:jpjm1) * va_e(1:jpi  ,1:jpjm1) * zhvp2_e(1:jpi  ,1:jpjm1)   ! not jpj-row 
    801499         ! 
    802500#if defined key_agrif 
    803501         ! Set fluxes during predictor step to ensure volume conservation 
    804          IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) THEN 
    805             IF((nbondi == -1).OR.(nbondi == 2)) THEN 
    806                DO jj = 1, jpj 
    807                   zwx(2:nbghostcells+1,jj) = ubdy_w(1:nbghostcells,jj) * e2u(2:nbghostcells+1,jj) 
    808                   zwy(2:nbghostcells+1,jj) = vbdy_w(1:nbghostcells,jj) * e1v(2:nbghostcells+1,jj) 
    809                END DO 
    810             ENDIF 
    811             IF((nbondi ==  1).OR.(nbondi == 2)) THEN 
    812                DO jj=1,jpj 
    813                   zwx(nlci-nbghostcells-1:nlci-2,jj) = ubdy_e(1:nbghostcells,jj) * e2u(nlci-nbghostcells-1:nlci-2,jj) 
    814                   zwy(nlci-nbghostcells  :nlci-1,jj) = vbdy_e(1:nbghostcells,jj) * e1v(nlci-nbghostcells  :nlci-1,jj) 
    815                END DO 
    816             ENDIF 
    817             IF((nbondj == -1).OR.(nbondj == 2)) THEN 
    818                DO ji=1,jpi 
    819                   zwy(ji,2:nbghostcells+1) = vbdy_s(ji,1:nbghostcells) * e1v(ji,2:nbghostcells+1) 
    820                   zwx(ji,2:nbghostcells+1) = ubdy_s(ji,1:nbghostcells) * e2u(ji,2:nbghostcells+1) 
    821                END DO 
    822             ENDIF 
    823             IF((nbondj ==  1).OR.(nbondj == 2)) THEN 
    824                DO ji=1,jpi 
    825                   zwy(ji,nlcj-nbghostcells-1:nlcj-2) = vbdy_n(ji,1:nbghostcells) * e1v(ji,nlcj-nbghostcells-1:nlcj-2) 
    826                   zwx(ji,nlcj-nbghostcells  :nlcj-1) = ubdy_n(ji,1:nbghostcells) * e2u(ji,nlcj-nbghostcells  :nlcj-1) 
    827                END DO 
    828             ENDIF 
    829          ENDIF 
     502         IF( .NOT.Agrif_Root() .AND. ln_bt_fw ) CALL agrif_dyn_ts_flux( jn, zhU, zhV ) 
    830503#endif 
    831          IF( ln_wd_il )   CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rdtbt) 
    832  
    833          IF ( ln_wd_dl ) THEN  
    834             ! 
    835             ! un_e and vn_e are set to zero at faces where the direction of the flow is from dry cells  
    836             ! 
    837             DO jj = 1, jpjm1                                  
    838                DO ji = 1, jpim1    
    839                   IF ( zwx(ji,jj) > 0.0 ) THEN  
    840                      zuwdmask(ji, jj) = ztwdmask(ji  ,jj)  
    841                   ELSE  
    842                      zuwdmask(ji, jj) = ztwdmask(ji+1,jj)   
    843                   END IF  
    844                   zwx(ji, jj) = zuwdmask(ji,jj)*zwx(ji, jj) 
    845                   un_e(ji,jj) = zuwdmask(ji,jj)*un_e(ji,jj) 
    846  
    847                   IF ( zwy(ji,jj) > 0.0 ) THEN 
    848                      zvwdmask(ji, jj) = ztwdmask(ji, jj  ) 
    849                   ELSE  
    850                      zvwdmask(ji, jj) = ztwdmask(ji, jj+1)   
    851                   END IF  
    852                   zwy(ji, jj) = zvwdmask(ji,jj)*zwy(ji,jj)  
    853                   vn_e(ji,jj) = zvwdmask(ji,jj)*vn_e(ji,jj) 
    854                END DO 
    855             END DO 
     504         IF( ln_wd_il )   CALL wad_lmt_bt(zhU, zhV, sshn_e, zssh_frc, rDt_e)    !!gm wad_lmt_bt use of lbc_lnk on zhU, zhV 
     505 
     506         IF( ln_wd_dl ) THEN           ! un_e and vn_e are set to zero at faces where  
     507            !                          ! the direction of the flow is from dry cells 
     508            CALL wad_Umsk( ztwdmask, zhU, zhV, un_e, vn_e, zuwdmask, zvwdmask )   ! not jpi colomn for U, not jpj row for V 
    856509            ! 
    857510         ENDIF     
    858           
    859          ! Sum over sub-time-steps to compute advective velocities 
    860          za2 = wgtbtp2(jn) 
    861          un_adv(:,:) = un_adv(:,:) + za2 * zwx(:,:) * r1_e2u(:,:) 
    862          vn_adv(:,:) = vn_adv(:,:) + za2 * zwy(:,:) * r1_e1v(:,:) 
    863           
    864          ! sum over sub-time-steps to decide which baroclinic velocities to set to zero (zuwdav2 is only used when ln_wd_dl_bc = True)  
    865          IF ( ln_wd_dl_bc ) THEN 
    866             zuwdav2(:,:) = zuwdav2(:,:) + za2 * zuwdmask(:,:) 
    867             zvwdav2(:,:) = zvwdav2(:,:) + za2 * zvwdmask(:,:) 
    868          END IF  
    869  
    870          ! Set next sea level: 
    871          DO jj = 2, jpjm1                                  
    872             DO ji = fs_2, fs_jpim1   ! vector opt. 
    873                zhdiv(ji,jj) = (   zwx(ji,jj) - zwx(ji-1,jj)   & 
    874                   &             + zwy(ji,jj) - zwy(ji,jj-1)   ) * r1_e1e2t(ji,jj) 
    875             END DO 
    876          END DO 
    877          ssha_e(:,:) = (  sshn_e(:,:) - rdtbt * ( zssh_frc(:,:) + zhdiv(:,:) )  ) * ssmask(:,:) 
    878           
    879          CALL lbc_lnk( 'dynspg_ts', ssha_e, 'T',  1._wp ) 
    880  
     511         ! 
     512         ! 
     513         !     Compute Sea Level at step jit+1 
     514         !--           m+1        m                               m+1/2          --! 
     515         !--        ssh    =  ssh   - delta_t' * [ frc + div( flux      ) ]      --! 
     516         !-------------------------------------------------------------------------! 
     517         DO_2D( 0, 0, 0, 0 ) 
     518            zhdiv = (   zhU(ji,jj) - zhU(ji-1,jj) + zhV(ji,jj) - zhV(ji,jj-1)   ) * r1_e1e2t(ji,jj) 
     519            ssha_e(ji,jj) = (  sshn_e(ji,jj) - rDt_e * ( zssh_frc(ji,jj) + zhdiv )  ) * ssmask(ji,jj) 
     520         END_2D 
     521         ! 
     522         CALL lbc_lnk_multi( 'dynspg_ts', ssha_e, 'T', 1._wp,  zhU, 'U', -1._wp,  zhV, 'V', -1._wp ) 
     523         ! 
    881524         ! Duplicate sea level across open boundaries (this is only cosmetic if linssh=T) 
    882525         IF( ln_bdy )   CALL bdy_ssh( ssha_e ) 
     
    884527         IF( .NOT.Agrif_Root() )   CALL agrif_ssh_ts( jn ) 
    885528#endif 
     529         ! 
     530         !                             ! Sum over sub-time-steps to compute advective velocities 
     531         za2 = wgtbtp2(jn)             ! zhU, zhV hold fluxes extrapolated at jn+0.5 
     532         un_adv(:,:) = un_adv(:,:) + za2 * zhU(:,:) * r1_e2u(:,:) 
     533         vn_adv(:,:) = vn_adv(:,:) + za2 * zhV(:,:) * r1_e1v(:,:) 
     534         ! sum over sub-time-steps to decide which baroclinic velocities to set to zero (zuwdav2 is only used when ln_wd_dl_bc=True)  
     535         IF ( ln_wd_dl_bc ) THEN 
     536            zuwdav2(1:jpim1,1:jpj  ) = zuwdav2(1:jpim1,1:jpj  ) + za2 * zuwdmask(1:jpim1,1:jpj  )   ! not jpi-column 
     537            zvwdav2(1:jpi  ,1:jpjm1) = zvwdav2(1:jpi  ,1:jpjm1) + za2 * zvwdmask(1:jpi  ,1:jpjm1)   ! not jpj-row 
     538         END IF 
     539         ! 
    886540         !   
    887541         ! Sea Surface Height at u-,v-points (vvl case only) 
    888542         IF( .NOT.ln_linssh ) THEN                                 
    889             DO jj = 2, jpjm1 
    890                DO ji = 2, jpim1      ! NO Vector Opt. 
    891                   zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
    892                      &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
    893                      &              +   e1e2t(ji+1,jj  )  * ssha_e(ji+1,jj  ) ) 
    894                   zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj)    & 
    895                      &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
    896                      &              +   e1e2t(ji  ,jj+1)  * ssha_e(ji  ,jj+1) ) 
    897                END DO 
    898             END DO 
    899             CALL lbc_lnk_multi( 'dynspg_ts', zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) 
     543            DO_2D( 0, 0, 0, 0 ) 
     544               zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
     545                  &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
     546                  &              +   e1e2t(ji+1,jj  )  * ssha_e(ji+1,jj  ) ) 
     547               zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj)    & 
     548                  &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
     549                  &              +   e1e2t(ji  ,jj+1)  * ssha_e(ji  ,jj+1) ) 
     550            END_2D 
    900551         ENDIF    
    901          !                                  
    902          ! Half-step back interpolation of SSH for surface pressure computation: 
    903          !---------------------------------------------------------------------- 
    904          IF ((jn==1).AND.ll_init) THEN 
    905            za0=1._wp                        ! Forward-backward 
    906            za1=0._wp                            
    907            za2=0._wp 
    908            za3=0._wp 
    909          ELSEIF ((jn==2).AND.ll_init) THEN  ! AB2-AM3 Coefficients; bet=0 ; gam=-1/6 ; eps=1/12 
    910            za0= 1.0833333333333_wp          ! za0 = 1-gam-eps 
    911            za1=-0.1666666666666_wp          ! za1 = gam 
    912            za2= 0.0833333333333_wp          ! za2 = eps 
    913            za3= 0._wp               
    914          ELSE                               ! AB3-AM4 Coefficients; bet=0.281105 ; eps=0.013 ; gam=0.0880  
    915             IF (rn_bt_alpha==0._wp) THEN 
    916                za0=0.614_wp                 ! za0 = 1/2 +   gam + 2*eps 
    917                za1=0.285_wp                 ! za1 = 1/2 - 2*gam - 3*eps 
    918                za2=0.088_wp                 ! za2 = gam 
    919                za3=0.013_wp                 ! za3 = eps 
    920             ELSE 
    921                zepsilon = 0.00976186_wp - 0.13451357_wp * rn_bt_alpha 
    922                zgamma = 0.08344500_wp - 0.51358400_wp * rn_bt_alpha 
    923                za0 = 0.5_wp + zgamma + 2._wp * rn_bt_alpha + 2._wp * zepsilon 
    924                za1 = 1._wp - za0 - zgamma - zepsilon 
    925                za2 = zgamma 
    926                za3 = zepsilon 
    927             ENDIF  
    928          ENDIF 
    929          ! 
     552         !          
     553         ! Half-step back interpolation of SSH for surface pressure computation at step jit+1/2 
     554         !--            m+1/2           m+1              m               m-1              m-2     --! 
     555         !--        ssh'    =  za0 * ssh     +  za1 * ssh   +  za2 * ssh      +  za3 * ssh        --! 
     556         !------------------------------------------------------------------------------------------! 
     557         CALL ts_bck_interp( jn, ll_init, za0, za1, za2, za3 )   ! coeficients of the interpolation 
    930558         zsshp2_e(:,:) = za0 *  ssha_e(:,:) + za1 *  sshn_e (:,:)   & 
    931559            &          + za2 *  sshb_e(:,:) + za3 *  sshbb_e(:,:) 
    932           
    933          IF( ln_wd_il ) THEN                   ! Calculating and applying W/D gravity filters 
    934            DO jj = 2, jpjm1 
    935               DO ji = 2, jpim1  
    936                 ll_tmp1 = MIN( zsshp2_e(ji,jj)               , zsshp2_e(ji+1,jj) ) >                & 
    937                      &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji+1,jj) ) .AND.            & 
    938                      &    MAX( zsshp2_e(ji,jj) + ht_0(ji,jj) , zsshp2_e(ji+1,jj) + ht_0(ji+1,jj) ) & 
    939                      &                                                             > rn_wdmin1 + rn_wdmin2 
    940                 ll_tmp2 = (ABS(zsshp2_e(ji,jj)               - zsshp2_e(ji+1,jj))  > 1.E-12 ).AND.( & 
    941                      &    MAX( zsshp2_e(ji,jj)               , zsshp2_e(ji+1,jj) ) >                & 
    942                      &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    943     
    944                 IF(ll_tmp1) THEN 
    945                   zcpx(ji,jj) = 1.0_wp 
    946                 ELSE IF(ll_tmp2) THEN 
    947                   ! no worries about  zsshp2_e(ji+1,jj) - zsshp2_e(ji  ,jj) = 0, it won't happen ! here 
    948                   zcpx(ji,jj) = ABS( (zsshp2_e(ji+1,jj) +     ht_0(ji+1,jj) - zsshp2_e(ji,jj) - ht_0(ji,jj)) & 
    949                               &    / (zsshp2_e(ji+1,jj) - zsshp2_e(ji  ,jj)) ) 
    950                 ELSE 
    951                   zcpx(ji,jj) = 0._wp 
    952                 ENDIF 
    953                 ! 
    954                 ll_tmp1 = MIN( zsshp2_e(ji,jj)               , zsshp2_e(ji,jj+1) ) >                & 
    955                      &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji,jj+1) ) .AND.            & 
    956                      &    MAX( zsshp2_e(ji,jj) + ht_0(ji,jj) , zsshp2_e(ji,jj+1) + ht_0(ji,jj+1) ) & 
    957                      &                                                             > rn_wdmin1 + rn_wdmin2 
    958                 ll_tmp2 = (ABS(zsshp2_e(ji,jj)               - zsshp2_e(ji,jj+1))  > 1.E-12 ).AND.( & 
    959                      &    MAX( zsshp2_e(ji,jj)               , zsshp2_e(ji,jj+1) ) >                & 
    960                      &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    961     
    962                 IF(ll_tmp1) THEN 
    963                   zcpy(ji,jj) = 1.0_wp 
    964                 ELSEIF(ll_tmp2) THEN 
    965                   ! no worries about  zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj  ) = 0, it won't happen ! here 
    966                   zcpy(ji,jj) = ABS( (zsshp2_e(ji,jj+1) +     ht_0(ji,jj+1) - zsshp2_e(ji,jj) - ht_0(ji,jj)) & 
    967                               &    / (zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj  )) ) 
    968                 ELSE 
    969                   zcpy(ji,jj) = 0._wp 
    970                 ENDIF 
    971               END DO 
    972            END DO 
    973          ENDIF 
    974          ! 
    975          ! Compute associated depths at U and V points: 
    976          IF( .NOT.ln_linssh  .AND. .NOT.ln_dynadv_vec ) THEN     !* Vector form 
    977             !                                         
    978             DO jj = 2, jpjm1                             
    979                DO ji = 2, jpim1 
    980                   zx1 = r1_2 * ssumask(ji  ,jj) *  r1_e1e2u(ji  ,jj)    & 
    981                      &      * ( e1e2t(ji  ,jj  ) * zsshp2_e(ji  ,jj)    & 
    982                      &      +   e1e2t(ji+1,jj  ) * zsshp2_e(ji+1,jj  ) ) 
    983                   zy1 = r1_2 * ssvmask(ji  ,jj) *  r1_e1e2v(ji  ,jj  )  & 
    984                      &       * ( e1e2t(ji ,jj  ) * zsshp2_e(ji  ,jj  )  & 
    985                      &       +   e1e2t(ji ,jj+1) * zsshp2_e(ji  ,jj+1) ) 
    986                   zhust_e(ji,jj) = hu_0(ji,jj) + zx1  
    987                   zhvst_e(ji,jj) = hv_0(ji,jj) + zy1 
    988                END DO 
    989             END DO 
    990             ! 
     560         ! 
     561         !                             ! Surface pressure gradient 
     562         zldg = ( 1._wp - rn_scal_load ) * grav    ! local factor 
     563         DO_2D( 0, 0, 0, 0 ) 
     564            zu_spg(ji,jj) = - zldg * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
     565            zv_spg(ji,jj) = - zldg * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
     566         END_2D 
     567         IF( ln_wd_il ) THEN        ! W/D : gravity filters applied on pressure gradient 
     568            CALL wad_spg( zsshp2_e, zcpx, zcpy )   ! Calculating W/D gravity filters 
     569            zu_spg(2:jpim1,2:jpjm1) = zu_spg(2:jpim1,2:jpjm1) * zcpx(2:jpim1,2:jpjm1) 
     570            zv_spg(2:jpim1,2:jpjm1) = zv_spg(2:jpim1,2:jpjm1) * zcpy(2:jpim1,2:jpjm1) 
    991571         ENDIF 
    992572         ! 
     
    994574         ! zwz array below or triads normally depend on sea level with ln_linssh=F and should be updated 
    995575         ! at each time step. We however keep them constant here for optimization. 
    996          ! Recall that zwx and zwy arrays hold fluxes at this stage: 
    997          ! zwx(:,:) = e2u(:,:) * ua_e(:,:) * zhup2_e(:,:)   ! fluxes at jn+0.5 
    998          ! zwy(:,:) = e1v(:,:) * va_e(:,:) * zhvp2_e(:,:) 
    999          ! 
    1000          SELECT CASE( nvor_scheme ) 
    1001          CASE( np_ENT )             ! energy conserving scheme (t-point) 
    1002          DO jj = 2, jpjm1 
    1003             DO ji = 2, jpim1   ! vector opt. 
    1004  
    1005                z1_hu = ssumask(ji,jj) / ( zhup2_e(ji,jj) + 1._wp - ssumask(ji,jj) ) 
    1006                z1_hv = ssvmask(ji,jj) / ( zhvp2_e(ji,jj) + 1._wp - ssvmask(ji,jj) ) 
    1007              
    1008                zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * z1_hu                   & 
    1009                   &               * (  e1e2t(ji+1,jj)*zhtp2_e(ji+1,jj)*ff_t(ji+1,jj) * ( va_e(ji+1,jj) + va_e(ji+1,jj-1) )   & 
    1010                   &                  + e1e2t(ji  ,jj)*zhtp2_e(ji  ,jj)*ff_t(ji  ,jj) * ( va_e(ji  ,jj) + va_e(ji  ,jj-1) )   ) 
    1011                   ! 
    1012                zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * z1_hv                    & 
    1013                   &               * (  e1e2t(ji,jj+1)*zhtp2_e(ji,jj+1)*ff_t(ji,jj+1) * ( ua_e(ji,jj+1) + ua_e(ji-1,jj+1) )   &  
    1014                   &                  + e1e2t(ji,jj  )*zhtp2_e(ji,jj  )*ff_t(ji,jj  ) * ( ua_e(ji,jj  ) + ua_e(ji-1,jj  ) )   )  
    1015             END DO   
    1016          END DO   
    1017          !          
    1018          CASE( np_ENE, np_MIX )     ! energy conserving scheme (f-point) 
    1019             DO jj = 2, jpjm1 
    1020                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1021                   zy1 = ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) ) * r1_e1u(ji,jj) 
    1022                   zy2 = ( zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    1023                   zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 
    1024                   zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    1025                   zu_trd(ji,jj) = r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    1026                   zv_trd(ji,jj) =-r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    1027                END DO 
    1028             END DO 
    1029             ! 
    1030          CASE( np_ENS )             ! enstrophy conserving scheme (f-point) 
    1031             DO jj = 2, jpjm1 
    1032                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1033                   zy1 =   r1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    1034                    &             + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    1035                   zx1 = - r1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    1036                    &             + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    1037                   zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    1038                   zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
    1039                END DO 
    1040             END DO 
    1041             ! 
    1042          CASE( np_EET , np_EEN )   ! energy & enstrophy scheme (using e3t or e3f) 
    1043             DO jj = 2, jpjm1 
    1044                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1045                   zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  )  & 
    1046                      &                                       + ftnw(ji+1,jj) * zwy(ji+1,jj  )  & 
    1047                      &                                       + ftse(ji,jj  ) * zwy(ji  ,jj-1)  &  
    1048                      &                                       + ftsw(ji+1,jj) * zwy(ji+1,jj-1)  ) 
    1049                   zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1)  &  
    1050                      &                                       + ftse(ji,jj+1) * zwx(ji  ,jj+1)  & 
    1051                      &                                       + ftnw(ji,jj  ) * zwx(ji-1,jj  )  &  
    1052                      &                                       + ftne(ji,jj  ) * zwx(ji  ,jj  )  ) 
    1053                END DO 
    1054             END DO 
    1055             !  
    1056          END SELECT 
     576         ! Recall that zhU and zhV hold fluxes at jn+0.5 (extrapolated not backward interpolated) 
     577         CALL dyn_cor_2d( zhtp2_e, zhup2_e, zhvp2_e, ua_e, va_e, zhU, zhV,    zu_trd, zv_trd   ) 
    1057578         ! 
    1058579         ! Add tidal astronomical forcing if defined 
    1059580         IF ( ln_tide .AND. ln_tide_pot ) THEN 
    1060             DO jj = 2, jpjm1 
    1061                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1062                   zu_spg = grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
    1063                   zv_spg = grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
    1064                   zu_trd(ji,jj) = zu_trd(ji,jj) + zu_spg 
    1065                   zv_trd(ji,jj) = zv_trd(ji,jj) + zv_spg 
    1066                END DO 
    1067             END DO 
     581            DO_2D( 0, 0, 0, 0 ) 
     582               zu_trd(ji,jj) = zu_trd(ji,jj) + grav * ( pot_astro(ji+1,jj) - pot_astro(ji,jj) ) * r1_e1u(ji,jj) 
     583               zv_trd(ji,jj) = zv_trd(ji,jj) + grav * ( pot_astro(ji,jj+1) - pot_astro(ji,jj) ) * r1_e2v(ji,jj) 
     584            END_2D 
    1068585         ENDIF 
    1069586         ! 
     
    1071588!jth do implicitly instead 
    1072589         IF ( .NOT. ll_wd ) THEN ! Revert to explicit for bit comparison tests in non wad runs 
    1073             DO jj = 2, jpjm1 
    1074                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1075                   zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj) 
    1076                   zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj) 
    1077                END DO 
    1078             END DO 
    1079          ENDIF  
    1080          ! 
    1081          ! Surface pressure trend: 
    1082          IF( ln_wd_il ) THEN 
    1083            DO jj = 2, jpjm1 
    1084               DO ji = 2, jpim1  
    1085                  ! Add surface pressure gradient 
    1086                  zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
    1087                  zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
    1088                  zwx(ji,jj) = (1._wp - rn_scal_load) * zu_spg * zcpx(ji,jj)  
    1089                  zwy(ji,jj) = (1._wp - rn_scal_load) * zv_spg * zcpy(ji,jj) 
    1090               END DO 
    1091            END DO 
    1092          ELSE 
    1093            DO jj = 2, jpjm1 
    1094               DO ji = fs_2, fs_jpim1   ! vector opt. 
    1095                  ! Add surface pressure gradient 
    1096                  zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) * r1_e1u(ji,jj) 
    1097                  zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) * r1_e2v(ji,jj) 
    1098                  zwx(ji,jj) = (1._wp - rn_scal_load) * zu_spg 
    1099                  zwy(ji,jj) = (1._wp - rn_scal_load) * zv_spg 
    1100               END DO 
    1101            END DO 
    1102          END IF 
    1103  
     590            DO_2D( 0, 0, 0, 0 ) 
     591               zu_trd(ji,jj) = zu_trd(ji,jj) + zCdU_u(ji,jj) * un_e(ji,jj) * hur_e(ji,jj) 
     592               zv_trd(ji,jj) = zv_trd(ji,jj) + zCdU_v(ji,jj) * vn_e(ji,jj) * hvr_e(ji,jj) 
     593            END_2D 
     594         ENDIF 
    1104595         ! 
    1105596         ! Set next velocities: 
     597         !     Compute barotropic speeds at step jit+1    (h : total height of the water colomn) 
     598         !--                              VECTOR FORM 
     599         !--   m+1                 m               /                                                       m+1/2           \    --! 
     600         !--  u     =             u   + delta_t' * \         (1-r)*g * grad_x( ssh') -         f * k vect u      +     frc /    --! 
     601         !--                                                                                                                    --! 
     602         !--                             FLUX FORM                                                                              --! 
     603         !--  m+1   __1__  /  m    m               /  m+1/2                             m+1/2              m+1/2    n      \ \  --! 
     604         !-- u    =   m+1 |  h  * u   + delta_t' * \ h     * (1-r)*g * grad_x( ssh') - h     * f * k vect u      + h * frc /  | --! 
     605         !--         h     \                                                                                                 /  --! 
     606         !------------------------------------------------------------------------------------------------------------------------! 
    1106607         IF( ln_dynadv_vec .OR. ln_linssh ) THEN      !* Vector form 
    1107             DO jj = 2, jpjm1 
    1108                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1109                   ua_e(ji,jj) = (                                 un_e(ji,jj)   &  
    1110                             &     + rdtbt * (                      zwx(ji,jj)   & 
    1111                             &                                 + zu_trd(ji,jj)   & 
    1112                             &                                 + zu_frc(ji,jj) ) &  
    1113                             &   ) * ssumask(ji,jj) 
    1114  
    1115                   va_e(ji,jj) = (                                 vn_e(ji,jj)   & 
    1116                             &     + rdtbt * (                      zwy(ji,jj)   & 
    1117                             &                                 + zv_trd(ji,jj)   & 
    1118                             &                                 + zv_frc(ji,jj) ) & 
    1119                             &   ) * ssvmask(ji,jj) 
    1120   
    1121                END DO 
    1122             END DO 
     608            DO_2D( 0, 0, 0, 0 ) 
     609               ua_e(ji,jj) = (                                 un_e(ji,jj)   &  
     610                         &     + rDt_e * (                   zu_spg(ji,jj)   & 
     611                         &                                 + zu_trd(ji,jj)   & 
     612                         &                                 + zu_frc(ji,jj) ) &  
     613                         &   ) * ssumask(ji,jj) 
     614 
     615               va_e(ji,jj) = (                                 vn_e(ji,jj)   & 
     616                         &     + rDt_e * (                   zv_spg(ji,jj)   & 
     617                         &                                 + zv_trd(ji,jj)   & 
     618                         &                                 + zv_frc(ji,jj) ) & 
     619                         &   ) * ssvmask(ji,jj) 
     620            END_2D 
    1123621            ! 
    1124622         ELSE                           !* Flux form 
    1125             DO jj = 2, jpjm1 
    1126                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1127  
    1128                   zhura = hu_0(ji,jj) + zsshu_a(ji,jj) 
    1129                   zhvra = hv_0(ji,jj) + zsshv_a(ji,jj) 
    1130  
    1131                   zhura = ssumask(ji,jj)/(zhura + 1._wp - ssumask(ji,jj)) 
    1132                   zhvra = ssvmask(ji,jj)/(zhvra + 1._wp - ssvmask(ji,jj)) 
    1133  
    1134                   ua_e(ji,jj) = (                hu_e(ji,jj)  *   un_e(ji,jj)   &  
    1135                             &     + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)   &  
    1136                             &               + zhup2_e(ji,jj)  * zu_trd(ji,jj)   & 
    1137                             &               +    hu_n(ji,jj)  * zu_frc(ji,jj) ) & 
    1138                             &   ) * zhura 
    1139  
    1140                   va_e(ji,jj) = (                hv_e(ji,jj)  *   vn_e(ji,jj)   & 
    1141                             &     + rdtbt * ( zhvst_e(ji,jj)  *    zwy(ji,jj)   & 
    1142                             &               + zhvp2_e(ji,jj)  * zv_trd(ji,jj)   & 
    1143                             &               +    hv_n(ji,jj)  * zv_frc(ji,jj) ) & 
    1144                             &   ) * zhvra 
    1145                END DO 
    1146             END DO 
     623            DO_2D( 0, 0, 0, 0 ) 
     624               !                    ! hu_e, hv_e hold depth at jn,  zhup2_e, zhvp2_e hold extrapolated depth at jn+1/2 
     625               !                    ! backward interpolated depth used in spg terms at jn+1/2 
     626               zhu_bck = hu_0(ji,jj) + r1_2*r1_e1e2u(ji,jj) * (  e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)    & 
     627                    &                                          + e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj)  ) * ssumask(ji,jj) 
     628               zhv_bck = hv_0(ji,jj) + r1_2*r1_e1e2v(ji,jj) * (  e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )    & 
     629                    &                                          + e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1)  ) * ssvmask(ji,jj) 
     630               !                    ! inverse depth at jn+1 
     631               z1_hu = ssumask(ji,jj) / ( hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - ssumask(ji,jj) ) 
     632               z1_hv = ssvmask(ji,jj) / ( hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - ssvmask(ji,jj) ) 
     633               ! 
     634               ua_e(ji,jj) = (               hu_e  (ji,jj) *   un_e (ji,jj)      &  
     635                    &            + rDt_e * (  zhu_bck        * zu_spg (ji,jj)  &   ! 
     636                    &                       + zhup2_e(ji,jj) * zu_trd (ji,jj)  &   ! 
     637                    &                       +  hu(ji,jj,Kmm) * zu_frc (ji,jj)  )   ) * z1_hu 
     638               ! 
     639               va_e(ji,jj) = (               hv_e  (ji,jj) *   vn_e (ji,jj)      & 
     640                    &            + rDt_e * (  zhv_bck        * zv_spg (ji,jj)  &   ! 
     641                    &                       + zhvp2_e(ji,jj) * zv_trd (ji,jj)  &   ! 
     642                    &                       +  hv(ji,jj,Kmm) * zv_frc (ji,jj)  )   ) * z1_hv 
     643            END_2D 
    1147644         ENDIF 
    1148645!jth implicit bottom friction: 
    1149646         IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs 
    1150             DO jj = 2, jpjm1 
    1151                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1152                      ua_e(ji,jj) =  ua_e(ji,jj) /(1.0 -   rdtbt * zCdU_u(ji,jj) * hur_e(ji,jj)) 
    1153                      va_e(ji,jj) =  va_e(ji,jj) /(1.0 -   rdtbt * zCdU_v(ji,jj) * hvr_e(ji,jj)) 
    1154                END DO 
    1155             END DO 
    1156          ENDIF 
    1157  
    1158           
    1159          IF( .NOT.ln_linssh ) THEN                     !* Update ocean depth (variable volume case only) 
    1160             hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 
    1161             hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 
    1162             hur_e(:,:) = ssumask(:,:) / ( hu_e(:,:) + 1._wp - ssumask(:,:) ) 
    1163             hvr_e(:,:) = ssvmask(:,:) / ( hv_e(:,:) + 1._wp - ssvmask(:,:) ) 
    1164             ! 
    1165          ENDIF 
    1166          !                                             !* domain lateral boundary 
    1167          CALL lbc_lnk_multi( 'dynspg_ts', ua_e, 'U', -1._wp, va_e , 'V', -1._wp ) 
    1168          ! 
     647            DO_2D( 0, 0, 0, 0 ) 
     648                  ua_e(ji,jj) =  ua_e(ji,jj) /(1.0 -   rDt_e * zCdU_u(ji,jj) * hur_e(ji,jj)) 
     649                  va_e(ji,jj) =  va_e(ji,jj) /(1.0 -   rDt_e * zCdU_v(ji,jj) * hvr_e(ji,jj)) 
     650            END_2D 
     651         ENDIF 
     652        
     653         IF( .NOT.ln_linssh ) THEN !* Update ocean depth (variable volume case only) 
     654            hu_e (2:jpim1,2:jpjm1) = hu_0(2:jpim1,2:jpjm1) + zsshu_a(2:jpim1,2:jpjm1) 
     655            hur_e(2:jpim1,2:jpjm1) = ssumask(2:jpim1,2:jpjm1) / ( hu_e(2:jpim1,2:jpjm1) + 1._wp - ssumask(2:jpim1,2:jpjm1) ) 
     656            hv_e (2:jpim1,2:jpjm1) = hv_0(2:jpim1,2:jpjm1) + zsshv_a(2:jpim1,2:jpjm1) 
     657            hvr_e(2:jpim1,2:jpjm1) = ssvmask(2:jpim1,2:jpjm1) / ( hv_e(2:jpim1,2:jpjm1) + 1._wp - ssvmask(2:jpim1,2:jpjm1) ) 
     658         ENDIF 
     659         ! 
     660         IF( .NOT.ln_linssh ) THEN   !* Update ocean depth (variable volume case only) 
     661            CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp  & 
     662                 &                         , hu_e , 'U',  1._wp, hv_e , 'V',  1._wp  & 
     663                 &                         , hur_e, 'U',  1._wp, hvr_e, 'V',  1._wp  ) 
     664         ELSE 
     665            CALL lbc_lnk_multi( 'dynspg_ts', ua_e , 'U', -1._wp, va_e , 'V', -1._wp  ) 
     666         ENDIF 
    1169667         !                                                 ! open boundaries 
    1170668         IF( ln_bdy )   CALL bdy_dyn2d( jn, ua_e, va_e, un_e, vn_e, hur_e, hvr_e, ssha_e ) 
     
    1190688         za1 = wgtbtp1(jn)                                     
    1191689         IF( ln_dynadv_vec .OR. ln_linssh ) THEN    ! Sum velocities 
    1192             ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:)  
    1193             va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:)  
     690            puu_b  (:,:,Kaa) = puu_b  (:,:,Kaa) + za1 * ua_e  (:,:)  
     691            pvv_b  (:,:,Kaa) = pvv_b  (:,:,Kaa) + za1 * va_e  (:,:)  
    1194692         ELSE                                       ! Sum transports 
    1195693            IF ( .NOT.ln_wd_dl ) THEN   
    1196                ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:) * hu_e (:,:) 
    1197                va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:) * hv_e (:,:) 
     694               puu_b  (:,:,Kaa) = puu_b  (:,:,Kaa) + za1 * ua_e  (:,:) * hu_e (:,:) 
     695               pvv_b  (:,:,Kaa) = pvv_b  (:,:,Kaa) + za1 * va_e  (:,:) * hv_e (:,:) 
    1198696            ELSE  
    1199                ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:) * hu_e (:,:) * zuwdmask(:,:) 
    1200                va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:) * hv_e (:,:) * zvwdmask(:,:) 
     697               puu_b  (:,:,Kaa) = puu_b  (:,:,Kaa) + za1 * ua_e  (:,:) * hu_e (:,:) * zuwdmask(:,:) 
     698               pvv_b  (:,:,Kaa) = pvv_b  (:,:,Kaa) + za1 * va_e  (:,:) * hv_e (:,:) * zvwdmask(:,:) 
    1201699            END IF  
    1202700         ENDIF 
    1203701         !                                          ! Sum sea level 
    1204          ssha(:,:) = ssha(:,:) + za1 * ssha_e(:,:) 
     702         pssh(:,:,Kaa) = pssh(:,:,Kaa) + za1 * ssha_e(:,:) 
    1205703 
    1206704         !                                                 ! ==================== ! 
     
    1213711      ! Set advection velocity correction: 
    1214712      IF (ln_bt_fw) THEN 
    1215          zwx(:,:) = un_adv(:,:) 
    1216          zwy(:,:) = vn_adv(:,:) 
    1217          IF( .NOT.( kt == nit000 .AND. neuler==0 ) ) THEN 
    1218             un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) - atfp * un_bf(:,:) ) 
    1219             vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) - atfp * vn_bf(:,:) ) 
    1220             ! 
    1221             ! Update corrective fluxes for next time step: 
    1222             un_bf(:,:)  = atfp * un_bf(:,:) + (zwx(:,:) - ub2_b(:,:)) 
    1223             vn_bf(:,:)  = atfp * vn_bf(:,:) + (zwy(:,:) - vb2_b(:,:)) 
     713         IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN 
     714            DO_2D( 1, 1, 1, 1 ) 
     715               zun_save = un_adv(ji,jj) 
     716               zvn_save = vn_adv(ji,jj) 
     717               !                          ! apply the previously computed correction  
     718               un_adv(ji,jj) = r1_2 * ( ub2_b(ji,jj) + zun_save - rn_atfp * un_bf(ji,jj) ) 
     719               vn_adv(ji,jj) = r1_2 * ( vb2_b(ji,jj) + zvn_save - rn_atfp * vn_bf(ji,jj) ) 
     720               !                          ! Update corrective fluxes for next time step 
     721               un_bf(ji,jj)  = rn_atfp * un_bf(ji,jj) + ( zun_save - ub2_b(ji,jj) ) 
     722               vn_bf(ji,jj)  = rn_atfp * vn_bf(ji,jj) + ( zvn_save - vb2_b(ji,jj) ) 
     723               !                          ! Save integrated transport for next computation 
     724               ub2_b(ji,jj) = zun_save 
     725               vb2_b(ji,jj) = zvn_save 
     726            END_2D 
    1224727         ELSE 
    1225             un_bf(:,:) = 0._wp 
    1226             vn_bf(:,:) = 0._wp  
    1227          END IF          
    1228          ! Save integrated transport for next computation 
    1229          ub2_b(:,:) = zwx(:,:) 
    1230          vb2_b(:,:) = zwy(:,:) 
     728            un_bf(:,:) = 0._wp            ! corrective fluxes for next time step set to zero 
     729            vn_bf(:,:) = 0._wp 
     730            ub2_b(:,:) = un_adv(:,:)      ! Save integrated transport for next computation 
     731            vb2_b(:,:) = vn_adv(:,:) 
     732         END IF 
    1231733      ENDIF 
    1232734 
     
    1236738      IF( ln_dynadv_vec .OR. ln_linssh ) THEN 
    1237739         DO jk=1,jpkm1 
    1238             ua(:,:,jk) = ua(:,:,jk) + ( ua_b(:,:) - ub_b(:,:) ) * r1_2dt_b 
    1239             va(:,:,jk) = va(:,:,jk) + ( va_b(:,:) - vb_b(:,:) ) * r1_2dt_b 
     740            puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) ) * r1_Dt_b 
     741            pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) ) * r1_Dt_b 
    1240742         END DO 
    1241743      ELSE 
    1242          ! At this stage, ssha has been corrected: compute new depths at velocity points 
    1243          DO jj = 1, jpjm1 
    1244             DO ji = 1, jpim1      ! NO Vector Opt. 
    1245                zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj) & 
    1246                   &              * ( e1e2t(ji  ,jj) * ssha(ji  ,jj)      & 
    1247                   &              +   e1e2t(ji+1,jj) * ssha(ji+1,jj) ) 
    1248                zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj) & 
    1249                   &              * ( e1e2t(ji,jj  ) * ssha(ji,jj  )      & 
    1250                   &              +   e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 
    1251             END DO 
    1252          END DO 
     744         ! At this stage, pssh(:,:,:,Krhs) has been corrected: compute new depths at velocity points 
     745         DO_2D( 1, 0, 1, 0 ) 
     746            zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj) & 
     747               &              * ( e1e2t(ji  ,jj) * pssh(ji  ,jj,Kaa)      & 
     748               &              +   e1e2t(ji+1,jj) * pssh(ji+1,jj,Kaa) ) 
     749            zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj) & 
     750               &              * ( e1e2t(ji,jj  ) * pssh(ji,jj  ,Kaa)      & 
     751               &              +   e1e2t(ji,jj+1) * pssh(ji,jj+1,Kaa) ) 
     752         END_2D 
    1253753         CALL lbc_lnk_multi( 'dynspg_ts', zsshu_a, 'U', 1._wp, zsshv_a, 'V', 1._wp ) ! Boundary conditions 
    1254754         ! 
    1255755         DO jk=1,jpkm1 
    1256             ua(:,:,jk) = ua(:,:,jk) + r1_hu_n(:,:) * ( ua_b(:,:) - ub_b(:,:) * hu_b(:,:) ) * r1_2dt_b 
    1257             va(:,:,jk) = va(:,:,jk) + r1_hv_n(:,:) * ( va_b(:,:) - vb_b(:,:) * hv_b(:,:) ) * r1_2dt_b 
     756            puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + r1_hu(:,:,Kmm) * ( puu_b(:,:,Kaa) - puu_b(:,:,Kbb) * hu(:,:,Kbb) ) * r1_Dt_b 
     757            pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + r1_hv(:,:,Kmm) * ( pvv_b(:,:,Kaa) - pvv_b(:,:,Kbb) * hv(:,:,Kbb) ) * r1_Dt_b 
    1258758         END DO 
    1259759         ! Save barotropic velocities not transport: 
    1260          ua_b(:,:) =  ua_b(:,:) / ( hu_0(:,:) + zsshu_a(:,:) + 1._wp - ssumask(:,:) ) 
    1261          va_b(:,:) =  va_b(:,:) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) ) 
     760         puu_b(:,:,Kaa) =  puu_b(:,:,Kaa) / ( hu_0(:,:) + zsshu_a(:,:) + 1._wp - ssumask(:,:) ) 
     761         pvv_b(:,:,Kaa) =  pvv_b(:,:,Kaa) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) ) 
    1262762      ENDIF 
    1263763 
     
    1265765      ! Correct velocities so that the barotropic velocity equals (un_adv, vn_adv) (in all cases)   
    1266766      DO jk = 1, jpkm1 
    1267          un(:,:,jk) = ( un(:,:,jk) + un_adv(:,:)*r1_hu_n(:,:) - un_b(:,:) ) * umask(:,:,jk) 
    1268          vn(:,:,jk) = ( vn(:,:,jk) + vn_adv(:,:)*r1_hv_n(:,:) - vn_b(:,:) ) * vmask(:,:,jk) 
     767         puu(:,:,jk,Kmm) = ( puu(:,:,jk,Kmm) + un_adv(:,:)*r1_hu(:,:,Kmm) - puu_b(:,:,Kmm) ) * umask(:,:,jk) 
     768         pvv(:,:,jk,Kmm) = ( pvv(:,:,jk,Kmm) + vn_adv(:,:)*r1_hv(:,:,Kmm) - pvv_b(:,:,Kmm) ) * vmask(:,:,jk) 
    1269769      END DO 
    1270770 
    1271771      IF ( ln_wd_dl .and. ln_wd_dl_bc) THEN  
    1272772         DO jk = 1, jpkm1 
    1273             un(:,:,jk) = ( un_adv(:,:)*r1_hu_n(:,:) & 
    1274                        & + zuwdav2(:,:)*(un(:,:,jk) - un_adv(:,:)*r1_hu_n(:,:)) ) * umask(:,:,jk)  
    1275             vn(:,:,jk) = ( vn_adv(:,:)*r1_hv_n(:,:) &  
    1276                        & + zvwdav2(:,:)*(vn(:,:,jk) - vn_adv(:,:)*r1_hv_n(:,:)) ) * vmask(:,:,jk)   
     773            puu(:,:,jk,Kmm) = ( un_adv(:,:)*r1_hu(:,:,Kmm) & 
     774                       & + zuwdav2(:,:)*(puu(:,:,jk,Kmm) - un_adv(:,:)*r1_hu(:,:,Kmm)) ) * umask(:,:,jk)  
     775            pvv(:,:,jk,Kmm) = ( vn_adv(:,:)*r1_hv(:,:,Kmm) &  
     776                       & + zvwdav2(:,:)*(pvv(:,:,jk,Kmm) - vn_adv(:,:)*r1_hv(:,:,Kmm)) ) * vmask(:,:,jk)   
    1277777         END DO 
    1278778      END IF  
    1279779 
    1280780       
    1281       CALL iom_put(  "ubar", un_adv(:,:)*r1_hu_n(:,:) )    ! barotropic i-current 
    1282       CALL iom_put(  "vbar", vn_adv(:,:)*r1_hv_n(:,:) )    ! barotropic i-current 
     781      CALL iom_put(  "ubar", un_adv(:,:)*r1_hu(:,:,Kmm) )    ! barotropic i-current 
     782      CALL iom_put(  "vbar", vn_adv(:,:)*r1_hv(:,:,Kmm) )    ! barotropic i-current 
    1283783      ! 
    1284784#if defined key_agrif 
     
    1303803      IF( ln_wd_dl )   DEALLOCATE( ztwdmask, zuwdmask, zvwdmask, zuwdav2, zvwdav2 ) 
    1304804      ! 
    1305       IF( ln_diatmb ) THEN 
    1306          CALL iom_put( "baro_u" , un_b*ssumask(:,:)+zmdi*(1.-ssumask(:,:) ) )  ! Barotropic  U Velocity 
    1307          CALL iom_put( "baro_v" , vn_b*ssvmask(:,:)+zmdi*(1.-ssvmask(:,:) ) )  ! Barotropic  V Velocity 
    1308       ENDIF 
     805      CALL iom_put( "baro_u" , puu_b(:,:,Kmm) )  ! Barotropic  U Velocity 
     806      CALL iom_put( "baro_v" , pvv_b(:,:,Kmm) )  ! Barotropic  V Velocity 
    1309807      ! 
    1310808   END SUBROUTINE dyn_spg_ts 
     
    1320818      LOGICAL, INTENT(in) ::   ll_fw      ! forward time splitting =.true. 
    1321819      INTEGER, INTENT(inout) :: jpit      ! cycle length     
    1322       REAL(wp), DIMENSION(3*nn_baro), INTENT(inout) ::   zwgt1, & ! Primary weights 
     820      REAL(wp), DIMENSION(3*nn_e), INTENT(inout) ::   zwgt1, & ! Primary weights 
    1323821                                                         zwgt2    ! Secondary weights 
    1324822       
     
    1332830      ! Set time index when averaged value is requested 
    1333831      IF (ll_fw) THEN  
    1334          jic = nn_baro 
     832         jic = nn_e 
    1335833      ELSE 
    1336          jic = 2 * nn_baro 
     834         jic = 2 * nn_e 
    1337835      ENDIF 
    1338836 
     
    1340838      IF (ll_av) THEN 
    1341839           ! Define simple boxcar window for primary weights  
    1342            ! (width = nn_baro, centered around jic)      
     840           ! (width = nn_e, centered around jic)      
    1343841         SELECT CASE ( nn_bt_flt ) 
    1344842              CASE( 0 )  ! No averaging 
     
    1346844                 jpit = jic 
    1347845 
    1348               CASE( 1 )  ! Boxcar, width = nn_baro 
    1349                  DO jn = 1, 3*nn_baro 
    1350                     za1 = ABS(float(jn-jic))/float(nn_baro)  
     846              CASE( 1 )  ! Boxcar, width = nn_e 
     847                 DO jn = 1, 3*nn_e 
     848                    za1 = ABS(float(jn-jic))/float(nn_e)  
    1351849                    IF (za1 < 0.5_wp) THEN 
    1352850                      zwgt1(jn) = 1._wp 
     
    1355853                 ENDDO 
    1356854 
    1357               CASE( 2 )  ! Boxcar, width = 2 * nn_baro 
    1358                  DO jn = 1, 3*nn_baro 
    1359                     za1 = ABS(float(jn-jic))/float(nn_baro)  
     855              CASE( 2 )  ! Boxcar, width = 2 * nn_e 
     856                 DO jn = 1, 3*nn_e 
     857                    za1 = ABS(float(jn-jic))/float(nn_e)  
    1360858                    IF (za1 < 1._wp) THEN 
    1361859                      zwgt1(jn) = 1._wp 
     
    1401899      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
    1402900         !                                   ! --------------- 
    1403          IF( ln_rstart .AND. ln_bt_fw .AND. (neuler/=0) ) THEN    !* Read the restart file 
    1404             IF(lrxios) CALL iom_swap( TRIM(crxios_context) ) 
    1405             CALL iom_get( numror, jpdom_autoglo, 'ub2_b'  , ub2_b  (:,:), ldxios = lrxios )    
    1406             CALL iom_get( numror, jpdom_autoglo, 'vb2_b'  , vb2_b  (:,:), ldxios = lrxios )  
    1407             CALL iom_get( numror, jpdom_autoglo, 'un_bf'  , un_bf  (:,:), ldxios = lrxios )    
    1408             CALL iom_get( numror, jpdom_autoglo, 'vn_bf'  , vn_bf  (:,:), ldxios = lrxios )  
     901         IF( ln_rstart .AND. ln_bt_fw .AND. (.NOT.l_1st_euler) ) THEN    !* Read the restart file 
     902            IF(lrxios) CALL iom_swap( TRIM(crxios_context)  
     903            CALL iom_get( numror, jpdom_auto, 'ub2_b'  , ub2_b  (:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios )    
     904            CALL iom_get( numror, jpdom_auto, 'vb2_b'  , vb2_b  (:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios )  
     905            CALL iom_get( numror, jpdom_auto, 'un_bf'  , un_bf  (:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios )    
     906            CALL iom_get( numror, jpdom_auto, 'vn_bf'  , vn_bf  (:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios )  
    1409907            IF( .NOT.ln_bt_av ) THEN 
    1410                CALL iom_get( numror, jpdom_autoglo, 'sshbb_e'  , sshbb_e(:,:), ldxios = lrxios )    
    1411                CALL iom_get( numror, jpdom_autoglo, 'ubb_e'    ,   ubb_e(:,:), ldxios = lrxios )    
    1412                CALL iom_get( numror, jpdom_autoglo, 'vbb_e'    ,   vbb_e(:,:), ldxios = lrxios ) 
    1413                CALL iom_get( numror, jpdom_autoglo, 'sshb_e'   ,  sshb_e(:,:), ldxios = lrxios )  
    1414                CALL iom_get( numror, jpdom_autoglo, 'ub_e'     ,    ub_e(:,:), ldxios = lrxios )    
    1415                CALL iom_get( numror, jpdom_autoglo, 'vb_e'     ,    vb_e(:,:), ldxios = lrxios ) 
     908               CALL iom_get( numror, jpdom_auto, 'sshbb_e'  , sshbb_e(:,:), cd_type = 'T', psgn =  1._wp, ldxios = lrxios )    
     909               CALL iom_get( numror, jpdom_auto, 'ubb_e'    ,   ubb_e(:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios )    
     910               CALL iom_get( numror, jpdom_auto, 'vbb_e'    ,   vbb_e(:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 
     911               CALL iom_get( numror, jpdom_auto, 'sshb_e'   ,  sshb_e(:,:), cd_type = 'T', psgn =  1._wp, ldxios = lrxios )  
     912               CALL iom_get( numror, jpdom_auto, 'ub_e'     ,    ub_e(:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios )    
     913               CALL iom_get( numror, jpdom_auto, 'vb_e'     ,    vb_e(:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 
    1416914            ENDIF 
    1417915#if defined key_agrif 
    1418916            ! Read time integrated fluxes 
    1419917            IF ( .NOT.Agrif_Root() ) THEN 
    1420                CALL iom_get( numror, jpdom_autoglo, 'ub2_i_b'  , ub2_i_b(:,:), ldxios = lrxios )    
    1421                CALL iom_get( numror, jpdom_autoglo, 'vb2_i_b'  , vb2_i_b(:,:), ldxios = lrxios ) 
     918               CALL iom_get( numror, jpdom_auto, 'ub2_i_b'  , ub2_i_b(:,:), cd_type = 'U', psgn = -1._wp, ldxios = lrxios )    
     919               CALL iom_get( numror, jpdom_auto, 'vb2_i_b'  , vb2_i_b(:,:), cd_type = 'V', psgn = -1._wp, ldxios = lrxios ) 
    1422920            ENDIF 
    1423921#endif 
     
    1479977      ! Max courant number for ext. grav. waves 
    1480978      ! 
    1481       DO jj = 1, jpj 
    1482          DO ji =1, jpi 
    1483             zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
    1484             zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 
    1485             zcu(ji,jj) = SQRT( grav * MAX(ht_0(ji,jj),0._wp) * (zxr2 + zyr2) ) 
    1486          END DO 
    1487       END DO 
    1488       ! 
    1489       zcmax = MAXVAL( zcu(:,:) ) 
     979      DO_2D( 0, 0, 0, 0 ) 
     980         zxr2 = r1_e1t(ji,jj) * r1_e1t(ji,jj) 
     981         zyr2 = r1_e2t(ji,jj) * r1_e2t(ji,jj) 
     982         zcu(ji,jj) = SQRT( grav * MAX(ht_0(ji,jj),0._wp) * (zxr2 + zyr2) ) 
     983      END_2D 
     984      ! 
     985      zcmax = MAXVAL( zcu(Nis0:Nie0,Njs0:Nje0) ) 
    1490986      CALL mpp_max( 'dynspg_ts', zcmax ) 
    1491987 
    1492988      ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax 
    1493       IF( ln_bt_auto )   nn_baro = CEILING( rdt / rn_bt_cmax * zcmax) 
     989      IF( ln_bt_auto )   nn_e = CEILING( rn_Dt / rn_bt_cmax * zcmax) 
    1494990       
    1495       rdtbt = rdt / REAL( nn_baro , wp ) 
    1496       zcmax = zcmax * rdtbt 
     991      rDt_e = rn_Dt / REAL( nn_e , wp ) 
     992      zcmax = zcmax * rDt_e 
    1497993      ! Print results 
    1498994      IF(lwp) WRITE(numout,*) 
     
    1500996      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~' 
    1501997      IF( ln_bt_auto ) THEN 
    1502          IF(lwp) WRITE(numout,*) '     ln_ts_auto =.true. Automatically set nn_baro ' 
     998         IF(lwp) WRITE(numout,*) '     ln_ts_auto =.true. Automatically set nn_e ' 
    1503999         IF(lwp) WRITE(numout,*) '     Max. courant number allowed: ', rn_bt_cmax 
    15041000      ELSE 
    1505          IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_baro in namelist   nn_baro = ', nn_baro 
     1001         IF(lwp) WRITE(numout,*) '     ln_ts_auto=.false.: Use nn_e in namelist   nn_e = ', nn_e 
    15061002      ENDIF 
    15071003 
    15081004      IF(ln_bt_av) THEN 
    1509          IF(lwp) WRITE(numout,*) '     ln_bt_av =.true.  ==> Time averaging over nn_baro time steps is on ' 
     1005         IF(lwp) WRITE(numout,*) '     ln_bt_av =.true.  ==> Time averaging over nn_e time steps is on ' 
    15101006      ELSE 
    15111007         IF(lwp) WRITE(numout,*) '     ln_bt_av =.false. => No time averaging of barotropic variables ' 
     
    15271023      SELECT CASE ( nn_bt_flt ) 
    15281024         CASE( 0 )      ;   IF(lwp) WRITE(numout,*) '           Dirac' 
    1529          CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_baro' 
    1530          CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_baro'  
     1025         CASE( 1 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = nn_e' 
     1026         CASE( 2 )      ;   IF(lwp) WRITE(numout,*) '           Boxcar: width = 2*nn_e'  
    15311027         CASE DEFAULT   ;   CALL ctl_stop( 'unrecognised value for nn_bt_flt: should 0,1, or 2' ) 
    15321028      END SELECT 
    15331029      ! 
    15341030      IF(lwp) WRITE(numout,*) ' ' 
    1535       IF(lwp) WRITE(numout,*) '     nn_baro = ', nn_baro 
    1536       IF(lwp) WRITE(numout,*) '     Barotropic time step [s] is :', rdtbt 
     1031      IF(lwp) WRITE(numout,*) '     nn_e = ', nn_e 
     1032      IF(lwp) WRITE(numout,*) '     Barotropic time step [s] is :', rDt_e 
    15371033      IF(lwp) WRITE(numout,*) '     Maximum Courant number is   :', zcmax 
    15381034      ! 
     
    15461042      ENDIF 
    15471043      IF( zcmax>0.9_wp ) THEN 
    1548          CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_baro !' )           
     1044         CALL ctl_stop( 'dynspg_ts ERROR: Maximum Courant number is greater than 0.9: Inc. nn_e !' )           
    15491045      ENDIF 
    15501046      ! 
     
    15811077   END SUBROUTINE dyn_spg_ts_init 
    15821078 
     1079    
     1080   SUBROUTINE dyn_cor_2D_init( Kmm ) 
     1081      !!--------------------------------------------------------------------- 
     1082      !!                   ***  ROUTINE dyn_cor_2D_init  *** 
     1083      !! 
     1084      !! ** Purpose : Set time splitting options 
     1085      !! Set arrays to remove/compute coriolis trend. 
     1086      !! Do it once during initialization if volume is fixed, else at each long time step. 
     1087      !! Note that these arrays are also used during barotropic loop. These are however frozen 
     1088      !! although they should be updated in the variable volume case. Not a big approximation. 
     1089      !! To remove this approximation, copy lines below inside barotropic loop 
     1090      !! and update depths at T-F points (ht and zhf resp.) at each barotropic time step 
     1091      !! 
     1092      !! Compute zwz = f / ( height of the water colomn ) 
     1093      !!---------------------------------------------------------------------- 
     1094      INTEGER,  INTENT(in)         ::  Kmm  ! Time index 
     1095      INTEGER  ::   ji ,jj, jk              ! dummy loop indices 
     1096      REAL(wp) ::   z1_ht 
     1097      REAL(wp), DIMENSION(jpi,jpj) :: zhf 
     1098      !!---------------------------------------------------------------------- 
     1099      ! 
     1100      SELECT CASE( nvor_scheme ) 
     1101      CASE( np_EEN )                != EEN scheme using e3f energy & enstrophy scheme 
     1102         SELECT CASE( nn_een_e3f )              !* ff_f/e3 at F-point 
     1103         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     1104            DO_2D( 1, 0, 1, 0 ) 
     1105               zwz(ji,jj) =   ( ht(ji  ,jj+1) + ht(ji+1,jj+1) +                    & 
     1106                    &           ht(ji  ,jj  ) + ht(ji+1,jj  )   ) * 0.25_wp   
     1107               IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 
     1108            END_2D 
     1109         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     1110            DO_2D( 1, 0, 1, 0 ) 
     1111               zwz(ji,jj) =             (  ht  (ji  ,jj+1) + ht  (ji+1,jj+1)      & 
     1112                    &                    + ht  (ji  ,jj  ) + ht  (ji+1,jj  )  )   & 
     1113                    &       / ( MAX( 1._wp,  ssmask(ji  ,jj+1) + ssmask(ji+1,jj+1)      & 
     1114                    &                      + ssmask(ji  ,jj  ) + ssmask(ji+1,jj  )  )   ) 
     1115               IF( zwz(ji,jj) /= 0._wp )   zwz(ji,jj) = ff_f(ji,jj) / zwz(ji,jj) 
     1116            END_2D 
     1117         END SELECT 
     1118         CALL lbc_lnk( 'dynspg_ts', zwz, 'F', 1._wp ) 
     1119         ! 
     1120         ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
     1121         DO_2D( 0, 1, 0, 1 ) 
     1122            ftne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
     1123            ftnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
     1124            ftse(ji,jj) = zwz(ji  ,jj  ) + zwz(ji  ,jj-1) + zwz(ji-1,jj-1) 
     1125            ftsw(ji,jj) = zwz(ji  ,jj-1) + zwz(ji-1,jj-1) + zwz(ji-1,jj  ) 
     1126         END_2D 
     1127         ! 
     1128      CASE( np_EET )                  != EEN scheme using e3t energy conserving scheme 
     1129         ftne(1,:) = 0._wp ; ftnw(1,:) = 0._wp ; ftse(1,:) = 0._wp ; ftsw(1,:) = 0._wp 
     1130         DO_2D( 0, 1, 0, 1 ) 
     1131            z1_ht = ssmask(ji,jj) / ( ht(ji,jj) + 1._wp - ssmask(ji,jj) ) 
     1132            ftne(ji,jj) = ( ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) ) * z1_ht 
     1133            ftnw(ji,jj) = ( ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) + ff_f(ji  ,jj  ) ) * z1_ht 
     1134            ftse(ji,jj) = ( ff_f(ji  ,jj  ) + ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) ) * z1_ht 
     1135            ftsw(ji,jj) = ( ff_f(ji  ,jj-1) + ff_f(ji-1,jj-1) + ff_f(ji-1,jj  ) ) * z1_ht 
     1136         END_2D 
     1137         ! 
     1138      CASE( np_ENE, np_ENS , np_MIX )  != all other schemes (ENE, ENS, MIX) except ENT ! 
     1139         ! 
     1140         zwz(:,:) = 0._wp 
     1141         zhf(:,:) = 0._wp 
     1142          
     1143         !!gm  assume 0 in both cases (which is almost surely WRONG ! ) as hvatf has been removed  
     1144!!gm    A priori a better value should be something like : 
     1145!!gm          zhf(i,j) = masked sum of  ht(i,j) , ht(i+1,j) , ht(i,j+1) , (i+1,j+1)  
     1146!!gm                     divided by the sum of the corresponding mask  
     1147!!gm  
     1148!!             
     1149         IF( .NOT.ln_sco ) THEN 
     1150   
     1151   !!gm  agree the JC comment  : this should be done in a much clear way 
     1152   
     1153   ! JC: It not clear yet what should be the depth at f-points over land in z-coordinate case 
     1154   !     Set it to zero for the time being  
     1155   !              IF( rn_hmin < 0._wp ) THEN    ;   jk = - INT( rn_hmin )                                      ! from a nb of level 
     1156   !              ELSE                          ;   jk = MINLOC( gdepw_0, mask = gdepw_0 > rn_hmin, dim = 1 )  ! from a depth 
     1157   !              ENDIF 
     1158   !              zhf(:,:) = gdepw_0(:,:,jk+1) 
     1159            ! 
     1160         ELSE 
     1161            ! 
     1162            !zhf(:,:) = hbatf(:,:) 
     1163            DO_2D( 1, 0, 1, 0 ) 
     1164               zhf(ji,jj) =    (   ht_0  (ji,jj  ) + ht_0  (ji+1,jj  )          & 
     1165                    &            + ht_0  (ji,jj+1) + ht_0  (ji+1,jj+1)   )      & 
     1166                    &     / MAX(   ssmask(ji,jj  ) + ssmask(ji+1,jj  )          & 
     1167                    &            + ssmask(ji,jj+1) + ssmask(ji+1,jj+1) , 1._wp  ) 
     1168            END_2D 
     1169         ENDIF 
     1170         ! 
     1171         DO jj = 1, jpjm1 
     1172            zhf(:,jj) = zhf(:,jj) * (1._wp- umask(:,jj,1) * umask(:,jj+1,1)) 
     1173         END DO 
     1174         ! 
     1175         DO jk = 1, jpkm1 
     1176            DO jj = 1, jpjm1 
     1177               zhf(:,jj) = zhf(:,jj) + e3f(:,jj,jk) * umask(:,jj,jk) * umask(:,jj+1,jk) 
     1178            END DO 
     1179         END DO 
     1180         CALL lbc_lnk( 'dynspg_ts', zhf, 'F', 1._wp ) 
     1181         ! JC: TBC. hf should be greater than 0  
     1182         DO_2D( 1, 1, 1, 1 ) 
     1183            IF( zhf(ji,jj) /= 0._wp )   zwz(ji,jj) = 1._wp / zhf(ji,jj) 
     1184         END_2D 
     1185         zwz(:,:) = ff_f(:,:) * zwz(:,:) 
     1186      END SELECT 
     1187       
     1188   END SUBROUTINE dyn_cor_2d_init 
     1189 
     1190 
     1191 
     1192   SUBROUTINE dyn_cor_2d( pht, phu, phv, punb, pvnb, zhU, zhV,    zu_trd, zv_trd   ) 
     1193      !!--------------------------------------------------------------------- 
     1194      !!                   ***  ROUTINE dyn_cor_2d  *** 
     1195      !! 
     1196      !! ** Purpose : Compute u and v coriolis trends 
     1197      !!---------------------------------------------------------------------- 
     1198      INTEGER  ::   ji ,jj                             ! dummy loop indices 
     1199      REAL(wp) ::   zx1, zx2, zy1, zy2, z1_hu, z1_hv   !   -      - 
     1200      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pht, phu, phv, punb, pvnb, zhU, zhV 
     1201      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: zu_trd, zv_trd 
     1202      !!---------------------------------------------------------------------- 
     1203      SELECT CASE( nvor_scheme ) 
     1204      CASE( np_ENT )                ! enstrophy conserving scheme (f-point) 
     1205         DO_2D( 0, 0, 0, 0 ) 
     1206            z1_hu = ssumask(ji,jj) / ( phu(ji,jj) + 1._wp - ssumask(ji,jj) ) 
     1207            z1_hv = ssvmask(ji,jj) / ( phv(ji,jj) + 1._wp - ssvmask(ji,jj) ) 
     1208            zu_trd(ji,jj) = + r1_4 * r1_e1e2u(ji,jj) * z1_hu                    & 
     1209               &               * (  e1e2t(ji+1,jj)*pht(ji+1,jj)*ff_t(ji+1,jj) * ( pvnb(ji+1,jj) + pvnb(ji+1,jj-1) )   & 
     1210               &                  + e1e2t(ji  ,jj)*pht(ji  ,jj)*ff_t(ji  ,jj) * ( pvnb(ji  ,jj) + pvnb(ji  ,jj-1) )   ) 
     1211               ! 
     1212            zv_trd(ji,jj) = - r1_4 * r1_e1e2v(ji,jj) * z1_hv                    & 
     1213               &               * (  e1e2t(ji,jj+1)*pht(ji,jj+1)*ff_t(ji,jj+1) * ( punb(ji,jj+1) + punb(ji-1,jj+1) )   &  
     1214               &                  + e1e2t(ji,jj  )*pht(ji,jj  )*ff_t(ji,jj  ) * ( punb(ji,jj  ) + punb(ji-1,jj  ) )   )  
     1215         END_2D 
     1216         !          
     1217      CASE( np_ENE , np_MIX )        ! energy conserving scheme (t-point) ENE or MIX 
     1218         DO_2D( 0, 0, 0, 0 ) 
     1219            zy1 = ( zhV(ji,jj-1) + zhV(ji+1,jj-1) ) * r1_e1u(ji,jj) 
     1220            zy2 = ( zhV(ji,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj) 
     1221            zx1 = ( zhU(ji-1,jj) + zhU(ji-1,jj+1) ) * r1_e2v(ji,jj) 
     1222            zx2 = ( zhU(ji  ,jj) + zhU(ji  ,jj+1) ) * r1_e2v(ji,jj) 
     1223            ! energy conserving formulation for planetary vorticity term 
     1224            zu_trd(ji,jj) =   r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     1225            zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
     1226         END_2D 
     1227         ! 
     1228      CASE( np_ENS )                ! enstrophy conserving scheme (f-point) 
     1229         DO_2D( 0, 0, 0, 0 ) 
     1230            zy1 =   r1_8 * ( zhV(ji  ,jj-1) + zhV(ji+1,jj-1) & 
     1231              &            + zhV(ji  ,jj  ) + zhV(ji+1,jj  ) ) * r1_e1u(ji,jj) 
     1232            zx1 = - r1_8 * ( zhU(ji-1,jj  ) + zhU(ji-1,jj+1) & 
     1233              &            + zhU(ji  ,jj  ) + zhU(ji  ,jj+1) ) * r1_e2v(ji,jj) 
     1234            zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
     1235            zv_trd(ji,jj)  = zx1 * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     1236         END_2D 
     1237         ! 
     1238      CASE( np_EET , np_EEN )      ! energy & enstrophy scheme (using e3t or e3f)          
     1239         DO_2D( 0, 0, 0, 0 ) 
     1240            zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zhV(ji  ,jj  ) & 
     1241             &                                         + ftnw(ji+1,jj) * zhV(ji+1,jj  ) & 
     1242             &                                         + ftse(ji,jj  ) * zhV(ji  ,jj-1) & 
     1243             &                                         + ftsw(ji+1,jj) * zhV(ji+1,jj-1) ) 
     1244            zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zhU(ji-1,jj+1) & 
     1245             &                                         + ftse(ji,jj+1) * zhU(ji  ,jj+1) & 
     1246             &                                         + ftnw(ji,jj  ) * zhU(ji-1,jj  ) & 
     1247             &                                         + ftne(ji,jj  ) * zhU(ji  ,jj  ) ) 
     1248         END_2D 
     1249         ! 
     1250      END SELECT 
     1251      ! 
     1252   END SUBROUTINE dyn_cor_2D 
     1253 
     1254 
     1255   SUBROUTINE wad_tmsk( pssh, ptmsk ) 
     1256      !!---------------------------------------------------------------------- 
     1257      !!                  ***  ROUTINE wad_lmt  *** 
     1258      !!                     
     1259      !! ** Purpose :   set wetting & drying mask at tracer points  
     1260      !!              for the current barotropic sub-step  
     1261      !! 
     1262      !! ** Method  :   ???  
     1263      !! 
     1264      !! ** Action  :  ptmsk : wetting & drying t-mask 
     1265      !!---------------------------------------------------------------------- 
     1266      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pssh    ! 
     1267      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) ::   ptmsk   ! 
     1268      ! 
     1269      INTEGER  ::   ji, jj   ! dummy loop indices 
     1270      !!---------------------------------------------------------------------- 
     1271      ! 
     1272      IF( ln_wd_dl_rmp ) THEN      
     1273         DO_2D( 1, 1, 1, 1 ) 
     1274            IF    ( pssh(ji,jj) + ht_0(ji,jj) >  2._wp * rn_wdmin1 ) THEN  
     1275               !           IF    ( pssh(ji,jj) + ht_0(ji,jj) >          rn_wdmin2 ) THEN  
     1276               ptmsk(ji,jj) = 1._wp 
     1277            ELSEIF( pssh(ji,jj) + ht_0(ji,jj) >          rn_wdmin1 ) THEN 
     1278               ptmsk(ji,jj) = TANH( 50._wp*( ( pssh(ji,jj) + ht_0(ji,jj) -  rn_wdmin1 )*r_rn_wdmin1) ) 
     1279            ELSE  
     1280               ptmsk(ji,jj) = 0._wp 
     1281            ENDIF 
     1282         END_2D 
     1283      ELSE   
     1284         DO_2D( 1, 1, 1, 1 ) 
     1285            IF ( pssh(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN   ;   ptmsk(ji,jj) = 1._wp 
     1286            ELSE                                                 ;   ptmsk(ji,jj) = 0._wp 
     1287            ENDIF 
     1288         END_2D 
     1289      ENDIF 
     1290      ! 
     1291   END SUBROUTINE wad_tmsk 
     1292 
     1293 
     1294   SUBROUTINE wad_Umsk( pTmsk, phU, phV, pu, pv, pUmsk, pVmsk ) 
     1295      !!---------------------------------------------------------------------- 
     1296      !!                  ***  ROUTINE wad_lmt  *** 
     1297      !!                     
     1298      !! ** Purpose :   set wetting & drying mask at tracer points  
     1299      !!              for the current barotropic sub-step  
     1300      !! 
     1301      !! ** Method  :   ???  
     1302      !! 
     1303      !! ** Action  :  ptmsk : wetting & drying t-mask 
     1304      !!---------------------------------------------------------------------- 
     1305      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pTmsk              ! W & D t-mask 
     1306      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   phU, phV, pu, pv   ! ocean velocities and transports 
     1307      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pUmsk, pVmsk       ! W & D u- and v-mask 
     1308      ! 
     1309      INTEGER  ::   ji, jj   ! dummy loop indices 
     1310      !!---------------------------------------------------------------------- 
     1311      ! 
     1312      DO_2D( 1, 1, 1, 0 ) 
     1313         IF ( phU(ji,jj) > 0._wp ) THEN   ;   pUmsk(ji,jj) = pTmsk(ji  ,jj)  
     1314         ELSE                             ;   pUmsk(ji,jj) = pTmsk(ji+1,jj)   
     1315         ENDIF 
     1316         phU(ji,jj) = pUmsk(ji,jj)*phU(ji,jj) 
     1317         pu (ji,jj) = pUmsk(ji,jj)*pu (ji,jj) 
     1318      END_2D 
     1319      ! 
     1320      DO_2D( 1, 0, 1, 1 ) 
     1321         IF ( phV(ji,jj) > 0._wp ) THEN   ;   pVmsk(ji,jj) = pTmsk(ji,jj  ) 
     1322         ELSE                             ;   pVmsk(ji,jj) = pTmsk(ji,jj+1)   
     1323         ENDIF 
     1324         phV(ji,jj) = pVmsk(ji,jj)*phV(ji,jj)  
     1325         pv (ji,jj) = pVmsk(ji,jj)*pv (ji,jj) 
     1326      END_2D 
     1327      ! 
     1328   END SUBROUTINE wad_Umsk 
     1329 
     1330 
     1331   SUBROUTINE wad_spg( pshn, zcpx, zcpy ) 
     1332      !!--------------------------------------------------------------------- 
     1333      !!                   ***  ROUTINE  wad_sp  *** 
     1334      !! 
     1335      !! ** Purpose :  
     1336      !!---------------------------------------------------------------------- 
     1337      INTEGER  ::   ji ,jj               ! dummy loop indices 
     1338      LOGICAL  ::   ll_tmp1, ll_tmp2 
     1339      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pshn 
     1340      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: zcpx, zcpy 
     1341      !!---------------------------------------------------------------------- 
     1342      DO_2D( 0, 0, 0, 0 ) 
     1343         ll_tmp1 = MIN(  pshn(ji,jj)               ,  pshn(ji+1,jj) ) >                & 
     1344              &      MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
     1345              &      MAX(  pshn(ji,jj) + ht_0(ji,jj) ,  pshn(ji+1,jj) + ht_0(ji+1,jj) )  & 
     1346              &                                                         > rn_wdmin1 + rn_wdmin2 
     1347         ll_tmp2 = ( ABS( pshn(ji+1,jj)            -  pshn(ji  ,jj))  > 1.E-12 ).AND.( & 
     1348              &      MAX(   pshn(ji,jj)              ,  pshn(ji+1,jj) ) >                & 
     1349              &      MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     1350         IF(ll_tmp1) THEN 
     1351            zcpx(ji,jj) = 1.0_wp 
     1352         ELSEIF(ll_tmp2) THEN 
     1353            ! no worries about  pshn(ji+1,jj) -  pshn(ji  ,jj) = 0, it won't happen ! here 
     1354            zcpx(ji,jj) = ABS( (pshn(ji+1,jj) + ht_0(ji+1,jj) - pshn(ji,jj) - ht_0(ji,jj)) & 
     1355                 &           / (pshn(ji+1,jj) - pshn(ji  ,jj)) ) 
     1356            zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     1357         ELSE 
     1358            zcpx(ji,jj) = 0._wp 
     1359         ENDIF 
     1360         ! 
     1361         ll_tmp1 = MIN(  pshn(ji,jj)               ,  pshn(ji,jj+1) ) >                & 
     1362              &      MAX( -ht_0(ji,jj)               , -ht_0(ji,jj+1) ) .AND.            & 
     1363              &      MAX(  pshn(ji,jj) + ht_0(ji,jj) ,  pshn(ji,jj+1) + ht_0(ji,jj+1) )  & 
     1364              &                                                       > rn_wdmin1 + rn_wdmin2 
     1365         ll_tmp2 = ( ABS( pshn(ji,jj)              -  pshn(ji,jj+1))  > 1.E-12 ).AND.( & 
     1366              &      MAX(   pshn(ji,jj)              ,  pshn(ji,jj+1) ) >                & 
     1367              &      MAX(  -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     1368          
     1369         IF(ll_tmp1) THEN 
     1370            zcpy(ji,jj) = 1.0_wp 
     1371         ELSE IF(ll_tmp2) THEN 
     1372            ! no worries about  pshn(ji,jj+1) -  pshn(ji,jj  ) = 0, it won't happen ! here 
     1373            zcpy(ji,jj) = ABS( (pshn(ji,jj+1) + ht_0(ji,jj+1) - pshn(ji,jj) - ht_0(ji,jj)) & 
     1374                 &           / (pshn(ji,jj+1) - pshn(ji,jj  )) ) 
     1375            zcpy(ji,jj) = MAX(  0._wp , MIN( zcpy(ji,jj) , 1.0_wp )  ) 
     1376         ELSE 
     1377            zcpy(ji,jj) = 0._wp 
     1378         ENDIF 
     1379      END_2D 
     1380             
     1381   END SUBROUTINE wad_spg 
     1382      
     1383 
     1384 
     1385   SUBROUTINE dyn_drg_init( Kbb, Kmm, puu, pvv, puu_b ,pvv_b, pu_RHSi, pv_RHSi, pCdU_u, pCdU_v ) 
     1386      !!---------------------------------------------------------------------- 
     1387      !!                  ***  ROUTINE dyn_drg_init  *** 
     1388      !!                     
     1389      !! ** Purpose : - add the baroclinic top/bottom drag contribution to  
     1390      !!              the baroclinic part of the barotropic RHS 
     1391      !!              - compute the barotropic drag coefficients 
     1392      !! 
     1393      !! ** Method  :   computation done over the INNER domain only  
     1394      !!---------------------------------------------------------------------- 
     1395      INTEGER                             , INTENT(in   ) ::  Kbb, Kmm           ! ocean time level indices 
     1396      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in   ) ::  puu, pvv           ! ocean velocities and RHS of momentum equation 
     1397      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(in   ) ::  puu_b, pvv_b       ! barotropic velocities at main time levels 
     1398      REAL(wp), DIMENSION(jpi,jpj)        , INTENT(inout) ::  pu_RHSi, pv_RHSi   ! baroclinic part of the barotropic RHS 
     1399      REAL(wp), DIMENSION(jpi,jpj)        , INTENT(  out) ::  pCdU_u , pCdU_v    ! barotropic drag coefficients 
     1400      ! 
     1401      INTEGER  ::   ji, jj   ! dummy loop indices 
     1402      INTEGER  ::   ikbu, ikbv, iktu, iktv 
     1403      REAL(wp) ::   zztmp 
     1404      REAL(wp), DIMENSION(jpi,jpj) ::   zu_i, zv_i 
     1405      !!---------------------------------------------------------------------- 
     1406      ! 
     1407      !                    !==  Set the barotropic drag coef.  ==! 
     1408      ! 
     1409      IF( ln_isfcav ) THEN          ! top+bottom friction (ocean cavities) 
     1410          
     1411         DO_2D( 0, 0, 0, 0 ) 
     1412            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
     1413            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) 
     1414         END_2D 
     1415      ELSE                          ! bottom friction only 
     1416         DO_2D( 0, 0, 0, 0 ) 
     1417            pCdU_u(ji,jj) = r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 
     1418            pCdU_v(ji,jj) = r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 
     1419         END_2D 
     1420      ENDIF 
     1421      ! 
     1422      !                    !==  BOTTOM stress contribution from baroclinic velocities  ==! 
     1423      ! 
     1424      IF( ln_bt_fw ) THEN                 ! FORWARD integration: use NOW bottom baroclinic velocities 
     1425          
     1426         DO_2D( 0, 0, 0, 0 ) 
     1427            ikbu = mbku(ji,jj)        
     1428            ikbv = mbkv(ji,jj)     
     1429            zu_i(ji,jj) = puu(ji,jj,ikbu,Kmm) - puu_b(ji,jj,Kmm) 
     1430            zv_i(ji,jj) = pvv(ji,jj,ikbv,Kmm) - pvv_b(ji,jj,Kmm) 
     1431         END_2D 
     1432      ELSE                                ! CENTRED integration: use BEFORE bottom baroclinic velocities 
     1433          
     1434         DO_2D( 0, 0, 0, 0 ) 
     1435            ikbu = mbku(ji,jj)        
     1436            ikbv = mbkv(ji,jj)     
     1437            zu_i(ji,jj) = puu(ji,jj,ikbu,Kbb) - puu_b(ji,jj,Kbb) 
     1438            zv_i(ji,jj) = pvv(ji,jj,ikbv,Kbb) - pvv_b(ji,jj,Kbb) 
     1439         END_2D 
     1440      ENDIF 
     1441      ! 
     1442      IF( ln_wd_il ) THEN      ! W/D : use the "clipped" bottom friction   !!gm   explain WHY, please ! 
     1443         zztmp = -1._wp / rDt_e 
     1444         DO_2D( 0, 0, 0, 0 ) 
     1445            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + zu_i(ji,jj) *  wdrampu(ji,jj) * MAX(                                 &  
     1446                 &                              r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp  ) 
     1447            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + zv_i(ji,jj) *  wdrampv(ji,jj) * MAX(                                 &  
     1448                 &                              r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) , zztmp  ) 
     1449         END_2D 
     1450      ELSE                    ! use "unclipped" drag (even if explicit friction is used in 3D calculation) 
     1451          
     1452         DO_2D( 0, 0, 0, 0 ) 
     1453            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zu_i(ji,jj) 
     1454            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zv_i(ji,jj) 
     1455         END_2D 
     1456      END IF 
     1457      ! 
     1458      !                    !==  TOP stress contribution from baroclinic velocities  ==!   (no W/D case) 
     1459      ! 
     1460      IF( ln_isfcav ) THEN 
     1461         ! 
     1462         IF( ln_bt_fw ) THEN                ! FORWARD integration: use NOW top baroclinic velocity 
     1463             
     1464            DO_2D( 0, 0, 0, 0 ) 
     1465               iktu = miku(ji,jj) 
     1466               iktv = mikv(ji,jj) 
     1467               zu_i(ji,jj) = puu(ji,jj,iktu,Kmm) - puu_b(ji,jj,Kmm) 
     1468               zv_i(ji,jj) = pvv(ji,jj,iktv,Kmm) - pvv_b(ji,jj,Kmm) 
     1469            END_2D 
     1470         ELSE                                ! CENTRED integration: use BEFORE top baroclinic velocity 
     1471             
     1472            DO_2D( 0, 0, 0, 0 ) 
     1473               iktu = miku(ji,jj) 
     1474               iktv = mikv(ji,jj) 
     1475               zu_i(ji,jj) = puu(ji,jj,iktu,Kbb) - puu_b(ji,jj,Kbb) 
     1476               zv_i(ji,jj) = pvv(ji,jj,iktv,Kbb) - pvv_b(ji,jj,Kbb) 
     1477            END_2D 
     1478         ENDIF 
     1479         ! 
     1480         !                    ! use "unclipped" top drag (even if explicit friction is used in 3D calculation) 
     1481          
     1482         DO_2D( 0, 0, 0, 0 ) 
     1483            pu_RHSi(ji,jj) = pu_RHSi(ji,jj) + r1_hu(ji,jj,Kmm) * r1_2*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zu_i(ji,jj) 
     1484            pv_RHSi(ji,jj) = pv_RHSi(ji,jj) + r1_hv(ji,jj,Kmm) * r1_2*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zv_i(ji,jj) 
     1485         END_2D 
     1486         ! 
     1487      ENDIF 
     1488      ! 
     1489   END SUBROUTINE dyn_drg_init 
     1490 
     1491   SUBROUTINE ts_bck_interp( jn, ll_init,       &   ! <== in 
     1492      &                      za0, za1, za2, za3 )   ! ==> out 
     1493      !!---------------------------------------------------------------------- 
     1494      INTEGER ,INTENT(in   ) ::   jn                   ! index of sub time step 
     1495      LOGICAL ,INTENT(in   ) ::   ll_init              ! 
     1496      REAL(wp),INTENT(  out) ::   za0, za1, za2, za3   ! Half-step back interpolation coefficient 
     1497      ! 
     1498      REAL(wp) ::   zepsilon, zgamma                   !   -      - 
     1499      !!---------------------------------------------------------------------- 
     1500      !                             ! set Half-step back interpolation coefficient 
     1501      IF    ( jn==1 .AND. ll_init ) THEN   !* Forward-backward 
     1502         za0 = 1._wp                         
     1503         za1 = 0._wp                            
     1504         za2 = 0._wp 
     1505         za3 = 0._wp 
     1506      ELSEIF( jn==2 .AND. ll_init ) THEN   !* AB2-AM3 Coefficients; bet=0 ; gam=-1/6 ; eps=1/12 
     1507         za0 = 1.0833333333333_wp                 ! za0 = 1-gam-eps 
     1508         za1 =-0.1666666666666_wp                 ! za1 = gam 
     1509         za2 = 0.0833333333333_wp                 ! za2 = eps 
     1510         za3 = 0._wp               
     1511      ELSE                                 !* AB3-AM4 Coefficients; bet=0.281105 ; eps=0.013 ; gam=0.0880  
     1512         IF( rn_bt_alpha == 0._wp ) THEN      ! Time diffusion   
     1513            za0 = 0.614_wp                        ! za0 = 1/2 +   gam + 2*eps 
     1514            za1 = 0.285_wp                        ! za1 = 1/2 - 2*gam - 3*eps 
     1515            za2 = 0.088_wp                        ! za2 = gam 
     1516            za3 = 0.013_wp                        ! za3 = eps 
     1517         ELSE                                 ! no time diffusion 
     1518            zepsilon = 0.00976186_wp - 0.13451357_wp * rn_bt_alpha 
     1519            zgamma   = 0.08344500_wp - 0.51358400_wp * rn_bt_alpha 
     1520            za0 = 0.5_wp + zgamma + 2._wp * rn_bt_alpha + 2._wp * zepsilon 
     1521            za1 = 1._wp - za0 - zgamma - zepsilon 
     1522            za2 = zgamma 
     1523            za3 = zepsilon 
     1524         ENDIF  
     1525      ENDIF 
     1526   END SUBROUTINE ts_bck_interp 
     1527 
     1528 
    15831529   !!====================================================================== 
    15841530END MODULE dynspg_ts 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynvor.F90

    r10425 r13463  
    8080   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   di_e2u_2        ! = di(e2u)/2          used in T-point metric term calculation 
    8181   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1v_2        ! = dj(e1v)/2           -        -      -       -  
    82    REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   di_e2v_2e1e2f   ! = di(e2u)/(2*e1e2f)  used in F-point metric term calculation 
    83    REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1u_2e1e2f   ! = dj(e1v)/(2*e1e2f)   -        -      -       -  
     82   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   di_e2v_2e1e2f   ! = di(e2v)/(2*e1e2f)  used in F-point metric term calculation 
     83   REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   dj_e1u_2e1e2f   ! = dj(e1u)/(2*e1e2f)   -        -      -       -  
    8484    
    8585   REAL(wp) ::   r1_4  = 0.250_wp         ! =1/4 
     
    8888    
    8989   !! * Substitutions 
    90 #  include "vectopt_loop_substitute.h90" 
     90#  include "do_loop_substitute.h90" 
     91#  include "domzgr_substitute.h90" 
     92 
    9193   !!---------------------------------------------------------------------- 
    9294   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    9698CONTAINS 
    9799 
    98    SUBROUTINE dyn_vor( kt ) 
     100   SUBROUTINE dyn_vor( kt, Kmm, puu, pvv, Krhs ) 
    99101      !!---------------------------------------------------------------------- 
    100102      !! 
    101103      !! ** Purpose :   compute the lateral ocean tracer physics. 
    102104      !! 
    103       !! ** Action : - Update (ua,va) with the now vorticity term trend 
     105      !! ** Action : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the now vorticity term trend 
    104106      !!             - save the trends in (ztrdu,ztrdv) in 2 parts (relative 
    105107      !!               and planetary vorticity trends) and send them to trd_dyn  
    106108      !!               for futher diagnostics (l_trddyn=T) 
    107109      !!---------------------------------------------------------------------- 
    108       INTEGER, INTENT( in ) ::   kt   ! ocean time-step index 
     110      INTEGER                             , INTENT( in  ) ::   kt          ! ocean time-step index 
     111      INTEGER                             , INTENT( in  ) ::   Kmm, Krhs   ! ocean time level indices 
     112      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! ocean velocity field and RHS of momentum equation 
    109113      ! 
    110114      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
     
    117121         ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) ) 
    118122         ! 
    119          ztrdu(:,:,:) = ua(:,:,:)            !* planetary vorticity trend (including Stokes-Coriolis force) 
    120          ztrdv(:,:,:) = va(:,:,:) 
     123         ztrdu(:,:,:) = puu(:,:,:,Krhs)            !* planetary vorticity trend (including Stokes-Coriolis force) 
     124         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    121125         SELECT CASE( nvor_scheme ) 
    122          CASE( np_ENS )           ;   CALL vor_ens( kt, ncor, un , vn , ua, va )   ! enstrophy conserving scheme 
    123             IF( ln_stcor )            CALL vor_ens( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    124          CASE( np_ENE, np_MIX )   ;   CALL vor_ene( kt, ncor, un , vn , ua, va )   ! energy conserving scheme 
    125             IF( ln_stcor )            CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    126          CASE( np_ENT )           ;   CALL vor_enT( kt, ncor, un , vn , ua, va )   ! energy conserving scheme (T-pts) 
    127             IF( ln_stcor )            CALL vor_enT( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    128          CASE( np_EET )           ;   CALL vor_eeT( kt, ncor, un , vn , ua, va )   ! energy conserving scheme (een with e3t) 
    129             IF( ln_stcor )            CALL vor_eeT( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
    130          CASE( np_EEN )           ;   CALL vor_een( kt, ncor, un , vn , ua, va )   ! energy & enstrophy scheme 
    131             IF( ln_stcor )            CALL vor_een( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     126         CASE( np_ENS )           ;   CALL vor_ens( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! enstrophy conserving scheme 
     127            IF( ln_stcor )            CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
     128         CASE( np_ENE, np_MIX )   ;   CALL vor_ene( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! energy conserving scheme 
     129            IF( ln_stcor )            CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
     130         CASE( np_ENT )           ;   CALL vor_enT( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! energy conserving scheme (T-pts) 
     131            IF( ln_stcor )            CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
     132         CASE( np_EET )           ;   CALL vor_eeT( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! energy conserving scheme (een with e3t) 
     133            IF( ln_stcor )            CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
     134         CASE( np_EEN )           ;   CALL vor_een( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! energy & enstrophy scheme 
     135            IF( ln_stcor )            CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
    132136         END SELECT 
    133          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    134          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    135          CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
     137         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     138         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     139         CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt, Kmm ) 
    136140         ! 
    137141         IF( n_dynadv /= np_LIN_dyn ) THEN   !* relative vorticity or metric trend (only in non-linear case) 
    138             ztrdu(:,:,:) = ua(:,:,:) 
    139             ztrdv(:,:,:) = va(:,:,:) 
     142            ztrdu(:,:,:) = puu(:,:,:,Krhs) 
     143            ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    140144            SELECT CASE( nvor_scheme ) 
    141             CASE( np_ENT )           ;   CALL vor_enT( kt, nrvm, un , vn , ua, va )  ! energy conserving scheme (T-pts) 
    142             CASE( np_EET )           ;   CALL vor_eeT( kt, nrvm, un , vn , ua, va )  ! energy conserving scheme (een with e3t) 
    143             CASE( np_ENE )           ;   CALL vor_ene( kt, nrvm, un , vn , ua, va )  ! energy conserving scheme 
    144             CASE( np_ENS, np_MIX )   ;   CALL vor_ens( kt, nrvm, un , vn , ua, va )  ! enstrophy conserving scheme 
    145             CASE( np_EEN )           ;   CALL vor_een( kt, nrvm, un , vn , ua, va )  ! energy & enstrophy scheme 
     145            CASE( np_ENT )           ;   CALL vor_enT( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! energy conserving scheme (T-pts) 
     146            CASE( np_EET )           ;   CALL vor_eeT( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! energy conserving scheme (een with e3t) 
     147            CASE( np_ENE )           ;   CALL vor_ene( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! energy conserving scheme 
     148            CASE( np_ENS, np_MIX )   ;   CALL vor_ens( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! enstrophy conserving scheme 
     149            CASE( np_EEN )           ;   CALL vor_een( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! energy & enstrophy scheme 
    146150            END SELECT 
    147             ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    148             ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    149             CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt ) 
     151            ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     152            ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     153            CALL trd_dyn( ztrdu, ztrdv, jpdyn_rvo, kt, Kmm ) 
    150154         ENDIF 
    151155         ! 
     
    156160         SELECT CASE ( nvor_scheme )      !==  vorticity trend added to the general trend  ==! 
    157161         CASE( np_ENT )                        !* energy conserving scheme  (T-pts) 
    158                              CALL vor_enT( kt, ntot, un , vn , ua, va )   ! total vorticity trend 
    159             IF( ln_stcor )   CALL vor_enT( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     162                             CALL vor_enT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend 
     163            IF( ln_stcor )   CALL vor_enT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
    160164         CASE( np_EET )                        !* energy conserving scheme (een scheme using e3t) 
    161                              CALL vor_eeT( kt, ntot, un , vn , ua, va )   ! total vorticity trend 
    162             IF( ln_stcor )   CALL vor_eeT( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     165                             CALL vor_eeT( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend 
     166            IF( ln_stcor )   CALL vor_eeT( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
    163167         CASE( np_ENE )                        !* energy conserving scheme 
    164                              CALL vor_ene( kt, ntot, un , vn , ua, va )   ! total vorticity trend 
    165             IF( ln_stcor )   CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     168                             CALL vor_ene( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend 
     169            IF( ln_stcor )   CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
    166170         CASE( np_ENS )                        !* enstrophy conserving scheme 
    167                              CALL vor_ens( kt, ntot, un , vn , ua, va )  ! total vorticity trend 
    168             IF( ln_stcor )   CALL vor_ens( kt, ncor, usd, vsd, ua, va )  ! add the Stokes-Coriolis trend 
     171                             CALL vor_ens( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! total vorticity trend 
     172            IF( ln_stcor )   CALL vor_ens( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! add the Stokes-Coriolis trend 
    169173         CASE( np_MIX )                        !* mixed ene-ens scheme 
    170                              CALL vor_ens( kt, nrvm, un , vn , ua, va )   ! relative vorticity or metric trend (ens) 
    171                              CALL vor_ene( kt, ncor, un , vn , ua, va )   ! planetary vorticity trend (ene) 
    172             IF( ln_stcor )   CALL vor_ene( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     174                             CALL vor_ens( kt, Kmm, nrvm, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! relative vorticity or metric trend (ens) 
     175                             CALL vor_ene( kt, Kmm, ncor, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! planetary vorticity trend (ene) 
     176            IF( ln_stcor )   CALL vor_ene( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
    173177         CASE( np_EEN )                        !* energy and enstrophy conserving scheme 
    174                              CALL vor_een( kt, ntot, un , vn , ua, va )   ! total vorticity trend 
    175             IF( ln_stcor )   CALL vor_een( kt, ncor, usd, vsd, ua, va )   ! add the Stokes-Coriolis trend 
     178                             CALL vor_een( kt, Kmm, ntot, puu(:,:,:,Kmm) , pvv(:,:,:,Kmm) , puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! total vorticity trend 
     179            IF( ln_stcor )   CALL vor_een( kt, Kmm, ncor, usd, vsd, puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )   ! add the Stokes-Coriolis trend 
    176180         END SELECT 
    177181         ! 
     
    179183      ! 
    180184      !                       ! print sum trends (used for debugging) 
    181       IF(ln_ctl) CALL prt_ctl( tab3d_1=ua, clinfo1=' vor  - Ua: ', mask1=umask,               & 
    182          &                     tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     185      IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' vor  - Ua: ', mask1=umask,               & 
     186         &                                tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    183187      ! 
    184188      IF( ln_timing )   CALL timing_stop('dyn_vor') 
     
    187191 
    188192 
    189    SUBROUTINE vor_enT( kt, kvor, pu, pv, pu_rhs, pv_rhs ) 
     193   SUBROUTINE vor_enT( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 
    190194      !!---------------------------------------------------------------------- 
    191195      !!                  ***  ROUTINE vor_enT  *** 
     
    203207      !!       where rvor is the relative vorticity at f-point 
    204208      !! 
    205       !! ** Action : - Update (ua,va) with the now vorticity term trend 
     209      !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 
    206210      !!---------------------------------------------------------------------- 
    207211      INTEGER                         , INTENT(in   ) ::   kt               ! ocean time-step index 
     212      INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index 
    208213      INTEGER                         , INTENT(in   ) ::   kvor             ! total, planetary, relative, or metric 
    209214      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv           ! now velocities 
     
    226231      CASE ( np_RVO )                           !* relative vorticity 
    227232         DO jk = 1, jpkm1                                 ! Horizontal slab 
    228             DO jj = 1, jpjm1 
    229                DO ji = 1, jpim1 
    230                   zwz(ji,jj,jk) = (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
    231                      &             - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    232                END DO 
    233             END DO 
     233            DO_2D( 1, 0, 1, 0 ) 
     234               zwz(ji,jj,jk) = (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
     235                  &             - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     236            END_2D 
    234237            IF( ln_dynvor_msk ) THEN                     ! mask/unmask relative vorticity  
    235                DO jj = 1, jpjm1 
    236                   DO ji = 1, jpim1 
    237                      zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    238                   END DO 
    239                END DO 
     238               DO_2D( 1, 0, 1, 0 ) 
     239                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
     240               END_2D 
    240241            ENDIF 
    241242         END DO 
    242243 
    243          CALL lbc_lnk( 'dynvor', zwz, 'F', 1. ) 
     244         CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    244245 
    245246      CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    246247         DO jk = 1, jpkm1                                 ! Horizontal slab 
    247             DO jj = 1, jpjm1 
    248                DO ji = 1, jpim1                          ! relative vorticity 
    249                   zwz(ji,jj,jk) = (   e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)   & 
    250                      &              - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)   ) * r1_e1e2f(ji,jj) 
    251                END DO 
    252             END DO 
     248            DO_2D( 1, 0, 1, 0 ) 
     249               zwz(ji,jj,jk) = (   e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)   & 
     250                  &              - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)   ) * r1_e1e2f(ji,jj) 
     251            END_2D 
    253252            IF( ln_dynvor_msk ) THEN                     ! mask/unmask relative vorticity  
    254                DO jj = 1, jpjm1 
    255                   DO ji = 1, jpim1 
    256                      zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    257                   END DO 
    258                END DO 
     253               DO_2D( 1, 0, 1, 0 ) 
     254                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
     255               END_2D 
    259256            ENDIF 
    260257         END DO 
    261258 
    262          CALL lbc_lnk( 'dynvor', zwz, 'F', 1. ) 
     259         CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    263260 
    264261      END SELECT 
     
    270267         SELECT CASE( kvor )                 !==  volume weighted vorticity considered  ==! 
    271268         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    272             zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t_n(:,:,jk) 
     269            zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t(:,:,jk,Kmm) 
    273270         CASE ( np_RVO )                           !* relative vorticity 
    274             DO jj = 2, jpj 
    275                DO ji = 2, jpi   ! vector opt. 
    276                   zwt(ji,jj) = r1_4 * (   zwz(ji-1,jj  ,jk) + zwz(ji,jj  ,jk)   & 
    277                      &                  + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) * e1e2t(ji,jj)*e3t_n(ji,jj,jk) 
    278                END DO 
    279             END DO 
     271            DO_2D( 0, 1, 0, 1 ) 
     272               zwt(ji,jj) = r1_4 * (   zwz(ji-1,jj  ,jk) + zwz(ji,jj  ,jk)   & 
     273                  &                  + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) ) & 
     274                  &                  * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 
     275            END_2D 
    280276         CASE ( np_MET )                           !* metric term 
    281             DO jj = 2, jpj 
    282                DO ji = 2, jpi 
    283                   zwt(ji,jj) = (   ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj)   & 
    284                      &           - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj)   ) * e3t_n(ji,jj,jk) 
    285                END DO 
    286             END DO 
     277            DO_2D( 0, 1, 0, 1 ) 
     278               zwt(ji,jj) = (   ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj)   & 
     279                  &           - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj)   ) & 
     280                  &             * e3t(ji,jj,jk,Kmm) 
     281            END_2D 
    287282         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    288             DO jj = 2, jpj 
    289                DO ji = 2, jpi   ! vector opt. 
    290                   zwt(ji,jj) = (  ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj  ,jk) + zwz(ji,jj  ,jk)    & 
    291                      &                                 + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) )  ) * e1e2t(ji,jj)*e3t_n(ji,jj,jk) 
    292                END DO 
    293             END DO 
     283            DO_2D( 0, 1, 0, 1 ) 
     284               zwt(ji,jj) = (  ff_t(ji,jj) + r1_4 * ( zwz(ji-1,jj  ,jk) + zwz(ji,jj  ,jk)    & 
     285                  &                                 + zwz(ji-1,jj-1,jk) + zwz(ji,jj-1,jk) )  ) & 
     286                  &                                 * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 
     287            END_2D 
    294288         CASE ( np_CME )                           !* Coriolis + metric 
    295             DO jj = 2, jpj 
    296                DO ji = 2, jpi   ! vector opt. 
    297                   zwt(ji,jj) = (  ff_t(ji,jj) * e1e2t(ji,jj)                           & 
    298                        &        + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj)  & 
    299                        &        - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj)  ) * e3t_n(ji,jj,jk) 
    300                END DO 
    301             END DO 
     289            DO_2D( 0, 1, 0, 1 ) 
     290               zwt(ji,jj) = (  ff_t(ji,jj) * e1e2t(ji,jj)                           & 
     291                    &        + ( pv(ji,jj,jk) + pv(ji,jj-1,jk) ) * di_e2u_2(ji,jj)  & 
     292                    &        - ( pu(ji,jj,jk) + pu(ji-1,jj,jk) ) * dj_e1v_2(ji,jj)  ) & 
     293                    &          * e3t(ji,jj,jk,Kmm) 
     294            END_2D 
    302295         CASE DEFAULT                                             ! error 
    303296            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
     
    305298         ! 
    306299         !                                   !==  compute and add the vorticity term trend  =! 
    307          DO jj = 2, jpjm1 
    308             DO ji = 2, jpim1   ! vector opt. 
    309                pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk)                    & 
    310                   &                                * (  zwt(ji+1,jj) * ( pv(ji+1,jj,jk) + pv(ji+1,jj-1,jk) )   & 
    311                   &                                   + zwt(ji  ,jj) * ( pv(ji  ,jj,jk) + pv(ji  ,jj-1,jk) )   ) 
    312                   ! 
    313                pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk)                    & 
    314                   &                                * (  zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) )   &  
    315                   &                                   + zwt(ji,jj  ) * ( pu(ji,jj  ,jk) + pu(ji-1,jj  ,jk) )   )  
    316             END DO   
    317          END DO   
     300         DO_2D( 0, 0, 0, 0 ) 
     301            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)                    & 
     302               &                                * (  zwt(ji+1,jj) * ( pv(ji+1,jj,jk) + pv(ji+1,jj-1,jk) )   & 
     303               &                                   + zwt(ji  ,jj) * ( pv(ji  ,jj,jk) + pv(ji  ,jj-1,jk) )   ) 
     304               ! 
     305            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)                    & 
     306               &                                * (  zwt(ji,jj+1) * ( pu(ji,jj+1,jk) + pu(ji-1,jj+1,jk) )   &  
     307               &                                   + zwt(ji,jj  ) * ( pu(ji,jj  ,jk) + pu(ji-1,jj  ,jk) )   )  
     308         END_2D 
    318309         !                                             ! =============== 
    319310      END DO                                           !   End of slab 
     
    322313 
    323314 
    324    SUBROUTINE vor_ene( kt, kvor, pun, pvn, pua, pva ) 
     315   SUBROUTINE vor_ene( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 
    325316      !!---------------------------------------------------------------------- 
    326317      !!                  ***  ROUTINE vor_ene  *** 
     
    334325      !!         The general trend of momentum is increased due to the vorticity  
    335326      !!       term which is given by: 
    336       !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f  mi(e1v*e3v vn) ] 
    337       !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f  mj(e2u*e3u un) ] 
     327      !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f  mi(e1v*e3v pvv(:,:,:,Kmm)) ] 
     328      !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f  mj(e2u*e3u puu(:,:,:,Kmm)) ] 
    338329      !!       where rvor is the relative vorticity 
    339330      !! 
    340       !! ** Action : - Update (ua,va) with the now vorticity term trend 
     331      !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 
    341332      !! 
    342333      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    343334      !!---------------------------------------------------------------------- 
    344335      INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index 
     336      INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index 
    345337      INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric 
    346       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
    347       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
     338      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities 
     339      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend 
    348340      ! 
    349341      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
     
    366358            zwz(:,:) = ff_f(:,:)  
    367359         CASE ( np_RVO )                           !* relative vorticity 
    368             DO jj = 1, jpjm1 
    369                DO ji = 1, fs_jpim1   ! vector opt. 
    370                   zwz(ji,jj) = (  e2v(ji+1,jj  ) * pvn(ji+1,jj  ,jk) - e2v(ji,jj) * pvn(ji,jj,jk)    & 
    371                      &          - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    372                END DO 
    373             END DO 
     360            DO_2D( 1, 0, 1, 0 ) 
     361               zwz(ji,jj) = (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    & 
     362                  &          - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     363            END_2D 
    374364         CASE ( np_MET )                           !* metric term 
    375             DO jj = 1, jpjm1 
    376                DO ji = 1, fs_jpim1   ! vector opt. 
    377                   zwz(ji,jj) = ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    378                      &       - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    379                END DO 
    380             END DO 
     365            DO_2D( 1, 0, 1, 0 ) 
     366               zwz(ji,jj) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     367                  &       - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     368            END_2D 
    381369         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    382             DO jj = 1, jpjm1 
    383                DO ji = 1, fs_jpim1   ! vector opt. 
    384                   zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj) * pvn(ji+1,jj,jk) - e2v(ji,jj) * pvn(ji,jj,jk)      & 
    385                      &                        - e1u(ji,jj+1) * pun(ji,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    386                END DO 
    387             END DO 
     370            DO_2D( 1, 0, 1, 0 ) 
     371               zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      & 
     372                  &                        - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     373            END_2D 
    388374         CASE ( np_CME )                           !* Coriolis + metric 
    389             DO jj = 1, jpjm1 
    390                DO ji = 1, fs_jpim1   ! vector opt. 
    391                   zwz(ji,jj) = ff_f(ji,jj) + ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    392                      &                     - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    393                END DO 
    394             END DO 
     375            DO_2D( 1, 0, 1, 0 ) 
     376               zwz(ji,jj) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     377                  &                     - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     378            END_2D 
    395379         CASE DEFAULT                                             ! error 
    396380            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
     
    398382         ! 
    399383         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
    400             DO jj = 1, jpjm1 
    401                DO ji = 1, fs_jpim1   ! vector opt. 
    402                   zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
    403                END DO 
    404             END DO 
     384            DO_2D( 1, 0, 1, 0 ) 
     385               zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     386            END_2D 
    405387         ENDIF 
    406388 
    407389         IF( ln_sco ) THEN 
    408             zwz(:,:) = zwz(:,:) / e3f_n(:,:,jk) 
    409             zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 
    410             zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 
     390            zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 
     391            zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
     392            zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    411393         ELSE 
    412             zwx(:,:) = e2u(:,:) * pun(:,:,jk) 
    413             zwy(:,:) = e1v(:,:) * pvn(:,:,jk) 
     394            zwx(:,:) = e2u(:,:) * pu(:,:,jk) 
     395            zwy(:,:) = e1v(:,:) * pv(:,:,jk) 
    414396         ENDIF 
    415397         !                                   !==  compute and add the vorticity term trend  =! 
    416          DO jj = 2, jpjm1 
    417             DO ji = fs_2, fs_jpim1   ! vector opt. 
    418                zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1) 
    419                zy2 = zwy(ji,jj  ) + zwy(ji+1,jj  ) 
    420                zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 
    421                zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1) 
    422                pua(ji,jj,jk) = pua(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    423                pva(ji,jj,jk) = pva(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
    424             END DO   
    425          END DO   
     398         DO_2D( 0, 0, 0, 0 ) 
     399            zy1 = zwy(ji,jj-1) + zwy(ji+1,jj-1) 
     400            zy2 = zwy(ji,jj  ) + zwy(ji+1,jj  ) 
     401            zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 
     402            zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1) 
     403            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     404            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
     405         END_2D 
    426406         !                                             ! =============== 
    427407      END DO                                           !   End of slab 
     
    430410 
    431411 
    432    SUBROUTINE vor_ens( kt, kvor, pun, pvn, pua, pva ) 
     412   SUBROUTINE vor_ens( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 
    433413      !!---------------------------------------------------------------------- 
    434414      !!                ***  ROUTINE vor_ens  *** 
     
    441421      !!      potential enstrophy of a horizontally non-divergent flow. the 
    442422      !!      trend of the vorticity term is given by: 
    443       !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ] 
    444       !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f ]  mi-1[ mj(e2u*e3u un) ] 
    445       !!      Add this trend to the general momentum trend (ua,va): 
    446       !!          (ua,va) = (ua,va) + ( voru , vorv ) 
    447       !! 
    448       !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 
     423      !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f ]  mj-1[ mi(e1v*e3v pvv(:,:,:,Kmm)) ] 
     424      !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f ]  mi-1[ mj(e2u*e3u puu(:,:,:,Kmm)) ] 
     425      !!      Add this trend to the general momentum trend: 
     426      !!          (u(rhs),v(Krhs)) = (u(rhs),v(Krhs)) + ( voru , vorv ) 
     427      !! 
     428      !! ** Action : - Update (pu_rhs,pv_rhs)) arrays with the now vorticity term trend 
    449429      !! 
    450430      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    451431      !!---------------------------------------------------------------------- 
    452432      INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index 
     433      INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index 
    453434      INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric 
    454       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
    455       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
     435      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities 
     436      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend 
    456437      ! 
    457438      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    473454            zwz(:,:) = ff_f(:,:)  
    474455         CASE ( np_RVO )                           !* relative vorticity 
    475             DO jj = 1, jpjm1 
    476                DO ji = 1, fs_jpim1   ! vector opt. 
    477                   zwz(ji,jj) = (  e2v(ji+1,jj  ) * pvn(ji+1,jj  ,jk) - e2v(ji,jj) * pvn(ji,jj,jk)    & 
    478                      &          - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    479                END DO 
    480             END DO 
     456            DO_2D( 1, 0, 1, 0 ) 
     457               zwz(ji,jj) = (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    & 
     458                  &          - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     459            END_2D 
    481460         CASE ( np_MET )                           !* metric term 
    482             DO jj = 1, jpjm1 
    483                DO ji = 1, fs_jpim1   ! vector opt. 
    484                   zwz(ji,jj) = ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    485                      &       - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    486                END DO 
    487             END DO 
     461            DO_2D( 1, 0, 1, 0 ) 
     462               zwz(ji,jj) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     463                  &       - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     464            END_2D 
    488465         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    489             DO jj = 1, jpjm1 
    490                DO ji = 1, fs_jpim1   ! vector opt. 
    491                   zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pvn(ji+1,jj  ,jk) - e2v(ji,jj) * pvn(ji,jj,jk)  & 
    492                      &                        - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    493                END DO 
    494             END DO 
     466            DO_2D( 1, 0, 1, 0 ) 
     467               zwz(ji,jj) = ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
     468                  &                        - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     469            END_2D 
    495470         CASE ( np_CME )                           !* Coriolis + metric 
    496             DO jj = 1, jpjm1 
    497                DO ji = 1, fs_jpim1   ! vector opt. 
    498                   zwz(ji,jj) = ff_f(ji,jj) + ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    499                      &                     - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    500                END DO 
    501             END DO 
     471            DO_2D( 1, 0, 1, 0 ) 
     472               zwz(ji,jj) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     473                  &                     - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     474            END_2D 
    502475         CASE DEFAULT                                             ! error 
    503476            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
     
    505478         ! 
    506479         IF( ln_dynvor_msk ) THEN           !==  mask/unmask vorticity ==! 
    507             DO jj = 1, jpjm1 
    508                DO ji = 1, fs_jpim1   ! vector opt. 
    509                   zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
    510                END DO 
    511             END DO 
     480            DO_2D( 1, 0, 1, 0 ) 
     481               zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     482            END_2D 
    512483         ENDIF 
    513484         ! 
    514485         IF( ln_sco ) THEN                   !==  horizontal fluxes  ==! 
    515             zwz(:,:) = zwz(:,:) / e3f_n(:,:,jk) 
    516             zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 
    517             zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 
     486            zwz(:,:) = zwz(:,:) / e3f(:,:,jk) 
     487            zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
     488            zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    518489         ELSE 
    519             zwx(:,:) = e2u(:,:) * pun(:,:,jk) 
    520             zwy(:,:) = e1v(:,:) * pvn(:,:,jk) 
     490            zwx(:,:) = e2u(:,:) * pu(:,:,jk) 
     491            zwy(:,:) = e1v(:,:) * pv(:,:,jk) 
    521492         ENDIF 
    522493         !                                   !==  compute and add the vorticity term trend  =! 
    523          DO jj = 2, jpjm1 
    524             DO ji = fs_2, fs_jpim1   ! vector opt. 
    525                zuav = r1_8 * r1_e1u(ji,jj) * (  zwy(ji  ,jj-1) + zwy(ji+1,jj-1)  & 
    526                   &                           + zwy(ji  ,jj  ) + zwy(ji+1,jj  )  ) 
    527                zvau =-r1_8 * r1_e2v(ji,jj) * (  zwx(ji-1,jj  ) + zwx(ji-1,jj+1)  & 
    528                   &                           + zwx(ji  ,jj  ) + zwx(ji  ,jj+1)  ) 
    529                pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    530                pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
    531             END DO   
    532          END DO   
     494         DO_2D( 0, 0, 0, 0 ) 
     495            zuav = r1_8 * r1_e1u(ji,jj) * (  zwy(ji  ,jj-1) + zwy(ji+1,jj-1)  & 
     496               &                           + zwy(ji  ,jj  ) + zwy(ji+1,jj  )  ) 
     497            zvau =-r1_8 * r1_e2v(ji,jj) * (  zwx(ji-1,jj  ) + zwx(ji-1,jj+1)  & 
     498               &                           + zwx(ji  ,jj  ) + zwx(ji  ,jj+1)  ) 
     499            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
     500            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     501         END_2D 
    533502         !                                             ! =============== 
    534503      END DO                                           !   End of slab 
     
    537506 
    538507 
    539    SUBROUTINE vor_een( kt, kvor, pun, pvn, pua, pva ) 
     508   SUBROUTINE vor_een( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 
    540509      !!---------------------------------------------------------------------- 
    541510      !!                ***  ROUTINE vor_een  *** 
     
    548517      !!      both the horizontal kinetic energy and the potential enstrophy 
    549518      !!      when horizontal divergence is zero (see the NEMO documentation) 
    550       !!      Add this trend to the general momentum trend (ua,va). 
    551       !! 
    552       !! ** Action : - Update (ua,va) with the now vorticity term trend 
     519      !!      Add this trend to the general momentum trend (pu_rhs,pv_rhs). 
     520      !! 
     521      !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 
    553522      !! 
    554523      !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 
    555524      !!---------------------------------------------------------------------- 
    556525      INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index 
     526      INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index 
    557527      INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric 
    558       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
    559       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
     528      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities 
     529      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend 
    560530      ! 
    561531      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    580550         SELECT CASE( nn_een_e3f )           ! == reciprocal of e3 at F-point 
    581551         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
    582             DO jj = 1, jpjm1 
    583                DO ji = 1, fs_jpim1   ! vector opt. 
    584                   ze3f = (  e3t_n(ji,jj+1,jk)*tmask(ji,jj+1,jk) + e3t_n(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
    585                      &    + e3t_n(ji,jj  ,jk)*tmask(ji,jj  ,jk) + e3t_n(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk)  ) 
    586                   IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = 4._wp / ze3f 
    587                   ELSE                       ;   z1_e3f(ji,jj) = 0._wp 
    588                   ENDIF 
    589                END DO 
    590             END DO 
     552            DO_2D( 1, 0, 1, 0 ) 
     553               ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
     554                  &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
     555                  &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
     556                  &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  ) 
     557               IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = 4._wp / ze3f 
     558               ELSE                       ;   z1_e3f(ji,jj) = 0._wp 
     559               ENDIF 
     560            END_2D 
    591561         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
    592             DO jj = 1, jpjm1 
    593                DO ji = 1, fs_jpim1   ! vector opt. 
    594                   ze3f = (  e3t_n(ji,jj+1,jk)*tmask(ji,jj+1,jk) + e3t_n(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
    595                      &    + e3t_n(ji,jj  ,jk)*tmask(ji,jj  ,jk) + e3t_n(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk)  ) 
    596                   zmsk = (                    tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
    597                      &                      + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk)  ) 
    598                   IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = zmsk / ze3f 
    599                   ELSE                       ;   z1_e3f(ji,jj) = 0._wp 
    600                   ENDIF 
    601                END DO 
    602             END DO 
     562            DO_2D( 1, 0, 1, 0 ) 
     563               ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
     564                  &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
     565                  &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
     566                  &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  ) 
     567               zmsk = (                    tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
     568                  &                      + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk)  ) 
     569               IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = zmsk / ze3f 
     570               ELSE                       ;   z1_e3f(ji,jj) = 0._wp 
     571               ENDIF 
     572            END_2D 
    603573         END SELECT 
    604574         ! 
    605575         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    606576         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    607             DO jj = 1, jpjm1 
    608                DO ji = 1, fs_jpim1   ! vector opt. 
    609                   zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj) 
    610                END DO 
    611             END DO 
     577            DO_2D( 1, 0, 1, 0 ) 
     578               zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj) 
     579            END_2D 
    612580         CASE ( np_RVO )                           !* relative vorticity 
    613             DO jj = 1, jpjm1 
    614                DO ji = 1, fs_jpim1   ! vector opt. 
    615                   zwz(ji,jj,jk) = ( e2v(ji+1,jj  ) * pvn(ji+1,jj,jk) - e2v(ji,jj) * pvn(ji,jj,jk)  & 
    616                      &            - e1u(ji  ,jj+1) * pun(ji,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj) 
    617                END DO 
    618             END DO 
     581            DO_2D( 1, 0, 1, 0 ) 
     582               zwz(ji,jj,jk) = ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
     583                  &            - e1u(ji  ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj) 
     584            END_2D 
    619585         CASE ( np_MET )                           !* metric term 
    620             DO jj = 1, jpjm1 
    621                DO ji = 1, fs_jpim1   ! vector opt. 
    622                   zwz(ji,jj,jk) = (   ( pvn(ji+1,jj,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    623                      &              - ( pun(ji,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    624                END DO 
    625             END DO 
     586            DO_2D( 1, 0, 1, 0 ) 
     587               zwz(ji,jj,jk) = (   ( pv(ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     588                  &              - ( pu(ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     589            END_2D 
    626590         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    627             DO jj = 1, jpjm1 
    628                DO ji = 1, fs_jpim1   ! vector opt. 
    629                   zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pvn(ji+1,jj,jk) - e2v(ji,jj) * pvn(ji,jj,jk)      & 
    630                      &                              - e1u(ji  ,jj+1) * pun(ji,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  )   & 
    631                      &                           * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    632                END DO 
    633             END DO 
     591            DO_2D( 1, 0, 1, 0 ) 
     592               zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      & 
     593                  &                              - e1u(ji  ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  )   & 
     594                  &                           * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     595            END_2D 
    634596         CASE ( np_CME )                           !* Coriolis + metric 
    635             DO jj = 1, jpjm1 
    636                DO ji = 1, fs_jpim1   ! vector opt. 
    637                   zwz(ji,jj,jk) = (   ff_f(ji,jj) + ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    638                      &                            - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    639                END DO 
    640             END DO 
     597            DO_2D( 1, 0, 1, 0 ) 
     598               zwz(ji,jj,jk) = (   ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     599                  &                            - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     600            END_2D 
    641601         CASE DEFAULT                                             ! error 
    642602            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
     
    644604         ! 
    645605         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
    646             DO jj = 1, jpjm1 
    647                DO ji = 1, fs_jpim1   ! vector opt. 
    648                   zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    649                END DO 
    650             END DO 
     606            DO_2D( 1, 0, 1, 0 ) 
     607               zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
     608            END_2D 
    651609         ENDIF 
    652610      END DO                                           !   End of slab 
    653611         ! 
    654       CALL lbc_lnk( 'dynvor', zwz, 'F', 1. ) 
     612      CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    655613 
    656614      DO jk = 1, jpkm1                                 ! Horizontal slab 
    657615         ! 
    658616         !                                   !==  horizontal fluxes  ==! 
    659          zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 
    660          zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 
     617         zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
     618         zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    661619 
    662620         !                                   !==  compute and add the vorticity term trend  =! 
     
    670628         END DO 
    671629         DO jj = 3, jpj 
    672             DO ji = fs_2, jpi   ! vector opt. ok because we start at jj = 3 
     630            DO ji = 2, jpi   ! vector opt. ok because we start at jj = 3 
    673631               ztne(ji,jj) = zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) 
    674632               ztnw(ji,jj) = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) 
     
    677635            END DO 
    678636         END DO 
    679          DO jj = 2, jpjm1 
    680             DO ji = fs_2, fs_jpim1   ! vector opt. 
    681                zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    682                   &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    683                zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    684                   &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    685                pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    686                pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
    687             END DO   
    688          END DO   
     637         DO_2D( 0, 0, 0, 0 ) 
     638            zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     639               &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     640            zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     641               &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     642            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 
     643            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 
     644         END_2D 
    689645         !                                             ! =============== 
    690646      END DO                                           !   End of slab 
     
    694650 
    695651 
    696    SUBROUTINE vor_eeT( kt, kvor, pun, pvn, pua, pva ) 
     652   SUBROUTINE vor_eeT( kt, Kmm, kvor, pu, pv, pu_rhs, pv_rhs ) 
    697653      !!---------------------------------------------------------------------- 
    698654      !!                ***  ROUTINE vor_eeT  *** 
     
    705661      !!      a modified version of Arakawa and Lamb (1980) scheme (see vor_een). 
    706662      !!      The change consists in  
    707       !!      Add this trend to the general momentum trend (ua,va). 
    708       !! 
    709       !! ** Action : - Update (ua,va) with the now vorticity term trend 
     663      !!      Add this trend to the general momentum trend (pu_rhs,pv_rhs). 
     664      !! 
     665      !! ** Action : - Update (pu_rhs,pv_rhs) with the now vorticity term trend 
    710666      !! 
    711667      !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 
    712668      !!---------------------------------------------------------------------- 
    713669      INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index 
     670      INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index 
    714671      INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric 
    715       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pun, pvn    ! now velocities 
    716       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva    ! total v-trend 
     672      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities 
     673      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend 
    717674      ! 
    718675      INTEGER  ::   ji, jj, jk     ! dummy loop indices 
     
    738695         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    739696         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    740             DO jj = 1, jpjm1 
    741                DO ji = 1, fs_jpim1   ! vector opt. 
    742                   zwz(ji,jj,jk) = ff_f(ji,jj) 
    743                END DO 
    744             END DO 
     697            DO_2D( 1, 0, 1, 0 ) 
     698               zwz(ji,jj,jk) = ff_f(ji,jj) 
     699            END_2D 
    745700         CASE ( np_RVO )                           !* relative vorticity 
    746             DO jj = 1, jpjm1 
    747                DO ji = 1, fs_jpim1   ! vector opt. 
    748                   zwz(ji,jj,jk) = (  e2v(ji+1,jj  ) * pvn(ji+1,jj  ,jk) - e2v(ji,jj) * pvn(ji,jj,jk)    & 
    749                      &             - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) & 
    750                      &          * r1_e1e2f(ji,jj) 
    751                END DO 
    752             END DO 
     701            DO_2D( 1, 0, 1, 0 ) 
     702               zwz(ji,jj,jk) = (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    & 
     703                  &             - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) & 
     704                  &          * r1_e1e2f(ji,jj) 
     705            END_2D 
    753706         CASE ( np_MET )                           !* metric term 
    754             DO jj = 1, jpjm1 
    755                DO ji = 1, fs_jpim1   ! vector opt. 
    756                   zwz(ji,jj,jk) = ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    757                      &          - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    758                END DO 
    759             END DO 
     707            DO_2D( 1, 0, 1, 0 ) 
     708               zwz(ji,jj,jk) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     709                  &          - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     710            END_2D 
    760711         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    761             DO jj = 1, jpjm1 
    762                DO ji = 1, fs_jpim1   ! vector opt. 
    763                   zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pvn(ji+1,jj  ,jk) - e2v(ji,jj) * pvn(ji,jj,jk)    & 
    764                      &                              - e1u(ji  ,jj+1) * pun(ji  ,jj+1,jk) + e1u(ji,jj) * pun(ji,jj,jk)  ) & 
    765                      &                         * r1_e1e2f(ji,jj)    ) 
    766                END DO 
    767             END DO 
     712            DO_2D( 1, 0, 1, 0 ) 
     713               zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    & 
     714                  &                              - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) & 
     715                  &                         * r1_e1e2f(ji,jj)    ) 
     716            END_2D 
    768717         CASE ( np_CME )                           !* Coriolis + metric 
    769             DO jj = 1, jpjm1 
    770                DO ji = 1, fs_jpim1   ! vector opt. 
    771                   zwz(ji,jj,jk) = ff_f(ji,jj) + ( pvn(ji+1,jj  ,jk) + pvn(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    772                      &                        - ( pun(ji  ,jj+1,jk) + pun(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    773                END DO 
    774             END DO 
     718            DO_2D( 1, 0, 1, 0 ) 
     719               zwz(ji,jj,jk) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
     720                  &                        - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     721            END_2D 
    775722         CASE DEFAULT                                             ! error 
    776723            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
     
    778725         ! 
    779726         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
    780             DO jj = 1, jpjm1 
    781                DO ji = 1, fs_jpim1   ! vector opt. 
    782                   zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    783                END DO 
    784             END DO 
     727            DO_2D( 1, 0, 1, 0 ) 
     728               zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
     729            END_2D 
    785730         ENDIF 
    786731      END DO 
    787732      ! 
    788       CALL lbc_lnk( 'dynvor', zwz, 'F', 1. ) 
     733      CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    789734      ! 
    790735      DO jk = 1, jpkm1                                 ! Horizontal slab 
    791736 
    792737      !                                   !==  horizontal fluxes  ==! 
    793          zwx(:,:) = e2u(:,:) * e3u_n(:,:,jk) * pun(:,:,jk) 
    794          zwy(:,:) = e1v(:,:) * e3v_n(:,:,jk) * pvn(:,:,jk) 
     738         zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
     739         zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
    795740 
    796741         !                                   !==  compute and add the vorticity term trend  =! 
     
    798743         ztne(1,:) = 0   ;   ztnw(1,:) = 0   ;   ztse(1,:) = 0   ;   ztsw(1,:) = 0 
    799744         DO ji = 2, jpi          ! split in 2 parts due to vector opt. 
    800                z1_e3t = 1._wp / e3t_n(ji,jj,jk) 
     745               z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
    801746               ztne(ji,jj) = ( zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) ) * z1_e3t 
    802747               ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) ) * z1_e3t 
     
    805750         END DO 
    806751         DO jj = 3, jpj 
    807             DO ji = fs_2, jpi   ! vector opt. ok because we start at jj = 3 
    808                z1_e3t = 1._wp / e3t_n(ji,jj,jk) 
     752            DO ji = 2, jpi   ! vector opt. ok because we start at jj = 3 
     753               z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
    809754               ztne(ji,jj) = ( zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) ) * z1_e3t 
    810755               ztnw(ji,jj) = ( zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) ) * z1_e3t 
     
    813758            END DO 
    814759         END DO 
    815          DO jj = 2, jpjm1 
    816             DO ji = fs_2, fs_jpim1   ! vector opt. 
    817                zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    818                   &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    819                zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    820                   &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    821                pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    822                pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
    823             END DO   
    824          END DO   
     760         DO_2D( 0, 0, 0, 0 ) 
     761            zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     762               &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     763            zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     764               &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     765            pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 
     766            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 
     767         END_2D 
    825768         !                                             ! =============== 
    826769      END DO                                           !   End of slab 
     
    849792      ENDIF 
    850793      ! 
    851       REWIND( numnam_ref )              ! Namelist namdyn_vor in reference namelist : Vorticity scheme options 
    852794      READ  ( numnam_ref, namdyn_vor, IOSTAT = ios, ERR = 901) 
    853 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_vor in reference namelist', lwp ) 
    854       REWIND( numnam_cfg )              ! Namelist namdyn_vor in configuration namelist : Vorticity scheme options 
     795901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdyn_vor in reference namelist' ) 
    855796      READ  ( numnam_cfg, namdyn_vor, IOSTAT = ios, ERR = 902 ) 
    856 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_vor in configuration namelist', lwp ) 
     797902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdyn_vor in configuration namelist' ) 
    857798      IF(lwm) WRITE ( numond, namdyn_vor ) 
    858799      ! 
     
    877818      IF(lwp) WRITE(numout,*) '      change fmask value in the angles (T)           ln_vorlat = ', ln_vorlat 
    878819      IF( ln_vorlat .AND. ( ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix ) ) THEN 
    879          DO jk = 1, jpk 
    880             DO jj = 1, jpjm1 
    881                DO ji = 1, jpim1 
    882                   IF(    tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk)              & 
    883                      & + tmask(ji,jj  ,jk) + tmask(ji+1,jj+1,jk) == 3._wp )   fmask(ji,jj,jk) = 1._wp 
    884                END DO 
    885             END DO 
    886          END DO 
     820         DO_3D( 1, 0, 1, 0, 1, jpk ) 
     821            IF(    tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk)              & 
     822               & + tmask(ji,jj  ,jk) + tmask(ji+1,jj  ,jk) == 3._wp )   fmask(ji,jj,jk) = 1._wp 
     823         END_3D 
    887824         ! 
    888825         CALL lbc_lnk( 'dynvor', fmask, 'F', 1._wp )      ! Lateral boundary conditions on fmask 
     
    920857         CASE( np_ENT )                      !* T-point metric term :   pre-compute di(e2u)/2 and dj(e1v)/2 
    921858            ALLOCATE( di_e2u_2(jpi,jpj), dj_e1v_2(jpi,jpj) ) 
    922             DO jj = 2, jpjm1 
    923                DO ji = 2, jpim1 
    924                   di_e2u_2(ji,jj) = ( e2u(ji,jj) - e2u(ji-1,jj  ) ) * 0.5_wp 
    925                   dj_e1v_2(ji,jj) = ( e1v(ji,jj) - e1v(ji  ,jj-1) ) * 0.5_wp 
    926                END DO 
    927             END DO 
    928             CALL lbc_lnk_multi( 'dynvor', di_e2u_2, 'T', -1. , dj_e1v_2, 'T', -1. )   ! Lateral boundary conditions 
     859            DO_2D( 0, 0, 0, 0 ) 
     860               di_e2u_2(ji,jj) = ( e2u(ji,jj) - e2u(ji-1,jj  ) ) * 0.5_wp 
     861               dj_e1v_2(ji,jj) = ( e1v(ji,jj) - e1v(ji  ,jj-1) ) * 0.5_wp 
     862            END_2D 
     863            CALL lbc_lnk_multi( 'dynvor', di_e2u_2, 'T', -1.0_wp , dj_e1v_2, 'T', -1.0_wp )   ! Lateral boundary conditions 
    929864            ! 
    930865         CASE DEFAULT                        !* F-point metric term :   pre-compute di(e2u)/(2*e1e2f) and dj(e1v)/(2*e1e2f) 
    931866            ALLOCATE( di_e2v_2e1e2f(jpi,jpj), dj_e1u_2e1e2f(jpi,jpj) ) 
    932             DO jj = 1, jpjm1 
    933                DO ji = 1, jpim1 
    934                   di_e2v_2e1e2f(ji,jj) = ( e2v(ji+1,jj  ) - e2v(ji,jj) )  * 0.5 * r1_e1e2f(ji,jj) 
    935                   dj_e1u_2e1e2f(ji,jj) = ( e1u(ji  ,jj+1) - e1u(ji,jj) )  * 0.5 * r1_e1e2f(ji,jj) 
    936                END DO 
    937             END DO 
    938             CALL lbc_lnk_multi( 'dynvor', di_e2v_2e1e2f, 'F', -1. , dj_e1u_2e1e2f, 'F', -1. )   ! Lateral boundary conditions 
     867            DO_2D( 1, 0, 1, 0 ) 
     868               di_e2v_2e1e2f(ji,jj) = ( e2v(ji+1,jj  ) - e2v(ji,jj) )  * 0.5 * r1_e1e2f(ji,jj) 
     869               dj_e1u_2e1e2f(ji,jj) = ( e1u(ji  ,jj+1) - e1u(ji,jj) )  * 0.5 * r1_e1e2f(ji,jj) 
     870            END_2D 
     871            CALL lbc_lnk_multi( 'dynvor', di_e2v_2e1e2f, 'F', -1.0_wp , dj_e1u_2e1e2f, 'F', -1.0_wp )   ! Lateral boundary conditions 
    939872         END SELECT 
    940873         ! 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynzad.F90

    r10068 r13463  
    2828 
    2929   !! * Substitutions 
    30 #  include "vectopt_loop_substitute.h90" 
     30#  include "do_loop_substitute.h90" 
     31#  include "domzgr_substitute.h90" 
    3132   !!---------------------------------------------------------------------- 
    3233   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    3637CONTAINS 
    3738 
    38    SUBROUTINE dyn_zad ( kt ) 
     39   SUBROUTINE dyn_zad ( kt, Kmm, puu, pvv, Krhs ) 
    3940      !!---------------------------------------------------------------------- 
    4041      !!                  ***  ROUTINE dynzad  *** 
     
    4445      !! 
    4546      !! ** Method  :   The now vertical advection of momentum is given by: 
    46       !!         w dz(u) = ua + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*wn) dk(un) ] 
    47       !!         w dz(v) = va + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*wn) dk(vn) ] 
    48       !!      Add this trend to the general trend (ua,va): 
    49       !!         (ua,va) = (ua,va) + w dz(u,v) 
     47      !!         w dz(u) = u(rhs) + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*ww) dk(u) ] 
     48      !!         w dz(v) = v(rhs) + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*ww) dk(v) ] 
     49      !!      Add this trend to the general trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)): 
     50      !!         (u(rhs),v(rhs)) = (u(rhs),v(rhs)) + w dz(u,v) 
    5051      !! 
    51       !! ** Action  : - Update (ua,va) with the vert. momentum adv. trends 
     52      !! ** Action  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the vert. momentum adv. trends 
    5253      !!              - Send the trends to trddyn for diagnostics (l_trddyn=T) 
    5354      !!---------------------------------------------------------------------- 
    54       INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx 
     55      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step inedx 
     56      INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices 
     57      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation 
    5558      ! 
    5659      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     
    6871      ENDIF 
    6972 
    70       IF( l_trddyn )   THEN         ! Save ua and va trends 
     73      IF( l_trddyn )   THEN         ! Save puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends 
    7174         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )  
    72          ztrdu(:,:,:) = ua(:,:,:)  
    73          ztrdv(:,:,:) = va(:,:,:)  
     75         ztrdu(:,:,:) = puu(:,:,:,Krhs)  
     76         ztrdv(:,:,:) = pvv(:,:,:,Krhs)  
    7477      ENDIF 
    7578       
    7679      DO jk = 2, jpkm1              ! Vertical momentum advection at level w and u- and v- vertical 
    77          DO jj = 2, jpj                   ! vertical fluxes  
    78             DO ji = fs_2, jpi             ! vector opt. 
    79                zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
    80             END DO 
    81          END DO 
    82          DO jj = 2, jpjm1                 ! vertical momentum advection at w-point 
    83             DO ji = fs_2, fs_jpim1        ! vector opt. 
    84                zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( un(ji,jj,jk-1) - un(ji,jj,jk) ) 
    85                zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) ) 
    86             END DO   
    87          END DO    
     80         DO_2D( 0, 1, 0, 1 ) 
     81            zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 
     82         END_2D 
     83         DO_2D( 0, 0, 0, 0 ) 
     84            zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) ) 
     85            zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( pvv(ji,jj,jk-1,Kmm) - pvv(ji,jj,jk,Kmm) ) 
     86         END_2D 
    8887      END DO 
    8988      ! 
    9089      ! Surface and bottom advective fluxes set to zero 
    91       DO jj = 2, jpjm1         
    92          DO ji = fs_2, fs_jpim1           ! vector opt. 
    93             zwuw(ji,jj, 1 ) = 0._wp 
    94             zwvw(ji,jj, 1 ) = 0._wp 
    95             zwuw(ji,jj,jpk) = 0._wp 
    96             zwvw(ji,jj,jpk) = 0._wp 
    97          END DO   
    98       END DO 
     90      DO_2D( 0, 0, 0, 0 ) 
     91         zwuw(ji,jj, 1 ) = 0._wp 
     92         zwvw(ji,jj, 1 ) = 0._wp 
     93         zwuw(ji,jj,jpk) = 0._wp 
     94         zwvw(ji,jj,jpk) = 0._wp 
     95      END_2D 
    9996      ! 
    100       DO jk = 1, jpkm1              ! Vertical momentum advection at u- and v-points 
    101          DO jj = 2, jpjm1 
    102             DO ji = fs_2, fs_jpim1       ! vector opt. 
    103                ua(ji,jj,jk) = ua(ji,jj,jk) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
    104                va(ji,jj,jk) = va(ji,jj,jk) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
    105             END DO   
    106          END DO   
    107       END DO 
     97      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     98         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   & 
     99            &                                      / e3u(ji,jj,jk,Kmm) 
     100         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   & 
     101            &                                      / e3v(ji,jj,jk,Kmm) 
     102      END_3D 
    108103 
    109104      IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic 
    110          ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    111          ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    112          CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt ) 
     105         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
     106         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:) 
     107         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt, Kmm ) 
    113108         DEALLOCATE( ztrdu, ztrdv )  
    114109      ENDIF 
    115110      !                             ! Control print 
    116       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zad  - Ua: ', mask1=umask,   & 
    117          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     111      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' zad  - Ua: ', mask1=umask,   & 
     112         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    118113      ! 
    119114      IF( ln_timing )   CALL timing_stop('dyn_zad') 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/dynzdf.F90

    r11281 r13463  
    3737 
    3838   !! * Substitutions 
    39 #  include "vectopt_loop_substitute.h90" 
     39#  include "do_loop_substitute.h90" 
     40#  include "domzgr_substitute.h90" 
    4041   !!---------------------------------------------------------------------- 
    4142   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    4546CONTAINS 
    4647    
    47    SUBROUTINE dyn_zdf( kt ) 
     48   SUBROUTINE dyn_zdf( kt, Kbb, Kmm, Krhs, puu, pvv, Kaa ) 
    4849      !!---------------------------------------------------------------------- 
    4950      !!                  ***  ROUTINE dyn_zdf  *** 
     
    5455      !! 
    5556      !! ** Method  :  - Leap-Frog time stepping on all trends but the vertical mixing 
    56       !!         ua =         ub + 2*dt *       ua             vector form or linear free surf. 
    57       !!         ua = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_a   otherwise 
     57      !!         u(after) =         u(before) + 2*dt *       u(rhs)                vector form or linear free surf. 
     58      !!         u(after) = ( e3u_b*u(before) + 2*dt * e3u_n*u(rhs) ) / e3u_after   otherwise 
    5859      !!               - update the after velocity with the implicit vertical mixing. 
    5960      !!      This requires to solver the following system:  
    60       !!         ua = ua + 1/e3u_a dk+1[ mi(avm) / e3uw_a dk[ua] ] 
     61      !!         u(after) = u(after) + 1/e3u_after  dk+1[ mi(avm) / e3uw_after dk[ua] ] 
    6162      !!      with the following surface/top/bottom boundary condition: 
    6263      !!      surface: wind stress input (averaged over kt-1/2 & kt+1/2) 
    6364      !!      top & bottom : top stress (iceshelf-ocean) & bottom stress (cf zdfdrg.F90) 
    6465      !! 
    65       !! ** Action :   (ua,va)   after velocity  
     66      !! ** Action :   (puu(:,:,:,Kaa),pvv(:,:,:,Kaa))   after velocity  
    6667      !!--------------------------------------------------------------------- 
    67       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     68      INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index 
     69      INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices 
     70      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation 
    6871      ! 
    6972      INTEGER  ::   ji, jj, jk         ! dummy loop indices 
     
    9093         ENDIF 
    9194      ENDIF 
    92       !                             !* set time step 
    93       IF( neuler == 0 .AND. kt == nit000     ) THEN   ;   r2dt =      rdt   ! = rdt (restart with Euler time stepping) 
    94       ELSEIF(               kt <= nit000 + 1 ) THEN   ;   r2dt = 2. * rdt   ! = 2 rdt (leapfrog) 
    95       ENDIF 
    96       ! 
    9795      !                             !* explicit top/bottom drag case 
    98       IF( .NOT.ln_drgimp )   CALL zdf_drg_exp( kt, ub, vb, ua, va )  ! add top/bottom friction trend to (ua,va) 
     96      IF( .NOT.ln_drgimp )   CALL zdf_drg_exp( kt, Kmm, puu(:,:,:,Kbb), pvv(:,:,:,Kbb), puu(:,:,:,Krhs), pvv(:,:,:,Krhs) )  ! add top/bottom friction trend to (puu(Kaa),pvv(Kaa)) 
    9997      ! 
    10098      ! 
    10199      IF( l_trddyn )   THEN         !* temporary save of ta and sa trends 
    102100         ALLOCATE( ztrdu(jpi,jpj,jpk), ztrdv(jpi,jpj,jpk) )  
    103          ztrdu(:,:,:) = ua(:,:,:) 
    104          ztrdv(:,:,:) = va(:,:,:) 
    105       ENDIF 
    106       ! 
    107       !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in ua,va) 
     101         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
     102         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
     103      ENDIF 
     104      ! 
     105      !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in puu(:,:,:,Kaa),pvv(:,:,:,Kaa)) 
    108106      ! 
    109107      !                    ! time stepping except vertical diffusion 
    110108      IF( ln_dynadv_vec .OR. ln_linssh ) THEN   ! applied on velocity 
    111          DO jk = 1, jpkm1 
    112             ua(:,:,jk) = ( ub(:,:,jk) + r2dt * ua(:,:,jk) ) * umask(:,:,jk) 
    113             va(:,:,jk) = ( vb(:,:,jk) + r2dt * va(:,:,jk) ) * vmask(:,:,jk) 
    114          END DO 
     109         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     110            puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kbb) + rDt * puu(ji,jj,jk,Krhs) ) * umask(ji,jj,jk) 
     111            pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kbb) + rDt * pvv(ji,jj,jk,Krhs) ) * vmask(ji,jj,jk) 
     112         END_3D 
    115113      ELSE                                      ! applied on thickness weighted velocity 
    116          DO jk = 1, jpkm1 
    117             ua(:,:,jk) = (         e3u_b(:,:,jk) * ub(:,:,jk)  & 
    118                &          + r2dt * e3u_n(:,:,jk) * ua(:,:,jk)  ) / e3u_a(:,:,jk) * umask(:,:,jk) 
    119             va(:,:,jk) = (         e3v_b(:,:,jk) * vb(:,:,jk)  & 
    120                &          + r2dt * e3v_n(:,:,jk) * va(:,:,jk)  ) / e3v_a(:,:,jk) * vmask(:,:,jk) 
    121          END DO 
     114         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     115            puu(ji,jj,jk,Kaa) = (         e3u(ji,jj,jk,Kbb) * puu(ji,jj,jk,Kbb )  & 
     116               &                  + rDt * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Krhs)  ) & 
     117               &                        / e3u(ji,jj,jk,Kaa) * umask(ji,jj,jk) 
     118            pvv(ji,jj,jk,Kaa) = (         e3v(ji,jj,jk,Kbb) * pvv(ji,jj,jk,Kbb )  & 
     119               &                  + rDt * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Krhs)  ) & 
     120               &                        / e3v(ji,jj,jk,Kaa) * vmask(ji,jj,jk) 
     121         END_3D 
    122122      ENDIF 
    123123      !                    ! add top/bottom friction  
     
    125125      !     J. Chanut: The bottom stress is computed considering after barotropic velocities, which does  
    126126      !                not lead to the effective stress seen over the whole barotropic loop.  
    127       !     G. Madec : in linear free surface, e3u_a = e3u_n = e3u_0, so systematic use of e3u_a 
     127      !     G. Madec : in linear free surface, e3u(:,:,:,Kaa) = e3u(:,:,:,Kmm) = e3u_0, so systematic use of e3u(:,:,:,Kaa) 
    128128      IF( ln_drgimp .AND. ln_dynspg_ts ) THEN 
    129          DO jk = 1, jpkm1        ! remove barotropic velocities 
    130             ua(:,:,jk) = ( ua(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk) 
    131             va(:,:,jk) = ( va(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk) 
    132          END DO 
    133          DO jj = 2, jpjm1        ! Add bottom/top stress due to barotropic component only 
    134             DO ji = fs_2, fs_jpim1   ! vector opt. 
    135                iku = mbku(ji,jj)         ! ocean bottom level at u- and v-points  
    136                ikv = mbkv(ji,jj)         ! (deepest ocean u- and v-points) 
    137                ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) 
    138                ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) 
    139                ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * ua_b(ji,jj) / ze3ua 
    140                va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * va_b(ji,jj) / ze3va 
    141             END DO 
    142          END DO 
     129         DO_3D( 0, 0, 0, 0, 1, jpkm1 )      ! remove barotropic velocities 
     130            puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - uu_b(ji,jj,Kaa) ) * umask(ji,jj,jk) 
     131            pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - vv_b(ji,jj,Kaa) ) * vmask(ji,jj,jk) 
     132         END_3D 
     133         DO_2D( 0, 0, 0, 0 ) 
     134            iku = mbku(ji,jj)         ! ocean bottom level at u- and v-points  
     135            ikv = mbkv(ji,jj)         ! (deepest ocean u- and v-points) 
     136            ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm)    & 
     137               &             + r_vvl   * e3u(ji,jj,iku,Kaa) 
     138            ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm)    & 
     139               &             + r_vvl   * e3v(ji,jj,ikv,Kaa) 
     140            puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + rDt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua 
     141            pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 
     142         END_2D 
    143143         IF( ln_isfcav ) THEN    ! Ocean cavities (ISF) 
    144             DO jj = 2, jpjm1         
    145                DO ji = fs_2, fs_jpim1   ! vector opt. 
    146                   iku = miku(ji,jj)         ! top ocean level at u- and v-points  
    147                   ikv = mikv(ji,jj)         ! (first wet ocean u- and v-points) 
    148                   ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku) 
    149                   ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv) 
    150                   ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * ua_b(ji,jj) / ze3ua 
    151                   va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * va_b(ji,jj) / ze3va 
    152                END DO 
    153             END DO 
     144            DO_2D( 0, 0, 0, 0 ) 
     145               iku = miku(ji,jj)         ! top ocean level at u- and v-points  
     146               ikv = mikv(ji,jj)         ! (first wet ocean u- and v-points) 
     147               ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm)    & 
     148                  &             + r_vvl   * e3u(ji,jj,iku,Kaa) 
     149               ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm)    & 
     150                  &             + r_vvl   * e3v(ji,jj,ikv,Kaa) 
     151               puu(ji,jj,iku,Kaa) = puu(ji,jj,iku,Kaa) + rDt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * uu_b(ji,jj,Kaa) / ze3ua 
     152               pvv(ji,jj,ikv,Kaa) = pvv(ji,jj,ikv,Kaa) + rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * vv_b(ji,jj,Kaa) / ze3va 
     153            END_2D 
    154154         END IF 
    155155      ENDIF 
     
    158158      ! 
    159159      !                    !* Matrix construction 
    160       zdt = r2dt * 0.5 
     160      zdt = rDt * 0.5 
    161161      IF( ln_zad_Aimp ) THEN   !! 
    162162         SELECT CASE( nldf_dyn ) 
    163163         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu) 
    164             DO jk = 1, jpkm1 
    165                DO jj = 2, jpjm1  
    166                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    167                      ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at U-point 
    168                      zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   & 
    169                         &         / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  ) 
    170                      zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   & 
    171                         &         / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 
    172                      zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) / ze3ua 
    173                      zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 
    174                      zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp )  
    175                      zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 
    176                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 
    177                   END DO 
    178                END DO 
    179             END DO 
     164            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     165               ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm)    & 
     166                  &             + r_vvl   * e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point 
     167               zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   & 
     168                  &         / ( ze3ua * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  ) 
     169               zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   & 
     170                  &         / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 
     171               zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) / ze3ua 
     172               zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 
     173               zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp )  
     174               zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 
     175               zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 
     176            END_3D 
    180177         CASE DEFAULT               ! iso-level lateral mixing 
    181             DO jk = 1, jpkm1 
    182                DO jj = 2, jpjm1  
    183                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    184                      ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at U-point 
    185                      zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) ) / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  ) 
    186                      zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 
    187                      zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) / ze3ua 
    188                      zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 
    189                      zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp ) 
    190                      zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 
    191                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 
    192                   END DO 
    193                END DO 
    194             END DO 
     178            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     179               ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm)    &    ! after scale factor at U-point 
     180                  &             + r_vvl   * e3u(ji,jj,jk,Kaa) 
     181               zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) )   & 
     182                  &         / ( ze3ua * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  ) 
     183               zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) )   & 
     184                  &         / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 
     185               zWui = ( wi(ji,jj,jk  ) + wi(ji+1,jj,jk  ) ) / ze3ua 
     186               zWus = ( wi(ji,jj,jk+1) + wi(ji+1,jj,jk+1) ) / ze3ua 
     187               zwi(ji,jj,jk) = zzwi + zdt * MIN( zWui, 0._wp ) 
     188               zws(ji,jj,jk) = zzws - zdt * MAX( zWus, 0._wp ) 
     189               zwd(ji,jj,jk) = 1._wp - zzwi - zzws + zdt * ( MAX( zWui, 0._wp ) - MIN( zWus, 0._wp ) ) 
     190            END_3D 
    195191         END SELECT 
    196          DO jj = 2, jpjm1     !* Surface boundary conditions 
    197             DO ji = fs_2, fs_jpim1   ! vector opt. 
    198                zwi(ji,jj,1) = 0._wp 
    199                ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1) 
    200                zzws = - zdt * ( avm(ji+1,jj,2) + avm(ji  ,jj,2) ) / ( ze3ua * e3uw_n(ji,jj,2) ) * wumask(ji,jj,2) 
    201                zWus = ( wi(ji  ,jj,2) +  wi(ji+1,jj,2) ) / ze3ua 
    202                zws(ji,jj,1 ) = zzws - zdt * MAX( zWus, 0._wp ) 
    203                zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWus, 0._wp ) ) 
    204             END DO 
    205          END DO 
     192         DO_2D( 0, 0, 0, 0 ) 
     193            zwi(ji,jj,1) = 0._wp 
     194            ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,1,Kmm)    & 
     195               &             + r_vvl   * e3u(ji,jj,1,Kaa) 
     196            zzws = - zdt * ( avm(ji+1,jj,2) + avm(ji  ,jj,2) )   & 
     197               &         / ( ze3ua * e3uw(ji,jj,2,Kmm) ) * wumask(ji,jj,2) 
     198            zWus = ( wi(ji  ,jj,2) +  wi(ji+1,jj,2) ) / ze3ua 
     199            zws(ji,jj,1 ) = zzws - zdt * MAX( zWus, 0._wp ) 
     200            zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWus, 0._wp ) ) 
     201         END_2D 
    206202      ELSE 
    207203         SELECT CASE( nldf_dyn ) 
    208204         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu) 
    209             DO jk = 1, jpkm1 
    210                DO jj = 2, jpjm1  
    211                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    212                      ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at U-point 
    213                      zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   & 
    214                         &         / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  ) 
    215                      zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   & 
    216                         &         / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 
    217                      zwi(ji,jj,jk) = zzwi 
    218                      zws(ji,jj,jk) = zzws 
    219                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
    220                   END DO 
    221                END DO 
    222             END DO 
     205            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     206               ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm)    & 
     207                  &             + r_vvl   * e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point 
     208               zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   & 
     209                  &         / ( ze3ua * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  ) 
     210               zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   & 
     211                  &         / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 
     212               zwi(ji,jj,jk) = zzwi 
     213               zws(ji,jj,jk) = zzws 
     214               zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     215            END_3D 
    223216         CASE DEFAULT               ! iso-level lateral mixing 
    224             DO jk = 1, jpkm1 
    225                DO jj = 2, jpjm1  
    226                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    227                      ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at U-point 
    228                      zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) ) / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  ) 
    229                      zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1) 
    230                      zwi(ji,jj,jk) = zzwi 
    231                      zws(ji,jj,jk) = zzws 
    232                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
    233                   END DO 
    234                END DO 
    235             END DO 
     217            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     218               ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,jk,Kmm)    & 
     219                  &             + r_vvl   * e3u(ji,jj,jk,Kaa)   ! after scale factor at U-point 
     220               zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) )    & 
     221                  &         / ( ze3ua * e3uw(ji,jj,jk  ,Kmm) ) * wumask(ji,jj,jk  ) 
     222               zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) )    & 
     223                  &         / ( ze3ua * e3uw(ji,jj,jk+1,Kmm) ) * wumask(ji,jj,jk+1) 
     224               zwi(ji,jj,jk) = zzwi 
     225               zws(ji,jj,jk) = zzws 
     226               zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     227            END_3D 
    236228         END SELECT 
    237          DO jj = 2, jpjm1     !* Surface boundary conditions 
    238             DO ji = fs_2, fs_jpim1   ! vector opt. 
    239                zwi(ji,jj,1) = 0._wp 
    240                zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
    241             END DO 
    242          END DO 
     229         DO_2D( 0, 0, 0, 0 ) 
     230            zwi(ji,jj,1) = 0._wp 
     231            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
     232         END_2D 
    243233      ENDIF 
    244234      ! 
     
    251241      ! 
    252242      IF ( ln_drgimp ) THEN      ! implicit bottom friction 
    253          DO jj = 2, jpjm1 
    254             DO ji = 2, jpim1 
    255                iku = mbku(ji,jj)       ! ocean bottom level at u- and v-points 
    256                ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)   ! after scale factor at T-point 
    257                zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 
    258             END DO 
    259          END DO 
     243         DO_2D( 0, 0, 0, 0 ) 
     244            iku = mbku(ji,jj)       ! ocean bottom level at u- and v-points 
     245            ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm)    & 
     246               &             + r_vvl   * e3u(ji,jj,iku,Kaa)   ! after scale factor at T-point 
     247            zwd(ji,jj,iku) = zwd(ji,jj,iku) - rDt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua 
     248         END_2D 
    260249         IF ( ln_isfcav ) THEN   ! top friction (always implicit) 
    261             DO jj = 2, jpjm1 
    262                DO ji = 2, jpim1 
    263                   !!gm   top Cd is masked (=0 outside cavities) no need of test on mik>=2  ==>> it has been suppressed 
    264                   iku = miku(ji,jj)       ! ocean top level at u- and v-points  
    265                   ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)   ! after scale factor at T-point 
    266                   zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 
    267                END DO 
    268             END DO 
     250            DO_2D( 0, 0, 0, 0 ) 
     251               !!gm   top Cd is masked (=0 outside cavities) no need of test on mik>=2  ==>> it has been suppressed 
     252               iku = miku(ji,jj)       ! ocean top level at u- and v-points  
     253               ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,iku,Kmm)    & 
     254                  &             + r_vvl   * e3u(ji,jj,iku,Kaa)   ! after scale factor at T-point 
     255               zwd(ji,jj,iku) = zwd(ji,jj,iku) - rDt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua 
     256            END_2D 
    269257         END IF 
    270258      ENDIF 
     
    282270      !   m is decomposed in the product of an upper and a lower triangular matrix 
    283271      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
    284       !   The solution (the after velocity) is in ua 
     272      !   The solution (the after velocity) is in puu(:,:,:,Kaa) 
    285273      !----------------------------------------------------------------------- 
    286274      ! 
    287       DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    288          DO jj = 2, jpjm1    
    289             DO ji = fs_2, fs_jpim1   ! vector opt. 
    290                zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
    291             END DO 
    292          END DO 
    293       END DO 
    294       ! 
    295       DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==! 
    296          DO ji = fs_2, fs_jpim1   ! vector opt. 
    297             ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1)  
    298             ua(ji,jj,1) = ua(ji,jj,1) + r2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    299                &                                      / ( ze3ua * rau0 ) * umask(ji,jj,1)  
    300          END DO 
    301       END DO 
    302       DO jk = 2, jpkm1 
    303          DO jj = 2, jpjm1 
    304             DO ji = fs_2, fs_jpim1 
    305                ua(ji,jj,jk) = ua(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 
    306             END DO 
    307          END DO 
    308       END DO 
    309       ! 
    310       DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  ==! 
    311          DO ji = fs_2, fs_jpim1   ! vector opt. 
    312             ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
    313          END DO 
    314       END DO 
    315       DO jk = jpk-2, 1, -1 
    316          DO jj = 2, jpjm1 
    317             DO ji = fs_2, fs_jpim1 
    318                ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
    319             END DO 
    320          END DO 
    321       END DO 
     275      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     276         zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
     277      END_3D 
     278      ! 
     279      DO_2D( 0, 0, 0, 0 ) 
     280         ze3ua =  ( 1._wp - r_vvl ) * e3u(ji,jj,1,Kmm)    & 
     281            &             + r_vvl   * e3u(ji,jj,1,Kaa)  
     282         puu(ji,jj,1,Kaa) = puu(ji,jj,1,Kaa) + rDt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
     283            &                                      / ( ze3ua * rho0 ) * umask(ji,jj,1)  
     284      END_2D 
     285      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     286         puu(ji,jj,jk,Kaa) = puu(ji,jj,jk,Kaa) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * puu(ji,jj,jk-1,Kaa) 
     287      END_3D 
     288      ! 
     289      DO_2D( 0, 0, 0, 0 ) 
     290         puu(ji,jj,jpkm1,Kaa) = puu(ji,jj,jpkm1,Kaa) / zwd(ji,jj,jpkm1) 
     291      END_2D 
     292      DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 ) 
     293         puu(ji,jj,jk,Kaa) = ( puu(ji,jj,jk,Kaa) - zws(ji,jj,jk) * puu(ji,jj,jk+1,Kaa) ) / zwd(ji,jj,jk) 
     294      END_3D 
    322295      ! 
    323296      !              !==  Vertical diffusion on v  ==! 
    324297      ! 
    325298      !                       !* Matrix construction 
    326       zdt = r2dt * 0.5 
     299      zdt = rDt * 0.5 
    327300      IF( ln_zad_Aimp ) THEN   !! 
    328301         SELECT CASE( nldf_dyn ) 
    329302         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzv) 
    330             DO jk = 1, jpkm1 
    331                DO jj = 2, jpjm1  
    332                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    333                      ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at V-point 
    334                      zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   & 
    335                         &         / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  ) 
    336                      zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   & 
    337                         &         / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 
    338                      zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) / ze3va 
    339                      zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 
    340                      zwi(ji,jj,jk) = zzwi + zdt * MIN( zWvi, 0._wp ) 
    341                      zws(ji,jj,jk) = zzws - zdt * MAX( zWvs, 0._wp ) 
    342                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 
    343                   END DO 
    344                END DO 
    345             END DO 
     303            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     304               ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm)    & 
     305                  &             + r_vvl   * e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point 
     306               zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   & 
     307                  &         / ( ze3va * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  ) 
     308               zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   & 
     309                  &         / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 
     310               zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) / ze3va 
     311               zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 
     312               zwi(ji,jj,jk) = zzwi + zdt * MIN( zWvi, 0._wp ) 
     313               zws(ji,jj,jk) = zzws - zdt * MAX( zWvs, 0._wp ) 
     314               zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 
     315            END_3D 
    346316         CASE DEFAULT               ! iso-level lateral mixing 
    347             DO jk = 1, jpkm1 
    348                DO jj = 2, jpjm1  
    349                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    350                      ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at V-point 
    351                      zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) ) / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  ) 
    352                      zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 
    353                      zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) / ze3va 
    354                      zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 
    355                      zwi(ji,jj,jk) = zzwi  + zdt * MIN( zWvi, 0._wp ) 
    356                      zws(ji,jj,jk) = zzws  - zdt * MAX( zWvs, 0._wp ) 
    357                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 
    358                   END DO 
    359                END DO 
    360             END DO 
     317            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     318               ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm)    & 
     319                  &             + r_vvl   * e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point 
     320               zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) )    & 
     321                  &         / ( ze3va * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  ) 
     322               zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) )    & 
     323                  &         / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 
     324               zWvi = ( wi(ji,jj,jk  ) + wi(ji,jj+1,jk  ) ) / ze3va 
     325               zWvs = ( wi(ji,jj,jk+1) + wi(ji,jj+1,jk+1) ) / ze3va 
     326               zwi(ji,jj,jk) = zzwi  + zdt * MIN( zWvi, 0._wp ) 
     327               zws(ji,jj,jk) = zzws  - zdt * MAX( zWvs, 0._wp ) 
     328               zwd(ji,jj,jk) = 1._wp - zzwi - zzws - zdt * ( - MAX( zWvi, 0._wp ) + MIN( zWvs, 0._wp ) ) 
     329            END_3D 
    361330         END SELECT 
    362          DO jj = 2, jpjm1     !* Surface boundary conditions 
    363             DO ji = fs_2, fs_jpim1   ! vector opt. 
    364                zwi(ji,jj,1) = 0._wp 
    365                ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1) 
    366                zzws = - zdt * ( avm(ji,jj+1,2) + avm(ji,jj,2) ) / ( ze3va * e3vw_n(ji,jj,2) ) * wvmask(ji,jj,2) 
    367                zWvs = ( wi(ji,jj  ,2) +  wi(ji,jj+1,2) ) / ze3va 
    368                zws(ji,jj,1 ) = zzws - zdt * MAX( zWvs, 0._wp ) 
    369                zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWvs, 0._wp ) ) 
    370             END DO 
    371          END DO 
     331         DO_2D( 0, 0, 0, 0 ) 
     332            zwi(ji,jj,1) = 0._wp 
     333            ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,1,Kmm)    & 
     334               &             + r_vvl   * e3v(ji,jj,1,Kaa) 
     335            zzws = - zdt * ( avm(ji,jj+1,2) + avm(ji,jj,2) )    & 
     336               &         / ( ze3va * e3vw(ji,jj,2,Kmm) ) * wvmask(ji,jj,2) 
     337            zWvs = ( wi(ji,jj  ,2) +  wi(ji,jj+1,2) ) / ze3va 
     338            zws(ji,jj,1 ) = zzws - zdt * MAX( zWvs, 0._wp ) 
     339            zwd(ji,jj,1 ) = 1._wp - zzws - zdt * ( MIN( zWvs, 0._wp ) ) 
     340         END_2D 
    372341      ELSE 
    373342         SELECT CASE( nldf_dyn ) 
    374343         CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu) 
    375             DO jk = 1, jpkm1 
    376                DO jj = 2, jpjm1    
    377                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    378                      ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at V-point 
    379                      zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   & 
    380                         &         / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  ) 
    381                      zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   & 
    382                         &         / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 
    383                      zwi(ji,jj,jk) = zzwi 
    384                      zws(ji,jj,jk) = zzws 
    385                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
    386                   END DO 
    387                END DO 
    388             END DO 
     344            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     345               ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm)    & 
     346                  &             + r_vvl   * e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point 
     347               zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   & 
     348                  &         / ( ze3va * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  ) 
     349               zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   & 
     350                  &         / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 
     351               zwi(ji,jj,jk) = zzwi 
     352               zws(ji,jj,jk) = zzws 
     353               zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     354            END_3D 
    389355         CASE DEFAULT               ! iso-level lateral mixing 
    390             DO jk = 1, jpkm1 
    391                DO jj = 2, jpjm1    
    392                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    393                      ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at V-point 
    394                      zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) ) / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  ) 
    395                      zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1) 
    396                      zwi(ji,jj,jk) = zzwi 
    397                      zws(ji,jj,jk) = zzws 
    398                      zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
    399                   END DO 
    400                END DO 
    401             END DO 
     356            DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     357               ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,jk,Kmm)    & 
     358                  &             + r_vvl   * e3v(ji,jj,jk,Kaa)   ! after scale factor at V-point 
     359               zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) )    & 
     360                  &         / ( ze3va * e3vw(ji,jj,jk  ,Kmm) ) * wvmask(ji,jj,jk  ) 
     361               zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) )    & 
     362                  &         / ( ze3va * e3vw(ji,jj,jk+1,Kmm) ) * wvmask(ji,jj,jk+1) 
     363               zwi(ji,jj,jk) = zzwi 
     364               zws(ji,jj,jk) = zzws 
     365               zwd(ji,jj,jk) = 1._wp - zzwi - zzws 
     366            END_3D 
    402367         END SELECT 
    403          DO jj = 2, jpjm1        !* Surface boundary conditions 
    404             DO ji = fs_2, fs_jpim1   ! vector opt. 
    405                zwi(ji,jj,1) = 0._wp 
    406                zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
    407             END DO 
    408          END DO 
     368         DO_2D( 0, 0, 0, 0 ) 
     369            zwi(ji,jj,1) = 0._wp 
     370            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
     371         END_2D 
    409372      ENDIF 
    410373      ! 
     
    416379      ! 
    417380      IF( ln_drgimp ) THEN 
    418          DO jj = 2, jpjm1 
    419             DO ji = 2, jpim1 
    420                ikv = mbkv(ji,jj)       ! (deepest ocean u- and v-points) 
    421                ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)   ! after scale factor at T-point 
    422                zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va            
    423             END DO 
    424          END DO 
     381         DO_2D( 0, 0, 0, 0 ) 
     382            ikv = mbkv(ji,jj)       ! (deepest ocean u- and v-points) 
     383            ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm)    & 
     384               &             + r_vvl   * e3v(ji,jj,ikv,Kaa)   ! after scale factor at T-point 
     385            zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - rDt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va            
     386         END_2D 
    425387         IF ( ln_isfcav ) THEN 
    426             DO jj = 2, jpjm1 
    427                DO ji = 2, jpim1 
    428                   ikv = mikv(ji,jj)       ! (first wet ocean u- and v-points) 
    429                   ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)   ! after scale factor at T-point 
    430                   zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3va 
    431                END DO 
    432             END DO 
     388            DO_2D( 0, 0, 0, 0 ) 
     389               ikv = mikv(ji,jj)       ! (first wet ocean u- and v-points) 
     390               ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,ikv,Kmm)    & 
     391                  &             + r_vvl   * e3v(ji,jj,ikv,Kaa)   ! after scale factor at T-point 
     392               zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - rDt * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) / ze3va 
     393            END_2D 
    433394         ENDIF 
    434395      ENDIF 
     
    449410      !----------------------------------------------------------------------- 
    450411      ! 
    451       DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    452          DO jj = 2, jpjm1    
    453             DO ji = fs_2, fs_jpim1   ! vector opt. 
    454                zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
    455             END DO 
    456          END DO 
    457       END DO 
    458       ! 
    459       DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==! 
    460          DO ji = fs_2, fs_jpim1   ! vector opt.           
    461             ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1)  
    462             va(ji,jj,1) = va(ji,jj,1) + r2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    463                &                                      / ( ze3va * rau0 ) * vmask(ji,jj,1)  
    464          END DO 
    465       END DO 
    466       DO jk = 2, jpkm1 
    467          DO jj = 2, jpjm1 
    468             DO ji = fs_2, fs_jpim1   ! vector opt. 
    469                va(ji,jj,jk) = va(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 
    470             END DO 
    471          END DO 
    472       END DO 
    473       ! 
    474       DO jj = 2, jpjm1        !==  third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  ==! 
    475          DO ji = fs_2, fs_jpim1   ! vector opt. 
    476             va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
    477          END DO 
    478       END DO 
    479       DO jk = jpk-2, 1, -1 
    480          DO jj = 2, jpjm1 
    481             DO ji = fs_2, fs_jpim1 
    482                va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
    483             END DO 
    484          END DO 
    485       END DO 
     412      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     413         zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
     414      END_3D 
     415      ! 
     416      DO_2D( 0, 0, 0, 0 ) 
     417         ze3va =  ( 1._wp - r_vvl ) * e3v(ji,jj,1,Kmm)    & 
     418            &             + r_vvl   * e3v(ji,jj,1,Kaa)  
     419         pvv(ji,jj,1,Kaa) = pvv(ji,jj,1,Kaa) + rDt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
     420            &                                      / ( ze3va * rho0 ) * vmask(ji,jj,1)  
     421      END_2D 
     422      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     423         pvv(ji,jj,jk,Kaa) = pvv(ji,jj,jk,Kaa) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * pvv(ji,jj,jk-1,Kaa) 
     424      END_3D 
     425      ! 
     426      DO_2D( 0, 0, 0, 0 ) 
     427         pvv(ji,jj,jpkm1,Kaa) = pvv(ji,jj,jpkm1,Kaa) / zwd(ji,jj,jpkm1) 
     428      END_2D 
     429      DO_3DS( 0, 0, 0, 0, jpk-2, 1, -1 ) 
     430         pvv(ji,jj,jk,Kaa) = ( pvv(ji,jj,jk,Kaa) - zws(ji,jj,jk) * pvv(ji,jj,jk+1,Kaa) ) / zwd(ji,jj,jk) 
     431      END_3D 
    486432      ! 
    487433      IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics 
    488          ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / r2dt - ztrdu(:,:,:) 
    489          ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / r2dt - ztrdv(:,:,:) 
    490          CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt ) 
     434         ztrdu(:,:,:) = ( puu(:,:,:,Kaa) - puu(:,:,:,Kbb) ) / rDt - ztrdu(:,:,:) 
     435         ztrdv(:,:,:) = ( pvv(:,:,:,Kaa) - pvv(:,:,:,Kbb) ) / rDt - ztrdv(:,:,:) 
     436         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt, Kmm ) 
    491437         DEALLOCATE( ztrdu, ztrdv )  
    492438      ENDIF 
    493439      !                                          ! print mean trends (used for debugging) 
    494       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf  - Ua: ', mask1=umask,               & 
    495          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     440      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Kaa), clinfo1=' zdf  - Ua: ', mask1=umask,               & 
     441         &                                  tab3d_2=pvv(:,:,:,Kaa), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    496442         ! 
    497443      IF( ln_timing )   CALL timing_stop('dyn_zdf') 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/sshwzv.F90

    r11293 r13463  
    99   !!             -   !  2010-09  (D.Storkey and E.O'Dea) bug fixes for BDY module 
    1010   !!            3.3  !  2011-10  (M. Leclair) split former ssh_wzv routine and remove all vvl related work 
     11   !!            4.0  !  2018-12  (A. Coward) add mixed implicit/explicit advection 
     12   !!            4.1  !  2019-08  (A. Coward, D. Storkey) Rename ssh_nxt -> ssh_atf. Now only does time filtering. 
    1113   !!---------------------------------------------------------------------- 
    1214 
    1315   !!---------------------------------------------------------------------- 
    1416   !!   ssh_nxt       : after ssh 
    15    !!   ssh_swp       : filter ans swap the ssh arrays 
     17   !!   ssh_atf       : time filter the ssh arrays 
    1618   !!   wzv           : compute now vertical velocity 
    1719   !!---------------------------------------------------------------------- 
    1820   USE oce            ! ocean dynamics and tracers variables 
     21   USE isf_oce        ! ice shelf 
    1922   USE dom_oce        ! ocean space and time domain variables  
    2023   USE sbc_oce        ! surface boundary condition: ocean 
     
    2528   USE bdydyn2d       ! bdy_ssh routine 
    2629#if defined key_agrif 
     30   USE agrif_oce 
    2731   USE agrif_oce_interp 
    2832#endif 
     
    4347   PUBLIC   wzv        ! called by step.F90 
    4448   PUBLIC   wAimp      ! called by step.F90 
    45    PUBLIC   ssh_swp    ! called by step.F90 
     49   PUBLIC   ssh_atf    ! called by step.F90 
    4650 
    4751   !! * Substitutions 
    48 #  include "vectopt_loop_substitute.h90" 
     52#  include "do_loop_substitute.h90" 
     53#  include "domzgr_substitute.h90" 
     54 
    4955   !!---------------------------------------------------------------------- 
    5056   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    5460CONTAINS 
    5561 
    56    SUBROUTINE ssh_nxt( kt ) 
     62   SUBROUTINE ssh_nxt( kt, Kbb, Kmm, pssh, Kaa ) 
    5763      !!---------------------------------------------------------------------- 
    5864      !!                ***  ROUTINE ssh_nxt  *** 
    5965      !!                    
    60       !! ** Purpose :   compute the after ssh (ssha) 
     66      !! ** Purpose :   compute the after ssh (ssh(Kaa)) 
    6167      !! 
    6268      !! ** Method  : - Using the incompressibility hypothesis, the ssh increment 
     
    6470      !!      by the time step. 
    6571      !! 
    66       !! ** action  :   ssha, after sea surface height 
     72      !! ** action  :   ssh(:,:,Kaa), after sea surface height 
    6773      !! 
    6874      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    6975      !!---------------------------------------------------------------------- 
    70       INTEGER, INTENT(in) ::   kt   ! time step 
     76      INTEGER                         , INTENT(in   ) ::   kt             ! time step 
     77      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! time level index 
     78      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height 
    7179      !  
    72       INTEGER  ::   jk            ! dummy loop indice 
    73       REAL(wp) ::   z2dt, zcoef   ! local scalars 
     80      INTEGER  ::   jk      ! dummy loop index 
     81      REAL(wp) ::   zcoef   ! local scalar 
    7482      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv   ! 2D workspace 
    7583      !!---------------------------------------------------------------------- 
     
    8391      ENDIF 
    8492      ! 
    85       z2dt = 2._wp * rdt                          ! set time step size (Euler/Leapfrog) 
    86       IF( neuler == 0 .AND. kt == nit000 )   z2dt = rdt 
    87       zcoef = 0.5_wp * r1_rau0 
     93      zcoef = 0.5_wp * r1_rho0 
    8894 
    8995      !                                           !------------------------------! 
     
    9197      !                                           !------------------------------! 
    9298      IF(ln_wd_il) THEN 
    93          CALL wad_lmt(sshb, zcoef * (emp_b(:,:) + emp(:,:)), z2dt) 
    94       ENDIF 
    95  
    96       CALL div_hor( kt )                               ! Horizontal divergence 
     99         CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), rDt, Kmm, uu, vv ) 
     100      ENDIF 
     101 
     102      CALL div_hor( kt, Kbb, Kmm )                     ! Horizontal divergence 
    97103      ! 
    98104      zhdiv(:,:) = 0._wp 
    99105      DO jk = 1, jpkm1                                 ! Horizontal divergence of barotropic transports 
    100         zhdiv(:,:) = zhdiv(:,:) + e3t_n(:,:,jk) * hdivn(:,:,jk) 
     106        zhdiv(:,:) = zhdiv(:,:) + e3t(:,:,jk,Kmm) * hdiv(:,:,jk) 
    101107      END DO 
    102108      !                                                ! Sea surface elevation time stepping 
     
    104110      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    105111      !  
    106       ssha(:,:) = (  sshb(:,:) - z2dt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
     112      pssh(:,:,Kaa) = (  pssh(:,:,Kbb) - rDt * ( zcoef * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * ssmask(:,:) 
    107113      ! 
    108114#if defined key_agrif 
     115      Kbb_a = Kbb   ;   Kmm_a = Kmm   ;   Krhs_a = Kaa 
    109116      CALL agrif_ssh( kt ) 
    110117#endif 
     
    112119      IF ( .NOT.ln_dynspg_ts ) THEN 
    113120         IF( ln_bdy ) THEN 
    114             CALL lbc_lnk( 'sshwzv', ssha, 'T', 1. )    ! Not sure that's necessary 
    115             CALL bdy_ssh( ssha )             ! Duplicate sea level across open boundaries 
     121            CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )    ! Not sure that's necessary 
     122            CALL bdy_ssh( pssh(:,:,Kaa) )             ! Duplicate sea level across open boundaries 
    116123         ENDIF 
    117124      ENDIF 
     
    120127      !                                           !------------------------------! 
    121128      ! 
    122       IF(ln_ctl)   CALL prt_ctl( tab2d_1=ssha, clinfo1=' ssha  - : ', mask1=tmask ) 
     129      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kaa), clinfo1=' pssh(:,:,Kaa)  - : ', mask1=tmask ) 
    123130      ! 
    124131      IF( ln_timing )   CALL timing_stop('ssh_nxt') 
     
    127134 
    128135    
    129    SUBROUTINE wzv( kt ) 
     136   SUBROUTINE wzv( kt, Kbb, Kmm, Kaa, pww ) 
    130137      !!---------------------------------------------------------------------- 
    131138      !!                ***  ROUTINE wzv  *** 
     
    138145      !!        The boundary conditions are w=0 at the bottom (no flux) and. 
    139146      !! 
    140       !! ** action  :   wn      : now vertical velocity 
     147      !! ** action  :   pww      : now vertical velocity 
    141148      !! 
    142149      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    143150      !!---------------------------------------------------------------------- 
    144       INTEGER, INTENT(in) ::   kt   ! time step 
     151      INTEGER                         , INTENT(in)    ::   kt             ! time step 
     152      INTEGER                         , INTENT(in)    ::   Kbb, Kmm, Kaa  ! time level indices 
     153      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pww            ! vertical velocity at Kmm 
    145154      ! 
    146155      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    147       REAL(wp) ::   z1_2dt       ! local scalars 
    148156      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zhdiv 
    149157      !!---------------------------------------------------------------------- 
     
    156164         IF(lwp) WRITE(numout,*) '~~~~~ ' 
    157165         ! 
    158          wn(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
     166         pww(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all) 
    159167      ENDIF 
    160168      !                                           !------------------------------! 
    161169      !                                           !     Now Vertical Velocity    ! 
    162170      !                                           !------------------------------! 
    163       z1_2dt = 1. / ( 2. * rdt )                         ! set time step size (Euler/Leapfrog) 
    164       IF( neuler == 0 .AND. kt == nit000 )   z1_2dt = 1. / rdt 
    165       ! 
    166       IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN      ! z_tilde and layer cases 
     171      ! 
     172      !                                               !===============================! 
     173      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN      !==  z_tilde and layer cases  ==! 
     174         !                                            !===============================! 
    167175         ALLOCATE( zhdiv(jpi,jpj,jpk) )  
    168176         ! 
     
    170178            ! horizontal divergence of thickness diffusion transport ( velocity multiplied by e3t) 
    171179            ! - ML - note: computation already done in dom_vvl_sf_nxt. Could be optimized (not critical and clearer this way) 
    172             DO jj = 2, jpjm1 
    173                DO ji = fs_2, fs_jpim1   ! vector opt. 
    174                   zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
    175                END DO 
    176             END DO 
    177          END DO 
    178          CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.)  ! - ML - Perhaps not necessary: not used for horizontal "connexions" 
     180            DO_2D( 0, 0, 0, 0 ) 
     181               zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) ) 
     182            END_2D 
     183         END DO 
     184         CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp)  ! - ML - Perhaps not necessary: not used for horizontal "connexions" 
    179185         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells? 
    180          !                             ! Same question holds for hdivn. Perhaps just for security 
     186         !                             ! Same question holds for hdiv. Perhaps just for security 
    181187         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
    182188            ! computation of w 
    183             wn(:,:,jk) = wn(:,:,jk+1) - (  e3t_n(:,:,jk) * hdivn(:,:,jk) + zhdiv(:,:,jk)    & 
    184                &                         + z1_2dt * ( e3t_a(:,:,jk) - e3t_b(:,:,jk) )     ) * tmask(:,:,jk) 
    185          END DO 
    186          !          IF( ln_vvl_layer ) wn(:,:,:) = 0.e0 
     189            pww(:,:,jk) = pww(:,:,jk+1) - (   e3t(:,:,jk,Kmm) * hdiv(:,:,jk)   & 
     190               &                            +                  zhdiv(:,:,jk)   & 
     191               &                            + r1_Dt * (  e3t(:,:,jk,Kaa)       & 
     192               &                                       - e3t(:,:,jk,Kbb) )   ) * tmask(:,:,jk) 
     193         END DO 
     194         !          IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 
    187195         DEALLOCATE( zhdiv )  
    188       ELSE   ! z_star and linear free surface cases 
     196         !                                            !=================================! 
     197      ELSEIF( ln_linssh )   THEN                      !==  linear free surface cases  ==! 
     198         !                                            !=================================! 
     199         DO jk = jpkm1, 1, -1                               ! integrate from the bottom the hor. divergence 
     200            pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk)  ) * tmask(:,:,jk) 
     201         END DO 
     202         !                                            !==========================================! 
     203      ELSE                                            !==  Quasi-Eulerian vertical coordinate  ==!   ('key_qco') 
     204         !                                            !==========================================! 
    189205         DO jk = jpkm1, 1, -1                       ! integrate from the bottom the hor. divergence 
    190             ! computation of w 
    191             wn(:,:,jk) = wn(:,:,jk+1) - (  e3t_n(:,:,jk) * hdivn(:,:,jk)                 & 
    192                &                         + z1_2dt * ( e3t_a(:,:,jk) - e3t_b(:,:,jk) )  ) * tmask(:,:,jk) 
     206            pww(:,:,jk) = pww(:,:,jk+1) - (  e3t(:,:,jk,Kmm) * hdiv(:,:,jk)                 & 
     207               &                            + r1_Dt * (  e3t(:,:,jk,Kaa)        & 
     208               &                                       - e3t(:,:,jk,Kbb)  )   ) * tmask(:,:,jk) 
    193209         END DO 
    194210      ENDIF 
     
    196212      IF( ln_bdy ) THEN 
    197213         DO jk = 1, jpkm1 
    198             wn(:,:,jk) = wn(:,:,jk) * bdytmask(:,:) 
    199          END DO 
    200       ENDIF 
    201       ! 
    202 #if defined key_agrif  
    203       IF( .NOT. AGRIF_Root() ) THEN  
    204          IF ((nbondi ==  1).OR.(nbondi == 2)) wn(nlci-1 , :     ,:) = 0.e0      ! east  
    205          IF ((nbondi == -1).OR.(nbondi == 2)) wn(2      , :     ,:) = 0.e0      ! west  
    206          IF ((nbondj ==  1).OR.(nbondj == 2)) wn(:      ,nlcj-1 ,:) = 0.e0      ! north  
    207          IF ((nbondj == -1).OR.(nbondj == 2)) wn(:      ,2      ,:) = 0.e0      ! south  
     214            pww(:,:,jk) = pww(:,:,jk) * bdytmask(:,:) 
     215         END DO 
     216      ENDIF 
     217      ! 
     218#if defined key_agrif 
     219      IF( .NOT. AGRIF_Root() ) THEN 
     220         ! 
     221         ! Mask vertical velocity at first/last columns/row  
     222         ! inside computational domain (cosmetic)  
     223         DO jk = 1, jpkm1 
     224            IF( lk_west ) THEN                             ! --- West --- ! 
     225               DO ji = mi0(2+nn_hls), mi1(2+nn_hls) 
     226                  DO jj = 1, jpj 
     227                     pww(ji,jj,jk) = 0._wp  
     228                  END DO 
     229               END DO 
     230            ENDIF 
     231            IF( lk_east ) THEN                             ! --- East --- ! 
     232               DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls) 
     233                  DO jj = 1, jpj 
     234                     pww(ji,jj,jk) = 0._wp 
     235                  END DO 
     236               END DO 
     237            ENDIF 
     238            IF( lk_south ) THEN                            ! --- South --- ! 
     239               DO jj = mj0(2+nn_hls), mj1(2+nn_hls) 
     240                  DO ji = 1, jpi 
     241                     pww(ji,jj,jk) = 0._wp 
     242                  END DO 
     243               END DO 
     244            ENDIF 
     245            IF( lk_north ) THEN                            ! --- North --- ! 
     246               DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls) 
     247                  DO ji = 1, jpi 
     248                     pww(ji,jj,jk) = 0._wp 
     249                  END DO 
     250               END DO 
     251            ENDIF 
     252            ! 
     253         END DO 
     254         ! 
    208255      ENDIF  
    209 #endif  
     256#endif 
    210257      ! 
    211258      IF( ln_timing )   CALL timing_stop('wzv') 
     
    214261 
    215262 
    216    SUBROUTINE ssh_swp( kt ) 
    217       !!---------------------------------------------------------------------- 
    218       !!                    ***  ROUTINE ssh_nxt  *** 
    219       !! 
    220       !! ** Purpose :   achieve the sea surface  height time stepping by  
    221       !!              applying Asselin time filter and swapping the arrays 
    222       !!              ssha  already computed in ssh_nxt   
     263   SUBROUTINE ssh_atf( kt, Kbb, Kmm, Kaa, pssh, pssh_f ) 
     264      !!---------------------------------------------------------------------- 
     265      !!                    ***  ROUTINE ssh_atf  *** 
     266      !! 
     267      !! ** Purpose :   Apply Asselin time filter to now SSH. 
    223268      !! 
    224269      !! ** Method  : - apply Asselin time fiter to now ssh (excluding the forcing 
    225270      !!              from the filter, see Leclair and Madec 2010) and swap : 
    226       !!                sshn = ssha + atfp * ( sshb -2 sshn + ssha ) 
    227       !!                            - atfp * rdt * ( emp_b - emp ) / rau0 
    228       !!                sshn = ssha 
    229       !! 
    230       !! ** action  : - sshb, sshn   : before & now sea surface height 
    231       !!                               ready for the next time step 
     271      !!                pssh(:,:,Kmm) = pssh(:,:,Kaa) + rn_atfp * ( pssh(:,:,Kbb) -2 pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 
     272      !!                            - rn_atfp * rn_Dt * ( emp_b - emp ) / rho0 
     273      !! 
     274      !! ** action  : - pssh(:,:,Kmm) time filtered 
    232275      !! 
    233276      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
    234277      !!---------------------------------------------------------------------- 
    235       INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
     278      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step index 
     279      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! ocean time level indices 
     280      REAL(wp), DIMENSION(jpi,jpj,jpt)          , TARGET, INTENT(inout) ::   pssh           ! SSH field 
     281      REAL(wp), DIMENSION(jpi,jpj    ), OPTIONAL, TARGET, INTENT(  out) ::   pssh_f         ! filtered SSH field 
    236282      ! 
    237283      REAL(wp) ::   zcoef   ! local scalar 
    238       !!---------------------------------------------------------------------- 
    239       ! 
    240       IF( ln_timing )   CALL timing_start('ssh_swp') 
     284      REAL(wp), POINTER, DIMENSION(:,:) ::   zssh   ! pointer for filtered SSH  
     285      !!---------------------------------------------------------------------- 
     286      ! 
     287      IF( ln_timing )   CALL timing_start('ssh_atf') 
    241288      ! 
    242289      IF( kt == nit000 ) THEN 
    243290         IF(lwp) WRITE(numout,*) 
    244          IF(lwp) WRITE(numout,*) 'ssh_swp : Asselin time filter and swap of sea surface height' 
     291         IF(lwp) WRITE(numout,*) 'ssh_atf : Asselin time filter of sea surface height' 
    245292         IF(lwp) WRITE(numout,*) '~~~~~~~ ' 
    246293      ENDIF 
    247294      !              !==  Euler time-stepping: no filter, just swap  ==! 
    248       IF ( neuler == 0 .AND. kt == nit000 ) THEN 
    249          sshn(:,:) = ssha(:,:)                              ! now    <-- after  (before already = now) 
    250          ! 
    251       ELSE           !==  Leap-Frog time-stepping: Asselin filter + swap  ==! 
    252          !                                                  ! before <-- now filtered 
    253          sshb(:,:) = sshn(:,:) + atfp * ( sshb(:,:) - 2 * sshn(:,:) + ssha(:,:) ) 
    254          IF( .NOT.ln_linssh ) THEN                          ! before <-- with forcing removed 
    255             zcoef = atfp * rdt * r1_rau0 
    256             sshb(:,:) = sshb(:,:) - zcoef * (     emp_b(:,:) - emp   (:,:)   & 
    257                &                             -    rnf_b(:,:) + rnf   (:,:)   & 
    258                &                             + fwfisf_b(:,:) - fwfisf(:,:)   ) * ssmask(:,:) 
     295      IF ( .NOT.( l_1st_euler ) ) THEN   ! Only do time filtering for leapfrog timesteps 
     296         IF( PRESENT( pssh_f ) ) THEN   ;   zssh => pssh_f 
     297         ELSE                           ;   zssh => pssh(:,:,Kmm) 
    259298         ENDIF 
    260          sshn(:,:) = ssha(:,:)                              ! now <-- after 
    261       ENDIF 
    262       ! 
    263       IF(ln_ctl)   CALL prt_ctl( tab2d_1=sshb, clinfo1=' sshb  - : ', mask1=tmask ) 
    264       ! 
    265       IF( ln_timing )   CALL timing_stop('ssh_swp') 
    266       ! 
    267    END SUBROUTINE ssh_swp 
    268  
    269    SUBROUTINE wAimp( kt ) 
     299         !                                                  ! filtered "now" field 
     300         pssh(:,:,Kmm) = pssh(:,:,Kmm) + rn_atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) ) 
     301         IF( .NOT.ln_linssh ) THEN                          ! "now" <-- with forcing removed 
     302            zcoef = rn_atfp * rn_Dt * r1_rho0 
     303            pssh(:,:,Kmm) = pssh(:,:,Kmm) - zcoef * (     emp_b(:,:) - emp   (:,:)   & 
     304               &                             - rnf_b(:,:)        + rnf   (:,:)       & 
     305               &                             + fwfisf_cav_b(:,:) - fwfisf_cav(:,:)   & 
     306               &                             + fwfisf_par_b(:,:) - fwfisf_par(:,:)   ) * ssmask(:,:) 
     307 
     308            ! ice sheet coupling 
     309            IF ( ln_isf .AND. ln_isfcpl .AND. kt == nit000+1) pssh(:,:,Kbb) = pssh(:,:,Kbb) - rn_atfp * rn_Dt * ( risfcpl_ssh(:,:) - 0.0 ) * ssmask(:,:) 
     310 
     311         ENDIF 
     312      ENDIF 
     313      ! 
     314      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kmm), clinfo1=' pssh(:,:,Kmm)  - : ', mask1=tmask ) 
     315      ! 
     316      IF( ln_timing )   CALL timing_stop('ssh_atf') 
     317      ! 
     318   END SUBROUTINE ssh_atf 
     319 
     320    
     321   SUBROUTINE wAimp( kt, Kmm ) 
    270322      !!---------------------------------------------------------------------- 
    271323      !!                ***  ROUTINE wAimp  *** 
     
    276328      !! ** Method  : -  
    277329      !! 
    278       !! ** action  :   wn      : now vertical velocity (to be handled explicitly) 
     330      !! ** action  :   ww      : now vertical velocity (to be handled explicitly) 
    279331      !!            :   wi      : now vertical velocity (for implicit treatment) 
    280332      !! 
    281       !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling. 
     333      !! Reference  : Shchepetkin, A. F. (2015): An adaptive, Courant-number-dependent 
     334      !!              implicit scheme for vertical advection in oceanic modeling.  
     335      !!              Ocean Modelling, 91, 38-69. 
    282336      !!---------------------------------------------------------------------- 
    283337      INTEGER, INTENT(in) ::   kt   ! time step 
     338      INTEGER, INTENT(in) ::   Kmm  ! time level index 
    284339      ! 
    285340      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    286       REAL(wp)             ::   zCu, zcff, z1_e3t                     ! local scalars 
     341      REAL(wp)             ::   zCu, zcff, z1_e3t, zdt                ! local scalars 
    287342      REAL(wp) , PARAMETER ::   Cu_min = 0.15_wp                      ! local parameters 
    288       REAL(wp) , PARAMETER ::   Cu_max = 0.27                         ! local parameters 
     343      REAL(wp) , PARAMETER ::   Cu_max = 0.30_wp                      ! local parameters 
    289344      REAL(wp) , PARAMETER ::   Cu_cut = 2._wp*Cu_max - Cu_min        ! local parameters 
    290345      REAL(wp) , PARAMETER ::   Fcu    = 4._wp*Cu_max*(Cu_max-Cu_min) ! local parameters 
     
    300355      ENDIF 
    301356      ! 
    302       ! 
    303       DO jk = 1, jpkm1            ! calculate Courant numbers 
    304          DO jj = 2, jpjm1 
    305             DO ji = 2, fs_jpim1   ! vector opt. 
    306                z1_e3t = 1._wp / e3t_n(ji,jj,jk) 
    307                Cu_adv(ji,jj,jk) = 2._wp * rdt * ( ( MAX( wn(ji,jj,jk) , 0._wp ) - MIN( wn(ji,jj,jk+1) , 0._wp ) )   &  ! 2*rdt and not r2dt (for restartability) 
    308                   &                             + ( MAX( e2u(ji  ,jj)*e3u_n(ji  ,jj,jk)*un(ji  ,jj,jk), 0._wp ) -   & 
    309                   &                                 MIN( e2u(ji-1,jj)*e3u_n(ji-1,jj,jk)*un(ji-1,jj,jk), 0._wp ) )   & 
    310                   &                               * r1_e1e2t(ji,jj)                                                 & 
    311                   &                             + ( MAX( e1v(ji,jj  )*e3v_n(ji,jj  ,jk)*vn(ji,jj  ,jk), 0._wp ) -   & 
    312                   &                                 MIN( e1v(ji,jj-1)*e3v_n(ji,jj-1,jk)*vn(ji,jj-1,jk), 0._wp ) )   & 
    313                   &                               * r1_e1e2t(ji,jj)                                                 & 
    314                   &                             ) * z1_e3t 
    315             END DO 
    316          END DO 
    317       END DO 
    318       CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1. ) 
     357      ! Calculate Courant numbers 
     358      zdt = 2._wp * rn_Dt                            ! 2*rn_Dt and not rDt (for restartability) 
     359      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN 
     360         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     361            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
     362            Cu_adv(ji,jj,jk) =   zdt *                                                         & 
     363               &  ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )            & 
     364               &  + ( MAX( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm)                                  & 
     365               &                        * uu (ji  ,jj,jk,Kmm) + un_td(ji  ,jj,jk), 0._wp ) -   & 
     366               &      MIN( e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm)                                  & 
     367               &                        * uu (ji-1,jj,jk,Kmm) + un_td(ji-1,jj,jk), 0._wp ) )   & 
     368               &                               * r1_e1e2t(ji,jj)                                                                     & 
     369               &  + ( MAX( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm)                                  & 
     370               &                        * vv (ji,jj  ,jk,Kmm) + vn_td(ji,jj  ,jk), 0._wp ) -   & 
     371               &      MIN( e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm)                                  & 
     372               &                        * vv (ji,jj-1,jk,Kmm) + vn_td(ji,jj-1,jk), 0._wp ) )   & 
     373               &                               * r1_e1e2t(ji,jj)                                                                     & 
     374               &                             ) * z1_e3t 
     375         END_3D 
     376      ELSE 
     377         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     378            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm) 
     379            Cu_adv(ji,jj,jk) =   zdt *                                                      & 
     380               &  ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )         & 
     381               &                             + ( MAX( e2u(ji  ,jj)*e3u(ji  ,jj,jk,Kmm)*uu(ji  ,jj,jk,Kmm), 0._wp ) -   & 
     382               &                                 MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm), 0._wp ) )   & 
     383               &                               * r1_e1e2t(ji,jj)                                                 & 
     384               &                             + ( MAX( e1v(ji,jj  )*e3v(ji,jj  ,jk,Kmm)*vv(ji,jj  ,jk,Kmm), 0._wp ) -   & 
     385               &                                 MIN( e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kmm)*vv(ji,jj-1,jk,Kmm), 0._wp ) )   & 
     386               &                               * r1_e1e2t(ji,jj)                                                 & 
     387               &                             ) * z1_e3t 
     388         END_3D 
     389      ENDIF 
     390      CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1.0_wp ) 
    319391      ! 
    320392      CALL iom_put("Courant",Cu_adv) 
    321393      ! 
    322394      IF( MAXVAL( Cu_adv(:,:,:) ) > Cu_min ) THEN       ! Quick check if any breaches anywhere 
    323          DO jk = jpkm1, 2, -1                           ! or scan Courant criterion and partition 
    324             DO jj = 1, jpj                              ! w where necessary 
    325                DO ji = 1, jpi 
    326                   ! 
    327                   zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) ) 
     395         DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 ) 
     396            ! 
     397            zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) ) 
    328398! alt: 
    329 !                  IF ( wn(ji,jj,jk) > 0._wp ) THEN  
     399!                  IF ( ww(ji,jj,jk) > 0._wp ) THEN  
    330400!                     zCu =  Cu_adv(ji,jj,jk)  
    331401!                  ELSE 
    332402!                     zCu =  Cu_adv(ji,jj,jk-1) 
    333403!                  ENDIF  
    334                   ! 
    335                   IF( zCu <= Cu_min ) THEN              !<-- Fully explicit 
    336                      zcff = 0._wp 
    337                   ELSEIF( zCu < Cu_cut ) THEN           !<-- Mixed explicit 
    338                      zcff = ( zCu - Cu_min )**2 
    339                      zcff = zcff / ( Fcu + zcff ) 
    340                   ELSE                                  !<-- Mostly implicit 
    341                      zcff = ( zCu - Cu_max )/ zCu 
    342                   ENDIF 
    343                   zcff = MIN(1._wp, zcff) 
    344                   ! 
    345                   wi(ji,jj,jk) =           zcff   * wn(ji,jj,jk) 
    346                   wn(ji,jj,jk) = ( 1._wp - zcff ) * wn(ji,jj,jk) 
    347                   ! 
    348                   Cu_adv(ji,jj,jk) = zcff               ! Reuse array to output coefficient 
    349                END DO 
    350             END DO 
    351          END DO 
     404            ! 
     405            IF( zCu <= Cu_min ) THEN              !<-- Fully explicit 
     406               zcff = 0._wp 
     407            ELSEIF( zCu < Cu_cut ) THEN           !<-- Mixed explicit 
     408               zcff = ( zCu - Cu_min )**2 
     409               zcff = zcff / ( Fcu + zcff ) 
     410            ELSE                                  !<-- Mostly implicit 
     411               zcff = ( zCu - Cu_max )/ zCu 
     412            ENDIF 
     413            zcff = MIN(1._wp, zcff) 
     414            ! 
     415            wi(ji,jj,jk) =           zcff   * ww(ji,jj,jk) 
     416            ww(ji,jj,jk) = ( 1._wp - zcff ) * ww(ji,jj,jk) 
     417            ! 
     418            Cu_adv(ji,jj,jk) = zcff               ! Reuse array to output coefficient below and in stp_ctl 
     419         END_3D 
    352420         Cu_adv(:,:,1) = 0._wp  
    353421      ELSE 
    354422         ! Fully explicit everywhere 
    355          Cu_adv(:,:,:) = 0._wp                          ! Reuse array to output coefficient 
     423         Cu_adv(:,:,:) = 0._wp                          ! Reuse array to output coefficient below and in stp_ctl 
    356424         wi    (:,:,:) = 0._wp 
    357425      ENDIF 
    358426      CALL iom_put("wimp",wi)  
    359427      CALL iom_put("wi_cff",Cu_adv) 
    360       CALL iom_put("wexp",wn) 
     428      CALL iom_put("wexp",ww) 
    361429      ! 
    362430      IF( ln_timing )   CALL timing_stop('wAimp') 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/DYN/wet_dry.F90

    r10499 r13463  
    3131   PRIVATE 
    3232 
     33   !! * Substitutions 
     34#  include "do_loop_substitute.h90" 
     35#  include "domzgr_substitute.h90" 
    3336   !!---------------------------------------------------------------------- 
    3437   !! critical depths,filters, limiters,and masks for  Wetting and Drying 
     
    6164 
    6265   !! * Substitutions 
    63 #  include "vectopt_loop_substitute.h90" 
    6466   !!---------------------------------------------------------------------- 
    6567CONTAINS 
     
    7981      !!---------------------------------------------------------------------- 
    8082      ! 
    81       REWIND( numnam_ref )              ! Namelist namwad in reference namelist : Parameters for Wetting/Drying 
    8283      READ  ( numnam_ref, namwad, IOSTAT = ios, ERR = 905) 
    83 905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namwad in reference namelist', .TRUE.)  
    84       REWIND( numnam_cfg )              ! Namelist namwad in configuration namelist : Parameters for Wetting/Drying 
     84905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namwad in reference namelist' )  
    8585      READ  ( numnam_cfg, namwad, IOSTAT = ios, ERR = 906) 
    86 906   IF( ios >  0 )   CALL ctl_nam ( ios , 'namwad in configuration namelist', .TRUE. ) 
     86906   IF( ios >  0 )   CALL ctl_nam ( ios , 'namwad in configuration namelist' ) 
    8787      IF(lwm) WRITE ( numond, namwad ) 
    8888      ! 
     
    122122 
    123123 
    124    SUBROUTINE wad_lmt( sshb1, sshemp, z2dt ) 
     124   SUBROUTINE wad_lmt( psshb1, psshemp, z2dt, Kmm, puu, pvv ) 
    125125      !!---------------------------------------------------------------------- 
    126126      !!                  ***  ROUTINE wad_lmt  *** 
     
    132132      !! ** Action  : - calculate flux limiter and W/D flag 
    133133      !!---------------------------------------------------------------------- 
    134       REAL(wp), DIMENSION(:,:), INTENT(inout) ::   sshb1        !!gm DOCTOR names: should start with p ! 
    135       REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   sshemp 
    136       REAL(wp)                , INTENT(in   ) ::   z2dt 
     134      REAL(wp), DIMENSION(:,:)            , INTENT(inout) ::   psshb1 
     135      REAL(wp), DIMENSION(:,:)            , INTENT(in   ) ::   psshemp 
     136      REAL(wp)                            , INTENT(in   ) ::   z2dt 
     137      INTEGER                             , INTENT(in   ) ::   Kmm       ! time level index 
     138      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv  ! velocity arrays 
    137139      ! 
    138140      INTEGER  ::   ji, jj, jk, jk1     ! dummy loop indices 
     
    150152      ! 
    151153      DO jk = 1, jpkm1 
    152          un(:,:,jk) = un(:,:,jk) * zwdlmtu(:,:)  
    153          vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:,:)  
     154         puu(:,:,jk,Kmm) = puu(:,:,jk,Kmm) * zwdlmtu(:,:)  
     155         pvv(:,:,jk,Kmm) = pvv(:,:,jk,Kmm) * zwdlmtv(:,:)  
    154156      END DO 
    155157      jflag  = 0 
     
    165167      ! 
    166168      DO jk = 1, jpkm1     ! Horizontal Flux in u and v direction 
    167          zflxu(:,:) = zflxu(:,:) + e3u_n(:,:,jk) * un(:,:,jk) * umask(:,:,jk) 
    168          zflxv(:,:) = zflxv(:,:) + e3v_n(:,:,jk) * vn(:,:,jk) * vmask(:,:,jk) 
     169         zflxu(:,:) = zflxu(:,:) + e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) * umask(:,:,jk) 
     170         zflxv(:,:) = zflxv(:,:) + e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) * vmask(:,:,jk) 
    169171      END DO 
    170172      zflxu(:,:) = zflxu(:,:) * e2u(:,:) 
     
    172174      ! 
    173175      wdmask(:,:) = 1._wp 
    174       DO jj = 2, jpj 
    175          DO ji = 2, jpi  
    176             ! 
    177             IF( tmask(ji,jj,1)        < 0.5_wp )   CYCLE    ! we don't care about land cells 
    178             IF( ht_0(ji,jj) - ssh_ref > zdepwd )   CYCLE    ! and cells which are unlikely to dry 
    179             ! 
    180             zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp )   & 
    181                &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp )  
    182             zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp )   & 
    183                &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp )  
    184             ! 
    185             zdep2 = ht_0(ji,jj) + sshb1(ji,jj) - rn_wdmin1 
    186             IF( zdep2 <= 0._wp ) THEN     ! add more safty, but not necessary 
    187                sshb1(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 
    188                IF(zflxu(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = 0._wp 
    189                IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 
    190                IF(zflxv(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = 0._wp 
    191                IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp  
    192                wdmask(ji,jj) = 0._wp 
    193             END IF 
    194          END DO 
    195       END DO 
     176      DO_2D( 0, 1, 0, 1 ) 
     177         ! 
     178         IF( tmask(ji,jj,1)        < 0.5_wp )   CYCLE    ! we don't care about land cells 
     179         IF( ht_0(ji,jj) - ssh_ref > zdepwd )   CYCLE    ! and cells which are unlikely to dry 
     180         ! 
     181         zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp )   & 
     182            &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp )  
     183         zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp )   & 
     184            &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp )  
     185         ! 
     186         zdep2 = ht_0(ji,jj) + psshb1(ji,jj) - rn_wdmin1 
     187         IF( zdep2 <= 0._wp ) THEN     ! add more safty, but not necessary 
     188            psshb1(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 
     189            IF(zflxu(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = 0._wp 
     190            IF(zflxu(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = 0._wp 
     191            IF(zflxv(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = 0._wp 
     192            IF(zflxv(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = 0._wp  
     193            wdmask(ji,jj) = 0._wp 
     194         END IF 
     195      END_2D 
    196196      ! 
    197197      !           ! HPG limiter from jholt 
    198       wdramp(:,:) = min((ht_0(:,:) + sshb1(:,:) - rn_wdmin1)/(rn_wdmin0 - rn_wdmin1),1.0_wp) 
     198      wdramp(:,:) = min((ht_0(:,:) + psshb1(:,:) - rn_wdmin1)/(rn_wdmin0 - rn_wdmin1),1.0_wp) 
    199199      !jth assume don't need a lbc_lnk here 
    200       DO jj = 1, jpjm1 
    201          DO ji = 1, jpim1 
    202             wdrampu(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji+1,jj) ) 
    203             wdrampv(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji,jj+1) ) 
    204          END DO 
    205       END DO 
     200      DO_2D( 1, 0, 1, 0 ) 
     201         wdrampu(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji+1,jj) ) 
     202         wdrampv(ji,jj) = MIN( wdramp(ji,jj) , wdramp(ji,jj+1) ) 
     203      END_2D 
    206204      !           ! end HPG limiter 
    207205      ! 
     
    213211         jflag = 0     ! flag indicating if any further iterations are needed 
    214212         ! 
    215          DO jj = 2, jpj 
    216             DO ji = 2, jpi  
    217                IF( tmask(ji, jj, 1) < 0.5_wp )   CYCLE  
    218                IF( ht_0(ji,jj)      > zdepwd )   CYCLE 
    219                ! 
    220                ztmp = e1e2t(ji,jj) 
    221                ! 
    222                zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj  ) , 0._wp)   & 
    223                   &   + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,  jj-1) , 0._wp)  
    224                zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj  ) , 0._wp)   & 
    225                   &   + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,  jj-1) , 0._wp)  
    226                ! 
    227                zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
    228                zdep2 = ht_0(ji,jj) + sshb1(ji,jj) - rn_wdmin1 - z2dt * sshemp(ji,jj) 
    229                ! 
    230                IF( zdep1 > zdep2 ) THEN 
    231                   wdmask(ji, jj) = 0._wp 
    232                   zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
    233                   !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
    234                   ! flag if the limiter has been used but stop flagging if the only 
    235                   ! changes have zeroed the coefficient since further iterations will 
    236                   ! not change anything 
    237                   IF( zcoef > 0._wp ) THEN   ;   jflag = 1  
    238                   ELSE                       ;   zcoef = 0._wp 
    239                   ENDIF 
    240                   IF( jk1 > nn_wdit )   zcoef = 0._wp 
    241                   IF( zflxu1(ji  ,jj  ) > 0._wp )   zwdlmtu(ji  ,jj  ) = zcoef 
    242                   IF( zflxu1(ji-1,jj  ) < 0._wp )   zwdlmtu(ji-1,jj  ) = zcoef 
    243                   IF( zflxv1(ji  ,jj  ) > 0._wp )   zwdlmtv(ji  ,jj  ) = zcoef 
    244                   IF( zflxv1(ji  ,jj-1) < 0._wp )   zwdlmtv(ji  ,jj-1) = zcoef 
     213         DO_2D( 0, 1, 0, 1 ) 
     214            IF( tmask(ji, jj, 1) < 0.5_wp )   CYCLE  
     215            IF( ht_0(ji,jj)      > zdepwd )   CYCLE 
     216            ! 
     217            ztmp = e1e2t(ji,jj) 
     218            ! 
     219            zzflxp = MAX( zflxu1(ji,jj) , 0._wp ) - MIN( zflxu1(ji-1,jj  ) , 0._wp)   & 
     220               &   + MAX( zflxv1(ji,jj) , 0._wp ) - MIN( zflxv1(ji,  jj-1) , 0._wp)  
     221            zzflxn = MIN( zflxu1(ji,jj) , 0._wp ) - MAX( zflxu1(ji-1,jj  ) , 0._wp)   & 
     222               &   + MIN( zflxv1(ji,jj) , 0._wp ) - MAX( zflxv1(ji,  jj-1) , 0._wp)  
     223            ! 
     224            zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
     225            zdep2 = ht_0(ji,jj) + psshb1(ji,jj) - rn_wdmin1 - z2dt * psshemp(ji,jj) 
     226            ! 
     227            IF( zdep1 > zdep2 ) THEN 
     228               wdmask(ji, jj) = 0._wp 
     229               zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
     230               !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
     231               ! flag if the limiter has been used but stop flagging if the only 
     232               ! changes have zeroed the coefficient since further iterations will 
     233               ! not change anything 
     234               IF( zcoef > 0._wp ) THEN   ;   jflag = 1  
     235               ELSE                       ;   zcoef = 0._wp 
    245236               ENDIF 
    246             END DO 
    247          END DO 
    248          CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1., zwdlmtv, 'V', 1. ) 
     237               IF( jk1 > nn_wdit )   zcoef = 0._wp 
     238               IF( zflxu1(ji  ,jj  ) > 0._wp )   zwdlmtu(ji  ,jj  ) = zcoef 
     239               IF( zflxu1(ji-1,jj  ) < 0._wp )   zwdlmtu(ji-1,jj  ) = zcoef 
     240               IF( zflxv1(ji  ,jj  ) > 0._wp )   zwdlmtv(ji  ,jj  ) = zcoef 
     241               IF( zflxv1(ji  ,jj-1) < 0._wp )   zwdlmtv(ji  ,jj-1) = zcoef 
     242            ENDIF 
     243         END_2D 
     244         CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1.0_wp, zwdlmtv, 'V', 1.0_wp ) 
    249245         ! 
    250246         CALL mpp_max('wet_dry', jflag)   !max over the global domain 
     
    255251      ! 
    256252      DO jk = 1, jpkm1 
    257          un(:,:,jk) = un(:,:,jk) * zwdlmtu(:,:)  
    258          vn(:,:,jk) = vn(:,:,jk) * zwdlmtv(:,:)  
     253         puu(:,:,jk,Kmm) = puu(:,:,jk,Kmm) * zwdlmtu(:,:)  
     254         pvv(:,:,jk,Kmm) = pvv(:,:,jk,Kmm) * zwdlmtv(:,:)  
    259255      END DO 
    260       un_b(:,:) = un_b(:,:) * zwdlmtu(:, :) 
    261       vn_b(:,:) = vn_b(:,:) * zwdlmtv(:, :) 
     256      uu_b(:,:,Kmm) = uu_b(:,:,Kmm) * zwdlmtu(:, :) 
     257      vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * zwdlmtv(:, :) 
    262258      ! 
    263259!!gm TO BE SUPPRESSED ?  these lbc_lnk are useless since zwdlmtu and zwdlmtv are defined everywhere ! 
    264       CALL lbc_lnk_multi( 'wet_dry', un  , 'U', -1., vn  , 'V', -1. ) 
    265       CALL lbc_lnk_multi( 'wet_dry', un_b, 'U', -1., vn_b, 'V', -1. ) 
     260      CALL lbc_lnk_multi( 'wet_dry', puu(:,:,:,Kmm)  , 'U', -1.0_wp, pvv(:,:,:,Kmm)  , 'V', -1.0_wp ) 
     261      CALL lbc_lnk_multi( 'wet_dry', uu_b(:,:,Kmm), 'U', -1.0_wp, vv_b(:,:,Kmm), 'V', -1.0_wp ) 
    266262!!gm 
    267263      ! 
    268264      IF(jflag == 1 .AND. lwp)   WRITE(numout,*) 'Need more iterations in wad_lmt!!!' 
    269265      ! 
    270       !IF( ln_rnf      )   CALL sbc_rnf_div( hdivn )          ! runoffs (update hdivn field) 
     266      !IF( ln_rnf      )   CALL sbc_rnf_div( hdiv )          ! runoffs (update hdiv field) 
    271267      ! 
    272268      IF( ln_timing )   CALL timing_stop('wad_lmt')      ! 
     
    275271 
    276272 
    277    SUBROUTINE wad_lmt_bt( zflxu, zflxv, sshn_e, zssh_frc, rdtbt ) 
     273   SUBROUTINE wad_lmt_bt( zflxu, zflxv, sshn_e, zssh_frc, rDt_e ) 
    278274      !!---------------------------------------------------------------------- 
    279275      !!                  ***  ROUTINE wad_lmt  *** 
     
    285281      !! ** Action  : - calculate flux limiter and W/D flag 
    286282      !!---------------------------------------------------------------------- 
    287       REAL(wp)                , INTENT(in   ) ::   rdtbt    ! ocean time-step index 
     283      REAL(wp)                , INTENT(in   ) ::   rDt_e    ! ocean time-step index 
    288284      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   zflxu,  zflxv, sshn_e, zssh_frc   
    289285      ! 
     
    304300      zdepwd = 50._wp   ! maximum depth that ocean cells can have W/D processes 
    305301      ! 
    306       z2dt = rdtbt    
     302      z2dt = rDt_e    
    307303      ! 
    308304      zflxp(:,:)   = 0._wp 
     
    311307      zwdlmtv(:,:) = 1._wp 
    312308      ! 
    313       DO jj = 2, jpj      ! Horizontal Flux in u and v direction 
    314          DO ji = 2, jpi  
    315             ! 
    316             IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE   ! we don't care about land cells 
    317             IF( ht_0(ji,jj) > zdepwd )      CYCLE   ! and cells which are unlikely to dry 
    318             ! 
    319             zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp )   & 
    320                &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp )  
    321             zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp )   & 
    322                &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp )  
    323             ! 
    324             zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 
    325             IF( zdep2 <= 0._wp ) THEN  !add more safety, but not necessary 
    326               sshn_e(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 
    327               IF( zflxu(ji  ,jj  ) > 0._wp)   zwdlmtu(ji  ,jj  ) = 0._wp 
    328               IF( zflxu(ji-1,jj  ) < 0._wp)   zwdlmtu(ji-1,jj  ) = 0._wp 
    329               IF( zflxv(ji  ,jj  ) > 0._wp)   zwdlmtv(ji  ,jj  ) = 0._wp 
    330               IF( zflxv(ji  ,jj-1) < 0._wp)   zwdlmtv(ji  ,jj-1) = 0._wp  
    331             ENDIF 
    332          END DO 
    333       END DO 
     309      DO_2D( 0, 1, 0, 1 ) 
     310         ! 
     311         IF( tmask(ji, jj, 1 ) < 0.5_wp) CYCLE   ! we don't care about land cells 
     312         IF( ht_0(ji,jj) > zdepwd )      CYCLE   ! and cells which are unlikely to dry 
     313         ! 
     314         zflxp(ji,jj) = MAX( zflxu(ji,jj) , 0._wp ) - MIN( zflxu(ji-1,jj  ) , 0._wp )   & 
     315            &         + MAX( zflxv(ji,jj) , 0._wp ) - MIN( zflxv(ji,  jj-1) , 0._wp )  
     316         zflxn(ji,jj) = MIN( zflxu(ji,jj) , 0._wp ) - MAX( zflxu(ji-1,jj  ) , 0._wp )   & 
     317            &         + MIN( zflxv(ji,jj) , 0._wp ) - MAX( zflxv(ji,  jj-1) , 0._wp )  
     318         ! 
     319         zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 
     320         IF( zdep2 <= 0._wp ) THEN  !add more safety, but not necessary 
     321           sshn_e(ji,jj) = rn_wdmin1 - ht_0(ji,jj) 
     322           IF( zflxu(ji  ,jj  ) > 0._wp)   zwdlmtu(ji  ,jj  ) = 0._wp 
     323           IF( zflxu(ji-1,jj  ) < 0._wp)   zwdlmtu(ji-1,jj  ) = 0._wp 
     324           IF( zflxv(ji  ,jj  ) > 0._wp)   zwdlmtv(ji  ,jj  ) = 0._wp 
     325           IF( zflxv(ji  ,jj-1) < 0._wp)   zwdlmtv(ji  ,jj-1) = 0._wp  
     326         ENDIF 
     327      END_2D 
    334328      ! 
    335329      DO jk1 = 1, nn_wdit + 1      !! start limiter iterations  
     
    339333         jflag = 0     ! flag indicating if any further iterations are needed 
    340334         ! 
    341          DO jj = 2, jpj 
    342             DO ji = 2, jpi  
    343                ! 
    344                IF( tmask(ji, jj, 1 ) < 0.5_wp )   CYCLE  
    345                IF( ht_0(ji,jj)       > zdepwd )   CYCLE 
    346                ! 
    347                ztmp = e1e2t(ji,jj) 
    348                ! 
    349                zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj),   0._wp)   & 
    350                   &   + max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji,  jj-1), 0._wp)  
    351                zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj),   0._wp)   & 
    352                   &   + min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji,  jj-1), 0._wp)  
    353            
    354                zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
    355                zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 
    356            
    357                IF(zdep1 > zdep2) THEN 
    358                  zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
    359                  !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
    360                  ! flag if the limiter has been used but stop flagging if the only 
    361                  ! changes have zeroed the coefficient since further iterations will 
    362                  ! not change anything 
    363                  IF( zcoef > 0._wp ) THEN 
    364                     jflag = 1  
    365                  ELSE 
    366                     zcoef = 0._wp 
    367                  ENDIF 
    368                  IF(jk1 > nn_wdit) zcoef = 0._wp 
    369                  IF(zflxu1(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = zcoef 
    370                  IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 
    371                  IF(zflxv1(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = zcoef 
    372                  IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 
    373                END IF 
    374             END DO ! ji loop 
    375          END DO  ! jj loop 
    376          ! 
    377          CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1., zwdlmtv, 'V', 1. ) 
     335         DO_2D( 0, 1, 0, 1 ) 
     336            ! 
     337            IF( tmask(ji, jj, 1 ) < 0.5_wp )   CYCLE  
     338            IF( ht_0(ji,jj)       > zdepwd )   CYCLE 
     339            ! 
     340            ztmp = e1e2t(ji,jj) 
     341            ! 
     342            zzflxp = max(zflxu1(ji,jj), 0._wp) - min(zflxu1(ji-1,jj),   0._wp)   & 
     343               &   + max(zflxv1(ji,jj), 0._wp) - min(zflxv1(ji,  jj-1), 0._wp)  
     344            zzflxn = min(zflxu1(ji,jj), 0._wp) - max(zflxu1(ji-1,jj),   0._wp)   & 
     345               &   + min(zflxv1(ji,jj), 0._wp) - max(zflxv1(ji,  jj-1), 0._wp)  
     346        
     347            zdep1 = (zzflxp + zzflxn) * z2dt / ztmp 
     348            zdep2 = ht_0(ji,jj) + sshn_e(ji,jj) - rn_wdmin1 - z2dt * zssh_frc(ji,jj) 
     349        
     350            IF(zdep1 > zdep2) THEN 
     351              zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zflxp(ji,jj) * z2dt ) 
     352              !zcoef = ( ( zdep2 - rn_wdmin2 ) * ztmp - zzflxn * z2dt ) / ( zzflxp * z2dt ) 
     353              ! flag if the limiter has been used but stop flagging if the only 
     354              ! changes have zeroed the coefficient since further iterations will 
     355              ! not change anything 
     356              IF( zcoef > 0._wp ) THEN 
     357                 jflag = 1  
     358              ELSE 
     359                 zcoef = 0._wp 
     360              ENDIF 
     361              IF(jk1 > nn_wdit) zcoef = 0._wp 
     362              IF(zflxu1(ji,  jj) > 0._wp) zwdlmtu(ji  ,jj) = zcoef 
     363              IF(zflxu1(ji-1,jj) < 0._wp) zwdlmtu(ji-1,jj) = zcoef 
     364              IF(zflxv1(ji,  jj) > 0._wp) zwdlmtv(ji  ,jj) = zcoef 
     365              IF(zflxv1(ji,jj-1) < 0._wp) zwdlmtv(ji,jj-1) = zcoef 
     366            END IF 
     367         END_2D 
     368         ! 
     369         CALL lbc_lnk_multi( 'wet_dry', zwdlmtu, 'U', 1.0_wp, zwdlmtv, 'V', 1.0_wp ) 
    378370         ! 
    379371         CALL mpp_max('wet_dry', jflag)   !max over the global domain 
     
    387379      ! 
    388380!!gm THIS lbc_lnk is useless since it is already done at the end of the jk1-loop 
    389       CALL lbc_lnk_multi( 'wet_dry', zflxu, 'U', -1., zflxv, 'V', -1. ) 
     381      CALL lbc_lnk_multi( 'wet_dry', zflxu, 'U', -1.0_wp, zflxv, 'V', -1.0_wp ) 
    390382!!gm end 
    391383      ! 
    392384      IF( jflag == 1 .AND. lwp )   WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!' 
    393385      ! 
    394       !IF( ln_rnf      )   CALL sbc_rnf_div( hdivn )          ! runoffs (update hdivn field) 
     386      !IF( ln_rnf      )   CALL sbc_rnf_div( hdiv )          ! runoffs (update hdiv field) 
    395387      ! 
    396388      IF( ln_timing )   CALL timing_stop('wad_lmt_bt')      ! 
Note: See TracChangeset for help on using the changeset viewer.