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 branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfkpp.F90 @ 3318

Last change on this file since 3318 was 3318, checked in by gm, 12 years ago

Ediag branche: #927 split TRA/DYN trd computation

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