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 1502 for trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2009-07-20T17:20:23+02:00 (15 years ago)
Author:
rblod
Message:

Update dynnxt and dynspg_ts for variable volume, see ticket #474

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r1438 r1502  
    11MODULE dynspg_ts 
    22   !!====================================================================== 
    3    !! History :   1.0  !  04-12  (L. Bessieres, G. Madec)  Original code 
    4    !!              -   !  05-11  (V. Garnier, G. Madec)  optimization 
    5    !!              -   !  06-08  (S. Masson)  distributed restart using iom 
    6    !!             2.0  !  07-07  (D. Storkey) calls to BDY routines 
    7    !!              -   !  08-01  (R. Benshila)  change averaging method 
     3   !! History :   1.0  ! 2004-12  (L. Bessieres, G. Madec)  Original code 
     4   !!              -   ! 2005-11  (V. Garnier, G. Madec)  optimization 
     5   !!              -   ! 2006-08  (S. Masson)  distributed restart using iom 
     6   !!             2.0  ! 2007-07  (D. Storkey) calls to BDY routines 
     7   !!              -   ! 2008-01  (R. Benshila)  change averaging method 
     8   !!             3.2  ! 2009-07  (R. Benshila, G. Madec) Complete revisit associated to vvl reactivation 
    89  !!--------------------------------------------------------------------- 
    910#if defined key_dynspg_ts   ||   defined key_esopa 
    1011   !!---------------------------------------------------------------------- 
    1112   !!   'key_dynspg_ts'         free surface cst volume with time splitting 
    12    !!---------------------------------------------------------------------- 
    1313   !!---------------------------------------------------------------------- 
    1414   !!   dyn_spg_ts  : compute surface pressure gradient trend using a time- 
     
    4545   PUBLIC ts_rst      ! routine called by istate.F90 
    4646 
     47 
    4748   REAL(wp), DIMENSION(jpi,jpj) ::  ftnw, ftne   ! triad of coriolis parameter 
    4849   REAL(wp), DIMENSION(jpi,jpj) ::  ftsw, ftse   ! (only used with een vorticity scheme) 
     50 
     51   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   un_b, vn_b   ! averaged velocity 
    4952 
    5053   !! * Substitutions 
     
    6669      !!      gradient in case of free surface formulation with time-splitting. 
    6770      !!      Add it to the general trend of momentum equation. 
    68       !!      Compute the free surface. 
    6971      !! 
    7072      !! ** Method  :   Free surface formulation with time-splitting 
     
    7577      !!          the barotropic integration. 
    7678      !!      -2- Barotropic loop : updates of sea surface height (ssha_e) and  
    77       !!          barotropic transports (ua_e and va_e) through barotropic  
     79      !!          barotropic velocity (ua_e and va_e) through barotropic  
    7880      !!          momentum and continuity integration. Barotropic former  
    7981      !!          variables are time averaging over the full barotropic cycle 
    80       !!          (= 2 * baroclinic time step) and saved in zsshX_b, zuX_b  
     82      !!          (= 2 * baroclinic time step) and saved in zuX_b  
    8183      !!          and zvX_b (X specifying after, now or before). 
    8284      !!      -3- The new general trend becomes : 
    83       !!          ua = ua - sum_k(ua)/H + ( zua_e - sum_k(ub) )/H 
     85      !!          ua = ua - sum_k(ua)/H + ( ua_e - sum_k(ub) ) 
    8486      !! 
    8587      !! ** Action : - Update (ua,va) with the surf. pressure gradient trend 
     
    8789      !! References : Griffies et al., (2003): A technical guide to MOM4. NOAA/GFDL 
    8890      !!--------------------------------------------------------------------- 
    89       INTEGER, INTENT( in )  ::   kt           ! ocean time-step index 
    90       !! 
    91       INTEGER  ::  ji, jj, jk, jit             ! dummy loop indices 
    92       INTEGER  ::  icycle                      ! temporary scalar 
    93       REAL(wp) ::                           & 
    94          zraur, zcoef, z2dt_e, z2dt_b, zfac25,   &  ! temporary scalars 
    95          zfact1, zspgu, zcubt, zx1, zy1,    &  !     "        " 
    96          zfact2, zspgv, zcvbt, zx2, zy2        !     "        " 
    97       REAL(wp), DIMENSION(jpi,jpj) ::       & 
    98          zcu, zcv, zwx, zwy, zhdiv,         &  ! temporary arrays 
    99          zua, zva, zub, zvb,                &  !     "        " 
    100          zua_e, zva_e, zssha_e,             &  !     "        " 
    101          zub_e, zvb_e, zsshb_e,             &  !     "        " 
    102          zu_sum, zv_sum, zssh_sum 
    103       !! Variable volume 
    104       REAL(wp), DIMENSION(jpi,jpj)     ::   & 
    105          zspgu_1, zspgv_1, zsshun_e, zsshvn_e                     ! 2D workspace 
     91      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
     92      !! 
     93      INTEGER  ::   ji, jj, jk, jn             ! dummy loop indices 
     94      INTEGER  ::   icycle                      ! temporary scalar 
     95      REAL(wp) ::   zraur, zcoef, z2dt_e, z2dt_b,   &  ! temporary scalars 
     96         z1_8, zspgu, zcubt, zx1, zy1,    &  !     "        " 
     97         z1_4, zspgv, zcvbt, zx2, zy2        !     "        " 
     98      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv, zsshb_e 
     99      !!  
     100      REAL(wp), DIMENSION(jpi,jpj) ::   zsshun_e, zsshvn_e   ! 2D workspace 
     101      !! 
     102      REAL(wp), DIMENSION(jpi,jpj) ::   zcu, zwx, zua, zun, zub   ! 2D workspace 
     103      REAL(wp), DIMENSION(jpi,jpj) ::   zcv, zwy, zva, zvn, zvb   !  -      - 
     104      REAL(wp), DIMENSION(jpi,jpj) ::   zun_e, zub_e, zu_sum      ! 2D workspace 
     105      REAL(wp), DIMENSION(jpi,jpj) ::   zvn_e, zvb_e, zv_sum      !  -      - 
     106      REAL(wp), DIMENSION(jpi,jpj) ::   zssh_sum                  !  -      - 
    106107      !!---------------------------------------------------------------------- 
    107108 
    108       ! Arrays initialization 
    109       ! --------------------- 
    110       zhdiv(:,:) = 0.e0 
    111  
    112  
    113       IF( kt == nit000 ) THEN 
     109      IF( kt == nit000 ) THEN             !* initialisation 
    114110         ! 
    115111         IF(lwp) WRITE(numout,*) 
     
    117113         IF(lwp) WRITE(numout,*) '~~~~~~~~~~   free surface with time splitting' 
    118114         IF(lwp) WRITE(numout,*) ' Number of sub cycle in 1 time-step (2 rdt) : icycle = ',  2*nn_baro 
    119  
     115         ! 
    120116         CALL ts_rst( nit000, 'READ' )   ! read or initialize the following fields: 
    121          !                               ! sshb, sshn, sshb_b, sshn_b, un_b, vn_b 
    122  
    123          zssha_e(:,:) = sshn(:,:) 
    124          zua_e  (:,:) = un_e(:,:) 
    125          zva_e  (:,:) = vn_e(:,:) 
    126          hu_e   (:,:) = hu  (:,:) 
    127          hv_e   (:,:) = hv  (:,:) 
     117         !                               ! un_b, vn_b   
     118         ! 
     119         ua_e  (:,:) = un_b (:,:) 
     120         va_e  (:,:) = vn_b (:,:) 
     121         hu_e  (:,:) = hu   (:,:) 
     122         hv_e  (:,:) = hv   (:,:) 
     123         hur_e (:,:) = hur  (:,:) 
     124         hvr_e (:,:) = hvr  (:,:) 
    128125         IF( ln_dynvor_een ) THEN 
    129126            ftne(1,:) = 0.e0   ;   ftnw(1,:) = 0.e0   ;   ftse(1,:) = 0.e0   ;   ftsw(1,:) = 0.e0 
     
    140137      ENDIF 
    141138 
    142       ! Substract the surface pressure gradient from the momentum 
    143       ! --------------------------------------------------------- 
    144       IF( lk_vvl ) THEN    ! Variable volume 
    145  
    146          ! 0. Local initialization 
    147          ! ----------------------- 
    148          zspgu_1(:,:) = 0.e0 
    149          zspgv_1(:,:) = 0.e0 
    150  
    151          ! 1. Surface pressure gradient (now) 
    152          ! ---------------------------- 
    153          DO jj = 2, jpjm1 
    154             DO ji = fs_2, fs_jpim1   ! vector opt. 
    155                zspgu_1(ji,jj) = -grav * ( ( rhd(ji+1,jj  ,1) + 1 ) * sshn(ji+1,jj  ) & 
    156                   &                     - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  ) ) / e1u(ji,jj) 
    157                zspgv_1(ji,jj) = -grav * ( ( rhd(ji  ,jj+1,1) + 1 ) * sshn(ji  ,jj+1) & 
    158                   &                     - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  ) ) / e2v(ji,jj) 
    159             END DO 
    160          END DO 
    161  
    162          ! 2. Substract the surface pressure trend from the general trend 
    163          ! ------------------------------------------------------ 
    164          DO jk = 1, jpkm1 
    165             DO jj = 2, jpjm1 
    166                DO ji = fs_2, fs_jpim1   ! vector opt. 
    167                   ua(ji,jj,jk) = ua(ji,jj,jk) - zspgu_1(ji,jj) 
    168                   va(ji,jj,jk) = va(ji,jj,jk) - zspgv_1(ji,jj) 
    169                END DO 
    170             END DO 
    171          END DO 
    172  
    173       ENDIF 
    174  
    175       ! Local constant initialization 
    176       ! -------------------------------- 
     139      !                                   !* Local constant initialization 
    177140      z2dt_b = 2.0 * rdt                                    ! baroclinic time step 
    178       IF ( neuler == 0 .AND. kt == nit000 ) z2dt_b = rdt 
    179       zfact1 = 0.5 * 0.25                                   ! coefficient for vorticity estimates 
    180       zfact2 = 0.5 * 0.5 
     141      z1_8 = 0.5 * 0.25                                     ! coefficient for vorticity estimates 
     142      z1_4 = 0.5 * 0.5 
    181143      zraur  = 1. / rauw                                    ! 1 / volumic mass of pure water 
     144      ! 
     145      zhdiv(:,:) = 0.e0                                     ! barotropic divergence 
    182146 
    183147      ! ----------------------------------------------------------------------------- 
    184148      !  Phase 1 : Coupling between general trend and barotropic estimates (1st step) 
    185149      ! ----------------------------------------------------------------------------- 
    186  
    187       ! Vertically integrated quantities 
    188       ! -------------------------------- 
    189       zua(:,:) = 0.e0 
    190       zva(:,:) = 0.e0 
    191       zub(:,:) = 0.e0 
    192       zvb(:,:) = 0.e0 
    193       zwx(:,:) = 0.e0 
    194       zwy(:,:) = 0.e0 
    195  
    196       ! vertical sum 
    197       IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
    198          DO jk = 1, jpkm1 
     150      !       
     151      !                                   !* e3*d/dt(Ua), e3*Ub, e3*Vn (Vertically integrated) 
     152      !                                   ! -------------------------- 
     153      zua(:,:) = 0.e0   ;   zun(:,:) = 0.e0   ;   zub(:,:) = 0.e0 
     154      zva(:,:) = 0.e0   ;   zvn(:,:) = 0.e0   ;   zvb(:,:) = 0.e0 
     155      ! 
     156      DO jk = 1, jpkm1 
     157#if defined key_vectopt_loop 
     158         DO jj = 1, 1         !Vector opt. => forced unrolling 
    199159            DO ji = 1, jpij 
    200                !                                                           ! Vertically integrated momentum trends 
    201                zua(ji,1) = zua(ji,1) + fse3u(ji,1,jk) * umask(ji,1,jk) * ua(ji,1,jk) 
    202                zva(ji,1) = zva(ji,1) + fse3v(ji,1,jk) * vmask(ji,1,jk) * va(ji,1,jk) 
    203                !                                                           ! Vertically integrated transports (before) 
    204                zub(ji,1) = zub(ji,1) + fse3u_b(ji,1,jk) * ub(ji,1,jk) 
    205                zvb(ji,1) = zvb(ji,1) + fse3v_b(ji,1,jk) * vb(ji,1,jk) 
    206                !                                                           ! Planetary vorticity transport fluxes (now) 
    207                zwx(ji,1) = zwx(ji,1) + e2u(ji,1) * fse3u(ji,1,jk) * un(ji,1,jk) 
    208                zwy(ji,1) = zwy(ji,1) + e1v(ji,1) * fse3v(ji,1,jk) * vn(ji,1,jk) 
    209             END DO 
    210          END DO 
    211       ELSE                             ! No  vector opt. 
    212          DO jk = 1, jpkm1 
    213             !                                                           ! Vertically integrated momentum trends 
    214             zua(:,:) = zua(:,:) + fse3u(:,:,jk) * umask(:,:,jk) * ua(:,:,jk) 
    215             zva(:,:) = zva(:,:) + fse3v(:,:,jk) * vmask(:,:,jk) * va(:,:,jk) 
    216             !                                                           ! Vertically integrated transports (before) 
    217             zub(:,:) = zub(:,:) + fse3u_b(:,:,jk) * ub(:,:,jk) 
    218             zvb(:,:) = zvb(:,:) + fse3v_b(:,:,jk) * vb(:,:,jk) 
    219             !                                                           ! Planetary vorticity (now) 
    220             zwx(:,:) = zwx(:,:) + e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
    221             zwy(:,:) = zwy(:,:) + e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    222          END DO 
    223       ENDIF 
    224  
     160#else  
     161         DO jj = 1, jpj 
     162            DO ji = 1, jpi 
     163#endif 
     164               !                                                                              ! now trend 
     165               zua(ji,jj) = zua(ji,jj) + fse3u  (ji,jj,jk) * ua(ji,jj,jk) * umask(ji,jj,jk) 
     166               zva(ji,jj) = zva(ji,jj) + fse3v  (ji,jj,jk) * va(ji,jj,jk) * vmask(ji,jj,jk) 
     167               !                                                                              ! now velocity  
     168               zun(ji,jj) = zun(ji,jj) + fse3u  (ji,jj,jk) * un(ji,jj,jk) 
     169               zvn(ji,jj) = zvn(ji,jj) + fse3v  (ji,jj,jk) * vn(ji,jj,jk)                
     170               !                                                                              ! before velocity 
     171               zub(ji,jj) = zub(ji,jj) + fse3u_b(ji,jj,jk) * ub(ji,jj,jk)  
     172               zvb(ji,jj) = zvb(ji,jj) + fse3v_b(ji,jj,jk) * vb(ji,jj,jk) 
     173            END DO 
     174         END DO 
     175      END DO 
     176 
     177      !                                   !* baroclinic momentum trend (remove the vertical mean trend) 
     178      DO jk = 1, jpkm1                    ! -------------------------- 
     179         DO jj = 2, jpjm1 
     180            DO ji = fs_2, fs_jpim1   ! vector opt. 
     181               ua(ji,jj,jk) = ua(ji,jj,jk) - zua(ji,jj) * hur(ji,jj) 
     182               va(ji,jj,jk) = va(ji,jj,jk) - zva(ji,jj) * hvr(ji,jj) 
     183            END DO 
     184         END DO 
     185      END DO 
     186 
     187      !                                   !* barotropic Coriolis trends * H (vorticity scheme dependent) 
     188      !                                   ! ---------------------------==== 
     189      zwx(:,:) = zun(:,:) * e2u(:,:)                   ! now transport  
     190      zwy(:,:) = zvn(:,:) * e1v(:,:) 
     191      ! 
    225192      IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      ! energy conserving or mixed scheme 
    226193         DO jj = 2, jpjm1 
     
    231198               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    232199               ! energy conserving formulation for planetary vorticity term 
    233                zcu(ji,jj) = zfact2 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 ) 
    234                zcv(ji,jj) =-zfact2 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) 
     200               zcu(ji,jj) = z1_4 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 ) 
     201               zcv(ji,jj) =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) 
    235202            END DO 
    236203         END DO 
     
    239206         DO jj = 2, jpjm1 
    240207            DO ji = fs_2, fs_jpim1   ! vector opt. 
    241                zy1 = zfact1 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
    242                               + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    243                zx1 =-zfact1 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
    244                               + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     208               zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
     209               zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) + zwx(ji,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    245210               zcu(ji,jj)  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) ) 
    246211               zcv(ji,jj)  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) 
     
    249214         ! 
    250215      ELSEIF ( ln_dynvor_een ) THEN                    ! enstrophy and energy conserving scheme 
    251          zfac25 = 0.25 
    252216         DO jj = 2, jpjm1 
    253217            DO ji = fs_2, fs_jpim1   ! vector opt. 
    254                zcu(ji,jj) = + zfac25 / e1u(ji,jj)   & 
    255                   &       * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    256                   &          + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    257                zcv(ji,jj) = - zfac25 / e2v(ji,jj)   & 
    258                   &       * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    259                   &          + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     218               zcu(ji,jj) = + z1_4 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     219                  &                                + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     220               zcv(ji,jj) = - z1_4 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     221                  &                                + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    260222            END DO 
    261223         END DO 
     
    263225      ENDIF 
    264226 
    265  
    266       ! Remove barotropic trend from general momentum trend 
    267       ! --------------------------------------------------- 
    268       DO jk = 1 , jpkm1 
    269          DO jj = 2, jpjm1 
    270             DO ji = fs_2, fs_jpim1   ! vector opt. 
    271                ua(ji,jj,jk) = ua(ji,jj,jk) - zua(ji,jj) * hur(ji,jj) 
    272                va(ji,jj,jk) = va(ji,jj,jk) - zva(ji,jj) * hvr(ji,jj) 
    273             END DO 
    274          END DO 
    275       END DO 
    276  
    277       ! Remove coriolis term from barotropic trend 
    278       ! ------------------------------------------ 
    279       DO jj = 2, jpjm1 
     227      !                                   !* Right-Hand-Side of the barotropic momentum equation 
     228      !                                   ! ---------------------------------------------------- 
     229      IF( lk_vvl ) THEN                         ! Variable volume : remove both Coriolis and Surface pressure gradient 
     230         DO jj = 2, jpjm1  
     231            DO ji = fs_2, fs_jpim1   ! vector opt. 
     232               zcu(ji,jj) = zcu(ji,jj) - grav * (  ( rhd(ji+1,jj  ,1) + 1 ) * sshn(ji+1,jj  )    & 
     233                  &                              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  )  ) * hu(ji,jj) / e1u(ji,jj) 
     234               zcv(ji,jj) = zcv(ji,jj) - grav * (  ( rhd(ji  ,jj+1,1) + 1 ) * sshn(ji  ,jj+1)    & 
     235                  &                              - ( rhd(ji  ,jj  ,1) + 1 ) * sshn(ji  ,jj  )  ) * hv(ji,jj) / e2v(ji,jj) 
     236            END DO 
     237         END DO 
     238      ENDIF 
     239 
     240      DO jj = 2, jpjm1                             ! Remove coriolis term (and possibly spg) from barotropic trend 
    280241         DO ji = fs_2, fs_jpim1 
    281242            zua(ji,jj) = zua(ji,jj) - zcu(ji,jj) 
     
    284245      END DO 
    285246 
     247      !                                   !* d/dt(Ua), Ub, Vn (Vertical mean velocity) 
     248      !                                   ! --------------------------  
     249      zua(:,:) = zua(:,:) * hur(:,:) 
     250      zva(:,:) = zva(:,:) * hvr(:,:) 
     251      ! 
     252      IF( lk_vvl ) THEN 
     253         zub(:,:) = zub(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1.e0 - umask(:,:,1) ) 
     254         zvb(:,:) = zvb(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1.e0 - vmask(:,:,1) ) 
     255      ELSE 
     256         zub(:,:) = zub(:,:) * hur(:,:) 
     257         zvb(:,:) = zvb(:,:) * hvr(:,:) 
     258      ENDIF 
     259 
    286260      ! ----------------------------------------------------------------------- 
    287261      !  Phase 2 : Integration of the barotropic equations with time splitting 
    288262      ! ----------------------------------------------------------------------- 
    289  
    290       ! Initialisations 
    291       !---------------- 
    292       ! Number of iteration of the barotropic loop 
    293       icycle = 2  * nn_baro + 1 
    294  
    295       ! variables for the barotropic equations 
    296       zu_sum  (:,:) = 0.e0 
    297       zv_sum  (:,:) = 0.e0 
    298       zssh_sum(:,:) = 0.e0 
    299       hu_e    (:,:) = hu    (:,:)      ! (barotropic) ocean depth at u-point 
    300       hv_e    (:,:) = hv    (:,:)      ! (barotropic) ocean depth at v-point 
    301       zsshb_e (:,:) = sshn_e(:,:)      ! (barotropic) sea surface height (before and now) 
    302       ! vertical sum 
    303       un_e  (:,:) = 0.e0 
    304       vn_e  (:,:) = 0.e0 
    305       IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
    306          DO jk = 1, jpkm1 
    307             DO ji = 1, jpij 
    308                un_e(ji,1) = un_e(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
    309                vn_e(ji,1) = vn_e(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
    310             END DO 
    311          END DO 
    312       ELSE                             ! No  vector opt. 
    313          DO jk = 1, jpkm1 
    314             un_e(:,:) = un_e(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
    315             vn_e(:,:) = vn_e(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
    316          END DO 
    317       ENDIF 
    318       zub_e (:,:) = un_e(:,:) 
    319       zvb_e (:,:) = vn_e(:,:) 
    320  
    321  
     263      ! 
     264      !                                             ! ==================== ! 
     265      !                                             !    Initialisations   ! 
     266      !                                             ! ==================== ! 
     267      icycle = 2  * nn_baro            ! Number of barotropic sub time-step 
     268       
     269      !                                ! Start from NOW field 
     270      hu_e   (:,:) = hu   (:,:)            ! ocean depth at u- and v-points 
     271      hv_e   (:,:) = hv   (:,:)  
     272      hur_e  (:,:) = hur  (:,:)            ! ocean depth inverted at u- and v-points 
     273      hvr_e  (:,:) = hvr  (:,:) 
     274      zsshb_e(:,:) = sshn (:,:)            ! sea surface height (before and now) 
     275      sshn_e (:,:) = sshn (:,:) 
     276       
     277      zun_e  (:,:) = un_b (:,:)            ! barotropic velocity (external) 
     278      zvn_e  (:,:) = vn_b (:,:) 
     279      zub_e  (:,:) = un_b (:,:) 
     280      zvb_e  (:,:) = vn_b (:,:) 
     281 
     282      zu_sum  (:,:) = un_b (:,:)           ! summation 
     283      zv_sum  (:,:) = vn_b (:,:) 
     284      zssh_sum(:,:) = sshn (:,:) 
     285 
     286#if defined key_obc 
    322287      ! set ssh corrections to 0 
    323288      ! ssh corrections are applied to normal velocities (Flather's algorithm) and averaged over the barotropic loop 
    324 #if defined key_obc 
    325289      IF( lp_obc_east  )   sshfoe_b(:,:) = 0.e0 
    326290      IF( lp_obc_west  )   sshfow_b(:,:) = 0.e0 
     
    329293#endif 
    330294 
    331       ! Barotropic integration over 2 baroclinic time steps 
    332       ! --------------------------------------------------- 
    333  
    334       !                                                    ! ==================== ! 
    335       DO jit = 1, icycle                                   !  sub-time-step loop  ! 
    336          !                                                 ! ==================== ! 
     295      !                                             ! ==================== ! 
     296      DO jn = 1, icycle                             !  sub-time-step loop  ! (from NOW to AFTER+1) 
     297         !                                          ! ==================== ! 
    337298         z2dt_e = 2. * ( rdt / nn_baro ) 
    338          IF ( jit == 1 )   z2dt_e = rdt / nn_baro 
    339  
    340          ! Time interpolation of open boundary condition data 
    341          IF( lk_obc )   CALL obc_dta_bt( kt, jit ) 
    342          IF( lk_bdy .OR. ln_bdy_tides)   CALL bdy_dta_bt( kt, jit+1 ) 
    343  
    344          ! Horizontal divergence of barotropic transports 
    345          !-------------------------------------------------- 
    346          zhdiv(:,:) = 0.e0 
    347          DO jj = 2, jpjm1 
    348             DO ji = fs_2, fs_jpim1   ! vector opt. 
    349                zhdiv(ji,jj) = ( e2u(ji  ,jj  ) * un_e(ji  ,jj)              & 
    350                   &            -e2u(ji-1,jj  ) * un_e(ji-1,jj)              & 
    351                   &            +e1v(ji  ,jj  ) * vn_e(ji  ,jj)              & 
    352                   &            -e1v(ji  ,jj-1) * vn_e(ji  ,jj-1) )          & 
    353                   &           / (e1t(ji,jj)*e2t(ji,jj)) 
    354             END DO 
    355          END DO 
    356  
     299         IF( jn == 1 )   z2dt_e = rdt / nn_baro 
     300 
     301         !                                                !* Update the forcing (OBC, BDY and tides) 
     302         !                                                !  ------------------ 
     303         IF( lk_obc                     )   CALL obc_dta_bt( kt, jn   ) 
     304         IF( lk_bdy  .OR.  ln_bdy_tides )   CALL bdy_dta_bt( kt, jn+1 ) 
     305 
     306         !                                                !* after ssh_e 
     307         !                                                !  ----------- 
     308         DO jj = 2, jpjm1                                      ! Horizontal divergence of barotropic transports 
     309            DO ji = fs_2, fs_jpim1   ! vector opt. 
     310               zhdiv(ji,jj) = (   e2u(ji  ,jj) * zun_e(ji  ,jj) * hu_e(ji  ,jj)     & 
     311                  &             - e2u(ji-1,jj) * zun_e(ji-1,jj) * hu_e(ji-1,jj)     & 
     312                  &             + e1v(ji,jj  ) * zvn_e(ji,jj  ) * hv_e(ji,jj  )     & 
     313                  &             - e1v(ji,jj-1) * zvn_e(ji,jj-1) * hv_e(ji,jj-1)   ) / ( e1t(ji,jj) * e2t(ji,jj) ) 
     314            END DO 
     315         END DO 
     316         ! 
    357317#if defined key_obc 
    358          ! open boundaries (div must be zero behind the open boundary) 
    359          !  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    360          IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1 = 0.e0      ! east 
    361          IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1 = 0.e0      ! west 
     318         !                                                     ! OBC : zhdiv must be zero behind the open boundary 
     319!!  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
     320         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0.e0      ! east 
     321         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0.e0      ! west 
    362322         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north 
    363          IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1 = 0.e0      ! south 
     323         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0.e0      ! south 
    364324#endif 
    365  
    366325#if defined key_bdy 
    367          DO jj = 1, jpj 
    368             DO ji = 1, jpi 
    369                zhdiv(ji,jj) = zhdiv(ji,jj)*bdytmask(ji,jj) 
    370             END DO 
    371          END DO 
     326         zhdiv(:,:) = zhdiv(:,:) * bdytmask(:,:)               ! BDY mask 
    372327#endif 
    373  
    374          ! Sea surface height from the barotropic system 
    375          !---------------------------------------------- 
    376          DO jj = 2, jpjm1 
    377             DO ji = fs_2, fs_jpim1   ! vector opt. 
    378                zssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e *  ( zraur * emp(ji,jj)  & 
    379                   &            +  zhdiv(ji,jj) ) ) * tmask(ji,jj,1) 
    380             END DO 
    381          END DO 
    382  
    383          ! evolution of the barotropic transport ( following the vorticity scheme used) 
    384          ! ---------------------------------------------------------------------------- 
    385          zwx(:,:) = e2u(:,:) * un_e(:,:) 
    386          zwy(:,:) = e1v(:,:) * vn_e(:,:) 
    387  
    388          IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      ! energy conserving or mixed scheme 
     328         ! 
     329         DO jj = 2, jpjm1                                      ! leap-frog on ssh_e 
     330            DO ji = fs_2, fs_jpim1   ! vector opt. 
     331               ssha_e(ji,jj) = ( zsshb_e(ji,jj) - z2dt_e * ( zraur * emp(ji,jj) + zhdiv(ji,jj) ) ) * tmask(ji,jj,1) 
     332            END DO 
     333         END DO 
     334 
     335         !                                                !* after barotropic velocities (vorticity scheme dependent) 
     336         !                                                !  ---------------------------   
     337         zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:)           ! now_e transport 
     338         zwy(:,:) = e1v(:,:) * zvn_e(:,:) * hv_e(:,:) 
     339         ! 
     340         IF( ln_dynvor_ene .OR. ln_dynvor_mix ) THEN      !==  energy conserving or mixed scheme  ==! 
    389341            DO jj = 2, jpjm1 
    390342               DO ji = fs_2, fs_jpim1   ! vector opt. 
    391343                  ! surface pressure gradient 
    392344                  IF( lk_vvl) THEN 
    393                      zspgu = -grav * ( ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  ) & 
    394                         &            - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hu(ji,jj) / e1u(ji,jj) 
    395                      zspgv = -grav * ( ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1) & 
    396                         &            - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hv(ji,jj) / e2v(ji,jj) 
     345                     zspgu = -grav * (  ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  )    & 
     346                        &             - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj) 
     347                     zspgv = -grav * (  ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    & 
     348                        &             - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj) 
    397349                  ELSE 
    398                      zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    399                      zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     350                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj) 
     351                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj) 
    400352                  ENDIF 
    401353                  ! energy conserving formulation for planetary vorticity term 
     
    404356                  zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) / e2v(ji,jj) 
    405357                  zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    406                   zcubt = zfact2 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 ) 
    407                   zcvbt =-zfact2 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) 
    408                   ! after transports 
    409                   zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    410                   zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     358                  zcubt = z1_4 * ( ff(ji  ,jj-1) * zy1 + ff(ji,jj) * zy2 ) * hur_e(ji,jj) 
     359                  zcvbt =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) * hvr_e(ji,jj) 
     360                  ! after barotropic velocity 
     361                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     362                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    411363               END DO 
    412364            END DO 
    413365            ! 
    414          ELSEIF ( ln_dynvor_ens ) THEN                    ! enstrophy conserving scheme 
     366         ELSEIF ( ln_dynvor_ens ) THEN                    !==  enstrophy conserving scheme  ==! 
     367            DO jj = 2, jpjm1 
     368               DO ji = fs_2, fs_jpim1   ! vector opt. 
     369                   ! surface pressure gradient 
     370                  IF( lk_vvl) THEN 
     371                     zspgu = -grav * (  ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  )    & 
     372                        &             - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj) 
     373                     zspgv = -grav * (  ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    & 
     374                        &             - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj) 
     375                  ELSE 
     376                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj) 
     377                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj) 
     378                  ENDIF 
     379                  ! enstrophy conserving formulation for planetary vorticity term 
     380                  zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) + zwy(ji,jj) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
     381                  zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) + zwx(ji,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
     382                  zcubt  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) ) * hur_e(ji,jj) 
     383                  zcvbt  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) * hvr_e(ji,jj) 
     384                  ! after barotropic velocity 
     385                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     386                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     387               END DO 
     388            END DO 
     389            ! 
     390         ELSEIF ( ln_dynvor_een ) THEN                    !==  energy and enstrophy conserving scheme  ==! 
    415391            DO jj = 2, jpjm1 
    416392               DO ji = fs_2, fs_jpim1   ! vector opt. 
    417393                  ! surface pressure gradient 
    418394                  IF( lk_vvl) THEN 
    419                      zspgu = -grav * ( ( rhd(ji+1,jj ,1) + 1 ) * sshn_e(ji+1,jj  ) & 
    420                         &            - ( rhd(ji  ,jj ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hu(ji,jj) / e1u(ji,jj) 
    421                      zspgv = -grav * ( ( rhd(ji ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1) & 
    422                         &            - ( rhd(ji ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hv(ji,jj) / e2v(ji,jj) 
     395                     zspgu = -grav * (  ( rhd(ji+1,jj  ,1) + 1 ) * sshn_e(ji+1,jj  )    & 
     396                        &             - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e1u(ji,jj) 
     397                     zspgv = -grav * (  ( rhd(ji  ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1)    & 
     398                        &             - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  )  ) / e2v(ji,jj) 
    423399                  ELSE 
    424                      zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    425                      zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
    426                   ENDIF 
    427                   ! enstrophy conserving formulation for planetary vorticity term 
    428                   zy1 = zfact1 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
    429                      + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    430                   zx1 =-zfact1 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
    431                      + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    432                   zcubt  = zy1 * ( ff(ji  ,jj-1) + ff(ji,jj) ) 
    433                   zcvbt  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) 
    434                   ! after transports 
    435                   zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    436                   zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    437                END DO 
    438             END DO 
    439             ! 
    440          ELSEIF ( ln_dynvor_een ) THEN                    ! energy and enstrophy conserving scheme 
    441             zfac25 = 0.25 
    442             DO jj = 2, jpjm1 
    443                DO ji = fs_2, fs_jpim1   ! vector opt. 
    444                   ! surface pressure gradient 
    445                   IF( lk_vvl) THEN 
    446                      zspgu = -grav * ( ( rhd(ji+1,jj  ,1) + 1 ) * sshn_e(ji+1,jj  ) & 
    447                         &            - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hu(ji,jj) / e1u(ji,jj) 
    448                      zspgv = -grav * ( ( rhd(ji  ,jj+1,1) + 1 ) * sshn_e(ji  ,jj+1) & 
    449                         &            - ( rhd(ji  ,jj  ,1) + 1 ) * sshn_e(ji  ,jj  ) ) * hv(ji,jj) / e2v(ji,jj) 
    450                   ELSE 
    451                      zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) * hu(ji,jj) / e1u(ji,jj) 
    452                      zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) * hv(ji,jj) / e2v(ji,jj) 
     400                     zspgu = -grav * ( sshn_e(ji+1,jj) - sshn_e(ji,jj) ) / e1u(ji,jj) 
     401                     zspgv = -grav * ( sshn_e(ji,jj+1) - sshn_e(ji,jj) ) / e2v(ji,jj) 
    453402                  ENDIF 
    454403                  ! energy/enstrophy conserving formulation for planetary vorticity term 
    455                   zcubt = + zfac25 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    456                      &                             + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    457                   zcvbt = - zfac25 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    458                      &                             + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    459                   ! after transports 
    460                   zua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
    461                   zva_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
     404                  zcubt = + z1_4 / e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) + ftnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     405                     &                           + ftse(ji,jj  ) * zwy(ji  ,jj-1) + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) * hur_e(ji,jj) 
     406                  zcvbt = - z1_4 / e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) + ftse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     407                     &                           + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) * hvr_e(ji,jj) 
     408                  ! after barotropic velocity 
     409                  ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zcubt + zspgu + zua(ji,jj) ) ) * umask(ji,jj,1) 
     410                  va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zcvbt + zspgv + zva(ji,jj) ) ) * vmask(ji,jj,1) 
    462411               END DO 
    463412            END DO 
    464413            !  
    465414         ENDIF 
    466  
    467          ! Flather's boundary condition for the barotropic loop : 
    468          !         - Update sea surface height on each open boundary 
    469          !         - Correct the barotropic transports 
    470          IF( lk_obc )   CALL obc_fla_ts 
    471          IF( lk_bdy .OR. ln_bdy_tides )   CALL bdy_dyn_fla 
    472  
    473          ! ... Boundary conditions on ua_e, va_e, ssha_e 
    474          CALL lbc_lnk( zua_e  , 'U', -1. ) 
    475          CALL lbc_lnk( zva_e  , 'V', -1. ) 
    476          CALL lbc_lnk( zssha_e, 'T',  1. ) 
    477  
    478          ! temporal sum 
    479          !------------- 
    480          zu_sum  (:,:) = zu_sum  (:,:) + zua_e  (:,:) 
    481          zv_sum  (:,:) = zv_sum  (:,:) + zva_e  (:,:)  
    482          zssh_sum(:,:) = zssh_sum(:,:) + zssha_e(:,:)  
    483  
    484          ! Time filter and swap of dynamics arrays 
    485          ! --------------------------------------- 
    486          IF( jit == 1 ) THEN   ! Euler (forward) time stepping 
    487             zsshb_e(:,:) = sshn_e (:,:) 
    488             zub_e  (:,:) = un_e   (:,:) 
    489             zvb_e  (:,:) = vn_e   (:,:) 
    490             sshn_e (:,:) = zssha_e(:,:) 
    491             un_e   (:,:) = zua_e  (:,:) 
    492             vn_e   (:,:) = zva_e  (:,:) 
    493          ELSE                                        ! Asselin filtering 
    494             zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + zssha_e(:,:) ) + atfp1 * sshn_e(:,:) 
    495             zub_e  (:,:) = atfp * ( zub_e  (:,:) + zua_e  (:,:) ) + atfp1 * un_e  (:,:) 
    496             zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + zva_e  (:,:) ) + atfp1 * vn_e  (:,:) 
    497             sshn_e (:,:) = zssha_e(:,:) 
    498             un_e   (:,:) = zua_e  (:,:) 
    499             vn_e   (:,:) = zva_e  (:,:) 
     415         !                                                !* domain lateral boundary 
     416         !                                                !  ----------------------- 
     417         !                                                      ! Flather's boundary condition for the barotropic loop : 
     418         !                                                      !         - Update sea surface height on each open boundary 
     419         !                                                      !         - Correct the velocity 
     420 
     421         IF( lk_obc                   )   CALL obc_fla_ts 
     422         IF( lk_bdy .OR. ln_bdy_tides )   CALL bdy_dyn_fla( sshn_e )  
     423         ! 
     424         CALL lbc_lnk( ua_e  , 'U', -1. )                      ! local domain boundaries  
     425         CALL lbc_lnk( va_e  , 'V', -1. ) 
     426         CALL lbc_lnk( ssha_e, 'T',  1. ) 
     427 
     428         zu_sum  (:,:) = zu_sum  (:,:) + ua_e  (:,:)           ! Sum over sub-time-steps 
     429         zv_sum  (:,:) = zv_sum  (:,:) + va_e  (:,:)  
     430         zssh_sum(:,:) = zssh_sum(:,:) + ssha_e(:,:)  
     431 
     432         !                                                !* Time filter and swap 
     433         !                                                !  -------------------- 
     434         IF( jn == 1 ) THEN                                     ! Swap only (1st Euler time step) 
     435            zsshb_e(:,:) = sshn_e(:,:) 
     436            zub_e  (:,:) = zun_e (:,:) 
     437            zvb_e  (:,:) = zvn_e (:,:) 
     438            sshn_e (:,:) = ssha_e(:,:) 
     439            zun_e  (:,:) = ua_e  (:,:) 
     440            zvn_e  (:,:) = va_e  (:,:) 
     441         ELSE                                                   ! Swap + Filter 
     442            zsshb_e(:,:) = atfp * ( zsshb_e(:,:) + ssha_e(:,:) ) + atfp1 * sshn_e(:,:) 
     443            zub_e  (:,:) = atfp * ( zub_e  (:,:) + ua_e  (:,:) ) + atfp1 * zun_e (:,:) 
     444            zvb_e  (:,:) = atfp * ( zvb_e  (:,:) + va_e  (:,:) ) + atfp1 * zvn_e (:,:) 
     445            sshn_e (:,:) = ssha_e(:,:) 
     446            zun_e  (:,:) = ua_e  (:,:) 
     447            zvn_e  (:,:) = va_e  (:,:) 
    500448         ENDIF 
    501449 
    502          IF( lk_vvl ) THEN ! Variable volume   ! needed for BDY ??? 
    503  
    504             ! Sea surface elevation 
    505             ! --------------------- 
    506             DO jj = 1, jpjm1 
    507                DO ji = 1,jpim1 
    508  
    509                   ! Sea Surface Height at u-point before 
    510                   zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )   & 
    511                      &              * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    & 
    512                      &                + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) ) 
    513  
    514                   ! Sea Surface Height at v-point before 
    515                   zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )   & 
    516                      &              * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    & 
    517                      &                + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) ) 
    518  
    519                END DO 
    520             END DO 
    521  
    522             ! Boundaries conditions 
    523             CALL lbc_lnk( zsshun_e, 'U', 1. )    ;  CALL lbc_lnk( zsshvn_e, 'V', 1. ) 
    524  
    525             ! Ocean depth at U- and V-points 
    526             ! ------------------------------------------- 
    527             hu_e(:,:) = hu_0(:,:) + zsshun_e(:,:) 
    528             hv_e(:,:) = hv_0(:,:) + zsshvn_e(:,:) 
    529  
     450         IF( lk_vvl ) THEN                                !* Update ocean depth (variable volume case only) 
     451            !                                             !  ------------------ 
     452            DO jj = 1, jpjm1                                    ! Sea Surface Height at u- & v-points 
     453               DO ji = 1, fs_jpim1   ! Vector opt. 
     454                  zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )       & 
     455                     &                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    & 
     456                     &                    + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) ) 
     457                  zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )       & 
     458                     &                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    & 
     459                     &                    + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) ) 
     460               END DO 
     461            END DO 
     462            CALL lbc_lnk( zsshun_e, 'U', 1. )                   ! lateral boundaries conditions 
     463            CALL lbc_lnk( zsshvn_e, 'V', 1. )  
     464            ! 
     465            hu_e (:,:) = hu_0(:,:) + zsshun_e(:,:)              ! Ocean depth at U- and V-points 
     466            hv_e (:,:) = hv_0(:,:) + zsshvn_e(:,:) 
     467            hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1.e0 - umask(:,:,1) ) 
     468            hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1.e0 - vmask(:,:,1) ) 
    530469            ! 
    531470         ENDIF 
     
    534473      !                                                    ! ==================== ! 
    535474 
    536       ! Time average of after barotropic variables 
    537       zcoef =  1.e0 / ( 2 * nn_baro  + 1 )  
    538       un_e  (:,:) = zcoef *  zu_sum  (:,:)  
    539       vn_e  (:,:) = zcoef *  zv_sum  (:,:)  
    540       sshn_e(:,:) = zcoef *  zssh_sum(:,:)  
    541  
    542475#if defined key_obc 
    543       IF( lp_obc_east  )   sshfoe_b(:,:) = zcoef * sshfoe_b(:,:) 
     476      IF( lp_obc_east  )   sshfoe_b(:,:) = zcoef * sshfoe_b(:,:)     !!gm totally useless ????? 
    544477      IF( lp_obc_west  )   sshfow_b(:,:) = zcoef * sshfow_b(:,:) 
    545478      IF( lp_obc_north )   sshfon_b(:,:) = zcoef * sshfon_b(:,:) 
     
    548481 
    549482      ! ----------------------------------------------------------------------------- 
    550       ! Phase 3. Coupling between general trend and barotropic estimates - (2nd step) 
     483      ! Phase 3. update the general trend with the barotropic trend 
    551484      ! ----------------------------------------------------------------------------- 
    552  
    553  
    554  
    555       ! add time averaged barotropic coriolis and surface pressure gradient 
    556       ! terms to the general momentum trend 
    557       ! -------------------------------------------------------------------- 
     485      ! 
     486      !                                   !* Time average ==> after barotropic u, v, ssh 
     487      zcoef =  1.e0 / ( 2 * nn_baro  + 1 )  
     488      un_b  (:,:) = zcoef * zu_sum  (:,:)  
     489      vn_b  (:,:) = zcoef * zv_sum  (:,:)  
     490      sshn_b(:,:) = zcoef * zssh_sum(:,:)  
     491      !  
     492      !                                   !* update the general momentum trend 
    558493      DO jk=1,jpkm1 
    559          ua(:,:,jk) = ua(:,:,jk) + hur(:,:) * ( un_e(:,:) - zub(:,:) ) / z2dt_b 
    560          va(:,:,jk) = va(:,:,jk) + hvr(:,:) * ( vn_e(:,:) - zvb(:,:) ) / z2dt_b 
     494         ua(:,:,jk) = ua(:,:,jk) + ( un_b(:,:) - zub(:,:) ) / z2dt_b 
     495         va(:,:,jk) = va(:,:,jk) + ( vn_b(:,:) - zvb(:,:) ) / z2dt_b 
    561496      END DO 
    562  
    563       ! write filtered free surface arrays in restart file 
    564       ! -------------------------------------------------- 
     497      ! 
     498      !                                   !* write time-spliting arrays in the restart 
    565499      IF( lrst_oce )   CALL ts_rst( kt, 'WRITE' ) 
    566  
    567500      ! 
    568501   END SUBROUTINE dyn_spg_ts 
     
    582515      ! 
    583516      IF( TRIM(cdrw) == 'READ' ) THEN 
    584          IF( iom_varid( numror, 'sshn_e', ldstop = .FALSE. ) > 0 ) THEN 
    585             CALL iom_get( numror, jpdom_autoglo, 'sshn_e', sshn_e(:,:) )   ! free surface and 
    586             CALL iom_get( numror, jpdom_autoglo, 'un_e'  , un_e  (:,:) )   ! horizontal transports issued 
    587             CALL iom_get( numror, jpdom_autoglo, 'vn_e'  , vn_e  (:,:) )   ! from barotropic loop 
     517         IF( iom_varid( numror, 'un_b', ldstop = .FALSE. ) > 0 ) THEN 
     518            CALL iom_get( numror, jpdom_autoglo, 'un_b'  , un_b  (:,:) )   ! external velocity issued 
     519            CALL iom_get( numror, jpdom_autoglo, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop 
    588520         ELSE 
    589             sshn_e(:,:) = sshn(:,:) 
    590             un_e  (:,:) = 0.e0 
    591             vn_e  (:,:) = 0.e0 
     521            un_b (:,:) = 0.e0 
     522            vn_b (:,:) = 0.e0 
    592523            ! vertical sum 
    593524            IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
    594525               DO jk = 1, jpkm1 
    595526                  DO ji = 1, jpij 
    596                      un_e(ji,1) = un_e(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
    597                      vn_e(ji,1) = vn_e(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
     527                     un_b(ji,1) = un_b(ji,1) + fse3u(ji,1,jk) * un(ji,1,jk) 
     528                     vn_b(ji,1) = vn_b(ji,1) + fse3v(ji,1,jk) * vn(ji,1,jk) 
    598529                  END DO 
    599530               END DO 
    600531            ELSE                             ! No  vector opt. 
    601532               DO jk = 1, jpkm1 
    602                   un_e(:,:) = un_e(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
    603                   vn_e(:,:) = vn_e(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
     533                  un_b(:,:) = un_b(:,:) + fse3u(:,:,jk) * un(:,:,jk) 
     534                  vn_b(:,:) = vn_b(:,:) + fse3v(:,:,jk) * vn(:,:,jk) 
    604535               END DO 
    605536            ENDIF 
     537            un_b (:,:) = un_b(:,:) * hur(:,:) 
     538            vn_b (:,:) = vn_b(:,:) * hvr(:,:) 
    606539         ENDIF 
    607540      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN 
    608          CALL iom_rstput( kt, nitrst, numrow, 'sshn_e', sshn_e(:,:) )   ! free surface and 
    609          CALL iom_rstput( kt, nitrst, numrow, 'un_e'  , un_e  (:,:) )   ! horizontal transports issued 
    610          CALL iom_rstput( kt, nitrst, numrow, 'vn_e'  , vn_e  (:,:) )   ! from barotropic loop 
     541         CALL iom_rstput( kt, nitrst, numrow, 'un_b'  , un_b  (:,:) )   ! external velocity issued 
     542         CALL iom_rstput( kt, nitrst, numrow, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop 
    611543      ENDIF 
    612544      ! 
Note: See TracChangeset for help on using the changeset viewer.