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 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2016-01-08T10:35:19+01:00 (8 years ago)
Author:
jamesharle
Message:

Update MPP_BDY_UPDATE branch to be consistent with head of trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90

    r4624 r6225  
    2626   !!                 !                                + cleaning of the parameters + bugs correction 
    2727   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase 
     28   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    2829   !!---------------------------------------------------------------------- 
    29 #if defined key_zdftke   ||   defined key_esopa 
     30#if defined key_zdftke 
    3031   !!---------------------------------------------------------------------- 
    3132   !!   'key_zdftke'                                   TKE vertical physics 
     
    5253   USE timing         ! Timing 
    5354   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     55#if defined key_agrif 
     56   USE agrif_opa_interp 
     57   USE agrif_opa_update 
     58#endif 
    5459 
    5560   IMPLICIT NONE 
     
    8489   REAL(wp) ::   rhftau_scl = 1.0_wp       ! scale factor applied to HF part of taum  (nn_etau=3) 
    8590 
    86    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   en             !: now turbulent kinetic energy   [m2/s2] 
    8791   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau           ! depth of tke penetration (nn_htau) 
    8892   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl          ! now mixing lenght of dissipation 
    89    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avt_k , avm_k  ! not enhanced Kz 
    90    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avmu_k, avmv_k ! not enhanced Kz 
     93   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr          ! now mixing lenght of dissipation 
    9194#if defined key_c1d 
    9295   !                                                                        !!** 1D cfg only  **   ('key_c1d') 
     
    9699 
    97100   !! * Substitutions 
    98 #  include "domzgr_substitute.h90" 
    99101#  include "vectopt_loop_substitute.h90" 
    100102   !!---------------------------------------------------------------------- 
    101    !! NEMO/OPA 4.0 , NEMO Consortium (2011) 
     103   !! NEMO/OPA 3.7 , NEMO Consortium (2015) 
    102104   !! $Id$ 
    103105   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    114116         &      e_pdl(jpi,jpj,jpk) , e_ric(jpi,jpj,jpk) ,                          & 
    115117#endif 
    116          &      en    (jpi,jpj,jpk) , htau  (jpi,jpj)    , dissl(jpi,jpj,jpk) ,     &  
    117          &      avt_k (jpi,jpj,jpk) , avm_k (jpi,jpj,jpk),                          & 
    118          &      avmu_k(jpi,jpj,jpk) , avmv_k(jpi,jpj,jpk), STAT= zdf_tke_alloc      ) 
     118         &      htau  (jpi,jpj)    , dissl(jpi,jpj,jpk) ,     &  
     119         &      apdlr(jpi,jpj,jpk) ,                                           STAT= zdf_tke_alloc      ) 
    119120         ! 
    120121      IF( lk_mpp             )   CALL mpp_sum ( zdf_tke_alloc ) 
     
    172173      !!---------------------------------------------------------------------- 
    173174      ! 
     175#if defined key_agrif  
     176      ! interpolation parent grid => child grid for avm_k ( ex : at west border: update column 1 and 2) 
     177      IF( .NOT.Agrif_Root() )   CALL Agrif_Tke 
     178#endif 
     179      ! 
    174180      IF( kt /= nit000 ) THEN   ! restore before value to compute tke 
    175181         avt (:,:,:) = avt_k (:,:,:)  
     
    188194      avmv_k(:,:,:) = avmv(:,:,:)  
    189195      ! 
    190    END SUBROUTINE zdf_tke 
     196#if defined key_agrif 
     197      ! Update child grid f => parent grid  
     198      IF( .NOT.Agrif_Root() )   CALL Agrif_Update_Tke( kt )      ! children only 
     199#endif       
     200     !  
     201  END SUBROUTINE zdf_tke 
    191202 
    192203 
     
    220231      REAL(wp) ::   zzd_up, zzd_lw                  !    -         - 
    221232!!bfr      REAL(wp) ::   zebot                           !    -         - 
    222       INTEGER , POINTER, DIMENSION(:,:  ) :: imlc 
    223       REAL(wp), POINTER, DIMENSION(:,:  ) :: zhlc 
    224       REAL(wp), POINTER, DIMENSION(:,:,:) :: zpelc, zdiag, zd_up, zd_lw 
     233      INTEGER , POINTER, DIMENSION(:,:  ) ::   imlc 
     234      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhlc 
     235      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv 
     236      REAL(wp)                            ::   zri  !   local Richardson number 
    225237      !!-------------------------------------------------------------------- 
    226238      ! 
    227239      IF( nn_timing == 1 )  CALL timing_start('tke_tke') 
    228240      ! 
    229       CALL wrk_alloc( jpi,jpj, imlc )    ! integer 
    230       CALL wrk_alloc( jpi,jpj, zhlc )  
    231       CALL wrk_alloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw )  
     241      CALL wrk_alloc( jpi,jpj,       imlc )    ! integer 
     242      CALL wrk_alloc( jpi,jpj,       zhlc )  
     243      CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
    232244      ! 
    233245      zbbrau = rn_ebb / rau0       ! Local constant initialisation 
     
    236248      zfact3 = 0.5_wp       * rn_ediss 
    237249      ! 
     250      ! 
    238251      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    239252      !                     !  Surface boundary condition on tke 
    240253      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     254      IF ( ln_isfcav ) THEN 
     255         DO jj = 2, jpjm1            ! en(mikt(ji,jj))   = rn_emin 
     256            DO ji = fs_2, fs_jpim1   ! vector opt. 
     257               en(ji,jj,mikt(ji,jj)) = rn_emin * tmask(ji,jj,1) 
     258            END DO 
     259         END DO 
     260      END IF 
    241261      DO jj = 2, jpjm1            ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
    242262         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    256276      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    257277      !                     en(bot)   = (rn_ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
    258 !CDIR NOVERRCHK 
    259278!!    DO jj = 2, jpjm1 
    260 !CDIR NOVERRCHK 
    261279!!       DO ji = fs_2, fs_jpim1   ! vector opt. 
    262280!!          ztx2 = bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) + & 
     
    275293         ! 
    276294         !                        !* total energy produce by LC : cumulative sum over jk 
    277          zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * fsdepw(:,:,1) * fse3w(:,:,1) 
     295         zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * gdepw_n(:,:,1) * e3w_n(:,:,1) 
    278296         DO jk = 2, jpk 
    279             zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * fsdepw(:,:,jk) * fse3w(:,:,jk) 
     297            zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw_n(:,:,jk) * e3w_n(:,:,jk) 
    280298         END DO 
    281299         !                        !* finite Langmuir Circulation depth 
     
    291309         END DO 
    292310         !                               ! finite LC depth 
    293 # if defined key_vectopt_loop 
    294          DO jj = 1, 1 
    295             DO ji = 1, jpij   ! vector opt. (forced unrolling) 
    296 # else 
    297311         DO jj = 1, jpj  
    298312            DO ji = 1, jpi 
    299 # endif 
    300                zhlc(ji,jj) = fsdepw(ji,jj,imlc(ji,jj)) 
     313               zhlc(ji,jj) = gdepw_n(ji,jj,imlc(ji,jj)) 
    301314            END DO 
    302315         END DO 
    303316         zcof = 0.016 / SQRT( zrhoa * zcdrag ) 
    304 !CDIR NOVERRCHK 
    305317         DO jk = 2, jpkm1         !* TKE Langmuir circulation source term added to en 
    306 !CDIR NOVERRCHK 
    307             DO jj = 2, jpjm1 
    308 !CDIR NOVERRCHK 
     318            DO jj = 2, jpjm1 
    309319               DO ji = fs_2, fs_jpim1   ! vector opt. 
    310320                  zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    311321                  !                                           ! vertical velocity due to LC 
    312                   zind = 0.5 - SIGN( 0.5, fsdepw(ji,jj,jk) - zhlc(ji,jj) ) 
    313                   zwlc = zind * rn_lc * zus * SIN( rpi * fsdepw(ji,jj,jk) / zhlc(ji,jj) ) 
     322                  zind = 0.5 - SIGN( 0.5, gdepw_n(ji,jj,jk) - zhlc(ji,jj) ) 
     323                  zwlc = zind * rn_lc * zus * SIN( rpi * gdepw_n(ji,jj,jk) / zhlc(ji,jj) ) 
    314324                  !                                           ! TKE Langmuir circulation source term 
    315                   en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) * tmask(ji,jj,jk) 
     325                  en(ji,jj,jk) = en(ji,jj,jk) + rdt * (1._wp - fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    316326               END DO 
    317327            END DO 
     
    328338      ! 
    329339      DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form) 
    330          DO jj = 1, jpj                 ! here avmu, avmv used as workspace 
    331             DO ji = 1, jpi 
    332                avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) )   & 
    333                   &                            * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) )   &  
    334                   &           / (  fse3uw_n(ji,jj,jk)         & 
    335                   &              * fse3uw_b(ji,jj,jk) ) 
    336                avmv(ji,jj,jk) = avmv(ji,jj,jk) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) )   & 
    337                   &                            * ( vb(ji,jj,jk-1) - vb(ji,jj,jk) )   & 
    338                   &                            / (  fse3vw_n(ji,jj,jk)               & 
    339                   &                              *  fse3vw_b(ji,jj,jk)  ) 
    340             END DO 
    341          END DO 
    342       END DO 
    343       ! 
     340         DO jj = 1, jpjm1 
     341            DO ji = 1, fs_jpim1   ! vector opt. 
     342               z3du(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji+1,jj,jk) )   & 
     343                  &                 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )   & 
     344                  &                 * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) * wumask(ji,jj,jk) & 
     345                  &                 / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
     346               z3dv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji,jj+1,jk) )   & 
     347                  &                 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )   & 
     348                  &                 * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) * wvmask(ji,jj,jk) & 
     349                  &                 / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
     350            END DO 
     351         END DO 
     352      END DO 
     353      ! 
     354      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: compute apdlr 
     355         ! Note that zesh2 is also computed in the next loop. 
     356         ! We decided to compute it twice to keep code readability and avoid an IF case in the DO loops 
     357         DO jk = 2, jpkm1 
     358            DO jj = 2, jpjm1 
     359               DO ji = fs_2, fs_jpim1   ! vector opt. 
     360                  !                                          ! shear prod. at w-point weightened by mask 
     361                  zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
     362                     &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
     363                  !                                          ! local Richardson number 
     364                  zri   = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zesh2 + rn_bshear ) 
     365                  apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
     366                   
     367               END DO 
     368            END DO 
     369         END DO 
     370         ! 
     371      ENDIF 
     372      !          
    344373      DO jk = 2, jpkm1           !* Matrix and right hand side in en 
    345374         DO jj = 2, jpjm1 
     
    347376               zcof   = zfact1 * tmask(ji,jj,jk) 
    348377               zzd_up = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   &  ! upper diagonal 
    349                   &          / ( fse3t(ji,jj,jk  ) * fse3w(ji,jj,jk  ) ) 
     378                  &          / ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk  ) ) 
    350379               zzd_lw = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   &  ! lower diagonal 
    351                   &          / ( fse3t(ji,jj,jk-1) * fse3w(ji,jj,jk  ) ) 
    352                   !                                                           ! shear prod. at w-point weightened by mask 
    353                zesh2  =  ( avmu(ji-1,jj,jk) + avmu(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    354                   &    + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
    355                   ! 
     380                  &          / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  ) ) 
     381               !                                   ! shear prod. at w-point weightened by mask 
     382               zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
     383                  &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
     384               ! 
    356385               zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
    357386               zd_lw(ji,jj,jk) = zzd_lw 
     
    360389               !                                   ! right hand side in en 
    361390               en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  zesh2  -   avt(ji,jj,jk) * rn2(ji,jj,jk)    & 
    362                   &                                 + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk)  ) * tmask(ji,jj,jk) 
     391                  &                                 + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk)  ) & 
     392                  &                                 * wmask(ji,jj,jk) 
    363393            END DO 
    364394         END DO 
     
    373403      END DO 
    374404      DO jj = 2, jpjm1                             ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 
    375          DO ji = fs_2, fs_jpim1    ! vector opt. 
     405         DO ji = fs_2, fs_jpim1   ! vector opt. 
    376406            zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke 
    377407         END DO 
     
    385415      END DO 
    386416      DO jj = 2, jpjm1                             ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 
    387          DO ji = fs_2, fs_jpim1    ! vector opt. 
     417         DO ji = fs_2, fs_jpim1   ! vector opt. 
    388418            en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 
    389419         END DO 
     
    399429         DO jj = 2, jpjm1 
    400430            DO ji = fs_2, fs_jpim1   ! vector opt. 
    401                en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * tmask(ji,jj,jk) 
     431               en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 
    402432            END DO 
    403433         END DO 
     
    407437      !                            !  TKE due to surface and internal wave breaking 
    408438      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     439!!gm BUG : in the exp  remove the depth of ssh !!! 
     440       
     441       
    409442      IF( nn_etau == 1 ) THEN           !* penetration below the mixed layer (rn_efr fraction) 
    410443         DO jk = 2, jpkm1 
    411444            DO jj = 2, jpjm1 
    412445               DO ji = fs_2, fs_jpim1   ! vector opt. 
    413                   en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) )   & 
    414                      &                                               * ( 1._wp - fr_i(ji,jj) )  * tmask(ji,jj,jk) 
     446                  en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     447                     &                                 * ( 1._wp - fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    415448               END DO 
    416449            END DO 
     
    420453            DO ji = fs_2, fs_jpim1   ! vector opt. 
    421454               jk = nmln(ji,jj) 
    422                en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) )   & 
    423                   &                                               * ( 1._wp - fr_i(ji,jj) )  * tmask(ji,jj,jk) 
     455               en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     456                  &                                 * ( 1._wp - fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    424457            END DO 
    425458         END DO 
    426459      ELSEIF( nn_etau == 3 ) THEN       !* penetration belox the mixed layer (HF variability) 
    427 !CDIR NOVERRCHK 
    428460         DO jk = 2, jpkm1 
    429 !CDIR NOVERRCHK 
    430             DO jj = 2, jpjm1 
    431 !CDIR NOVERRCHK 
     461            DO jj = 2, jpjm1 
    432462               DO ji = fs_2, fs_jpim1   ! vector opt. 
    433463                  ztx2 = utau(ji-1,jj  ) + utau(ji,jj) 
    434464                  zty2 = vtau(ji  ,jj-1) + vtau(ji,jj) 
    435                   ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 )    ! module of the mean stress  
     465                  ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)    ! module of the mean stress  
    436466                  zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean  
    437467                  zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
    438                   en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) )   & 
    439                      &                                        * ( 1._wp - fr_i(ji,jj) ) * tmask(ji,jj,jk) 
     468                  en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     469                     &                        * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    440470               END DO 
    441471            END DO 
     
    444474      CALL lbc_lnk( en, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    445475      ! 
    446       CALL wrk_dealloc( jpi,jpj, imlc )    ! integer 
    447       CALL wrk_dealloc( jpi,jpj, zhlc )  
    448       CALL wrk_dealloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw )  
     476      CALL wrk_dealloc( jpi,jpj,       imlc )    ! integer 
     477      CALL wrk_dealloc( jpi,jpj,       zhlc )  
     478      CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
    449479      ! 
    450480      IF( nn_timing == 1 )  CALL timing_stop('tke_tke') 
     
    490520      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    491521      REAL(wp) ::   zrn2, zraug, zcoef, zav     ! local scalars 
    492       REAL(wp) ::   zdku, zpdlr, zri, zsqen     !   -      - 
     522      REAL(wp) ::   zdku, zri, zsqen            !   -      - 
    493523      REAL(wp) ::   zdkv, zemxl, zemlm, zemlp   !   -      - 
    494524      REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl, zmxlm, zmxld 
     
    505535      !                     !* Buoyancy length scale: l=sqrt(2*e/n**2) 
    506536      ! 
     537      ! initialisation of interior minimum value (avoid a 2d loop with mikt) 
     538      zmxlm(:,:,:)  = rmxl_min     
     539      zmxld(:,:,:)  = rmxl_min 
     540      ! 
    507541      IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 
    508          zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    509          zmxlm(:,:,1) = MAX(  rn_mxl0,  zraug * taum(:,:)  ) 
    510       ELSE                          ! surface set to the minimum value 
     542         DO jj = 2, jpjm1 
     543            DO ji = fs_2, fs_jpim1 
     544               zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
     545               zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 
     546            END DO 
     547         END DO 
     548      ELSE  
    511549         zmxlm(:,:,1) = rn_mxl0 
    512550      ENDIF 
    513       zmxlm(:,:,jpk)  = rmxl_min     ! last level set to the interior minium value 
    514       ! 
    515 !CDIR NOVERRCHK 
     551      ! 
    516552      DO jk = 2, jpkm1              ! interior value : l=sqrt(2*e/n^2) 
    517 !CDIR NOVERRCHK 
    518          DO jj = 2, jpjm1 
    519 !CDIR NOVERRCHK 
     553         DO jj = 2, jpjm1 
    520554            DO ji = fs_2, fs_jpim1   ! vector opt. 
    521555               zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
     
    527561      !                     !* Physical limits for the mixing length 
    528562      ! 
    529       zmxld(:,:, 1 ) = zmxlm(:,:,1)   ! surface set to the zmxlm   value 
     563      zmxld(:,:, 1 ) = zmxlm(:,:,1)   ! surface set to the minimum value  
    530564      zmxld(:,:,jpk) = rmxl_min       ! last level  set to the minimum value 
    531565      ! 
    532566      SELECT CASE ( nn_mxl ) 
    533567      ! 
     568 !!gm Not sure of that coding for ISF.... 
     569      ! where wmask = 0 set zmxlm == e3w_n 
    534570      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    535571         DO jk = 2, jpkm1 
    536572            DO jj = 2, jpjm1 
    537573               DO ji = fs_2, fs_jpim1   ! vector opt. 
    538                   zemxl = MIN( fsdepw(ji,jj,jk), zmxlm(ji,jj,jk),   & 
    539                   &            fsdepw(ji,jj,mbkt(ji,jj)+1) - fsdepw(ji,jj,jk) ) 
    540                   zmxlm(ji,jj,jk) = zemxl 
    541                   zmxld(ji,jj,jk) = zemxl 
     574                  zemxl = MIN( gdepw_n(ji,jj,jk) - gdepw_n(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
     575                  &            gdepw_n(ji,jj,mbkt(ji,jj)+1) - gdepw_n(ji,jj,jk) ) 
     576                  ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
     577                  zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
     578                  zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
    542579               END DO 
    543580            END DO 
     
    548585            DO jj = 2, jpjm1 
    549586               DO ji = fs_2, fs_jpim1   ! vector opt. 
    550                   zemxl = MIN( fse3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
     587                  zemxl = MIN( e3w_n(ji,jj,jk), zmxlm(ji,jj,jk) ) 
    551588                  zmxlm(ji,jj,jk) = zemxl 
    552589                  zmxld(ji,jj,jk) = zemxl 
     
    559596            DO jj = 2, jpjm1 
    560597               DO ji = fs_2, fs_jpim1   ! vector opt. 
    561                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + fse3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     598                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    562599               END DO 
    563600            END DO 
     
    566603            DO jj = 2, jpjm1 
    567604               DO ji = fs_2, fs_jpim1   ! vector opt. 
    568                   zemxl = MIN( zmxlm(ji,jj,jk+1) + fse3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     605                  zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    569606                  zmxlm(ji,jj,jk) = zemxl 
    570607                  zmxld(ji,jj,jk) = zemxl 
     
    577614            DO jj = 2, jpjm1 
    578615               DO ji = fs_2, fs_jpim1   ! vector opt. 
    579                   zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + fse3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     616                  zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    580617               END DO 
    581618            END DO 
     
    584621            DO jj = 2, jpjm1 
    585622               DO ji = fs_2, fs_jpim1   ! vector opt. 
    586                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + fse3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    587                END DO 
    588             END DO 
    589          END DO 
    590 !CDIR NOVERRCHK 
     623                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     624               END DO 
     625            END DO 
     626         END DO 
    591627         DO jk = 2, jpkm1 
    592 !CDIR NOVERRCHK 
    593             DO jj = 2, jpjm1 
    594 !CDIR NOVERRCHK 
     628            DO jj = 2, jpjm1 
    595629               DO ji = fs_2, fs_jpim1   ! vector opt. 
    596630                  zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) ) 
     
    612646      !                     !  Vertical eddy viscosity and diffusivity  (avmu, avmv, avt) 
    613647      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    614 !CDIR NOVERRCHK 
    615648      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points 
    616 !CDIR NOVERRCHK 
    617          DO jj = 2, jpjm1 
    618 !CDIR NOVERRCHK 
     649         DO jj = 2, jpjm1 
    619650            DO ji = fs_2, fs_jpim1   ! vector opt. 
    620651               zsqen = SQRT( en(ji,jj,jk) ) 
    621652               zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
    622                avm  (ji,jj,jk) = MAX( zav,                  avmb(jk) ) * tmask(ji,jj,jk) 
    623                avt  (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
     653               avm  (ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
     654               avt  (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    624655               dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 
    625656            END DO 
     
    628659      CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    629660      ! 
    630       DO jk = 2, jpkm1            !* vertical eddy viscosity at u- and v-points 
     661      DO jk = 2, jpkm1            !* vertical eddy viscosity at wu- and wv-points 
    631662         DO jj = 2, jpjm1 
    632663            DO ji = fs_2, fs_jpim1   ! vector opt. 
    633                avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * umask(ji,jj,jk) 
    634                avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * vmask(ji,jj,jk) 
     664               avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * wumask(ji,jj,jk) 
     665               avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * wvmask(ji,jj,jk) 
    635666            END DO 
    636667         END DO 
     
    642673            DO jj = 2, jpjm1 
    643674               DO ji = fs_2, fs_jpim1   ! vector opt. 
    644                   zcoef = avm(ji,jj,jk) * 2._wp * fse3w(ji,jj,jk) * fse3w(ji,jj,jk) 
    645                   !                                          ! shear 
    646                   zdku = avmu(ji-1,jj,jk) * ( un(ji-1,jj,jk-1) - un(ji-1,jj,jk) ) * ( ub(ji-1,jj,jk-1) - ub(ji-1,jj,jk) )   & 
    647                     &  + avmu(ji  ,jj,jk) * ( un(ji  ,jj,jk-1) - un(ji  ,jj,jk) ) * ( ub(ji  ,jj,jk-1) - ub(ji  ,jj,jk) ) 
    648                   zdkv = avmv(ji,jj-1,jk) * ( vn(ji,jj-1,jk-1) - vn(ji,jj-1,jk) ) * ( vb(ji,jj-1,jk-1) - vb(ji,jj-1,jk) )   & 
    649                     &  + avmv(ji,jj  ,jk) * ( vn(ji,jj  ,jk-1) - vn(ji,jj  ,jk) ) * ( vb(ji,jj  ,jk-1) - vb(ji,jj  ,jk) ) 
    650                   !                                          ! local Richardson number 
    651                   zri   = MAX( rn2b(ji,jj,jk), 0._wp ) * zcoef / (zdku + zdkv + rn_bshear ) 
    652                   zpdlr = MAX(  0.1_wp,  0.2 / MAX( 0.2 , zri )  ) 
    653 !!gm and even better with the use of the "true" ri_crit=0.22222...  (this change the results!) 
    654 !!gm              zpdlr = MAX(  0.1_wp,  ri_crit / MAX( ri_crit , zri )  ) 
    655                   avt(ji,jj,jk)   = MAX( zpdlr * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
     675                  avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    656676# if defined key_c1d 
    657                   e_pdl(ji,jj,jk) = zpdlr * tmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number 
    658                   e_ric(ji,jj,jk) = zri * tmask(ji,jj,jk)                            ! c1d config. : save Ri 
     677                  e_pdl(ji,jj,jk) = apdlr(ji,jj,jk) * wmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number 
     678!!gm bug NO zri here.... 
     679!!gm remove the specific diag for c1d ! 
     680                  e_ric(ji,jj,jk) = zri * wmask(ji,jj,jk)                            ! c1d config. : save Ri 
    659681# endif 
    660682              END DO 
     
    740762      ! 
    741763      !                               !* Check of some namelist values 
    742       IF( nn_mxl  < 0  .OR.  nn_mxl  > 3 )   CALL ctl_stop( 'bad flag: nn_mxl is  0, 1 or 2 ' ) 
    743       IF( nn_pdl  < 0  .OR.  nn_pdl  > 1 )   CALL ctl_stop( 'bad flag: nn_pdl is  0 or 1    ' ) 
    744       IF( nn_htau < 0  .OR.  nn_htau > 1 )   CALL ctl_stop( 'bad flag: nn_htau is 0, 1 or 2 ' ) 
    745 #if ! key_coupled 
    746       IF( nn_etau == 3 )   CALL ctl_stop( 'nn_etau == 3 : HF taum only known in coupled mode' ) 
    747 #endif 
     764      IF( nn_mxl  < 0   .OR.  nn_mxl  > 3 )   CALL ctl_stop( 'bad flag: nn_mxl is  0, 1 or 2 ' ) 
     765      IF( nn_pdl  < 0   .OR.  nn_pdl  > 1 )   CALL ctl_stop( 'bad flag: nn_pdl is  0 or 1    ' ) 
     766      IF( nn_htau < 0   .OR.  nn_htau > 1 )   CALL ctl_stop( 'bad flag: nn_htau is 0, 1 or 2 ' ) 
     767      IF( nn_etau == 3 .AND. .NOT. ln_cpl )   CALL ctl_stop( 'nn_etau == 3 : HF taum only known in coupled mode' ) 
    748768 
    749769      IF( ln_mxl0 ) THEN 
     
    765785      !                               !* set vertical eddy coef. to the background value 
    766786      DO jk = 1, jpk 
    767          avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    768          avm (:,:,jk) = avmb(jk) * tmask(:,:,jk) 
    769          avmu(:,:,jk) = avmb(jk) * umask(:,:,jk) 
    770          avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
     787         avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
     788         avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
     789         avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
     790         avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
    771791      END DO 
    772792      dissl(:,:,:) = 1.e-12_wp 
     
    819839              en (:,:,:) = rn_emin * tmask(:,:,:) 
    820840              CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation) 
     841              ! 
     842              avt_k (:,:,:) = avt (:,:,:) 
     843              avm_k (:,:,:) = avm (:,:,:) 
     844              avmu_k(:,:,:) = avmu(:,:,:) 
     845              avmv_k(:,:,:) = avmv(:,:,:) 
     846              ! 
    821847              DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO 
    822848           ENDIF 
     
    824850           en(:,:,:) = rn_emin * tmask(:,:,:) 
    825851           DO jk = 1, jpk                           ! set the Kz to the background value 
    826               avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    827               avm (:,:,jk) = avmb(jk) * tmask(:,:,jk) 
    828               avmu(:,:,jk) = avmb(jk) * umask(:,:,jk) 
    829               avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk) 
     852              avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
     853              avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
     854              avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 
     855              avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 
    830856           END DO 
    831857        ENDIF 
Note: See TracChangeset for help on using the changeset viewer.