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

Ignore:
Timestamp:
2017-05-30T10:13:14+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09) - step-6: prepare some forthcoming evolutions (ZDF modules mainly)

File:
1 edited

Legend:

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

    r7991 r8093  
    4343   USE sbc_oce        ! surface boundary condition: ocean 
    4444   USE zdf_oce        ! vertical physics: ocean variables 
    45    USE zdfsh2         ! vertical physics: shear production term of TKE 
     45!!gm new 
     46   USE zdfdrg         ! vertical physics: top/bottom drag coef. 
     47!!gm 
    4648   USE zdfmxl         ! vertical physics: mixed layer 
    47    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    48    USE prtctl         ! Print control 
    49    USE in_out_manager ! I/O manager 
    50    USE iom            ! I/O manager library 
    51    USE lib_mpp        ! MPP library 
    52    USE wrk_nemo       ! work arrays 
    53    USE timing         ! Timing 
    54    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    5549#if defined key_agrif 
    5650   USE agrif_opa_interp 
    5751   USE agrif_opa_update 
    5852#endif 
     53   ! 
     54   USE in_out_manager ! I/O manager 
     55   USE iom            ! I/O manager library 
     56   USE lib_mpp        ! MPP library 
     57   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     58   USE prtctl         ! Print control 
     59   USE wrk_nemo       ! work arrays 
     60   USE timing         ! Timing 
     61   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
    5962 
    6063   IMPLICIT NONE 
     
    8790   REAL(wp) ::   rhftau_scl = 1.0_wp       ! scale factor applied to HF part of taum  (nn_etau=3) 
    8891 
    89    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau           ! depth of tke penetration (nn_htau) 
    90    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl          ! now mixing lenght of dissipation 
    91    REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr          ! now mixing lenght of dissipation 
     92   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   htau    ! depth of tke penetration (nn_htau) 
     93   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl   ! now mixing lenght of dissipation 
     94   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr   ! now mixing lenght of dissipation 
    9295 
    9396   !! * Substitutions 
     
    112115 
    113116 
    114    SUBROUTINE zdf_tke( kt ) 
     117   SUBROUTINE zdf_tke( kt, p_sh2, p_avm, p_avt ) 
    115118      !!---------------------------------------------------------------------- 
    116119      !!                   ***  ROUTINE zdf_tke  *** 
     
    157160      !!              Bruchard OM 2002 
    158161      !!---------------------------------------------------------------------- 
    159       INTEGER, INTENT(in) ::   kt   ! ocean time step 
     162      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time step 
     163      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_sh2          ! shear production term 
     164      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm, p_avt   !  momentum and tracer Kz (w-points) 
    160165      !!---------------------------------------------------------------------- 
    161166      ! 
     
    165170#endif 
    166171      ! 
    167       avt(:,:,:) = avt_k(:,:,:)     ! restore before Kz computed with TKE alone 
    168       avm(:,:,:) = avm_k(:,:,:)  
    169       ! 
    170       CALL tke_tke                  ! now tke (en) 
    171       ! 
    172       CALL tke_avn                  ! now avt, avm, dissl 
    173       ! 
    174       avt_k(:,:,:) = avt(:,:,:)     ! store Kz computed with TKE alone 
    175       avm_k(:,:,:) = avm(:,:,:)  
     172      CALL tke_tke( gdepw_n, e3t_n, e3w_n, p_sh2, p_avm, p_avt )   ! now tke (en) 
     173      ! 
     174      CALL tke_avn( gdepw_n, e3t_n, e3w_n,        p_avm, p_avt )   ! now avt, avm, dissl 
    176175      ! 
    177176#if defined key_agrif 
     
    179178      IF( .NOT.Agrif_Root() )   CALL Agrif_Update_Tke( kt )      ! children only 
    180179#endif       
    181       !  
    182       IF( lrst_oce )   CALL tke_rst( kt, 'WRITE' ) 
    183180      ! 
    184181  END SUBROUTINE zdf_tke 
    185182 
    186183 
    187    SUBROUTINE tke_tke 
     184   SUBROUTINE tke_tke( pdepw, p_e3t, p_e3w, p_sh2    & 
     185      &                            , p_avm, p_avt ) 
    188186      !!---------------------------------------------------------------------- 
    189187      !!                   ***  ROUTINE tke_tke  *** 
     
    200198      !! ** Action  : - en : now turbulent kinetic energy) 
    201199      !! --------------------------------------------------------------------- 
    202       INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    203 !!bfr      INTEGER  ::   ikbu, ikbv, ikbum1, ikbvm1      ! local integers 
    204 !!bfr      INTEGER  ::   ikbt, ikbumm1, ikbvmm1          !   -      - 
    205 !!bfr      REAL(wp) ::   zebot                           ! local scalars 
     200      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   pdepw          ! depth of w-points 
     201      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_e3t, p_e3w   ! level thickness (t- & w-points) 
     202      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_sh2          ! shear production term 
     203      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
     204      ! 
     205      INTEGER ::   ji, jj, jk              ! dummy loop arguments 
     206!!bfr      REAL(wp) ::   zebot, zmshu, zmskv      ! local scalars 
    206207      REAL(wp) ::   zrhoa  = 1.22            ! Air density kg/m3 
    207208      REAL(wp) ::   zcdrag = 1.5e-3          ! drag coefficient 
     
    212213      REAL(wp) ::   zus   , zwlc  , zind     !   -         - 
    213214      REAL(wp) ::   zzd_up, zzd_lw           !   -         - 
    214       INTEGER , DIMENSION(jpi,jpj) ::   imlc 
    215       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhlc 
    216       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw 
    217       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zsh2 
     215      INTEGER , DIMENSION(jpi,jpj)     ::   imlc 
     216      REAL(wp), DIMENSION(jpi,jpj)     ::   zhlc 
     217      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpelc, zdiag, zd_up, zd_lw 
    218218      !!-------------------------------------------------------------------- 
    219219      ! 
    220220      IF( nn_timing == 1 )  CALL timing_start('tke_tke') 
    221       ! 
    222       CALL wrk_alloc( jpi,jpj,       zhlc )  
    223       CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw )  
    224221      ! 
    225222      zbbrau = rn_ebb / rau0       ! Local constant initialisation 
     
    256253      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    257254      !                     en(bot)   = (rn_ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 
     255!!gm old 
    258256!!    DO jj = 2, jpjm1 
    259257!!       DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    263261!!                 bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1) ) 
    264262!!          zebot = 0.001875_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 )   !  where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. 
    265 !!          en (ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * tmask(ji,jj,1) 
     263!!          en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
    266264!!       END DO 
    267265!!    END DO 
     266!!gm new 
     267!! 
     268!!    ====>>>>  add below an wet-only calculation of u and v at t-point like in zdfsh2: 
     269!!                   zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     270!!                   zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     271!! 
     272!! 
     273!!    DO jj = 2, jpjm1 
     274!!       DO ji = fs_2, fs_jpim1   ! vector opt. 
     275!!          zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     276!!          zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     277!!          !                             ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000. (CAUTION CdU<0) 
     278!!          zebot = - 0.001875_wp * rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2 
     279!!             &                                           + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     280!!          en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 
     281!!       END DO 
     282!!    END DO 
     283!!    IF( ln_isfcav ) THEN       !top friction 
     284!!       DO jj = 2, jpjm1 
     285!!          DO ji = fs_2, fs_jpim1   ! vector opt. 
     286!!             zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     287!!             zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) 
     288!!             !                             ! where 0.001875 = (rn_ebb0/rau0) * 0.5 = 3.75*0.5/1000.  (CAUTION CdU<0) 
     289!!             zebot = - 0.001875_wp * rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2 
     290!!                &                                           + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     291!!             en(ji,jj,mikt(ji,jj)+1) = MAX( zebot, rn_emin ) * (1._wp - tmask(ji,jj,1))   ! masked at ocean surface 
     292!!          END DO 
     293!!       END DO 
     294!!    ENDIF 
     295!! 
    268296!!bfr   - end commented area 
    269297      ! 
    270298      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    271       IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke       (Axell JGR 2002) 
     299      IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke   !   (Axell JGR 2002) 
    272300         !                  !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    273301         ! 
    274302         !                        !* total energy produce by LC : cumulative sum over jk 
    275          zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * gdepw_n(:,:,1) * e3w_n(:,:,1) 
     303         zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0._wp ) * pdepw(:,:,1) * p_e3w(:,:,1) 
    276304         DO jk = 2, jpk 
    277             zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw_n(:,:,jk) * e3w_n(:,:,jk) 
     305            zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * pdepw(:,:,jk) * p_e3w(:,:,jk) 
    278306         END DO 
    279307         !                        !* finite Langmuir Circulation depth 
     
    291319         DO jj = 1, jpj  
    292320            DO ji = 1, jpi 
    293                zhlc(ji,jj) = gdepw_n(ji,jj,imlc(ji,jj)) 
     321               zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 
    294322            END DO 
    295323         END DO 
     
    300328                  zus  = zcof * SQRT( taum(ji,jj) )           ! Stokes drift 
    301329                  !                                           ! vertical velocity due to LC 
    302                   zind = 0.5 - SIGN( 0.5, gdepw_n(ji,jj,jk) - zhlc(ji,jj) ) 
    303                   zwlc = zind * rn_lc * zus * SIN( rpi * gdepw_n(ji,jj,jk) / zhlc(ji,jj) ) 
     330                  zind = 0.5 - SIGN( 0.5, pdepw(ji,jj,jk) - zhlc(ji,jj) ) 
     331                  zwlc = zind * rn_lc * zus * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 
    304332                  !                                           ! TKE Langmuir circulation source term 
    305333                  en(ji,jj,jk) = en(ji,jj,jk) + rdt * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc )   & 
     
    318346      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    319347      ! 
    320       !                           !* Shear production at uw- and vw-points (energy conserving form) 
    321       CALL zdf_sh2( zsh2 ) 
    322       ! 
    323348      IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    324349         DO jk = 2, jpkm1 
     
    326351               DO ji = 2, jpim1 
    327352                  !                             ! local Richardson number 
    328                   zri = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zsh2(ji,jj,jk) + rn_bshear ) 
     353                  zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 
    329354                  !                             ! inverse of Prandtl number 
    330355                  apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
     
    340365               !                                   ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 
    341366               !                                   ! eddy coefficient (ensure numerical stability) 
    342                zzd_up = zcof * MAX(   avm(ji,jj,jk+1) +   avm(ji,jj,jk  ) , 2.e-5_wp  )   &  ! upper diagonal 
    343                   &          /    ( e3t_n(ji,jj,jk  ) * e3w_n(ji,jj,jk  )  ) 
    344                zzd_lw = zcof * MAX(   avm(ji,jj,jk  ) +   avm(ji,jj,jk-1) , 2.e-5_wp  )   &  ! lower diagonal 
    345                   &          /    ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  )  ) 
     367               zzd_up = zcof * MAX(  p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk  ) , 2.e-5_wp  )   &  ! upper diagonal 
     368                  &          /    (  p_e3t(ji,jj,jk  ) * p_e3w(ji,jj,jk  )  ) 
     369               zzd_lw = zcof * MAX(  p_avm(ji,jj,jk  ) + p_avm(ji,jj,jk-1) , 2.e-5_wp  )   &  ! lower diagonal 
     370                  &          /    (  p_e3t(ji,jj,jk-1) * p_e3w(ji,jj,jk  )  ) 
    346371               ! 
    347372               zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
     
    350375               ! 
    351376               !                                   ! right hand side in en 
    352                en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  zsh2(ji,jj,jk)                           &   ! shear 
    353                   &                                 - avt(ji,jj,jk) * rn2(ji,jj,jk)            &   ! stratification 
     377               en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  p_sh2(ji,jj,jk)                          &   ! shear 
     378                  &                                 - p_avt(ji,jj,jk) * rn2(ji,jj,jk)          &   ! stratification 
    354379                  &                                 + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk)  &   ! dissipation 
    355380                  &                                ) * wmask(ji,jj,jk) 
     
    407432            DO jj = 2, jpjm1 
    408433               DO ji = fs_2, fs_jpim1   ! vector opt. 
    409                   en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     434                  en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    410435                     &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    411436               END DO 
     
    416441            DO ji = fs_2, fs_jpim1   ! vector opt. 
    417442               jk = nmln(ji,jj) 
    418                en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     443               en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    419444                  &                                 * MAX(0.,1._wp - 2.*fr_i(ji,jj) )  * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    420445            END DO 
     
    429454                  zdif = taum(ji,jj) - ztau                            ! mean of modulus - modulus of the mean  
    430455                  zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add )  ! apply some modifications... 
    431                   en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw_n(ji,jj,jk) / htau(ji,jj) )   & 
     456                  en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) )   & 
    432457                     &                        * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 
    433458               END DO 
     
    435460         END DO 
    436461      ENDIF 
    437 !!gm not sure we need this lbc .... 
    438       CALL lbc_lnk( en, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    439       ! 
    440       CALL wrk_dealloc( jpi,jpj,       zhlc )  
    441       CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw )  
    442462      ! 
    443463      IF( nn_timing == 1 )  CALL timing_stop('tke_tke') 
     
    446466 
    447467 
    448    SUBROUTINE tke_avn 
     468   SUBROUTINE tke_avn( pdepw, p_e3t, p_e3w, p_avm, p_avt ) 
    449469      !!---------------------------------------------------------------------- 
    450470      !!                   ***  ROUTINE tke_avn  *** 
     
    480500      !! ** Action  : - avt, avm : now vertical eddy diffusivity and viscosity (w-point) 
    481501      !!---------------------------------------------------------------------- 
     502      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pdepw          ! depth (w-points) 
     503      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   p_e3t, p_e3w   ! level thickness (t- & w-points) 
     504      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_avm, p_avt   ! vertical eddy viscosity & diffusivity (w-points) 
     505      ! 
    482506      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    483507      REAL(wp) ::   zrn2, zraug, zcoef, zav   ! local scalars 
    484508      REAL(wp) ::   zdku,   zdkv, zsqen       !   -      - 
    485509      REAL(wp) ::   zemxl, zemlm, zemlp       !   -      - 
    486       REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl, zmxlm, zmxld 
     510      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zmxlm, zmxld 
    487511      !!-------------------------------------------------------------------- 
    488512      ! 
    489513      IF( nn_timing == 1 )  CALL timing_start('tke_avn') 
    490  
    491       CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )  
    492514 
    493515      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    502524      ! 
    503525      IF( ln_mxl0 ) THEN            ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 
     526         zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    504527         DO jj = 2, jpjm1 
    505528            DO ji = fs_2, fs_jpim1 
    506                zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 
    507529               zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 
    508530            END DO 
     
    529551      ! 
    530552 !!gm Not sure of that coding for ISF.... 
    531       ! where wmask = 0 set zmxlm == e3w_n 
     553      ! where wmask = 0 set zmxlm == p_e3w 
    532554      CASE ( 0 )           ! bounded by the distance to surface and bottom 
    533555         DO jk = 2, jpkm1 
    534556            DO jj = 2, jpjm1 
    535557               DO ji = fs_2, fs_jpim1   ! vector opt. 
    536                   zemxl = MIN( gdepw_n(ji,jj,jk) - gdepw_n(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
    537                   &            gdepw_n(ji,jj,mbkt(ji,jj)+1) - gdepw_n(ji,jj,jk) ) 
     558                  zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk),   & 
     559                  &            pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 
    538560                  ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 
    539                   zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
    540                   zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 
     561                  zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
     562                  zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 
    541563               END DO 
    542564            END DO 
     
    547569            DO jj = 2, jpjm1 
    548570               DO ji = fs_2, fs_jpim1   ! vector opt. 
    549                   zemxl = MIN( e3w_n(ji,jj,jk), zmxlm(ji,jj,jk) ) 
     571                  zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 
    550572                  zmxlm(ji,jj,jk) = zemxl 
    551573                  zmxld(ji,jj,jk) = zemxl 
     
    558580            DO jj = 2, jpjm1 
    559581               DO ji = fs_2, fs_jpim1   ! vector opt. 
    560                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     582                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    561583               END DO 
    562584            END DO 
     
    565587            DO jj = 2, jpjm1 
    566588               DO ji = fs_2, fs_jpim1   ! vector opt. 
    567                   zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     589                  zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    568590                  zmxlm(ji,jj,jk) = zemxl 
    569591                  zmxld(ji,jj,jk) = zemxl 
     
    576598            DO jj = 2, jpjm1 
    577599               DO ji = fs_2, fs_jpim1   ! vector opt. 
    578                   zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
     600                  zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 
    579601               END DO 
    580602            END DO 
     
    583605            DO jj = 2, jpjm1 
    584606               DO ji = fs_2, fs_jpim1   ! vector opt. 
    585                   zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
     607                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 
    586608               END DO 
    587609            END DO 
     
    609631               zsqen = SQRT( en(ji,jj,jk) ) 
    610632               zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen 
    611                avm  (ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
    612                avt  (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
     633               p_avm(ji,jj,jk) = MAX( zav,                  avmb(jk) ) * wmask(ji,jj,jk) 
     634               p_avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 
    613635               dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 
    614636            END DO 
     
    621643            DO jj = 2, jpjm1 
    622644               DO ji = fs_2, fs_jpim1   ! vector opt. 
    623                   avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
     645                  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) 
    624646              END DO 
    625647            END DO 
    626648         END DO 
    627649      ENDIF 
    628 !!gm I'm sure this is needed to compute the shear term at next time-step 
    629       CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged) 
    630       CALL lbc_lnk( avt, 'W', 1. )      ! Lateral boundary conditions on avt  (sign unchanged) 
    631650 
    632651      IF(ln_ctl) THEN 
     
    634653         CALL prt_ctl( tab3d_1=avm, clinfo1=' tke  - m: ', ovlap=1, kdim=jpk ) 
    635654      ENDIF 
    636       ! 
    637       CALL wrk_dealloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )  
    638655      ! 
    639656      IF( nn_timing == 1 )  CALL timing_stop('tke_avn') 
     
    737754      !                               !* set vertical eddy coef. to the background value 
    738755      DO jk = 1, jpk 
    739          avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    740          avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 
     756         avt(:,:,jk) = avtb(jk) * wmask(:,:,jk) 
     757         avm(:,:,jk) = avmb(jk) * wmask(:,:,jk) 
    741758      END DO 
    742759      dissl(:,:,:) = 1.e-12_wp 
     
    748765 
    749766   SUBROUTINE tke_rst( kt, cdrw ) 
    750      !!--------------------------------------------------------------------- 
    751      !!                   ***  ROUTINE tke_rst  *** 
    752      !!                      
    753      !! ** Purpose :   Read or write TKE file (en) in restart file 
    754      !! 
    755      !! ** Method  :   use of IOM library 
    756      !!                if the restart does not contain TKE, en is either  
    757      !!                set to rn_emin or recomputed  
    758      !!---------------------------------------------------------------------- 
    759      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
    760      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    761      ! 
    762      INTEGER ::   jit, jk              ! dummy loop indices 
    763      INTEGER ::   id1, id2, id3, id4   ! local integers 
    764      !!---------------------------------------------------------------------- 
    765      ! 
    766      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
    767         !                                   ! --------------- 
    768         IF( ln_rstart ) THEN                   !* Read the restart file 
    769            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
    770            id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
    771            id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
    772            id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
    773            ! 
    774            IF( id1 > 0 ) THEN                       ! 'en' exists 
    775               CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
    776               IF( MIN( id2, id3, id4 ) > 0 ) THEN        ! all required arrays exist 
    777                  CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
    778                  CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
    779                  CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
    780               ELSE                                                 ! one at least array is missing 
    781                  CALL tke_avn                                          ! compute avt, avm, and dissl (approximation) 
    782               ENDIF 
    783            ELSE                                     ! No TKE array found: initialisation 
    784               IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop' 
    785               en (:,:,:) = rn_emin * wmask(:,:,:) 
    786               CALL tke_avn                               ! recompute avt, avm, and dissl (approximation) 
    787               avt_k(:,:,:) = avt(:,:,:) 
    788               avm_k(:,:,:) = avm(:,:,:) 
    789               ! 
    790               DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO 
    791               avt_k(:,:,:) = avt(:,:,:) 
    792               avm_k(:,:,:) = avm(:,:,:) 
    793            ENDIF 
    794         ELSE                                   !* Start from rest 
    795            en(:,:,:) = rn_emin * tmask(:,:,:) 
    796            DO jk = 1, jpk                           ! set the Kz to the background value 
    797               avt_k(:,:,jk) = avtb(jk) * wmask (:,:,jk) 
    798               avm_k(:,:,jk) = avmb(jk) * wmask (:,:,jk) 
    799            END DO 
    800         ENDIF 
    801         ! 
    802      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
    803         !                                   ! ------------------- 
    804         IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
    805         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    ) 
    806         CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
    807         CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
    808         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 
    809         ! 
    810      ENDIF 
    811      ! 
     767      !!--------------------------------------------------------------------- 
     768      !!                   ***  ROUTINE tke_rst  *** 
     769      !!                      
     770      !! ** Purpose :   Read or write TKE file (en) in restart file 
     771      !! 
     772      !! ** Method  :   use of IOM library 
     773      !!                if the restart does not contain TKE, en is either  
     774      !!                set to rn_emin or recomputed  
     775      !!---------------------------------------------------------------------- 
     776      INTEGER         , INTENT(in) ::   kt     ! ocean time-step 
     777      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
     778      ! 
     779      INTEGER ::   jit, jk              ! dummy loop indices 
     780      INTEGER ::   id1, id2, id3, id4   ! local integers 
     781      !!---------------------------------------------------------------------- 
     782      ! 
     783      IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise  
     784         !                                   ! --------------- 
     785         IF( ln_rstart ) THEN                   !* Read the restart file 
     786            id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. ) 
     787            id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 
     788            id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 
     789            id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 
     790            ! 
     791            IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN      ! fields exist 
     792               CALL iom_get( numror, jpdom_autoglo, 'en', en ) 
     793               CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 
     794               CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 
     795               CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 
     796            ELSE                                          ! start TKE from rest 
     797               IF(lwp) WRITE(numout,*) '   ==>>   previous run without TKE scheme, set en to background values' 
     798               en(:,:,:) = rn_emin * wmask(:,:,:) 
     799               ! avt_k, avm_k already set to the background value in zdf_phy_init 
     800            ENDIF 
     801         ELSE                                   !* Start from rest 
     802            IF(lwp) WRITE(numout,*) '   ==>>   start from rest: set en to the background value' 
     803            en(:,:,:) = rn_emin * wmask(:,:,:) 
     804            ! avt_k, avm_k already set to the background value in zdf_phy_init 
     805         ENDIF 
     806         ! 
     807      ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file 
     808         !                                   ! ------------------- 
     809         IF(lwp) WRITE(numout,*) '---- tke-rst ----' 
     810         CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    ) 
     811         CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 
     812         CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 
     813         CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 
     814         ! 
     815      ENDIF 
     816      ! 
    812817   END SUBROUTINE tke_rst 
    813818 
Note: See TracChangeset for help on using the changeset viewer.