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 5974 for branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90 – NEMO

Ignore:
Timestamp:
2015-12-02T11:52:05+01:00 (8 years ago)
Author:
timgraham
Message:

Upgrade to head of trunk (r5936)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5072_UKMO2_OBS_simplification/NEMOGCM/NEMO/OPA_SRC/DYN/dynvor.F90

    r5029 r5974  
    1616   !!            3.3  ! 2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    1717   !!            3.7  ! 2014-04  (G. Madec) trend simplification: suppress jpdyn_trd_dat vorticity  
     18   !!             -   ! 2014-06  (G. Madec) suppression of velocity curl from in-core memory 
    1819   !!---------------------------------------------------------------------- 
    1920 
     
    2223   !!       vor_ens  : enstrophy conserving scheme       (ln_dynvor_ens=T) 
    2324   !!       vor_ene  : energy conserving scheme          (ln_dynvor_ene=T) 
    24    !!       vor_mix  : mixed enstrophy/energy conserving (ln_dynvor_mix=T) 
    2525   !!       vor_een  : energy and enstrophy conserving   (ln_dynvor_een=T) 
    2626   !!   dyn_vor_init : set and control of the different vorticity option 
     
    3232   USE trd_oce        ! trends: ocean variables 
    3333   USE trddyn         ! trend manager: dynamics 
     34   USE c1d            ! 1D vertical configuration 
     35   ! 
    3436   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    3537   USE prtctl         ! Print control 
     
    4446 
    4547   PUBLIC   dyn_vor        ! routine called by step.F90 
    46    PUBLIC   dyn_vor_init   ! routine called by opa.F90 
     48   PUBLIC   dyn_vor_init   ! routine called by nemogcm.F90 
    4749 
    4850   !                                   !!* Namelist namdyn_vor: vorticity term 
    49    LOGICAL, PUBLIC ::   ln_dynvor_ene   !: energy conserving scheme 
    50    LOGICAL, PUBLIC ::   ln_dynvor_ens   !: enstrophy conserving scheme 
    51    LOGICAL, PUBLIC ::   ln_dynvor_mix   !: mixed scheme 
    52    LOGICAL, PUBLIC ::   ln_dynvor_een   !: energy and enstrophy conserving scheme 
    53    LOGICAL, PUBLIC ::   ln_dynvor_een_old !: energy and enstrophy conserving scheme (original formulation) 
    54  
    55    INTEGER ::   nvor = 0   ! type of vorticity trend used 
    56    INTEGER ::   ncor = 1   ! coriolis 
    57    INTEGER ::   nrvm = 2   ! =2 relative vorticity ; =3 metric term 
    58    INTEGER ::   ntot = 4   ! =4 total vorticity (relative + planetary) ; =5 coriolis + metric term 
    59  
     51   LOGICAL, PUBLIC ::   ln_dynvor_ene   !: energy conserving scheme    (ENE) 
     52   LOGICAL, PUBLIC ::   ln_dynvor_ens   !: enstrophy conserving scheme (ENS) 
     53   LOGICAL, PUBLIC ::   ln_dynvor_mix   !: mixed scheme                (MIX) 
     54   LOGICAL, PUBLIC ::   ln_dynvor_een   !: energy and enstrophy conserving scheme (EEN) 
     55   INTEGER, PUBLIC ::      nn_een_e3f      !: e3f=masked averaging of e3t divided by 4 (=0) or by the sum of mask (=1) 
     56   LOGICAL, PUBLIC ::   ln_dynvor_msk   !: vorticity multiplied by fmask (=T) or not (=F) (all vorticity schemes) 
     57 
     58   INTEGER ::   nvor_scheme        ! choice of the type of advection scheme 
     59   !                               ! associated indices: 
     60   INTEGER, PUBLIC, PARAMETER ::   np_ENE = 1   ! ENE scheme 
     61   INTEGER, PUBLIC, PARAMETER ::   np_ENS = 2   ! ENS scheme 
     62   INTEGER, PUBLIC, PARAMETER ::   np_MIX = 3   ! MIX scheme 
     63   INTEGER, PUBLIC, PARAMETER ::   np_EEN = 4   ! EEN scheme 
     64 
     65   INTEGER ::   ncor, nrvm, ntot   ! choice of calculated vorticity  
     66   !                               ! associated indices: 
     67   INTEGER, PARAMETER ::   np_COR = 1         ! Coriolis (planetary) 
     68   INTEGER, PARAMETER ::   np_RVO = 2         ! relative vorticity 
     69   INTEGER, PARAMETER ::   np_MET = 3         ! metric term 
     70   INTEGER, PARAMETER ::   np_CRV = 4         ! relative + planetary (total vorticity) 
     71   INTEGER, PARAMETER ::   np_CME = 5         ! Coriolis + metric term 
     72    
     73   REAL(wp) ::   r1_4  = 0.250_wp         ! =1/4 
     74   REAL(wp) ::   r1_8  = 0.125_wp         ! =1/8 
     75   REAL(wp) ::   r1_12 = 1._wp / 12._wp   ! 1/12 
     76    
    6077   !! * Substitutions 
    6178#  include "domzgr_substitute.h90" 
    6279#  include "vectopt_loop_substitute.h90" 
    6380   !!---------------------------------------------------------------------- 
    64    !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     81   !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
    6582   !! $Id$ 
    6683   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    87104      IF( l_trddyn )   CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
    88105      ! 
    89       !                                          ! vorticity term  
    90       SELECT CASE ( nvor )                       ! compute the vorticity trend and add it to the general trend 
    91       ! 
    92       CASE ( -1 )                                      ! esopa: test all possibility with control print 
    93          CALL vor_ene( kt, ntot, ua, va ) 
    94          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor0 - Ua: ', mask1=umask, & 
    95             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    96          CALL vor_ens( kt, ntot, ua, va ) 
    97          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor1 - Ua: ', mask1=umask, & 
    98             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    99          CALL vor_mix( kt ) 
    100          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor2 - Ua: ', mask1=umask, & 
    101             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    102          CALL vor_een( kt, ntot, ua, va ) 
    103          CALL prt_ctl( tab3d_1=ua, clinfo1=' vor3 - Ua: ', mask1=umask, & 
    104             &          tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    105          ! 
    106       CASE ( 0 )                                       ! energy conserving scheme 
    107          IF( l_trddyn )   THEN 
    108             ztrdu(:,:,:) = ua(:,:,:) 
    109             ztrdv(:,:,:) = va(:,:,:) 
    110             CALL vor_ene( kt, nrvm, ua, va )                ! relative vorticity or metric trend 
     106      SELECT CASE ( nvor_scheme )               !==  vorticity trend added to the general trend  ==! 
     107      ! 
     108      CASE ( np_ENE )                                 !* energy conserving scheme 
     109         IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     110            ztrdu(:,:,:) = ua(:,:,:) 
     111            ztrdv(:,:,:) = va(:,:,:) 
     112            CALL vor_ene( kt, nrvm, ua, va )                      ! relative vorticity or metric trend 
    111113            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    112114            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    114116            ztrdu(:,:,:) = ua(:,:,:) 
    115117            ztrdv(:,:,:) = va(:,:,:) 
    116             CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend 
     118            CALL vor_ene( kt, ncor, ua, va )                      ! planetary vorticity trend 
    117119            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    118120            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    119121            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    120122         ELSE 
    121             CALL vor_ene( kt, ntot, ua, va )                ! total vorticity 
    122          ENDIF 
    123          ! 
    124       CASE ( 1 )                                       ! enstrophy conserving scheme 
    125          IF( l_trddyn )   THEN     
    126             ztrdu(:,:,:) = ua(:,:,:) 
    127             ztrdv(:,:,:) = va(:,:,:) 
    128             CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend 
     123            CALL vor_ene( kt, ntot, ua, va )                ! total vorticity trend 
     124         ENDIF 
     125         ! 
     126      CASE ( np_ENS )                                 !* enstrophy conserving scheme 
     127         IF( l_trddyn ) THEN                                ! trend diagnostics: splitthe trend in two     
     128            ztrdu(:,:,:) = ua(:,:,:) 
     129            ztrdv(:,:,:) = va(:,:,:) 
     130            CALL vor_ens( kt, nrvm, ua, va )                      ! relative vorticity or metric trend 
    129131            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    130132            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    132134            ztrdu(:,:,:) = ua(:,:,:) 
    133135            ztrdv(:,:,:) = va(:,:,:) 
    134             CALL vor_ens( kt, ncor, ua, va )                ! planetary vorticity trend 
     136            CALL vor_ens( kt, ncor, ua, va )                      ! planetary vorticity trend 
    135137            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    136138            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    137139            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    138140         ELSE 
    139             CALL vor_ens( kt, ntot, ua, va )                ! total vorticity 
    140          ENDIF 
    141          ! 
    142       CASE ( 2 )                                       ! mixed ene-ens scheme 
    143          IF( l_trddyn )   THEN 
    144             ztrdu(:,:,:) = ua(:,:,:) 
    145             ztrdv(:,:,:) = va(:,:,:) 
    146             CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend (ens) 
     141            CALL vor_ens( kt, ntot, ua, va )                ! total vorticity trend 
     142         ENDIF 
     143         ! 
     144      CASE ( np_MIX )                                 !* mixed ene-ens scheme 
     145         IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     146            ztrdu(:,:,:) = ua(:,:,:) 
     147            ztrdv(:,:,:) = va(:,:,:) 
     148            CALL vor_ens( kt, nrvm, ua, va )                      ! relative vorticity or metric trend (ens) 
    147149            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    148150            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    150152            ztrdu(:,:,:) = ua(:,:,:) 
    151153            ztrdv(:,:,:) = va(:,:,:) 
    152             CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend (ene) 
     154            CALL vor_ene( kt, ncor, ua, va )                      ! planetary vorticity trend (ene) 
    153155            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    154156            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    155157            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    156158         ELSE 
    157             CALL vor_mix( kt )                               ! total vorticity (mix=ens-ene) 
    158          ENDIF 
    159          ! 
    160       CASE ( 3 )                                       ! energy and enstrophy conserving scheme 
    161          IF( l_trddyn )   THEN 
    162             ztrdu(:,:,:) = ua(:,:,:) 
    163             ztrdv(:,:,:) = va(:,:,:) 
    164             CALL vor_een( kt, nrvm, ua, va )                ! relative vorticity or metric trend 
     159            CALL vor_ens( kt, nrvm, ua, va )                ! relative vorticity or metric trend (ens) 
     160            CALL vor_ene( kt, ncor, ua, va )                ! planetary vorticity trend (ene) 
     161        ENDIF 
     162         ! 
     163      CASE ( np_EEN )                                 !* energy and enstrophy conserving scheme 
     164         IF( l_trddyn ) THEN                                ! trend diagnostics: split the trend in two 
     165            ztrdu(:,:,:) = ua(:,:,:) 
     166            ztrdv(:,:,:) = va(:,:,:) 
     167            CALL vor_een( kt, nrvm, ua, va )                      ! relative vorticity or metric trend 
    165168            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    166169            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     
    168171            ztrdu(:,:,:) = ua(:,:,:) 
    169172            ztrdv(:,:,:) = va(:,:,:) 
    170             CALL vor_een( kt, ncor, ua, va )                ! planetary vorticity trend 
     173            CALL vor_een( kt, ncor, ua, va )                      ! planetary vorticity trend 
    171174            ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
    172175            ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
    173176            CALL trd_dyn( ztrdu, ztrdv, jpdyn_pvo, kt ) 
    174177         ELSE 
    175             CALL vor_een( kt, ntot, ua, va )                ! total vorticity 
     178            CALL vor_een( kt, ntot, ua, va )                ! total vorticity trend 
    176179         ENDIF 
    177180         ! 
     
    197200      !! 
    198201      !! ** Method  :   Trend evaluated using now fields (centered in time)  
    199       !!      and the Sadourny (1975) flux form formulation : conserves the 
    200       !!      horizontal kinetic energy. 
    201       !!      The trend of the vorticity term is given by: 
    202       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 
    203       !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f  mi(e1v*e3v vn) ] 
    204       !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f  mj(e2u*e3u un) ] 
    205       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    206       !!          voru = 1/e1u  mj-1[ (rotn+f)  mi(e1v vn) ] 
    207       !!          vorv = 1/e2v  mi-1[ (rotn+f)  mj(e2u un) ] 
    208       !!      Add this trend to the general momentum trend (ua,va): 
    209       !!          (ua,va) = (ua,va) + ( voru , vorv ) 
     202      !!       and the Sadourny (1975) flux form formulation : conserves the 
     203      !!       horizontal kinetic energy. 
     204      !!         The general trend of momentum is increased due to the vorticity  
     205      !!       term which is given by: 
     206      !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f  mi(e1v*e3v vn) ] 
     207      !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f  mj(e2u*e3u un) ] 
     208      !!       where rvor is the relative vorticity 
    210209      !! 
    211210      !! ** Action : - Update (ua,va) with the now vorticity term trend 
     
    213212      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    214213      !!---------------------------------------------------------------------- 
    215       ! 
    216214      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    217215      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
     
    220218      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    221219      ! 
    222       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    223       REAL(wp) ::   zx1, zy1, zfact2, zx2, zy2   ! local scalars 
    224       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz 
     220      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
     221      REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars 
     222      REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, zwy, zwz   ! 2D workspace 
    225223      !!---------------------------------------------------------------------- 
    226224      ! 
     
    234232         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    235233      ENDIF 
    236  
    237       zfact2 = 0.5 * 0.5      ! Local constant initialization 
    238  
    239 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 
     234      ! 
    240235      !                                                ! =============== 
    241236      DO jk = 1, jpkm1                                 ! Horizontal slab 
    242237         !                                             ! =============== 
    243238         ! 
    244          ! Potential vorticity and horizontal fluxes 
    245          ! ----------------------------------------- 
    246          SELECT CASE( kvor )      ! vorticity considered 
    247          CASE ( 1 )   ;   zwz(:,:) =                  ff(:,:)      ! planetary vorticity (Coriolis) 
    248          CASE ( 2 )   ;   zwz(:,:) =   rotn(:,:,jk)                ! relative  vorticity 
    249          CASE ( 3 )                                                ! metric term 
     239         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     240         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
     241            zwz(:,:) = ff(:,:)  
     242         CASE ( np_RVO )                           !* relative vorticity 
     243            DO jj = 1, jpjm1 
     244               DO ji = 1, fs_jpim1   ! vector opt. 
     245                  zwz(ji,jj) = (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     246                     &          - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     247               END DO 
     248            END DO 
     249         CASE ( np_MET )                           !* metric term 
    250250            DO jj = 1, jpjm1 
    251251               DO ji = 1, fs_jpim1   ! vector opt. 
    252252                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    253253                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    254                        &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 
    255                END DO 
    256             END DO 
    257          CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) )    ! total (relative + planetary vorticity) 
    258          CASE ( 5 )                                                ! total (coriolis + metric) 
    259             DO jj = 1, jpjm1 
    260                DO ji = 1, fs_jpim1   ! vector opt. 
    261                   zwz(ji,jj) = ( ff (ji,jj)                                                                       & 
    262                        &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    263                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    264                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                               & 
    265                        &       ) 
    266                END DO 
    267             END DO 
     254                       &     * 0.5 * r1_e1e2f(ji,jj) 
     255               END DO 
     256            END DO 
     257         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
     258            DO jj = 1, jpjm1 
     259               DO ji = 1, fs_jpim1   ! vector opt. 
     260                  zwz(ji,jj) = ff(ji,jj) + (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     261                     &                      - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     262                     &                   * r1_e1e2f(ji,jj) 
     263               END DO 
     264            END DO 
     265         CASE ( np_CME )                           !* Coriolis + metric 
     266            DO jj = 1, jpjm1 
     267               DO ji = 1, fs_jpim1   ! vector opt. 
     268                  zwz(ji,jj) = ff(ji,jj)                                                                        & 
     269                       &     + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
     270                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
     271                       &     * 0.5 * r1_e1e2f(ji,jj) 
     272               END DO 
     273            END DO 
     274         CASE DEFAULT                                             ! error 
     275            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
    268276         END SELECT 
     277         ! 
     278         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
     279            DO jj = 1, jpjm1 
     280               DO ji = 1, fs_jpim1   ! vector opt. 
     281                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     282               END DO 
     283            END DO 
     284         ENDIF 
    269285 
    270286         IF( ln_sco ) THEN 
     
    276292            zwy(:,:) = e1v(:,:) * vn(:,:,jk) 
    277293         ENDIF 
    278  
    279          ! Compute and add the vorticity term trend 
    280          ! ---------------------------------------- 
     294         !                                   !==  compute and add the vorticity term trend  =! 
    281295         DO jj = 2, jpjm1 
    282296            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    285299               zx1 = zwx(ji-1,jj) + zwx(ji-1,jj+1) 
    286300               zx2 = zwx(ji  ,jj) + zwx(ji  ,jj+1) 
    287                pua(ji,jj,jk) = pua(ji,jj,jk) + zfact2 / e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    288                pva(ji,jj,jk) = pva(ji,jj,jk) - zfact2 / e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
     301               pua(ji,jj,jk) = pua(ji,jj,jk) + r1_4 * r1_e1u(ji,jj) * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     302               pva(ji,jj,jk) = pva(ji,jj,jk) - r1_4 * r1_e2v(ji,jj) * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 )  
    289303            END DO   
    290304         END DO   
     
    299313 
    300314 
    301    SUBROUTINE vor_mix( kt ) 
    302       !!---------------------------------------------------------------------- 
    303       !!                 ***  ROUTINE vor_mix  *** 
    304       !! 
    305       !! ** Purpose :   Compute the now total vorticity trend and add it to 
    306       !!      the general trend of the momentum equation. 
    307       !! 
    308       !! ** Method  :   Trend evaluated using now fields (centered in time) 
    309       !!      Mixte formulation : conserves the potential enstrophy of a hori- 
    310       !!      zontally non-divergent flow for (rotzu x uh), the relative vor- 
    311       !!      ticity term and the horizontal kinetic energy for (f x uh), the 
    312       !!      coriolis term. the now trend of the vorticity term is given by: 
    313       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivatives: 
    314       !!          voru = 1/e1u  mj-1(rotn/e3f) mj-1[ mi(e1v*e3v vn) ] 
    315       !!              +1/e1u  mj-1[ f/e3f          mi(e1v*e3v vn) ] 
    316       !!          vorv = 1/e2v  mi-1(rotn/e3f) mi-1[ mj(e2u*e3u un) ] 
    317       !!              +1/e2v  mi-1[ f/e3f          mj(e2u*e3u un) ] 
    318       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    319       !!          voru = 1/e1u  mj-1(rotn) mj-1[ mi(e1v vn) ] 
    320       !!              +1/e1u  mj-1[ f          mi(e1v vn) ] 
    321       !!          vorv = 1/e2v  mi-1(rotn) mi-1[ mj(e2u un) ] 
    322       !!              +1/e2v  mi-1[ f          mj(e2u un) ] 
    323       !!      Add this now trend to the general momentum trend (ua,va): 
    324       !!          (ua,va) = (ua,va) + ( voru , vorv ) 
    325       !! 
    326       !! ** Action : - Update (ua,va) arrays with the now vorticity term trend 
    327       !! 
    328       !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    329       !!---------------------------------------------------------------------- 
    330       ! 
    331       INTEGER, INTENT(in) ::   kt   ! ocean timestep index 
    332       ! 
    333       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    334       REAL(wp) ::   zfact1, zua, zcua, zx1, zy1   ! local scalars 
    335       REAL(wp) ::   zfact2, zva, zcva, zx2, zy2   !   -      - 
    336       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww 
    337       !!---------------------------------------------------------------------- 
    338       ! 
    339       IF( nn_timing == 1 )  CALL timing_start('vor_mix') 
    340       ! 
    341       CALL wrk_alloc( jpi, jpj, zwx, zwy, zwz, zww )  
    342       ! 
    343       IF( kt == nit000 ) THEN 
    344          IF(lwp) WRITE(numout,*) 
    345          IF(lwp) WRITE(numout,*) 'dyn:vor_mix : vorticity term: mixed energy/enstrophy conserving scheme' 
    346          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    347       ENDIF 
    348  
    349       zfact1 = 0.5 * 0.25      ! Local constant initialization 
    350       zfact2 = 0.5 * 0.5 
    351  
    352 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, zww ) 
    353       !                                                ! =============== 
    354       DO jk = 1, jpkm1                                 ! Horizontal slab 
    355          !                                             ! =============== 
    356          ! 
    357          ! Relative and planetary potential vorticity and horizontal fluxes 
    358          ! ---------------------------------------------------------------- 
    359          IF( ln_sco ) THEN         
    360             IF( ln_dynadv_vec ) THEN 
    361                zww(:,:) = rotn(:,:,jk) / fse3f(:,:,jk) 
    362             ELSE                        
    363                DO jj = 1, jpjm1 
    364                   DO ji = 1, fs_jpim1   ! vector opt. 
    365                      zww(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    366                         &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    367                         &       * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) * fse3f(ji,jj,jk) ) 
    368                   END DO 
    369                END DO 
    370             ENDIF 
    371             zwz(:,:) = ff  (:,:)    / fse3f(:,:,jk) 
    372             zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
    373             zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    374          ELSE 
    375             IF( ln_dynadv_vec ) THEN 
    376                zww(:,:) = rotn(:,:,jk) 
    377             ELSE                        
    378                DO jj = 1, jpjm1 
    379                   DO ji = 1, fs_jpim1   ! vector opt. 
    380                      zww(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    381                         &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    382                         &       * 0.5 / ( e1f(ji,jj) * e2f (ji,jj) ) 
    383                   END DO 
    384                END DO 
    385             ENDIF 
    386             zwz(:,:) = ff (:,:) 
    387             zwx(:,:) = e2u(:,:) * un(:,:,jk) 
    388             zwy(:,:) = e1v(:,:) * vn(:,:,jk) 
    389          ENDIF 
    390  
    391          ! Compute and add the vorticity term trend 
    392          ! ---------------------------------------- 
    393          DO jj = 2, jpjm1 
    394             DO ji = fs_2, fs_jpim1   ! vector opt. 
    395                zy1 = ( zwy(ji,jj-1) + zwy(ji+1,jj-1) ) / e1u(ji,jj) 
    396                zy2 = ( zwy(ji,jj  ) + zwy(ji+1,jj  ) ) / e1u(ji,jj) 
    397                zx1 = ( zwx(ji-1,jj) + zwx(ji-1,jj+1) ) / e2v(ji,jj) 
    398                zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) / e2v(ji,jj) 
    399                ! enstrophy conserving formulation for relative vorticity term 
    400                zua = zfact1 * ( zww(ji  ,jj-1) + zww(ji,jj) ) * ( zy1 + zy2 ) 
    401                zva =-zfact1 * ( zww(ji-1,jj  ) + zww(ji,jj) ) * ( zx1 + zx2 ) 
    402                ! energy conserving formulation for planetary vorticity term 
    403                zcua = zfact2 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    404                zcva =-zfact2 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    405                ! mixed vorticity trend added to the momentum trends 
    406                ua(ji,jj,jk) = ua(ji,jj,jk) + zcua + zua 
    407                va(ji,jj,jk) = va(ji,jj,jk) + zcva + zva 
    408             END DO   
    409          END DO   
    410          !                                             ! =============== 
    411       END DO                                           !   End of slab 
    412       !                                                ! =============== 
    413       CALL wrk_dealloc( jpi, jpj, zwx, zwy, zwz, zww )  
    414       ! 
    415       IF( nn_timing == 1 )  CALL timing_stop('vor_mix') 
    416       ! 
    417    END SUBROUTINE vor_mix 
    418  
    419  
    420315   SUBROUTINE vor_ens( kt, kvor, pua, pva ) 
    421316      !!---------------------------------------------------------------------- 
     
    429324      !!      potential enstrophy of a horizontally non-divergent flow. the 
    430325      !!      trend of the vorticity term is given by: 
    431       !!       * s-coordinate (ln_sco=T), the e3. are inside the derivative: 
    432       !!          voru = 1/e1u  mj-1[ (rotn+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ] 
    433       !!          vorv = 1/e2v  mi-1[ (rotn+f)/e3f ]  mi-1[ mj(e2u*e3u un) ] 
    434       !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes: 
    435       !!          voru = 1/e1u  mj-1[ rotn+f ]  mj-1[ mi(e1v vn) ] 
    436       !!          vorv = 1/e2v  mi-1[ rotn+f ]  mi-1[ mj(e2u un) ] 
     326      !!          voru = 1/e1u  mj-1[ (rvor+f)/e3f ]  mj-1[ mi(e1v*e3v vn) ] 
     327      !!          vorv = 1/e2v  mi-1[ (rvor+f)/e3f ]  mi-1[ mj(e2u*e3u un) ] 
    437328      !!      Add this trend to the general momentum trend (ua,va): 
    438329      !!          (ua,va) = (ua,va) + ( voru , vorv ) 
     
    442333      !! References : Sadourny, r., 1975, j. atmos. sciences, 32, 680-689. 
    443334      !!---------------------------------------------------------------------- 
    444       ! 
    445335      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    446336      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
     
    449339      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    450340      ! 
    451       INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    452       REAL(wp) ::   zfact1, zuav, zvau   ! temporary scalars 
    453       REAL(wp), POINTER, DIMENSION(:,:) :: zwx, zwy, zwz, zww 
     341      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     342      REAL(wp) ::   zuav, zvau   ! local scalars 
     343      REAL(wp), POINTER, DIMENSION(:,:) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    454344      !!---------------------------------------------------------------------- 
    455345      ! 
     
    463353         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    464354      ENDIF 
    465  
    466       zfact1 = 0.5 * 0.25      ! Local constant initialization 
    467  
    468 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz ) 
    469355      !                                                ! =============== 
    470356      DO jk = 1, jpkm1                                 ! Horizontal slab 
    471357         !                                             ! =============== 
    472358         ! 
    473          ! Potential vorticity and horizontal fluxes 
    474          ! ----------------------------------------- 
    475          SELECT CASE( kvor )      ! vorticity considered 
    476          CASE ( 1 )   ;   zwz(:,:) =                  ff(:,:)      ! planetary vorticity (Coriolis) 
    477          CASE ( 2 )   ;   zwz(:,:) =   rotn(:,:,jk)                ! relative  vorticity 
    478          CASE ( 3 )                                                ! metric term 
     359         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     360         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
     361            zwz(:,:) = ff(:,:)  
     362         CASE ( np_RVO )                           !* relative vorticity 
     363            DO jj = 1, jpjm1 
     364               DO ji = 1, fs_jpim1   ! vector opt. 
     365                  zwz(ji,jj) = (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     366                     &          - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
     367               END DO 
     368            END DO 
     369         CASE ( np_MET )                           !* metric term 
    479370            DO jj = 1, jpjm1 
    480371               DO ji = 1, fs_jpim1   ! vector opt. 
    481372                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    482373                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    483                        &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) 
    484                END DO 
    485             END DO 
    486          CASE ( 4 )   ;   zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) )    ! total (relative + planetary vorticity) 
    487          CASE ( 5 )                                                ! total (coriolis + metric) 
    488             DO jj = 1, jpjm1 
    489                DO ji = 1, fs_jpim1   ! vector opt. 
    490                   zwz(ji,jj) = ( ff (ji,jj)                                                                       & 
    491                        &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    492                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    493                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                & 
    494                        &       ) 
    495                END DO 
    496             END DO 
     374                       &     * 0.5 * r1_e1e2f(ji,jj) 
     375               END DO 
     376            END DO 
     377         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
     378            DO jj = 1, jpjm1 
     379               DO ji = 1, fs_jpim1   ! vector opt. 
     380                  zwz(ji,jj) = ff(ji,jj) + (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     381                     &                      - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     382                     &                   * r1_e1e2f(ji,jj) 
     383               END DO 
     384            END DO 
     385         CASE ( np_CME )                           !* Coriolis + metric 
     386            DO jj = 1, jpjm1 
     387               DO ji = 1, fs_jpim1   ! vector opt. 
     388                  zwz(ji,jj) = ff(ji,jj)                                                                       & 
     389                       &     + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
     390                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
     391                       &     * 0.5 * r1_e1e2f(ji,jj) 
     392               END DO 
     393            END DO 
     394         CASE DEFAULT                                             ! error 
     395            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
    497396         END SELECT 
    498397         ! 
    499          IF( ln_sco ) THEN 
    500             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop  
    501                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    502                   zwz(ji,jj) = zwz(ji,jj) / fse3f(ji,jj,jk) 
    503                   zwx(ji,jj) = e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk) 
    504                   zwy(ji,jj) = e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk) 
    505                END DO 
    506             END DO 
     398         IF( ln_dynvor_msk ) THEN           !==  mask/unmask vorticity ==! 
     399            DO jj = 1, jpjm1 
     400               DO ji = 1, fs_jpim1   ! vector opt. 
     401                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     402               END DO 
     403            END DO 
     404         ENDIF 
     405         ! 
     406         IF( ln_sco ) THEN                   !==  horizontal fluxes  ==! 
     407            zwz(:,:) = zwz(:,:) / fse3f(:,:,jk) 
     408            zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
     409            zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    507410         ELSE 
    508             DO jj = 1, jpj                      ! caution: don't use (:,:) for this loop  
    509                DO ji = 1, jpi                   ! it causes optimization problems on NEC in auto-tasking 
    510                   zwx(ji,jj) = e2u(ji,jj) * un(ji,jj,jk) 
    511                   zwy(ji,jj) = e1v(ji,jj) * vn(ji,jj,jk) 
    512                END DO 
    513             END DO 
    514          ENDIF 
    515          ! 
    516          ! Compute and add the vorticity term trend 
    517          ! ---------------------------------------- 
     411            zwx(:,:) = e2u(:,:) * un(:,:,jk) 
     412            zwy(:,:) = e1v(:,:) * vn(:,:,jk) 
     413         ENDIF 
     414         !                                   !==  compute and add the vorticity term trend  =! 
    518415         DO jj = 2, jpjm1 
    519416            DO ji = fs_2, fs_jpim1   ! vector opt. 
    520                zuav = zfact1 / e1u(ji,jj) * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
    521                   &                         + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) 
    522                zvau =-zfact1 / e2v(ji,jj) * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
    523                   &                         + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) 
     417               zuav = r1_8 * r1_e1u(ji,jj) * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1)   & 
     418                  &                       + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) 
     419               zvau =-r1_8 * r1_e2v(ji,jj) * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1)   & 
     420                  &                       + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) 
    524421               pua(ji,jj,jk) = pua(ji,jj,jk) + zuav * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
    525422               pva(ji,jj,jk) = pva(ji,jj,jk) + zvau * ( zwz(ji-1,jj  ) + zwz(ji,jj) ) 
     
    553450      !! References : Arakawa and Lamb 1980, Mon. Wea. Rev., 109, 18-36 
    554451      !!---------------------------------------------------------------------- 
    555       ! 
    556452      INTEGER , INTENT(in   )                         ::   kt     ! ocean time-step index 
    557       INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; 
    558       !                                                           ! =nrvm (relative vorticity or metric) 
     453      INTEGER , INTENT(in   )                         ::   kvor   ! =ncor (planetary) ; =ntot (total) ; =nrvm (relative or metric) 
    559454      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pua    ! total u-trend 
    560455      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pva    ! total v-trend 
    561       !! 
    562       INTEGER  ::   ji, jj, jk                                    ! dummy loop indices 
    563       INTEGER  ::   ierr                                          ! local integer 
    564       REAL(wp) ::   zfac12, zua, zva                              ! local scalars 
    565       REAL(wp) ::   zmsk, ze3                                     ! local scalars 
    566       !                                                           !  3D workspace  
    567       REAL(wp), POINTER    , DIMENSION(:,:  )         :: zwx, zwy, zwz 
    568       REAL(wp), POINTER    , DIMENSION(:,:  )         :: ztnw, ztne, ztsw, ztse 
    569 #if defined key_vvl 
    570       REAL(wp), POINTER    , DIMENSION(:,:,:)         :: ze3f     !  3D workspace (lk_vvl=T) 
    571 #else 
    572       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE   :: ze3f     ! lk_vvl=F, ze3f=1/e3f saved one for all 
    573 #endif 
     456      ! 
     457      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     458      INTEGER  ::   ierr         ! local integer 
     459      REAL(wp) ::   zua, zva     ! local scalars 
     460      REAL(wp) ::   zmsk, ze3    ! local scalars 
     461      ! 
     462      REAL(wp), POINTER, DIMENSION(:,:)   :: zwx, zwy, zwz, z1_e3f 
     463      REAL(wp), POINTER, DIMENSION(:,:)   :: ztnw, ztne, ztsw, ztse 
    574464      !!---------------------------------------------------------------------- 
    575465      ! 
    576466      IF( nn_timing == 1 )  CALL timing_start('vor_een') 
    577467      ! 
    578       CALL wrk_alloc( jpi, jpj,      zwx , zwy , zwz        )  
    579       CALL wrk_alloc( jpi, jpj,      ztnw, ztne, ztsw, ztse )  
    580 #if defined key_vvl 
    581       CALL wrk_alloc( jpi, jpj, jpk, ze3f                   ) 
    582 #endif 
     468      CALL wrk_alloc( jpi,jpj,   zwx , zwy , zwz , z1_e3f )  
     469      CALL wrk_alloc( jpi,jpj,   ztnw, ztne, ztsw, ztse   )  
    583470      ! 
    584471      IF( kt == nit000 ) THEN 
     
    586473         IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
    587474         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    588 #if ! defined key_vvl 
    589          IF( .NOT.ALLOCATED(ze3f) ) THEN 
    590             ALLOCATE( ze3f(jpi,jpj,jpk) , STAT=ierr ) 
    591             IF( lk_mpp    )   CALL mpp_sum ( ierr ) 
    592             IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'dyn:vor_een : unable to allocate arrays' ) 
    593          ENDIF 
    594          ze3f(:,:,:) = 0._wp 
    595 #endif 
    596475      ENDIF 
    597  
    598       IF( kt == nit000 .OR. lk_vvl ) THEN      ! reciprocal of e3 at F-point (masked averaging of e3t over ocean points) 
    599  
    600          IF( ln_dynvor_een_old ) THEN ! original formulation 
    601             DO jk = 1, jpk 
    602                DO jj = 1, jpjm1 
    603                   DO ji = 1, jpim1 
    604                      ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
    605                         &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
    606                      IF( ze3 /= 0._wp )   ze3f(ji,jj,jk) = 4.0_wp / ze3 
    607                   END DO 
    608                END DO 
    609             END DO 
    610          ELSE ! new formulation from NEMO 3.6 
    611             DO jk = 1, jpk 
    612                DO jj = 1, jpjm1 
    613                   DO ji = 1, jpim1 
    614                      ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
    615                         &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
    616                      zmsk = (                   tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
    617                         &                     + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk) ) 
    618                      IF( ze3 /= 0._wp )   ze3f(ji,jj,jk) = zmsk / ze3 
    619                   END DO 
    620                END DO 
    621             END DO 
    622          ENDIF 
    623  
    624          CALL lbc_lnk( ze3f, 'F', 1. ) 
    625       ENDIF 
    626  
    627       zfac12 = 1._wp / 12._wp    ! Local constant initialization 
    628  
    629        
    630 !CDIR PARALLEL DO PRIVATE( zwx, zwy, zwz, ztnw, ztne, ztsw, ztse ) 
     476      ! 
    631477      !                                                ! =============== 
    632478      DO jk = 1, jpkm1                                 ! Horizontal slab 
    633479         !                                             ! =============== 
    634           
    635          ! Potential vorticity and horizontal fluxes 
    636          ! ----------------------------------------- 
    637          SELECT CASE( kvor )      ! vorticity considered 
    638          CASE ( 1 )                                                ! planetary vorticity (Coriolis) 
    639             zwz(:,:) = ff(:,:)      * ze3f(:,:,jk) 
    640          CASE ( 2 )                                                ! relative  vorticity 
    641             zwz(:,:) = rotn(:,:,jk) * ze3f(:,:,jk) 
    642          CASE ( 3 )                                                ! metric term 
     480         ! 
     481         SELECT CASE( nn_een_e3f )           ! == reciprocal of e3 at F-point 
     482         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
     483            DO jj = 1, jpjm1 
     484               DO ji = 1, fs_jpim1   ! vector opt. 
     485                  ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
     486                     &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
     487                  IF( ze3 /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = 4.0_wp / ze3 
     488                  ELSE                      ;   z1_e3f(ji,jj) = 0.0_wp 
     489                  ENDIF 
     490               END DO 
     491            END DO 
     492         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
     493            DO jj = 1, jpjm1 
     494               DO ji = 1, fs_jpim1   ! vector opt. 
     495                  ze3  = ( fse3t(ji,jj+1,jk)*tmask(ji,jj+1,jk) + fse3t(ji+1,jj+1,jk)*tmask(ji+1,jj+1,jk)   & 
     496                     &   + fse3t(ji,jj  ,jk)*tmask(ji,jj  ,jk) + fse3t(ji+1,jj  ,jk)*tmask(ji+1,jj  ,jk) ) 
     497                  zmsk = (                   tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
     498                     &                     + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk) ) 
     499                  IF( ze3 /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = zmsk / ze3 
     500                  ELSE                      ;   z1_e3f(ji,jj) = 0.0_wp 
     501                  ENDIF 
     502               END DO 
     503            END DO 
     504         END SELECT 
     505         ! 
     506         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
     507         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
     508            DO jj = 1, jpjm1 
     509               DO ji = 1, fs_jpim1   ! vector opt. 
     510                  zwz(ji,jj) = ff(ji,jj) * z1_e3f(ji,jj) 
     511               END DO 
     512            END DO 
     513         CASE ( np_RVO )                           !* relative vorticity 
     514            DO jj = 1, jpjm1 
     515               DO ji = 1, fs_jpim1   ! vector opt. 
     516                  zwz(ji,jj) = (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     517                     &          - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     518                     &       * r1_e1e2f(ji,jj) * z1_e3f(ji,jj) 
     519               END DO 
     520            END DO 
     521         CASE ( np_MET )                           !* metric term 
    643522            DO jj = 1, jpjm1 
    644523               DO ji = 1, fs_jpim1   ! vector opt. 
    645524                  zwz(ji,jj) = (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    646525                       &         - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    647                        &     * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) ) * ze3f(ji,jj,jk) 
    648                END DO 
    649             END DO 
    650             CALL lbc_lnk( zwz, 'F', 1. ) 
    651         CASE ( 4 )                                                ! total (relative + planetary vorticity) 
    652             zwz(:,:) = ( rotn(:,:,jk) + ff(:,:) ) * ze3f(:,:,jk) 
    653          CASE ( 5 )                                                ! total (coriolis + metric) 
    654             DO jj = 1, jpjm1 
    655                DO ji = 1, fs_jpim1   ! vector opt. 
    656                   zwz(ji,jj) = ( ff (ji,jj)                                                                       & 
    657                        &       + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
    658                        &           - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
    659                        &       * 0.5 / ( e1f(ji,jj) * e2f(ji,jj) )                                                & 
    660                        &       ) * ze3f(ji,jj,jk) 
    661                END DO 
    662             END DO 
    663             CALL lbc_lnk( zwz, 'F', 1. ) 
     526                       &     * 0.5 * r1_e1e2f(ji,jj) * z1_e3f(ji,jj) 
     527               END DO 
     528            END DO 
     529         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
     530            DO jj = 1, jpjm1 
     531               DO ji = 1, fs_jpim1   ! vector opt. 
     532                  zwz(ji,jj) = (  ff(ji,jj) + (  e2v(ji+1,jj  ) * vn(ji+1,jj  ,jk) - e2v(ji,jj) * vn(ji,jj,jk)    & 
     533                     &                         - e1u(ji  ,jj+1) * un(ji  ,jj+1,jk) + e1u(ji,jj) * un(ji,jj,jk)  ) & 
     534                     &                      * r1_e1e2f(ji,jj)    ) * z1_e3f(ji,jj) 
     535               END DO 
     536            END DO 
     537         CASE ( np_CME )                           !* Coriolis + metric 
     538            DO jj = 1, jpjm1 
     539               DO ji = 1, fs_jpim1   ! vector opt. 
     540                  zwz(ji,jj) = (  ff(ji,jj)                                                                        & 
     541                       &        + (   ( vn(ji+1,jj  ,jk) + vn (ji,jj,jk) ) * ( e2v(ji+1,jj  ) - e2v(ji,jj) )       & 
     542                       &            - ( un(ji  ,jj+1,jk) + un (ji,jj,jk) ) * ( e1u(ji  ,jj+1) - e1u(ji,jj) )   )   & 
     543                       &        * 0.5 * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     544               END DO 
     545            END DO 
     546         CASE DEFAULT                                             ! error 
     547            CALL ctl_stop('STOP','dyn_vor: wrong value for kvor'  ) 
    664548         END SELECT 
    665  
     549         ! 
     550         IF( ln_dynvor_msk ) THEN          !==  mask/unmask vorticity ==! 
     551            DO jj = 1, jpjm1 
     552               DO ji = 1, fs_jpim1   ! vector opt. 
     553                  zwz(ji,jj) = zwz(ji,jj) * fmask(ji,jj,jk) 
     554               END DO 
     555            END DO 
     556         ENDIF 
     557         ! 
     558         CALL lbc_lnk( zwz, 'F', 1. ) 
     559         ! 
     560         !                                   !==  horizontal fluxes  ==! 
    666561         zwx(:,:) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) 
    667562         zwy(:,:) = e1v(:,:) * fse3v(:,:,jk) * vn(:,:,jk) 
    668563 
    669          ! Compute and add the vorticity term trend 
    670          ! ---------------------------------------- 
     564         !                                   !==  compute and add the vorticity term trend  =! 
    671565         jj = 2 
    672566         ztne(1,:) = 0   ;   ztnw(1,:) = 0   ;   ztse(1,:) = 0   ;   ztsw(1,:) = 0 
    673          DO ji = 2, jpi    
     567         DO ji = 2, jpi          ! split in 2 parts due to vector opt. 
    674568               ztne(ji,jj) = zwz(ji-1,jj  ) + zwz(ji  ,jj  ) + zwz(ji  ,jj-1) 
    675569               ztnw(ji,jj) = zwz(ji-1,jj-1) + zwz(ji-1,jj  ) + zwz(ji  ,jj  ) 
     
    687581         DO jj = 2, jpjm1 
    688582            DO ji = fs_2, fs_jpim1   ! vector opt. 
    689                zua = + zfac12 / e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
    690                   &                           + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    691                zva = - zfac12 / e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
    692                   &                           + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
     583               zua = + r1_12 * r1_e1u(ji,jj) * (  ztne(ji,jj  ) * zwy(ji  ,jj  ) + ztnw(ji+1,jj) * zwy(ji+1,jj  )   & 
     584                  &                             + ztse(ji,jj  ) * zwy(ji  ,jj-1) + ztsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
     585               zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw(ji,jj+1) * zwx(ji-1,jj+1) + ztse(ji,jj+1) * zwx(ji  ,jj+1)   & 
     586                  &                             + ztnw(ji,jj  ) * zwx(ji-1,jj  ) + ztne(ji,jj  ) * zwx(ji  ,jj  ) ) 
    693587               pua(ji,jj,jk) = pua(ji,jj,jk) + zua 
    694588               pva(ji,jj,jk) = pva(ji,jj,jk) + zva 
     
    698592      END DO                                           !   End of slab 
    699593      !                                                ! =============== 
    700       CALL wrk_dealloc( jpi, jpj,      zwx , zwy , zwz        )  
    701       CALL wrk_dealloc( jpi, jpj,      ztnw, ztne, ztsw, ztse )  
    702 #if defined key_vvl 
    703       CALL wrk_dealloc( jpi, jpj, jpk, ze3f                   ) 
    704 #endif 
     594      ! 
     595      CALL wrk_dealloc( jpi,jpj,   zwx , zwy , zwz , z1_e3f )  
     596      CALL wrk_dealloc( jpi,jpj,   ztnw, ztne, ztsw, ztse   )  
    705597      ! 
    706598      IF( nn_timing == 1 )  CALL timing_stop('vor_een') 
     
    720612      INTEGER ::   ios             ! Local integer output status for namelist read 
    721613      !! 
    722       NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, ln_dynvor_een_old 
     614      NAMELIST/namdyn_vor/ ln_dynvor_ens, ln_dynvor_ene, ln_dynvor_mix, ln_dynvor_een, nn_een_e3f, ln_dynvor_msk 
    723615      !!---------------------------------------------------------------------- 
    724616 
     
    737629         WRITE(numout,*) '~~~~~~~~~~~~' 
    738630         WRITE(numout,*) '        Namelist namdyn_vor : choice of the vorticity term scheme' 
    739          WRITE(numout,*) '           energy    conserving scheme                ln_dynvor_ene = ', ln_dynvor_ene 
    740          WRITE(numout,*) '           enstrophy conserving scheme                ln_dynvor_ens = ', ln_dynvor_ens 
    741          WRITE(numout,*) '           mixed enstrophy/energy conserving scheme   ln_dynvor_mix = ', ln_dynvor_mix 
    742          WRITE(numout,*) '           enstrophy and energy conserving scheme     ln_dynvor_een = ', ln_dynvor_een 
    743          WRITE(numout,*) '           enstrophy and energy conserving scheme (old) ln_dynvor_een_old= ', ln_dynvor_een_old 
     631         WRITE(numout,*) '           energy    conserving scheme                    ln_dynvor_ene = ', ln_dynvor_ene 
     632         WRITE(numout,*) '           enstrophy conserving scheme                    ln_dynvor_ens = ', ln_dynvor_ens 
     633         WRITE(numout,*) '           mixed enstrophy/energy conserving scheme       ln_dynvor_mix = ', ln_dynvor_mix 
     634         WRITE(numout,*) '           enstrophy and energy conserving scheme         ln_dynvor_een = ', ln_dynvor_een 
     635         WRITE(numout,*) '              e3f = averaging /4 (=0) or /sum(tmask) (=1)    nn_een_e3f = ', nn_een_e3f 
     636         WRITE(numout,*) '           masked (=1) or unmasked(=0) vorticity          ln_dynvor_msk = ', ln_dynvor_msk 
    744637      ENDIF 
    745638 
     639!!gm  this should be removed when choosing a unique strategy for fmask at the coast 
    746640      ! If energy, enstrophy or mixed advection of momentum in vector form change the value for masks 
    747641      ! at angles with three ocean points and one land point 
     642      IF(lwp) WRITE(numout,*) 
     643      IF(lwp) WRITE(numout,*) '           namlbc: change fmask value in the angles (T)   ln_vorlat = ', ln_vorlat 
    748644      IF( ln_vorlat .AND. ( ln_dynvor_ene .OR. ln_dynvor_ens .OR. ln_dynvor_mix ) ) THEN 
    749645         DO jk = 1, jpk 
     
    759655          ! 
    760656      ENDIF 
    761  
    762       ioptio = 0                     ! Control of vorticity scheme options 
    763       IF( ln_dynvor_ene )   ioptio = ioptio + 1 
    764       IF( ln_dynvor_ens )   ioptio = ioptio + 1 
    765       IF( ln_dynvor_mix )   ioptio = ioptio + 1 
    766       IF( ln_dynvor_een )   ioptio = ioptio + 1 
    767       IF( ln_dynvor_een_old )   ioptio = ioptio + 1 
    768       IF( lk_esopa      )   ioptio =          1 
    769  
    770       IF( ioptio /= 1 ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 
    771  
    772       !                              ! Set nvor (type of scheme for vorticity) 
    773       IF( ln_dynvor_ene )   nvor =  0 
    774       IF( ln_dynvor_ens )   nvor =  1 
    775       IF( ln_dynvor_mix )   nvor =  2 
    776       IF( ln_dynvor_een .or. ln_dynvor_een_old )   nvor =  3 
    777       IF( lk_esopa      )   nvor = -1 
    778        
    779       !                              ! Set ncor, nrvm, ntot (type of vorticity) 
    780       IF(lwp) WRITE(numout,*) 
    781       ncor = 1 
     657!!gm end 
     658 
     659      ioptio = 0                     ! type of scheme for vorticity (set nvor_scheme) 
     660      IF( ln_dynvor_ene ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_ENE   ;   ENDIF 
     661      IF( ln_dynvor_ens ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_ENS   ;   ENDIF 
     662      IF( ln_dynvor_mix ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_MIX   ;   ENDIF 
     663      IF( ln_dynvor_een ) THEN   ;   ioptio = ioptio + 1   ;    nvor_scheme = np_EEN   ;   ENDIF 
     664      ! 
     665      IF( ( ioptio /= 1).AND.( .NOT.lk_c1d ) ) CALL ctl_stop( ' use ONE and ONLY one vorticity scheme' ) 
     666      !                       
     667      IF(lwp) WRITE(numout,*)        ! type of calculated vorticity (set ncor, nrvm, ntot) 
     668      ncor = np_COR 
    782669      IF( ln_dynadv_vec ) THEN      
    783670         IF(lwp) WRITE(numout,*) '         Vector form advection : vorticity = Coriolis + relative vorticity' 
    784          nrvm = 2 
    785          ntot = 4 
     671         nrvm = np_RVO        ! relative vorticity 
     672         ntot = np_CRV        ! relative + planetary vorticity 
    786673      ELSE                         
    787674         IF(lwp) WRITE(numout,*) '         Flux form advection   : vorticity = Coriolis + metric term' 
    788          nrvm = 3 
    789          ntot = 5 
     675         nrvm = np_MET        ! metric term 
     676         ntot = np_CME        ! Coriolis + metric term 
    790677      ENDIF 
    791678       
    792679      IF(lwp) THEN                   ! Print the choice 
    793680         WRITE(numout,*) 
    794          IF( nvor ==  0 )   WRITE(numout,*) '         vorticity scheme : energy conserving scheme' 
    795          IF( nvor ==  1 )   WRITE(numout,*) '         vorticity scheme : enstrophy conserving scheme' 
    796          IF( nvor ==  2 )   WRITE(numout,*) '         vorticity scheme : mixed enstrophy/energy conserving scheme' 
    797          IF( nvor ==  3 )   WRITE(numout,*) '         vorticity scheme : energy and enstrophy conserving scheme' 
    798          IF( nvor == -1 )   WRITE(numout,*) '         esopa test: use all lateral physics options' 
     681         IF( nvor_scheme ==  np_ENE )   WRITE(numout,*) '         vorticity scheme ==>> energy conserving scheme' 
     682         IF( nvor_scheme ==  np_ENS )   WRITE(numout,*) '         vorticity scheme ==>> enstrophy conserving scheme' 
     683         IF( nvor_scheme ==  np_MIX )   WRITE(numout,*) '         vorticity scheme ==>> mixed enstrophy/energy conserving scheme' 
     684         IF( nvor_scheme ==  np_EEN )   WRITE(numout,*) '         vorticity scheme ==>> energy and enstrophy conserving scheme' 
    799685      ENDIF 
    800686      ! 
Note: See TracChangeset for help on using the changeset viewer.