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 5956 for branches/2015/dev_r5151_UKMO_ISF/NEMOGCM/NEMO/OPA_SRC/LDF/ldfslp.F90 – NEMO

Ignore:
Timestamp:
2015-11-30T20:55:41+01:00 (8 years ago)
Author:
mathiot
Message:

ISF : merged trunk (5936) into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5151_UKMO_ISF/NEMOGCM/NEMO/OPA_SRC/LDF/ldfslp.F90

    r5944 r5956  
    1111   !!            3.3  ! 2010-10  (G. Nurser, C. Harris, G. Madec)  add Griffies operator 
    1212   !!             -   ! 2010-11  (F. Dupond, G. Madec)  bug correction in slopes just below the ML 
     13   !!            3.7  ! 2013-12  (F. Lemarie, G. Madec)  add limiter on triad slopes 
    1314   !!---------------------------------------------------------------------- 
    14 #if   defined key_ldfslp   ||   defined key_esopa 
     15 
    1516   !!---------------------------------------------------------------------- 
    16    !!   'key_ldfslp'                      Rotation of lateral mixing tensor 
    17    !!---------------------------------------------------------------------- 
    18    !!   ldf_slp_grif  : calculates the triads of isoneutral slopes (Griffies operator) 
    1917   !!   ldf_slp       : calculates the slopes of neutral surface   (Madec operator) 
     18   !!   ldf_slp_triad : calculates the triads of isoneutral slopes (Griffies operator) 
    2019   !!   ldf_slp_mxl   : calculates the slopes at the base of the mixed layer (Madec operator) 
    2120   !!   ldf_slp_init  : initialization of the slopes computation 
     
    2322   USE oce            ! ocean dynamics and tracers 
    2423   USE dom_oce        ! ocean space and time domain 
    25    USE ldftra_oce     ! lateral diffusion: traceur 
    26    USE ldfdyn_oce     ! lateral diffusion: dynamics 
     24   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. 
    2725   USE phycst         ! physical constants 
    2826   USE zdfmxl         ! mixed layer depth 
     
    3028   ! 
    3129   USE in_out_manager ! I/O manager 
     30   USE prtctl         ! Print control 
    3231   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    33    USE prtctl         ! Print control 
     32   USE lib_mpp        ! distribued memory computing library 
     33   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3434   USE wrk_nemo       ! work arrays 
    3535   USE timing         ! Timing 
    36    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    3736 
    3837   IMPLICIT NONE 
    3938   PRIVATE 
    4039 
    41    PUBLIC   ldf_slp        ! routine called by step.F90 
    42    PUBLIC   ldf_slp_grif   ! routine called by step.F90 
    43    PUBLIC   ldf_slp_init   ! routine called by opa.F90 
    44  
    45    LOGICAL , PUBLIC, PARAMETER ::   lk_ldfslp = .TRUE.     !: slopes flag 
    46    !                                                                             !! Madec operator 
    47    !  Arrays allocated in ldf_slp_init() routine once we know whether we're using the Griffies or Madec operator 
     40   PUBLIC   ldf_slp         ! routine called by step.F90 
     41   PUBLIC   ldf_slp_triad   ! routine called by step.F90 
     42   PUBLIC   ldf_slp_init    ! routine called by nemogcm.F90 
     43 
     44   LOGICAL , PUBLIC ::   l_ldfslp = .FALSE.     !: slopes flag 
     45 
     46   LOGICAL , PUBLIC ::   ln_traldf_iso   = .TRUE.       !: iso-neutral direction 
     47   LOGICAL , PUBLIC ::   ln_traldf_triad = .FALSE.      !: griffies triad scheme 
     48 
     49   LOGICAL , PUBLIC ::   ln_triad_iso    = .FALSE.      !: pure horizontal mixing in ML 
     50   LOGICAL , PUBLIC ::   ln_botmix_triad = .FALSE.      !: mixing on bottom 
     51   REAL(wp), PUBLIC ::   rn_sw_triad     = 1._wp        !: =1 switching triads ; =0 all four triads used  
     52   REAL(wp), PUBLIC ::   rn_slpmax       = 0.01_wp      !: slope limit 
     53 
     54   LOGICAL , PUBLIC ::   l_grad_zps = .FALSE.           !: special treatment for Horz Tgradients w partial steps (triad operator) 
     55    
     56   !                                                     !! Classic operator (Madec) 
    4857   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   uslp, wslpi          !: i_slope at U- and W-points 
    4958   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   vslp, wslpj          !: j-slope at V- and W-points 
    50    !                                                                !! Griffies operator 
     59   !                                                     !! triad operator (Griffies) 
    5160   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   wslp2                !: wslp**2 from Griffies quarter cells 
    5261   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:,:) ::   triadi_g, triadj_g   !: skew flux  slopes relative to geopotentials 
    5362   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:,:) ::   triadi  , triadj     !: isoneutral slopes relative to model-coordinate 
    54  
    55    !                                                              !! Madec operator 
    56    !  Arrays allocated in ldf_slp_init() routine once we know whether we're using the Griffies or Madec operator 
     63   !                                                     !! both operators 
     64   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   ah_wslp2             !: ah * slope^2 at w-point 
     65   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   akz                  !: stabilizing vertical diffusivity 
     66    
     67   !                                                     !! Madec operator 
    5768   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   omlmask           ! mask of the surface mixed layer at T-pt 
    5869   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   uslpml, wslpiml   ! i_slope at U- and W-points just below the mixed layer 
     
    6374   !! * Substitutions 
    6475#  include "domzgr_substitute.h90" 
    65 #  include "ldftra_substitute.h90" 
    66 #  include "ldfeiv_substitute.h90" 
    6776#  include "vectopt_loop_substitute.h90" 
    6877   !!---------------------------------------------------------------------- 
    69    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     78   !! NEMO/OPA 4.0 , NEMO Consortium (2014) 
    7079   !! $Id$ 
    7180   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    105114      INTEGER  ::   ii0, ii1        ! temporary integer 
    106115      INTEGER  ::   ij0, ij1        ! temporary integer 
    107       REAL(wp) ::   zeps, zm1_g, zm1_2g, z1_16, zcofw ! local scalars 
     116      REAL(wp) ::   zeps, zm1_g, zm1_2g, z1_16, zcofw, z1_slpmax ! local scalars 
    108117      REAL(wp) ::   zci, zfi, zau, zbu, zai, zbi   !   -      - 
    109118      REAL(wp) ::   zcj, zfj, zav, zbv, zaj, zbj   !   -      - 
    110119      REAL(wp) ::   zck, zfk,      zbw             !   -      - 
    111       REAL(wp) ::   zdepv, zdepu         !   -      - 
     120      REAL(wp), POINTER, DIMENSION(:,:  ) ::  zslpml_hmlpu, zslpml_hmlpv 
    112121      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwz, zww 
    113122      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zdzr 
    114123      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zgru, zgrv 
    115       REAL(wp), POINTER, DIMENSION(:,:  ) :: zhmlpu, zhmlpv 
    116124      !!---------------------------------------------------------------------- 
    117125      ! 
     
    119127      ! 
    120128      CALL wrk_alloc( jpi,jpj,jpk, zwz, zww, zdzr, zgru, zgrv ) 
    121       CALL wrk_alloc( jpi,jpj, zhmlpu, zhmlpv ) 
    122  
    123       IF ( ln_traldf_iso .OR. ln_dynldf_iso ) THEN  
    124       
    125          zeps   =  1.e-20_wp        !==   Local constant initialization   ==! 
    126          z1_16  =  1.0_wp / 16._wp 
    127          zm1_g  = -1.0_wp / grav 
    128          zm1_2g = -0.5_wp / grav 
    129          ! 
    130          zww(:,:,:) = 0._wp 
    131          zwz(:,:,:) = 0._wp 
    132          ! 
    133          DO jk = 1, jpk             !==   i- & j-gradient of density   ==! 
    134             DO jj = 1, jpjm1 
    135                DO ji = 1, fs_jpim1   ! vector opt. 
    136                   zgru(ji,jj,jk) = umask(ji,jj,jk) * ( prd(ji+1,jj  ,jk) - prd(ji,jj,jk) ) 
    137                   zgrv(ji,jj,jk) = vmask(ji,jj,jk) * ( prd(ji  ,jj+1,jk) - prd(ji,jj,jk) ) 
    138                END DO 
    139             END DO 
    140          END DO 
    141          IF( ln_zps ) THEN                           ! partial steps correction at the bottom ocean level 
    142             DO jj = 1, jpjm1 
    143                DO ji = 1, jpim1 
    144                   zgru(ji,jj,mbku(ji,jj)) = gru(ji,jj) 
    145                   zgrv(ji,jj,mbkv(ji,jj)) = grv(ji,jj) 
    146                END DO 
    147             END DO 
    148          ENDIF 
    149          IF( ln_zps .AND. ln_isfcav ) THEN           ! partial steps correction at the bottom ocean level 
    150             DO jj = 1, jpjm1 
    151                DO ji = 1, jpim1 
     129      CALL wrk_alloc( jpi,jpj, zslpml_hmlpu, zslpml_hmlpv ) 
     130 
     131      zeps   =  1.e-20_wp        !==   Local constant initialization   ==! 
     132      z1_16  =  1.0_wp / 16._wp 
     133      zm1_g  = -1.0_wp / grav 
     134      zm1_2g = -0.5_wp / grav 
     135      z1_slpmax = 1._wp / rn_slpmax 
     136      ! 
     137      zww(:,:,:) = 0._wp 
     138      zwz(:,:,:) = 0._wp 
     139      ! 
     140      DO jk = 1, jpk             !==   i- & j-gradient of density   ==! 
     141         DO jj = 1, jpjm1 
     142            DO ji = 1, fs_jpim1   ! vector opt. 
     143               zgru(ji,jj,jk) = umask(ji,jj,jk) * ( prd(ji+1,jj  ,jk) - prd(ji,jj,jk) ) 
     144               zgrv(ji,jj,jk) = vmask(ji,jj,jk) * ( prd(ji  ,jj+1,jk) - prd(ji,jj,jk) ) 
     145            END DO 
     146         END DO 
     147      END DO 
     148      IF( ln_zps ) THEN                           ! partial steps correction at the bottom ocean level 
     149         DO jj = 1, jpjm1 
     150            DO ji = 1, jpim1 
     151               zgru(ji,jj,mbku(ji,jj)) = gru(ji,jj) 
     152               zgrv(ji,jj,mbkv(ji,jj)) = grv(ji,jj) 
     153            END DO 
     154         END DO 
     155      ENDIF 
     156      IF( ln_zps .AND. ln_isfcav ) THEN           ! partial steps correction at the bottom ocean level 
     157         DO jj = 1, jpjm1 
     158            DO ji = 1, jpim1 
    152159               IF ( miku(ji,jj) > 1 ) zgru(ji,jj,miku(ji,jj)) = grui(ji,jj)  
    153160               IF ( mikv(ji,jj) > 1 ) zgrv(ji,jj,mikv(ji,jj)) = grvi(ji,jj) 
    154                END DO 
    155             END DO 
    156          ENDIF 
    157          ! 
    158          !==   Local vertical density gradient at T-point   == !   (evaluated from N^2) 
    159          ! interior value 
    160          DO jk = 2, jpkm1 
    161             !                                ! zdzr = d/dz(prd)= - ( prd ) / grav * mk(pn2) -- at t point 
    162             !                                !   trick: tmask(ik  )  = 0   =>   all pn2   = 0   =>   zdzr = 0 
    163             !                                !    else  tmask(ik+1)  = 0   =>   pn2(ik+1) = 0   =>   zdzr divides by 1 
    164             !                                !          tmask(ik+1) /= 0   =>   all pn2  /= 0   =>   zdzr divides by 2 
    165             !                                ! NB: 1/(tmask+1) = (1-.5*tmask)  substitute a / by a *  ==> faster 
    166             zdzr(:,:,jk) = zm1_g * ( prd(:,:,jk) + 1._wp )              & 
    167                &                 * ( pn2(:,:,jk) + pn2(:,:,jk+1) ) * ( 1._wp - 0.5_wp * tmask(:,:,jk+1) ) 
    168          END DO 
    169          ! surface initialisation  
    170          zdzr(:,:,1) = 0._wp  
    171          IF ( ln_isfcav ) THEN 
    172             ! if isf need to overwrite the interior value at at the first ocean point 
    173             DO jj = 1, jpjm1 
    174                DO ji = 1, jpim1 
    175                   zdzr(ji,jj,1:mikt(ji,jj)) = 0._wp 
    176                END DO 
    177             END DO 
    178          END IF 
    179          ! 
    180          !                          !==   Slopes just below the mixed layer   ==! 
    181          CALL ldf_slp_mxl( prd, pn2, zgru, zgrv, zdzr )        ! output: uslpml, vslpml, wslpiml, wslpjml 
    182  
    183  
    184          ! I.  slopes at u and v point      | uslp = d/di( prd ) / d/dz( prd ) 
    185          ! ===========================      | vslp = d/dj( prd ) / d/dz( prd ) 
    186          ! 
    187          IF ( ln_isfcav ) THEN 
    188             DO jj = 2, jpjm1 
    189                DO ji = fs_2, fs_jpim1   ! vector opt. 
    190                   zhmlpu(ji,jj) = MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp) - 0.5 * ( risfdep(ji,jj) + risfdep(ji+1,jj  ) ) 
    191                   zhmlpv(ji,jj) = MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp) - 0.5 * ( risfdep(ji,jj) + risfdep(ji  ,jj+1) ) 
    192                END DO 
    193             END DO 
    194          ELSE 
    195             DO jj = 2, jpjm1 
    196                DO ji = fs_2, fs_jpim1   ! vector opt. 
    197                   zhmlpu(ji,jj) = MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp) 
    198                   zhmlpv(ji,jj) = MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp) 
    199                END DO 
    200             END DO 
    201          END IF 
    202 ! PM + GM can be optimized by using : zuslp_hmlpu(ji,jj)= uslpml(ji,jj) / zhmlpu (ji,jj) 
    203  
    204          DO jk = 2, jpkm1                            !* Slopes at u and v points 
    205             DO jj = 2, jpjm1 
    206                DO ji = fs_2, fs_jpim1   ! vector opt. 
    207                   !                                      ! horizontal and vertical density gradient at u- and v-points 
    208                   zau = zgru(ji,jj,jk) / e1u(ji,jj) 
    209                   zav = zgrv(ji,jj,jk) / e2v(ji,jj) 
    210                   zbu = 0.5_wp * ( zdzr(ji,jj,jk) + zdzr(ji+1,jj  ,jk) ) 
    211                   zbv = 0.5_wp * ( zdzr(ji,jj,jk) + zdzr(ji  ,jj+1,jk) ) 
    212                   !                                      ! bound the slopes: abs(zw.)<= 1/100 and zb..<0 
    213                   !                                      ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 
    214                   zbu = MIN(  zbu, -100._wp* ABS( zau ) , -7.e+3_wp/fse3u(ji,jj,jk)* ABS( zau )  ) 
    215                   zbv = MIN(  zbv, -100._wp* ABS( zav ) , -7.e+3_wp/fse3v(ji,jj,jk)* ABS( zav )  ) 
    216                   !                                      ! uslp and vslp output in zwz and zww, resp. 
    217                   zfi = MAX( omlmask(ji,jj,jk), omlmask(ji+1,jj  ,jk) ) 
    218                   zfj = MAX( omlmask(ji,jj,jk), omlmask(ji  ,jj+1,jk) ) 
    219                   ! thickness of water column between surface and level k at u/v point 
    220                   zdepu = 0.5_wp * ( ( fsdept (ji,jj,jk) + fsdept (ji+1,jj  ,jk) )                            & 
    221                                    - ( risfdep(ji,jj)    + risfdep(ji+1,jj)    ) - fse3u(ji,jj,miku(ji,jj)) ) 
    222                   zdepv = 0.5_wp * ( ( fsdept (ji,jj,jk) + fsdept (ji,jj+1,jk) )                              & 
    223                                    - ( risfdep(ji,jj)    + risfdep(ji,jj+1)    ) - fse3v(ji,jj,mikv(ji,jj)) ) 
    224                   ! 
    225                   zwz(ji,jj,jk) = ( 1. - zfi) * zau / ( zbu - zeps )                                          & 
    226                      &                 + zfi  * uslpml(ji,jj) * zdepu / zhmlpu(ji,jj) 
    227                   zwz(ji,jj,jk) = zwz(ji,jj,jk) * wumask(ji,jj,jk) 
    228                   zww(ji,jj,jk) = ( 1. - zfj) * zav / ( zbv - zeps )                                          & 
    229                      &                 + zfj  * vslpml(ji,jj) * zdepv / zhmlpv(ji,jj)  
    230                   zww(ji,jj,jk) = zww(ji,jj,jk) * wvmask(ji,jj,jk) 
    231                    
    232                   
     161            END DO 
     162         END DO 
     163      ENDIF 
     164      ! 
     165      zdzr(:,:,1) = 0._wp        !==   Local vertical density gradient at T-point   == !   (evaluated from N^2) 
     166      DO jk = 2, jpkm1 
     167         !                                ! zdzr = d/dz(prd)= - ( prd ) / grav * mk(pn2) -- at t point 
     168         !                                !   trick: tmask(ik  )  = 0   =>   all pn2   = 0   =>   zdzr = 0 
     169         !                                !    else  tmask(ik+1)  = 0   =>   pn2(ik+1) = 0   =>   zdzr divides by 1 
     170         !                                !          umask(ik+1) /= 0   =>   all pn2  /= 0   =>   zdzr divides by 2 
     171         !                                ! NB: 1/(tmask+1) = (1-.5*tmask)  substitute a / by a *  ==> faster 
     172         zdzr(:,:,jk) = zm1_g * ( prd(:,:,jk) + 1._wp )              & 
     173            &                 * ( pn2(:,:,jk) + pn2(:,:,jk+1) ) * ( 1._wp - 0.5_wp * tmask(:,:,jk+1) ) 
     174      END DO 
     175      ! 
     176      !                          !==   Slopes just below the mixed layer   ==! 
     177      CALL ldf_slp_mxl( prd, pn2, zgru, zgrv, zdzr )        ! output: uslpml, vslpml, wslpiml, wslpjml 
     178 
     179      ! I.  slopes at u and v point      | uslp = d/di( prd ) / d/dz( prd ) 
     180      ! ===========================      | vslp = d/dj( prd ) / d/dz( prd ) 
     181      ! 
     182      IF ( ln_isfcav ) THEN 
     183         DO jj = 2, jpjm1 
     184            DO ji = fs_2, fs_jpim1   ! vector opt. 
     185               zslpml_hmlpu(ji,jj) = uslpml(ji,jj) / ( MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp)  & 
     186                  &                                  - 0.5 * ( risfdep(ji,jj) + risfdep(ji+1,jj  ) ) 
     187               zslpml_hmlpv(ji,jj) = vslpml(ji,jj) / ( MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp)  & 
     188                  &                                  - 0.5 * ( risfdep(ji,jj) + risfdep(ji  ,jj+1) ) 
     189            END DO 
     190         END DO 
     191      ELSE 
     192         DO jj = 2, jpjm1 
     193            DO ji = fs_2, fs_jpim1   ! vector opt. 
     194               zslpml_hmlpu(ji,jj) = uslpml(ji,jj) / MAX(hmlpt(ji,jj), hmlpt(ji+1,jj  ), 5._wp) 
     195               zslpml_hmlpu(ji,jj) = vslpml(ji,jj) / MAX(hmlpt(ji,jj), hmlpt(ji  ,jj+1), 5._wp) 
     196            END DO 
     197         END DO 
     198      END IF 
     199 
     200      DO jk = 2, jpkm1                            !* Slopes at u and v points 
     201         DO jj = 2, jpjm1 
     202            DO ji = fs_2, fs_jpim1   ! vector opt. 
     203               !                                      ! horizontal and vertical density gradient at u- and v-points 
     204               zau = zgru(ji,jj,jk) * r1_e1u(ji,jj) 
     205               zav = zgrv(ji,jj,jk) * r1_e2v(ji,jj) 
     206               zbu = 0.5_wp * ( zdzr(ji,jj,jk) + zdzr(ji+1,jj  ,jk) ) 
     207               zbv = 0.5_wp * ( zdzr(ji,jj,jk) + zdzr(ji  ,jj+1,jk) ) 
     208               !                                      ! bound the slopes: abs(zw.)<= 1/100 and zb..<0 
     209               !                                      ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 
     210               zbu = MIN(  zbu, - z1_slpmax * ABS( zau ) , -7.e+3_wp/fse3u(ji,jj,jk)* ABS( zau )  ) 
     211               zbv = MIN(  zbv, - z1_slpmax * ABS( zav ) , -7.e+3_wp/fse3v(ji,jj,jk)* ABS( zav )  ) 
     212               !                                      ! uslp and vslp output in zwz and zww, resp. 
     213               zfi = MAX( omlmask(ji,jj,jk), omlmask(ji+1,jj,jk) ) 
     214               zfj = MAX( omlmask(ji,jj,jk), omlmask(ji,jj+1,jk) ) 
     215               ! thickness of water column between surface and level k at u/v point 
     216               zdepu = 0.5_wp * ( ( fsdept (ji,jj,jk) + fsdept (ji+1,jj  ,jk) )                            & 
     217                                - ( risfdep(ji,jj)    + risfdep(ji+1,jj)    ) - fse3u(ji,jj,miku(ji,jj)) ) 
     218               zdepv = 0.5_wp * ( ( fsdept (ji,jj,jk) + fsdept (ji,jj+1,jk) )                              & 
     219                                - ( risfdep(ji,jj)    + risfdep(ji,jj+1)    ) - fse3v(ji,jj,mikv(ji,jj)) ) 
     220               ! 
     221               zwz(ji,jj,jk) = ( ( 1._wp - zfi) * zau / ( zbu - zeps )                                     & 
     222                  &                      + zfi  * zdepu * zslpml_hmlpu(ji,jj) ) * umask(ji,jj,jk) 
     223               zww(ji,jj,jk) = ( ( 1._wp - zfj) * zav / ( zbv - zeps )                                     & 
     224                  &                      + zfj  * zdepv * zslpml_hmlpv(ji,jj) ) * vmask(ji,jj,jk) 
    233225!!gm  modif to suppress omlmask.... (as in Griffies case) 
    234 !                  !                                         ! jk must be >= ML level for zf=1. otherwise  zf=0. 
    235 !                  zfi = REAL( 1 - 1/(1 + jk / MAX( nmln(ji+1,jj), nmln(ji,jj) ) ), wp ) 
    236 !                  zfj = REAL( 1 - 1/(1 + jk / MAX( nmln(ji,jj+1), nmln(ji,jj) ) ), wp ) 
    237 !                  zci = 0.5 * ( fsdept(ji+1,jj,jk)+fsdept(ji,jj,jk) ) / MAX( hmlpt(ji,jj), hmlpt(ji+1,jj), 10. ) ) 
    238 !                  zcj = 0.5 * ( fsdept(ji,jj+1,jk)+fsdept(ji,jj,jk) ) / MAX( hmlpt(ji,jj), hmlpt(ji,jj+1), 10. ) ) 
    239 !                  zwz(ji,jj,jk) = ( zfi * zai / ( zbi - zeps ) + ( 1._wp - zfi ) * wslpiml(ji,jj) * zci ) * tmask(ji,jj,jk) 
    240 !                  zww(ji,jj,jk) = ( zfj * zaj / ( zbj - zeps ) + ( 1._wp - zfj ) * wslpjml(ji,jj) * zcj ) * tmask(ji,jj,jk) 
     226!               !                                         ! jk must be >= ML level for zf=1. otherwise  zf=0. 
     227!               zfi = REAL( 1 - 1/(1 + jk / MAX( nmln(ji+1,jj), nmln(ji,jj) ) ), wp ) 
     228!               zfj = REAL( 1 - 1/(1 + jk / MAX( nmln(ji,jj+1), nmln(ji,jj) ) ), wp ) 
     229!               zci = 0.5 * ( fsdept(ji+1,jj,jk)+fsdept(ji,jj,jk) ) / MAX( hmlpt(ji,jj), hmlpt(ji+1,jj), 10. ) ) 
     230!               zcj = 0.5 * ( fsdept(ji,jj+1,jk)+fsdept(ji,jj,jk) ) / MAX( hmlpt(ji,jj), hmlpt(ji,jj+1), 10. ) ) 
     231!               zwz(ji,jj,jk) = ( zfi * zai / ( zbi - zeps ) + ( 1._wp - zfi ) * wslpiml(ji,jj) * zci ) * tmask(ji,jj,jk) 
     232!               zww(ji,jj,jk) = ( zfj * zaj / ( zbj - zeps ) + ( 1._wp - zfj ) * wslpjml(ji,jj) * zcj ) * tmask(ji,jj,jk) 
    241233!!gm end modif 
    242                END DO 
    243             END DO 
    244          END DO 
    245          CALL lbc_lnk( zwz, 'U', -1. )   ;   CALL lbc_lnk( zww, 'V', -1. )      ! lateral boundary conditions 
    246          ! 
    247          !                                            !* horizontal Shapiro filter 
    248          DO jk = 2, jpkm1 
    249             DO jj = 2, jpjm1, MAX(1, jpj-3)                        ! rows jj=2 and =jpjm1 only 
    250                DO ji = 2, jpim1 
    251                   uslp(ji,jj,jk) = z1_16 * (        zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)      & 
    252                      &                       +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)      & 
    253                      &                       + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)      & 
    254                      &                       +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )    & 
    255                      &                       + 4.*  zwz(ji  ,jj  ,jk)                       ) 
    256                   vslp(ji,jj,jk) = z1_16 * (        zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)      & 
    257                      &                       +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)      & 
    258                      &                       + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)      & 
    259                      &                       +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )    & 
    260                      &                       + 4.*  zww(ji,jj    ,jk)                       ) 
    261                END DO 
    262             END DO 
    263             DO jj = 3, jpj-2                               ! other rows 
    264                DO ji = fs_2, fs_jpim1   ! vector opt. 
    265                   uslp(ji,jj,jk) = z1_16 * (        zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)      & 
    266                      &                       +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)      & 
    267                      &                       + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)      & 
    268                      &                       +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )    & 
    269                      &                       + 4.*  zwz(ji  ,jj  ,jk)                       ) 
    270                   vslp(ji,jj,jk) = z1_16 * (        zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)      & 
    271                      &                       +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)      & 
    272                      &                       + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)         & 
    273                      &                       +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )    & 
    274                      &                       + 4.*  zww(ji,jj    ,jk)                       ) 
    275                END DO 
    276             END DO 
    277             !                                        !* decrease along coastal boundaries 
    278             DO jj = 2, jpjm1 
    279                DO ji = fs_2, fs_jpim1   ! vector opt. 
    280                   uslp(ji,jj,jk) = uslp(ji,jj,jk) * ( umask(ji,jj+1,jk) + umask(ji,jj-1,jk  ) ) * 0.5_wp   & 
    281                      &                            * ( umask(ji,jj  ,jk) + umask(ji,jj  ,jk+1) ) * 0.5_wp   & 
    282                      &                            *   umask(ji,jj,jk-1) 
    283                   vslp(ji,jj,jk) = vslp(ji,jj,jk) * ( vmask(ji+1,jj,jk) + vmask(ji-1,jj,jk  ) ) * 0.5_wp   & 
    284                      &                            * ( vmask(ji  ,jj,jk) + vmask(ji  ,jj,jk+1) ) * 0.5_wp   & 
    285                      &                            *   vmask(ji,jj,jk-1) 
    286                END DO 
    287             END DO 
    288          END DO 
    289  
    290  
    291          ! II.  slopes at w point           | wslpi = mij( d/di( prd ) / d/dz( prd ) 
    292          ! ===========================      | wslpj = mij( d/dj( prd ) / d/dz( prd ) 
    293          ! 
    294          DO jk = 2, jpkm1 
    295             DO jj = 2, jpjm1 
    296                DO ji = fs_2, fs_jpim1   ! vector opt. 
    297                   !                                  !* Local vertical density gradient evaluated from N^2 
    298                   zbw = zm1_2g * pn2 (ji,jj,jk) * ( prd (ji,jj,jk) + prd (ji,jj,jk-1) + 2. ) * wmask(ji,jj,jk) 
    299                   !                                  !* Slopes at w point 
    300                   !                                        ! i- & j-gradient of density at w-points 
    301                   zci = MAX(  umask(ji-1,jj,jk  ) + umask(ji,jj,jk  )           & 
    302                      &      + umask(ji-1,jj,jk-1) + umask(ji,jj,jk-1) , zeps  ) * e1t(ji,jj) 
    303                   zcj = MAX(  vmask(ji,jj-1,jk  ) + vmask(ji,jj,jk-1)           & 
    304                      &      + vmask(ji,jj-1,jk-1) + vmask(ji,jj,jk  ) , zeps  ) *  e2t(ji,jj) 
    305                   zai =    (  zgru (ji-1,jj,jk  ) + zgru (ji,jj,jk-1)           & 
    306                      &      + zgru (ji-1,jj,jk-1) + zgru (ji,jj,jk  )   ) / zci 
    307                   zaj =    (  zgrv (ji,jj-1,jk  ) + zgrv (ji,jj,jk-1)           & 
    308                      &      + zgrv (ji,jj-1,jk-1) + zgrv (ji,jj,jk  )   ) / zcj 
    309                   !                                        ! bound the slopes: abs(zw.)<= 1/100 and zb..<0. 
    310                   !                                        ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 
    311                   zbi = MIN( zbw ,- 100._wp* ABS( zai ) , -7.e+3_wp/fse3w(ji,jj,jk)* ABS( zai )  ) 
    312                   zbj = MIN( zbw , -100._wp* ABS( zaj ) , -7.e+3_wp/fse3w(ji,jj,jk)* ABS( zaj )  ) 
    313                   !                                        ! wslpi and wslpj with ML flattening (output in zwz and zww, resp.) 
    314                   zfk = MAX( omlmask(ji,jj,jk), omlmask(ji,jj,jk-1) )   ! zfk=1 in the ML otherwise zfk=0 
    315                   zck = ( fsdepw(ji,jj,jk) - fsdepw(ji,jj,mikt(ji,jj) ) ) / MAX( hmlp(ji,jj) - fsdepw(ji,jj,mikt(ji,jj)), 10._wp ) 
    316                   zwz(ji,jj,jk) = (  zai / ( zbi - zeps ) * ( 1._wp - zfk ) & 
    317                      &            + zck * wslpiml(ji,jj) * zfk  ) * wmask(ji,jj,jk) 
    318                   zww(ji,jj,jk) = (  zaj / ( zbj - zeps ) * ( 1._wp - zfk ) & 
    319                      &            + zck * wslpjml(ji,jj) * zfk  ) * wmask(ji,jj,jk) 
     234            END DO 
     235         END DO 
     236      END DO 
     237      CALL lbc_lnk( zwz, 'U', -1. )   ;   CALL lbc_lnk( zww, 'V', -1. )      ! lateral boundary conditions 
     238      ! 
     239      !                                            !* horizontal Shapiro filter 
     240      DO jk = 2, jpkm1 
     241         DO jj = 2, jpjm1, MAX(1, jpj-3)                        ! rows jj=2 and =jpjm1 only 
     242            DO ji = 2, jpim1 
     243               uslp(ji,jj,jk) = z1_16 * (        zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)      & 
     244                  &                       +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)      & 
     245                  &                       + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)      & 
     246                  &                       +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )    & 
     247                  &                       + 4.*  zwz(ji  ,jj  ,jk)                       ) 
     248               vslp(ji,jj,jk) = z1_16 * (        zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)      & 
     249                  &                       +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)      & 
     250                  &                       + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)      & 
     251                  &                       +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )    & 
     252                  &                       + 4.*  zww(ji,jj    ,jk)                       ) 
     253            END DO 
     254         END DO 
     255         DO jj = 3, jpj-2                               ! other rows 
     256            DO ji = fs_2, fs_jpim1   ! vector opt. 
     257               uslp(ji,jj,jk) = z1_16 * (        zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)      & 
     258                  &                       +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)      & 
     259                  &                       + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)      & 
     260                  &                       +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )    & 
     261                  &                       + 4.*  zwz(ji  ,jj  ,jk)                       ) 
     262               vslp(ji,jj,jk) = z1_16 * (        zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)      & 
     263                  &                       +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)      & 
     264                  &                       + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)      & 
     265                  &                       +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )    & 
     266                  &                       + 4.*  zww(ji,jj    ,jk)                       ) 
     267            END DO 
     268         END DO 
     269         !                                        !* decrease along coastal boundaries 
     270         DO jj = 2, jpjm1 
     271            DO ji = fs_2, fs_jpim1   ! vector opt. 
     272               uslp(ji,jj,jk) = uslp(ji,jj,jk) * ( umask(ji,jj+1,jk) + umask(ji,jj-1,jk  ) ) * 0.5_wp   & 
     273                  &                            * ( umask(ji,jj  ,jk) + umask(ji,jj  ,jk+1) ) * 0.5_wp 
     274               vslp(ji,jj,jk) = vslp(ji,jj,jk) * ( vmask(ji+1,jj,jk) + vmask(ji-1,jj,jk  ) ) * 0.5_wp   & 
     275                  &                            * ( vmask(ji  ,jj,jk) + vmask(ji  ,jj,jk+1) ) * 0.5_wp 
     276            END DO 
     277         END DO 
     278      END DO 
     279 
     280 
     281      ! II.  slopes at w point           | wslpi = mij( d/di( prd ) / d/dz( prd ) 
     282      ! ===========================      | wslpj = mij( d/dj( prd ) / d/dz( prd ) 
     283      ! 
     284      DO jk = 2, jpkm1 
     285         DO jj = 2, jpjm1 
     286            DO ji = fs_2, fs_jpim1   ! vector opt. 
     287               !                                  !* Local vertical density gradient evaluated from N^2 
     288               zbw = zm1_2g * pn2 (ji,jj,jk) * ( prd (ji,jj,jk) + prd (ji,jj,jk-1) + 2. ) 
     289               !                                  !* Slopes at w point 
     290               !                                        ! i- & j-gradient of density at w-points 
     291               zci = MAX(  umask(ji-1,jj,jk  ) + umask(ji,jj,jk  )           & 
     292                  &      + umask(ji-1,jj,jk-1) + umask(ji,jj,jk-1) , zeps  ) * e1t(ji,jj) 
     293               zcj = MAX(  vmask(ji,jj-1,jk  ) + vmask(ji,jj,jk-1)           & 
     294                  &      + vmask(ji,jj-1,jk-1) + vmask(ji,jj,jk  ) , zeps  ) * e2t(ji,jj) 
     295               zai =    (  zgru (ji-1,jj,jk  ) + zgru (ji,jj,jk-1)           & 
     296                  &      + zgru (ji-1,jj,jk-1) + zgru (ji,jj,jk  )   ) / zci * wmask (ji,jj,jk) 
     297               zaj =    (  zgrv (ji,jj-1,jk  ) + zgrv (ji,jj,jk-1)           & 
     298                  &      + zgrv (ji,jj-1,jk-1) + zgrv (ji,jj,jk  )   ) / zcj * wmask (ji,jj,jk) 
     299               !                                        ! bound the slopes: abs(zw.)<= 1/100 and zb..<0. 
     300               !                                        ! + kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 
     301               zbi = MIN( zbw ,- 100._wp* ABS( zai ) , -7.e+3_wp/fse3w(ji,jj,jk)* ABS( zai )  ) 
     302               zbj = MIN( zbw , -100._wp* ABS( zaj ) , -7.e+3_wp/fse3w(ji,jj,jk)* ABS( zaj )  ) 
     303               !                                        ! wslpi and wslpj with ML flattening (output in zwz and zww, resp.) 
     304               zfk = MAX( omlmask(ji,jj,jk), omlmask(ji,jj,jk-1) )   ! zfk=1 in the ML otherwise zfk=0 
     305               zck = ( fsdepw(ji,jj,jk) - fsdepw(ji,jj,mikt(ji,jj) ) ) / MAX( hmlp(ji,jj) - fsdepw(ji,jj,mikt(ji,jj)), 10._wp ) 
     306               zwz(ji,jj,jk) = (  zai / ( zbi - zeps ) * ( 1._wp - zfk ) + zck * wslpiml(ji,jj) * zfk  ) * wmask(ji,jj,jk) 
     307               zww(ji,jj,jk) = (  zaj / ( zbj - zeps ) * ( 1._wp - zfk ) + zck * wslpjml(ji,jj) * zfk  ) * wmask(ji,jj,jk) 
    320308 
    321309!!gm  modif to suppress omlmask....  (as in Griffies operator) 
    322 !                  !                                         ! jk must be >= ML level for zfk=1. otherwise  zfk=0. 
    323 !                  zfk = REAL( 1 - 1/(1 + jk / nmln(ji+1,jj)), wp ) 
    324 !                  zck = fsdepw(ji,jj,jk)    / MAX( hmlp(ji,jj), 10. ) 
    325 !                  zwz(ji,jj,jk) = ( zfk * zai / ( zbi - zeps ) + ( 1._wp - zfk ) * wslpiml(ji,jj) * zck ) * tmask(ji,jj,jk) 
    326 !                  zww(ji,jj,jk) = ( zfk * zaj / ( zbj - zeps ) + ( 1._wp - zfk ) * wslpjml(ji,jj) * zck ) * tmask(ji,jj,jk) 
     310!               !                                         ! jk must be >= ML level for zfk=1. otherwise  zfk=0. 
     311!               zfk = REAL( 1 - 1/(1 + jk / nmln(ji+1,jj)), wp ) 
     312!               zck = fsdepw(ji,jj,jk)    / MAX( hmlp(ji,jj), 10. ) 
     313!               zwz(ji,jj,jk) = ( zfk * zai / ( zbi - zeps ) + ( 1._wp - zfk ) * wslpiml(ji,jj) * zck ) * tmask(ji,jj,jk) 
     314!               zww(ji,jj,jk) = ( zfk * zaj / ( zbj - zeps ) + ( 1._wp - zfk ) * wslpjml(ji,jj) * zck ) * tmask(ji,jj,jk) 
    327315!!gm end modif 
    328                END DO 
    329             END DO 
    330          END DO 
    331          CALL lbc_lnk( zwz, 'T', -1. )   ;    CALL lbc_lnk( zww, 'T', -1. )      ! lateral boundary conditions 
    332          ! 
    333          !                                           !* horizontal Shapiro filter 
    334          DO jk = 2, jpkm1 
    335             DO jj = 2, jpjm1, MAX(1, jpj-3)                        ! rows jj=2 and =jpjm1 only 
    336                DO ji = 2, jpim1 
    337                   zcofw = tmask(ji,jj,jk) * z1_16 
    338                   wslpi(ji,jj,jk) = (          zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)     & 
    339                        &                +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)     & 
    340                        &                + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)     & 
    341                        &                +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )   & 
    342                        &                + 4.*  zwz(ji  ,jj  ,jk)                         ) * zcofw 
    343  
    344                   wslpj(ji,jj,jk) = (          zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)     & 
    345                        &                +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)     & 
    346                        &                + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)     & 
    347                        &                +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )   & 
    348                        &                + 4.*  zww(ji  ,jj  ,jk)                         ) * zcofw 
    349                END DO 
    350             END DO 
    351             DO jj = 3, jpj-2                               ! other rows 
    352                DO ji = fs_2, fs_jpim1   ! vector opt. 
    353                   zcofw = tmask(ji,jj,jk) * z1_16 
    354                   wslpi(ji,jj,jk) = (        zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)     & 
    355                        &                +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)     & 
    356                        &                + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)     & 
    357                        &                +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )   & 
    358                        &                + 4.*  zwz(ji  ,jj  ,jk)                         ) * zcofw 
    359  
    360                   wslpj(ji,jj,jk) = (        zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)     & 
    361                        &                +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)     & 
    362                        &                + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)     & 
    363                        &                +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )   & 
    364                        &                + 4.*  zww(ji  ,jj  ,jk)                         ) * zcofw 
    365                END DO 
    366             END DO 
    367             !                                        !* decrease along coastal boundaries 
    368             DO jj = 2, jpjm1 
    369                DO ji = fs_2, fs_jpim1   ! vector opt. 
    370                   zck =   ( umask(ji,jj,jk) + umask(ji-1,jj,jk) )   & 
    371                      &  * ( vmask(ji,jj,jk) + vmask(ji,jj-1,jk) ) * 0.25 
    372                   wslpi(ji,jj,jk) = wslpi(ji,jj,jk) * zck * wmask(ji,jj,jk) 
    373                   wslpj(ji,jj,jk) = wslpj(ji,jj,jk) * zck * wmask(ji,jj,jk) 
    374                END DO 
    375             END DO 
    376          END DO 
    377  
    378          ! III.  Specific grid points 
    379          ! =========================== 
    380          ! 
    381          IF( cp_cfg == "orca" .AND. jp_cfg == 4 ) THEN     !  ORCA_R4 configuration: horizontal diffusion in specific area 
    382             !                                                    ! Gibraltar Strait 
    383             ij0 =  50   ;   ij1 =  53 
    384             ii0 =  69   ;   ii1 =  71   ;   uslp ( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    385             ij0 =  51   ;   ij1 =  53 
    386             ii0 =  68   ;   ii1 =  71   ;   vslp ( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    387             ii0 =  69   ;   ii1 =  71   ;   wslpi( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    388             ii0 =  69   ;   ii1 =  71   ;   wslpj( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    389             ! 
    390             !                                                    ! Mediterrannean Sea 
    391             ij0 =  49   ;   ij1 =  56 
    392             ii0 =  71   ;   ii1 =  90   ;   uslp ( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    393             ij0 =  50   ;   ij1 =  56 
    394             ii0 =  70   ;   ii1 =  90   ;   vslp ( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    395             ii0 =  71   ;   ii1 =  90   ;   wslpi( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    396             ii0 =  71   ;   ii1 =  90   ;   wslpj( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , : ) = 0._wp 
    397          ENDIF 
    398  
    399  
    400          ! IV. Lateral boundary conditions 
    401          ! =============================== 
    402          CALL lbc_lnk( uslp , 'U', -1. )      ;      CALL lbc_lnk( vslp , 'V', -1. ) 
    403          CALL lbc_lnk( wslpi, 'W', -1. )      ;      CALL lbc_lnk( wslpj, 'W', -1. ) 
    404  
    405  
    406          IF(ln_ctl) THEN 
    407             CALL prt_ctl(tab3d_1=uslp , clinfo1=' slp  - u : ', tab3d_2=vslp,  clinfo2=' v : ', kdim=jpk) 
    408             CALL prt_ctl(tab3d_1=wslpi, clinfo1=' slp  - wi: ', tab3d_2=wslpj, clinfo2=' wj: ', kdim=jpk) 
    409          ENDIF 
    410          ! 
    411  
    412       ELSEIF ( lk_vvl ) THEN  
    413   
    414          IF(lwp) THEN  
    415             WRITE(numout,*) '          Horizontal mixing in s-coordinate: slope = slope of s-surfaces'  
    416          ENDIF  
    417  
    418          ! geopotential diffusion in s-coordinates on tracers and/or momentum  
    419          ! The slopes of s-surfaces are computed at each time step due to vvl  
    420          ! The slopes for momentum diffusion are i- or j- averaged of those on tracers  
    421  
    422          ! set the slope of diffusion to the slope of s-surfaces  
    423          !      ( c a u t i o n : minus sign as fsdep has positive value )  
    424          DO jj = 2, jpjm1  
    425             DO ji = fs_2, fs_jpim1   ! vector opt.  
    426                uslp(ji,jj,1)  = -1./e1u(ji,jj) * ( fsdept_b(ji+1,jj,1) - fsdept_b(ji ,jj ,1) )  * umask(ji,jj,1)  
    427                vslp(ji,jj,1)  = -1./e2v(ji,jj) * ( fsdept_b(ji,jj+1,1) - fsdept_b(ji ,jj ,1) )  * vmask(ji,jj,1)  
    428                wslpi(ji,jj,1) = -1./e1t(ji,jj) * ( fsdepw_b(ji+1,jj,1) - fsdepw_b(ji-1,jj,1) ) * tmask(ji,jj,1) * 0.5  
    429                wslpj(ji,jj,1) = -1./e2t(ji,jj) * ( fsdepw_b(ji,jj+1,1) - fsdepw_b(ji,jj-1,1) ) * tmask(ji,jj,1) * 0.5  
    430             END DO  
    431          END DO  
    432  
    433          DO jk = 2, jpk  
    434             DO jj = 2, jpjm1  
    435                DO ji = fs_2, fs_jpim1   ! vector opt.  
    436                   uslp(ji,jj,jk)  = -1./e1u(ji,jj) * ( fsdept_b(ji+1,jj,jk) - fsdept_b(ji ,jj ,jk) ) * umask(ji,jj,jk)  
    437                   vslp(ji,jj,jk)  = -1./e2v(ji,jj) * ( fsdept_b(ji,jj+1,jk) - fsdept_b(ji ,jj ,jk) ) * vmask(ji,jj,jk)  
    438                   wslpi(ji,jj,jk) = -1./e1t(ji,jj) * ( fsdepw_b(ji+1,jj,jk) - fsdepw_b(ji-1,jj,jk) ) & 
    439                     &                              * wmask(ji,jj,jk) * 0.5  
    440                   wslpj(ji,jj,jk) = -1./e2t(ji,jj) * ( fsdepw_b(ji,jj+1,jk) - fsdepw_b(ji,jj-1,jk) ) & 
    441                     &                              * wmask(ji,jj,jk) * 0.5  
    442                END DO  
    443             END DO  
    444          END DO  
    445  
    446          ! Lateral boundary conditions on the slopes  
    447          CALL lbc_lnk( uslp , 'U', -1. )      ;      CALL lbc_lnk( vslp , 'V', -1. )  
    448          CALL lbc_lnk( wslpi, 'W', -1. )      ;      CALL lbc_lnk( wslpj, 'W', -1. )  
    449    
    450          if( kt == nit000 ) then  
    451             IF(lwp) WRITE(numout,*) ' max slop: u',SQRT( MAXVAL(uslp*uslp)), ' v ', SQRT(MAXVAL(vslp)),  &  
    452                &                             ' wi', sqrt(MAXVAL(wslpi)), ' wj', sqrt(MAXVAL(wslpj))  
    453          endif  
    454    
    455          IF(ln_ctl) THEN  
    456             CALL prt_ctl(tab3d_1=uslp , clinfo1=' slp  - u : ', tab3d_2=vslp,  clinfo2=' v : ', kdim=jpk)  
    457             CALL prt_ctl(tab3d_1=wslpi, clinfo1=' slp  - wi: ', tab3d_2=wslpj, clinfo2=' wj: ', kdim=jpk)  
    458          ENDIF  
    459  
     316            END DO 
     317         END DO 
     318      END DO 
     319      CALL lbc_lnk( zwz, 'T', -1. )   ;    CALL lbc_lnk( zww, 'T', -1. )      ! lateral boundary conditions 
     320      ! 
     321      !                                           !* horizontal Shapiro filter 
     322      DO jk = 2, jpkm1 
     323         DO jj = 2, jpjm1, MAX(1, jpj-3)                        ! rows jj=2 and =jpjm1 only 
     324            DO ji = 2, jpim1 
     325               zcofw = wmask(ji,jj,jk) * z1_16 
     326               wslpi(ji,jj,jk) = (         zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)     & 
     327                    &               +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)     & 
     328                    &               + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)     & 
     329                    &               +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )   & 
     330                    &               + 4.*  zwz(ji  ,jj  ,jk)                         ) * zcofw 
     331 
     332               wslpj(ji,jj,jk) = (         zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)     & 
     333                    &               +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)     & 
     334                    &               + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)     & 
     335                    &               +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )   & 
     336                    &               + 4.*  zww(ji  ,jj  ,jk)                         ) * zcofw 
     337            END DO 
     338         END DO 
     339         DO jj = 3, jpj-2                               ! other rows 
     340            DO ji = fs_2, fs_jpim1   ! vector opt. 
     341               zcofw = wmask(ji,jj,jk) * z1_16 
     342               wslpi(ji,jj,jk) = (         zwz(ji-1,jj-1,jk) + zwz(ji+1,jj-1,jk)     & 
     343                    &               +      zwz(ji-1,jj+1,jk) + zwz(ji+1,jj+1,jk)     & 
     344                    &               + 2.*( zwz(ji  ,jj-1,jk) + zwz(ji-1,jj  ,jk)     & 
     345                    &               +      zwz(ji+1,jj  ,jk) + zwz(ji  ,jj+1,jk) )   & 
     346                    &               + 4.*  zwz(ji  ,jj  ,jk)                         ) * zcofw 
     347 
     348               wslpj(ji,jj,jk) = (         zww(ji-1,jj-1,jk) + zww(ji+1,jj-1,jk)     & 
     349                    &               +      zww(ji-1,jj+1,jk) + zww(ji+1,jj+1,jk)     & 
     350                    &               + 2.*( zww(ji  ,jj-1,jk) + zww(ji-1,jj  ,jk)     & 
     351                    &               +      zww(ji+1,jj  ,jk) + zww(ji  ,jj+1,jk) )   & 
     352                    &               + 4.*  zww(ji  ,jj  ,jk)                         ) * zcofw 
     353            END DO 
     354         END DO 
     355         !                                        !* decrease in vicinity of topography 
     356         DO jj = 2, jpjm1 
     357            DO ji = fs_2, fs_jpim1   ! vector opt. 
     358               zck =   ( umask(ji,jj,jk) + umask(ji-1,jj,jk) )   & 
     359                  &  * ( vmask(ji,jj,jk) + vmask(ji,jj-1,jk) ) * 0.25 
     360               wslpi(ji,jj,jk) = wslpi(ji,jj,jk) * zck 
     361               wslpj(ji,jj,jk) = wslpj(ji,jj,jk) * zck 
     362            END DO 
     363         END DO 
     364      END DO 
     365 
     366      ! IV. Lateral boundary conditions 
     367      ! =============================== 
     368      CALL lbc_lnk( uslp , 'U', -1. )      ;      CALL lbc_lnk( vslp , 'V', -1. ) 
     369      CALL lbc_lnk( wslpi, 'W', -1. )      ;      CALL lbc_lnk( wslpj, 'W', -1. ) 
     370 
     371      IF(ln_ctl) THEN 
     372         CALL prt_ctl(tab3d_1=uslp , clinfo1=' slp  - u : ', tab3d_2=vslp,  clinfo2=' v : ', kdim=jpk) 
     373         CALL prt_ctl(tab3d_1=wslpi, clinfo1=' slp  - wi: ', tab3d_2=wslpj, clinfo2=' wj: ', kdim=jpk) 
    460374      ENDIF 
    461        
     375      ! 
    462376      CALL wrk_dealloc( jpi,jpj,jpk, zwz, zww, zdzr, zgru, zgrv ) 
    463       CALL wrk_dealloc( jpi,jpj,     zhmlpu, zhmlpv) 
     377      CALL wrk_dealloc( jpi,jpj, zslpml_hmlpu, zslpml_hmlpv ) 
    464378      ! 
    465379      IF( nn_timing == 1 )  CALL timing_stop('ldf_slp') 
     
    468382 
    469383 
    470    SUBROUTINE ldf_slp_grif ( kt ) 
    471       !!---------------------------------------------------------------------- 
    472       !!                 ***  ROUTINE ldf_slp_grif  *** 
     384   SUBROUTINE ldf_slp_triad ( kt ) 
     385      !!---------------------------------------------------------------------- 
     386      !!                 ***  ROUTINE ldf_slp_triad  *** 
    473387      !! 
    474388      !! ** Purpose :   Compute the squared slopes of neutral surfaces (slope 
    475       !!      of iso-pycnal surfaces referenced locally) (ln_traldf_grif=T) 
     389      !!      of iso-pycnal surfaces referenced locally) (ln_traldf_triad=T) 
    476390      !!      at W-points using the Griffies quarter-cells. 
    477391      !! 
     
    488402      REAL(wp) ::   zfacti, zfactj              ! local scalars 
    489403      REAL(wp) ::   znot_thru_surface           ! local scalars 
    490       REAL(wp) ::   zdit, zdis, zdjt, zdjs, zdkt, zdks, zbu, zbv, zbti, zbtj 
     404      REAL(wp) ::   zdit, zdis, zdkt, zbu, zbti, zisw 
     405      REAL(wp) ::   zdjt, zdjs, zdks, zbv, zbtj, zjsw 
    491406      REAL(wp) ::   zdxrho_raw, zti_coord, zti_raw, zti_lim, zti_g_raw, zti_g_lim 
    492407      REAL(wp) ::   zdyrho_raw, ztj_coord, ztj_raw, ztj_lim, ztj_g_raw, ztj_g_lim 
    493408      REAL(wp) ::   zdzrho_raw 
     409      REAL(wp) ::   zbeta0, ze3_e1, ze3_e2 
    494410      REAL(wp), POINTER, DIMENSION(:,:)     ::   z1_mlbw 
     411      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalbet 
    495412      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   zdxrho , zdyrho, zdzrho     ! Horizontal and vertical density gradients 
    496413      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   zti_mlb, ztj_mlb            ! for Griffies operator only 
    497414      !!---------------------------------------------------------------------- 
    498415      ! 
    499       IF( nn_timing == 1 )  CALL timing_start('ldf_slp_grif') 
     416      IF( nn_timing == 1 )  CALL timing_start('ldf_slp_triad') 
    500417      ! 
    501418      CALL wrk_alloc( jpi,jpj, z1_mlbw ) 
     419      CALL wrk_alloc( jpi,jpj,jpk, zalbet ) 
    502420      CALL wrk_alloc( jpi,jpj,jpk,2, zdxrho , zdyrho, zdzrho,              klstart = 0  ) 
    503421      CALL wrk_alloc( jpi,jpj,  2,2, zti_mlb, ztj_mlb,        kkstart = 0, klstart = 0  ) 
     
    517435                  zdjt = ( tsb(ji,jj+1,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) )    ! j-gradient of T & S at v-point 
    518436                  zdjs = ( tsb(ji,jj+1,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) 
    519                   zdxrho_raw = ( - rab_b(ji+ip,jj   ,jk,jp_tem) * zdit + rab_b(ji+ip,jj   ,jk,jp_sal) * zdis ) / e1u(ji,jj) 
    520                   zdyrho_raw = ( - rab_b(ji   ,jj+jp,jk,jp_tem) * zdjt + rab_b(ji   ,jj+jp,jk,jp_sal) * zdjs ) / e2v(ji,jj) 
    521                   zdxrho(ji+ip,jj   ,jk,1-ip) = SIGN( MAX( repsln, ABS( zdxrho_raw ) ), zdxrho_raw )   ! keep the sign 
    522                   zdyrho(ji   ,jj+jp,jk,1-jp) = SIGN( MAX( repsln, ABS( zdyrho_raw ) ), zdyrho_raw ) 
     437                  zdxrho_raw = ( - rab_b(ji+ip,jj   ,jk,jp_tem) * zdit + rab_b(ji+ip,jj   ,jk,jp_sal) * zdis ) * r1_e1u(ji,jj) 
     438                  zdyrho_raw = ( - rab_b(ji   ,jj+jp,jk,jp_tem) * zdjt + rab_b(ji   ,jj+jp,jk,jp_sal) * zdjs ) * r1_e2v(ji,jj) 
     439                  zdxrho(ji+ip,jj   ,jk,1-ip) = SIGN(  MAX( repsln, ABS( zdxrho_raw ) ), zdxrho_raw )   ! keep the sign 
     440                  zdyrho(ji   ,jj+jp,jk,1-jp) = SIGN(  MAX( repsln, ABS( zdyrho_raw ) ), zdyrho_raw ) 
    523441               END DO 
    524442            END DO 
     
    531449                  zdit = gtsu(ji,jj,jp_tem)   ;   zdjt = gtsv(ji,jj,jp_tem)      ! i- & j-gradient of Temperature 
    532450                  zdis = gtsu(ji,jj,jp_sal)   ;   zdjs = gtsv(ji,jj,jp_sal)      ! i- & j-gradient of Salinity 
    533                   zdxrho_raw = ( - rab_b(ji+ip,jj   ,iku,jp_tem) * zdit + rab_b(ji+ip,jj   ,iku,jp_sal) * zdis ) / e1u(ji,jj) 
    534                   zdyrho_raw = ( - rab_b(ji   ,jj+jp,ikv,jp_tem) * zdjt + rab_b(ji   ,jj+jp,ikv,jp_sal) * zdjs ) / e2v(ji,jj) 
     451                  zdxrho_raw = ( - rab_b(ji+ip,jj   ,iku,jp_tem) * zdit + rab_b(ji+ip,jj   ,iku,jp_sal) * zdis ) * r1_e1u(ji,jj) 
     452                  zdyrho_raw = ( - rab_b(ji   ,jj+jp,ikv,jp_tem) * zdjt + rab_b(ji   ,jj+jp,ikv,jp_sal) * zdjs ) * r1_e2v(ji,jj) 
    535453                  zdxrho(ji+ip,jj   ,iku,1-ip) = SIGN( MAX( repsln, ABS( zdxrho_raw ) ), zdxrho_raw )   ! keep the sign 
    536454                  zdyrho(ji   ,jj+jp,ikv,1-jp) = SIGN( MAX( repsln, ABS( zdyrho_raw ) ), zdyrho_raw ) 
     
    552470                     zdks = 0._wp 
    553471                  ENDIF 
    554                   zdzrho_raw = ( - rab_b(ji,jj,jk,jp_tem) * zdkt + rab_b(ji,jj,jk,jp_sal) * zdks ) / fse3w(ji,jj,jk+kp) 
    555                   zdzrho(ji,jj,jk,kp) = - MIN( - repsln, zdzrho_raw )    ! force zdzrho >= repsln 
     472                  zdzrho_raw = ( - zalbet(ji,jj,jk) * zdkt + zbeta0*zdks ) / fse3w(ji,jj,jk+kp) 
     473                  zdzrho(ji,jj,jk,kp) = - MIN( - repsln , zdzrho_raw )    ! force zdzrho >= repsln 
    556474                 END DO 
    557475            END DO 
     
    586504                  ! 
    587505                  jk = nmln(ji+ip,jj) + 1 
    588                   IF( jk >  mbkt(ji+ip,jj) ) THEN  !ML reaches bottom 
    589                     zti_mlb(ji+ip,jj   ,1-ip,kp) = 0.0_wp 
    590                   ELSE 
    591                     ! Add s-coordinate slope at t-points (do this by *subtracting* gradient of depth) 
    592                     zti_g_raw = (  zdxrho(ji+ip,jj,jk-kp,1-ip) / zdzrho(ji+ip,jj,jk-kp,kp)      & 
    593                        &      - ( fsdept(ji+1,jj,jk-kp) - fsdept(ji,jj,jk-kp) ) / e1u(ji,jj)  ) * umask(ji,jj,jk) 
    594                     zti_mlb(ji+ip,jj   ,1-ip,kp) = SIGN( MIN( rn_slpmax, ABS( zti_g_raw ) ), zti_g_raw ) 
     506                  IF( jk > mbkt(ji+ip,jj) ) THEN   ! ML reaches bottom 
     507                     zti_mlb(ji+ip,jj   ,1-ip,kp) = 0.0_wp 
     508                  ELSE                              
     509                     ! Add s-coordinate slope at t-points (do this by *subtracting* gradient of depth) 
     510                     zti_g_raw = (  zdxrho(ji+ip,jj,jk-kp,1-ip) / zdzrho(ji+ip,jj,jk-kp,kp)      & 
     511                        &          - ( fsdept(ji+1,jj,jk-kp) - fsdept(ji,jj,jk-kp) ) * r1_e1u(ji,jj)  ) * umask(ji,jj,jk) 
     512                     ze3_e1    =  fse3w(ji+ip,jj,jk-kp) * r1_e1u(ji,jj)  
     513                     zti_mlb(ji+ip,jj   ,1-ip,kp) = SIGN( MIN( rn_slpmax, 5.0_wp * ze3_e1  , ABS( zti_g_raw ) ), zti_g_raw ) 
    595514                  ENDIF 
    596515                  ! 
    597516                  jk = nmln(ji,jj+jp) + 1 
    598517                  IF( jk >  mbkt(ji,jj+jp) ) THEN  !ML reaches bottom 
    599                     ztj_mlb(ji   ,jj+jp,1-jp,kp) = 0.0_wp 
     518                     ztj_mlb(ji   ,jj+jp,1-jp,kp) = 0.0_wp 
    600519                  ELSE 
    601                     ztj_g_raw = (  zdyrho(ji,jj+jp,jk-kp,1-jp) / zdzrho(ji,jj+jp,jk-kp,kp)      & 
    602                        &      - ( fsdept(ji,jj+1,jk-kp) - fsdept(ji,jj,jk-kp) ) / e2v(ji,jj)  ) * vmask(ji,jj,jk) 
    603                     ztj_mlb(ji   ,jj+jp,1-jp,kp) = SIGN( MIN( rn_slpmax, ABS( ztj_g_raw ) ), ztj_g_raw ) 
     520                     ztj_g_raw = (  zdyrho(ji,jj+jp,jk-kp,1-jp) / zdzrho(ji,jj+jp,jk-kp,kp)      & 
     521                        &      - ( fsdept(ji,jj+1,jk-kp) - fsdept(ji,jj,jk-kp) ) / e2v(ji,jj)  ) * vmask(ji,jj,jk) 
     522                     ze3_e2    =  fse3w(ji,jj+jp,jk-kp) / e2v(ji,jj) 
     523                     ztj_mlb(ji   ,jj+jp,1-jp,kp) = SIGN( MIN( rn_slpmax, 5.0_wp * ze3_e2  , ABS( ztj_g_raw ) ), ztj_g_raw ) 
    604524                  ENDIF 
    605525               END DO 
     
    630550                     zti_raw   = zdxrho(ji+ip,jj   ,jk,1-ip) / zdzrho(ji+ip,jj   ,jk,kp)                   ! unmasked 
    631551                     ztj_raw   = zdyrho(ji   ,jj+jp,jk,1-jp) / zdzrho(ji   ,jj+jp,jk,kp) 
    632  
     552                     ! 
    633553                     ! Must mask contribution to slope for triad jk=1,kp=0 that poke up though ocean surface 
    634                      zti_coord = znot_thru_surface * ( fsdept(ji+1,jj  ,jk) - fsdept(ji,jj,jk) ) / e1u(ji,jj) 
    635                      ztj_coord = znot_thru_surface * ( fsdept(ji  ,jj+1,jk) - fsdept(ji,jj,jk) ) / e2v(ji,jj)                  ! unmasked 
     554                     zti_coord = znot_thru_surface * ( fsdept(ji+1,jj  ,jk) - fsdept(ji,jj,jk) ) * r1_e1u(ji,jj) 
     555                     ztj_coord = znot_thru_surface * ( fsdept(ji  ,jj+1,jk) - fsdept(ji,jj,jk) ) * r1_e2v(ji,jj)     ! unmasked 
    636556                     zti_g_raw = zti_raw - zti_coord      ! ref to geopot surfaces 
    637557                     ztj_g_raw = ztj_raw - ztj_coord 
    638                      zti_g_lim = SIGN( MIN( rn_slpmax, ABS( zti_g_raw ) ), zti_g_raw ) 
    639                      ztj_g_lim = SIGN( MIN( rn_slpmax, ABS( ztj_g_raw ) ), ztj_g_raw ) 
     558                     ! additional limit required in bilaplacian case 
     559                     ze3_e1    = fse3w(ji+ip,jj   ,jk+kp) * r1_e1u(ji,jj) 
     560                     ze3_e2    = fse3w(ji   ,jj+jp,jk+kp) * r1_e2v(ji,jj) 
     561                     ! NB: hard coded factor 5 (can be a namelist parameter...) 
     562                     zti_g_lim = SIGN( MIN( rn_slpmax, 5.0_wp * ze3_e1, ABS( zti_g_raw ) ), zti_g_raw ) 
     563                     ztj_g_lim = SIGN( MIN( rn_slpmax, 5.0_wp * ze3_e2, ABS( ztj_g_raw ) ), ztj_g_raw ) 
    640564                     ! 
    641565                     ! Below  ML use limited zti_g as is & mask 
     
    666590                     ! 
    667591                     IF( ln_triad_iso ) THEN 
    668                         zti_raw = zti_lim**2 / zti_raw 
    669                         ztj_raw = ztj_lim**2 / ztj_raw 
     592                        zti_raw = zti_lim*zti_lim / zti_raw 
     593                        ztj_raw = ztj_lim*ztj_lim / ztj_raw 
    670594                        zti_raw = SIGN( MIN( ABS(zti_lim), ABS( zti_raw ) ), zti_raw ) 
    671595                        ztj_raw = SIGN( MIN( ABS(ztj_lim), ABS( ztj_raw ) ), ztj_raw ) 
    672                         zti_lim =           zfacti   * zti_lim                       & 
    673                         &      + ( 1._wp - zfacti ) * zti_raw 
    674                         ztj_lim =           zfactj   * ztj_lim                       & 
    675                         &      + ( 1._wp - zfactj ) * ztj_raw 
     596                        zti_lim = zfacti * zti_lim + ( 1._wp - zfacti ) * zti_raw 
     597                        ztj_lim = zfactj * ztj_lim + ( 1._wp - zfactj ) * ztj_raw 
    676598                     ENDIF 
    677                      triadi(ji+ip,jj   ,jk,1-ip,kp) = zti_lim 
    678                      triadj(ji   ,jj+jp,jk,1-jp,kp) = ztj_lim 
    679                     ! 
    680                      zbu = e1u(ji    ,jj) * e2u(ji   ,jj) * fse3u(ji   ,jj,jk   ) 
    681                      zbv = e1v(ji    ,jj) * e2v(ji   ,jj) * fse3v(ji   ,jj,jk   ) 
    682                      zbti = e1t(ji+ip,jj) * e2t(ji+ip,jj) * fse3w(ji+ip,jj,jk+kp) 
    683                      zbtj = e1t(ji,jj+jp) * e2t(ji,jj+jp) * fse3w(ji,jj+jp,jk+kp) 
    684                      ! 
    685                      !!gm this may inhibit vectorization on Vect Computers, and even on scalar computers....  ==> to be checked 
    686                      wslp2 (ji+ip,jj,jk+kp) = wslp2(ji+ip,jj,jk+kp) + 0.25_wp * zbu / zbti * zti_g_lim**2      ! masked 
    687                      wslp2 (ji,jj+jp,jk+kp) = wslp2(ji,jj+jp,jk+kp) + 0.25_wp * zbv / zbtj * ztj_g_lim**2 
     599                     !                                      ! switching triad scheme  
     600                     zisw = (rn_sw_triad - 1._wp ) + rn_sw_triad    & 
     601                        &            * 2._wp * ABS( 0.5_wp - kp - ( 0.5_wp - ip ) * SIGN( 1._wp , zdxrho(ji+ip,jj,jk,1-ip) )  ) 
     602                     zjsw = (rn_sw_triad - 1._wp ) + rn_sw_triad    & 
     603                        &            * 2._wp * ABS( 0.5_wp - kp - ( 0.5_wp - jp ) * SIGN( 1._wp , zdyrho(ji,jj+jp,jk,1-jp) )  ) 
     604                     ! 
     605                     triadi(ji+ip,jj   ,jk,1-ip,kp) = zti_lim * zisw 
     606                     triadj(ji   ,jj+jp,jk,1-jp,kp) = ztj_lim * zjsw 
     607                     ! 
     608                     zbu  = e1e2u(ji   ,jj   ) * fse3u(ji   ,jj   ,jk   ) 
     609                     zbv  = e1e2v(ji   ,jj   ) * fse3v(ji   ,jj   ,jk   ) 
     610                     zbti = e1e2t(ji+ip,jj   ) * fse3w(ji+ip,jj   ,jk+kp) 
     611                     zbtj = e1e2t(ji   ,jj+jp) * fse3w(ji   ,jj+jp,jk+kp) 
     612                     ! 
     613                     wslp2(ji+ip,jj,jk+kp) = wslp2(ji+ip,jj,jk+kp) + 0.25_wp * zbu / zbti * zti_g_lim*zti_g_lim      ! masked 
     614                     wslp2(ji,jj+jp,jk+kp) = wslp2(ji,jj+jp,jk+kp) + 0.25_wp * zbv / zbtj * ztj_g_lim*ztj_g_lim 
    688615                  END DO 
    689616               END DO 
     
    697624      ! 
    698625      CALL wrk_dealloc( jpi,jpj, z1_mlbw ) 
     626      CALL wrk_dealloc( jpi,jpj,jpk, zalbet ) 
    699627      CALL wrk_dealloc( jpi,jpj,jpk,2, zdxrho , zdyrho, zdzrho,              klstart = 0  ) 
    700628      CALL wrk_dealloc( jpi,jpj,  2,2, zti_mlb, ztj_mlb,        kkstart = 0, klstart = 0  ) 
    701629      ! 
    702       IF( nn_timing == 1 )  CALL timing_stop('ldf_slp_grif') 
    703       ! 
    704    END SUBROUTINE ldf_slp_grif 
     630      IF( nn_timing == 1 )  CALL timing_stop('ldf_slp_triad') 
     631      ! 
     632   END SUBROUTINE ldf_slp_triad 
    705633 
    706634 
     
    728656      INTEGER  ::   ji , jj , jk                   ! dummy loop indices 
    729657      INTEGER  ::   iku, ikv, ik, ikm1             ! local integers 
    730       REAL(wp) ::   zeps, zm1_g, zm1_2g            ! local scalars 
     658      REAL(wp) ::   zeps, zm1_g, zm1_2g, z1_slpmax ! local scalars 
    731659      REAL(wp) ::   zci, zfi, zau, zbu, zai, zbi   !   -      - 
    732660      REAL(wp) ::   zcj, zfj, zav, zbv, zaj, zbj   !   -      - 
     
    739667      zm1_g  = -1.0_wp / grav 
    740668      zm1_2g = -0.5_wp / grav 
     669      z1_slpmax = 1._wp / rn_slpmax 
    741670      ! 
    742671      uslpml (1,:) = 0._wp      ;      uslpml (jpi,:) = 0._wp 
     
    750679            DO ji = 1, jpi 
    751680               ik = nmln(ji,jj) - 1 
    752                IF( jk <= ik ) THEN ; omlmask(ji,jj,jk) = 1._wp 
    753                ELSE                ; omlmask(ji,jj,jk) = 0._wp 
     681               IF( jk <= ik ) THEN   ;  omlmask(ji,jj,jk) = 1._wp 
     682               ELSE                  ;  omlmask(ji,jj,jk) = 0._wp 
    754683               ENDIF 
    755684            END DO 
     
    773702            ! 
    774703            !                        !- vertical density gradient for u- and v-slopes (from dzr at T-point) 
    775             iku = MIN(  MAX( nmln(ji,jj) , nmln(ji+1,jj) ) , jpkm1  )   ! ML (MAX of T-pts, bound by jpkm1) 
    776             ikv = MIN(  MAX( nmln(ji,jj) , nmln(ji,jj+1) ) , jpkm1  )   ! 
     704            iku = MIN(  MAX( 1, nmln(ji,jj) , nmln(ji+1,jj) ) , jpkm1  )   ! ML (MAX of T-pts, bound by jpkm1) 
     705            ikv = MIN(  MAX( 1, nmln(ji,jj) , nmln(ji,jj+1) ) , jpkm1  )   ! 
    777706            zbu = 0.5_wp * ( p_dzr(ji,jj,iku) + p_dzr(ji+1,jj  ,iku) ) 
    778707            zbv = 0.5_wp * ( p_dzr(ji,jj,ikv) + p_dzr(ji  ,jj+1,ikv) ) 
    779708            !                        !- horizontal density gradient at u- & v-points 
    780             zau = p_gru(ji,jj,iku) / e1u(ji,jj) 
    781             zav = p_grv(ji,jj,ikv) / e2v(ji,jj) 
     709            zau = p_gru(ji,jj,iku) * r1_e1u(ji,jj) 
     710            zav = p_grv(ji,jj,ikv) * r1_e2v(ji,jj) 
    782711            !                        !- bound the slopes: abs(zw.)<= 1/100 and zb..<0 
    783712            !                           kxz max= ah slope max =< e1 e3 /(pi**2 2 dt) 
    784             zbu = MIN(  zbu , -100._wp* ABS( zau ) , -7.e+3_wp/fse3u(ji,jj,iku)* ABS( zau )  ) 
    785             zbv = MIN(  zbv , -100._wp* ABS( zav ) , -7.e+3_wp/fse3v(ji,jj,ikv)* ABS( zav )  ) 
     713            zbu = MIN(  zbu , - z1_slpmax * ABS( zau ) , -7.e+3_wp/fse3u(ji,jj,iku)* ABS( zau )  ) 
     714            zbv = MIN(  zbv , - z1_slpmax * ABS( zav ) , -7.e+3_wp/fse3v(ji,jj,ikv)* ABS( zav )  ) 
    786715            !                        !- Slope at u- & v-points (uslpml, vslpml) 
    787716            uslpml(ji,jj) = zau / ( zbu - zeps ) * umask(ji,jj,iku) 
     
    808737            zbj = MIN(  zbw , -100._wp* ABS( zaj ) , -7.e+3_wp/fse3w(ji,jj,ik)* ABS( zaj )  ) 
    809738            !                        !- i- & j-slope at w-points (wslpiml, wslpjml) 
    810             wslpiml(ji,jj) = zai / ( zbi - zeps ) * wmask (ji,jj,ik) 
    811             wslpjml(ji,jj) = zaj / ( zbj - zeps ) * wmask (ji,jj,ik) 
     739            wslpiml(ji,jj) = zai / ( zbi - zeps ) * tmask (ji,jj,ik) 
     740            wslpjml(ji,jj) = zaj / ( zbj - zeps ) * tmask (ji,jj,ik) 
    812741         END DO 
    813742      END DO 
     
    827756      !! ** Purpose :   Initialization for the isopycnal slopes computation 
    828757      !! 
    829       !! ** Method  :   read the nammbf namelist and check the parameter 
    830       !!      values called by tra_dmp at the first timestep (nit000) 
     758      !! ** Method  :    
    831759      !!---------------------------------------------------------------------- 
    832760      INTEGER ::   ji, jj, jk   ! dummy loop indices 
     
    841769         WRITE(numout,*) '~~~~~~~~~~~~' 
    842770      ENDIF 
    843  
    844       IF( ln_traldf_grif ) THEN        ! Griffies operator : triad of slopes 
    845          ALLOCATE( triadi_g(jpi,jpj,jpk,0:1,0:1) , triadj_g(jpi,jpj,jpk,0:1,0:1) , wslp2(jpi,jpj,jpk) , STAT=ierr ) 
    846          ALLOCATE( triadi  (jpi,jpj,jpk,0:1,0:1) , triadj  (jpi,jpj,jpk,0:1,0:1)                      , STAT=ierr ) 
    847          IF( ierr > 0             )   CALL ctl_stop( 'STOP', 'ldf_slp_init : unable to allocate Griffies operator slope' ) 
    848          ! 
     771      ! 
     772      ALLOCATE( ah_wslp2(jpi,jpj,jpk) , akz(jpi,jpj,jpk) , STAT=ierr ) 
     773      IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'ldf_slp_init : unable to allocate ah_slp2 or akz' ) 
     774      ! 
     775      IF( ln_traldf_triad ) THEN        ! Griffies operator : triad of slopes 
     776         IF(lwp) WRITE(numout,*) '              Griffies (triad) operator initialisation' 
     777         ALLOCATE( triadi_g(jpi,jpj,jpk,0:1,0:1) , triadj_g(jpi,jpj,jpk,0:1,0:1) ,     & 
     778            &      triadi  (jpi,jpj,jpk,0:1,0:1) , triadj  (jpi,jpj,jpk,0:1,0:1) ,     & 
     779            &      wslp2   (jpi,jpj,jpk)                                         , STAT=ierr ) 
     780         IF( ierr > 0      )   CALL ctl_stop( 'STOP', 'ldf_slp_init : unable to allocate Griffies operator slope' ) 
    849781         IF( ln_dynldf_iso )   CALL ctl_stop( 'ldf_slp_init: Griffies operator on momentum not supported' ) 
    850782         ! 
    851783      ELSE                             ! Madec operator : slopes at u-, v-, and w-points 
    852          ALLOCATE( uslp(jpi,jpj,jpk) , vslp(jpi,jpj,jpk) , wslpi(jpi,jpj,jpk) , wslpj(jpi,jpj,jpk) ,                & 
    853             &   omlmask(jpi,jpj,jpk) , uslpml(jpi,jpj)   , vslpml(jpi,jpj)    , wslpiml(jpi,jpj)   , wslpjml(jpi,jpj) , STAT=ierr ) 
     784         IF(lwp) WRITE(numout,*) '              Madec operator initialisation' 
     785         ALLOCATE( omlmask(jpi,jpj,jpk) ,                                                                        & 
     786            &      uslp(jpi,jpj,jpk) , uslpml(jpi,jpj) , wslpi(jpi,jpj,jpk) , wslpiml(jpi,jpj) ,     & 
     787            &      vslp(jpi,jpj,jpk) , vslpml(jpi,jpj) , wslpj(jpi,jpj,jpk) , wslpjml(jpi,jpj) , STAT=ierr ) 
    854788         IF( ierr > 0 )   CALL ctl_stop( 'STOP', 'ldf_slp_init : unable to allocate Madec operator slope ' ) 
    855789 
     
    861795         wslpj(:,:,:) = 0._wp   ;   wslpjml(:,:) = 0._wp 
    862796 
    863          IF(ln_sco .AND.  (ln_traldf_hor .OR. ln_dynldf_hor )) THEN 
    864             IF(lwp)   WRITE(numout,*) '          Horizontal mixing in s-coordinate: slope = slope of s-surfaces' 
    865  
    866             ! geopotential diffusion in s-coordinates on tracers and/or momentum 
    867             ! The slopes of s-surfaces are computed once (no call to ldfslp in step) 
    868             ! The slopes for momentum diffusion are i- or j- averaged of those on tracers 
    869  
    870             ! set the slope of diffusion to the slope of s-surfaces 
    871             !      ( c a u t i o n : minus sign as fsdep has positive value ) 
    872             DO jk = 1, jpk 
    873                DO jj = 2, jpjm1 
    874                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    875                      uslp (ji,jj,jk) = -1./e1u(ji,jj) * ( fsdept_b(ji+1,jj,jk) - fsdept_b(ji ,jj ,jk) ) * umask(ji,jj,jk) 
    876                      vslp (ji,jj,jk) = -1./e2v(ji,jj) * ( fsdept_b(ji,jj+1,jk) - fsdept_b(ji ,jj ,jk) ) * vmask(ji,jj,jk) 
    877                      wslpi(ji,jj,jk) = -1./e1t(ji,jj) * ( fsdepw_b(ji+1,jj,jk) - fsdepw_b(ji-1,jj,jk) ) * tmask(ji,jj,jk) * 0.5 
    878                      wslpj(ji,jj,jk) = -1./e2t(ji,jj) * ( fsdepw_b(ji,jj+1,jk) - fsdepw_b(ji,jj-1,jk) ) * tmask(ji,jj,jk) * 0.5 
    879                   END DO 
    880                END DO 
    881             END DO 
    882             CALL lbc_lnk( uslp , 'U', -1. )   ;   CALL lbc_lnk( vslp , 'V', -1. )      ! Lateral boundary conditions 
    883             CALL lbc_lnk( wslpi, 'W', -1. )   ;   CALL lbc_lnk( wslpj, 'W', -1. ) 
    884          ENDIF 
     797         !!gm I no longer understand this..... 
     798!!gm         IF( (ln_traldf_hor .OR. ln_dynldf_hor) .AND. .NOT. (lk_vvl .AND. ln_rstart) ) THEN 
     799!            IF(lwp)   WRITE(numout,*) '          Horizontal mixing in s-coordinate: slope = slope of s-surfaces' 
     800! 
     801!            ! geopotential diffusion in s-coordinates on tracers and/or momentum 
     802!            ! The slopes of s-surfaces are computed once (no call to ldfslp in step) 
     803!            ! The slopes for momentum diffusion are i- or j- averaged of those on tracers 
     804! 
     805!            ! set the slope of diffusion to the slope of s-surfaces 
     806!            !      ( c a u t i o n : minus sign as fsdep has positive value ) 
     807!            DO jk = 1, jpk 
     808!               DO jj = 2, jpjm1 
     809!                  DO ji = fs_2, fs_jpim1   ! vector opt. 
     810!                     uslp (ji,jj,jk) = - ( fsdept(ji+1,jj,jk) - fsdept(ji ,jj ,jk) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 
     811!                     vslp (ji,jj,jk) = - ( fsdept(ji,jj+1,jk) - fsdept(ji ,jj ,jk) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) 
     812!                     wslpi(ji,jj,jk) = - ( fsdepw(ji+1,jj,jk) - fsdepw(ji-1,jj,jk) ) * r1_e1t(ji,jj) * wmask(ji,jj,jk) * 0.5 
     813!                     wslpj(ji,jj,jk) = - ( fsdepw(ji,jj+1,jk) - fsdepw(ji,jj-1,jk) ) * r1_e2t(ji,jj) * wmask(ji,jj,jk) * 0.5 
     814!                  END DO 
     815!               END DO 
     816!            END DO 
     817!            CALL lbc_lnk( uslp , 'U', -1. )   ;   CALL lbc_lnk( vslp , 'V', -1. )      ! Lateral boundary conditions 
     818!            CALL lbc_lnk( wslpi, 'W', -1. )   ;   CALL lbc_lnk( wslpj, 'W', -1. ) 
     819!!gm         ENDIF 
    885820      ENDIF 
    886821      ! 
     
    888823      ! 
    889824   END SUBROUTINE ldf_slp_init 
    890  
    891 #else 
    892    !!------------------------------------------------------------------------ 
    893    !!   Dummy module :                 NO Rotation of lateral mixing tensor 
    894    !!------------------------------------------------------------------------ 
    895    LOGICAL, PUBLIC, PARAMETER ::   lk_ldfslp = .FALSE.    !: slopes flag 
    896 CONTAINS 
    897    SUBROUTINE ldf_slp( kt, prd, pn2 )   ! Dummy routine 
    898       INTEGER, INTENT(in) :: kt 
    899       REAL, DIMENSION(:,:,:), INTENT(in) :: prd, pn2 
    900       WRITE(*,*) 'ldf_slp: You should not have seen this print! error?', kt, prd(1,1,1), pn2(1,1,1) 
    901    END SUBROUTINE ldf_slp 
    902    SUBROUTINE ldf_slp_grif( kt )        ! Dummy routine 
    903       INTEGER, INTENT(in) :: kt 
    904       WRITE(*,*) 'ldf_slp_grif: You should not have seen this print! error?', kt 
    905    END SUBROUTINE ldf_slp_grif 
    906    SUBROUTINE ldf_slp_init              ! Dummy routine 
    907    END SUBROUTINE ldf_slp_init 
    908 #endif 
    909825 
    910826   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.