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/zdfgls.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/zdfgls.F90

    r7646 r8882  
    55   !!                 turbulent closure parameterization 
    66   !!====================================================================== 
    7    !! History :   3.0  !  2009-09  (G. Reffray)  Original code 
    8    !!             3.3  !  2010-10  (C. Bricaud)  Add in the reference 
     7   !! History :  3.0  !  2009-09  (G. Reffray)  Original code 
     8   !!            3.3  !  2010-10  (C. Bricaud)  Add in the reference 
     9   !!            4.0  !  2017-04  (G. Madec)  remove CPP keys & avm at t-point only  
     10   !!             -   !  2017-05  (G. Madec)  add top friction as boundary condition 
    911   !!---------------------------------------------------------------------- 
    10 #if defined key_zdfgls 
    11    !!---------------------------------------------------------------------- 
    12    !!   'key_zdfgls'                 Generic Length Scale vertical physics 
     12 
    1313   !!---------------------------------------------------------------------- 
    1414   !!   zdf_gls       : update momentum and tracer Kz from a gls scheme 
     
    2020   USE domvvl         ! ocean space and time domain : variable volume layer 
    2121   USE zdf_oce        ! ocean vertical physics 
    22    USE zdfbfr         ! bottom friction (only for rn_bfrz0) 
     22   USE zdfdrg  , ONLY : r_z0_top , r_z0_bot   ! top/bottom roughness 
     23   USE zdfdrg  , ONLY : rCdU_top , rCdU_bot   ! top/bottom friction 
    2324   USE sbc_oce        ! surface boundary condition: ocean 
    2425   USE phycst         ! physical constants 
    2526   USE zdfmxl         ! mixed layer 
    26    USE sbcwave ,  ONLY: hsw   ! significant wave height 
     27   USE sbcwave , ONLY : hsw   ! significant wave height 
    2728   ! 
    2829   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    2930   USE lib_mpp        ! MPP manager 
    30    USE wrk_nemo       ! work arrays 
    3131   USE prtctl         ! Print control 
    3232   USE in_out_manager ! I/O manager 
     
    3838   PRIVATE 
    3939 
    40    PUBLIC   zdf_gls        ! routine called in step module 
    41    PUBLIC   zdf_gls_init   ! routine called in opa module 
    42    PUBLIC   gls_rst        ! routine called in step module 
    43  
    44    LOGICAL , PUBLIC, PARAMETER ::   lk_zdfgls = .TRUE.   !: TKE vertical mixing flag 
     40   PUBLIC   zdf_gls        ! called in zdfphy 
     41   PUBLIC   zdf_gls_init   ! called in zdfphy 
     42   PUBLIC   gls_rst        ! called in zdfphy 
     43 
    4544   ! 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   mxln    !: now mixing length 
     45   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hmxl_n    !: now mixing length 
    4746   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   zwall   !: wall function 
    48    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustars2 !: Squared surface velocity scale at T-points 
    49    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustarb2 !: Squared bottom  velocity scale at T-points 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_surf !: Squared surface velocity scale at T-points 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_top  !: Squared top     velocity scale at T-points 
     49   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_bot  !: Squared bottom  velocity scale at T-points 
    5050 
    5151   !                              !! ** Namelist  namzdf_gls  ** 
     
    102102   REAL(wp) ::   rsc_tke, rsc_psi, rpsi1, rpsi2, rpsi3, rsc_psi0  !     -           -           -        - 
    103103   REAL(wp) ::   rpsi3m, rpsi3p, rpp, rmm, rnn                    !     -           -           -        - 
     104   ! 
     105   REAL(wp) ::   r2_3 = 2._wp/3._wp   ! constant=2/3 
    104106 
    105107   !! * Substitutions 
     
    116118      !!                ***  FUNCTION zdf_gls_alloc  *** 
    117119      !!---------------------------------------------------------------------- 
    118       ALLOCATE( mxln(jpi,jpj,jpk), zwall(jpi,jpj,jpk) ,     & 
    119          &      ustars2(jpi,jpj) , ustarb2(jpi,jpj)  , STAT= zdf_gls_alloc ) 
     120      ALLOCATE( hmxl_n(jpi,jpj,jpk) , ustar2_surf(jpi,jpj) ,                     & 
     121         &      zwall (jpi,jpj,jpk) , ustar2_top (jpi,jpj) , ustar2_bot(jpi,jpj) , STAT= zdf_gls_alloc ) 
    120122         ! 
    121123      IF( lk_mpp             )   CALL mpp_sum ( zdf_gls_alloc ) 
     
    124126 
    125127 
    126    SUBROUTINE zdf_gls( kt ) 
     128   SUBROUTINE zdf_gls( kt, p_sh2, p_avm, p_avt ) 
    127129      !!---------------------------------------------------------------------- 
    128130      !!                   ***  ROUTINE zdf_gls  *** 
     
    131133      !!              coefficients using the GLS turbulent closure scheme. 
    132134      !!---------------------------------------------------------------------- 
    133       INTEGER, INTENT(in) ::   kt ! ocean time step 
    134       INTEGER  ::   ji, jj, jk, ibot, ibotm1, dir  ! dummy loop arguments 
    135       REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1, zex2   ! local scalars 
    136       REAL(wp) ::   ztx2, zty2, zup, zdown, zcof        !   -      -  
    137       REAL(wp) ::   zratio, zrn2, zflxb, sh             !   -      - 
     135      INTEGER                   , INTENT(in   ) ::   kt             ! ocean time step 
     136      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     137      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
     138      ! 
     139      INTEGER  ::   ji, jj, jk    ! dummy loop arguments 
     140      INTEGER  ::   ibot, ibotm1  ! local integers 
     141      INTEGER  ::   itop, itopp1  !   -       - 
     142      REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1 , zex2  ! local scalars 
     143      REAL(wp) ::   ztx2, zty2, zup, zdown, zcof, zdir  !   -      -  
     144      REAL(wp) ::   zratio, zrn2, zflxb, sh     , z_en  !   -      - 
    138145      REAL(wp) ::   prod, buoy, diss, zdiss, sm         !   -      - 
    139       REAL(wp) ::   gh, gm, shr, dif, zsqen, zav        !   -      - 
    140       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zdep 
    141       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zkar 
    142       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zflxs       ! Turbulence fluxed induced by internal waves  
    143       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhsro       ! Surface roughness (surface waves) 
    144       REAL(wp), POINTER, DIMENSION(:,:,:) ::   eb          ! tke at time before 
    145       REAL(wp), POINTER, DIMENSION(:,:,:) ::   mxlb        ! mixing length at time before 
    146       REAL(wp), POINTER, DIMENSION(:,:,:) ::   shear       ! vertical shear 
    147       REAL(wp), POINTER, DIMENSION(:,:,:) ::   eps         ! dissipation rate 
    148       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zwall_psi   ! Wall function use in the wb case (ln_sigpsi) 
    149       REAL(wp), POINTER, DIMENSION(:,:,:) ::   psi         ! psi at time now 
    150       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_a    ! element of the first  matrix diagonal 
    151       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_b    ! element of the second matrix diagonal 
    152       REAL(wp), POINTER, DIMENSION(:,:,:) ::   z_elem_c    ! element of the third  matrix diagonal 
     146      REAL(wp) ::   gh, gm, shr, dif, zsqen, zavt, zavm !   -      - 
     147      REAL(wp) ::   zmsku, zmskv                        !   -      - 
     148      REAL(wp), DIMENSION(jpi,jpj)     ::   zdep 
     149      REAL(wp), DIMENSION(jpi,jpj)     ::   zkar 
     150      REAL(wp), DIMENSION(jpi,jpj)     ::   zflxs       ! Turbulence fluxed induced by internal waves  
     151      REAL(wp), DIMENSION(jpi,jpj)     ::   zhsro       ! Surface roughness (surface waves) 
     152      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   eb          ! tke at time before 
     153      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   hmxl_b      ! mixing length at time before 
     154      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   eps         ! dissipation rate 
     155      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwall_psi   ! Wall function use in the wb case (ln_sigpsi) 
     156      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   psi         ! psi at time now 
     157      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zd_lw, zd_up, zdiag   ! lower, upper  and diagonal of the matrix 
     158      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zstt, zstm  ! stability function on tracer and momentum 
    153159      !!-------------------------------------------------------------------- 
    154160      ! 
    155       IF( nn_timing == 1 )  CALL timing_start('zdf_gls') 
    156       ! 
    157       CALL wrk_alloc( jpi,jpj,       zdep, zkar, zflxs, zhsro ) 
    158       CALL wrk_alloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi  ) 
    159        
     161      IF( ln_timing )   CALL timing_start('zdf_gls') 
     162      ! 
    160163      ! Preliminary computing 
    161164 
    162       ustars2 = 0._wp   ;   ustarb2 = 0._wp   ;   psi  = 0._wp   ;   zwall_psi = 0._wp 
    163  
    164       IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    165          avt (:,:,:) = avt_k (:,:,:) 
    166          avm (:,:,:) = avm_k (:,:,:) 
    167          avmu(:,:,:) = avmu_k(:,:,:) 
    168          avmv(:,:,:) = avmv_k(:,:,:)  
    169       ENDIF 
    170  
    171       ! Compute surface and bottom friction at T-points 
     165      ustar2_surf(:,:) = 0._wp   ;         psi(:,:,:) = 0._wp    
     166      ustar2_top (:,:) = 0._wp   ;   zwall_psi(:,:,:) = 0._wp 
     167      ustar2_bot (:,:) = 0._wp 
     168 
     169      ! Compute surface, top and bottom friction at T-points 
    172170      DO jj = 2, jpjm1           
    173171         DO ji = fs_2, fs_jpim1   ! vector opt.          
    174172            ! 
    175173            ! surface friction 
    176             ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
     174            ustar2_surf(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
    177175            !    
    178             ! bottom friction (explicit before friction)         
    179             ! Note that we chose here not to bound the friction as in dynbfr)    
    180             ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   &          
    181                & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  )       
    182             zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   &          
    183                & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  )       
    184             ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)          
    185          END DO          
    186       END DO     
    187  
    188       ! Set surface roughness length 
    189       SELECT CASE ( nn_z0_met ) 
    190       ! 
    191       CASE ( 0 )             ! Constant roughness           
     176!!gm Rq we may add here r_ke0(_top/_bot) ?  ==>> think about that... 
     177          ! bottom friction (explicit before friction) 
     178          zmsku = ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     179          zmskv = ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )     ! (CAUTION: CdU<0) 
     180          ustar2_bot(ji,jj) = - rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
     181             &                                         + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     182         END DO 
     183      END DO 
     184      IF( ln_isfcav ) THEN       !top friction 
     185         DO jj = 2, jpjm1 
     186            DO ji = fs_2, fs_jpim1   ! vector opt. 
     187               zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     188               zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )     ! (CAUTION: CdU<0) 
     189               ustar2_top(ji,jj) = - rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
     190                  &                                         + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     191            END DO 
     192         END DO 
     193      ENDIF 
     194    
     195      SELECT CASE ( nn_z0_met )      !==  Set surface roughness length  ==! 
     196      CASE ( 0 )                          ! Constant roughness           
    192197         zhsro(:,:) = rn_hsro 
    193198      CASE ( 1 )             ! Standard Charnock formula 
    194          zhsro(:,:) = MAX(rsbc_zs1 * ustars2(:,:), rn_hsro) 
     199         zhsro(:,:) = MAX( rsbc_zs1 * ustar2_surf(:,:) , rn_hsro ) 
    195200      CASE ( 2 )             ! Roughness formulae according to Rascle et al., Ocean Modelling (2008) 
    196          zdep(:,:)  = 30.*TANH(2.*0.3/(28.*SQRT(MAX(ustars2(:,:),rsmall))))             ! Wave age (eq. 10) 
    197          zhsro(:,:) = MAX(rsbc_zs2 * ustars2(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 
     201!!gm faster coding : the 2 comment lines should be used 
     202!!gm         zcof = 2._wp * 0.6_wp / 28._wp 
     203!!gm         zdep(:,:)  = 30._wp * TANH(  zcof/ SQRT( MAX(ustar2_surf(:,:),rsmall) )  )       ! Wave age (eq. 10) 
     204         zdep (:,:) = 30.*TANH( 2.*0.3/(28.*SQRT(MAX(ustar2_surf(:,:),rsmall))) )         ! Wave age (eq. 10) 
     205         zhsro(:,:) = MAX(rsbc_zs2 * ustar2_surf(:,:) * zdep(:,:)**1.5, rn_hsro)          ! zhsro = rn_frac_hs * Hsw (eq. 11) 
    198206      CASE ( 3 )             ! Roughness given by the wave model (coupled or read in file) 
    199          zhsro(:,:) = hsw(:,:) 
     207         zhsro(:,:) = rn_frac_hs * hsw(:,:)   ! (rn_frac_hs=1.6 see Eq. (5) of Rascle et al. 2008 ) 
    200208      END SELECT 
    201  
    202       ! Compute shear and dissipation rate 
    203       DO jk = 2, jpkm1 
    204          DO jj = 2, jpjm1 
    205             DO ji = fs_2, fs_jpim1   ! vector opt. 
    206                avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) )   & 
    207                   &                            * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) )   & 
    208                   &                            / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
    209                avmv(ji,jj,jk) = avmv(ji,jj,jk) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) )   & 
    210                   &                            * ( vb(ji,jj,jk-1) - vb(ji,jj,jk) )   & 
    211                   &                            / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
    212                eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT(en(ji,jj,jk)) / mxln(ji,jj,jk) 
     209      ! 
     210      DO jk = 2, jpkm1              !==  Compute dissipation rate  ==! 
     211         DO jj = 1, jpjm1 
     212            DO ji = 1, jpim1 
     213               eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / hmxl_n(ji,jj,jk) 
    213214            END DO 
    214215         END DO 
    215216      END DO 
    216       ! 
    217       ! Lateral boundary conditions (avmu,avmv) (sign unchanged) 
    218       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
    219217 
    220218      ! Save tke at before time step 
    221       eb  (:,:,:) = en  (:,:,:) 
    222       mxlb(:,:,:) = mxln(:,:,:) 
     219      eb    (:,:,:) = en    (:,:,:) 
     220      hmxl_b(:,:,:) = hmxl_n(:,:,:) 
    223221 
    224222      IF( nn_clos == 0 ) THEN    ! Mellor-Yamada 
     
    226224            DO jj = 2, jpjm1  
    227225               DO ji = fs_2, fs_jpim1   ! vector opt. 
    228                   zup   = mxln(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
     226                  zup   = hmxl_n(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
    229227                  zdown = vkarmn * gdepw_n(ji,jj,jk) * ( -gdepw_n(ji,jj,jk) + gdepw_n(ji,jj,mbkt(ji,jj)+1) ) 
    230228                  zcoef = ( zup / MAX( zdown, rsmall ) ) 
     
    245243      ! The surface boundary condition are set after 
    246244      ! The bottom boundary condition are also set after. In standard e(bottom)=0. 
    247       ! z_elem_b : diagonal z_elem_c : upper diagonal z_elem_a : lower diagonal 
     245      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    248246      ! Warning : after this step, en : right hand side of the matrix 
    249247 
    250248      DO jk = 2, jpkm1 
    251249         DO jj = 2, jpjm1 
    252             DO ji = fs_2, fs_jpim1   ! vector opt. 
    253                ! 
    254                ! shear prod. at w-point weightened by mask 
    255                shear(ji,jj,jk) =  ( avmu(ji-1,jj,jk) + avmu(ji,jj,jk) ) / MAX( 1.e0 , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    256                   &             + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1.e0 , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 
    257                ! 
    258                ! stratif. destruction 
    259                buoy = - avt(ji,jj,jk) * rn2(ji,jj,jk) 
    260                ! 
    261                ! shear prod. - stratif. destruction 
    262                diss = eps(ji,jj,jk) 
    263                ! 
    264                dir = 0.5_wp + SIGN( 0.5_wp, shear(ji,jj,jk) + buoy )   ! dir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
    265                ! 
    266                zesh2 = dir*(shear(ji,jj,jk)+buoy)+(1._wp-dir)*shear(ji,jj,jk)          ! production term 
    267                zdiss = dir*(diss/en(ji,jj,jk))   +(1._wp-dir)*(diss-buoy)/en(ji,jj,jk) ! dissipation term 
     250            DO ji = 2, jpim1 
     251               ! 
     252               buoy = - p_avt(ji,jj,jk) * rn2(ji,jj,jk)     ! stratif. destruction 
     253               ! 
     254               diss = eps(ji,jj,jk)                         ! dissipation 
     255               ! 
     256               zdir = 0.5_wp + SIGN( 0.5_wp, p_sh2(ji,jj,jk) + buoy )   ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
     257               ! 
     258               zesh2 = zdir*(p_sh2(ji,jj,jk)+buoy)+(1._wp-zdir)*p_sh2(ji,jj,jk)          ! production term 
     259               zdiss = zdir*(diss/en(ji,jj,jk))   +(1._wp-zdir)*(diss-buoy)/en(ji,jj,jk) ! dissipation term 
     260!!gm better coding, identical results 
     261!               zesh2 =   p_sh2(ji,jj,jk) + zdir*buoy               ! production term 
     262!               zdiss = ( diss - (1._wp-zdir)*buoy ) / en(ji,jj,jk) ! dissipation term 
     263!!gm 
    268264               ! 
    269265               ! Compute a wall function from 1. to rsc_psi*zwall/rsc_psi0 
     
    281277               ! building the matrix 
    282278               zcof = rfact_tke * tmask(ji,jj,jk) 
    283                ! 
    284                ! lower diagonal 
    285                z_elem_a(ji,jj,jk) = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   & 
    286                   &                      / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    287                ! 
    288                ! upper diagonal 
    289                z_elem_c(ji,jj,jk) = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   & 
    290                   &                      / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
    291                ! 
    292                ! diagonal 
    293                z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    294                   &                       + rdt * zdiss * tmask(ji,jj,jk)  
    295                ! 
    296                ! right hand side in en 
    297                en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * tmask(ji,jj,jk) 
     279               !                                               ! lower diagonal 
     280               zd_lw(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 
     281               !                                               ! upper diagonal 
     282               zd_up(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) ) / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
     283               !                                               ! diagonal 
     284               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk)  + rdt * zdiss * wmask(ji,jj,jk)  
     285               !                                               ! right hand side in en 
     286               en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    298287            END DO 
    299288         END DO 
    300289      END DO 
    301290      ! 
    302       z_elem_b(:,:,jpk) = 1._wp 
     291      zdiag(:,:,jpk) = 1._wp 
    303292      ! 
    304293      ! Set surface condition on zwall_psi (1 at the bottom) 
    305       zwall_psi(:,:,1) = zwall_psi(:,:,2) 
    306       zwall_psi(:,:,jpk) = 1. 
     294      zwall_psi(:,:, 1 ) = zwall_psi(:,:,2) 
     295      zwall_psi(:,:,jpk) = 1._wp 
    307296      ! 
    308297      ! Surface boundary condition on tke 
     
    311300      SELECT CASE ( nn_bc_surf ) 
    312301      ! 
    313       CASE ( 0 )             ! Dirichlet case 
     302      CASE ( 0 )             ! Dirichlet boundary condition (set e at k=1 & 2)  
    314303      ! First level 
    315       en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    316       en(:,:,1) = MAX(en(:,:,1), rn_emin)  
    317       z_elem_a(:,:,1) = en(:,:,1) 
    318       z_elem_c(:,:,1) = 0._wp 
    319       z_elem_b(:,:,1) = 1._wp 
     304      en   (:,:,1) = MAX(  rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3  ) 
     305      zd_lw(:,:,1) = en(:,:,1) 
     306      zd_up(:,:,1) = 0._wp 
     307      zdiag(:,:,1) = 1._wp 
    320308      !  
    321309      ! One level below 
    322       en(:,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2)) & 
    323          &               / zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 
    324       en(:,:,2) = MAX(en(:,:,2), rn_emin ) 
    325       z_elem_a(:,:,2) = 0._wp  
    326       z_elem_c(:,:,2) = 0._wp 
    327       z_elem_b(:,:,2) = 1._wp 
    328       ! 
    329       ! 
    330       CASE ( 1 )             ! Neumann boundary condition on d(e)/dz 
     310      en   (:,:,2) =  MAX(  rc02r * ustar2_surf(:,:) * (  1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2))   & 
     311         &                 / zhsro(:,:) )**(1.5_wp*ra_sf)  )**(2._wp/3._wp)                      , rn_emin   ) 
     312      zd_lw(:,:,2) = 0._wp  
     313      zd_up(:,:,2) = 0._wp 
     314      zdiag(:,:,2) = 1._wp 
     315      ! 
     316      ! 
     317      CASE ( 1 )             ! Neumann boundary condition (set d(e)/dz) 
    331318      ! 
    332319      ! Dirichlet conditions at k=1 
    333       en(:,:,1)       = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 
    334       en(:,:,1)       = MAX(en(:,:,1), rn_emin)       
    335       z_elem_a(:,:,1) = en(:,:,1) 
    336       z_elem_c(:,:,1) = 0._wp 
    337       z_elem_b(:,:,1) = 1._wp 
     320      en   (:,:,1) = MAX(  rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 , rn_emin  ) 
     321      zd_lw(:,:,1) = en(:,:,1) 
     322      zd_up(:,:,1) = 0._wp 
     323      zdiag(:,:,1) = 1._wp 
    338324      ! 
    339325      ! at k=2, set de/dz=Fw 
    340326      !cbr 
    341       z_elem_b(:,:,2) = z_elem_b(:,:,2) +  z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 
    342       z_elem_a(:,:,2) = 0._wp 
    343       zkar(:,:)       = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
    344       zflxs(:,:)      = rsbc_tke2 * ustars2(:,:)**1.5_wp * zkar(:,:) & 
    345           &                       * ((zhsro(:,:)+gdept_n(:,:,1)) / zhsro(:,:) )**(1.5_wp*ra_sf) 
    346  
    347       en(:,:,2) = en(:,:,2) + zflxs(:,:)/e3w_n(:,:,2) 
     327      zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     328      zd_lw(:,:,2) = 0._wp 
     329      zkar (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
     330      zflxs(:,:)   = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 
     331          &                    * (  ( zhsro(:,:)+gdept_n(:,:,1) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     332!!gm why not   :                        * ( 1._wp + gdept_n(:,:,1) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     333      en(:,:,2) = en(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    348334      ! 
    349335      ! 
     
    356342      ! 
    357343      CASE ( 0 )             ! Dirichlet  
    358          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 
     344         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin 
    359345         !                      ! Balance between the production and the dissipation terms 
     346         DO jj = 2, jpjm1 
     347            DO ji = fs_2, fs_jpim1   ! vector opt. 
     348!!gm This means that bottom and ocean w-level above have a specified "en" value.   Sure ???? 
     349!!   With thick deep ocean level thickness, this may be quite large, no ??? 
     350!!   in particular in ocean cavities where top stratification can be large... 
     351               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
     352               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
     353               ! 
     354               z_en =  MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 
     355               ! 
     356               ! Dirichlet condition applied at:  
     357               !     Bottom level (ibot)      &      Just above it (ibotm1)    
     358               zd_lw(ji,jj,ibot) = 0._wp   ;   zd_lw(ji,jj,ibotm1) = 0._wp 
     359               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     360               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = 1._wp 
     361               en   (ji,jj,ibot) = z_en    ;   en   (ji,jj,ibotm1) = z_en 
     362            END DO 
     363         END DO 
     364         ! 
     365         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     366            DO jj = 2, jpjm1 
     367               DO ji = fs_2, fs_jpim1   ! vector opt. 
     368                  itop   = mikt(ji,jj)       ! k   top w-point 
     369                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     370                  !                                                ! mask at the ocean surface points 
     371                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     372                  ! 
     373 !!gm TO BE VERIFIED !!! 
     374                  ! Dirichlet condition applied at:  
     375                  !     top level (itop)         &      Just below it (itopp1)    
     376                  zd_lw(ji,jj,itop) = 0._wp   ;   zd_lw(ji,jj,itopp1) = 0._wp 
     377                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     378                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = 1._wp 
     379                  en   (ji,jj,itop) = z_en    ;   en   (ji,jj,itopp1) = z_en 
     380               END DO 
     381            END DO 
     382         ENDIF 
     383         ! 
     384      CASE ( 1 )             ! Neumman boundary condition 
     385         !                       
    360386         DO jj = 2, jpjm1 
    361387            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    363389               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    364390               ! 
     391               z_en =  MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 
     392               ! 
    365393               ! Bottom level Dirichlet condition: 
    366                z_elem_a(ji,jj,ibot  ) = 0._wp 
    367                z_elem_c(ji,jj,ibot  ) = 0._wp 
    368                z_elem_b(ji,jj,ibot  ) = 1._wp 
    369                en(ji,jj,ibot  ) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 
    370                ! 
    371                ! Just above last level, Dirichlet condition again 
    372                z_elem_a(ji,jj,ibotm1) = 0._wp 
    373                z_elem_c(ji,jj,ibotm1) = 0._wp 
    374                z_elem_b(ji,jj,ibotm1) = 1._wp 
    375                en(ji,jj,ibotm1) = MAX( rc02r * ustarb2(ji,jj), rn_emin )  
    376             END DO 
    377          END DO 
    378          ! 
    379       CASE ( 1 )             ! Neumman boundary condition 
    380          !                       
    381          DO jj = 2, jpjm1 
    382             DO ji = fs_2, fs_jpim1   ! vector opt. 
    383                ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
    384                ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    385                ! 
    386                ! Bottom level Dirichlet condition: 
    387                z_elem_a(ji,jj,ibot) = 0._wp 
    388                z_elem_c(ji,jj,ibot) = 0._wp 
    389                z_elem_b(ji,jj,ibot) = 1._wp 
    390                en(ji,jj,ibot) = MAX( rc02r * ustarb2(ji,jj), rn_emin ) 
    391                ! 
    392                ! Just above last level: Neumann condition 
    393                z_elem_b(ji,jj,ibotm1) = z_elem_b(ji,jj,ibotm1) + z_elem_c(ji,jj,ibotm1)   ! Remove z_elem_c from z_elem_b 
    394                z_elem_c(ji,jj,ibotm1) = 0._wp 
    395             END DO 
    396          END DO 
     394               !     Bottom level (ibot)      &      Just above it (ibotm1)    
     395               !         Dirichlet            !         Neumann 
     396               zd_lw(ji,jj,ibot) = 0._wp   !   ! Remove zd_up from zdiag 
     397               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) 
     398               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     399            END DO 
     400         END DO 
     401         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     402            DO jj = 2, jpjm1 
     403               DO ji = fs_2, fs_jpim1   ! vector opt. 
     404                  itop   = mikt(ji,jj)       ! k   top w-point 
     405                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     406                  !                                                ! mask at the ocean surface points 
     407                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     408                  ! 
     409                  ! Bottom level Dirichlet condition: 
     410                  !     Bottom level (ibot)      &      Just above it (ibotm1)    
     411                  !         Dirichlet            !         Neumann 
     412                  zd_lw(ji,jj,itop) = 0._wp   !   ! Remove zd_up from zdiag 
     413                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = zdiag(ji,jj,itopp1) + zd_up(ji,jj,itopp1) 
     414                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     415               END DO 
     416            END DO 
     417         ENDIF 
    397418         ! 
    398419      END SELECT 
     
    404425         DO jj = 2, jpjm1 
    405426            DO ji = fs_2, fs_jpim1    ! vector opt. 
    406                z_elem_b(ji,jj,jk) = z_elem_b(ji,jj,jk) - z_elem_a(ji,jj,jk) * z_elem_c(ji,jj,jk-1) / z_elem_b(ji,jj,jk-1) 
     427               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    407428            END DO 
    408429         END DO 
     
    411432         DO jj = 2, jpjm1 
    412433            DO ji = fs_2, fs_jpim1    ! vector opt. 
    413                z_elem_a(ji,jj,jk) = en(ji,jj,jk) - z_elem_a(ji,jj,jk) / z_elem_b(ji,jj,jk-1) * z_elem_a(ji,jj,jk-1) 
     434               zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1) 
    414435            END DO 
    415436         END DO 
     
    418439         DO jj = 2, jpjm1 
    419440            DO ji = fs_2, fs_jpim1    ! vector opt. 
    420                en(ji,jj,jk) = ( z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) * en(ji,jj,jk+1) ) / z_elem_b(ji,jj,jk) 
     441               en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    421442            END DO 
    422443         END DO 
     
    437458            DO jj = 2, jpjm1 
    438459               DO ji = fs_2, fs_jpim1   ! vector opt. 
    439                   psi(ji,jj,jk)  = eb(ji,jj,jk) * mxlb(ji,jj,jk) 
     460                  psi(ji,jj,jk)  = eb(ji,jj,jk) * hmxl_b(ji,jj,jk) 
    440461               END DO 
    441462            END DO 
     
    455476            DO jj = 2, jpjm1 
    456477               DO ji = fs_2, fs_jpim1   ! vector opt. 
    457                   psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * mxlb(ji,jj,jk) ) 
     478                  psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * hmxl_b(ji,jj,jk) ) 
    458479               END DO 
    459480            END DO 
     
    464485            DO jj = 2, jpjm1 
    465486               DO ji = fs_2, fs_jpim1   ! vector opt. 
    466                   psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn  
     487                  psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * hmxl_b(ji,jj,jk)**rnn  
    467488               END DO 
    468489            END DO 
     
    475496      ! Resolution of a tridiagonal linear system by a "methode de chasse" 
    476497      ! computation from level 2 to jpkm1  (e(1) already computed and e(jpk)=0 ). 
    477       ! z_elem_b : diagonal z_elem_c : upper diagonal z_elem_a : lower diagonal 
     498      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    478499      ! Warning : after this step, en : right hand side of the matrix 
    479500 
     
    485506               zratio = psi(ji,jj,jk) / eb(ji,jj,jk)  
    486507               ! 
    487                ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 dir = 1 (stable) otherwise dir = 0 (unstable) 
    488                dir = 0.5_wp + SIGN( 0.5_wp, rn2(ji,jj,jk) ) 
    489                ! 
    490                rpsi3 = dir * rpsi3m + ( 1._wp - dir ) * rpsi3p 
     508               ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 zdir = 1 (stable) otherwise zdir = 0 (unstable) 
     509               zdir = 0.5_wp + SIGN( 0.5_wp, rn2(ji,jj,jk) ) 
     510               ! 
     511               rpsi3 = zdir * rpsi3m + ( 1._wp - zdir ) * rpsi3p 
    491512               ! 
    492513               ! shear prod. - stratif. destruction 
    493                prod = rpsi1 * zratio * shear(ji,jj,jk) 
     514               prod = rpsi1 * zratio * p_sh2(ji,jj,jk) 
    494515               ! 
    495516               ! stratif. destruction 
    496                buoy = rpsi3 * zratio * (- avt(ji,jj,jk) * rn2(ji,jj,jk) ) 
     517               buoy = rpsi3 * zratio * (- p_avt(ji,jj,jk) * rn2(ji,jj,jk) ) 
    497518               ! 
    498519               ! shear prod. - stratif. destruction 
    499520               diss = rpsi2 * zratio * zwall(ji,jj,jk) * eps(ji,jj,jk) 
    500521               ! 
    501                dir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )   ! dir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
    502                ! 
    503                zesh2 = dir * ( prod + buoy )          + (1._wp - dir ) * prod                        ! production term 
    504                zdiss = dir * ( diss / psi(ji,jj,jk) ) + (1._wp - dir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
     522               zdir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )     ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
     523               ! 
     524               zesh2 = zdir * ( prod + buoy )          + (1._wp - zdir ) * prod                        ! production term 
     525               zdiss = zdir * ( diss / psi(ji,jj,jk) ) + (1._wp - zdir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
    505526               !                                                         
    506527               ! building the matrix 
    507528               zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 
    508                ! lower diagonal 
    509                z_elem_a(ji,jj,jk) = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   & 
    510                   &                      / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
    511                ! upper diagonal 
    512                z_elem_c(ji,jj,jk) = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   & 
    513                   &                      / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
    514                ! diagonal 
    515                z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk)  & 
    516                   &                       + rdt * zdiss * tmask(ji,jj,jk) 
    517                ! 
    518                ! right hand side in psi 
    519                psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * tmask(ji,jj,jk) 
     529               !                                               ! lower diagonal 
     530               zd_lw(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 
     531               !                                               ! upper diagonal 
     532               zd_up(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) ) / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk) ) 
     533               !                                               ! diagonal 
     534               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) 
     535               !                                               ! right hand side in psi 
     536               psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    520537            END DO 
    521538         END DO 
    522539      END DO 
    523540      ! 
    524       z_elem_b(:,:,jpk) = 1._wp 
     541      zdiag(:,:,jpk) = 1._wp 
    525542 
    526543      ! Surface boundary condition on psi 
     
    530547      ! 
    531548      CASE ( 0 )             ! Dirichlet boundary conditions 
    532       ! 
    533       ! Surface value 
    534       zdep(:,:)       = zhsro(:,:) * rl_sf ! Cosmetic 
    535       psi (:,:,1)     = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    536       z_elem_a(:,:,1) = psi(:,:,1) 
    537       z_elem_c(:,:,1) = 0._wp 
    538       z_elem_b(:,:,1) = 1._wp 
    539       ! 
    540       ! One level below 
    541       zkar(:,:)       = (rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdepw_n(:,:,2)/zhsro(:,:) ))) 
    542       zdep(:,:)       = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:) 
    543       psi (:,:,2)     = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    544       z_elem_a(:,:,2) = 0._wp 
    545       z_elem_c(:,:,2) = 0._wp 
    546       z_elem_b(:,:,2) = 1._wp 
    547       !  
    548       ! 
     549         ! 
     550         ! Surface value 
     551         zdep    (:,:)   = zhsro(:,:) * rl_sf ! Cosmetic 
     552         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     553         zd_lw(:,:,1) = psi(:,:,1) 
     554         zd_up(:,:,1) = 0._wp 
     555         zdiag(:,:,1) = 1._wp 
     556         ! 
     557         ! One level below 
     558         zkar    (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdepw_n(:,:,2)/zhsro(:,:) ))) 
     559         zdep    (:,:)   = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:) 
     560         psi     (:,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     561         zd_lw(:,:,2) = 0._wp 
     562         zd_up(:,:,2) = 0._wp 
     563         zdiag(:,:,2) = 1._wp 
     564         !  
    549565      CASE ( 1 )             ! Neumann boundary condition on d(psi)/dz 
    550       ! 
    551       ! Surface value: Dirichlet 
    552       zdep(:,:)       = zhsro(:,:) * rl_sf 
    553       psi (:,:,1)     = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    554       z_elem_a(:,:,1) = psi(:,:,1) 
    555       z_elem_c(:,:,1) = 0._wp 
    556       z_elem_b(:,:,1) = 1._wp 
    557       ! 
    558       ! Neumann condition at k=2 
    559       z_elem_b(:,:,2) = z_elem_b(:,:,2) +  z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 
    560       z_elem_a(:,:,2) = 0._wp 
    561       ! 
    562       ! Set psi vertical flux at the surface: 
    563       zkar(:,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 
    564       zdep(:,:) = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 
    565       zflxs(:,:) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 
    566       zdep(:,:) =  rsbc_psi1 * (zwall_psi(:,:,1)*avm(:,:,1)+zwall_psi(:,:,2)*avm(:,:,2)) * & 
    567              & ustars2(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) 
    568       zflxs(:,:) = zdep(:,:) * zflxs(:,:) 
    569       psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    570  
    571       !    
    572       ! 
     566         ! 
     567         ! Surface value: Dirichlet 
     568         zdep    (:,:)   = zhsro(:,:) * rl_sf 
     569         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     570         zd_lw(:,:,1) = psi(:,:,1) 
     571         zd_up(:,:,1) = 0._wp 
     572         zdiag(:,:,1) = 1._wp 
     573         ! 
     574         ! Neumann condition at k=2 
     575         zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     576         zd_lw(:,:,2) = 0._wp 
     577         ! 
     578         ! Set psi vertical flux at the surface: 
     579         zkar (:,:)   = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 
     580         zdep (:,:)   = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 
     581         zflxs(:,:)   = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 
     582         zdep (:,:)   = rsbc_psi1 * (zwall_psi(:,:,1)*avm(:,:,1)+zwall_psi(:,:,2)*avm(:,:,2)) * & 
     583            &           ustar2_surf(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) 
     584         zflxs(:,:)   = zdep(:,:) * zflxs(:,:) 
     585         psi  (:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
     586         ! 
    573587      END SELECT 
    574588 
     
    576590      ! -------------------------------- 
    577591      ! 
    578       SELECT CASE ( nn_bc_bot ) 
    579       ! 
     592!!gm should be done for ISF (top boundary cond.) 
     593!!gm so, totally new staff needed      ===>>> think about that ! 
     594! 
     595      SELECT CASE ( nn_bc_bot )     ! bottom boundary 
    580596      ! 
    581597      CASE ( 0 )             ! Dirichlet  
    582          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 
     598         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * r_z0_bot 
    583599         !                      ! Balance between the production and the dissipation terms 
    584600         DO jj = 2, jpjm1 
     
    586602               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
    587603               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    588                zdep(ji,jj) = vkarmn * rn_bfrz0 
     604               zdep(ji,jj) = vkarmn * r_z0_bot 
    589605               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    590                z_elem_a(ji,jj,ibot) = 0._wp 
    591                z_elem_c(ji,jj,ibot) = 0._wp 
    592                z_elem_b(ji,jj,ibot) = 1._wp 
     606               zd_lw(ji,jj,ibot) = 0._wp 
     607               zd_up(ji,jj,ibot) = 0._wp 
     608               zdiag(ji,jj,ibot) = 1._wp 
    593609               ! 
    594610               ! Just above last level, Dirichlet condition again (GOTM like) 
    595                zdep(ji,jj) = vkarmn * ( rn_bfrz0 + e3t_n(ji,jj,ibotm1) ) 
     611               zdep(ji,jj) = vkarmn * ( r_z0_bot + e3t_n(ji,jj,ibotm1) ) 
    596612               psi (ji,jj,ibotm1) = rc0**rpp * en(ji,jj,ibot  )**rmm * zdep(ji,jj)**rnn 
    597                z_elem_a(ji,jj,ibotm1) = 0._wp 
    598                z_elem_c(ji,jj,ibotm1) = 0._wp 
    599                z_elem_b(ji,jj,ibotm1) = 1._wp 
     613               zd_lw(ji,jj,ibotm1) = 0._wp 
     614               zd_up(ji,jj,ibotm1) = 0._wp 
     615               zdiag(ji,jj,ibotm1) = 1._wp 
    600616            END DO 
    601617         END DO 
     
    609625               ! 
    610626               ! Bottom level Dirichlet condition: 
    611                zdep(ji,jj) = vkarmn * rn_bfrz0 
     627               zdep(ji,jj) = vkarmn * r_z0_bot 
    612628               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    613629               ! 
    614                z_elem_a(ji,jj,ibot) = 0._wp 
    615                z_elem_c(ji,jj,ibot) = 0._wp 
    616                z_elem_b(ji,jj,ibot) = 1._wp 
     630               zd_lw(ji,jj,ibot) = 0._wp 
     631               zd_up(ji,jj,ibot) = 0._wp 
     632               zdiag(ji,jj,ibot) = 1._wp 
    617633               ! 
    618634               ! Just above last level: Neumann condition with flux injection 
    619                z_elem_b(ji,jj,ibotm1) = z_elem_b(ji,jj,ibotm1) + z_elem_c(ji,jj,ibotm1) ! Remove z_elem_c from z_elem_b 
    620                z_elem_c(ji,jj,ibotm1) = 0. 
     635               zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) ! Remove zd_up from zdiag 
     636               zd_up(ji,jj,ibotm1) = 0. 
    621637               ! 
    622638               ! Set psi vertical flux at the bottom: 
    623                zdep(ji,jj) = rn_bfrz0 + 0.5_wp*e3t_n(ji,jj,ibotm1) 
    624                zflxb = rsbc_psi2 * ( avm(ji,jj,ibot) + avm(ji,jj,ibotm1) )   & 
     639               zdep(ji,jj) = r_z0_bot + 0.5_wp*e3t_n(ji,jj,ibotm1) 
     640               zflxb = rsbc_psi2 * ( p_avm(ji,jj,ibot) + p_avm(ji,jj,ibotm1) )   & 
    625641                  &  * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) 
    626642               psi(ji,jj,ibotm1) = psi(ji,jj,ibotm1) + zflxb / e3w_n(ji,jj,ibotm1) 
     
    636652         DO jj = 2, jpjm1 
    637653            DO ji = fs_2, fs_jpim1    ! vector opt. 
    638                z_elem_b(ji,jj,jk) = z_elem_b(ji,jj,jk) - z_elem_a(ji,jj,jk) * z_elem_c(ji,jj,jk-1) / z_elem_b(ji,jj,jk-1) 
     654               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    639655            END DO 
    640656         END DO 
     
    643659         DO jj = 2, jpjm1 
    644660            DO ji = fs_2, fs_jpim1    ! vector opt. 
    645                z_elem_a(ji,jj,jk) = psi(ji,jj,jk) - z_elem_a(ji,jj,jk) / z_elem_b(ji,jj,jk-1) * z_elem_a(ji,jj,jk-1) 
     661               zd_lw(ji,jj,jk) = psi(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1) 
    646662            END DO 
    647663         END DO 
     
    650666         DO jj = 2, jpjm1 
    651667            DO ji = fs_2, fs_jpim1    ! vector opt. 
    652                psi(ji,jj,jk) = ( z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) * psi(ji,jj,jk+1) ) / z_elem_b(ji,jj,jk) 
     668               psi(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * psi(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    653669            END DO 
    654670         END DO 
     
    703719      ! Limit dissipation rate under stable stratification 
    704720      ! -------------------------------------------------- 
    705       DO jk = 1, jpkm1 ! Note that this set boundary conditions on mxln at the same time 
     721      DO jk = 1, jpkm1 ! Note that this set boundary conditions on hmxl_n at the same time 
    706722         DO jj = 2, jpjm1 
    707723            DO ji = fs_2, fs_jpim1    ! vector opt. 
    708724               ! limitation 
    709                eps(ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
    710                mxln(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
     725               eps   (ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
     726               hmxl_n(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
    711727               ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)  
    712728               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    713                IF (ln_length_lim) mxln(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 
     729               IF( ln_length_lim )   hmxl_n(ji,jj,jk) = MIN(  rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), hmxl_n(ji,jj,jk) ) 
    714730            END DO 
    715731         END DO 
     
    727743               DO ji = fs_2, fs_jpim1   ! vector opt. 
    728744                  ! zcof =  l²/q² 
    729                   zcof = mxlb(ji,jj,jk) * mxlb(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) 
     745                  zcof = hmxl_b(ji,jj,jk) * hmxl_b(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) 
    730746                  ! Gh = -N²l²/q² 
    731747                  gh = - rn2(ji,jj,jk) * zcof 
     
    736752                  sm = ( rb1**(-1._wp/3._wp) + ( 18._wp*ra1*ra1 + 9._wp*ra1*ra2*(1._wp-rc2) )*sh*gh ) / (1._wp-9._wp*ra1*ra2*gh) 
    737753                  ! 
    738                   ! Store stability function in avmu and avmv 
    739                   avmu(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
    740                   avmv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
     754                  ! Store stability function in zstt and zstm 
     755                  zstt(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     756                  zstm(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    741757               END DO 
    742758            END DO 
     
    748764               DO ji = fs_2, fs_jpim1   ! vector opt. 
    749765                  ! zcof =  l²/q² 
    750                   zcof = mxlb(ji,jj,jk)*mxlb(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) 
     766                  zcof = hmxl_b(ji,jj,jk)*hmxl_b(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) 
    751767                  ! Gh = -N²l²/q² 
    752768                  gh = - rn2(ji,jj,jk) * zcof 
     
    755771                  gh = gh * rf6 
    756772                  ! Gm =  M²l²/q² Shear number 
    757                   shr = shear(ji,jj,jk) / MAX( avm(ji,jj,jk), rsmall ) 
     773                  shr = p_sh2(ji,jj,jk) / MAX( p_avm(ji,jj,jk), rsmall ) 
    758774                  gm = MAX( shr * zcof , 1.e-10 ) 
    759775                  gm = gm * rf6 
     
    764780                  sh = (rs4 - rs5*gh + rs6*gm) / rcff 
    765781                  ! 
    766                   ! Store stability function in avmu and avmv 
    767                   avmu(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
    768                   avmv(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
     782                  ! Store stability function in zstt and zstm 
     783                  zstt(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     784                  zstm(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    769785               END DO 
    770786            END DO 
     
    776792      ! Lines below are useless if GOTM style Dirichlet conditions are used 
    777793 
    778       avmv(:,:,1) = avmv(:,:,2) 
     794      zstm(:,:,1) = zstm(:,:,2) 
    779795 
    780796      DO jj = 2, jpjm1 
    781797         DO ji = fs_2, fs_jpim1   ! vector opt. 
    782             avmv(ji,jj,mbkt(ji,jj)+1) = avmv(ji,jj,mbkt(ji,jj)) 
     798            zstm(ji,jj,mbkt(ji,jj)+1) = zstm(ji,jj,mbkt(ji,jj)) 
    783799         END DO 
    784800      END DO 
     801!!gm should be done for ISF (top boundary cond.) 
     802!!gm so, totally new staff needed!!gm 
    785803 
    786804      ! Compute diffusivities/viscosities 
     
    789807         DO jj = 2, jpjm1 
    790808            DO ji = fs_2, fs_jpim1   ! vector opt. 
    791                zsqen         = SQRT( 2._wp * en(ji,jj,jk) ) * mxln(ji,jj,jk) 
    792                zav           = zsqen * avmu(ji,jj,jk) 
    793                avt(ji,jj,jk) = MAX( zav, avtb(jk) )*tmask(ji,jj,jk) ! apply mask for zdfmxl routine 
    794                zav           = zsqen * avmv(ji,jj,jk) 
    795                avm(ji,jj,jk) = MAX( zav, avmb(jk) ) ! Note that avm is not masked at the surface and the bottom 
     809               zsqen = SQRT( 2._wp * en(ji,jj,jk) ) * hmxl_n(ji,jj,jk) 
     810               zavt  = zsqen * zstt(ji,jj,jk) 
     811               zavm  = zsqen * zstm(ji,jj,jk) 
     812               p_avt(ji,jj,jk) = MAX( zavt, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine 
     813               p_avm(ji,jj,jk) = MAX( zavm, avmb(jk) )                  ! Note that avm is not masked at the surface and the bottom 
    796814            END DO 
    797815         END DO 
    798816      END DO 
    799       ! 
    800       ! Lateral boundary conditions (sign unchanged) 
    801817      avt(:,:,1)  = 0._wp 
    802       CALL lbc_lnk( avm, 'W', 1. )   ;   CALL lbc_lnk( avt, 'W', 1. ) 
    803  
    804       DO jk = 2, jpkm1            !* vertical eddy viscosity at u- and v-points 
    805          DO jj = 2, jpjm1 
    806             DO ji = fs_2, fs_jpim1   ! vector opt. 
    807                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * umask(ji,jj,jk) 
    808                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * vmask(ji,jj,jk) 
    809             END DO 
    810          END DO 
    811       END DO 
    812       avmu(:,:,1) = 0._wp             ;   avmv(:,:,1) = 0._wp                 ! set surface to zero 
    813       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )       ! Lateral boundary conditions 
    814  
     818      ! 
    815819      IF(ln_ctl) THEN 
    816          CALL prt_ctl( tab3d_1=en  , clinfo1=' gls  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
    817          CALL prt_ctl( tab3d_1=avmu, clinfo1=' gls  - u: ', mask1=umask,                   & 
    818             &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk ) 
     820         CALL prt_ctl( tab3d_1=en , clinfo1=' gls  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     821         CALL prt_ctl( tab3d_1=avm, clinfo1=' gls  - m: ', ovlap=1, kdim=jpk ) 
    819822      ENDIF 
    820823      ! 
    821       avt_k (:,:,:) = avt (:,:,:) 
    822       avm_k (:,:,:) = avm (:,:,:) 
    823       avmu_k(:,:,:) = avmu(:,:,:) 
    824       avmv_k(:,:,:) = avmv(:,:,:) 
    825       ! 
    826       CALL wrk_dealloc( jpi,jpj,       zdep, zkar, zflxs, zhsro ) 
    827       CALL wrk_dealloc( jpi,jpj,jpk,   eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 
    828       ! 
    829       IF( nn_timing == 1 )  CALL timing_stop('zdf_gls') 
    830       ! 
     824      IF( ln_timing )   CALL timing_stop('zdf_gls') 
    831825      ! 
    832826   END SUBROUTINE zdf_gls 
     
    838832      !!                      
    839833      !! ** Purpose :   Initialization of the vertical eddy diffivity and  
    840       !!      viscosity when using a gls turbulent closure scheme 
     834      !!              viscosity computed using a GLS turbulent closure scheme 
    841835      !! 
    842836      !! ** Method  :   Read the namzdf_gls namelist and check the parameters 
    843       !!      called at the first timestep (nit000) 
    844837      !! 
    845838      !! ** input   :   Namlist namzdf_gls 
     
    848841      !! 
    849842      !!---------------------------------------------------------------------- 
    850       USE dynzdf_exp 
    851       USE trazdf_exp 
    852       ! 
    853843      INTEGER ::   jk    ! dummy loop indices 
    854844      INTEGER ::   ios   ! Local integer output status for namelist read 
     
    862852      !!---------------------------------------------------------- 
    863853      ! 
    864       IF( nn_timing == 1 )  CALL timing_start('zdf_gls_init') 
     854      IF( ln_timing )   CALL timing_start('zdf_gls_init') 
    865855      ! 
    866856      REWIND( numnam_ref )              ! Namelist namzdf_gls in reference namelist : Vertical eddy diffivity and viscosity using gls turbulent closure scheme 
     
    875865      IF(lwp) THEN                     !* Control print 
    876866         WRITE(numout,*) 
    877          WRITE(numout,*) 'zdf_gls_init : gls turbulent closure scheme' 
     867         WRITE(numout,*) 'zdf_gls_init : GLS turbulent closure scheme' 
    878868         WRITE(numout,*) '~~~~~~~~~~~~' 
    879869         WRITE(numout,*) '   Namelist namzdf_gls : set gls mixing parameters' 
     
    892882         WRITE(numout,*) '      Type of closure                               nn_clos        = ', nn_clos 
    893883         WRITE(numout,*) '      Surface roughness (m)                         rn_hsro        = ', rn_hsro 
    894          WRITE(numout,*) '      Bottom roughness (m) (nambfr namelist)        rn_bfrz0       = ', rn_bfrz0 
     884         WRITE(numout,*) 
     885         WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     886         WRITE(numout,*) '      top    ocean cavity roughness (m)             rn_z0(_top)   = ', r_z0_top 
     887         WRITE(numout,*) '      Bottom seafloor     roughness (m)             rn_z0(_bot)   = ', r_z0_bot 
     888         WRITE(numout,*) 
    895889      ENDIF 
    896890 
    897       !                                !* allocate gls arrays 
     891      !                                !* allocate GLS arrays 
    898892      IF( zdf_gls_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_gls_init : unable to allocate arrays' ) 
    899893 
    900894      !                                !* Check of some namelist values 
    901       IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
    902       IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
    903       IF( nn_z0_met < 0 .OR. nn_z0_met > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_z0_met is 0, 1, 2 or 3' ) 
    904       IF( nn_z0_met == 3 .AND. .NOT.ln_wave ) CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' ) 
    905       IF( nn_stab_func  < 0 .OR. nn_stab_func  > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_stab_func is 0, 1, 2 and 3' ) 
    906       IF( nn_clos       < 0 .OR. nn_clos       > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' ) 
     895      IF( nn_bc_surf < 0   .OR. nn_bc_surf   > 1 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
     896      IF( nn_bc_surf < 0   .OR. nn_bc_surf   > 1 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
     897      IF( nn_z0_met  < 0   .OR. nn_z0_met    > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_z0_met is 0, 1, 2 or 3' ) 
     898      IF( nn_z0_met == 3  .AND. .NOT.ln_wave     )  CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' ) 
     899      IF( nn_stab_func < 0 .OR. nn_stab_func > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_stab_func is 0, 1, 2 and 3' ) 
     900      IF( nn_clos      < 0 .OR. nn_clos      > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' ) 
    907901 
    908902      SELECT CASE ( nn_clos )          !* set the parameters for the chosen closure 
     
    910904      CASE( 0 )                              ! k-kl  (Mellor-Yamada) 
    911905         ! 
    912          IF(lwp) WRITE(numout,*) 'The choosen closure is k-kl closed to the classical Mellor-Yamada' 
     906         IF(lwp) WRITE(numout,*) '   ==>>   k-kl closure chosen (i.e. closed to the classical Mellor-Yamada)' 
     907         IF(lwp) WRITE(numout,*) 
    913908         rpp     = 0._wp 
    914909         rmm     = 1._wp 
     
    928923      CASE( 1 )                              ! k-eps 
    929924         ! 
    930          IF(lwp) WRITE(numout,*) 'The choosen closure is k-eps' 
     925         IF(lwp) WRITE(numout,*) '   ==>>   k-eps closure chosen' 
     926         IF(lwp) WRITE(numout,*) 
    931927         rpp     =  3._wp 
    932928         rmm     =  1.5_wp 
     
    946942      CASE( 2 )                              ! k-omega 
    947943         ! 
    948          IF(lwp) WRITE(numout,*) 'The choosen closure is k-omega' 
     944         IF(lwp) WRITE(numout,*) '   ==>>   k-omega closure chosen' 
     945         IF(lwp) WRITE(numout,*) 
    949946         rpp     = -1._wp 
    950947         rmm     =  0.5_wp 
     
    964961      CASE( 3 )                              ! generic 
    965962         ! 
    966          IF(lwp) WRITE(numout,*) 'The choosen closure is generic' 
     963         IF(lwp) WRITE(numout,*) '   ==>>   generic closure chosen' 
     964         IF(lwp) WRITE(numout,*) 
    967965         rpp     = 2._wp 
    968966         rmm     = 1._wp 
     
    987985      CASE ( 0 )                             ! Galperin stability functions 
    988986         ! 
    989          IF(lwp) WRITE(numout,*) 'Stability functions from Galperin' 
     987         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Galperin' 
    990988         rc2     =  0._wp 
    991989         rc3     =  0._wp 
     
    999997      CASE ( 1 )                             ! Kantha-Clayson stability functions 
    1000998         ! 
    1001          IF(lwp) WRITE(numout,*) 'Stability functions from Kantha-Clayson' 
     999         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Kantha-Clayson' 
    10021000         rc2     =  0.7_wp 
    10031001         rc3     =  0.2_wp 
     
    10111009      CASE ( 2 )                             ! Canuto A stability functions 
    10121010         ! 
    1013          IF(lwp) WRITE(numout,*) 'Stability functions from Canuto A' 
     1011         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Canuto A' 
    10141012         rs0 = 1.5_wp * rl1 * rl5*rl5 
    10151013         rs1 = -rl4*(rl6+rl7) + 2._wp*rl4*rl5*(rl1-(1._wp/3._wp)*rl2-rl3) + 1.5_wp*rl1*rl5*rl8 
     
    10351033      CASE ( 3 )                             ! Canuto B stability functions 
    10361034         ! 
    1037          IF(lwp) WRITE(numout,*) 'Stability functions from Canuto B' 
     1035         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Canuto B' 
    10381036         rs0 = 1.5_wp * rm1 * rm5*rm5 
    10391037         rs1 = -rm4 * (rm6+rm7) + 2._wp * rm4*rm5*(rm1-(1._wp/3._wp)*rm2-rm3) + 1.5_wp * rm1*rm5*rm8 
     
    10791077         rl_sf = vkarmn 
    10801078      ELSE 
    1081          rl_sf = rc0 * SQRT(rc0/rcm_sf) * SQRT( ( (1._wp + 4._wp*rmm + 8._wp*rmm**2_wp)*rsc_tke          & 
    1082                  &                                       + 12._wp * rsc_psi0*rpsi2 - (1._wp + 4._wp*rmm) & 
    1083                  &                                                *SQRT(rsc_tke*(rsc_tke                 & 
    1084                  &                                                   + 24._wp*rsc_psi0*rpsi2)) )         & 
    1085                  &                                         /(12._wp*rnn**2.)                             & 
    1086                  &                                       ) 
     1079         rl_sf = rc0 * SQRT(rc0/rcm_sf) * SQRT( ( (1._wp + 4._wp*rmm + 8._wp*rmm**2_wp) * rsc_tke        & 
     1080            &                                            + 12._wp*rsc_psi0*rpsi2 - (1._wp + 4._wp*rmm)   & 
     1081            &                                                     *SQRT(rsc_tke*(rsc_tke                 & 
     1082            &                                                        + 24._wp*rsc_psi0*rpsi2)) )         & 
     1083            &                                              /(12._wp*rnn**2.)                             ) 
    10871084      ENDIF 
    10881085 
     
    10901087      IF(lwp) THEN                     !* Control print 
    10911088         WRITE(numout,*) 
    1092          WRITE(numout,*) 'Limit values' 
    1093          WRITE(numout,*) '~~~~~~~~~~~~' 
    1094          WRITE(numout,*) 'Parameter  m = ',rmm 
    1095          WRITE(numout,*) 'Parameter  n = ',rnn 
    1096          WRITE(numout,*) 'Parameter  p = ',rpp 
    1097          WRITE(numout,*) 'rpsi1   = ',rpsi1 
    1098          WRITE(numout,*) 'rpsi2   = ',rpsi2 
    1099          WRITE(numout,*) 'rpsi3m  = ',rpsi3m 
    1100          WRITE(numout,*) 'rpsi3p  = ',rpsi3p 
    1101          WRITE(numout,*) 'rsc_tke = ',rsc_tke 
    1102          WRITE(numout,*) 'rsc_psi = ',rsc_psi 
    1103          WRITE(numout,*) 'rsc_psi0 = ',rsc_psi0 
    1104          WRITE(numout,*) 'rc0     = ',rc0 
     1089         WRITE(numout,*) '   Limit values :' 
     1090         WRITE(numout,*) '      Parameter  m = ', rmm 
     1091         WRITE(numout,*) '      Parameter  n = ', rnn 
     1092         WRITE(numout,*) '      Parameter  p = ', rpp 
     1093         WRITE(numout,*) '      rpsi1    = ', rpsi1 
     1094         WRITE(numout,*) '      rpsi2    = ', rpsi2 
     1095         WRITE(numout,*) '      rpsi3m   = ', rpsi3m 
     1096         WRITE(numout,*) '      rpsi3p   = ', rpsi3p 
     1097         WRITE(numout,*) '      rsc_tke  = ', rsc_tke 
     1098         WRITE(numout,*) '      rsc_psi  = ', rsc_psi 
     1099         WRITE(numout,*) '      rsc_psi0 = ', rsc_psi0 
     1100         WRITE(numout,*) '      rc0      = ', rc0 
    11051101         WRITE(numout,*) 
    1106          WRITE(numout,*) 'Shear free turbulence parameters:' 
    1107          WRITE(numout,*) 'rcm_sf  = ',rcm_sf 
    1108          WRITE(numout,*) 'ra_sf   = ',ra_sf 
    1109          WRITE(numout,*) 'rl_sf   = ',rl_sf 
    1110          WRITE(numout,*) 
     1102         WRITE(numout,*) '   Shear free turbulence parameters:' 
     1103         WRITE(numout,*) '      rcm_sf   = ', rcm_sf 
     1104         WRITE(numout,*) '      ra_sf    = ', ra_sf 
     1105         WRITE(numout,*) '      rl_sf    = ', rl_sf 
    11111106      ENDIF 
    11121107 
     
    11231118      rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 
    11241119      rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking  
    1125  
     1120      ! 
    11261121      rfact_tke = -0.5_wp / rsc_tke * rdt                                ! Cst used for the Diffusion term of tke 
    11271122      rfact_psi = -0.5_wp / rsc_psi * rdt                                ! Cst used for the Diffusion term of tke 
    1128  
     1123      ! 
    11291124      !                                !* Wall proximity function 
    1130       zwall (:,:,:) = 1._wp * tmask(:,:,:) 
    1131  
    1132       !                                !* set vertical eddy coef. to the background value 
    1133       DO jk = 1, jpk 
    1134          avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    1135          avm (:,:,jk) = avmb(jk) * tmask(:,:,jk) 
    1136          avmu(:,:,jk) = avmb(jk) * umask(:,:,jk) 
    1137          avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
    1138       END DO 
    1139       !                               
    1140       CALL gls_rst( nit000, 'READ' )   !* read or initialize all required files 
    1141       ! 
    1142       IF( nn_timing == 1 )  CALL timing_stop('zdf_gls_init') 
     1125!!gm tmask or wmask ???? 
     1126      zwall(:,:,:) = 1._wp * tmask(:,:,:) 
     1127 
     1128      !                                !* read or initialize all required files   
     1129      CALL gls_rst( nit000, 'READ' )      ! (en, avt_k, avm_k, hmxl_n) 
     1130      ! 
     1131      IF( ln_timing )   CALL timing_stop('zdf_gls_init') 
    11431132      ! 
    11441133   END SUBROUTINE zdf_gls_init 
     
    11551144      !!                set to rn_emin or recomputed (nn_igls/=0) 
    11561145      !!---------------------------------------------------------------------- 
    1157       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1158       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
     1146      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     1147      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    11591148      ! 
    11601149      INTEGER ::   jit, jk   ! dummy loop indices 
    1161       INTEGER ::   id1, id2, id3, id4, id5, id6 
     1150      INTEGER ::   id1, id2, id3, id4 
    11621151      INTEGER ::   ji, jj, ikbu, ikbv 
    11631152      REAL(wp)::   cbx, cby 
     
    11671156         !                                   ! --------------- 
    11681157         IF( ln_rstart ) THEN                   !* Read the restart file 
    1169             id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    1170             id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. ) 
    1171             id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. ) 
    1172             id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. ) 
    1173             id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. ) 
    1174             id6 = iom_varid( numror, 'mxln' , ldstop = .FALSE. ) 
     1158            id1 = iom_varid( numror, 'en'    , ldstop = .FALSE. ) 
     1159            id2 = iom_varid( numror, 'avt_k' , ldstop = .FALSE. ) 
     1160            id3 = iom_varid( numror, 'avm_k' , ldstop = .FALSE. ) 
     1161            id4 = iom_varid( numror, 'hmxl_n', ldstop = .FALSE. ) 
    11751162            ! 
    1176             IF( MIN( id1, id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
     1163            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN        ! all required arrays exist 
    11771164               CALL iom_get( numror, jpdom_autoglo, 'en'    , en     ) 
    1178                CALL iom_get( numror, jpdom_autoglo, 'avt'   , avt    ) 
    1179                CALL iom_get( numror, jpdom_autoglo, 'avm'   , avm    ) 
    1180                CALL iom_get( numror, jpdom_autoglo, 'avmu'  , avmu   ) 
    1181                CALL iom_get( numror, jpdom_autoglo, 'avmv'  , avmv   ) 
    1182                CALL iom_get( numror, jpdom_autoglo, 'mxln'  , mxln   ) 
     1165               CALL iom_get( numror, jpdom_autoglo, 'avt_k' , avt_k  ) 
     1166               CALL iom_get( numror, jpdom_autoglo, 'avm_k' , avm_k  ) 
     1167               CALL iom_get( numror, jpdom_autoglo, 'hmxl_n', hmxl_n ) 
    11831168            ELSE                         
    1184                IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 
    1185                en  (:,:,:) = rn_emin 
    1186                mxln(:,:,:) = 0.05         
    1187                avt_k (:,:,:) = avt (:,:,:) 
    1188                avm_k (:,:,:) = avm (:,:,:) 
    1189                avmu_k(:,:,:) = avmu(:,:,:) 
    1190                avmv_k(:,:,:) = avmv(:,:,:) 
    1191                DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_gls( jit )   ;   END DO 
     1169               IF(lwp) WRITE(numout,*) 
     1170               IF(lwp) WRITE(numout,*) '   ==>>   previous run without GLS scheme, set en and hmxl_n to background values' 
     1171               en    (:,:,:) = rn_emin 
     1172               hmxl_n(:,:,:) = 0.05_wp 
     1173               ! avt_k, avm_k already set to the background value in zdf_phy_init 
    11921174            ENDIF 
    11931175         ELSE                                   !* Start from rest 
    1194             IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and mxln by background values' 
    1195             en  (:,:,:) = rn_emin 
    1196             mxln(:,:,:) = 0.05        
     1176            IF(lwp) WRITE(numout,*) 
     1177            IF(lwp) WRITE(numout,*) '   ==>>   start from rest, set en and hmxl_n by background values' 
     1178            en    (:,:,:) = rn_emin 
     1179            hmxl_n(:,:,:) = 0.05_wp 
     1180            ! avt_k, avm_k already set to the background value in zdf_phy_init 
    11971181         ENDIF 
    11981182         ! 
     
    12001184         !                                   ! ------------------- 
    12011185         IF(lwp) WRITE(numout,*) '---- gls-rst ----' 
    1202          CALL iom_rstput( kt, nitrst, numrow, 'en'   , en     )  
    1203          CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt_k  ) 
    1204          CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm_k  ) 
    1205          CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k )  
    1206          CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 
    1207          CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln   ) 
     1186         CALL iom_rstput( kt, nitrst, numrow, 'en'    , en     )  
     1187         CALL iom_rstput( kt, nitrst, numrow, 'avt_k' , avt_k  ) 
     1188         CALL iom_rstput( kt, nitrst, numrow, 'avm_k' , avm_k  ) 
     1189         CALL iom_rstput( kt, nitrst, numrow, 'hmxl_n', hmxl_n ) 
    12081190         ! 
    12091191      ENDIF 
    12101192      ! 
    12111193   END SUBROUTINE gls_rst 
    1212  
    1213 #else 
    1214    !!---------------------------------------------------------------------- 
    1215    !!   Dummy module :                                        NO TKE scheme 
    1216    !!---------------------------------------------------------------------- 
    1217    LOGICAL, PUBLIC, PARAMETER ::   lk_zdfgls = .FALSE.   !: TKE flag 
    1218 CONTAINS 
    1219    SUBROUTINE zdf_gls_init           ! Empty routine 
    1220       WRITE(*,*) 'zdf_gls_init: You should not have seen this print! error?' 
    1221    END SUBROUTINE zdf_gls_init 
    1222    SUBROUTINE zdf_gls( kt )          ! Empty routine 
    1223       WRITE(*,*) 'zdf_gls: You should not have seen this print! error?', kt 
    1224    END SUBROUTINE zdf_gls 
    1225    SUBROUTINE gls_rst( kt, cdrw )          ! Empty routine 
    1226       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1227       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
    1228       WRITE(*,*) 'gls_rst: You should not have seen this print! error?', kt, cdrw 
    1229    END SUBROUTINE gls_rst 
    1230 #endif 
    12311194 
    12321195   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.