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.
zdfkpp.F90 in trunk/NEMO/OPA_SRC/ZDF – NEMO

source: trunk/NEMO/OPA_SRC/ZDF/zdfkpp.F90 @ 1537

Last change on this file since 1537 was 1537, checked in by ctlod, 15 years ago

ensure the restartability of the 2nd order advection scheme,see ticket: 489

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 73.4 KB
Line 
1MODULE zdfkpp
2   !!======================================================================
3   !!                       ***  MODULE  zdfkpp  ***
4   !! Ocean physics:  vertical mixing coefficient compute from the KPP
5   !!                 turbulent closure parameterization
6   !!=====================================================================
7   !! History :  8.1  ! 00-03 (W.G. Large, J. Chanut) Original code
8   !!            8.1  ! 02-06 (J.M. Molines) for real case CLIPPER 
9   !!            8.2  ! 03-10 (Chanut J.) re-writting
10   !!            9.0  ! 05-01 (C. Ethe) Free form, F90
11   !!----------------------------------------------------------------------
12#if defined key_zdfkpp   ||   defined key_esopa
13   !!----------------------------------------------------------------------
14   !!   'key_zdfkpp'                                             KPP scheme
15   !!----------------------------------------------------------------------
16   !!----------------------------------------------------------------------
17   !!   zdf_kpp      : update momentum and tracer Kz from a kpp scheme
18   !!   zdf_kpp_init : initialization, namelist read, and parameters control
19   !!----------------------------------------------------------------------
20   USE oce             ! ocean dynamics and active tracers
21   USE dom_oce         ! ocean space and time domain
22   USE zdf_oce         ! ocean vertical physics
23   USE sbc_oce         ! surface boundary condition: ocean
24   USE phycst          ! physical constants
25   USE eosbn2          ! equation of state
26   USE zdfddm          ! double diffusion mixing
27   USE in_out_manager  ! I/O manager
28   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
29   USE prtctl          ! Print control
30   USE trdmod          ! momentum/tracers trends
31
32   IMPLICIT NONE
33   PRIVATE
34
35   PUBLIC   zdf_kpp   ! routine called by step.F90
36   PUBLIC   tra_kpp   ! routine called by step.F90
37
38   LOGICAL , PUBLIC, PARAMETER ::   lk_zdfkpp = .TRUE.    !: KPP vertical mixing flag
39
40   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   ghats   !: non-local scalar mixing term (gamma/<ws>o)
41   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   & 
42      wt0                   ,  &  !: surface temperature flux for non local flux
43      ws0                   ,  &  !: surface salinity flux for non local flux
44      hkpp                        !: boundary layer depht
45
46   !                                        !!* Namelist nam_zdfkpp *
47   REAL(wp) ::   rn_difmiw  =  1.2e-04_wp    ! constant internal wave viscosity (m2/s)
48   REAL(wp) ::   rn_difsiw  =  1.2e-05_wp    ! constant internal wave diffusivity (m2/s)
49   REAL(wp) ::   rn_riinfty =  0.8_wp        ! local Richardson Number limit for shear instability
50   REAL(wp) ::   rn_difri   =  5.e-03_wp     ! maximum shear mixing at Rig = 0    (m2/s)
51   REAL(wp) ::   rn_bvsqcon = -1.e-09_wp     ! Brunt-Vaisala squared (1/s**2) for maximum convection
52   REAL(wp) ::   rn_difcon  =  1._wp         ! maximum mixing in interior convection (m2/s)
53   INTEGER  ::   nn_ave     =  1             ! = 0/1 flag for horizontal average on avt, avmu, avmv
54
55#if defined key_zdfddm
56   REAL(wp) ::                 & !!! ** Double diffusion Mixing
57      difssf  = 1.e-03_wp   ,  &  ! maximum salt fingering mixing
58      Rrho0   = 1.9_wp      ,  &  ! limit for salt  fingering mixing
59      difsdc  = 1.5e-06_wp       ! maximum diffusive convection mixing
60#endif
61   LOGICAL  ::                 &
62      ln_kpprimix  = .TRUE.       ! Shear instability mixing
63
64   REAL(wp) ::                 & !!! ** General constants  **
65      epsln   = 1.0e-20_wp   , &  ! a small positive number   
66      pthird  = 1._wp/3._wp  , &  ! 1/3
67      pfourth = 1._wp/4._wp       ! 1/4
68
69   REAL(wp) ::                 & !!! ** Boundary Layer Turbulence Parameters  **
70      vonk     = 0.4_wp     ,  &  ! von Karman's constant
71      epsilon  = 0.1_wp     ,  &  ! nondimensional extent of the surface layer
72      rconc1   = 5.0_wp     ,  &  ! standard flux profile function parmaeters
73      rconc2   = 16.0_wp    ,  &  !         "        "
74      rconcm   = 8.38_wp    ,  &  ! momentum flux profile fit
75      rconam   = 1.26_wp    ,  &  !         "       "
76      rzetam   = -.20_wp    ,  &  !         "       "       
77      rconcs   = 98.96_wp   ,  &  !  scalar  flux profile fit
78      rconas   = -28.86_wp  ,  &  !         "       "
79      rzetas   = -1.0_wp          !         "       " 
80   REAL(wp) ::                 & !!! ** Boundary Layer Depth Diagnostic  **
81      Ricr     = 0.3_wp     ,  &  ! critical bulk Richardson Number
82      rcekman  = 0.7_wp     ,  &  ! coefficient for ekman depth 
83      rcmonob  = 1.0_wp     ,  &  ! coefficient for Monin-Obukhov depth
84      rconcv   = 1.7_wp     ,  &  ! ratio of interior buoyancy frequency to buoyancy frequency at entrainment depth
85      hbf      = 1.0_wp     ,  &  ! fraction of bound. layer depth to which absorbed solar
86      !                           ! rad. and contributes to surf. buo. forcing
87      Vtc                         ! function of rconcv,rconcs,epsilon,vonk,Ricr
88   REAL(wp) ::                 & !!! ** Nonlocal Boundary Layer Mixing **
89      rcstar   = 5.0_wp     ,  &  ! coefficient for convective nonlocal transport
90      rcs      = 1.0e-3_wp  ,  &  ! conversion: mm/s ==> m/s   
91      rcg                         ! non-dimensional coefficient for nonlocal transport
92
93#if ! defined key_kppcustom
94   REAL(wp), DIMENSION(jpk,jpk) ::   & 
95      del                         ! array for reference mean values of vertical integration
96#endif
97
98#if defined key_kpplktb
99   INTEGER, PARAMETER ::       & !!! ** Parameters for lookup table for turbulent velocity scales **
100      nilktb   = 892        ,  &  ! number of values for zehat in KPP lookup table
101      njlktb   = 482        ,  &  ! number of values for ustar in KPP lookup table
102      nilktbm1 = nilktb - 1 ,  &  !
103      njlktbm1 = njlktb - 1       !
104
105   REAL(wp), DIMENSION(nilktb,njlktb) ::  &
106      wmlktb                ,  &  ! lookup table for the turbulent vertical velocity scale for momentum
107      wslktb                       ! lookup table for the turbulent vertical velocity scale for tracers
108
109   REAL(wp) ::                 &
110      dehatmin = -4.e-7_wp  ,  &  ! minimum limit for zhat in lookup table (m3/s3)
111      dehatmax = 0._wp      ,  &  ! maximum limit for zhat in lookup table (m3/s3)
112      ustmin   = 0._wp      ,  &  ! minimum limit for ustar in lookup table (m/s)
113      ustmax   = 0.04_wp    ,  &  ! maximum limit for ustar in lookup table (m/s)   
114      dezehat               ,  &  ! delta zhat in lookup table
115      deustar                     ! delta ustar in lookup table
116#endif
117   REAL(wp), DIMENSION(jpk) :: &  !!! attenuation coef 
118      ratt       
119   !! already defines in module traqsr, but only if the solar radiation penetration is considered
120   REAL(wp) ::                 & !!! * penetrative solar radiation coefficient *
121      rabs = 0.58_wp        ,  &  ! fraction associated with xsi1
122      xsi1 = 0.35_wp        ,  &  ! first depth of extinction
123      xsi2 = 23.0_wp              ! second depth of extinction
124      !                           ! (default values: water type Ib)
125
126   REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
127      etmean                ,  &  ! coefficient used for horizontal smoothing
128      eumean                ,  &  ! at t-, u- and v-points
129      evmean 
130 
131#if defined key_c1d
132   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   &
133      rig                   ,  &  ! gradient Richardson number
134      rib                   ,  &  ! bulk Richardson number
135      buof                  ,  &  ! buoyancy forcing
136      mols                        ! moning-Obukhov length scale
137   REAL(wp), PUBLIC, DIMENSION(jpi,jpj) ::   &
138      ekdp                        ! Ekman depth
139#endif
140
141   INTEGER  ::  &                 !
142      jip = 62 , jjp = 111
143
144   !! * Substitutions
145#  include "domzgr_substitute.h90"
146#  include "vectopt_loop_substitute.h90"
147#  include  "zdfddm_substitute.h90"
148   !!----------------------------------------------------------------------
149   !!   OPA 9.0 , LOCEAN-IPSL   (2005)
150   !! $Id$
151   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
152   !!----------------------------------------------------------------------
153
154CONTAINS
155
156   SUBROUTINE zdf_kpp ( kt )
157      !!----------------------------------------------------------------------
158      !!                   ***  ROUTINE zdf_kpp  ***
159      !!
160      !! ** Purpose :   Compute the vertical eddy viscosity and diffusivity
161      !!      coefficients and non local mixing using K-profile parameterization
162      !!
163      !! ** Method :   The boundary layer depth hkpp is diagnosed at tracer points
164      !!      from profiles of buoyancy, and shear, and the surface forcing.
165      !!      Above hbl (sigma=-z/hbl <1) the mixing coefficients are computed from
166      !!
167      !!                      Kx =  hkpp  Wx(sigma) G(sigma) 
168      !!
169      !!             and the non local term ghat = Cs / Ws(sigma) / hkpp
170      !!      Below hkpp  the coefficients are the sum of mixing due to internal waves
171      !!      shear instability and double diffusion.
172      !!
173      !!      -1- Compute the now interior vertical mixing coefficients at all depths.
174      !!      -2- Diagnose the boundary layer depth.
175      !!      -3- Compute the now boundary layer vertical mixing coefficients.
176      !!      -4- Compute the now vertical eddy vicosity and diffusivity.
177      !!      -5- Smoothing
178      !!
179      !!        N.B. The computation is done from jk=2 to jpkm1
180      !!             Surface value of avt avmu avmv are set once a time to zero
181      !!             in routine zdf_kpp_init.
182      !!
183      !! ** Action  :   update the non-local terms ghats
184      !!                update avt, avmu, avmv (before vertical eddy coef.)
185      !!
186      !! References : Large W.G., Mc Williams J.C. and Doney S.C.             
187      !!         Reviews of Geophysics, 32, 4, November 1994
188      !!         Comments in the code refer to this paper, particularly
189      !!         the equation number. (LMD94, here after)
190      !!----------------------------------------------------------------------
191#if defined  key_zdfddm
192      USE oce     , zviscos => ua,      &  ! temp. array for viscosities use ua as workspace
193         &          zdiffut => ta,      &  ! temp. array for diffusivities use sa as workspace
194         &          zdiffus => sa          ! temp. array for diffusivities use sa as workspace
195#else
196      USE oce     , zviscos => ua,      &  ! temp. array for viscosities use ua as workspace
197         &          zdiffut => ta          ! temp. array for diffusivities use sa as workspace
198#endif
199      !!
200      INTEGER, INTENT( in  ) ::   kt   ! ocean time step
201      !!
202      INTEGER ::   ji, jj, jk              ! dummy loop indices
203      INTEGER ::   ikbot, jkmax, jkm1, jkp2   !
204
205      REAL(wp), DIMENSION(jpi,jpj) ::   & !!! Surface buoyancy forcing, friction velocity
206         zBo, zBosol, zustar              !
207                      !
208      REAL(wp) ::                       &  !
209         ztx, zty, ztau, zflageos,      &  !
210         zstabl, zbuofdep,zucube,       &  !
211         zrhos, zalbet, zbeta,          &  !
212         zthermal, zhalin, zatt1           !
213     
214      REAL(wp) ::                       & !!! Bulk richardson number
215         zref, zt, zs, zh,              &  !
216         zu, zv, zrh,                   &  !
217         zrib, zrinum,                  &  !
218         zdVsq, zVtsq                      !
219     
220      REAL(wp) ::                       & !!! Velocity scales
221         zehat, zeta, zhrib, zsig,      &  !
222         zscale, zwst, zws, zwm
223
224#if defined key_kpplktb
225      INTEGER ::                        & !!! Lookup table or Analytical functions
226         il, jl                            !
227      REAL(wp) ::                       &  !
228         ud, zfrac, ufrac,              &  !
229         zwam, zwbm, zwas, zwbs            !
230#else
231     REAL(wp) ::                        &  !
232        zwsun, zwmun,                   & 
233        zcons, zconm, zwcons, zwconm      !
234#endif
235 
236     REAL(wp) ::                       & !!! In situ density
237         zsr, zbw, ze,                  &  !
238         zb, zd, zc, zaw, za,           &  !
239         zb1, za1, zkw, zk0,            &  !
240         zcomp , zrhd, zrhdr,zbvzed       !
241
242#if ! defined key_kppcustom     
243     !! * local declarations
244      INTEGER ::                        &
245         jm                                ! dummy loop indices
246      REAL(wp) ::                       & !!! Compression terms
247         zr1, zr2, zr3, zr4,            &  !
248         zrhop                             !
249#endif
250 
251      REAL(wp) ::                       &  !
252         zflag, ztemp, zrn2,            &  !
253         zdep21, zdep32, zdep43
254
255      REAL(wp) ::                       & !!! Interior richardson mixing
256         zdku2, zdkv2, ze3sqr,          &  !
257         zsh2, zri, zfri                   !
258
259      REAL(wp), DIMENSION(jpi,0:2) ::  &  !!! Moning-Obukov limitation
260         zmoek
261      REAL(wp), DIMENSION(jpi)     ::  &
262         zmoa, zekman               
263      REAL(wp)                     ::  &
264         zmob, zek
265
266      REAL(wp), DIMENSION(jpi,4) ::     &  !!! The pipe
267         zdepw, zdift, zvisc
268      REAL(wp), DIMENSION(jpi,3) ::     & 
269         zdept
270      REAL(wp), DIMENSION(jpi,2) ::     & 
271         zriblk
272      REAL(wp), DIMENSION(jpi,jpk) ::   &  !
273         zmask                         
274      REAL(wp), DIMENSION(jpi) ::       &  !
275         zhmax, zria, zhbl 
276      REAL(wp) ::                       &  !
277         zflagri, zflagek,              &  !
278         zflagmo, zflagh, zflagkb          !
279      REAL(wp), DIMENSION(jpi)     ::   & !!! Shape function (G)
280         za2m, za3m, zkmpm,             &
281         za2t, za3t, zkmpt
282      REAL(wp) ::                       &  !
283         zdelta, zdelta2,               &  !
284         zdzup, zdzdn, zdzh,            &  !
285         zvath, zgat1, zdat1,           &  !
286         zkm1m, zkm1t
287      REAL(wp), DIMENSION(jpi,jpk) ::   & !!! Boundary layer diffusivities/viscosities
288         zblcm, zblct                         
289#if defined key_zdfddm
290      REAL(wp) ::                       & !!! double diffusion mixing
291         zrrau, zds,                    &
292         zavdds, zavddt,zinr 
293      REAL(wp), DIMENSION(jpi,4) ::     & 
294        zdifs
295      REAL(wp), DIMENSION(jpi)     ::   &
296         za2s, za3s, zkmps
297      REAL(wp) ::                       & 
298         zkm1s
299      REAL(wp), DIMENSION(jpi,jpk) ::   & 
300         zblcs                     
301#endif
302      !!--------------------------------------------------------------------
303
304
305      ! Initialization (first time-step only)
306      ! --------------
307      IF( kt == nit000  )   CALL zdf_kpp_init
308     
309      zviscos(:,:,:) = 0.
310      zblcm  (:,:  ) = 0. 
311      zdiffut(:,:,:) = 0.
312      zblct  (:,:  ) = 0. 
313#if defined key_zdfddm
314      zdiffus(:,:,:) = 0.
315      zblcs  (:,:  ) = 0. 
316#endif
317      ghats(:,:,:) = 0.
318     
319      zBo   (:,:) = 0.
320      zBosol(:,:) = 0.
321      zustar(:,:) = 0.
322
323
324      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
325      ! I. Interior diffusivity and viscosity at w points ( T interfaces)
326      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
327      DO jk = 2, jpkm1
328         DO jj = 2, jpjm1
329            DO ji = fs_2, fs_jpim1 
330               ! Mixing due to internal waves breaking
331               ! -------------------------------------
332               avmu(ji,jj,jk)  = rn_difmiw 
333               avt (ji,jj,jk)  = rn_difsiw             
334               ! Mixing due to vertical shear instability
335               ! -------------------------------------               
336               IF( ln_kpprimix ) THEN         
337                  ! Compute the gradient Richardson  number at interfaces (zri):
338                  ! LMD94, eq. 27 (is vertical smoothing needed : Rig=N^2 / (dz(u))^2 + (dz(v))^2
339                  zdku2 =   ( un(ji - 1,jj,jk - 1) - un(ji - 1,jj,jk) ) &
340                     &    * ( un(ji - 1,jj,jk - 1) - un(ji - 1,jj,jk) ) &
341                     &    + ( un(ji    ,jj,jk - 1) - un(ji    ,jj,jk) ) &
342                     &    * ( un(ji    ,jj,jk - 1) - un(ji    ,jj,jk) ) 
343                 
344                  zdkv2 =   ( vn(ji,jj - 1,jk - 1) - vn(ji,jj - 1,jk) ) &
345                     &    * ( vn(ji,jj - 1,jk - 1) - vn(ji,jj - 1,jk) ) &
346                     &    + ( vn(ji,    jj,jk - 1) - vn(ji,    jj,jk) ) &
347                     &    * ( vn(ji,    jj,jk - 1) - vn(ji,    jj,jk) ) 
348
349                  ze3sqr = 1. / ( fse3w(ji,jj,jk) * fse3w(ji,jj,jk) )
350                  ! Square of vertical shear  at interfaces
351                  zsh2   = 0.5 * ( zdku2 + zdkv2 ) * ze3sqr
352                  zri    = MAX( rn2(ji,jj,jk), 0. ) / ( zsh2 + epsln ) 
353#if defined key_c1d
354                  ! save the gradient richardson number
355                  rig(ji,jj,jk) = zri * tmask(ji,jj,jk)
356#endif                 
357                  ! Evaluate f of Ri (zri) for shear instability store in zfri
358                  ! LMD94, eq. 28a,b,c, figure 3 ; Rem: p1 is 3, hard coded
359                  zfri  = MAX( zri , 0. )
360                  zfri  = MIN( zfri / rn_riinfty , 1.0 )
361                  zfri  = ( 1.0 - zfri * zfri )
362                  zfri  = zfri * zfri  * zfri
363                  ! add shear contribution to mixing coef.
364                  avmu(ji,jj,jk) =  avmu(ji,jj,jk) + rn_difri * zfri   
365                  avt (ji,jj,jk) =  avt (ji,jj,jk) + rn_difri * zfri   
366               ENDIF
367#if defined key_zdfddm 
368               avs (ji,jj,jk) =  avt (ji,jj,jk)             
369               !  Double diffusion mixing ; NOT IN ROUTINE ZDFDDM.F90
370               ! ------------------------------------------------------------------
371               ! only retains positive value of rrau
372               zrrau = MAX( rrau(ji,jj,jk), epsln )
373               zds   = sn(ji,jj,jk-1) - sn(ji,jj,jk)
374               IF( zrrau > 1. .AND. zds > 0.) THEN
375                  !
376                  ! Salt fingering case.
377                  !---------------------
378                  ! Compute interior diffusivity for double diffusive mixing of
379                  ! salinity. Upper bound "zrrau" by "Rrho0"; (Rrho0=1.9, difcoefnuf=0.001).
380                  ! After that set interior diffusivity for double diffusive mixing
381                  ! of temperature
382                  zavdds = MIN( zrrau, Rrho0 )
383                  zavdds = ( zavdds - 1.0 ) / ( Rrho0 - 1.0 )
384                  zavdds = 1.0 - zavdds * zavdds 
385                  zavdds = zavdds * zavdds * zavdds 
386                  zavdds = difssf * zavdds 
387                  zavddt = 0.7 * zavdds
388               ELSEIF( zrrau < 1. .AND. zrrau > 0. .AND. zds < 0.) THEN
389                  !
390                  ! Diffusive convection case.
391                  !---------------------------
392                  ! Compute interior diffusivity for double diffusive mixing of
393                  ! temperature (Marmorino and Caldwell, 1976);
394                  ! Compute interior diffusivity for double diffusive mixing of salinity
395                  zinr   = 1. / zrrau
396                  zavddt = 0.909 * EXP( 4.6 * EXP( -0.54* ( zinr - 1. ) ) ) 
397                  zavddt = difsdc * zavddt
398                  IF( zrrau < 0.5) THEN
399                     zavdds = zavddt * 0.15 * zrrau
400                  ELSE
401                     zavdds = zavddt * (1.85 * zrrau - 0.85 ) 
402                  ENDIF
403               ELSE
404                  zavddt = 0.
405                  zavdds = 0.
406               ENDIF 
407               ! Add double diffusion contribution to temperature and salinity  mixing coefficients.
408               avt (ji,jj,jk) =  avt (ji,jj,jk) +  zavddt 
409               avs (ji,jj,jk) =  avs (ji,jj,jk) +  zavdds         
410#endif                     
411            END DO
412         END DO
413      END DO
414
415
416      ! Radiative (zBosol) and non radiative (zBo) surface buoyancy
417      !JMM at the time zdfkpp is called, q still holds the sum q + qsr
418      !---------------------------------------------------------------------
419      DO jj = 2, jpjm1
420         DO ji = fs_2, fs_jpim1     
421            IF( neos < 1) THEN   
422               zt     = tn(ji,jj,1)
423               zs     = sn(ji,jj,1) - 35.0
424               zh     = fsdept(ji,jj,1)
425               !  potential volumic mass
426               zrhos  = rhop(ji,jj,1)
427               zalbet = ( ( ( - 0.255019e-07 * zt + 0.298357e-05 ) * zt   &   ! ratio alpha/beta
428                  &                               - 0.203814e-03 ) * zt   &
429                  &                               + 0.170907e-01 ) * zt   &
430                  &   + 0.665157e-01                                      &
431                  &   +     ( - 0.678662e-05 * zs                         &
432                  &           - 0.846960e-04 * zt + 0.378110e-02 ) * zs   &
433                  &   +   ( ( - 0.302285e-13 * zh                         &
434                  &           - 0.251520e-11 * zs                         &
435                  &           + 0.512857e-12 * zt * zt           ) * zh   &
436                  &           - 0.164759e-06 * zs                         &
437                  &        +(   0.791325e-08 * zt - 0.933746e-06 ) * zt   &
438                  &                               + 0.380374e-04 ) * zh
439
440               zbeta  = ( ( -0.415613e-09 * zt + 0.555579e-07 ) * zt      &   ! beta
441                  &                            - 0.301985e-05 ) * zt      &
442                  &   + 0.785567e-03                                      &
443                  &   + (     0.515032e-08 * zs                           &
444                  &         + 0.788212e-08 * zt - 0.356603e-06 ) * zs     &
445                  &   +(  (   0.121551e-17 * zh                           &
446                  &         - 0.602281e-15 * zs                           &
447                  &         - 0.175379e-14 * zt + 0.176621e-12 ) * zh     &
448                  &                             + 0.408195e-10   * zs     &
449                  &     + ( - 0.213127e-11 * zt + 0.192867e-09 ) * zt     &
450                  &                             - 0.121555e-07 ) * zh
451
452               zthermal = zbeta * zalbet / ( rcp * zrhos + epsln )
453               zhalin   = zbeta * sn(ji,jj,1) * rcs
454            ELSE
455               zrhos    = rhop(ji,jj,1) + rau0 * ( 1. - tmask(ji,jj,1) )
456               zthermal = ralpha / ( rcp * zrhos + epsln )
457               zhalin   = rbeta * sn(ji,jj,1) * rcs
458            ENDIF
459            ! Radiative surface buoyancy force
460            zBosol(ji,jj) = grav * zthermal * qsr(ji,jj)
461            ! Non radiative surface buoyancy force
462            zBo   (ji,jj) = grav * zthermal * qns(ji,jj) -  grav * zhalin * emps(ji,jj)
463            ! Surface Temperature flux for non-local term
464            wt0(ji,jj) = - ( qsr(ji,jj) + qns(ji,jj) )* ro0cpr * tmask(ji,jj,1)
465            ! Surface salinity flux for non-local term
466            ws0(ji,jj) = - ( emps(ji,jj) * sn(ji,jj,1) * rcs ) * tmask(ji,jj,1)
467         ENDDO
468      ENDDO
469
470      zflageos = 0.5 + SIGN( 0.5, neos - 1. ) 
471      !  Compute surface buoyancy forcing, Monin Obukhov and Ekman depths 
472      !------------------------------------------------------------------   
473      DO jj = 2, jpjm1
474         DO ji = fs_2, fs_jpim1
475            !  Reference surface density = density at first T point level   
476            zrhos         = rhop(ji,jj,1) + zflageos * rau0 * ( 1. - tmask(ji,jj,1) ) 
477            ! Friction velocity (zustar), at T-point : LMD94 eq. 2
478            ztx           = 0.5 * ( utau(ji,jj) + utau(ji - 1, jj    ) )
479            zty           = 0.5 * ( vtau(ji,jj) + vtau(ji    , jj - 1) )
480            ztau          = SQRT( ztx * ztx + zty * zty )
481            zustar(ji,jj) = SQRT( ztau / ( zrhos +  epsln ) )
482         ENDDO
483      ENDDO
484
485!CDIR NOVERRCHK 
486      !                                               ! ===============
487      DO jj = 2, jpjm1                                 !  Vertical slab
488         !                                             ! ===============
489         
490         !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
491         ! II Compute Boundary layer mixing coef. and diagnose the new boundary layer depth
492         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
493         
494         ! Initialization
495         jkmax       = 0
496         zdept (:,:) = 0.
497         zdepw (:,:) = 0.
498         zriblk(:,:) = 0.
499         zmoek (:,:) = 0.
500         zvisc (:,:) = 0.
501         zdift (:,:) = 0.
502#if defined key_zdfddm
503         zdifs (:,:) = 0.
504#endif
505         zmask (:,:) = 0.
506         DO ji = fs_2, fs_jpim1
507            zria(ji ) = 0.
508            ! Maximum boundary layer depth
509            ikbot     = mbathy(ji,jj) - 1 ! ikbot is the last T point in the water
510            zhmax(ji) = fsdept(ji,jj,ikbot) - 0.001     
511            ! Compute Monin obukhov length scale at the surface and Ekman depth:
512            zbuofdep   = zBo(ji,jj) + zBosol(ji,jj) * ratt(1)
513            zekman(ji) = rcekman * zustar(ji,jj) / ( ABS( ff(ji,jj) ) + epsln )
514            zucube     = zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj) 
515            zmoa(ji)   = zucube / ( vonk * ( zbuofdep + epsln ) )   
516#if defined key_c1d
517            ! store the surface buoyancy forcing
518            zstabl        = 0.5 + SIGN( 0.5, zbuofdep )
519            buof(ji,jj,1) = zbuofdep * tmask(ji,jj,1)
520            ! store the moning-oboukov length scale at surface
521            zmob          = zstabl * zmoa(ji) + ( 1.0 - zstabl ) * fsdept(ji,jj,1)
522            mols(ji,jj,1) = MIN( zmob , zhmax(ji) ) * tmask(ji,jj,1)
523            ! store Ekman depth
524            zek           = zstabl * zekman(ji) + ( 1.0 - zstabl ) * fsdept(ji,jj,1) 
525            ekdp(ji,jj )  = MIN( zek , zhmax(ji) ) * tmask(ji,jj,1) 
526#endif
527         END DO     
528         ! Compute the pipe
529         ! ---------------------
530         DO jk = 2, jpkm1
531            DO ji = fs_2, fs_jpim1
532               ! Compute bfsfc = Bo + radiative contribution down to hbf*depht
533               zbuofdep = zBo(ji,jj) + zBosol(ji,jj) * ratt(jk)
534               ! Flag (zstabl  = 1) if positive forcing
535               zstabl   =  0.5 + SIGN(  0.5, zbuofdep)
536
537               !   Compute bulk richardson number zrib at depht
538               !-------------------------------------------------------
539               !                           [Br - B(d)] * d         zrinum
540               !             Rib(z) = ----------------------- = -------------
541               !                       |Vr - V(d)|^2 + Vt(d)^2   zdVsq + zVtsq
542               !
543               ! First compute zt,zs,zu,zv = means in the surface layer < epsilon*depht 
544               ! Else surface values are taken at the first T level.
545               ! For stability, resolved vertical shear is computed with "before velocities".
546               zref = epsilon * fsdept(ji,jj,jk)
547#if defined key_kppcustom
548               ! zref = gdept(1)
549               zref = fsdept(ji,jj,1)
550               zt   = tn(ji,jj,1)
551               zs   = sn(ji,jj,1)
552               zrh  = rhop(ji,jj,1)
553               zu   = ( ub(ji,jj,1) + ub(ji - 1,jj    ,1) ) / MAX( 1. , umask(ji,jj,1) + umask(ji - 1,jj   ,1) )
554               zv   = ( vb(ji,jj,1) + vb(ji    ,jj - 1,1) ) / MAX( 1. , vmask(ji,jj,1) + vmask(ji   ,jj - 1,1) )
555#else
556               zt   = 0.
557               zs   = 0.
558               zu   = 0.
559               zv   = 0.
560               zrh  = 0.
561               ! vertically integration over the upper epsilon*gdept(jk) ; del () array is computed once in zdf_kpp_init
562               DO jm = 1, jpkm1
563                  zt   = zt  + del(jk,jm) * tn(ji,jj,jm)
564                  zs   = zs  + del(jk,jm) * sn(ji,jj,jm)
565                  zu   = zu  + 0.5 * del(jk,jm) &
566                     &            * ( ub(ji,jj,jm) + ub(ji - 1,jj,jm) ) &
567                     &            / MAX( 1. , umask(ji,jj,jm) + umask(ji - 1,jj,jm) )
568                  zv   = zv  + 0.5 * del(jk,jm) &
569                     &            * ( vb(ji,jj,jm) + vb(ji,jj - 1,jm) ) &
570                     &            / MAX( 1. , vmask(ji,jj,jm) + vmask(ji,jj - 1,jm) )
571                  zrh  = zrh + del(jk,jm) * rhop(ji,jj,jm)
572               END DO
573#endif
574               zsr = SQRT( ABS( sn(ji,jj,jk) ) )
575               ! depth
576               zh = fsdept(ji,jj,jk)
577               ! compute compression terms on density
578               ze  = ( -3.508914e-8*zt-1.248266e-8 ) *zt-2.595994e-6
579               zbw = (  1.296821e-6*zt-5.782165e-9 ) *zt+1.045941e-4
580               zb  = zbw + ze * zs
581               
582               zd  = -2.042967e-2
583               zc  =   (-7.267926e-5*zt+2.598241e-3 ) *zt+0.1571896
584               zaw = ( ( 5.939910e-6*zt+2.512549e-3 ) *zt-0.1028859 ) *zt - 4.721788
585               za  = ( zd*zsr + zc ) *zs + zaw
586               
587               zb1 =   (-0.1909078*zt+7.390729 ) *zt-55.87545
588               za1 = ( ( 2.326469e-3*zt+1.553190)*zt-65.00517 ) *zt+1044.077
589               zkw = ( ( (-1.361629e-4*zt-1.852732e-2 ) *zt-30.41638 ) *zt + 2098.925 ) *zt+190925.6
590               zk0 = ( zb1*zsr + za1 )*zs + zkw
591               zcomp =   1.0 - zh / ( zk0 - zh * ( za - zh * zb ) )
592               
593#if defined key_kppcustom
594               ! potential density of water(zrh = zt,zs at level jk):
595               zrhdr = zrh / zcomp
596#else
597               ! potential density of water(ztref,zsref at level jk):
598               ! compute volumic mass pure water at atm pressure
599               IF ( neos < 1 ) THEN
600                  zr1= ( ( ( ( 6.536332e-9*zt-1.120083e-6 )*zt+1.001685e-4)*zt   &
601                     &       -9.095290e-3 )*zt+6.793952e-2 )*zt+999.842594
602                  ! seawater volumic mass atm pressure
603                  zr2= ( ( ( 5.3875e-9*zt-8.2467e-7 ) *zt+7.6438e-5 ) *zt   &
604                     &   -4.0899e-3 ) *zt+0.824493
605                  zr3= ( -1.6546e-6*zt+1.0227e-4 ) *zt-5.72466e-3
606                  zr4= 4.8314e-4             
607                  ! potential volumic mass (reference to the surface)
608                  zrhop= ( zr4*zs + zr3*zsr + zr2 ) *zs + zr1                 
609                  zrhdr = zrhop / zcomp
610               ELSE
611                  zrhdr = zrh / zcomp
612               ENDIF
613#endif
614               
615               ! potential density of ambiant water at level jk :
616               zrhd   = ( rhd(ji,jj,jk) * rau0 + rau0 ) 
617               
618               ! And now the Rib number numerator .
619               zrinum = grav * ( zrhd - zrhdr ) / rau0
620               zrinum = zrinum * ( fsdept(ji,jj,jk) - zref ) * tmask(ji,jj,jk)
621           
622               ! Resolved shear contribution to Rib at depth T-point (zdVsq)
623               ztx    =   ( ub( ji , jj ,jk)   +  ub(ji - 1, jj ,jk) ) &
624                  &     / MAX( 1. , umask( ji , jj ,jk) + umask(ji - 1, jj ,jk) )   
625               zty    =   ( vb( ji , jj ,jk)   +  vb(ji  ,jj - 1,jk) ) &
626                  &     / MAX( 1., vmask( ji , jj ,jk) + vmask(ji  ,jj - 1,jk) ) 
627               
628               zdVsq  = ( zu - ztx ) * ( zu - ztx ) + ( zv - zty ) * ( zv - zty )
629               
630               ! Scalar turbulent velocity scale zws for hbl=gdept
631               zscale = zstabl + ( 1.0 - zstabl ) * epsilon
632               zehat  = vonk * zscale * fsdept(ji,jj,jk) * zbuofdep
633               zucube = zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj)             
634               zeta   = zehat / ( zucube + epsln )
635               
636               IF( zehat > 0. ) THEN
637                  ! Stable case
638                  zws  = vonk * zustar(ji,jj) / ( 1.0 + rconc1 * zeta )
639               ELSE
640                  ! Unstable case
641#if defined key_kpplktb
642                  ! use lookup table
643                  zd     = zehat - dehatmin
644                  il     = INT( zd / dezehat )
645                  il     = MIN( il, nilktbm1 )
646                  il     = MAX( il, 1 )
647                 
648                  ud     = zustar(ji,jj) - ustmin
649                  jl     = INT( ud / deustar )
650                  jl     = MIN( jl, njlktbm1 )
651                  jl     = MAX( jl, 1 )
652                 
653                  zfrac  = zd / dezehat - FLOAT( il ) 
654                  ufrac  = ud / deustar - FLOAT( jl )
655                  zwas   = ( 1. - zfrac ) * wslktb(il,jl+1) + zfrac * wslktb(il+1,jl+1)
656                  zwbs   = ( 1. - zfrac ) * wslktb(il,jl  ) + zfrac * wslktb(il+1,jl  )
657                  !
658                  zws    = ( 1. - ufrac ) * zwbs + ufrac * zwas
659#else
660                  ! use analytical functions:
661                  zcons  = 0.5 + SIGN( 0.5 , ( rzetas - zeta ) )
662                  zwcons = vonk * zustar(ji,jj) * ( ( ABS( rconas - rconcs * zeta ) )**pthird ) 
663                  zwsun  = vonk * zustar(ji,jj) * SQRT( ABS ( 1.0 - rconc2 * zeta ) )
664                  !
665                  zws    = zcons * zwcons +  ( 1.0 - zcons) * zwsun
666#endif
667               ENDIF
668               
669               ! Turbulent shear contribution to Rib (zVtsq) bv frequency at levels  ( ie T-point jk)
670               zrn2   = 0.5 * ( rn2(ji,jj,jk) + rn2(ji,jj,jk+1) )   
671               zbvzed = SQRT( ABS( zrn2 ) ) 
672               zVtsq  = fsdept(ji,jj,jk) * zws * zbvzed  * Vtc
673               
674               ! Finally, the bulk Richardson number at depth fsdept(i,j,k)
675               zrib  = zrinum   / ( zdVsq + zVtsq + epsln )
676 
677               ! Find subscripts around the boundary layer depth, build the pipe
678               ! ----------------------------------------------------------------
679
680               ! Flag (zflagri = 1) if zrib < Ricr 
681               zflagri = 0.5 + SIGN( 0.5, ( Ricr - zrib ) )
682               !  Flag (zflagh  = 1) if still within overall boundary layer
683               zflagh  = 0.5 + SIGN( 0.5, ( fsdept(ji,jj,1) - zdept(ji,2) ) )
684               
685               ! Ekman layer depth
686               zek     = zstabl * zekman(ji) + ( 1.0 - zstabl ) * zhmax(ji)
687               zflag   = 0.5 + SIGN( 0.5, ( zek - fsdept(ji,jj,jk-1) ) )
688               zek     = zflag * zek + ( 1.0 - zflag ) * zhmax(ji)
689               zflagek = 0.5 + SIGN( 0.5, ( zek - fsdept(ji,jj,jk) ) )
690               ! Flag (zflagmo = 1) if still within stable Monin-Obukhov and in water
691               zmob    = zucube / ( vonk * ( zbuofdep + epsln ) ) 
692               ztemp   = zstabl * zmob + ( 1.0 - zstabl) * zhmax(ji)
693               ztemp   = MIN( ztemp , zhmax(ji) ) 
694               zflagmo = 0.5 + SIGN( 0.5, ( ztemp - fsdept(ji,jj,jk) ) )             
695
696               ! No limitation by Monin Obukhov or Ekman depths:
697!               zflagek = 1.0
698!               zflagmo = 0.5 + SIGN( 0.5, ( zhmax(ji) - fsdept(ji,jj,jk) ) )
699
700               ! Load  pipe via zflagkb  for later calculations
701               ! Flag (zflagkb = 1) if zflagh = 1 and (zflagri = 0 or zflagek = 0 or zflagmo = 0)
702               zflagkb = zflagh * ( 1.0 - ( zflagri * zflagek * zflagmo ) )
703
704               zmask(ji,jk) = zflagh
705               jkp2         = MIN( jk+2 , ikbot )
706               jkm1         = MAX( jk-1 , 2 )
707               jkmax        = MAX( jkmax, jk * INT( REAL( zflagh+epsln ) ) ) 
708
709               zdept(ji,1)  = zdept(ji,1) + zflagkb * fsdept(ji,jj,jk-1) 
710               zdept(ji,2)  = zdept(ji,2) + zflagkb * fsdept(ji,jj,jk  ) 
711               zdept(ji,3)  = zdept(ji,3) + zflagkb * fsdept(ji,jj,jk+1) 
712
713               zdepw(ji,1)  = zdepw(ji,1) + zflagkb * fsdepw(ji,jj,jk-1) 
714               zdepw(ji,2)  = zdepw(ji,2) + zflagkb * fsdepw(ji,jj,jk  ) 
715               zdepw(ji,3)  = zdepw(ji,3) + zflagkb * fsdepw(ji,jj,jk+1)
716               zdepw(ji,4)  = zdepw(ji,4) + zflagkb * fsdepw(ji,jj,jkp2) 
717
718               zriblk(ji,1) = zriblk(ji,1) + zflagkb * zria(ji)
719               zriblk(ji,2) = zriblk(ji,2) + zflagkb * zrib
720
721               zmoek (ji,0) = zmoek (ji,0) + zflagkb * zek
722               zmoek (ji,1) = zmoek (ji,1) + zflagkb * zmoa(ji)
723               zmoek (ji,2) = zmoek (ji,2) + zflagkb * ztemp 
724               ! Save Monin Obukhov depth
725               zmoa  (ji)   = zmob
726           
727               zvisc(ji,1) = zvisc(ji,1) + zflagkb * avmu(ji,jj,jkm1)
728               zvisc(ji,2) = zvisc(ji,2) + zflagkb * avmu(ji,jj,jk  )
729               zvisc(ji,3) = zvisc(ji,3) + zflagkb * avmu(ji,jj,jk+1)
730               zvisc(ji,4) = zvisc(ji,4) + zflagkb * avmu(ji,jj,jkp2)
731               
732               zdift(ji,1) = zdift(ji,1) + zflagkb * avt (ji,jj,jkm1)
733               zdift(ji,2) = zdift(ji,2) + zflagkb * avt (ji,jj,jk  )
734               zdift(ji,3) = zdift(ji,3) + zflagkb * avt (ji,jj,jk+1)
735               zdift(ji,4) = zdift(ji,4) + zflagkb * avt (ji,jj,jkp2)
736
737#if defined key_zdfddm
738               zdifs(ji,1) = zdifs(ji,1) + zflagkb * avs (ji,jj,jkm1)
739               zdifs(ji,2) = zdifs(ji,2) + zflagkb * avs (ji,jj,jk  )
740               zdifs(ji,3) = zdifs(ji,3) + zflagkb * avs (ji,jj,jk+1)
741               zdifs(ji,4) = zdifs(ji,4) + zflagkb * avs (ji,jj,jkp2)
742#endif               
743               ! Save the Richardson number
744               zria  (ji)   = zrib 
745#if defined key_c1d
746               ! store buoyancy length scale
747               buof(ji,jj,jk) = zbuofdep * tmask(ji,jj,jk) 
748               ! store Monin Obukhov
749               zmob           = zstabl * zmob + ( 1.0 - zstabl) * fsdept(ji,jj,1)
750               mols(ji,jj,jk) = MIN( zmob , zhmax(ji) ) * tmask(ji,jj,jk) 
751               ! Bulk Richardson number
752               rib(ji,jj,jk)  = zrib * tmask(ji,jj,jk)             
753#endif               
754            END DO
755         END DO
756         !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
757         ! III PROCESS THE PIPE
758         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
759         
760         DO ji = fs_2, fs_jpim1 
761           
762            ! Find the boundary layer depth zhbl
763            ! ----------------------------------------
764           
765            ! Interpolate monin Obukhov and critical Ri mumber depths   
766            ztemp = zdept(ji,2) - zdept(ji,1)
767            zflag = ( Ricr - zriblk(ji,1) ) / ( zriblk(ji,2) - zriblk(ji,1)  + epsln )
768            zhrib = zdept(ji,1) + zflag * ztemp     
769
770            IF( zriblk(ji,2) < Ricr ) zhrib = zhmax(ji) 
771         
772            IF( zmoek(ji,2) < zdept(ji,2) ) THEN
773               IF ( zmoek(ji,1) < 0. ) THEN
774                  zmob = zdept(ji,2) - epsln
775               ELSE
776                  zmob = ztemp + zmoek(ji,1) - zmoek(ji,2)
777                  zmob = ( zmoek(ji,1) * zdept(ji,2) - zmoek(ji,2) * zdept(ji,1) ) / zmob
778                  zmob = MAX( zmob , zdept(ji,1) + epsln )               
779               ENDIF
780            ELSE           
781               zmob = zhmax(ji) 
782            ENDIF
783            ztemp   = MIN( zmob , zmoek(ji,0) )
784                         
785            ! Finally, the boundary layer depth, zhbl
786            zhbl(ji) = MAX( fsdept(ji,jj,1) + epsln, MIN( zhrib , ztemp ) )
787           
788            ! Save hkpp for further diagnostics (optional)
789            hkpp(ji,jj) = zhbl(ji) * tmask(ji,jj,1) 
790         
791            ! Correct mask if zhbl < fsdepw(ji,jj,2) for no viscosity/diffusivity enhancement at fsdepw(ji,jj,2)
792            !     zflag = 1 if zhbl(ji) > fsdepw(ji,jj,2)
793            IF( zhbl(ji) < fsdepw(ji,jj,2) ) zmask(ji,2) = 0.
794         
795           
796            !  Velocity scales at depth zhbl
797            ! -----------------------------------
798           
799            !  Compute bouyancy forcing down to zhbl
800            ztemp    = -hbf * zhbl(ji)
801            zatt1    = 1.0 - ( rabs * EXP( ztemp / xsi1 ) + ( 1.0 - rabs ) * EXP( ztemp / xsi2 ) )
802            zbuofdep = zBo(ji,jj) + zBosol(ji,jj) * zatt1
803            zstabl   = 0.5 + SIGN( 0.5 , zbuofdep ) 
804
805            zbuofdep = zbuofdep + zstabl * epsln
806
807            zscale = zstabl + ( 1.0 - zstabl ) * epsilon         
808            zehat  = vonk * zscale * zhbl(ji) * zbuofdep
809            zucube = zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj)             
810            zeta   = zehat / ( zucube + epsln )
811           
812            IF( zehat > 0. ) THEN
813               ! Stable case
814               zws  = vonk * zustar(ji,jj) / ( 1.0 + rconc1 * zeta )
815               zwm  = zws
816            ELSE
817               ! Unstable case
818#if defined key_kpplktb
819               ! use lookup table
820               zd     = zehat - dehatmin
821               il     = INT( zd / dezehat )
822               il     = MIN( il, nilktbm1 )
823               il     = MAX( il, 1 )
824               
825               ud     = zustar(ji,jj) - ustmin
826               jl     = INT( ud / deustar )
827               jl     = MIN( jl, njlktbm1 )
828               jl     = MAX( jl, 1 )
829               
830               zfrac  = zd / dezehat - FLOAT( il ) 
831               ufrac  = ud / deustar - FLOAT( jl )
832               zwas   = ( 1. - zfrac ) * wslktb(il,jl+1) + zfrac * wslktb(il+1,jl+1)
833               zwbs   = ( 1. - zfrac ) * wslktb(il,jl  ) + zfrac * wslktb(il+1,jl  )
834               zwam   = ( 1. - zfrac ) * wmlktb(il,jl+1) + zfrac * wmlktb(il+1,jl+1)
835               zwbm   = ( 1. - zfrac ) * wmlktb(il,jl  ) + zfrac * wmlktb(il+1,jl  )
836               !
837               zws    = ( 1. - ufrac ) * zwbs + ufrac * zwas
838               zwm    = ( 1. - ufrac ) * zwbm + ufrac * zwam
839#else
840               ! use analytical functions
841               zconm  = 0.5 + SIGN( 0.5, ( rzetam - zeta) )
842               zcons  = 0.5 + SIGN( 0.5, ( rzetas - zeta) )
843               
844               ! Momentum : zeta < rzetam (zconm = 1)
845               ! Scalars  : zeta < rzetas (zcons = 1)
846               zwconm = zustar(ji,jj) * vonk * ( ( ABS( rconam - rconcm * zeta) )**pthird )
847               zwcons = zustar(ji,jj) * vonk * ( ( ABS( rconas - rconcs * zeta) )**pthird )
848               
849               ! Momentum : rzetam <= zeta < 0 (zconm = 0)
850               ! Scalars  : rzetas <= zeta < 0 (zcons = 0) 
851               zwmun  = SQRT( ABS( 1.0 - rconc2 * zeta ) )
852               zwsun  = vonk * zustar(ji,jj) * zwmun
853               zwmun  = vonk * zustar(ji,jj) * SQRT(zwmun)
854               !
855               zwm    = zconm * zwconm + ( 1.0 - zconm ) * zwmun
856               zws    = zcons * zwcons + ( 1.0 - zcons ) * zwsun
857               
858#endif
859            ENDIF
860           
861           
862            ! Viscosity, diffusivity values and derivatives at h
863            ! --------------------------------------------------------
864           
865            ! check between at which interfaces is located zhbl(ji)
866            ! ztemp = 1, zdepw(ji,2) < zhbl <  zdepw(ji,3)
867            ! ztemp = 0, zdepw(ji,1) < zhbl <  zdepw(ji,2)
868            ztemp  =  0.5 + SIGN( 0.5, ( zhbl(ji) - zdepw(ji,2) ) ) 
869            zdep21 =   zdepw(ji,2) - zdepw(ji,1) + epsln
870            zdep32 =   zdepw(ji,3) - zdepw(ji,2) + epsln
871            zdep43 =   zdepw(ji,4) - zdepw(ji,3) + epsln 
872           
873            ! Compute R as in LMD94, eq D5b
874            zdelta =  ( zhbl(ji) - zdepw(ji,2) ) *         ztemp   / zdep32   &
875               &    + ( zhbl(ji) - zdepw(ji,1) ) * ( 1.0 - ztemp ) / zdep21 
876           
877            ! Compute the vertical derivative of viscosities (zdzh) at z=zhbl(ji)
878            zdzup  =  ( zvisc(ji,2) - zvisc(ji,3) ) *         ztemp   / zdep32 &
879               &    + ( zvisc(ji,1) - zvisc(ji,2) ) * ( 1.0 - ztemp ) / zdep21
880           
881            zdzdn  =  ( zvisc(ji,3) - zvisc(ji,4) ) *         ztemp   / zdep43 &
882               &    + ( zvisc(ji,2) - zvisc(ji,3) ) * ( 1.0 - ztemp ) / zdep32
883           
884            ! LMD94, eq D5b :         
885            zdzh   = ( 1.0 - zdelta ) * zdzup + zdelta * zdzdn
886            zdzh   = MAX( zdzh , 0. )
887           
888            ! Compute viscosities (zvath) at z=zhbl(ji), LMD94 eq D5a
889            zvath  =          ztemp   * ( zvisc(ji,3) + zdzh * ( zdepw(ji,3) - zhbl(ji) ) ) &
890               &    + ( 1.0 - ztemp ) * ( zvisc(ji,2) + zdzh * ( zdepw(ji,2) - zhbl(ji) ) )
891           
892            ! Compute G (zgat1) and its derivative (zdat1) at z=hbl(ji), LMD94 eq 18
893           
894            ! Vertical derivative of velocity scale divided by velocity scale squared at z=hbl(ji)
895            ! (non zero only in stable conditions)
896            zflag  =  -zstabl * rconc1 * zbuofdep / ( zucube * zustar(ji,jj) + epsln )
897           
898            ! G at its derivative at z=hbl:
899            zgat1  = zvath  / ( zhbl(ji) * ( zwm + epsln )  )
900            zdat1  = -zdzh  / ( zwm + epsln ) -  zflag * zvath / zhbl(ji)
901           
902            ! G coefficients, LMD94 eq 17
903            za2m(ji) = -2.0 + 3.0 * zgat1 - zdat1
904            za3m(ji) =  1.0 - 2.0 * zgat1 + zdat1
905
906           
907            ! Compute the vertical derivative of temperature diffusivities (zdzh) at z=zhbl(ji)
908            zdzup  =  ( zdift(ji,2) - zdift(ji,3) ) *         ztemp   / zdep32 &
909               &    + ( zdift(ji,1) - zdift(ji,2) ) * ( 1.0 - ztemp ) / zdep21
910           
911            zdzdn  =  ( zdift(ji,3) - zdift(ji,4) ) *         ztemp   / zdep43 &
912               &    + ( zdift(ji,2) - zdift(ji,3) ) * ( 1.0 - ztemp ) / zdep32
913           
914            ! LMD94, eq D5b :         
915            zdzh   = ( 1.0 - zdelta ) * zdzup + zdelta * zdzdn
916            zdzh   = MAX( zdzh , 0. )
917           
918           
919            ! Compute diffusivities (zvath) at z=zhbl(ji), LMD94 eq D5a
920            zvath  =          ztemp   * ( zdift(ji,3) + zdzh * ( zdepw(ji,3) - zhbl(ji) ) ) &
921               &    + ( 1.0 - ztemp ) * ( zdift(ji,2) + zdzh * ( zdepw(ji,2) - zhbl(ji) ) )
922                       
923            ! G at its derivative at z=hbl:
924            zgat1  = zvath  / ( zhbl(ji) * ( zws + epsln )  )
925            zdat1  = -zdzh  / ( zws + epsln ) -  zflag * zvath / zhbl(ji)
926           
927            ! G coefficients, LMD94 eq 17
928            za2t(ji) = -2.0 + 3.0 * zgat1 - zdat1
929            za3t(ji) =  1.0 - 2.0 * zgat1 + zdat1
930
931#if defined key_zdfddm
932            ! Compute the vertical derivative of salinities diffusivities (zdzh) at z=zhbl(ji)
933            zdzup  =  ( zdifs(ji,2) - zdifs(ji,3) ) *         ztemp   / zdep32 &
934               &    + ( zdifs(ji,1) - zdifs(ji,2) ) * ( 1.0 - ztemp ) / zdep21
935           
936            zdzdn  =  ( zdifs(ji,3) - zdifs(ji,4) ) *         ztemp   / zdep43 &
937               &    + ( zdifs(ji,2) - zdifs(ji,3) ) * ( 1.0 - ztemp ) / zdep32
938           
939            ! LMD94, eq D5b :         
940            zdzh   = ( 1.0 - zdelta ) * zdzup + zdelta * zdzdn
941            zdzh   = MAX( zdzh , 0. )           
942           
943            ! Compute diffusivities (zvath) at z=zhbl(ji), LMD94 eq D5a
944            zvath  =          ztemp   * ( zdifs(ji,3) + zdzh * ( zdepw(ji,3) - zhbl(ji) ) ) &
945               &    + ( 1.0 - ztemp ) * ( zdifs(ji,2) + zdzh * ( zdepw(ji,2) - zhbl(ji) ) )
946                       
947            ! G at its derivative at z=hbl:
948            zgat1  = zvath  / ( zhbl(ji) * ( zws + epsln )  )
949            zdat1  = -zdzh  / ( zws + epsln ) -  zflag * zvath / zhbl(ji)
950           
951            ! G coefficients, LMD94 eq 17
952            za2s(ji) = -2.0 + 3.0 * zgat1 - zdat1
953            za3s(ji) =  1.0 - 2.0 * zgat1 + zdat1
954#endif
955
956            !-------------------turn off interior matching here------
957            !          za2(ji,1) = -2.0
958            !          za3(ji,1) =  1.0
959            !          za2(ji,2) = -2.0
960            !          za3(ji,2) =  1.0
961            !--------------------------------------------------------
962           
963            !  Compute Enhanced Mixing Coefficients (LMD94,eq D6)
964            ! ---------------------------------------------------------------
965           
966            ! Delta
967            zdelta  = ( zhbl(ji)  - zdept(ji,1) ) / ( zdept(ji,2) - zdept(ji,1) + epsln )
968            zdelta2 = zdelta * zdelta
969           
970            !  Mixing coefficients at first level above h (zdept(ji,1))
971            ! and at first interface in the pipe (zdepw(ji,2))
972           
973            ! At first T level above h (zdept(ji,1)) (always in the boundary layer)
974            zsig    = zdept(ji,1) / zhbl(ji)
975            ztemp   = zstabl * zsig  + ( 1.0 - zstabl ) * MIN( zsig , epsilon )
976            zehat   = vonk * ztemp * zhbl(ji) * zbuofdep
977            zeta    = zehat / ( zucube + epsln)
978            zwst    = vonk * zustar(ji,jj) / ( ABS( 1.0 + rconc1 * zeta ) + epsln)
979            zwm     = zstabl * zwst + ( 1.0 - zstabl ) * zwm
980            zws     = zstabl * zwst + ( 1.0 - zstabl ) * zws
981
982            zkm1m  = zhbl(ji) * zwm * zsig * ( 1.0 + zsig * ( za2m(ji) + zsig * za3m(ji) ) )
983            zkm1t  = zhbl(ji) * zws * zsig * ( 1.0 + zsig * ( za2t(ji) + zsig * za3t(ji) ) )
984#if defined key_zdfddm
985            zkm1s  = zhbl(ji) * zws * zsig * ( 1.0 + zsig * ( za2s(ji) + zsig * za3s(ji) ) )
986#endif                       
987            ! At first W level in the pipe (zdepw(ji,2)) (not always in the boundary layer ):
988            zsig    = MIN( zdepw(ji,2) / zhbl(ji) , 1.0 )
989            ztemp   = zstabl * zsig + ( 1.0 - zstabl ) * MIN( zsig , epsilon )
990            zehat   = vonk * ztemp * zhbl(ji) * zbuofdep
991            zeta    = zehat / ( zucube + epsln )
992            zwst    = vonk * zustar(ji,jj) / ( ABS( 1.0 + rconc1 * zeta ) + epsln)
993            zws     = zstabl * zws + ( 1.0 - zstabl ) * zws
994            zwm     = zstabl * zws + ( 1.0 - zstabl ) * zwm
995
996            zkmpm(ji) = zhbl(ji) * zwm * zsig * ( 1.0 + zsig * ( za2m(ji) + zsig * za3m(ji) ) )
997            zkmpt(ji) = zhbl(ji) * zws * zsig * ( 1.0 + zsig * ( za2t(ji) + zsig * za3t(ji) ) )
998#if defined key_zdfddm
999            zkmps(ji) = zhbl(ji) * zws * zsig * ( 1.0 + zsig * ( za2s(ji) + zsig * za3s(ji) ) )
1000#endif 
1001     
1002            ! check if this point is in the boundary layer,else take interior viscosity/diffusivity:
1003            zflag       = 0.5 + SIGN( 0.5, ( zhbl(ji) - zdepw(ji,2) ) )
1004            zkmpm(ji) = zkmpm(ji) * zflag + ( 1.0 - zflag ) * zvisc(ji,2)
1005            zkmpt(ji) = zkmpt(ji) * zflag + ( 1.0 - zflag ) * zdift(ji,2)
1006#if defined key_zdfddm
1007            zkmps(ji) = zkmps(ji) * zflag + ( 1.0 - zflag ) * zdifs(ji,2)
1008#endif
1009
1010            ! Enhanced viscosity/diffusivity at zdepw(ji,2)
1011            ztemp     = ( 1.0 - 2.0 * zdelta + zdelta2 ) * zkm1m + zdelta2 * zkmpm(ji)
1012            zkmpm(ji) = ( 1.0 - zdelta ) * zvisc(ji,2) + zdelta * ztemp
1013            ztemp     = ( 1.0 - 2.0 * zdelta + zdelta2 ) * zkm1t + zdelta2 * zkmpt(ji)
1014            zkmpt(ji) = ( 1.0 - zdelta ) * zdift(ji,2) + zdelta * ztemp
1015#if defined key_zdfddm
1016            ztemp     = ( 1.0 - 2.0 * zdelta + zdelta2 ) * zkm1s + zdelta2 * zkmps(ji)
1017            zkmps(ji) = ( 1.0 - zdelta ) * zdifs(ji,2) + zdelta * ztemp
1018#endif           
1019
1020         END DO
1021         !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1022         ! IV. Compute vertical eddy viscosity and diffusivity coefficients
1023         !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1024         
1025         DO jk  = 2, jkmax
1026           
1027            ! Compute turbulent velocity scales on the interfaces
1028            ! --------------------------------------------------------
1029            DO  ji = fs_2, fs_jpim1
1030               zbuofdep = zBo(ji,jj) + zBosol(ji,jj) * zatt1
1031               zstabl   = 0.5 + SIGN( 0.5 , zbuofdep ) 
1032               zbuofdep = zbuofdep + zstabl * epsln         
1033               zsig    = fsdepw(ji,jj,jk) / zhbl(ji)
1034               ztemp   = zstabl * zsig + ( 1. - zstabl ) * MIN( zsig , epsilon )
1035               zehat   = vonk * ztemp * zhbl(ji) * zbuofdep
1036               zucube  = zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj)
1037               zeta    = zehat / ( zucube + epsln )
1038
1039               IF( zehat > 0. ) THEN
1040                  ! Stable case
1041                  zws  = vonk * zustar(ji,jj) / ( 1.0 + rconc1 * zeta )
1042                  zwm  = zws
1043               ELSE
1044                  ! Unstable case
1045#if defined key_kpplktb
1046                  ! use lookup table
1047                  zd     = zehat - dehatmin
1048                  il     = INT( zd / dezehat )
1049                  il     = MIN( il, nilktbm1 )
1050                  il     = MAX( il, 1 )
1051                 
1052                  ud     = zustar(ji,jj) - ustmin
1053                  jl     = INT( ud / deustar )
1054                  jl     = MIN( jl, njlktbm1 )
1055                  jl     = MAX( jl, 1 )
1056                 
1057                  zfrac  = zd / dezehat - FLOAT( il ) 
1058                  ufrac  = ud / deustar - FLOAT( jl )
1059                  zwas   = ( 1. - zfrac ) * wslktb(il,jl+1) + zfrac * wslktb(il+1,jl+1)
1060                  zwbs   = ( 1. - zfrac ) * wslktb(il,jl  ) + zfrac * wslktb(il+1,jl  )
1061                  zwam   = ( 1. - zfrac ) * wmlktb(il,jl+1) + zfrac * wmlktb(il+1,jl+1)
1062                  zwbm   = ( 1. - zfrac ) * wmlktb(il,jl  ) + zfrac * wmlktb(il+1,jl  )
1063                  !
1064                  zws    = ( 1. - ufrac ) * zwbs + ufrac * zwas
1065                  zwm    = ( 1. - ufrac ) * zwbm + ufrac * zwam
1066#else
1067                  ! use analytical functions
1068                  zconm  = 0.5 + SIGN( 0.5, ( rzetam - zeta) )
1069                  zcons  = 0.5 + SIGN( 0.5, ( rzetas - zeta) )
1070                 
1071                  ! Momentum : zeta < rzetam (zconm = 1)
1072                  ! Scalars  : zeta < rzetas (zcons = 1)
1073                  zwconm = zustar(ji,jj) * vonk * ( ( ABS( rconam - rconcm * zeta) )**pthird )
1074                  zwcons = zustar(ji,jj) * vonk * ( ( ABS( rconas - rconcs * zeta) )**pthird )
1075                 
1076                  ! Momentum : rzetam <= zeta < 0 (zconm = 0)
1077                  ! Scalars  : rzetas <= zeta < 0 (zcons = 0) 
1078                  zwmun  = SQRT( ABS( 1.0 - rconc2 * zeta ) )
1079                  zwsun  = vonk * zustar(ji,jj) * zwmun
1080                  zwmun  = vonk * zustar(ji,jj) * SQRT(zwmun)
1081                  !
1082                  zwm    = zconm * zwconm + ( 1.0 - zconm ) * zwmun
1083                  zws    = zcons * zwcons + ( 1.0 - zcons ) * zwsun
1084                 
1085#endif
1086               ENDIF
1087               
1088               zblcm(ji,jk) = zhbl(ji) * zwm * zsig  * ( 1.0 + zsig * ( za2m(ji) + zsig * za3m(ji) ) )
1089               zblct(ji,jk) = zhbl(ji) * zws * zsig  * ( 1.0 + zsig * ( za2t(ji) + zsig * za3t(ji) ) )
1090#if defined key_zdfddm
1091               zblcs(ji,jk) = zhbl(ji) * zws * zsig  * ( 1.0 + zsig * ( za2s(ji) + zsig * za3s(ji) ) )
1092#endif             
1093               !  Compute Nonlocal transport term = ghats * <ws>o
1094               ! ----------------------------------------------------
1095               ghats(ji,jj,jk-1) = ( 1. - zstabl ) * rcg / ( zws * zhbl(ji) + epsln ) * tmask(ji,jj,jk)
1096
1097            END DO
1098         END DO     
1099         !  Combine interior and boundary layer coefficients and nonlocal term
1100         ! -----------------------------------------------------------------------
1101         DO jk = 2, jpkm1   
1102            DO ji = fs_2, fs_jpim1
1103               zflag = zmask(ji,jk) * zmask(ji,jk+1)
1104               zviscos(ji,jj,jk) = ( 1.0 - zmask(ji,jk) )         * avmu (ji,jj,jk) & ! interior viscosities
1105                  &              +                        zflag   * zblcm(ji,jk    ) & ! boundary layer viscosities
1106                  &              + zmask(ji,jk) * ( 1.0 - zflag ) * zkmpm(ji       )   ! viscosity enhancement at W_level near zhbl
1107               
1108               zviscos(ji,jj,jk) = zviscos(ji,jj,jk) * tmask(ji,jj,jk)   
1109
1110           
1111               zdiffut(ji,jj,jk) = ( 1.0 - zmask(ji,jk) )          * avt (ji,jj,jk) & ! interior diffusivities
1112                  &              +                        zflag   * zblct(ji,jk   ) & ! boundary layer diffusivities
1113                  &              + zmask(ji,jk) * ( 1.0 - zflag ) * zkmpt(ji      )   ! diffusivity enhancement at W_level near zhbl
1114                       
1115               zdiffut(ji,jj,jk) = zdiffut(ji,jj,jk) * tmask(ji,jj,jk) 
1116#if defined key_zdfddm
1117               zdiffus(ji,jj,jk) = ( 1.0 - zmask(ji,jk) )          * avs (ji,jj,jk) & ! interior diffusivities
1118                  &              +                        zflag   * zblcs(ji,jk   ) & ! boundary layer diffusivities
1119                  &              + zmask(ji,jk) * ( 1.0 - zflag ) * zkmps(ji      )   ! diffusivity enhancement at W_level near zhbl
1120                       
1121               zdiffus(ji,jj,jk) = zdiffus(ji,jj,jk) * tmask(ji,jj,jk) 
1122#endif               
1123               ! Non local flux in the boundary layer only
1124               ghats(ji,jj,jk-1) = zmask(ji,jk) * ghats(ji,jj,jk-1)
1125
1126            ENDDO
1127         END DO
1128         !                                             ! ===============
1129      END DO                                           !   End of slab
1130      !                                                ! ===============
1131
1132      ! Lateral boundary conditions on zvicos and zdiffus  (sign unchanged)
1133      CALL lbc_lnk( zviscos(:,:,:), 'U', 1. )  ; CALL lbc_lnk( zdiffut(:,:,:), 'W', 1. ) 
1134#if defined key_zdfddm 
1135      CALL lbc_lnk( zdiffus(:,:,:), 'W', 1. ) 
1136#endif
1137
1138      SELECT CASE ( nn_ave )
1139         !
1140         CASE ( 0 )             ! no viscosity and diffusivity smoothing
1141
1142            DO jk = 2, jpkm1
1143               DO jj = 2, jpjm1
1144                  DO ji = fs_2, fs_jpim1
1145                     avmu(ji,jj,jk) = ( zviscos(ji,jj,jk) + zviscos(ji+1,jj,jk) ) &
1146                        &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji + 1,jj,jk) ) * umask(ji,jj,jk)
1147                     
1148                     avmv(ji,jj,jk) = ( zviscos(ji,jj,jk) + zviscos(ji,jj+1,jk) ) &
1149                        &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji,jj+1,jk) ) * vmask(ji,jj,jk)
1150                     
1151                     avt (ji,jj,jk) =  zdiffut(ji,jj,jk) * tmask(ji,jj,jk) 
1152#if defined key_zdfddm     
1153                     avs (ji,jj,jk) =  zdiffus(ji,jj,jk) * tmask(ji,jj,jk) 
1154#endif
1155                  END DO
1156               END DO
1157            END DO
1158           
1159         CASE ( 1 )                ! viscosity and diffusivity smoothing
1160            !                     
1161            !           ( 1/2  1  1/2 )              ( 1/2  1/2 )             ( 1/2  1  1/2 )
1162            ! avt = 1/8 ( 1    2  1   )   avmu = 1/4 ( 1    1   )   avmv= 1/4 ( 1/2  1  1/2 )
1163            !           ( 1/2  1  1/2 )              ( 1/2  1/2 )
1164 
1165            DO jk = 2, jpkm1
1166               DO jj = 2, jpjm1
1167                  DO ji = fs_2, fs_jpim1
1168
1169                     avmu(ji,jj,jk) = (      zviscos(ji  ,jj  ,jk) + zviscos(ji+1,jj  ,jk)   &
1170                        &              +.5*( zviscos(ji  ,jj-1,jk) + zviscos(ji+1,jj-1,jk)   &
1171                        &                   +zviscos(ji  ,jj+1,jk) + zviscos(ji+1,jj+1,jk) ) ) * eumean(ji,jj,jk)
1172                     
1173                     avmv(ji,jj,jk) = (      zviscos(ji  ,jj  ,jk) + zviscos(ji  ,jj+1,jk)   &
1174                        &              +.5*( zviscos(ji-1,jj  ,jk) + zviscos(ji-1,jj+1,jk)   &
1175                        &                   +zviscos(ji+1,jj  ,jk) + zviscos(ji+1,jj+1,jk) ) ) * evmean(ji,jj,jk)
1176 
1177                     avt (ji,jj,jk) = ( .5*( zdiffut(ji-1,jj+1,jk) + zdiffut(ji-1,jj-1,jk)    &
1178                        &                   +zdiffut(ji+1,jj+1,jk) + zdiffut(ji+1,jj-1,jk) )  &
1179                        &              +1.*( zdiffut(ji-1,jj  ,jk) + zdiffut(ji  ,jj+1,jk)    &
1180                        &                   +zdiffut(ji  ,jj-1,jk) + zdiffut(ji+1,jj  ,jk) )  &
1181                        &              +2.*  zdiffut(ji  ,jj  ,jk)                          ) * etmean(ji,jj,jk)
1182#if defined key_zdfddm   
1183                     avs (ji,jj,jk) = ( .5*( zdiffus(ji-1,jj+1,jk) + zdiffus(ji-1,jj-1,jk)    &
1184                        &                   +zdiffus(ji+1,jj+1,jk) + zdiffus(ji+1,jj-1,jk) )  &
1185                        &              +1.*( zdiffus(ji-1,jj  ,jk) + zdiffus(ji  ,jj+1,jk)    &
1186                        &                   +zdiffus(ji  ,jj-1,jk) + zdiffus(ji+1,jj  ,jk) )  &
1187                        &              +2.*  zdiffus(ji  ,jj  ,jk)                          ) * etmean(ji,jj,jk) 
1188#endif               
1189                  END DO
1190               END DO
1191            END DO
1192         
1193         END SELECT
1194
1195         DO jk = 2, jpkm1                       ! vertical slab
1196            !
1197            !  Minimum value on the eddy diffusivity
1198            ! ----------------------------------------
1199            DO jj = 2, jpjm1
1200               DO ji = fs_2, fs_jpim1   ! vector opt.
1201                  avt(ji,jj,jk) = MAX( avt(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk)
1202#if defined key_zdfddm 
1203                  avs(ji,jj,jk) = MAX( avs(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk)
1204#endif
1205               END DO
1206            END DO
1207
1208            !
1209            ! Minimum value on the eddy viscosity
1210            ! ----------------------------------------
1211            DO jj = 1, jpj
1212               DO ji = 1, jpi
1213                  avmu(ji,jj,jk) = MAX( avmu(ji,jj,jk), avmb(jk) ) * umask(ji,jj,jk)
1214                  avmv(ji,jj,jk) = MAX( avmv(ji,jj,jk), avmb(jk) ) * vmask(ji,jj,jk)
1215               END DO
1216            END DO
1217            !
1218         END DO
1219
1220         ! Lateral boundary conditions on avt  (sign unchanged)
1221         CALL lbc_lnk( hkpp(:,:), 'T', 1. )
1222
1223         ! Lateral boundary conditions on avt  (sign unchanged)
1224         CALL lbc_lnk( avt(:,:,:), 'W', 1. )
1225#if defined key_zdfddm 
1226         CALL lbc_lnk( avs(:,:,:), 'W', 1. ) 
1227#endif
1228         ! Lateral boundary conditions (avmu,avmv) (U- and V- points, sign unchanged)
1229         CALL lbc_lnk( avmu(:,:,:), 'U', 1. )   ;    CALL lbc_lnk( avmv(:,:,:), 'V', 1. ) 
1230 
1231         IF(ln_ctl) THEN
1232#if defined key_zdfddm
1233            CALL prt_ctl(tab3d_1=avt , clinfo1=' kpp - t: ', tab3d_2=avs , clinfo2=' s: ', ovlap=1, kdim=jpk)
1234#else
1235            CALL prt_ctl(tab3d_1=avt , clinfo1=' kpp - t: ', ovlap=1, kdim=jpk)
1236#endif
1237            CALL prt_ctl(tab3d_1=avmu, clinfo1=' kpp - u: ', mask1=umask,  &
1238               &         tab3d_2=avmv, clinfo2=      ' v: ', mask2=vmask, ovlap=1, kdim=jpk)
1239         ENDIF
1240
1241   END SUBROUTINE zdf_kpp
1242
1243
1244   SUBROUTINE tra_kpp( kt )
1245      !!----------------------------------------------------------------------
1246      !!                  ***  ROUTINE tra_kpp  ***
1247      !!
1248      !! ** Purpose :   compute and add to the tracer trend the non-local
1249      !!      tracer flux
1250      !!
1251      !! ** Method  :   ???
1252      !!
1253      !! history :
1254      !!     9.0  ! 05-11 (G. Madec)  Original code
1255      !!----------------------------------------------------------------------
1256      !! * Modules used
1257      USE oce, ONLY :    ztrdt => ua,       & ! use ua as 3D workspace
1258                         ztrds => va          ! use va as 3D workspace
1259      !!----------------------------------------------------------------------
1260      INTEGER, INTENT(in) :: kt
1261      INTEGER :: ji, jj, jk
1262
1263      IF( kt == nit000 ) THEN
1264         IF(lwp) WRITE(numout,*)
1265         IF(lwp) WRITE(numout,*) 'tra_kpp : KPP non-local tracer fluxes'
1266         IF(lwp) WRITE(numout,*) '~~~~~~~   '
1267      ENDIF
1268
1269
1270      ! Save ta and sa trends
1271      IF( l_trdtra )   THEN
1272         ztrdt(:,:,:) = ta(:,:,:)
1273         ztrds(:,:,:) = sa(:,:,:)
1274      ENDIF
1275
1276      ! add non-local temperature and salinity flux ( in convective case only)
1277      DO jk = 1, jpkm1
1278         DO jj = 2, jpjm1
1279            DO ji = fs_2, fs_jpim1
1280               ta(ji,jj,jk) =  ta(ji,jj,jk)                           &
1281                  &         - ( ghats(ji,jj,jk  ) * avt(ji,jj,jk  )   &
1282                  &           - ghats(ji,jj,jk+1) * avt(ji,jj,jk+1) ) * wt0(ji,jj) / fse3t(ji,jj,jk)
1283               sa(ji,jj,jk) = sa(ji,jj,jk)                              &
1284                  &         - ( ghats(ji,jj,jk  ) * fsavs(ji,jj,jk  )   &
1285                  &           - ghats(ji,jj,jk+1) * fsavs(ji,jj,jk+1) ) * ws0(ji,jj) / fse3t(ji,jj,jk)
1286            END DO
1287         END DO
1288      END DO
1289
1290      ! save the non-local tracer flux trends for diagnostic
1291      IF( l_trdtra )   THEN
1292         ztrdt(:,:,:) = ta(:,:,:) - ztrdt(:,:,:)
1293         ztrds(:,:,:) = sa(:,:,:) - ztrds(:,:,:)
1294!!bug gm jpttdzdf ==> jpttkpp
1295         CALL trd_mod(ztrdt, ztrds, jptra_trd_zdf, 'TRA', kt)
1296      ENDIF
1297
1298      IF(ln_ctl) THEN 
1299         CALL prt_ctl( tab3d_1=ta, clinfo1=' kpp  - Ta: ', mask1=tmask,   &
1300         &             tab3d_2=sa, clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
1301      ENDIF
1302
1303   END SUBROUTINE tra_kpp
1304
1305
1306   SUBROUTINE zdf_kpp_init
1307      !!----------------------------------------------------------------------
1308      !!                  ***  ROUTINE zdf_kpp_init  ***
1309      !!                     
1310      !! ** Purpose :   Initialization of the vertical eddy diffivity and
1311      !!      viscosity when using a kpp turbulent closure scheme
1312      !!
1313      !! ** Method  :   Read the namkpp namelist and check the parameters
1314      !!      called at the first timestep (nit000)
1315      !!
1316      !! ** input   :   Namlist namkpp
1317      !!
1318      !!
1319      !! history :
1320      !!     8.1  ! 00-02 (J. Chanut) KPP Mixing
1321      !!     9.0  ! 05-01 (C. Ethe) F90 : free form
1322      !!----------------------------------------------------------------------
1323      !! * local declarations
1324
1325      INTEGER    ::   &
1326         ji, jj, jk             ! dummy loop indices
1327     
1328#if ! defined key_kppcustom
1329      INTEGER    ::   &
1330         jm                       ! dummy loop indices     
1331      REAL(wp)   ::              & !!! tempory scalars
1332         zref, zdist
1333#endif
1334
1335#if defined key_kpplktb
1336      REAL(wp)   ::              & !!! tempory scalars
1337         zustar,    &
1338         zucube, zustvk,         & 
1339         zeta, zehat
1340#endif
1341      REAL(wp)   ::             & !!! tempory scalars
1342         zhbf
1343      LOGICAL ::                &
1344         ll_kppcustom,          &  ! 1st ocean level taken as surface layer
1345         ll_kpplktb                ! Lookup table for turbul. velocity scales
1346      !!
1347      NAMELIST/nam_kpp/ ln_kpprimix, rn_difmiw, rn_difsiw, rn_riinfty, rn_difri, rn_bvsqcon, rn_difcon, nn_ave
1348      !!----------------------------------------------------------------------
1349
1350      REWIND ( numnam )               ! Read Namelist namkpp : K-Profile Parameterisation
1351      READ   ( numnam, nam_kpp )
1352
1353      IF(lwp) THEN                    ! Control print
1354         WRITE(numout,*)
1355         WRITE(numout,*) 'zdf_kpp_init : K-Profile Parameterisation'
1356         WRITE(numout,*) '~~~~~~~~~~~~'
1357         WRITE(numout,*) '   Namelist nam_kpp : set tke mixing parameters'
1358         WRITE(numout,*) '     Shear instability mixing                      ln_kpprimix = ', ln_kpprimix
1359         WRITE(numout,*) '     max. internal wave viscosity                  rn_difmiw   = ', rn_difmiw
1360         WRITE(numout,*) '     max. internal wave diffusivity                rn_difsiw   = ', rn_difsiw
1361         WRITE(numout,*) '     Richardson Number limit for shear instability rn_riinfty  = ', rn_riinfty
1362         WRITE(numout,*) '     max. shear mixing at Rig = 0                  rn_difri    = ', rn_difri
1363         WRITE(numout,*) '     Brunt-Vaisala squared for max. convection     rn_bvsqcon  = ', rn_bvsqcon
1364         WRITE(numout,*) '     max. mix. in interior convec.                 rn_difcon   = ', rn_difcon
1365         WRITE(numout,*) '     horizontal average flag                       nn_ave      = ', nn_ave
1366      ENDIF
1367
1368      ll_kppcustom = .FALSE.
1369      ll_kpplktb   = .FALSE.
1370
1371#if defined key_kppcustom
1372      ll_kppcustom = .TRUE.
1373#endif
1374#if defined key_kpplktb
1375      ll_kpplktb   = .TRUE.
1376#endif
1377      IF(lwp) THEN
1378         WRITE(numout,*) '     Lookup table for turbul. velocity scales ll_kpplktb   = ', ll_kpplktb
1379         WRITE(numout,*) '     1st ocean level taken as surface layer   ll_kppcustom = ', ll_kppcustom
1380      ENDIF
1381     
1382      IF( lk_zdfddm) THEN
1383         IF(lwp) THEN
1384            WRITE(numout,*)
1385            WRITE(numout,*) '    Double diffusion mixing on temperature and salinity '
1386            WRITE(numout,*) '    CAUTION : done in routine zdfkpp, not in routine zdfddm '
1387         ENDIF
1388      ENDIF
1389     
1390         
1391
1392      !set constants not in namelist
1393      !-----------------------------
1394      Vtc  = rconcv * SQRT( 0.2 / ( rconcs * epsilon ) ) / ( vonk * vonk * Ricr )
1395      rcg  = rcstar * vonk * ( rconcs * vonk * epsilon )**pthird
1396
1397      IF(lwp) THEN
1398         WRITE(numout,*)
1399         WRITE(numout,*) '     Constant value for unreso. turbul. velocity shear Vtc = ', Vtc
1400         WRITE(numout,*) '     Non-dimensional coef. for nonlocal transport      rcg = ', rcg
1401       ENDIF
1402
1403      ! ratt is the attenuation coefficient for solar flux
1404      ! Should be different is s_coordinate
1405      DO jk = 1, jpk
1406         zhbf     = - fsdept(1,1,jk) * hbf
1407         ratt(jk) = 1.0 - ( rabs * EXP( zhbf / xsi1 ) + ( 1.0 - rabs ) * EXP( zhbf / xsi2 ) )       
1408      ENDDO
1409
1410      ! Horizontal average : initialization of weighting arrays
1411      ! -------------------
1412     
1413      SELECT CASE ( nn_ave )
1414
1415      CASE ( 0 )                ! no horizontal average
1416         IF(lwp) WRITE(numout,*) '          no horizontal average on avt, avmu, avmv'
1417         IF(lwp) WRITE(numout,*) '          only in very high horizontal resolution !'
1418         ! weighting mean arrays etmean, eumean and evmean
1419         !           ( 1  1 )                                          ( 1 )
1420         ! avt = 1/4 ( 1  1 )     avmu = 1/2 ( 1  1 )       avmv=  1/2 ( 1 )
1421         !                         
1422         etmean(:,:,:) = 0.e0
1423         eumean(:,:,:) = 0.e0
1424         evmean(:,:,:) = 0.e0
1425         
1426         DO jk = 1, jpkm1
1427            DO jj = 2, jpjm1
1428               DO ji = 2, jpim1   ! vector opt.
1429                  etmean(ji,jj,jk) = tmask(ji,jj,jk)                     &
1430                  &  / MAX( 1.,  umask(ji-1,jj  ,jk) + umask(ji,jj,jk)   &
1431                  &            + vmask(ji  ,jj-1,jk) + vmask(ji,jj,jk)  )
1432                 
1433                  eumean(ji,jj,jk) = umask(ji,jj,jk)                     &
1434                  &  / MAX( 1.,  tmask(ji,jj,jk) + tmask(ji+1,jj  ,jk)  )
1435
1436                  evmean(ji,jj,jk) = vmask(ji,jj,jk)                     &
1437                  &  / MAX( 1.,  tmask(ji,jj,jk) + tmask(ji  ,jj+1,jk)  )
1438               END DO
1439            END DO
1440         END DO
1441
1442      CASE ( 1 )                ! horizontal average
1443         IF(lwp) WRITE(numout,*) '          horizontal average on avt, avmu, avmv'
1444         ! weighting mean arrays etmean, eumean and evmean
1445         !           ( 1/2  1  1/2 )              ( 1/2  1/2 )             ( 1/2  1  1/2 )
1446         ! avt = 1/8 ( 1    2  1   )   avmu = 1/4 ( 1    1   )   avmv= 1/4 ( 1/2  1  1/2 )
1447         !           ( 1/2  1  1/2 )              ( 1/2  1/2 )
1448         etmean(:,:,:) = 0.e0
1449         eumean(:,:,:) = 0.e0
1450         evmean(:,:,:) = 0.e0
1451         
1452         DO jk = 1, jpkm1
1453            DO jj = 2, jpjm1
1454               DO ji = fs_2, fs_jpim1   ! vector opt.
1455                  etmean(ji,jj,jk) = tmask(ji, jj,jk)                           &
1456                     & / MAX( 1., 2.* tmask(ji,jj,jk)                           &
1457                     &      +.5 * ( tmask(ji-1,jj+1,jk) + tmask(ji-1,jj-1,jk)   &
1458                     &             +tmask(ji+1,jj+1,jk) + tmask(ji+1,jj-1,jk) ) &
1459                     &      +1. * ( tmask(ji-1,jj  ,jk) + tmask(ji  ,jj+1,jk)   &
1460                     &             +tmask(ji  ,jj-1,jk) + tmask(ji+1,jj  ,jk) ) )
1461                 
1462                  eumean(ji,jj,jk) = umask(ji,jj,jk)                        &
1463                     &  / MAX( 1.,   tmask(ji,jj  ,jk) + tmask(ji+1,jj  ,jk)   &
1464                     &       +.5 * ( tmask(ji,jj-1,jk) + tmask(ji+1,jj-1,jk)   &
1465                     &              +tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) )  )
1466                 
1467                  evmean(ji,jj,jk) = vmask(ji,jj,jk)                        &
1468                     &  / MAX( 1.,   tmask(ji  ,jj,jk) + tmask(ji  ,jj+1,jk)   &
1469                     &       +.5 * ( tmask(ji-1,jj,jk) + tmask(ji-1,jj+1,jk)   &
1470                     &              +tmask(ji+1,jj,jk) + tmask(ji+1,jj+1,jk) )  )
1471               END DO
1472            END DO
1473         END DO
1474
1475      CASE DEFAULT
1476         WRITE(ctmp1,*) '          bad flag value for nn_ave = ', nn_ave
1477         CALL ctl_stop( ctmp1 )
1478
1479      END SELECT
1480 
1481      ! Initialization of vertical eddy coef. to the background value
1482      ! -------------------------------------------------------------
1483      DO jk = 1, jpk
1484         avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)
1485         avmu(:,:,jk) = avmb(jk) * umask(:,:,jk)
1486         avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk)
1487      END DO
1488
1489      ! zero the surface flux for non local term and kpp mixed layer depth
1490      ! ------------------------------------------------------------------
1491      ghats(:,:,:) = 0.
1492      wt0  (:,:  ) = 0.
1493      ws0  (:,:  ) = 0.
1494      hkpp (:,:  ) = 0. ! just a diagnostic (not essential)
1495
1496#if ! defined key_kppcustom
1497      ! compute arrays (del, wz) for reference mean values
1498      ! (increase speed for vectorization key_kppcustom not defined)
1499      del(1:jpk, 1:jpk) = 0.
1500      DO jk = 1, jpk
1501         zref = epsilon * fsdept(1,1,jk)   
1502         DO jm = 1 , jpk
1503            zdist = zref - fsdepw(1,1,jm)   
1504            IF( zdist > 0.  ) THEN
1505               del(jk,jm) = MIN( zdist, fse3t(1,1,jm) ) / zref   
1506            ELSE
1507               del(jk,jm) = 0.
1508            ENDIF
1509         ENDDO
1510      ENDDO
1511#endif
1512
1513#if defined key_kpplktb
1514      ! build lookup table for turbulent velocity scales
1515      dezehat = ( dehatmax - dehatmin ) / nilktbm1
1516      deustar = ( ustmax   - ustmin   ) / njlktbm1
1517 
1518      DO jj = 1, njlktb
1519         zustar = ( jj - 1) * deustar + ustmin
1520         zustvk = vonk * zustar 
1521         zucube = zustar * zustar * zustar 
1522         DO ji = 1 , nilktb
1523            zehat = ( ji - 1 ) * dezehat + dehatmin
1524            zeta   = zehat / ( zucube + epsln )
1525            IF( zehat >= 0 ) THEN             ! Stable case
1526               wmlktb(ji,jj) = zustvk / ABS( 1.0 + rconc1 * zeta + epsln )                       
1527               wslktb(ji,jj) = wmlktb(ji,jj)
1528            ELSE                                ! Unstable case
1529               IF( zeta > rzetam ) THEN
1530                  wmlktb(ji,jj) = zustvk * ABS( 1.0    - rconc2 * zeta )**pfourth
1531               ELSE
1532                  wmlktb(ji,jj) = zustvk * ABS( rconam - rconcm * zeta )**pthird
1533               ENDIF
1534               
1535               IF( zeta > rzetas ) THEN
1536                  wslktb(ji,jj) = zustvk * SQRT( ABS( 1.0 - rconc2 * zeta ) )
1537               ELSE
1538                  wslktb(ji,jj) = zustvk * ABS( rconas - rconcs * zeta )**pthird
1539               ENDIF
1540            ENDIF
1541         END DO
1542      END DO
1543#endif
1544   END SUBROUTINE zdf_kpp_init
1545
1546#else
1547   !!----------------------------------------------------------------------
1548   !!   Dummy module :                                        NO KPP scheme
1549   !!----------------------------------------------------------------------
1550   LOGICAL, PUBLIC, PARAMETER ::   lk_zdfkpp = .FALSE.   !: KPP flag
1551CONTAINS
1552   SUBROUTINE zdf_kpp( kt )          ! Empty routine
1553      WRITE(*,*) 'zdf_kpp: You should not have seen this print! error?', kt
1554   END SUBROUTINE zdf_kpp
1555   SUBROUTINE tra_kpp( kt )          ! Empty routine
1556      WRITE(*,*) 'tra_kpp: You should not have seen this print! error?', kt
1557   END SUBROUTINE tra_kpp
1558#endif
1559
1560   !!======================================================================
1561END MODULE zdfkpp
Note: See TracBrowser for help on using the repository browser.