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.
zdfric.F90 in branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90 @ 7990

Last change on this file since 7990 was 7990, checked in by gm, 7 years ago

#1880 (HPC-09): OPA remove avmu, avmv from zdf modules + move CALL tke(gls)_rst & gls_rst in zdftke(gls) + rename zdftmx and zdfqiao

  • Property svn:keywords set to Id
File size: 13.3 KB
Line 
1MODULE zdfric
2   !!======================================================================
3   !!                       ***  MODULE  zdfric  ***
4   !! Ocean physics:  vertical mixing coefficient compute from the local
5   !!                 Richardson number dependent formulation
6   !!======================================================================
7   !! History :  OPA  !  1987-09  (P. Andrich)  Original code
8   !!            4.0  !  1991-11  (G. Madec)
9   !!            7.0  !  1996-01  (G. Madec)  complete rewriting of multitasking suppression of common work arrays
10   !!            8.0  !  1997-06  (G. Madec)  complete rewriting of zdfmix
11   !!   NEMO     1.0  !  2002-06  (G. Madec)  F90: Free form and module
12   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase
13   !!            3.3.1!  2011-09  (P. Oddo) Mixed layer depth parameterization
14   !!            4.0  !  2017-04  (G. Madec)  remove CPP ddm key & avm at t-point only
15   !!----------------------------------------------------------------------
16
17   !!----------------------------------------------------------------------
18   !!   zdf_ric       : update momentum and tracer Kz from the Richardson number
19   !!   zdf_ric_init  : initialization, namelist read, & parameters control
20   !!----------------------------------------------------------------------
21   USE oce            ! ocean dynamics and tracers variables
22   USE dom_oce        ! ocean space and time domain variables
23   USE zdf_oce        ! ocean vertical physics
24   USE phycst         ! physical constants
25   USE sbc_oce,  ONLY :   taum
26   USE eosbn2 ,  ONLY :   neos
27   !
28   USE in_out_manager ! I/O manager
29   USE lbclnk         ! ocean lateral boundary condition (or mpp link)
30   USE lib_mpp        ! MPP library
31   USE timing         ! Timing
32   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
33
34
35   IMPLICIT NONE
36   PRIVATE
37
38   PUBLIC   zdf_ric         ! called by step.F90
39   PUBLIC   zdf_ric_init    ! called by opa.F90
40
41   !                        !!* Namelist namzdf_ric : Richardson number dependent Kz *
42   INTEGER  ::   nn_ric      ! coefficient of the parameterization
43   REAL(wp) ::   rn_avmri    ! maximum value of the vertical eddy viscosity
44   REAL(wp) ::   rn_alp      ! coefficient of the parameterization
45   REAL(wp) ::   rn_ekmfc    ! Ekman Factor Coeff
46   REAL(wp) ::   rn_mldmin   ! minimum mixed layer (ML) depth   
47   REAL(wp) ::   rn_mldmax   ! maximum mixed layer depth
48   REAL(wp) ::   rn_wtmix    ! Vertical eddy Diff. in the ML
49   REAL(wp) ::   rn_wvmix    ! Vertical eddy Visc. in the ML
50   LOGICAL  ::   ln_mldw     ! Use or not the MLD parameters
51
52   !! * Substitutions
53#  include "vectopt_loop_substitute.h90"
54   !!----------------------------------------------------------------------
55   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
56   !! $Id$
57   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
58   !!----------------------------------------------------------------------
59CONTAINS
60
61   SUBROUTINE zdf_ric( kt )
62      !!----------------------------------------------------------------------
63      !!                 ***  ROUTINE zdfric  ***
64      !!                   
65      !! ** Purpose :   Compute the before eddy viscosity and diffusivity as
66      !!                a function of the local richardson number.
67      !!
68      !! ** Method  :   Local richardson number dependent formulation of the
69      !!                vertical eddy viscosity and diffusivity coefficients.
70      !!                The eddy coefficients are given by:
71      !!                    avm = avm0 + avmb
72      !!                    avt = avm0 / (1 + rn_alp*ri)
73      !!                with ri  = N^2 / dz(u)**2
74      !!                         = e3w**2 * rn2/[ mi( dk(ub) )+mj( dk(vb) ) ]
75      !!                    avm0= rn_avmri / (1 + rn_alp*ri)**nn_ric
76      !!      Where ri is the before local Richardson number,
77      !!            rn_avmri is the maximum value reaches by avm and avt
78      !!            avmb and avtb are the background (or minimum) values
79      !!            and rn_alp, nn_ric are adjustable parameters.
80      !!      Typical values used are : avm0=1.e-2 m2/s, avmb=1.e-6 m2/s
81      !!      avtb=1.e-7 m2/s, rn_alp=5. and nn_ric=2.
82      !!      a numerical threshold is impose on the vertical shear (1.e-20)
83      !!      As second step compute Ekman depth from wind stress forcing
84      !!      and apply namelist provided vertical coeff within this depth.
85      !!      The Ekman depth is:
86      !!              Ustar = SQRT(Taum/rho0)
87      !!              ekd= rn_ekmfc * Ustar / f0
88      !!      Large et al. (1994, eq.29) suggest rn_ekmfc=0.7; however, the derivation
89      !!      of the above equation indicates the value is somewhat arbitrary; therefore
90      !!      we allow the freedom to increase or decrease this value, if the
91      !!      Ekman depth estimate appears too shallow or too deep, respectively.
92      !!      Ekd is then limited by rn_mldmin and rn_mldmax provided in the
93      !!      namelist
94      !!        N.B. the mask are required for implicit scheme, and surface
95      !!      and bottom value already set in zdfphy.F90
96      !!
97      !! ** Action  :   avm, avt  mixing coeff (inner domain values only)
98      !!
99      !! References : Pacanowski & Philander 1981, JPO, 1441-1451.
100      !!              PFJ Lermusiaux 2001.
101      !!----------------------------------------------------------------------
102      INTEGER, INTENT(in) ::   kt   ! ocean time-step
103      !!
104      INTEGER  ::   ji, jj, jk                 ! dummy loop indices
105      LOGICAL  ::   ll_av_weight = .TRUE.      ! local logical
106      REAL(wp) ::   zsh2, zcfRi, zav, zustar   ! local scalars
107      REAL(wp), DIMENSION(jpi,jpj) ::   zdu2, zdv2, zh_ekm   ! 2D workspace
108      !!----------------------------------------------------------------------
109      !
110      IF( nn_timing == 1 )   CALL timing_start('zdf_ric')
111      !
112      DO jk = 2, jpkm1        !==  avm and avt = F(Richardson number)  ==!
113         !
114      IF( ll_av_weight ) THEN    !== viscosity weighted shear & stratification terms
115         !
116         DO jj = 1, jpjm1           !* viscosity weighted shear term
117            DO ji = 1, jpim1
118               zdu2(ji,jj) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji+1,jj,jk) ) * wumask(ji,jj,jk)      &
119                  &              * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )                         &
120                  &              * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) )
121               zdv2(ji,jj) = 0.5 * ( avm(ji,jj,jk  ) + avm(ji,jj+1,jk) ) * wumask(ji,jj,jk)      &
122                  &              * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )                         &
123                  &              * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) )
124            END DO
125         END DO
126         DO jj = 2, jpjm1
127            DO ji = 2, jpim1        !* Richardson number dependent coefficient
128               !                          ! shear of horizontal velocity
129               zsh2  =  ( zdu2(ji-1,jj) + zdu2(ji,jj) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   &
130                  &   + ( zdv2(ji,jj-1) + zdv2(ji,jj) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )   
131               !                          ! coefficient = F(richardson number)
132               zcfRi = 1._wp / (  1._wp + rn_alp * MAX(  0._wp , avt(ji,jj,jk) * rn2(ji,jj,jk) / ( zsh2 + 1.e-20 ) )  )
133               !
134               !                    !* Vertical eddy viscosity and diffusivity coefficients
135               zav = rn_avmri * zcfRi**nn_ric
136               avm(ji,jj,jk) = MAX(  zav         , avmb(jk)  ) * wmask(ji,jj,jk)
137               avt(ji,jj,jk) = MAX(  zav * zcfRi , avtb(jk)  ) * wmask(ji,jj,jk)
138            END DO
139         END DO
140      ELSE                    !==  classical Richardson number definition  ==!
141         DO jj = 1, jpjm1           !* shear term
142            DO ji = 1, jpim1
143               zdu2(ji,jj) = 0.5 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )                         &
144                  &              * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) )
145               zdv2(ji,jj) = 0.5 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )                         &
146                  &              * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) )
147            END DO
148         END DO
149         DO jj = 2, jpjm1
150            DO ji = 2, jpim1        !* Richardson number dependent coefficient
151               !                          ! shear of horizontal velocity
152               zsh2  =  ( zdu2(ji-1,jj) + zdu2(ji,jj) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   &
153                  &   + ( zdv2(ji,jj-1) + zdv2(ji,jj) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )   
154               !                          ! coefficient = F(richardson number)
155               zcfRi = 1._wp / (  1._wp + rn_alp * MAX(  0._wp , rn2(ji,jj,jk) / ( zsh2 + 1.e-20 ) )  )
156               !
157               !                    !* Vertical eddy viscosity and diffusivity coefficients
158               zav = rn_avmri * zcfRi**nn_ric
159               avm(ji,jj,jk) = MAX(  zav         , avmb(jk)  ) * wmask(ji,jj,jk)
160               avt(ji,jj,jk) = MAX(  zav * zcfRi , avtb(jk)  ) * wmask(ji,jj,jk)
161            END DO
162         END DO
163      ENDIF
164         !
165      END DO
166      !
167      IF( ln_mldw ) THEN      !==  set a minimum value in the Ekman layer  ==!
168         !
169         DO jj = 2, jpjm1        !* Ekman depth
170            DO ji = 2, jpim1
171               zustar = SQRT( taum(ji,jj) * r1_rau0 )
172               zh_ekm(ji,jj) = rn_ekmfc * zustar / ( ABS( ff_t(ji,jj) ) + rsmall )     ! Ekman depth
173               zh_ekm(ji,jj) = MAX(  rn_mldmin , MIN( zh_ekm(ji,jj) , rn_mldmax )  )   ! set allowed rang
174            END DO
175         END DO
176         DO jk = 2, jpkm1        !* minimum mixing coeff. within the Ekman layer
177            DO jj = 2, jpjm1
178               DO ji = 2, jpim1
179                  IF( gdept_n(ji,jj,jk) < zh_ekm(ji,jj) ) THEN
180                     avm(ji,jj,jk) = MAX(  avm(ji,jj,jk), rn_wvmix  ) * wmask(ji,jj,jk)
181                     avt(ji,jj,jk) = MAX(  avt(ji,jj,jk), rn_wtmix  ) * wmask(ji,jj,jk)
182                  ENDIF
183               END DO
184            END DO
185         END DO
186      END IF
187      !
188      IF( nn_timing == 1 )   CALL timing_stop('zdf_ric')
189      !
190   END SUBROUTINE zdf_ric
191
192
193   SUBROUTINE zdf_ric_init
194      !!----------------------------------------------------------------------
195      !!                 ***  ROUTINE zdfbfr_init  ***
196      !!                   
197      !! ** Purpose :   Initialization of the vertical eddy diffusivity and
198      !!      viscosity coef. for the Richardson number dependent formulation.
199      !!
200      !! ** Method  :   Read the namzdf_ric namelist and check the parameter values
201      !!
202      !! ** input   :   Namelist namzdf_ric
203      !!
204      !! ** Action  :   increase by 1 the nstop flag is setting problem encounter
205      !!----------------------------------------------------------------------
206      INTEGER :: ji, jj, jk   ! dummy loop indices
207      INTEGER ::   ios        ! Local integer output status for namelist read
208      !!
209      NAMELIST/namzdf_ric/ rn_avmri, rn_alp   , nn_ric  , rn_ekmfc,  &
210         &                rn_mldmin, rn_mldmax, rn_wtmix, rn_wvmix, ln_mldw
211      !!----------------------------------------------------------------------
212      !
213      REWIND( numnam_ref )              ! Namelist namzdf_ric in reference namelist : Vertical diffusion Kz depends on Richardson number
214      READ  ( numnam_ref, namzdf_ric, IOSTAT = ios, ERR = 901)
215901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ric in reference namelist', lwp )
216
217      REWIND( numnam_cfg )              ! Namelist namzdf_ric in configuration namelist : Vertical diffusion Kz depends on Richardson number
218      READ  ( numnam_cfg, namzdf_ric, IOSTAT = ios, ERR = 902 )
219902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_ric in configuration namelist', lwp )
220      IF(lwm) WRITE ( numond, namzdf_ric )
221      !
222      IF(lwp) THEN                   ! Control print
223         WRITE(numout,*)
224         WRITE(numout,*) 'zdf_ric : Ri depend vertical mixing scheme'
225         WRITE(numout,*) '~~~~~~~'
226         WRITE(numout,*) '   Namelist namzdf_ric : set Kz=F(Ri) parameters'
227         WRITE(numout,*) '      maximum vertical viscosity        rn_avmri  = ', rn_avmri
228         WRITE(numout,*) '      coefficient                       rn_alp    = ', rn_alp
229         WRITE(numout,*) '      exponent                          nn_ric    = ', nn_ric
230         WRITE(numout,*) '      Ekman layer enhanced mixing       ln_mldw   = ', ln_mldw
231         WRITE(numout,*) '         Ekman Factor Coeff             rn_ekmfc  = ', rn_ekmfc
232         WRITE(numout,*) '         minimum mixed layer depth      rn_mldmin = ', rn_mldmin
233         WRITE(numout,*) '         maximum mixed layer depth      rn_mldmax = ', rn_mldmax
234         WRITE(numout,*) '         Vertical eddy Diff. in the ML  rn_wtmix  = ', rn_wtmix
235         WRITE(numout,*) '         Vertical eddy Visc. in the ML  rn_wvmix  = ', rn_wvmix
236      ENDIF
237      !
238      DO jk = 1, jpk                 ! Initialization of vertical eddy coef. to the background value
239         avt(:,:,jk) = avtb(jk) * tmask(:,:,jk)
240         avm(:,:,jk) = avmb(jk) * umask(:,:,jk)
241      END DO
242      !
243   END SUBROUTINE zdf_ric_init
244
245   !!======================================================================
246END MODULE zdfric
Note: See TracBrowser for help on using the repository browser.