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 9019 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90 – NEMO

Ignore:
Timestamp:
2017-12-13T15:58:53+01:00 (6 years ago)
Author:
timgraham
Message:

Merge of dev_CNRS_2017 into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90

    r7646 r9019  
    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 
     
    1919   USE dom_oce        ! ocean space and time domain 
    2020   USE domvvl         ! ocean space and time domain : variable volume layer 
    21    USE zdf_oce        ! ocean vertical physics 
    22    USE zdfbfr         ! bottom friction (only for rn_bfrz0) 
     21   USE zdfdrg  , ONLY : r_z0_top , r_z0_bot   ! top/bottom roughness 
     22   USE zdfdrg  , ONLY : rCdU_top , rCdU_bot   ! top/bottom friction 
    2323   USE sbc_oce        ! surface boundary condition: ocean 
    2424   USE phycst         ! physical constants 
    2525   USE zdfmxl         ! mixed layer 
    26    USE sbcwave ,  ONLY: hsw   ! significant wave height 
     26   USE sbcwave , ONLY : hsw   ! significant wave height 
    2727   ! 
    2828   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    2929   USE lib_mpp        ! MPP manager 
    30    USE wrk_nemo       ! work arrays 
    3130   USE prtctl         ! Print control 
    3231   USE in_out_manager ! I/O manager 
     
    3837   PRIVATE 
    3938 
    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 
     39   PUBLIC   zdf_gls        ! called in zdfphy 
     40   PUBLIC   zdf_gls_init   ! called in zdfphy 
     41   PUBLIC   gls_rst        ! called in zdfphy 
     42 
    4543   ! 
    46    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   mxln    !: now mixing length 
     44   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   hmxl_n    !: now mixing length 
    4745   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 
     46   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_surf !: Squared surface velocity scale at T-points 
     47   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_top  !: Squared top     velocity scale at T-points 
     48   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ustar2_bot  !: Squared bottom  velocity scale at T-points 
    5049 
    5150   !                              !! ** Namelist  namzdf_gls  ** 
     
    102101   REAL(wp) ::   rsc_tke, rsc_psi, rpsi1, rpsi2, rpsi3, rsc_psi0  !     -           -           -        - 
    103102   REAL(wp) ::   rpsi3m, rpsi3p, rpp, rmm, rnn                    !     -           -           -        - 
     103   ! 
     104   REAL(wp) ::   r2_3 = 2._wp/3._wp   ! constant=2/3 
    104105 
    105106   !! * Substitutions 
     
    116117      !!                ***  FUNCTION zdf_gls_alloc  *** 
    117118      !!---------------------------------------------------------------------- 
    118       ALLOCATE( mxln(jpi,jpj,jpk), zwall(jpi,jpj,jpk) ,     & 
    119          &      ustars2(jpi,jpj) , ustarb2(jpi,jpj)  , STAT= zdf_gls_alloc ) 
     119      ALLOCATE( hmxl_n(jpi,jpj,jpk) , ustar2_surf(jpi,jpj) ,                     & 
     120         &      zwall (jpi,jpj,jpk) , ustar2_top (jpi,jpj) , ustar2_bot(jpi,jpj) , STAT= zdf_gls_alloc ) 
    120121         ! 
    121122      IF( lk_mpp             )   CALL mpp_sum ( zdf_gls_alloc ) 
     
    124125 
    125126 
    126    SUBROUTINE zdf_gls( kt ) 
     127   SUBROUTINE zdf_gls( kt, p_sh2, p_avm, p_avt ) 
    127128      !!---------------------------------------------------------------------- 
    128129      !!                   ***  ROUTINE zdf_gls  *** 
     
    131132      !!              coefficients using the GLS turbulent closure scheme. 
    132133      !!---------------------------------------------------------------------- 
    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             !   -      - 
     134      USE zdf_oce , ONLY : en, avtb, avmb   ! ocean vertical physics 
     135      !! 
     136      INTEGER                   , INTENT(in   ) ::   kt             ! ocean time step 
     137      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     138      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
     139      ! 
     140      INTEGER  ::   ji, jj, jk    ! dummy loop arguments 
     141      INTEGER  ::   ibot, ibotm1  ! local integers 
     142      INTEGER  ::   itop, itopp1  !   -       - 
     143      REAL(wp) ::   zesh2, zsigpsi, zcoef, zex1 , zex2  ! local scalars 
     144      REAL(wp) ::   ztx2, zty2, zup, zdown, zcof, zdir  !   -      -  
     145      REAL(wp) ::   zratio, zrn2, zflxb, sh     , z_en  !   -      - 
    138146      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 
     147      REAL(wp) ::   gh, gm, shr, dif, zsqen, zavt, zavm !   -      - 
     148      REAL(wp) ::   zmsku, zmskv                        !   -      - 
     149      REAL(wp), DIMENSION(jpi,jpj)     ::   zdep 
     150      REAL(wp), DIMENSION(jpi,jpj)     ::   zkar 
     151      REAL(wp), DIMENSION(jpi,jpj)     ::   zflxs       ! Turbulence fluxed induced by internal waves  
     152      REAL(wp), DIMENSION(jpi,jpj)     ::   zhsro       ! Surface roughness (surface waves) 
     153      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   eb          ! tke at time before 
     154      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   hmxl_b      ! mixing length at time before 
     155      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   eps         ! dissipation rate 
     156      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwall_psi   ! Wall function use in the wb case (ln_sigpsi) 
     157      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   psi         ! psi at time now 
     158      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zd_lw, zd_up, zdiag   ! lower, upper  and diagonal of the matrix 
     159      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zstt, zstm  ! stability function on tracer and momentum 
    153160      !!-------------------------------------------------------------------- 
    154161      ! 
    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        
     162      IF( ln_timing )   CALL timing_start('zdf_gls') 
     163      ! 
    160164      ! Preliminary computing 
    161165 
    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 
     166      ustar2_surf(:,:) = 0._wp   ;         psi(:,:,:) = 0._wp    
     167      ustar2_top (:,:) = 0._wp   ;   zwall_psi(:,:,:) = 0._wp 
     168      ustar2_bot (:,:) = 0._wp 
     169 
     170      ! Compute surface, top and bottom friction at T-points 
    172171      DO jj = 2, jpjm1           
    173172         DO ji = fs_2, fs_jpim1   ! vector opt.          
    174173            ! 
    175174            ! surface friction 
    176             ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
     175            ustar2_surf(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
    177176            !    
    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           
     177!!gm Rq we may add here r_ke0(_top/_bot) ?  ==>> think about that... 
     178          ! bottom friction (explicit before friction) 
     179          zmsku = ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     180          zmskv = ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )     ! (CAUTION: CdU<0) 
     181          ustar2_bot(ji,jj) = - rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
     182             &                                         + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     183         END DO 
     184      END DO 
     185      IF( ln_isfcav ) THEN       !top friction 
     186         DO jj = 2, jpjm1 
     187            DO ji = fs_2, fs_jpim1   ! vector opt. 
     188               zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     189               zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )     ! (CAUTION: CdU<0) 
     190               ustar2_top(ji,jj) = - rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
     191                  &                                         + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     192            END DO 
     193         END DO 
     194      ENDIF 
     195    
     196      SELECT CASE ( nn_z0_met )      !==  Set surface roughness length  ==! 
     197      CASE ( 0 )                          ! Constant roughness           
    192198         zhsro(:,:) = rn_hsro 
    193199      CASE ( 1 )             ! Standard Charnock formula 
    194          zhsro(:,:) = MAX(rsbc_zs1 * ustars2(:,:), rn_hsro) 
     200         zhsro(:,:) = MAX( rsbc_zs1 * ustar2_surf(:,:) , rn_hsro ) 
    195201      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) 
     202!!gm faster coding : the 2 comment lines should be used 
     203!!gm         zcof = 2._wp * 0.6_wp / 28._wp 
     204!!gm         zdep(:,:)  = 30._wp * TANH(  zcof/ SQRT( MAX(ustar2_surf(:,:),rsmall) )  )       ! Wave age (eq. 10) 
     205         zdep (:,:) = 30.*TANH( 2.*0.3/(28.*SQRT(MAX(ustar2_surf(:,:),rsmall))) )         ! Wave age (eq. 10) 
     206         zhsro(:,:) = MAX(rsbc_zs2 * ustar2_surf(:,:) * zdep(:,:)**1.5, rn_hsro)          ! zhsro = rn_frac_hs * Hsw (eq. 11) 
    198207      CASE ( 3 )             ! Roughness given by the wave model (coupled or read in file) 
    199          zhsro(:,:) = hsw(:,:) 
     208         zhsro(:,:) = rn_frac_hs * hsw(:,:)   ! (rn_frac_hs=1.6 see Eq. (5) of Rascle et al. 2008 ) 
    200209      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) 
     210      ! 
     211      DO jk = 2, jpkm1              !==  Compute dissipation rate  ==! 
     212         DO jj = 1, jpjm1 
     213            DO ji = 1, jpim1 
     214               eps(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / hmxl_n(ji,jj,jk) 
    213215            END DO 
    214216         END DO 
    215217      END DO 
    216       ! 
    217       ! Lateral boundary conditions (avmu,avmv) (sign unchanged) 
    218       CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. ) 
    219218 
    220219      ! Save tke at before time step 
    221       eb  (:,:,:) = en  (:,:,:) 
    222       mxlb(:,:,:) = mxln(:,:,:) 
     220      eb    (:,:,:) = en    (:,:,:) 
     221      hmxl_b(:,:,:) = hmxl_n(:,:,:) 
    223222 
    224223      IF( nn_clos == 0 ) THEN    ! Mellor-Yamada 
     
    226225            DO jj = 2, jpjm1  
    227226               DO ji = fs_2, fs_jpim1   ! vector opt. 
    228                   zup   = mxln(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
     227                  zup   = hmxl_n(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 
    229228                  zdown = vkarmn * gdepw_n(ji,jj,jk) * ( -gdepw_n(ji,jj,jk) + gdepw_n(ji,jj,mbkt(ji,jj)+1) ) 
    230229                  zcoef = ( zup / MAX( zdown, rsmall ) ) 
     
    245244      ! The surface boundary condition are set after 
    246245      ! 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 
     246      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    248247      ! Warning : after this step, en : right hand side of the matrix 
    249248 
    250249      DO jk = 2, jpkm1 
    251250         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 
     251            DO ji = 2, jpim1 
     252               ! 
     253               buoy = - p_avt(ji,jj,jk) * rn2(ji,jj,jk)     ! stratif. destruction 
     254               ! 
     255               diss = eps(ji,jj,jk)                         ! dissipation 
     256               ! 
     257               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) 
     258               ! 
     259               zesh2 = zdir*(p_sh2(ji,jj,jk)+buoy)+(1._wp-zdir)*p_sh2(ji,jj,jk)          ! production term 
     260               zdiss = zdir*(diss/en(ji,jj,jk))   +(1._wp-zdir)*(diss-buoy)/en(ji,jj,jk) ! dissipation term 
     261!!gm better coding, identical results 
     262!               zesh2 =   p_sh2(ji,jj,jk) + zdir*buoy               ! production term 
     263!               zdiss = ( diss - (1._wp-zdir)*buoy ) / en(ji,jj,jk) ! dissipation term 
     264!!gm 
    268265               ! 
    269266               ! Compute a wall function from 1. to rsc_psi*zwall/rsc_psi0 
     
    281278               ! building the matrix 
    282279               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) 
     280               !                                               ! lower diagonal 
     281               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) ) 
     282               !                                               ! upper diagonal 
     283               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) ) 
     284               !                                               ! diagonal 
     285               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk)  + rdt * zdiss * wmask(ji,jj,jk)  
     286               !                                               ! right hand side in en 
     287               en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    298288            END DO 
    299289         END DO 
    300290      END DO 
    301291      ! 
    302       z_elem_b(:,:,jpk) = 1._wp 
     292      zdiag(:,:,jpk) = 1._wp 
    303293      ! 
    304294      ! Set surface condition on zwall_psi (1 at the bottom) 
    305       zwall_psi(:,:,1) = zwall_psi(:,:,2) 
    306       zwall_psi(:,:,jpk) = 1. 
     295      zwall_psi(:,:, 1 ) = zwall_psi(:,:,2) 
     296      zwall_psi(:,:,jpk) = 1._wp 
    307297      ! 
    308298      ! Surface boundary condition on tke 
     
    311301      SELECT CASE ( nn_bc_surf ) 
    312302      ! 
    313       CASE ( 0 )             ! Dirichlet case 
     303      CASE ( 0 )             ! Dirichlet boundary condition (set e at k=1 & 2)  
    314304      ! 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 
     305      en   (:,:,1) = MAX(  rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3  ) 
     306      zd_lw(:,:,1) = en(:,:,1) 
     307      zd_up(:,:,1) = 0._wp 
     308      zdiag(:,:,1) = 1._wp 
    320309      !  
    321310      ! 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 
     311      en   (:,:,2) =  MAX(  rc02r * ustar2_surf(:,:) * (  1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2))   & 
     312         &                 / zhsro(:,:) )**(1.5_wp*ra_sf)  )**(2._wp/3._wp)                      , rn_emin   ) 
     313      zd_lw(:,:,2) = 0._wp  
     314      zd_up(:,:,2) = 0._wp 
     315      zdiag(:,:,2) = 1._wp 
     316      ! 
     317      ! 
     318      CASE ( 1 )             ! Neumann boundary condition (set d(e)/dz) 
    331319      ! 
    332320      ! 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 
     321      en   (:,:,1) = MAX(  rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 , rn_emin  ) 
     322      zd_lw(:,:,1) = en(:,:,1) 
     323      zd_up(:,:,1) = 0._wp 
     324      zdiag(:,:,1) = 1._wp 
    338325      ! 
    339326      ! at k=2, set de/dz=Fw 
    340327      !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) 
     328      zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     329      zd_lw(:,:,2) = 0._wp 
     330      zkar (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
     331      zflxs(:,:)   = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 
     332          &                    * (  ( zhsro(:,:)+gdept_n(:,:,1) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     333!!gm why not   :                        * ( 1._wp + gdept_n(:,:,1) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     334      en(:,:,2) = en(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    348335      ! 
    349336      ! 
     
    356343      ! 
    357344      CASE ( 0 )             ! Dirichlet  
    358          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = rn_lmin 
     345         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin 
    359346         !                      ! Balance between the production and the dissipation terms 
     347         DO jj = 2, jpjm1 
     348            DO ji = fs_2, fs_jpim1   ! vector opt. 
     349!!gm This means that bottom and ocean w-level above have a specified "en" value.   Sure ???? 
     350!!   With thick deep ocean level thickness, this may be quite large, no ??? 
     351!!   in particular in ocean cavities where top stratification can be large... 
     352               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
     353               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
     354               ! 
     355               z_en =  MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 
     356               ! 
     357               ! Dirichlet condition applied at:  
     358               !     Bottom level (ibot)      &      Just above it (ibotm1)    
     359               zd_lw(ji,jj,ibot) = 0._wp   ;   zd_lw(ji,jj,ibotm1) = 0._wp 
     360               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     361               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = 1._wp 
     362               en   (ji,jj,ibot) = z_en    ;   en   (ji,jj,ibotm1) = z_en 
     363            END DO 
     364         END DO 
     365         ! 
     366         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     367            DO jj = 2, jpjm1 
     368               DO ji = fs_2, fs_jpim1   ! vector opt. 
     369                  itop   = mikt(ji,jj)       ! k   top w-point 
     370                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     371                  !                                                ! mask at the ocean surface points 
     372                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     373                  ! 
     374 !!gm TO BE VERIFIED !!! 
     375                  ! Dirichlet condition applied at:  
     376                  !     top level (itop)         &      Just below it (itopp1)    
     377                  zd_lw(ji,jj,itop) = 0._wp   ;   zd_lw(ji,jj,itopp1) = 0._wp 
     378                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     379                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = 1._wp 
     380                  en   (ji,jj,itop) = z_en    ;   en   (ji,jj,itopp1) = z_en 
     381               END DO 
     382            END DO 
     383         ENDIF 
     384         ! 
     385      CASE ( 1 )             ! Neumman boundary condition 
     386         !                       
    360387         DO jj = 2, jpjm1 
    361388            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    363390               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    364391               ! 
     392               z_en =  MAX( rc02r * ustar2_bot(ji,jj), rn_emin ) 
     393               ! 
    365394               ! 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 
     395               !     Bottom level (ibot)      &      Just above it (ibotm1)    
     396               !         Dirichlet            !         Neumann 
     397               zd_lw(ji,jj,ibot) = 0._wp   !   ! Remove zd_up from zdiag 
     398               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) 
     399               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     400            END DO 
     401         END DO 
     402         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     403            DO jj = 2, jpjm1 
     404               DO ji = fs_2, fs_jpim1   ! vector opt. 
     405                  itop   = mikt(ji,jj)       ! k   top w-point 
     406                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     407                  !                                                ! mask at the ocean surface points 
     408                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     409                  ! 
     410                  ! Bottom level Dirichlet condition: 
     411                  !     Bottom level (ibot)      &      Just above it (ibotm1)    
     412                  !         Dirichlet            !         Neumann 
     413                  zd_lw(ji,jj,itop) = 0._wp   !   ! Remove zd_up from zdiag 
     414                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = zdiag(ji,jj,itopp1) + zd_up(ji,jj,itopp1) 
     415                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     416               END DO 
     417            END DO 
     418         ENDIF 
    397419         ! 
    398420      END SELECT 
     
    404426         DO jj = 2, jpjm1 
    405427            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) 
     428               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    407429            END DO 
    408430         END DO 
     
    411433         DO jj = 2, jpjm1 
    412434            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) 
     435               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) 
    414436            END DO 
    415437         END DO 
     
    418440         DO jj = 2, jpjm1 
    419441            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) 
     442               en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    421443            END DO 
    422444         END DO 
     
    437459            DO jj = 2, jpjm1 
    438460               DO ji = fs_2, fs_jpim1   ! vector opt. 
    439                   psi(ji,jj,jk)  = eb(ji,jj,jk) * mxlb(ji,jj,jk) 
     461                  psi(ji,jj,jk)  = eb(ji,jj,jk) * hmxl_b(ji,jj,jk) 
    440462               END DO 
    441463            END DO 
     
    455477            DO jj = 2, jpjm1 
    456478               DO ji = fs_2, fs_jpim1   ! vector opt. 
    457                   psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * mxlb(ji,jj,jk) ) 
     479                  psi(ji,jj,jk)  = SQRT( eb(ji,jj,jk) ) / ( rc0 * hmxl_b(ji,jj,jk) ) 
    458480               END DO 
    459481            END DO 
     
    464486            DO jj = 2, jpjm1 
    465487               DO ji = fs_2, fs_jpim1   ! vector opt. 
    466                   psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * mxlb(ji,jj,jk)**rnn  
     488                  psi(ji,jj,jk)  = rc02 * eb(ji,jj,jk) * hmxl_b(ji,jj,jk)**rnn  
    467489               END DO 
    468490            END DO 
     
    475497      ! Resolution of a tridiagonal linear system by a "methode de chasse" 
    476498      ! 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 
     499      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    478500      ! Warning : after this step, en : right hand side of the matrix 
    479501 
     
    485507               zratio = psi(ji,jj,jk) / eb(ji,jj,jk)  
    486508               ! 
    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 
     509               ! psi3+ : stable : B=-KhN²<0 => N²>0 if rn2>0 zdir = 1 (stable) otherwise zdir = 0 (unstable) 
     510               zdir = 0.5_wp + SIGN( 0.5_wp, rn2(ji,jj,jk) ) 
     511               ! 
     512               rpsi3 = zdir * rpsi3m + ( 1._wp - zdir ) * rpsi3p 
    491513               ! 
    492514               ! shear prod. - stratif. destruction 
    493                prod = rpsi1 * zratio * shear(ji,jj,jk) 
     515               prod = rpsi1 * zratio * p_sh2(ji,jj,jk) 
    494516               ! 
    495517               ! stratif. destruction 
    496                buoy = rpsi3 * zratio * (- avt(ji,jj,jk) * rn2(ji,jj,jk) ) 
     518               buoy = rpsi3 * zratio * (- p_avt(ji,jj,jk) * rn2(ji,jj,jk) ) 
    497519               ! 
    498520               ! shear prod. - stratif. destruction 
    499521               diss = rpsi2 * zratio * zwall(ji,jj,jk) * eps(ji,jj,jk) 
    500522               ! 
    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 
     523               zdir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )     ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
     524               ! 
     525               zesh2 = zdir * ( prod + buoy )          + (1._wp - zdir ) * prod                        ! production term 
     526               zdiss = zdir * ( diss / psi(ji,jj,jk) ) + (1._wp - zdir ) * (diss-buoy) / psi(ji,jj,jk) ! dissipation term 
    505527               !                                                         
    506528               ! building the matrix 
    507529               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) 
     530               !                                               ! lower diagonal 
     531               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) ) 
     532               !                                               ! upper diagonal 
     533               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) ) 
     534               !                                               ! diagonal 
     535               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) 
     536               !                                               ! right hand side in psi 
     537               psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
    520538            END DO 
    521539         END DO 
    522540      END DO 
    523541      ! 
    524       z_elem_b(:,:,jpk) = 1._wp 
     542      zdiag(:,:,jpk) = 1._wp 
    525543 
    526544      ! Surface boundary condition on psi 
     
    530548      ! 
    531549      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       ! 
     550         ! 
     551         ! Surface value 
     552         zdep    (:,:)   = zhsro(:,:) * rl_sf ! Cosmetic 
     553         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     554         zd_lw(:,:,1) = psi(:,:,1) 
     555         zd_up(:,:,1) = 0._wp 
     556         zdiag(:,:,1) = 1._wp 
     557         ! 
     558         ! One level below 
     559         zkar    (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdepw_n(:,:,2)/zhsro(:,:) ))) 
     560         zdep    (:,:)   = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:) 
     561         psi     (:,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     562         zd_lw(:,:,2) = 0._wp 
     563         zd_up(:,:,2) = 0._wp 
     564         zdiag(:,:,2) = 1._wp 
     565         !  
    549566      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       ! 
     567         ! 
     568         ! Surface value: Dirichlet 
     569         zdep    (:,:)   = zhsro(:,:) * rl_sf 
     570         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
     571         zd_lw(:,:,1) = psi(:,:,1) 
     572         zd_up(:,:,1) = 0._wp 
     573         zdiag(:,:,1) = 1._wp 
     574         ! 
     575         ! Neumann condition at k=2 
     576         zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     577         zd_lw(:,:,2) = 0._wp 
     578         ! 
     579         ! Set psi vertical flux at the surface: 
     580         zkar (:,:)   = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 
     581         zdep (:,:)   = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 
     582         zflxs(:,:)   = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 
     583         zdep (:,:)   = rsbc_psi1 * (zwall_psi(:,:,1)*p_avm(:,:,1)+zwall_psi(:,:,2)*p_avm(:,:,2)) * & 
     584            &           ustar2_surf(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) 
     585         zflxs(:,:)   = zdep(:,:) * zflxs(:,:) 
     586         psi  (:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
     587         ! 
    573588      END SELECT 
    574589 
     
    576591      ! -------------------------------- 
    577592      ! 
    578       SELECT CASE ( nn_bc_bot ) 
    579       ! 
     593!!gm should be done for ISF (top boundary cond.) 
     594!!gm so, totally new staff needed      ===>>> think about that ! 
     595! 
     596      SELECT CASE ( nn_bc_bot )     ! bottom boundary 
    580597      ! 
    581598      CASE ( 0 )             ! Dirichlet  
    582          !                      ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 
     599         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * r_z0_bot 
    583600         !                      ! Balance between the production and the dissipation terms 
    584601         DO jj = 2, jpjm1 
     
    586603               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
    587604               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    588                zdep(ji,jj) = vkarmn * rn_bfrz0 
     605               zdep(ji,jj) = vkarmn * r_z0_bot 
    589606               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 
     607               zd_lw(ji,jj,ibot) = 0._wp 
     608               zd_up(ji,jj,ibot) = 0._wp 
     609               zdiag(ji,jj,ibot) = 1._wp 
    593610               ! 
    594611               ! Just above last level, Dirichlet condition again (GOTM like) 
    595                zdep(ji,jj) = vkarmn * ( rn_bfrz0 + e3t_n(ji,jj,ibotm1) ) 
     612               zdep(ji,jj) = vkarmn * ( r_z0_bot + e3t_n(ji,jj,ibotm1) ) 
    596613               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 
     614               zd_lw(ji,jj,ibotm1) = 0._wp 
     615               zd_up(ji,jj,ibotm1) = 0._wp 
     616               zdiag(ji,jj,ibotm1) = 1._wp 
    600617            END DO 
    601618         END DO 
     
    609626               ! 
    610627               ! Bottom level Dirichlet condition: 
    611                zdep(ji,jj) = vkarmn * rn_bfrz0 
     628               zdep(ji,jj) = vkarmn * r_z0_bot 
    612629               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    613630               ! 
    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 
     631               zd_lw(ji,jj,ibot) = 0._wp 
     632               zd_up(ji,jj,ibot) = 0._wp 
     633               zdiag(ji,jj,ibot) = 1._wp 
    617634               ! 
    618635               ! 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. 
     636               zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) ! Remove zd_up from zdiag 
     637               zd_up(ji,jj,ibotm1) = 0. 
    621638               ! 
    622639               ! 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) )   & 
     640               zdep(ji,jj) = r_z0_bot + 0.5_wp*e3t_n(ji,jj,ibotm1) 
     641               zflxb = rsbc_psi2 * ( p_avm(ji,jj,ibot) + p_avm(ji,jj,ibotm1) )   & 
    625642                  &  * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) 
    626643               psi(ji,jj,ibotm1) = psi(ji,jj,ibotm1) + zflxb / e3w_n(ji,jj,ibotm1) 
     
    636653         DO jj = 2, jpjm1 
    637654            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) 
     655               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    639656            END DO 
    640657         END DO 
     
    643660         DO jj = 2, jpjm1 
    644661            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) 
     662               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) 
    646663            END DO 
    647664         END DO 
     
    650667         DO jj = 2, jpjm1 
    651668            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) 
     669               psi(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * psi(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    653670            END DO 
    654671         END DO 
     
    703720      ! Limit dissipation rate under stable stratification 
    704721      ! -------------------------------------------------- 
    705       DO jk = 1, jpkm1 ! Note that this set boundary conditions on mxln at the same time 
     722      DO jk = 1, jpkm1 ! Note that this set boundary conditions on hmxl_n at the same time 
    706723         DO jj = 2, jpjm1 
    707724            DO ji = fs_2, fs_jpim1    ! vector opt. 
    708725               ! 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) 
     726               eps   (ji,jj,jk)  = MAX( eps(ji,jj,jk), rn_epsmin ) 
     727               hmxl_n(ji,jj,jk)  = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 
    711728               ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated)  
    712729               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) ) 
     730               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) ) 
    714731            END DO 
    715732         END DO 
     
    727744               DO ji = fs_2, fs_jpim1   ! vector opt. 
    728745                  ! zcof =  l²/q² 
    729                   zcof = mxlb(ji,jj,jk) * mxlb(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) 
     746                  zcof = hmxl_b(ji,jj,jk) * hmxl_b(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) 
    730747                  ! Gh = -N²l²/q² 
    731748                  gh = - rn2(ji,jj,jk) * zcof 
     
    736753                  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) 
    737754                  ! 
    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) 
     755                  ! Store stability function in zstt and zstm 
     756                  zstt(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     757                  zstm(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    741758               END DO 
    742759            END DO 
     
    748765               DO ji = fs_2, fs_jpim1   ! vector opt. 
    749766                  ! zcof =  l²/q² 
    750                   zcof = mxlb(ji,jj,jk)*mxlb(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) 
     767                  zcof = hmxl_b(ji,jj,jk)*hmxl_b(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) 
    751768                  ! Gh = -N²l²/q² 
    752769                  gh = - rn2(ji,jj,jk) * zcof 
     
    755772                  gh = gh * rf6 
    756773                  ! Gm =  M²l²/q² Shear number 
    757                   shr = shear(ji,jj,jk) / MAX( avm(ji,jj,jk), rsmall ) 
     774                  shr = p_sh2(ji,jj,jk) / MAX( p_avm(ji,jj,jk), rsmall ) 
    758775                  gm = MAX( shr * zcof , 1.e-10 ) 
    759776                  gm = gm * rf6 
     
    764781                  sh = (rs4 - rs5*gh + rs6*gm) / rcff 
    765782                  ! 
    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) 
     783                  ! Store stability function in zstt and zstm 
     784                  zstt(ji,jj,jk) = rc_diff * sh * tmask(ji,jj,jk) 
     785                  zstm(ji,jj,jk) = rc_diff * sm * tmask(ji,jj,jk) 
    769786               END DO 
    770787            END DO 
     
    776793      ! Lines below are useless if GOTM style Dirichlet conditions are used 
    777794 
    778       avmv(:,:,1) = avmv(:,:,2) 
     795      zstm(:,:,1) = zstm(:,:,2) 
    779796 
    780797      DO jj = 2, jpjm1 
    781798         DO ji = fs_2, fs_jpim1   ! vector opt. 
    782             avmv(ji,jj,mbkt(ji,jj)+1) = avmv(ji,jj,mbkt(ji,jj)) 
     799            zstm(ji,jj,mbkt(ji,jj)+1) = zstm(ji,jj,mbkt(ji,jj)) 
    783800         END DO 
    784801      END DO 
     802!!gm should be done for ISF (top boundary cond.) 
     803!!gm so, totally new staff needed!!gm 
    785804 
    786805      ! Compute diffusivities/viscosities 
     
    789808         DO jj = 2, jpjm1 
    790809            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 
     810               zsqen = SQRT( 2._wp * en(ji,jj,jk) ) * hmxl_n(ji,jj,jk) 
     811               zavt  = zsqen * zstt(ji,jj,jk) 
     812               zavm  = zsqen * zstm(ji,jj,jk) 
     813               p_avt(ji,jj,jk) = MAX( zavt, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine 
     814               p_avm(ji,jj,jk) = MAX( zavm, avmb(jk) )                  ! Note that avm is not masked at the surface and the bottom 
    796815            END DO 
    797816         END DO 
    798817      END DO 
    799       ! 
    800       ! Lateral boundary conditions (sign unchanged) 
    801       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      p_avt(:,:,1) = 0._wp 
     819      ! 
    815820      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 ) 
     821         CALL prt_ctl( tab3d_1=en   , clinfo1=' gls  - e: ', tab3d_2=p_avt, clinfo2=' t: ', ovlap=1, kdim=jpk) 
     822         CALL prt_ctl( tab3d_1=p_avm, clinfo1=' gls  - m: ', ovlap=1, kdim=jpk ) 
    819823      ENDIF 
    820824      ! 
    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       ! 
     825      IF( ln_timing )   CALL timing_stop('zdf_gls') 
    831826      ! 
    832827   END SUBROUTINE zdf_gls 
     
    838833      !!                      
    839834      !! ** Purpose :   Initialization of the vertical eddy diffivity and  
    840       !!      viscosity when using a gls turbulent closure scheme 
     835      !!              viscosity computed using a GLS turbulent closure scheme 
    841836      !! 
    842837      !! ** Method  :   Read the namzdf_gls namelist and check the parameters 
    843       !!      called at the first timestep (nit000) 
    844838      !! 
    845839      !! ** input   :   Namlist namzdf_gls 
     
    848842      !! 
    849843      !!---------------------------------------------------------------------- 
    850       USE dynzdf_exp 
    851       USE trazdf_exp 
    852       ! 
    853844      INTEGER ::   jk    ! dummy loop indices 
    854845      INTEGER ::   ios   ! Local integer output status for namelist read 
     
    862853      !!---------------------------------------------------------- 
    863854      ! 
    864       IF( nn_timing == 1 )  CALL timing_start('zdf_gls_init') 
     855      IF( ln_timing )   CALL timing_start('zdf_gls_init') 
    865856      ! 
    866857      REWIND( numnam_ref )              ! Namelist namzdf_gls in reference namelist : Vertical eddy diffivity and viscosity using gls turbulent closure scheme 
     
    875866      IF(lwp) THEN                     !* Control print 
    876867         WRITE(numout,*) 
    877          WRITE(numout,*) 'zdf_gls_init : gls turbulent closure scheme' 
     868         WRITE(numout,*) 'zdf_gls_init : GLS turbulent closure scheme' 
    878869         WRITE(numout,*) '~~~~~~~~~~~~' 
    879870         WRITE(numout,*) '   Namelist namzdf_gls : set gls mixing parameters' 
     
    892883         WRITE(numout,*) '      Type of closure                               nn_clos        = ', nn_clos 
    893884         WRITE(numout,*) '      Surface roughness (m)                         rn_hsro        = ', rn_hsro 
    894          WRITE(numout,*) '      Bottom roughness (m) (nambfr namelist)        rn_bfrz0       = ', rn_bfrz0 
     885         WRITE(numout,*) 
     886         WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     887         WRITE(numout,*) '      top    ocean cavity roughness (m)             rn_z0(_top)   = ', r_z0_top 
     888         WRITE(numout,*) '      Bottom seafloor     roughness (m)             rn_z0(_bot)   = ', r_z0_bot 
     889         WRITE(numout,*) 
    895890      ENDIF 
    896891 
    897       !                                !* allocate gls arrays 
     892      !                                !* allocate GLS arrays 
    898893      IF( zdf_gls_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_gls_init : unable to allocate arrays' ) 
    899894 
    900895      !                                !* 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' ) 
     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_bc_surf < 0   .OR. nn_bc_surf   > 1 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 
     898      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' ) 
     899      IF( nn_z0_met == 3  .AND. .NOT.ln_wave     )  CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' ) 
     900      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' ) 
     901      IF( nn_clos      < 0 .OR. nn_clos      > 3 )  CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' ) 
    907902 
    908903      SELECT CASE ( nn_clos )          !* set the parameters for the chosen closure 
     
    910905      CASE( 0 )                              ! k-kl  (Mellor-Yamada) 
    911906         ! 
    912          IF(lwp) WRITE(numout,*) 'The choosen closure is k-kl closed to the classical Mellor-Yamada' 
     907         IF(lwp) WRITE(numout,*) '   ==>>   k-kl closure chosen (i.e. closed to the classical Mellor-Yamada)' 
     908         IF(lwp) WRITE(numout,*) 
    913909         rpp     = 0._wp 
    914910         rmm     = 1._wp 
     
    928924      CASE( 1 )                              ! k-eps 
    929925         ! 
    930          IF(lwp) WRITE(numout,*) 'The choosen closure is k-eps' 
     926         IF(lwp) WRITE(numout,*) '   ==>>   k-eps closure chosen' 
     927         IF(lwp) WRITE(numout,*) 
    931928         rpp     =  3._wp 
    932929         rmm     =  1.5_wp 
     
    946943      CASE( 2 )                              ! k-omega 
    947944         ! 
    948          IF(lwp) WRITE(numout,*) 'The choosen closure is k-omega' 
     945         IF(lwp) WRITE(numout,*) '   ==>>   k-omega closure chosen' 
     946         IF(lwp) WRITE(numout,*) 
    949947         rpp     = -1._wp 
    950948         rmm     =  0.5_wp 
     
    964962      CASE( 3 )                              ! generic 
    965963         ! 
    966          IF(lwp) WRITE(numout,*) 'The choosen closure is generic' 
     964         IF(lwp) WRITE(numout,*) '   ==>>   generic closure chosen' 
     965         IF(lwp) WRITE(numout,*) 
    967966         rpp     = 2._wp 
    968967         rmm     = 1._wp 
     
    987986      CASE ( 0 )                             ! Galperin stability functions 
    988987         ! 
    989          IF(lwp) WRITE(numout,*) 'Stability functions from Galperin' 
     988         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Galperin' 
    990989         rc2     =  0._wp 
    991990         rc3     =  0._wp 
     
    999998      CASE ( 1 )                             ! Kantha-Clayson stability functions 
    1000999         ! 
    1001          IF(lwp) WRITE(numout,*) 'Stability functions from Kantha-Clayson' 
     1000         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Kantha-Clayson' 
    10021001         rc2     =  0.7_wp 
    10031002         rc3     =  0.2_wp 
     
    10111010      CASE ( 2 )                             ! Canuto A stability functions 
    10121011         ! 
    1013          IF(lwp) WRITE(numout,*) 'Stability functions from Canuto A' 
     1012         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Canuto A' 
    10141013         rs0 = 1.5_wp * rl1 * rl5*rl5 
    10151014         rs1 = -rl4*(rl6+rl7) + 2._wp*rl4*rl5*(rl1-(1._wp/3._wp)*rl2-rl3) + 1.5_wp*rl1*rl5*rl8 
     
    10351034      CASE ( 3 )                             ! Canuto B stability functions 
    10361035         ! 
    1037          IF(lwp) WRITE(numout,*) 'Stability functions from Canuto B' 
     1036         IF(lwp) WRITE(numout,*) '   ==>>   Stability functions from Canuto B' 
    10381037         rs0 = 1.5_wp * rm1 * rm5*rm5 
    10391038         rs1 = -rm4 * (rm6+rm7) + 2._wp * rm4*rm5*(rm1-(1._wp/3._wp)*rm2-rm3) + 1.5_wp * rm1*rm5*rm8 
     
    10791078         rl_sf = vkarmn 
    10801079      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                  &                                       ) 
     1080         rl_sf = rc0 * SQRT(rc0/rcm_sf) * SQRT( ( (1._wp + 4._wp*rmm + 8._wp*rmm**2_wp) * rsc_tke        & 
     1081            &                                            + 12._wp*rsc_psi0*rpsi2 - (1._wp + 4._wp*rmm)   & 
     1082            &                                                     *SQRT(rsc_tke*(rsc_tke                 & 
     1083            &                                                        + 24._wp*rsc_psi0*rpsi2)) )         & 
     1084            &                                              /(12._wp*rnn**2.)                             ) 
    10871085      ENDIF 
    10881086 
     
    10901088      IF(lwp) THEN                     !* Control print 
    10911089         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 
     1090         WRITE(numout,*) '   Limit values :' 
     1091         WRITE(numout,*) '      Parameter  m = ', rmm 
     1092         WRITE(numout,*) '      Parameter  n = ', rnn 
     1093         WRITE(numout,*) '      Parameter  p = ', rpp 
     1094         WRITE(numout,*) '      rpsi1    = ', rpsi1 
     1095         WRITE(numout,*) '      rpsi2    = ', rpsi2 
     1096         WRITE(numout,*) '      rpsi3m   = ', rpsi3m 
     1097         WRITE(numout,*) '      rpsi3p   = ', rpsi3p 
     1098         WRITE(numout,*) '      rsc_tke  = ', rsc_tke 
     1099         WRITE(numout,*) '      rsc_psi  = ', rsc_psi 
     1100         WRITE(numout,*) '      rsc_psi0 = ', rsc_psi0 
     1101         WRITE(numout,*) '      rc0      = ', rc0 
    11051102         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,*) 
     1103         WRITE(numout,*) '   Shear free turbulence parameters:' 
     1104         WRITE(numout,*) '      rcm_sf   = ', rcm_sf 
     1105         WRITE(numout,*) '      ra_sf    = ', ra_sf 
     1106         WRITE(numout,*) '      rl_sf    = ', rl_sf 
    11111107      ENDIF 
    11121108 
     
    11231119      rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 
    11241120      rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking  
    1125  
     1121      ! 
    11261122      rfact_tke = -0.5_wp / rsc_tke * rdt                                ! Cst used for the Diffusion term of tke 
    11271123      rfact_psi = -0.5_wp / rsc_psi * rdt                                ! Cst used for the Diffusion term of tke 
    1128  
     1124      ! 
    11291125      !                                !* 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') 
     1126!!gm tmask or wmask ???? 
     1127      zwall(:,:,:) = 1._wp * tmask(:,:,:) 
     1128 
     1129      !                                !* read or initialize all required files   
     1130      CALL gls_rst( nit000, 'READ' )      ! (en, avt_k, avm_k, hmxl_n) 
     1131      ! 
     1132      IF( ln_timing )   CALL timing_stop('zdf_gls_init') 
    11431133      ! 
    11441134   END SUBROUTINE zdf_gls_init 
     
    11551145      !!                set to rn_emin or recomputed (nn_igls/=0) 
    11561146      !!---------------------------------------------------------------------- 
    1157       INTEGER         , INTENT(in) ::   kt         ! ocean time-step 
    1158       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag 
     1147      USE zdf_oce , ONLY : en, avt_k, avm_k   ! ocean vertical physics 
     1148      !! 
     1149      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     1150      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    11591151      ! 
    11601152      INTEGER ::   jit, jk   ! dummy loop indices 
    1161       INTEGER ::   id1, id2, id3, id4, id5, id6 
     1153      INTEGER ::   id1, id2, id3, id4 
    11621154      INTEGER ::   ji, jj, ikbu, ikbv 
    11631155      REAL(wp)::   cbx, cby 
     
    11671159         !                                   ! --------------- 
    11681160         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. ) 
     1161            id1 = iom_varid( numror, 'en'    , ldstop = .FALSE. ) 
     1162            id2 = iom_varid( numror, 'avt_k' , ldstop = .FALSE. ) 
     1163            id3 = iom_varid( numror, 'avm_k' , ldstop = .FALSE. ) 
     1164            id4 = iom_varid( numror, 'hmxl_n', ldstop = .FALSE. ) 
    11751165            ! 
    1176             IF( MIN( id1, id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist 
     1166            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN        ! all required arrays exist 
    11771167               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   ) 
     1168               CALL iom_get( numror, jpdom_autoglo, 'avt_k' , avt_k  ) 
     1169               CALL iom_get( numror, jpdom_autoglo, 'avm_k' , avm_k  ) 
     1170               CALL iom_get( numror, jpdom_autoglo, 'hmxl_n', hmxl_n ) 
    11831171            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 
     1172               IF(lwp) WRITE(numout,*) 
     1173               IF(lwp) WRITE(numout,*) '   ==>>   previous run without GLS scheme, set en and hmxl_n to background values' 
     1174               en    (:,:,:) = rn_emin 
     1175               hmxl_n(:,:,:) = 0.05_wp 
     1176               ! avt_k, avm_k already set to the background value in zdf_phy_init 
    11921177            ENDIF 
    11931178         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        
     1179            IF(lwp) WRITE(numout,*) 
     1180            IF(lwp) WRITE(numout,*) '   ==>>   start from rest, set en and hmxl_n by background values' 
     1181            en    (:,:,:) = rn_emin 
     1182            hmxl_n(:,:,:) = 0.05_wp 
     1183            ! avt_k, avm_k already set to the background value in zdf_phy_init 
    11971184         ENDIF 
    11981185         ! 
     
    12001187         !                                   ! ------------------- 
    12011188         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   ) 
     1189         CALL iom_rstput( kt, nitrst, numrow, 'en'    , en     )  
     1190         CALL iom_rstput( kt, nitrst, numrow, 'avt_k' , avt_k  ) 
     1191         CALL iom_rstput( kt, nitrst, numrow, 'avm_k' , avm_k  ) 
     1192         CALL iom_rstput( kt, nitrst, numrow, 'hmxl_n', hmxl_n ) 
    12081193         ! 
    12091194      ENDIF 
    12101195      ! 
    12111196   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 
    12311197 
    12321198   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.