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

Ignore:
Timestamp:
2017-05-01T16:21:42+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09) - step-5: OPA/ZDF shear production term computed outside closure schemes

File:
1 edited

Legend:

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

    r7990 r7991  
    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 
    4546   USE zdfmxl         ! vertical physics: mixed layer 
    4647   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     
    8990   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dissl          ! now mixing lenght of dissipation 
    9091   REAL(wp)        , ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   apdlr          ! now mixing lenght of dissipation 
    91 #if defined key_c1d 
    92    !                                                                        !!** 1D cfg only  **   ('key_c1d') 
    93    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_dis, e_mix   !: dissipation and mixing turbulent lengh scales 
    94    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   e_pdl, e_ric   !: prandl and local Richardson numbers 
    95 #endif 
    9692 
    9793   !! * Substitutions 
     
    108104      !!                ***  FUNCTION zdf_tke_alloc  *** 
    109105      !!---------------------------------------------------------------------- 
    110       ALLOCATE(                                                                    & 
    111 #if defined key_c1d 
    112          &      e_dis(jpi,jpj,jpk) , e_mix(jpi,jpj,jpk) ,                          & 
    113          &      e_pdl(jpi,jpj,jpk) , e_ric(jpi,jpj,jpk) ,                          & 
    114 #endif 
    115          &      htau  (jpi,jpj)    , dissl(jpi,jpj,jpk) ,     &  
    116          &      apdlr(jpi,jpj,jpk) ,                                           STAT= zdf_tke_alloc      ) 
     106      ALLOCATE( htau(jpi,jpj) , dissl(jpi,jpj,jpk) , apdlr(jpi,jpj,jpk) ,   STAT= zdf_tke_alloc ) 
    117107         ! 
    118108      IF( lk_mpp             )   CALL mpp_sum ( zdf_tke_alloc ) 
     
    211201      !! --------------------------------------------------------------------- 
    212202      INTEGER  ::   ji, jj, jk                      ! dummy loop arguments 
    213 !!bfr      INTEGER  ::   ikbu, ikbv, ikbum1, ikbvm1      ! temporary scalar 
    214 !!bfr      INTEGER  ::   ikbt, ikbumm1, ikbvmm1          ! temporary scalar 
    215       REAL(wp) ::   zrhoa  = 1.22                   ! Air density kg/m3 
    216       REAL(wp) ::   zcdrag = 1.5e-3                 ! drag coefficient 
    217       REAL(wp) ::   zbbrau, zesh2                   ! temporary scalars 
    218       REAL(wp) ::   zfact1, zfact2, zfact3          !    -         - 
    219       REAL(wp) ::   ztx2  , zty2  , zcof            !    -         - 
    220       REAL(wp) ::   ztau  , zdif                    !    -         - 
    221       REAL(wp) ::   zus   , zwlc  , zind            !    -         - 
    222       REAL(wp) ::   zzd_up, zzd_lw                  !    -         - 
    223 !!bfr      REAL(wp) ::   zebot                           !    -         - 
     203!!bfr      INTEGER  ::   ikbu, ikbv, ikbum1, ikbvm1      ! local integers 
     204!!bfr      INTEGER  ::   ikbt, ikbumm1, ikbvmm1          !   -      - 
     205!!bfr      REAL(wp) ::   zebot                           ! local scalars 
     206      REAL(wp) ::   zrhoa  = 1.22            ! Air density kg/m3 
     207      REAL(wp) ::   zcdrag = 1.5e-3          ! drag coefficient 
     208      REAL(wp) ::   zbbrau, zri              ! local scalars 
     209      REAL(wp) ::   zfact1, zfact2, zfact3   !   -         - 
     210      REAL(wp) ::   ztx2  , zty2  , zcof     !   -         - 
     211      REAL(wp) ::   ztau  , zdif             !   -         - 
     212      REAL(wp) ::   zus   , zwlc  , zind     !   -         - 
     213      REAL(wp) ::   zzd_up, zzd_lw           !   -         - 
    224214      INTEGER , DIMENSION(jpi,jpj) ::   imlc 
    225215      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zhlc 
    226       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv 
    227       REAL(wp)                            ::   zri  !   local Richardson number 
     216      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zpelc, zdiag, zd_up, zd_lw 
     217      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zsh2 
    228218      !!-------------------------------------------------------------------- 
    229219      ! 
     
    231221      ! 
    232222      CALL wrk_alloc( jpi,jpj,       zhlc )  
    233       CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
     223      CALL wrk_alloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw )  
    234224      ! 
    235225      zbbrau = rn_ebb / rau0       ! Local constant initialisation 
     
    328318      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    329319      ! 
    330       DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form) 
    331          DO jj = 1, jpjm1 
    332             DO ji = 1, fs_jpim1   ! vector opt. 
    333                z3du(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji+1,jj,jk) )   & 
    334                   &                 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )   & 
    335                   &                 * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) * wumask(ji,jj,jk) & 
    336                   &                 / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) 
    337                z3dv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji,jj+1,jk) )   & 
    338                   &                 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )   & 
    339                   &                 * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) * wvmask(ji,jj,jk) & 
    340                   &                 / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) 
    341             END DO 
    342          END DO 
    343       END DO 
    344       ! 
    345       IF( nn_pdl == 1 ) THEN      !* Prandtl number case: compute apdlr 
    346          ! Note that zesh2 is also computed in the next loop. 
    347          ! We decided to compute it twice to keep code readability and avoid an IF case in the DO loops 
     320      !                           !* Shear production at uw- and vw-points (energy conserving form) 
     321      CALL zdf_sh2( zsh2 ) 
     322      ! 
     323      IF( nn_pdl == 1 ) THEN      !* Prandtl number = F( Ri ) 
    348324         DO jk = 2, jpkm1 
    349325            DO jj = 2, jpjm1 
    350                DO ji = fs_2, fs_jpim1   ! vector opt. 
    351                   !                                          ! shear prod. at w-point weightened by mask 
    352                   zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    353                      &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
    354                   !                                          ! local Richardson number 
    355                   zri   = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zesh2 + rn_bshear ) 
     326               DO ji = 2, jpim1 
     327                  !                             ! local Richardson number 
     328                  zri = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zsh2(ji,jj,jk) + rn_bshear ) 
     329                  !                             ! inverse of Prandtl number 
    356330                  apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  ) 
    357                    
    358                END DO 
    359             END DO 
    360          END DO 
    361          ! 
     331               END DO 
     332            END DO 
     333         END DO 
    362334      ENDIF 
    363335      !          
     
    373345                  &          /    ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk  )  ) 
    374346               ! 
    375                !                                   ! shear prod. at w-point weightened by mask 
    376                zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    377                   &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )     
    378                ! 
    379347               zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw) 
    380348               zd_lw(ji,jj,jk) = zzd_lw 
    381                zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * tmask(ji,jj,jk) 
     349               zdiag(ji,jj,jk) = 1._wp - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * wmask(ji,jj,jk) 
    382350               ! 
    383351               !                                   ! right hand side in en 
    384                en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  zesh2  -   avt(ji,jj,jk) * rn2(ji,jj,jk)    & 
    385                   &                                 + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk)  ) & 
    386                   &                                 * wmask(ji,jj,jk) 
     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 
     354                  &                                 + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk)  &   ! dissipation 
     355                  &                                ) * wmask(ji,jj,jk) 
    387356            END DO 
    388357         END DO 
     
    470439      ! 
    471440      CALL wrk_dealloc( jpi,jpj,       zhlc )  
    472       CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw, z3du, z3dv )  
     441      CALL wrk_dealloc( jpi,jpj,jpk,   zpelc, zdiag, zd_up, zd_lw )  
    473442      ! 
    474443      IF( nn_timing == 1 )  CALL timing_stop('tke_tke') 
     
    631600      END SELECT 
    632601      ! 
    633 # if defined key_c1d 
    634       e_dis(:,:,:) = zmxld(:,:,:)      ! c1d configuration : save mixing and dissipation turbulent length scales 
    635       e_mix(:,:,:) = zmxlm(:,:,:) 
    636 # endif 
    637602 
    638603      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     
    657622               DO ji = fs_2, fs_jpim1   ! vector opt. 
    658623                  avt(ji,jj,jk)   = MAX( apdlr(ji,jj,jk) * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 
    659 # if defined key_c1d 
    660                   e_pdl(ji,jj,jk) = apdlr(ji,jj,jk) * wmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number 
    661 # endif 
    662624              END DO 
    663625            END DO 
Note: See TracChangeset for help on using the changeset viewer.