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 8882 for branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2017-12-01T18:44:09+01:00 (6 years ago)
Author:
flavoni
Message:

dev_CNRS_2017 branch: merged dev_r7881_ENHANCE09_RK3 with trunk r8864

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r7813 r8882  
    2727   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
    2828   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
     29   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only  
     30   !!             -   !  2017-05  (G. Madec)  add top/bottom friction as boundary condition (ln_drg) 
    2931   !!---------------------------------------------------------------------- 
    30 #if defined key_zdftke 
    31    !!---------------------------------------------------------------------- 
    32    !!   'key_zdftke'                                   TKE vertical physics 
     32 
    3333   !!---------------------------------------------------------------------- 
    3434   !!   zdf_tke       : update momentum and tracer Kz from a tke scheme 
     
    4444   USE sbc_oce        ! surface boundary condition: ocean 
    4545   USE zdf_oce        ! vertical physics: ocean variables 
     46   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    4647   USE zdfmxl         ! vertical physics: mixed layer 
    47    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    48    USE prtctl         ! Print control 
     48   ! 
    4949   USE in_out_manager ! I/O manager 
    5050   USE iom            ! I/O manager library 
    5151   USE lib_mpp        ! MPP library 
    52    USE wrk_nemo       ! work arrays 
     52   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     53   USE prtctl         ! Print control 
    5354   USE timing         ! Timing 
    5455   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    55 #if defined key_agrif 
    56    USE agrif_opa_interp 
    57    USE agrif_opa_update 
    58 #endif 
    5956 
    6057   IMPLICIT NONE 
     
    6461   PUBLIC   zdf_tke_init   ! routine called in opa module 
    6562   PUBLIC   tke_rst        ! routine called in step module 
    66  
    67    LOGICAL , PUBLIC, PARAMETER ::   lk_zdftke = .TRUE.  !: TKE vertical mixing flag 
    6863 
    6964   !                      !!** Namelist  namzdf_tke  ** 
     
    7873   REAL(wp) ::   rn_emin0  ! surface minimum value of tke   [m2/s2] 
    7974   REAL(wp) ::   rn_bshear ! background shear (>0) currently a numerical threshold (do not change it) 
     75   LOGICAL  ::   ln_drg    ! top/bottom friction forcing flag  
    8076   INTEGER  ::   nn_etau   ! type of depth penetration of surface tke (=0/1/2/3) 
    81    INTEGER  ::   nn_htau   ! type of tke profile of penetration (=0/1) 
    82    REAL(wp) ::   rn_efr    ! fraction of TKE surface value which penetrates in the ocean 
     77   INTEGER  ::      nn_htau   ! type of tke profile of penetration (=0/1) 
     78   REAL(wp) ::      rn_efr    ! fraction of TKE surface value which penetrates in the ocean 
    8379   LOGICAL  ::   ln_lc     ! Langmuir cells (LC) as a source term of TKE or not 
    84    REAL(wp) ::   rn_lc     ! coef to compute vertical velocity of Langmuir cells 
     80   REAL(wp) ::      rn_lc     ! coef to compute vertical velocity of Langmuir cells 
    8581 
    8682   REAL(wp) ::   ri_cri    ! critic Richardson number (deduced from rn_ediff and rn_ediss values) 
     
    8985   REAL(wp) ::   rhftau_scl = 1.0_wp       ! scale factor applied to HF part of taum  (nn_etau=3) 
    9086 
    91    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau           ! depth of tke penetration (nn_htau) 
    92    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl          ! now mixing lenght of dissipation 
    93    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr          ! now mixing lenght of dissipation 
    94 #if defined key_c1d 
    95    !                                                                        !!** 1D cfg only  **   ('key_c1d') 
    96    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_dis, e_mix   !: dissipation and mixing turbulent lengh scales 
    97    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_pdl, e_ric   !: prandl and local Richardson numbers 
    98 #endif 
     87   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau    ! depth of tke penetration (nn_htau) 
     88   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl   ! now mixing lenght of dissipation 
     89   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr   ! now mixing lenght of dissipation 
    9990 
    10091   !! * Substitutions 
     
    111102      !!                ***  FUNCTION zdf_tke_alloc  *** 
    112103      !!---------------------------------------------------------------------- 
    113       ALLOCATE(                                                                    & 
    114 #if defined key_c1d 
    115          &      e_dis(jpi,jpj,jpk) , e_mix(jpi,jpj,jpk) ,                          & 
    116          &      e_pdl(jpi,jpj,jpk) , e_ric(jpi,jpj,jpk) ,                          & 
    117 #endif 
    118          &      htau  (jpi,jpj)    , dissl(jpi,jpj,jpk) ,     &  
    119          &      apdlr(jpi,jpj,jpk) ,                                           STAT= zdf_tke_alloc      ) 
    120          ! 
     104      ALLOCATE( htau(jpi,jpj) , dissl(jpi,jpj,jpk) , apdlr(jpi,jpj,jpk) ,   STAT= zdf_tke_alloc ) 
     105      ! 
    121106      IF( lk_mpp             )   CALL mpp_sum ( zdf_tke_alloc ) 
    122107      IF( zdf_tke_alloc /= 0 )   CALL ctl_warn('zdf_tke_alloc: failed to allocate arrays') 
     
    125110 
    126111 
    127    SUBROUTINE zdf_tke( kt ) 
     112   SUBROUTINE zdf_tke( kt, p_sh2, p_avm, p_avt ) 
    128113      !!---------------------------------------------------------------------- 
    129114      !!                   ***  ROUTINE zdf_tke  *** 
     
    162147      !! 
    163148      !! ** Action  :   compute en (now turbulent kinetic energy) 
    164       !!                update avt, avmu, avmv (before vertical eddy coef.) 
     149      !!                update avt, avm (before vertical eddy coef.) 
    165150      !! 
    166151      !! References : Gaspar et al., JGR, 1990, 
     
    170155      !!              Bruchard OM 2002 
    171156      !!---------------------------------------------------------------------- 
    172       INTEGER, INTENT(in) ::   kt   ! ocean time step 
    173       !!---------------------------------------------------------------------- 
    174       ! 
    175 #if defined key_agrif  
    176       ! interpolation parent grid => child grid for avm_k ( ex : at west border: update column 1 and 2) 
    177       IF( .NOT.Agrif_Root() )   CALL Agrif_Tke 
    178 #endif 
    179       ! 
    180       IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    181          avt (:,:,:) = avt_k (:,:,:)  
    182          avm (:,:,:) = avm_k (:,:,:)  
    183          avmu(:,:,:) = avmu_k(:,:,:)  
    184          avmv(:,:,:) = avmv_k(:,:,:)  
    185       ENDIF  
    186       ! 
    187       CALL tke_tke      ! now tke (en) 
    188       ! 
    189       CALL tke_avn      ! now avt, avm, avmu, avmv 
    190       ! 
    191       avt_k (:,:,:) = avt (:,:,:)  
    192       avm_k (:,:,:) = avm (:,:,:)  
    193       avmu_k(:,:,:) = avmu(:,:,:)  
    194       avmv_k(:,:,:) = avmv(:,:,:)  
    195       ! 
    196 #if defined key_agrif 
    197       ! Update child grid f => parent grid  
    198       IF( .NOT.Agrif_Root() )   CALL Agrif_Update_Tke( kt )      ! children only 
    199 #endif       
    200      !  
     157      INTEGER                   , INTENT(in   ) ::   kt             ! ocean time step 
     158      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     159      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
     160      !!---------------------------------------------------------------------- 
     161      ! 
     162      CALL tke_tke( gdepw_n, e3t_n, e3w_n, p_sh2, p_avm, p_avt )   ! now tke (en) 
     163      ! 
     164      CALL tke_avn( gdepw_n, e3t_n, e3w_n,        p_avm, p_avt )   ! now avt, avm, dissl 
     165      ! 
    201166  END SUBROUTINE zdf_tke 
    202167 
    203168 
    204    SUBROUTINE tke_tke 
     169   SUBROUTINE tke_tke( pdepw, p_e3t, p_e3w, p_sh2, p_avm, p_avt ) 
    205170      !!---------------------------------------------------------------------- 
    206171      !!                   ***  ROUTINE tke_tke  *** 
     
    210175      !! ** Method  : - TKE surface boundary condition 
    211176      !!              - source term due to Langmuir cells (Axell JGR 2002) (ln_lc=T) 
    212       !!              - source term due to shear (saved in avmu, avmv arrays) 
     177      !!              - source term due to shear (= Kz dz[Ub] * dz[Un] ) 
    213178      !!              - Now TKE : resolution of the TKE equation by inverting 
    214179      !!                a tridiagonal linear system by a "methode de chasse" 
    215180      !!              - increase TKE due to surface and internal wave breaking 
     181      !!             NB: when sea-ice is present, both LC parameterization  
     182      !!                 and TKE penetration are turned off when the ice fraction  
     183      !!                 is smaller than 0.25  
    216184      !! 
    217185      !! ** Action  : - en : now turbulent kinetic energy) 
    218       !!              - avmu, avmv : production of TKE by shear at u and v-points 
    219       !!                (= Kz dz[Ub] * dz[Un] ) 
    220186      !! --------------------------------------------------------------------- 
    221       INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    222 !!bfr      INTEGER  ::   ikbu, ikbv, ikbum1, ikbvm1      ! temporary scalar 
    223 !!bfr      INTEGER  ::   ikbt, ikbumm1, ikbvmm1          ! temporary scalar 
    224       REAL(wp) ::   zrhoa  = 1.22                   ! Air density kg/m3 
    225       REAL(wp) ::   zcdrag = 1.5e-3                 ! drag coefficient 
    226       REAL(wp) ::   zbbrau, zesh2                   ! temporary scalars 
    227       REAL(wp) ::   zfact1, zfact2, zfact3          !    -         - 
    228       REAL(wp) ::   ztx2  , zty2  , zcof            !    -         - 
    229       REAL(wp) ::   ztau  , zdif                    !    -         - 
    230       REAL(wp) ::   zus   , zwlc  , zind            !    -         - 
    231       REAL(wp) ::   zzd_up, zzd_lw                  !    -         - 
    232 !!bfr      REAL(wp) ::   zebot                           !    -         - 
    233       INTEGER , POINTER, DIMENSION(:,:  ) ::   imlc 
    234       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhlc 
    235       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv 
    236       REAL(wp)                            ::   zri  !   local Richardson number 
     187      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   pdepw          ! depth of w-points 
     188      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_e3t, p_e3w   ! level thickness (t- & w-points) 
     189      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_sh2          ! shear production term 
     190      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
     191      ! 
     192      INTEGER ::   ji, jj, jk              ! dummy loop arguments 
     193      REAL(wp) ::   zetop, zebot, zmsku, zmskv ! local scalars 
     194      REAL(wp) ::   zrhoa  = 1.22              ! Air density kg/m3 
     195      REAL(wp) ::   zcdrag = 1.5e-3            ! drag coefficient 
     196      REAL(wp) ::   zbbrau, zri                ! local scalars 
     197      REAL(wp) ::   zfact1, zfact2, zfact3     !   -         - 
     198      REAL(wp) ::   ztx2  , zty2  , zcof       !   -         - 
     199      REAL(wp) ::   ztau  , zdif               !   -         - 
     200      REAL(wp) ::   zus   , zwlc  , zind       !   -         - 
     201      REAL(wp) ::   zzd_up, zzd_lw             !   -         - 
     202      INTEGER , DIMENSION(jpi,jpj)     ::   imlc 
     203      REAL(wp), DIMENSION(jpi,jpj)     ::   zhlc 
     204      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpelc, zdiag, zd_up, zd_lw 
    237205      !!-------------------------------------------------------------------- 
    238206      ! 
    239       IF( nn_timing == 1 )  CALL timing_start('tke_tke') 
    240       ! 
    241       CALL wrk_alloc( jpi,jpj,       imlc )    ! integer 
    242       CALL wrk_alloc( jpi,jpj,       zhlc )  
    243       CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
     207      IF( ln_timing )   CALL timing_start('tke_tke') 
    244208      ! 
    245209      zbbrau = rn_ebb / rau0       ! Local constant initialisation 
     
    248212      zfact3 = 0.5_wp       * rn_ediss 
    249213      ! 
    250       ! 
    251       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    252       !                     !  Surface boundary condition on tke 
    253       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     214      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     215      !                     !  Surface/top/bottom boundary condition on tke 
     216      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     217       
     218      DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
     219         DO ji = fs_2, fs_jpim1   ! vector opt. 
     220            en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
     221         END DO 
     222      END DO 
    254223      IF ( ln_isfcav ) THEN 
    255224         DO jj = 2, jpjm1            ! en(mikt(ji,jj))   = rn_emin 
     
    258227            END DO 
    259228         END DO 
    260       END IF 
    261       DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
    262          DO ji = fs_2, fs_jpim1   ! vector opt. 
    263             en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
    264          END DO 
    265       END DO 
    266        
    267 !!bfr   - start commented area 
     229      ENDIF 
     230      ! 
    268231      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    269232      !                     !  Bottom boundary condition on tke 
    270233      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    271234      ! 
    272       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    273       ! Tests to date have found the bottom boundary condition on tke to have very little effect. 
    274       ! The condition is coded here for completion but commented out until there is proof that the 
    275       ! computational cost is justified 
    276       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    277       !                     en(bot)   = (rn_ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
    278 !!    DO jj = 2, jpjm1 
    279 !!       DO ji = fs_2, fs_jpim1   ! vector opt. 
    280 !!          ztx2 = bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) + & 
    281 !!                 bfrua(ji  ,jj) * ub(ji  ,jj,mbku(ji  ,jj) ) 
    282 !!          zty2 = bfrva(ji,jj  ) * vb(ji,jj  ,mbkv(ji,jj  )) + & 
    283 !!                 bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1) ) 
    284 !!          zebot = 0.001875_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 )   !  where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. 
    285 !!          en (ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * tmask(ji,jj,1) 
    286 !!       END DO 
    287 !!    END DO 
    288 !!bfr   - end commented area 
    289       ! 
    290       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    291       IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke       (Axell JGR 2002) 
     235      !   en(bot)   = (ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
     236      ! where ebb0 does not includes surface wave enhancement (i.e. ebb0=3.75) 
     237      ! Note that stress averaged is done using an wet-only calculation of u and v at t-point like in zdfsh2 
     238      ! 
     239      IF( ln_drg ) THEN       !== friction used as top/bottom boundary condition on TKE 
     240         ! 
     241         DO jj = 2, jpjm1           ! bottom friction 
     242            DO ji = fs_2, fs_jpim1     ! vector opt. 
     243               zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     244               zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     245               !                       ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 
     246               zebot = - 0.001875_wp * rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
     247                  &                                           + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     248               en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
     249            END DO 
     250         END DO 
     251         IF( ln_isfcav ) THEN       ! top friction 
     252            DO jj = 2, jpjm1 
     253               DO ji = fs_2, fs_jpim1   ! vector opt. 
     254                  zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     255                  zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 
     256                  !                             ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000.  (CAUTION CdU<0) 
     257                  zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
     258                     &                                           + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     259                  en(ji,jj,mikt(ji,jj)) = MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1))   ! masked at ocean surface 
     260               END DO 
     261            END DO 
     262         ENDIF 
     263         ! 
     264      ENDIF 
     265      ! 
     266      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     267      IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke   !   (Axell JGR 2002) 
    292268         !                  !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    293269         ! 
    294270         !                        !* total energy produce by LC : cumulative sum over jk 
    295          zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * gdepw_n(:,:,1) * e3w_n(:,:,1) 
     271         zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * pdepw(:,:,1) * p_e3w(:,:,1) 
    296272         DO jk = 2, jpk 
    297             zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw_n(:,:,jk) * e3w_n(:,:,jk) 
     273            zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * pdepw(:,:,jk) * p_e3w(:,:,jk) 
    298274         END DO 
    299275         !                        !* finite Langmuir Circulation depth 
     
    311287         DO jj = 1, jpj  
    312288            DO ji = 1, jpi 
    313                zhlc(ji,jj) = gdepw_n(ji,jj,imlc(ji,jj)) 
     289               zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 
    314290            END DO 
    315291         END DO 
     
    320296                  zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    321297                  !                                           ! vertical velocity due to LC 
    322                   zind = 0.5 - SIGN( 0.5, gdepw_n(ji,jj,jk) - zhlc(ji,jj) ) 
    323                   zwlc = zind * rn_lc * zus * SIN( rpi * gdepw_n(ji,jj,jk) / zhlc(ji,jj) ) 
     298                  zind = 0.5 - SIGN( 0.5, pdepw(ji,jj,jk) - zhlc(ji,jj) ) 
     299                  zwlc = zind * rn_lc * zus * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 
    324300                  !                                           ! TKE Langmuir circulation source term 
    325                   en(ji,jj,jk) = en(ji,jj,jk) + rdt * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc )   & 
     301                  en(ji,jj,jk) = en(ji,jj,jk) + rdt * MAX(0.,1._wp - 4.*fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc )   & 
    326302                     &                              / zhlc(ji,jj) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    327303               END DO 
     
    338314      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    339315      ! 
    340       DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form) 
    341          DO jj = 1, jpjm1 
    342             DO ji = 1, fs_jpim1   ! vector opt. 
    343                z3du(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji+1,jj,jk) )   & 
    344                   &                 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )   & 
    345                   &                 * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) * wumask(ji,jj,jk) & 
    346                   &                 / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
    347                z3dv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji,jj+1,jk) )   & 
    348                   &                 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )   & 
    349                   &                 * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) * wvmask(ji,jj,jk) & 
    350                   &                 / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
    351             END DO 
    352          END DO 
    353       END DO 
    354       ! 
    355       IF( nn_pdl == 1 ) THEN      !* Prandtl number case: compute apdlr 
    356          ! Note that zesh2 is also computed in the next loop. 
    357          ! We decided to compute it twice to keep code readability and avoid an IF case in the DO loops 
     316      IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    358317         DO jk = 2, jpkm1 
    359318            DO jj = 2, jpjm1 
    360                DO ji = fs_2, fs_jpim1   ! vector opt. 
    361                   !                                          ! shear prod. at w-point weightened by mask 
    362                   zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    363                      &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
    364                   !                                          ! local Richardson number 
    365                   zri   = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zesh2 + rn_bshear ) 
     319               DO ji = 2, jpim1 
     320                  !                             ! local Richardson number 
     321                  zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
     322                  !                             ! inverse of Prandtl number 
    366323                  apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
    367                    
    368                END DO 
    369             END DO 
    370          END DO 
    371          ! 
     324               END DO 
     325            END DO 
     326         END DO 
    372327      ENDIF 
    373328      !          
     
    376331            DO ji = fs_2, fs_jpim1   ! vector opt. 
    377332               zcof   = zfact1 * tmask(ji,jj,jk) 
    378 # if defined key_zdftmx_new 
    379                ! key_zdftmx_new: New internal wave-driven param: set a minimum value for Kz on TKE (ensure numerical stability) 
    380                zzd_up = zcof * MAX( avm(ji,jj,jk+1) + avm(ji,jj,jk), 2.e-5_wp )   &  ! upper diagonal 
    381                   &          / (  e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk  )  ) 
    382                zzd_lw = zcof * MAX( avm(ji,jj,jk) + avm(ji,jj,jk-1), 2.e-5_wp )   &  ! lower diagonal 
    383                   &          / (  e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  )  ) 
    384 # else 
    385                zzd_up = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   &  ! upper diagonal 
    386                   &          / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk  ) ) 
    387                zzd_lw = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   &  ! lower diagonal 
    388                   &          / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    389 # endif 
    390                !                                   ! shear prod. at w-point weightened by mask 
    391                zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    392                   &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
     333               !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
     334               !                                   ! eddy coefficient (ensure numerical stability) 
     335               zzd_up = zcof * MAX(  p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) , 2.e-5_wp  )   &  ! upper diagonal 
     336                  &          /    (  p_e3t(ji,jj,jk  ) * p_e3w(ji,jj,jk  )  ) 
     337               zzd_lw = zcof * MAX(  p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) , 2.e-5_wp  )   &  ! lower diagonal 
     338                  &          /    (  p_e3t(ji,jj,jk-1) * p_e3w(ji,jj,jk  )  ) 
    393339               ! 
    394340               zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
    395341               zd_lw(ji,jj,jk) = zzd_lw 
    396                zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * tmask(ji,jj,jk) 
     342               zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * wmask(ji,jj,jk) 
    397343               ! 
    398344               !                                   ! right hand side in en 
    399                en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  zesh2  -   avt(ji,jj,jk) * rn2(ji,jj,jk)    & 
    400                   &                                 + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk)  ) & 
    401                   &                                 * wmask(ji,jj,jk) 
     345               en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  p_sh2(ji,jj,jk)                          &   ! shear 
     346                  &                                 - p_avt(ji,jj,jk) * rn2(ji,jj,jk)          &   ! stratification 
     347                  &                                 + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk)  &   ! dissipation 
     348                  &                                ) * wmask(ji,jj,jk) 
    402349            END DO 
    403350         END DO 
     
    442389         END DO 
    443390      END DO 
    444  
     391      ! 
    445392      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    446393      !                            !  TKE due to surface and internal wave breaking 
    447394      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    448395!!gm BUG : in the exp  remove the depth of ssh !!! 
     396!!gm       i.e. use gde3w in argument (pdepw) 
    449397       
    450398       
     
    453401            DO jj = 2, jpjm1 
    454402               DO ji = fs_2, fs_jpim1   ! vector opt. 
    455                   en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
    456                      &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     403                  en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     404                     &                                 * MAX(0.,1._wp - 4.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    457405               END DO 
    458406            END DO 
     
    462410            DO ji = fs_2, fs_jpim1   ! vector opt. 
    463411               jk = nmln(ji,jj) 
    464                en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
    465                   &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     412               en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     413                  &                                 * MAX(0.,1._wp - 4.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    466414            END DO 
    467415         END DO 
     
    475423                  zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean  
    476424                  zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
    477                   en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
    478                      &                        * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    479                END DO 
    480             END DO 
    481          END DO 
    482       ENDIF 
    483       CALL lbc_lnk( en, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    484       ! 
    485       CALL wrk_dealloc( jpi,jpj,       imlc )    ! integer 
    486       CALL wrk_dealloc( jpi,jpj,       zhlc )  
    487       CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
    488       ! 
    489       IF( nn_timing == 1 )  CALL timing_stop('tke_tke') 
     425                  en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
     426                     &                        * MAX(0.,1._wp - 4.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     427               END DO 
     428            END DO 
     429         END DO 
     430      ENDIF 
     431      ! 
     432      IF( ln_timing )   CALL timing_stop('tke_tke') 
    490433      ! 
    491434   END SUBROUTINE tke_tke 
    492435 
    493436 
    494    SUBROUTINE tke_avn 
     437   SUBROUTINE tke_avn( pdepw, p_e3t, p_e3w, p_avm, p_avt ) 
    495438      !!---------------------------------------------------------------------- 
    496439      !!                   ***  ROUTINE tke_avn  *** 
     
    524467      !!      with pdlr=1 if nn_pdl=0, pdlr=1/pdl=F(Ri) otherwise. 
    525468      !! 
    526       !! ** Action  : - avt : now vertical eddy diffusivity (w-point) 
    527       !!              - avmu, avmv : now vertical eddy viscosity at uw- and vw-points 
    528       !!---------------------------------------------------------------------- 
     469      !! ** Action  : - avt, avm : now vertical eddy diffusivity and viscosity (w-point) 
     470      !!---------------------------------------------------------------------- 
     471      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pdepw          ! depth (w-points) 
     472      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_e3t, p_e3w   ! level thickness (t- & w-points) 
     473      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
     474      ! 
    529475      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    530       REAL(wp) ::   zrn2, zraug, zcoef, zav     ! local scalars 
    531       REAL(wp) ::   zdku, zri, zsqen            !   -      - 
    532       REAL(wp) ::   zdkv, zemxl, zemlm, zemlp   !   -      - 
    533       REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl, zmxlm, zmxld 
     476      REAL(wp) ::   zrn2, zraug, zcoef, zav   ! local scalars 
     477      REAL(wp) ::   zdku,   zdkv, zsqen       !   -      - 
     478      REAL(wp) ::   zemxl, zemlm, zemlp       !   -      - 
     479      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmxlm, zmxld   ! 3D workspace 
    534480      !!-------------------------------------------------------------------- 
    535481      ! 
    536       IF( nn_timing == 1 )  CALL timing_start('tke_avn') 
    537  
    538       CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )  
    539  
     482      IF( ln_timing )   CALL timing_start('tke_avn') 
     483      ! 
    540484      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    541485      !                     !  Mixing length 
     
    549493      ! 
    550494      IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 
     495         zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    551496         DO jj = 2, jpjm1 
    552497            DO ji = fs_2, fs_jpim1 
    553                zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    554498               zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 
    555499            END DO 
     
    576520      ! 
    577521 !!gm Not sure of that coding for ISF.... 
    578       ! where wmask = 0 set zmxlm == e3w_n 
     522      ! where wmask = 0 set zmxlm == p_e3w 
    579523      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    580524         DO jk = 2, jpkm1 
    581525            DO jj = 2, jpjm1 
    582526               DO ji = fs_2, fs_jpim1   ! vector opt. 
    583                   zemxl = MIN( gdepw_n(ji,jj,jk) - gdepw_n(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
    584                   &            gdepw_n(ji,jj,mbkt(ji,jj)+1) - gdepw_n(ji,jj,jk) ) 
     527                  zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
     528                  &            pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 
    585529                  ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
    586                   zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
    587                   zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
     530                  zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
     531                  zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
    588532               END DO 
    589533            END DO 
     
    594538            DO jj = 2, jpjm1 
    595539               DO ji = fs_2, fs_jpim1   ! vector opt. 
    596                   zemxl = MIN( e3w_n(ji,jj,jk), zmxlm(ji,jj,jk) ) 
     540                  zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
    597541                  zmxlm(ji,jj,jk) = zemxl 
    598542                  zmxld(ji,jj,jk) = zemxl 
     
    605549            DO jj = 2, jpjm1 
    606550               DO ji = fs_2, fs_jpim1   ! vector opt. 
    607                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     551                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    608552               END DO 
    609553            END DO 
     
    612556            DO jj = 2, jpjm1 
    613557               DO ji = fs_2, fs_jpim1   ! vector opt. 
    614                   zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     558                  zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    615559                  zmxlm(ji,jj,jk) = zemxl 
    616560                  zmxld(ji,jj,jk) = zemxl 
     
    623567            DO jj = 2, jpjm1 
    624568               DO ji = fs_2, fs_jpim1   ! vector opt. 
    625                   zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     569                  zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    626570               END DO 
    627571            END DO 
     
    630574            DO jj = 2, jpjm1 
    631575               DO ji = fs_2, fs_jpim1   ! vector opt. 
    632                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     576                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    633577               END DO 
    634578            END DO 
     
    647591      END SELECT 
    648592      ! 
    649 # if defined key_c1d 
    650       e_dis(:,:,:) = zmxld(:,:,:)      ! c1d configuration : save mixing and dissipation turbulent length scales 
    651       e_mix(:,:,:) = zmxlm(:,:,:) 
    652 # endif 
    653  
    654       !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    655       !                     !  Vertical eddy viscosity and diffusivity  (avmu, avmv, avt) 
     593      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     594      !                     !  Vertical eddy viscosity and diffusivity  (avm and avt) 
    656595      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    657596      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
     
    660599               zsqen = SQRT( en(ji,jj,jk) ) 
    661600               zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
    662                avm  (ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
    663                avt  (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
     601               p_avm(ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
     602               p_avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    664603               dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 
    665604            END DO 
    666605         END DO 
    667606      END DO 
    668       CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    669       ! 
    670       DO jk = 2, jpkm1            !* vertical eddy viscosity at wu- and wv-points 
    671          DO jj = 2, jpjm1 
    672             DO ji = fs_2, fs_jpim1   ! vector opt. 
    673                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * wumask(ji,jj,jk) 
    674                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * wvmask(ji,jj,jk) 
    675             END DO 
    676          END DO 
    677       END DO 
    678       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )      ! Lateral boundary conditions 
     607      ! 
    679608      ! 
    680609      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
     
    682611            DO jj = 2, jpjm1 
    683612               DO ji = fs_2, fs_jpim1   ! vector opt. 
    684                   avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    685 # if defined key_c1d 
    686                   e_pdl(ji,jj,jk) = apdlr(ji,jj,jk) * wmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number 
    687 !!gm bug NO zri here.... 
    688 !!gm remove the specific diag for c1d ! 
    689                   e_ric(ji,jj,jk) = zri * wmask(ji,jj,jk)                            ! c1d config. : save Ri 
    690 # endif 
     613                  p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    691614              END DO 
    692615            END DO 
    693616         END DO 
    694617      ENDIF 
    695       CALL lbc_lnk( avt, 'W', 1. )                      ! Lateral boundary conditions on avt  (sign unchanged) 
    696  
     618      ! 
    697619      IF(ln_ctl) THEN 
    698          CALL prt_ctl( tab3d_1=en  , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
    699          CALL prt_ctl( tab3d_1=avmu, clinfo1=' tke  - u: ', mask1=umask,                   & 
    700             &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk ) 
    701       ENDIF 
    702       ! 
    703       CALL wrk_dealloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )  
    704       ! 
    705       IF( nn_timing == 1 )  CALL timing_stop('tke_avn') 
     620         CALL prt_ctl( tab3d_1=en , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     621         CALL prt_ctl( tab3d_1=avm, clinfo1=' tke  - m: ', ovlap=1, kdim=jpk ) 
     622      ENDIF 
     623      ! 
     624      IF( ln_timing )   CALL timing_stop('tke_avn') 
    706625      ! 
    707626   END SUBROUTINE tke_avn 
     
    727646      NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin  ,   & 
    728647         &                 rn_emin0, rn_bshear, nn_mxl , ln_mxl0  ,   & 
    729          &                 rn_mxl0 , nn_pdl   , ln_lc  , rn_lc    ,   & 
     648         &                 rn_mxl0 , nn_pdl   , ln_drg , ln_lc    , rn_lc    ,   & 
    730649         &                 nn_etau , nn_htau  , rn_efr    
    731650      !!---------------------------------------------------------------------- 
     
    741660      ! 
    742661      ri_cri   = 2._wp    / ( 2._wp + rn_ediss / rn_ediff )   ! resulting critical Richardson number 
    743 # if defined key_zdftmx_new 
    744       ! key_zdftmx_new: New internal wave-driven param: specified value of rn_emin & rmxl_min are used 
    745       rn_emin  = 1.e-10_wp 
    746       rmxl_min = 1.e-03_wp 
    747       IF(lwp) THEN                  ! Control print 
    748          WRITE(numout,*) 
    749          WRITE(numout,*) 'zdf_tke_init :  New tidal mixing case: force rn_emin = 1.e-10 and rmxl_min = 1.e-3 ' 
    750          WRITE(numout,*) '~~~~~~~~~~~~' 
    751       ENDIF 
    752 # else 
    753       rmxl_min = 1.e-6_wp / ( rn_ediff * SQRT( rn_emin ) )    ! resulting minimum length to recover molecular viscosity 
    754 # endif 
    755662      ! 
    756663      IF(lwp) THEN                    !* Control print 
     
    764671         WRITE(numout,*) '      minimum value of tke                        rn_emin   = ', rn_emin 
    765672         WRITE(numout,*) '      surface minimum value of tke                rn_emin0  = ', rn_emin0 
     673         WRITE(numout,*) '      prandl number flag                          nn_pdl    = ', nn_pdl 
    766674         WRITE(numout,*) '      background shear (>0)                       rn_bshear = ', rn_bshear 
    767675         WRITE(numout,*) '      mixing length type                          nn_mxl    = ', nn_mxl 
    768          WRITE(numout,*) '      prandl number flag                          nn_pdl    = ', nn_pdl 
    769          WRITE(numout,*) '      surface mixing length = F(stress) or not    ln_mxl0   = ', ln_mxl0 
    770          WRITE(numout,*) '      surface  mixing length minimum value        rn_mxl0   = ', rn_mxl0 
    771          WRITE(numout,*) '      flag to take into acc.  Langmuir circ.      ln_lc     = ', ln_lc 
    772          WRITE(numout,*) '      coef to compute verticla velocity of LC     rn_lc     = ', rn_lc 
     676         WRITE(numout,*) '         surface mixing length = F(stress) or not    ln_mxl0   = ', ln_mxl0 
     677         WRITE(numout,*) '         surface  mixing length minimum value        rn_mxl0   = ', rn_mxl0 
     678         WRITE(numout,*) '      top/bottom friction forcing flag            ln_drg    = ', ln_drg 
     679         WRITE(numout,*) '      Langmuir cells parametrization              ln_lc     = ', ln_lc 
     680         WRITE(numout,*) '         coef to compute vertical velocity of LC     rn_lc  = ', rn_lc 
    773681         WRITE(numout,*) '      test param. to add tke induced by wind      nn_etau   = ', nn_etau 
    774          WRITE(numout,*) '      flag for computation of exp. tke profile    nn_htau   = ', nn_htau 
    775          WRITE(numout,*) '      fraction of en which pene. the thermocline  rn_efr    = ', rn_efr 
     682         WRITE(numout,*) '          type of tke penetration profile            nn_htau   = ', nn_htau 
     683         WRITE(numout,*) '          fraction of TKE that penetrates            rn_efr    = ', rn_efr 
    776684         WRITE(numout,*) 
    777          WRITE(numout,*) '      critical Richardson nb with your parameters  ri_cri = ', ri_cri 
     685         IF( ln_drg ) THEN 
     686            WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     687            WRITE(numout,*) '      top    ocean cavity roughness (m)          rn_z0(_top)= ', r_z0_top 
     688            WRITE(numout,*) '      Bottom seafloor     roughness (m)          rn_z0(_bot)= ', r_z0_bot 
     689         ENDIF 
     690         WRITE(numout,*) 
     691         WRITE(numout,*) 
     692         WRITE(numout,*) '   ==>> critical Richardson nb with your parameters  ri_cri = ', ri_cri 
     693         WRITE(numout,*) 
     694      ENDIF 
     695      ! 
     696      IF( ln_zdfiwm ) THEN          ! Internal wave-driven mixing 
     697         rn_emin  = 1.e-10_wp             ! specific values of rn_emin & rmxl_min are used 
     698         rmxl_min = 1.e-03_wp             ! associated avt minimum = molecular salt diffusivity (10^-9 m2/s) 
     699         IF(lwp) WRITE(numout,*) '      Internal wave-driven mixing case:   force   rn_emin = 1.e-10 and rmxl_min = 1.e-3 ' 
     700      ELSE                          ! standard case : associated avt minimum = molecular viscosity (10^-6 m2/s) 
     701         rmxl_min = 1.e-6_wp / ( rn_ediff * SQRT( rn_emin ) )    ! resulting minimum length to recover molecular viscosity 
     702         IF(lwp) WRITE(numout,*) '      minimum mixing length with your parameters rmxl_min = ', rmxl_min 
    778703      ENDIF 
    779704      ! 
     
    805730      !                               !* set vertical eddy coef. to the background value 
    806731      DO jk = 1, jpk 
    807          avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    808          avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    809          avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    810          avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
     732         avt(:,:,jk) = avtb(jk) * wmask(:,:,jk) 
     733         avm(:,:,jk) = avmb(jk) * wmask(:,:,jk) 
    811734      END DO 
    812735      dissl(:,:,:) = 1.e-12_wp 
     
    818741 
    819742   SUBROUTINE tke_rst( kt, cdrw ) 
    820      !!--------------------------------------------------------------------- 
    821      !!                   ***  ROUTINE tke_rst  *** 
    822      !!                      
    823      !! ** Purpose :   Read or write TKE file (en) in restart file 
    824      !! 
    825      !! ** Method  :   use of IOM library 
    826      !!                if the restart does not contain TKE, en is either  
    827      !!                set to rn_emin or recomputed  
    828      !!---------------------------------------------------------------------- 
    829      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
    830      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    831      ! 
    832      INTEGER ::   jit, jk   ! dummy loop indices 
    833      INTEGER ::   id1, id2, id3, id4, id5, id6   ! local integers 
    834      !!---------------------------------------------------------------------- 
    835      ! 
    836      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
    837         !                                   ! --------------- 
    838         IF( ln_rstart ) THEN                   !* Read the restart file 
    839            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    840            id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. ) 
    841            id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. ) 
    842            id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. ) 
    843            id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. ) 
    844            id6 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
    845            ! 
    846            IF( id1 > 0 ) THEN                       ! 'en' exists 
    847               CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
    848               IF( MIN( id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
    849                  CALL iom_get( numror, jpdom_autoglo, 'avt'  , avt   ) 
    850                  CALL iom_get( numror, jpdom_autoglo, 'avm'  , avm   ) 
    851                  CALL iom_get( numror, jpdom_autoglo, 'avmu' , avmu  ) 
    852                  CALL iom_get( numror, jpdom_autoglo, 'avmv' , avmv  ) 
    853                  CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
    854               ELSE                                                 ! one at least array is missing 
    855                  CALL tke_avn                                          ! compute avt, avm, avmu, avmv and dissl (approximation) 
    856               ENDIF 
    857            ELSE                                     ! No TKE array found: initialisation 
    858               IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop' 
    859               en (:,:,:) = rn_emin * tmask(:,:,:) 
    860               CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation) 
    861               ! 
    862               avt_k (:,:,:) = avt (:,:,:) 
    863               avm_k (:,:,:) = avm (:,:,:) 
    864               avmu_k(:,:,:) = avmu(:,:,:) 
    865               avmv_k(:,:,:) = avmv(:,:,:) 
    866               ! 
    867               DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO 
    868            ENDIF 
    869         ELSE                                   !* Start from rest 
    870            en(:,:,:) = rn_emin * tmask(:,:,:) 
    871            DO jk = 1, jpk                           ! set the Kz to the background value 
    872               avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    873               avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    874               avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
    875               avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
    876            END DO 
    877         ENDIF 
    878         ! 
    879      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
    880         !                                   ! ------------------- 
    881         IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
    882         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     ) 
    883         CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    884         CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    885         CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 
    886         CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    887         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl  ) 
    888         ! 
    889      ENDIF 
    890      ! 
     743      !!--------------------------------------------------------------------- 
     744      !!                   ***  ROUTINE tke_rst  *** 
     745      !!                      
     746      !! ** Purpose :   Read or write TKE file (en) in restart file 
     747      !! 
     748      !! ** Method  :   use of IOM library 
     749      !!                if the restart does not contain TKE, en is either  
     750      !!                set to rn_emin or recomputed  
     751      !!---------------------------------------------------------------------- 
     752      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     753      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
     754      ! 
     755      INTEGER ::   jit, jk              ! dummy loop indices 
     756      INTEGER ::   id1, id2, id3, id4   ! local integers 
     757      !!---------------------------------------------------------------------- 
     758      ! 
     759      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     760         !                                   ! --------------- 
     761         IF( ln_rstart ) THEN                   !* Read the restart file 
     762            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
     763            id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
     764            id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
     765            id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
     766            ! 
     767            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN      ! fields exist 
     768               CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
     769               CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
     770               CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
     771               CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
     772            ELSE                                          ! start TKE from rest 
     773               IF(lwp) WRITE(numout,*) '   ==>>   previous run without TKE scheme, set en to background values' 
     774               en(:,:,:) = rn_emin * wmask(:,:,:) 
     775               ! avt_k, avm_k already set to the background value in zdf_phy_init 
     776            ENDIF 
     777         ELSE                                   !* Start from rest 
     778            IF(lwp) WRITE(numout,*) '   ==>>   start from rest: set en to the background value' 
     779            en(:,:,:) = rn_emin * wmask(:,:,:) 
     780            ! avt_k, avm_k already set to the background value in zdf_phy_init 
     781         ENDIF 
     782         ! 
     783      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
     784         !                                   ! ------------------- 
     785         IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
     786         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    ) 
     787         CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
     788         CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
     789         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 
     790         ! 
     791      ENDIF 
     792      ! 
    891793   END SUBROUTINE tke_rst 
    892  
    893 #else 
    894    !!---------------------------------------------------------------------- 
    895    !!   Dummy module :                                        NO TKE scheme 
    896    !!---------------------------------------------------------------------- 
    897    LOGICAL, PUBLIC, PARAMETER ::   lk_zdftke = .FALSE.   !: TKE flag 
    898 CONTAINS 
    899    SUBROUTINE zdf_tke_init           ! Dummy routine 
    900    END SUBROUTINE zdf_tke_init 
    901    SUBROUTINE zdf_tke( kt )          ! Dummy routine 
    902       WRITE(*,*) 'zdf_tke: You should not have seen this print! error?', kt 
    903    END SUBROUTINE zdf_tke 
    904    SUBROUTINE tke_rst( kt, cdrw ) 
    905      CHARACTER(len=*) ::   cdrw 
    906      WRITE(*,*) 'tke_rst: You should not have seen this print! error?', kt, cdwr 
    907    END SUBROUTINE tke_rst 
    908 #endif 
    909794 
    910795   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.