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 13540 for NEMO/branches/2020/r12377_ticket2386/src/OCE/ZDF/zdftke.F90 – NEMO

Ignore:
Timestamp:
2020-09-29T12:41:06+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2386: update to latest trunk

Location:
NEMO/branches/2020/r12377_ticket2386
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/r12377_ticket2386

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
        88 
        99# SETTE 
        10 ^/utils/CI/sette@HEAD         sette 
         10^/utils/CI/sette@13507        sette 
  • NEMO/branches/2020/r12377_ticket2386/src/OCE/ZDF/zdftke.F90

    r12511 r13540  
    2828   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    2929   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only  
    30    !!             -   !  2017-05  (G. Madec)  add top/bottom friction as boundary condition (ln_drg) 
     30   !!             -   !  2017-05  (G. Madec)  add top/bottom friction as boundary condition 
    3131   !!---------------------------------------------------------------------- 
    3232 
     
    4545   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    4646   USE zdfmxl         ! vertical physics: mixed layer 
     47#if defined key_si3 
     48   USE ice, ONLY: hm_i, h_i 
     49#endif 
     50#if defined key_cice 
     51   USE sbc_ice, ONLY: h_i 
     52#endif 
    4753   ! 
    4854   USE in_out_manager ! I/O manager 
     
    6268   !                      !!** Namelist  namzdf_tke  ** 
    6369   LOGICAL  ::   ln_mxl0   ! mixing length scale surface value as function of wind stress or not 
     70   INTEGER  ::   nn_mxlice ! type of scaling under sea-ice (=0/1/2/3) 
     71   REAL(wp) ::   rn_mxlice ! ice thickness value when scaling under sea-ice 
    6472   INTEGER  ::   nn_mxl    ! type of mixing length (=0/1/2/3) 
    6573   REAL(wp) ::   rn_mxl0   ! surface  min value of mixing length (kappa*z_o=0.4*0.1 m)  [m] 
     
    7179   REAL(wp) ::   rn_emin0  ! surface minimum value of tke   [m2/s2] 
    7280   REAL(wp) ::   rn_bshear ! background shear (>0) currently a numerical threshold (do not change it) 
    73    LOGICAL  ::   ln_drg    ! top/bottom friction forcing flag  
    7481   INTEGER  ::   nn_etau   ! type of depth penetration of surface tke (=0/1/2/3) 
    7582   INTEGER  ::      nn_htau   ! type of tke profile of penetration (=0/1) 
    7683   REAL(wp) ::      rn_efr    ! fraction of TKE surface value which penetrates in the ocean 
    77    REAL(wp) ::      rn_eice   ! =0 ON below sea-ice, =4 OFF when ice fraction > 1/4    
    7884   LOGICAL  ::   ln_lc     ! Langmuir cells (LC) as a source term of TKE or not 
    7985   REAL(wp) ::      rn_lc     ! coef to compute vertical velocity of Langmuir cells 
     86   INTEGER  ::   nn_eice   ! attenutaion of langmuir & surface wave breaking under ice (=0/1/2/3)    
    8087 
    8188   REAL(wp) ::   ri_cri    ! critic Richardson number (deduced from rn_ediff and rn_ediss values) 
     
    9097   !! * Substitutions 
    9198#  include "do_loop_substitute.h90" 
     99#  include "domzgr_substitute.h90" 
    92100   !!---------------------------------------------------------------------- 
    93101   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    191199      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
    192200      ! 
    193       INTEGER ::   ji, jj, jk              ! dummy loop arguments 
     201      INTEGER ::   ji, jj, jk                  ! dummy loop arguments 
    194202      REAL(wp) ::   zetop, zebot, zmsku, zmskv ! local scalars 
    195203      REAL(wp) ::   zrhoa  = 1.22              ! Air density kg/m3 
    196204      REAL(wp) ::   zcdrag = 1.5e-3            ! drag coefficient 
    197       REAL(wp) ::   zbbrau, zri                ! local scalars 
    198       REAL(wp) ::   zfact1, zfact2, zfact3     !   -         - 
    199       REAL(wp) ::   ztx2  , zty2  , zcof       !   -         - 
    200       REAL(wp) ::   ztau  , zdif               !   -         - 
    201       REAL(wp) ::   zus   , zwlc  , zind       !   -         - 
    202       REAL(wp) ::   zzd_up, zzd_lw             !   -         - 
     205      REAL(wp) ::   zbbrau, zbbirau, zri       ! local scalars 
     206      REAL(wp) ::   zfact1, zfact2, zfact3     !   -      - 
     207      REAL(wp) ::   ztx2  , zty2  , zcof       !   -      - 
     208      REAL(wp) ::   ztau  , zdif               !   -      - 
     209      REAL(wp) ::   zus   , zwlc  , zind       !   -      - 
     210      REAL(wp) ::   zzd_up, zzd_lw             !   -      - 
    203211      INTEGER , DIMENSION(jpi,jpj)     ::   imlc 
    204       REAL(wp), DIMENSION(jpi,jpj)     ::   zhlc, zfr_i 
     212      REAL(wp), DIMENSION(jpi,jpj)     ::   zice_fra, zhlc, zus3 
    205213      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpelc, zdiag, zd_up, zd_lw 
    206214      !!-------------------------------------------------------------------- 
    207215      ! 
    208       zbbrau = rn_ebb / rho0       ! Local constant initialisation 
    209       zfact1 = -.5_wp * rn_Dt  
    210       zfact2 = 1.5_wp * rn_Dt * rn_ediss 
    211       zfact3 = 0.5_wp       * rn_ediss 
     216      zbbrau  = rn_ebb / rho0       ! Local constant initialisation 
     217      zbbirau = 3.75_wp / rho0 
     218      zfact1  = -.5_wp * rn_Dt  
     219      zfact2  = 1.5_wp * rn_Dt * rn_ediss 
     220      zfact3  = 0.5_wp         * rn_ediss 
     221      ! 
     222      ! ice fraction considered for attenuation of langmuir & wave breaking 
     223      SELECT CASE ( nn_eice ) 
     224      CASE( 0 )   ;   zice_fra(:,:) = 0._wp 
     225      CASE( 1 )   ;   zice_fra(:,:) =        TANH( fr_i(:,:) * 10._wp ) 
     226      CASE( 2 )   ;   zice_fra(:,:) =              fr_i(:,:) 
     227      CASE( 3 )   ;   zice_fra(:,:) = MIN( 4._wp * fr_i(:,:) , 1._wp ) 
     228      END SELECT 
    212229      ! 
    213230      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    214231      !                     !  Surface/top/bottom boundary condition on tke 
    215232      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    216        
    217       DO_2D_00_00 
     233      ! 
     234      DO_2D( 0, 0, 0, 0 )         ! en(1)   = rn_ebb taum / rau0  (min value rn_emin0) 
     235!! clem: this should be the right formulation but it makes the model unstable unless drags are calculated implicitly 
     236!!       one way around would be to increase zbbirau  
     237!!          en(ji,jj,1) = MAX( rn_emin0, ( ( 1._wp - fr_i(ji,jj) ) * zbbrau + & 
     238!!             &                                     fr_i(ji,jj)   * zbbirau ) * taum(ji,jj) ) * tmask(ji,jj,1) 
    218239         en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 
    219240      END_2D 
    220       IF ( ln_isfcav ) THEN 
    221          DO_2D_00_00 
    222             en(ji,jj,mikt(ji,jj)) = rn_emin * tmask(ji,jj,1) 
    223          END_2D 
    224       ENDIF 
    225241      ! 
    226242      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    232248      ! Note that stress averaged is done using an wet-only calculation of u and v at t-point like in zdfsh2 
    233249      ! 
    234       IF( ln_drg ) THEN       !== friction used as top/bottom boundary condition on TKE 
    235          ! 
    236          DO_2D_00_00 
     250      IF( .NOT.ln_drg_OFF ) THEN    !== friction used as top/bottom boundary condition on TKE 
     251         ! 
     252         DO_2D( 0, 0, 0, 0 )        ! bottom friction 
    237253            zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
    238254            zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     
    242258            en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
    243259         END_2D 
    244          IF( ln_isfcav ) THEN       ! top friction 
    245             DO_2D_00_00 
     260         IF( ln_isfcav ) THEN 
     261            DO_2D( 0, 0, 0, 0 )     ! top friction 
    246262               zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
    247263               zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 
     
    249265               zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT(  ( zmsku*( uu(ji,jj,mikt(ji,jj),Kbb)+uu(ji-1,jj,mikt(ji,jj),Kbb) ) )**2  & 
    250266                  &                                           + ( zmskv*( vv(ji,jj,mikt(ji,jj),Kbb)+vv(ji,jj-1,mikt(ji,jj),Kbb) ) )**2  ) 
    251                en(ji,jj,mikt(ji,jj)) = MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1))   ! masked at ocean surface 
     267               ! (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) = 1 where ice shelves are present 
     268               en(ji,jj,mikt(ji,jj)) = en(ji,jj,1)           * tmask(ji,jj,1) & 
     269                  &                  + MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) 
    252270            END_2D 
    253271         ENDIF 
     
    262280         zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * gdepw(:,:,1,Kmm) * e3w(:,:,1,Kmm) 
    263281         DO jk = 2, jpk 
    264             zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw(:,:,jk,Kmm) * e3w(:,:,jk,Kmm) 
     282            zpelc(:,:,jk)  = zpelc(:,:,jk-1) +   & 
     283               &        MAX( rn2b(:,:,jk), 0._wp ) * gdepw(:,:,jk,Kmm) * e3w(:,:,jk,Kmm) 
    265284         END DO 
    266285         !                        !* finite Langmuir Circulation depth 
    267286         zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) 
    268287         imlc(:,:) = mbkt(:,:) + 1       ! Initialization to the number of w ocean point (=2 over land) 
    269          DO_3DS_11_11( jpkm1, 2, -1 ) 
    270             zus  = zcof * taum(ji,jj) 
     288         DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 )   ! Last w-level at which zpelc>=0.5*us*us  
     289            zus = zcof * taum(ji,jj)          !      with us=0.016*wind(starting from jpk-1) 
    271290            IF( zpelc(ji,jj,jk) > zus )   imlc(ji,jj) = jk 
    272291         END_3D 
    273292         !                               ! finite LC depth 
    274          DO_2D_11_11 
     293         DO_2D( 1, 1, 1, 1 ) 
    275294            zhlc(ji,jj) = gdepw(ji,jj,imlc(ji,jj),Kmm) 
    276295         END_2D 
    277296         zcof = 0.016 / SQRT( zrhoa * zcdrag ) 
    278          DO_2D_00_00 
     297         DO_2D( 0, 0, 0, 0 ) 
    279298            zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    280             zfr_i(ji,jj) = ( 1._wp - 4._wp * fr_i(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 
    281             IF (zfr_i(ji,jj) < 0. ) zfr_i(ji,jj) = 0. 
     299            zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 
    282300         END_2D 
    283          DO_3D_00_00( 2, jpkm1 ) 
    284             IF ( zfr_i(ji,jj) /= 0. ) THEN                
    285                ! vertical velocity due to LC    
     301         DO_3D( 0, 0, 0, 0, 2, jpkm1 )                  !* TKE Langmuir circulation source term added to en 
     302            IF ( zus3(ji,jj) /= 0._wp ) THEN                
    286303               IF ( gdepw(ji,jj,jk,Kmm) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN 
    287304                  !                                           ! vertical velocity due to LC 
    288                   zwlc = rn_lc * SIN( rpi * gdepw(ji,jj,jk,Kmm) / zhlc(ji,jj) )   ! warning: optimization: zus^3 is in zfr_i 
     305                  zwlc = rn_lc * SIN( rpi * gdepw(ji,jj,jk,Kmm) / zhlc(ji,jj) ) 
    289306                  !                                           ! TKE Langmuir circulation source term 
    290                   en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * zfr_i(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 
     307                  en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * zus3(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 
    291308               ENDIF 
    292309            ENDIF 
     
    302319      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    303320      ! 
    304       IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    305          DO_3D_00_00( 2, jpkm1 ) 
     321      IF( nn_pdl == 1 ) THEN          !* Prandtl number = F( Ri ) 
     322         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    306323            !                             ! local Richardson number 
    307             zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
     324            IF (rn2b(ji,jj,jk) <= 0.0_wp) then 
     325                zri = 0.0_wp 
     326            ELSE 
     327                zri = rn2b(ji,jj,jk) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
     328            ENDIF 
    308329            !                             ! inverse of Prandtl number 
    309330            apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
     
    311332      ENDIF 
    312333      !          
    313       DO_3D_00_00( 2, jpkm1 ) 
     334      DO_3D( 0, 0, 0, 0, 2, jpkm1 )   !* Matrix and right hand side in en 
    314335         zcof   = zfact1 * tmask(ji,jj,jk) 
    315336         !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
     
    331352      END_3D 
    332353      !                          !* Matrix inversion from level 2 (tke prescribed at level 1) 
    333       DO_3D_00_00( 3, jpkm1 ) 
     354      DO_3D( 0, 0, 0, 0, 3, jpkm1 )                ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 
    334355         zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    335356      END_3D 
    336       DO_2D_00_00 
     357      DO_2D( 0, 0, 0, 0 )                          ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 
    337358         zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke 
    338359      END_2D 
    339       DO_3D_00_00( 3, jpkm1 ) 
     360      DO_3D( 0, 0, 0, 0, 3, jpkm1 ) 
    340361         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) 
    341362      END_3D 
    342       DO_2D_00_00 
     363      DO_2D( 0, 0, 0, 0 )                          ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 
    343364         en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 
    344365      END_2D 
    345       DO_3DS_00_00( jpk-2, 2, -1 ) 
     366      DO_3DS( 0, 0, 0, 0, jpk-2, 2, -1 ) 
    346367         en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    347368      END_3D 
    348       DO_3D_00_00( 2, jpkm1 ) 
     369      DO_3D( 0, 0, 0, 0, 2, jpkm1 )                ! set the minimum value of tke 
    349370         en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 
    350371      END_3D 
     
    355376!!gm BUG : in the exp  remove the depth of ssh !!! 
    356377!!gm       i.e. use gde3w in argument (gdepw(:,:,:,Kmm)) 
    357        
    358        
     378      ! 
     379      ! penetration is partly switched off below sea-ice if nn_eice/=0 
     380      ! 
    359381      IF( nn_etau == 1 ) THEN           !* penetration below the mixed layer (rn_efr fraction) 
    360          DO_3D_00_00( 2, jpkm1 ) 
     382         DO_3D( 0, 0, 0, 0, 2, jpkm1 )  
    361383            en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) )   & 
    362                &                                 * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     384               &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    363385         END_3D 
    364386      ELSEIF( nn_etau == 2 ) THEN       !* act only at the base of the mixed layer (jk=nmln)  (rn_efr fraction) 
    365          DO_2D_00_00 
     387         DO_2D( 0, 0, 0, 0 ) 
    366388            jk = nmln(ji,jj) 
    367389            en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) )   & 
    368                &                                 * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     390               &                                 * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    369391         END_2D 
    370392      ELSEIF( nn_etau == 3 ) THEN       !* penetration belox the mixed layer (HF variability) 
    371          DO_3D_00_00( 2, jpkm1 ) 
     393         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    372394            ztx2 = utau(ji-1,jj  ) + utau(ji,jj) 
    373395            zty2 = vtau(ji  ,jj-1) + vtau(ji,jj) 
     
    376398            zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
    377399            en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) )   & 
    378                &                        * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
     400               &                        * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    379401         END_3D 
    380402      ENDIF 
     
    425447      REAL(wp) ::   zrn2, zraug, zcoef, zav   ! local scalars 
    426448      REAL(wp) ::   zdku,   zdkv, zsqen       !   -      - 
    427       REAL(wp) ::   zemxl, zemlm, zemlp       !   -      - 
     449      REAL(wp) ::   zemxl, zemlm, zemlp, zmaxice       !   -      - 
    428450      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmxlm, zmxld   ! 3D workspace 
    429451      !!-------------------------------------------------------------------- 
     
    438460      zmxlm(:,:,:)  = rmxl_min     
    439461      zmxld(:,:,:)  = rmxl_min 
    440       ! 
    441       IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 
     462      !  
     463     IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 
     464         ! 
    442465         zraug = vkarmn * 2.e5_wp / ( rho0 * grav ) 
    443          DO_2D_00_00 
    444             zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 
     466#if ! defined key_si3 && ! defined key_cice 
     467         DO_2D( 0, 0, 0, 0 )                  ! No sea-ice 
     468            zmxlm(ji,jj,1) =  zraug * taum(ji,jj) * tmask(ji,jj,1) 
    445469         END_2D 
    446       ELSE  
     470#else 
     471         SELECT CASE( nn_mxlice )             ! Type of scaling under sea-ice 
     472         ! 
     473         CASE( 0 )                      ! No scaling under sea-ice 
     474            DO_2D( 0, 0, 0, 0 ) 
     475               zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 
     476            END_2D 
     477            ! 
     478         CASE( 1 )                      ! scaling with constant sea-ice thickness 
     479            DO_2D( 0, 0, 0, 0 ) 
     480               zmxlm(ji,jj,1) =  ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     481                  &                          fr_i(ji,jj)   * rn_mxlice           ) * tmask(ji,jj,1) 
     482            END_2D 
     483            ! 
     484         CASE( 2 )                      ! scaling with mean sea-ice thickness 
     485            DO_2D( 0, 0, 0, 0 ) 
     486#if defined key_si3 
     487               zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     488                  &                         fr_i(ji,jj)   * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 
     489#elif defined key_cice 
     490               zmaxice = MAXVAL( h_i(ji,jj,:) ) 
     491               zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     492                  &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1) 
     493#endif 
     494            END_2D 
     495            ! 
     496         CASE( 3 )                      ! scaling with max sea-ice thickness 
     497            DO_2D( 0, 0, 0, 0 ) 
     498               zmaxice = MAXVAL( h_i(ji,jj,:) ) 
     499               zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 
     500                  &                         fr_i(ji,jj)   * zmaxice             ) * tmask(ji,jj,1) 
     501            END_2D 
     502            ! 
     503         END SELECT 
     504#endif 
     505         ! 
     506         DO_2D( 0, 0, 0, 0 ) 
     507            zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 
     508         END_2D 
     509         ! 
     510      ELSE 
    447511         zmxlm(:,:,1) = rn_mxl0 
    448512      ENDIF 
    449       ! 
    450       DO_3D_00_00( 2, jpkm1 ) 
     513 
     514      ! 
     515      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    451516         zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 
    452517         zmxlm(ji,jj,jk) = MAX(  rmxl_min,  SQRT( 2._wp * en(ji,jj,jk) / zrn2 )  ) 
     
    463528      ! where wmask = 0 set zmxlm == e3w(:,:,:,Kmm) 
    464529      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    465          DO_3D_00_00( 2, jpkm1 ) 
     530         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    466531            zemxl = MIN( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm), zmxlm(ji,jj,jk),   & 
    467532            &            gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) - gdepw(ji,jj,jk,Kmm) ) 
    468533            ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
    469             zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 
    470             zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 
     534            zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk)   & 
     535               &            + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 
     536            zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk)   & 
     537               &            + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 
    471538         END_3D 
    472539         ! 
    473540      CASE ( 1 )           ! bounded by the vertical scale factor 
    474          DO_3D_00_00( 2, jpkm1 ) 
     541         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    475542            zemxl = MIN( e3w(ji,jj,jk,Kmm), zmxlm(ji,jj,jk) ) 
    476543            zmxlm(ji,jj,jk) = zemxl 
     
    479546         ! 
    480547      CASE ( 2 )           ! |dk[xml]| bounded by e3t : 
    481          DO_3D_00_00( 2, jpkm1 ) 
    482             zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 
    483          END_3D 
    484          DO_3DS_00_00( jpkm1, 2, -1 ) 
     548         DO_3D( 0, 0, 0, 0, 2, jpkm1 )        ! from the surface to the bottom : 
     549            zmxlm(ji,jj,jk) =   & 
     550               &    MIN( zmxlm(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 
     551         END_3D 
     552         DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )   ! from the bottom to the surface : 
    485553            zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) ) 
    486554            zmxlm(ji,jj,jk) = zemxl 
     
    489557         ! 
    490558      CASE ( 3 )           ! lup and ldown, |dk[xml]| bounded by e3t : 
    491          DO_3D_00_00( 2, jpkm1 ) 
    492             zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 
    493          END_3D 
    494          DO_3DS_00_00( jpkm1, 2, -1 ) 
    495             zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) ) 
    496          END_3D 
    497          DO_3D_00_00( 2, jpkm1 ) 
     559         DO_3D( 0, 0, 0, 0, 2, jpkm1 )        ! from the surface to the bottom : lup 
     560            zmxld(ji,jj,jk) =    & 
     561               &    MIN( zmxld(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 
     562         END_3D 
     563         DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 )   ! from the bottom to the surface : ldown 
     564            zmxlm(ji,jj,jk) =   & 
     565               &    MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) ) 
     566         END_3D 
     567         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    498568            zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) ) 
    499569            zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) ) 
     
    507577      !                     !  Vertical eddy viscosity and diffusivity  (avm and avt) 
    508578      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    509       DO_3D_00_00( 1, jpkm1 ) 
     579      DO_3D( 0, 0, 0, 0, 1, jpkm1 )   !* vertical eddy viscosity & diffivity at w-points 
    510580         zsqen = SQRT( en(ji,jj,jk) ) 
    511581         zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
     
    516586      ! 
    517587      ! 
    518       IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt 
    519          DO_3D_00_00( 2, jpkm1 ) 
    520             p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
     588      IF( nn_pdl == 1 ) THEN          !* Prandtl number case: update avt 
     589         DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     590            p_avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    521591         END_3D 
    522592      ENDIF 
     
    550620      INTEGER             ::   ios 
    551621      !! 
    552       NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin  ,          & 
    553          &                 rn_emin0, rn_bshear, nn_mxl , ln_mxl0  ,          & 
    554          &                 rn_mxl0 , nn_pdl   , ln_drg , ln_lc    , rn_lc,   & 
    555          &                 nn_etau , nn_htau  , rn_efr , rn_eice   
     622      NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb   , rn_emin  ,  & 
     623         &                 rn_emin0, rn_bshear, nn_mxl   , ln_mxl0  ,  & 
     624         &                 rn_mxl0 , nn_mxlice, rn_mxlice,             & 
     625         &                 nn_pdl  , ln_lc    , rn_lc    ,             & 
     626         &                 nn_etau , nn_htau  , rn_efr   , nn_eice   
    556627      !!---------------------------------------------------------------------- 
    557628      ! 
     
    580651         WRITE(numout,*) '         surface mixing length = F(stress) or not    ln_mxl0   = ', ln_mxl0 
    581652         WRITE(numout,*) '         surface  mixing length minimum value        rn_mxl0   = ', rn_mxl0 
    582          WRITE(numout,*) '      top/bottom friction forcing flag            ln_drg    = ', ln_drg 
     653         IF( ln_mxl0 ) THEN 
     654            WRITE(numout,*) '      type of scaling under sea-ice               nn_mxlice = ', nn_mxlice 
     655            IF( nn_mxlice == 1 ) & 
     656            WRITE(numout,*) '      ice thickness when scaling under sea-ice    rn_mxlice = ', rn_mxlice 
     657            SELECT CASE( nn_mxlice )             ! Type of scaling under sea-ice 
     658            CASE( 0 )   ;   WRITE(numout,*) '   ==>>>   No scaling under sea-ice' 
     659            CASE( 1 )   ;   WRITE(numout,*) '   ==>>>   scaling with constant sea-ice thickness' 
     660            CASE( 2 )   ;   WRITE(numout,*) '   ==>>>   scaling with mean sea-ice thickness' 
     661            CASE( 3 )   ;   WRITE(numout,*) '   ==>>>   scaling with max sea-ice thickness' 
     662            CASE DEFAULT 
     663               CALL ctl_stop( 'zdf_tke_init: wrong value for nn_mxlice, should be 0,1,2,3 or 4') 
     664            END SELECT 
     665         ENDIF 
    583666         WRITE(numout,*) '      Langmuir cells parametrization              ln_lc     = ', ln_lc 
    584667         WRITE(numout,*) '         coef to compute vertical velocity of LC     rn_lc  = ', rn_lc 
     
    586669         WRITE(numout,*) '          type of tke penetration profile            nn_htau   = ', nn_htau 
    587670         WRITE(numout,*) '          fraction of TKE that penetrates            rn_efr    = ', rn_efr 
    588          WRITE(numout,*) '          below sea-ice:  =0 ON                      rn_eice   = ', rn_eice 
    589          WRITE(numout,*) '          =4 OFF when ice fraction > 1/4   ' 
    590          IF( ln_drg ) THEN 
     671         WRITE(numout,*) '      langmuir & surface wave breaking under ice  nn_eice = ', nn_eice 
     672         SELECT CASE( nn_eice )  
     673         CASE( 0 )   ;   WRITE(numout,*) '   ==>>>   no impact of ice cover on langmuir & surface wave breaking' 
     674         CASE( 1 )   ;   WRITE(numout,*) '   ==>>>   weigthed by 1-TANH( fr_i(:,:) * 10 )' 
     675         CASE( 2 )   ;   WRITE(numout,*) '   ==>>>   weighted by 1-fr_i(:,:)' 
     676         CASE( 3 )   ;   WRITE(numout,*) '   ==>>>   weighted by 1-MIN( 1, 4 * fr_i(:,:) )' 
     677         CASE DEFAULT 
     678            CALL ctl_stop( 'zdf_tke_init: wrong value for nn_eice, should be 0,1,2, or 3') 
     679         END SELECT       
     680         IF( .NOT.ln_drg_OFF ) THEN 
    591681            WRITE(numout,*) 
    592682            WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     
    674764            ! 
    675765            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN      ! fields exist 
    676                CALL iom_get( numror, jpdom_autoglo, 'en'   , en   , ldxios = lrxios ) 
    677                CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k, ldxios = lrxios ) 
    678                CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k, ldxios = lrxios ) 
    679                CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl, ldxios = lrxios ) 
     766               CALL iom_get( numror, jpdom_auto, 'en'   , en   , ldxios = lrxios ) 
     767               CALL iom_get( numror, jpdom_auto, 'avt_k', avt_k, ldxios = lrxios ) 
     768               CALL iom_get( numror, jpdom_auto, 'avm_k', avm_k, ldxios = lrxios ) 
     769               CALL iom_get( numror, jpdom_auto, 'dissl', dissl, ldxios = lrxios ) 
    680770            ELSE                                          ! start TKE from rest 
    681771               IF(lwp) WRITE(numout,*) 
Note: See TracChangeset for help on using the changeset viewer.