source: NEMO/branches/2018/dev_r9838_ENHANCE04_RK3/src/OCE/ZDF/zdfsh2.F90 @ 10030

Last change on this file since 10030 was 10030, checked in by gm, 3 years ago

#1911 (ENHANCE-04): RK3 branch - step II.3 remove e3uw_$ e3vw_$, except e3.w_0 and use only after e3 in dyn/trazdf

File size: 7.1 KB
Line 
1MODULE zdfsh2
2   !!======================================================================
3   !!                       ***  MODULE  zdfsh2  ***
4   !! Ocean physics:  shear production term of TKE
5   !!=====================================================================
6   !! History :   -   !  2014-10  (A. Barthelemy, G. Madec)  original code
7   !!   NEMO     4.0  !  2017-04  (G. Madec)  remove u-,v-pts avm
8   !!            5.0  !  2018-08  (G. Madec)  local calculation of e3uw e3vw
9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
12   !!   zdf_sh2       : compute mixing the shear production term of TKE
13   !!----------------------------------------------------------------------
14   USE dom_oce        ! domain: ocean
15   !
16   USE in_out_manager ! I/O manager
17   USE lib_mpp        ! MPP library
18
19   IMPLICIT NONE
20   PRIVATE
21
22   PUBLIC   zdf_sh2        ! called by zdftke, zdfglf, and zdfric
23   
24   !!----------------------------------------------------------------------
25   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
26   !! $Id: $
27   !! Software governed by the CeCILL licence     (./LICENSE)
28   !!----------------------------------------------------------------------
29CONTAINS
30
31   SUBROUTINE zdf_sh2( pssh, pub, pvb, pun, pvn, p_avm, p_sh2  ) 
32      !!----------------------------------------------------------------------
33      !!                   ***  ROUTINE zdf_sh2  ***
34      !!
35      !! ** Purpose :   Compute the shear production term of a TKE equation
36      !!
37      !! ** Method  : - a stable discretization of this term is linked to the
38      !!                time-space discretization of the vertical diffusion
39      !!                of the OGCM. NEMO uses C-grid, a leap-frog environment
40      !!                and an implicit computation of vertical mixing term,
41      !!                so the shear production at w-point is given by:
42      !!                   sh2 = mi[   mi(avm) * dk[ub]/e3ub * dk[un]/e3un   ]
43      !!                       + mj[   mj(avm) * dk[vb]/e3vb * dk[vn]/e3vn   ]
44      !!                NB: wet-point only horizontal averaging of shear
45      !!
46      !! ** Action  : - p_sh2 shear prod. term at w-point (inner domain only)
47      !!                                                   *****
48      !! References :   Bruchard, OM 2002
49      !! ---------------------------------------------------------------------
50      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   pssh                 ! sea surface height
51      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   pub, pvb, pun, pvn   ! before, now horizontal velocities
52      REAL(wp), DIMENSION(:,:,:) , INTENT(in   ) ::   p_avm                ! vertical eddy viscosity (w-points)
53      REAL(wp), DIMENSION(:,:,:) , INTENT(  out) ::   p_sh2                ! shear production of TKE (w-points)
54      !
55      INTEGER ::   ji, jj, jk           ! dummy loop arguments
56      REAL(wp)::   ze3uw_BN, ze3vw_BN   ! local real
57      REAL(wp), DIMENSION(jpi,jpj) ::   zsh2u   , zsh2v     ! 2D workspace
58      REAL(wp), DIMENSION(jpi,jpj) ::   zsshu_hB, zsshv_hB  ! 2D workspace
59      REAL(wp), DIMENSION(jpi,jpj) ::   zsshu_hN, zsshv_hN
60      !!--------------------------------------------------------------------
61      !
62      IF( ln_linssh ) THEN       !==  linear ssh case  ==!
63         DO jk = 2, jpkm1
64            DO jj = 1, jpjm1        !* 2 x shear production at uw- and vw-points (energy conserving form)
65               DO ji = 1, jpim1
66                  ze3uw_BN = e3uw_0(ji,jj,jk) * e3uw_0(ji,jj,jk)
67                  ze3vw_BN = e3vw_0(ji,jj,jk) * e3vw_0(ji,jj,jk)
68                  !
69                  zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) )            &
70                     &         * (   pun(ji,jj,jk-1) -   pun(ji,jj,jk) )            &
71                     &         * (   pub(ji,jj,jk-1) -   pub(ji,jj,jk) ) / ze3uw_BN * wumask(ji,jj,jk)
72                  zsh2v(ji,jj) = ( p_avm(ji,jj+1,jk) + p_avm(ji,jj,jk) )            &
73                     &         * (   pvn(ji,jj,jk-1) -   pvn(ji,jj,jk) )            &
74                     &         * (   pvb(ji,jj,jk-1) -   pvb(ji,jj,jk) ) / ze3vw_BN * wvmask(ji,jj,jk)
75               END DO
76            END DO
77            DO jj = 2, jpjm1        !* shear production at w-point
78               DO ji = 2, jpim1           ! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked)
79                  p_sh2(ji,jj,jk) = 0.25 * (   ( zsh2u(ji-1,jj) + zsh2u(ji,jj) ) * ( 2. - umask(ji-1,jj,jk) * umask(ji,jj,jk) )   &
80                     &                       + ( zsh2v(ji,jj-1) + zsh2v(ji,jj) ) * ( 2. - vmask(ji,jj-1,jk) * vmask(ji,jj,jk) )   )
81               END DO
82            END DO
83         END DO 
84         !
85      ELSE                       !==  Non linear ssh case  ==!
86         DO jj = 1, jpjm1
87            DO ji = 1, jpim1
88               zsshu_hB(ji,jj) = 0.5_wp * ( pssh(ji,jj,Nbb) + pssh(ji+1,jj  ,Nbb) ) * r1_hu_0(ji,jj) * ssumask(ji,jj)
89               zsshv_hB(ji,jj) = 0.5_wp * ( pssh(ji,jj,Nbb) + pssh(ji  ,jj+1,Nbb) ) * r1_hv_0(ji,jj) * ssvmask(ji,jj)
90               zsshu_hN(ji,jj) = 0.5_wp * ( pssh(ji,jj,Nnn) + pssh(ji+1,jj  ,Nnn) ) * r1_hu_0(ji,jj) * ssumask(ji,jj)
91               zsshv_hN(ji,jj) = 0.5_wp * ( pssh(ji,jj,Nnn) + pssh(ji  ,jj+1,Nnn) ) * r1_hv_0(ji,jj) * ssvmask(ji,jj)
92            END DO
93         END DO
94         !
95         DO jk = 2, jpkm1
96            DO jj = 1, jpjm1        !* 2 x shear production at uw- and vw-points (energy conserving form)
97               DO ji = 1, jpim1
98                  ze3uw_BN = e3uw_0(ji,jj,jk) * e3uw_0(ji,jj,jk) * ( 1._wp + zsshu_hB(ji,jj) * wumask(ji,jj,jk) )   &
99                     &                                           * ( 1._wp + zsshu_hN(ji,jj) * wumask(ji,jj,jk) )
100                  ze3vw_BN = e3vw_0(ji,jj,jk) * e3vw_0(ji,jj,jk) * ( 1._wp + zsshu_hB(ji,jj) * wvmask(ji,jj,jk) )   &
101                     &                                           * ( 1._wp + zsshu_hN(ji,jj) * wvmask(ji,jj,jk) )
102                  zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) ) &
103                     &         * (   pun(ji,jj,jk-1) -   pun(ji,jj,jk) ) &
104                     &         * (   pub(ji,jj,jk-1) -   pub(ji,jj,jk) ) / ze3uw_BN * wumask(ji,jj,jk)
105                  zsh2v(ji,jj) = ( p_avm(ji,jj+1,jk) + p_avm(ji,jj,jk) ) &
106                     &         * (   pvn(ji,jj,jk-1) -   pvn(ji,jj,jk) ) &
107                     &         * (   pvb(ji,jj,jk-1) -   pvb(ji,jj,jk) ) / ze3vw_BN * wvmask(ji,jj,jk)
108               END DO
109            END DO
110            DO jj = 2, jpjm1        !* shear production at w-point
111               DO ji = 2, jpim1           ! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked)
112                  p_sh2(ji,jj,jk) = 0.25 * (   ( zsh2u(ji-1,jj) + zsh2u(ji,jj) ) * ( 2. - umask(ji-1,jj,jk) * umask(ji,jj,jk) )   &
113                     &                       + ( zsh2v(ji,jj-1) + zsh2v(ji,jj) ) * ( 2. - vmask(ji,jj-1,jk) * vmask(ji,jj,jk) )   )
114               END DO
115            END DO
116         END DO
117      ENDIF
118      !
119   END SUBROUTINE zdf_sh2
120
121   !!======================================================================
122END MODULE zdfsh2
Note: See TracBrowser for help on using the repository browser.