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

source: trunk/NEMO/OPA_SRC/ZDF/zdftke.F90 @ 1671

Last change on this file since 1671 was 1662, checked in by rblod, 15 years ago

Correction of major bug on bottom friction, see ticket #233

File size: 41.7 KB
Line 
1MODULE zdftke
2   !!======================================================================
3   !!                       ***  MODULE  zdftke  ***
4   !! Ocean physics:  vertical mixing coefficient computed from the tke
5   !!                 turbulent closure parameterization
6   !!=====================================================================
7   !! History :  OPA  !  1991-03  (b. blanke)  Original code
8   !!            7.0  !  1991-11  (G. Madec)   bug fix
9   !!            7.1  !  1992-10  (G. Madec)   new mixing length and eav
10   !!            7.2  !  1993-03  (M. Guyon)   symetrical conditions
11   !!            7.3  !  1994-08  (G. Madec, M. Imbard)  nn_pdl flag
12   !!            7.5  !  1996-01  (G. Madec)   s-coordinates
13   !!            8.0  !  1997-07  (G. Madec)   lbc
14   !!            8.1  !  1999-01  (E. Stretta) new option for the mixing length
15   !!  NEMO      1.0  !  2002-06  (G. Madec) add tke_init routine
16   !!             -   !  2004-10  (C. Ethe )  1D configuration
17   !!            2.0  !  2006-07  (S. Masson)  distributed restart using iom
18   !!            3.0  !  2008-05  (C. Ethe,  G.Madec) : update TKE physics:
19   !!                 !           - tke penetration (wind steering)
20   !!                 !           - suface condition for tke & mixing length
21   !!                 !           - Langmuir cells
22   !!             -   !  2008-05  (J.-M. Molines, G. Madec)  2D form of avtb
23   !!             -   !  2008-06  (G. Madec)  style + DOCTOR name for namelist parameters
24   !!             -   !  2008-12  (G. Reffray) stable discretization of the production term
25   !!            3.2  !  2009-06  (G. Madec, S. Masson) TKE restart compatible with key_cpl
26   !!                 !                                + cleaning of the parameters + bugs correction
27   !!----------------------------------------------------------------------
28#if defined key_zdftke   ||   defined key_esopa
29   !!----------------------------------------------------------------------
30   !!   'key_zdftke'                                   TKE vertical physics
31   !!----------------------------------------------------------------------
32   !!   zdf_tke       : update momentum and tracer Kz from a tke scheme
33   !!   tke_tke       : tke time stepping: update tke at now time step (en)
34   !!   tke_avn       : compute mixing length scale and deduce avm and avt
35   !!   tke_init      : initialization, namelist read, and parameters control
36   !!   tke_rst       : read/write tke restart in ocean restart file
37   !!----------------------------------------------------------------------
38   USE oce            ! ocean dynamics and active tracers
39   USE dom_oce        ! ocean space and time domain
40   USE domvvl         ! ocean space and time domain : variable volume layer
41   USE zdf_oce        ! ocean vertical physics
42   USE sbc_oce        ! surface boundary condition: ocean
43   USE phycst         ! physical constants
44   USE zdfmxl         ! mixed layer
45   USE restart        ! only for lrst_oce
46   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
47   USE prtctl         ! Print control
48   USE in_out_manager ! I/O manager
49   USE iom            ! I/O manager library
50   USE zdfbfr          ! bottom friction
51
52   IMPLICIT NONE
53   PRIVATE
54
55   PUBLIC   zdf_tke    ! routine called in step module
56   PUBLIC   tke_rst    ! routine called in step module
57
58   LOGICAL , PUBLIC, PARAMETER              ::   lk_zdftke = .TRUE.  !: TKE vertical mixing flag
59
60#if defined key_c1d
61   !                                                                !!* 1D cfg only *
62   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   e_dis, e_mix        !: dissipation and mixing turbulent lengh scales
63   REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) ::   e_pdl, e_ric        !: prandl and local Richardson numbers
64#endif
65
66   !                                       !!! ** Namelist  namzdf_tke  **
67   LOGICAL  ::   ln_mxl0  = .FALSE.         ! mixing length scale surface value as function of wind stress or not
68   INTEGER  ::   nn_mxl   =  2              ! type of mixing length (=0/1/2/3)
69   REAL(wp) ::   rn_lmin0 = 0.4_wp          ! surface  min value of mixing length   [m]
70   REAL(wp) ::   rn_lmin  = 0.1_wp          ! interior min value of mixing length   [m]
71   INTEGER  ::   nn_pdl   =  1              ! Prandtl number or not (ratio avt/avm) (=0/1)
72   REAL(wp) ::   rn_ediff = 0.1_wp          ! coefficient for avt: avt=rn_ediff*mxl*sqrt(e)
73   REAL(wp) ::   rn_ediss = 0.7_wp          ! coefficient of the Kolmogoroff dissipation
74   REAL(wp) ::   rn_ebb   = 3.75_wp         ! coefficient of the surface input of tke
75   REAL(wp) ::   rn_emin  = 0.7071e-6_wp    ! minimum value of tke           [m2/s2]
76   REAL(wp) ::   rn_emin0 = 1.e-4_wp        ! surface minimum value of tke   [m2/s2]
77   REAL(wp) ::   rn_bshear= 1.e-20          ! background shear (>0)
78   INTEGER  ::   nn_etau  = 0               ! type of depth penetration of surface tke (=0/1/2)
79   INTEGER  ::   nn_htau  = 0               ! type of tke profile of penetration (=0/1)
80   REAL(wp) ::   rn_efr   = 1.0_wp          ! fraction of TKE surface value which penetrates in the ocean
81   LOGICAL  ::   ln_lc    = .FALSE.         ! Langmuir cells (LC) as a source term of TKE or not
82   REAL(wp) ::   rn_lc    = 0.15_wp         ! coef to compute vertical velocity of Langmuir cells
83
84   REAL(wp) ::   ri_cri   ! critic Richardson number (deduced from rn_ediff and rn_ediss values)
85
86   REAL(wp), DIMENSION(jpi,jpj)     ::   htau      ! depth of tke penetration (nn_htau)
87   REAL(wp), DIMENSION(jpi,jpj,jpk) ::   en        ! now turbulent kinetic energy   [m2/s2]
88   REAL(wp), DIMENSION(jpi,jpj,jpk) ::   dissl     ! now mixing lenght of dissipation
89
90   !! * Substitutions
91#  include "domzgr_substitute.h90"
92#  include "vectopt_loop_substitute.h90"
93   !!----------------------------------------------------------------------
94   !! NEMO/OPA 3.2 , LOCEAN-IPSL (2009)
95   !! $Id: zdftke2.F90 1201 2008-09-24 13:24:21Z rblod $
96   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
97   !!----------------------------------------------------------------------
98
99CONTAINS
100
101   SUBROUTINE zdf_tke( kt )
102      !!----------------------------------------------------------------------
103      !!                   ***  ROUTINE zdf_tke  ***
104      !!
105      !! ** Purpose :   Compute the vertical eddy viscosity and diffusivity
106      !!              coefficients using a turbulent closure scheme (TKE).
107      !!
108      !! ** Method  :   The time evolution of the turbulent kinetic energy (tke)
109      !!              is computed from a prognostic equation :
110      !!         d(en)/dt = avm (d(u)/dz)**2             ! shear production
111      !!                  + d( avm d(en)/dz )/dz         ! diffusion of tke
112      !!                  + avt N^2                      ! stratif. destruc.
113      !!                  - rn_ediss / emxl en**(2/3)    ! Kolmogoroff dissipation
114      !!      with the boundary conditions:
115      !!         surface: en = max( rn_emin0, rn_ebb sqrt(utau^2 + vtau^2) )
116      !!         bottom : en = rn_emin
117      !!      The associated critical Richardson number is: ri_cri = 2/(2+rn_ediss/rn_ediff)
118      !!
119      !!        The now Turbulent kinetic energy is computed using the following
120      !!      time stepping: implicit for vertical diffusion term, linearized semi
121      !!      implicit for kolmogoroff dissipation term, and explicit forward for
122      !!      both buoyancy and shear production terms. Therefore a tridiagonal
123      !!      linear system is solved. Note that buoyancy and shear terms are
124      !!      discretized in a energy conserving form (Bruchard 2002).
125      !!
126      !!        The dissipative and mixing length scale are computed from en and
127      !!      the stratification (see tke_avn)
128      !!
129      !!        The now vertical eddy vicosity and diffusivity coefficients are
130      !!      given by:
131      !!              avm = max( avtb, rn_ediff * zmxlm * en^1/2 )
132      !!              avt = max( avmb, pdl * avm                 ) 
133      !!              eav = max( avmb, avm )
134      !!      where pdl, the inverse of the Prandtl number is 1 if nn_pdl=0 and
135      !!      given by an empirical funtion of the localRichardson number if nn_pdl=1
136      !!
137      !! ** Action  :   compute en (now turbulent kinetic energy)
138      !!                update avt, avmu, avmv (before vertical eddy coef.)
139      !!
140      !! References : Gaspar et al., JGR, 1990,
141      !!              Blanke and Delecluse, JPO, 1991
142      !!              Mellor and Blumberg, JPO 2004
143      !!              Axell, JGR, 2002
144      !!              Bruchard OM 2002
145      !!----------------------------------------------------------------------
146      INTEGER, INTENT(in) ::   kt   ! ocean time step
147      !!----------------------------------------------------------------------
148      !
149      IF( kt == nit000 )   CALL tke_init     ! initialisation
150                           !
151                           CALL tke_tke      ! now tke (en)
152                           !
153                           CALL tke_avn      ! now avt, avm, avmu, avmv
154      !
155   END SUBROUTINE zdf_tke
156
157
158   SUBROUTINE tke_tke
159      !!----------------------------------------------------------------------
160      !!                   ***  ROUTINE tke_tke  ***
161      !!
162      !! ** Purpose :   Compute the now Turbulente Kinetic Energy (TKE)
163      !!
164      !! ** Method  : - TKE surface boundary condition
165      !!              - source term due to Langmuir cells (ln_lc=T)
166      !!              - source term due to shear (saved in avmu, avmv arrays)
167      !!              - Now TKE : resolution of the TKE equation by inverting
168      !!                a tridiagonal linear system by a "methode de chasse"
169      !!              - increase TKE due to surface and internal wave breaking
170      !!
171      !! ** Action  : - en : now turbulent kinetic energy)
172      !!              - avmu, avmv : production of TKE by shear at u and v-points
173      !!                (= Kz dz[Ub] * dz[Un] )
174      !! ---------------------------------------------------------------------
175      USE oce,   zdiag  =>   ua   ! use ua as workspace
176      USE oce,   zd_up  =>   va   ! use va as workspace
177      USE oce,   zd_lw  =>   ta   ! use ta as workspace
178      !!
179      INTEGER  ::   ji, jj, jk                ! dummy loop arguments
180      REAL(wp) ::   zbbrau, zesurf, zesh2     ! temporary scalars
181      REAL(wp) ::   zfact1, zfact2, zfact3    !    -         -
182      REAL(wp) ::   ztx2  , zty2  , zcof      !    -         -
183      REAL(wp) ::   zus   , zwlc  , zind      !    -         -
184      REAL(wp) ::   zzd_up, zzd_lw            !    -         -
185      INTEGER  ::   ikbu, ikbv, ikbum1, ikbvm1      ! temporary scalar
186      INTEGER  ::   ikbt, ikbumm1, ikbvmm1          ! temporary scalar
187      REAL(wp) ::   zebot                           ! temporary scalars
188      INTEGER , DIMENSION(jpi,jpj)     ::   imlc    ! 2D workspace
189      REAL(wp), DIMENSION(jpi,jpj)     ::   zhlc    !  -      -
190      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpelc   ! 3D workspace
191      !!--------------------------------------------------------------------
192      !
193      zbbrau =  .5 * rn_ebb / rau0       ! Local constant initialisation
194      zfact1 = -.5 * rdt 
195      zfact2 = 1.5 * rdt * rn_ediss
196      zfact3 = 0.5       * rn_ediss
197      !
198      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
199      !                     !  Surface boundary condition on tke
200      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
201!CDIR NOVERRCHK
202      DO jj = 2, jpjm1         ! en(1)   = rn_ebb sqrt(utau^2+vtau^2) / rau0  (min value rn_emin0)
203!CDIR NOVERRCHK
204         DO ji = fs_2, fs_jpim1   ! vector opt.
205            ztx2   = utau(ji-1,jj  ) + utau(ji,jj)
206            zty2   = vtau(ji  ,jj-1) + vtau(ji,jj)
207            zesurf = zbbrau * SQRT( ztx2 * ztx2 + zty2 * zty2 )
208            en(ji,jj,1) = MAX( zesurf, rn_emin0 ) * tmask(ji,jj,1)
209         END DO
210      END DO
211      !
212      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
213      !                     !  Bottom boundary condition on tke
214      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
215      !                     en(bot)   = 0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin)
216!CDIR NOVERRCHK
217      DO jj = 2, jpjm1
218!CDIR NOVERRCHK
219         DO ji = fs_2, fs_jpim1   ! vector opt.
220            ikbu = MIN( mbathy(ji+1,jj), mbathy(ji,jj) )
221            ikbv = MIN( mbathy(ji,jj+1), mbathy(ji,jj) )
222            ikbum1 = MAX( ikbu-1, 1 )
223            ikbvm1 = MAX( ikbv-1, 1 )
224            ikbu = MIN( mbathy(ji,jj), mbathy(ji-1,jj) )
225            ikbv = MIN( mbathy(ji,jj), mbathy(ji,jj-1) )
226            ikbumm1 = MAX( ikbu-1, 1 )
227            ikbvmm1 = MAX( ikbv-1, 1 )
228            ikbt = MAX( mbathy(ji,jj), 1 )
229            ztx2 = bfrua(ji-1,jj) * fse3u(ji-1,jj  ,ikbumm1) + &
230                   bfrua(ji  ,jj) * fse3u(ji  ,jj  ,ikbum1 )
231            zty2 = bfrva(ji,jj  ) * fse3v(ji  ,jj  ,ikbvm1) + &
232                   bfrva(ji,jj-1) * fse3v(ji  ,jj-1,ikbvmm1 )
233            zebot = 0.25_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 )
234            en (ji,jj,ikbt) = MAX( zebot, rn_emin ) * tmask(ji,jj,1)
235         END DO
236      END DO
237      !
238      !
239      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
240      IF( ln_lc ) THEN      !  Langmuir circulation source term added to tke
241         !                  !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
242         !
243         !                        !* total energy produce by LC : cumulative sum over jk
244         zpelc(:,:,1) =  MAX( rn2b(:,:,1), 0. ) * fsdepw(:,:,1) * fse3w(:,:,1)
245         DO jk = 2, jpk
246            zpelc(:,:,jk)  = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0. ) * fsdepw(:,:,jk) * fse3w(:,:,jk)
247         END DO
248         !                        !* finite Langmuir Circulation depth
249         imlc(:,:) = mbathy(:,:)         ! Initialization to the number of w ocean point mbathy
250         DO jk = jpkm1, 2, -1
251            DO jj = 1, jpj               ! Last w-level at which zpelc>=0.5*us*us
252               DO ji = 1, jpi            !      with us=0.016*wind(starting from jpk-1)
253                  zus  = 0.000128 * wndm(ji,jj) * wndm(ji,jj)
254                  IF( zpelc(ji,jj,jk) > zus )   imlc(ji,jj) = jk
255               END DO
256            END DO
257         END DO
258         !                               ! finite LC depth
259# if defined key_vectopt_loop
260         DO jj = 1, 1
261            DO ji = 1, jpij   ! vector opt. (forced unrolling)
262# else
263         DO jj = 1, jpj 
264            DO ji = 1, jpi
265# endif
266               zhlc(ji,jj) = fsdepw(ji,jj,imlc(ji,jj))
267            END DO
268         END DO
269# if defined key_c1d
270         hlc(:,:) = zhlc(:,:) * tmask(:,:,1)      ! c1d configuration: save finite Langmuir Circulation depth
271# endif
272!CDIR NOVERRCHK
273         DO jk = 2, jpkm1         !* TKE Langmuir circulation source term added to en
274!CDIR NOVERRCHK
275            DO jj = 2, jpjm1
276!CDIR NOVERRCHK
277               DO ji = fs_2, fs_jpim1   ! vector opt.
278!!gm replace here wndn by a formulation with the stress module
279                  zus  = 0.016 * wndm(ji,jj)                  ! Stokes drift
280                  !                                           ! vertical velocity due to LC
281                  zind = 0.5 - SIGN( 0.5, fsdepw(ji,jj,jk) - zhlc(ji,jj) )
282                  zwlc = zind * rn_lc * zus * SIN( rpi * fsdepw(ji,jj,jk) / zhlc(ji,jj) )
283                  !                                           ! TKE Langmuir circulation source term
284                  en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) * tmask(ji,jj,jk)
285               END DO
286            END DO
287         END DO
288         !
289      ENDIF
290      !
291      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
292      !                     !  Now Turbulent kinetic energy (output in en)
293      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
294      !                     ! Resolution of a tridiagonal linear system by a "methode de chasse"
295      !                     ! computation from level 2 to jpkm1  (e(1) already computed and e(jpk)=0 ).
296      !                     ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal
297      !
298      DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form)
299         DO jj = 1, jpj                 ! here avmu, avmv used as workspace
300            DO ji = 1, jpi
301               avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) )   &
302                  &                            * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) )   & 
303                  &           / (  fse3uw_n(ji,jj,jk)         &
304                  &              * fse3uw_b(ji,jj,jk) )
305               avmv(ji,jj,jk) = avmv(ji,jj,jk) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) )   &
306                  &                            * ( vb(ji,jj,jk-1) - vb(ji,jj,jk) )   &
307                  &                            / (  fse3vw_n(ji,jj,jk)               &
308                  &                              *  fse3vw_b(ji,jj,jk)  )
309            END DO
310         END DO
311      END DO
312      !
313      DO jk = 2, jpkm1           !* Matrix and right hand side in en
314         DO jj = 2, jpjm1
315            DO ji = fs_2, fs_jpim1   ! vector opt.
316               zcof   = zfact1 * tmask(ji,jj,jk)
317               zzd_up = zcof * ( avm  (ji,jj,jk+1) + avm  (ji,jj,jk  ) )   &  ! upper diagonal
318                  &          / ( fse3t(ji,jj,jk  ) * fse3w(ji,jj,jk  ) )
319               zzd_lw = zcof * ( avm  (ji,jj,jk  ) + avm  (ji,jj,jk-1) )   &  ! lower diagonal
320                  &          / ( fse3t(ji,jj,jk-1) * fse3w(ji,jj,jk  ) )
321                  !                                                           ! shear prod. at w-point weightened by mask
322               zesh2  =  ( avmu(ji-1,jj,jk) + avmu(ji,jj,jk) ) / MAX( 1.e0 , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   &
323                  &    + ( avmv(ji,jj-1,jk) + avmv(ji,jj,jk) ) / MAX( 1.e0 , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )   
324                  !
325               zd_up(ji,jj,jk) = zzd_up            ! Matrix (zdiag, zd_up, zd_lw)
326               zd_lw(ji,jj,jk) = zzd_lw
327               zdiag(ji,jj,jk) = 1.e0 - zzd_lw - zzd_up + zfact2 * dissl(ji,jj,jk) * tmask(ji,jj,jk)
328               !
329               !                                   ! right hand side in en
330               en(ji,jj,jk) = en(ji,jj,jk) + rdt * (  zesh2  -   avt(ji,jj,jk) * rn2(ji,jj,jk)    &
331                  &                                 + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk)  ) * tmask(ji,jj,jk)
332            END DO
333         END DO
334      END DO
335      !                          !* Matrix inversion from level 2 (tke prescribed at level 1)
336      DO jk = 3, jpkm1                             ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1
337         DO jj = 2, jpjm1
338            DO ji = fs_2, fs_jpim1    ! vector opt.
339               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1)
340            END DO
341         END DO
342      END DO
343      DO jj = 2, jpjm1                             ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1
344         DO ji = fs_2, fs_jpim1    ! vector opt.
345            zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1)    ! Surface boudary conditions on tke
346         END DO
347      END DO
348      DO jk = 3, jpkm1
349         DO jj = 2, jpjm1
350            DO ji = fs_2, fs_jpim1    ! vector opt.
351               zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1)
352            END DO
353         END DO
354      END DO
355      DO jj = 2, jpjm1                             ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk
356         DO ji = fs_2, fs_jpim1    ! vector opt.
357            en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1)
358         END DO
359      END DO
360      DO jk = jpk-2, 2, -1
361         DO jj = 2, jpjm1
362            DO ji = fs_2, fs_jpim1    ! vector opt.
363               en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk)
364            END DO
365         END DO
366      END DO
367      DO jk = 2, jpkm1                             ! set the minimum value of tke
368         DO jj = 2, jpjm1
369            DO ji = fs_2, fs_jpim1   ! vector opt.
370               en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * tmask(ji,jj,jk)
371            END DO
372         END DO
373      END DO
374
375      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
376      !                            !  TKE due to surface and internal wave breaking
377      !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
378      IF( nn_etau == 1 ) THEN           !*  penetration throughout the water column
379         DO jk = 2, jpkm1
380            DO jj = 2, jpjm1
381               DO ji = fs_2, fs_jpim1   ! vector opt.
382                  en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) )   &
383                     &                                               * ( 1.e0 - fr_i(ji,jj) )  * tmask(ji,jj,jk)
384               END DO
385            END DO
386         END DO
387      ELSEIF( nn_etau == 2 ) THEN       !* act only at the base of the mixed layer (jk=nmln)
388         DO jj = 2, jpjm1
389            DO ji = fs_2, fs_jpim1   ! vector opt.
390               jk = nmln(ji,jj)
391               en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) )   &
392                  &                                               * ( 1.e0 - fr_i(ji,jj) )  * tmask(ji,jj,jk)
393            END DO
394         END DO
395      ENDIF
396      !
397      CALL lbc_lnk( en, 'W', 1. )      ! Lateral boundary conditions (sign unchanged)
398      !
399   END SUBROUTINE tke_tke
400
401
402   SUBROUTINE tke_avn
403      !!----------------------------------------------------------------------
404      !!                   ***  ROUTINE tke_avn  ***
405      !!
406      !! ** Purpose :   Compute the vertical eddy viscosity and diffusivity
407      !!
408      !! ** Method  :   At this stage, en, the now TKE, is known (computed in
409      !!              the tke_tke routine). First, the now mixing lenth is
410      !!      computed from en and the strafification (N^2), then the mixings
411      !!      coefficients are computed.
412      !!              - Mixing length : a first evaluation of the mixing lengh
413      !!      scales is:
414      !!                      mxl = sqrt(2*en) / N 
415      !!      where N is the brunt-vaisala frequency, with a minimum value set
416      !!      to rn_lmin (rn_lmin0) in the interior (surface) ocean.
417      !!        The mixing and dissipative length scale are bound as follow :
418      !!         nn_mxl=0 : mxl bounded by the distance to surface and bottom.
419      !!                        zmxld = zmxlm = mxl
420      !!         nn_mxl=1 : mxl bounded by the e3w and zmxld = zmxlm = mxl
421      !!         nn_mxl=2 : mxl bounded such that the vertical derivative of mxl is
422      !!                    less than 1 (|d/dz(mxl)|<1) and zmxld = zmxlm = mxl
423      !!         nn_mxl=3 : mxl is bounded from the surface to the bottom usings
424      !!                    |d/dz(xml)|<1 to obtain lup, and from the bottom to
425      !!                    the surface to obtain ldown. the resulting length
426      !!                    scales are:
427      !!                        zmxld = sqrt( lup * ldown )
428      !!                        zmxlm = min ( lup , ldown )
429      !!              - Vertical eddy viscosity and diffusivity:
430      !!                      avm = max( avtb, rn_ediff * zmxlm * en^1/2 )
431      !!                      avt = max( avmb, pdlr * avm ) 
432      !!      with pdlr=1 if nn_pdl=0, pdlr=1/pdl=F(Ri) otherwise.
433      !!
434      !! ** Action  : - avt : now vertical eddy diffusivity (w-point)
435      !!              - avmu, avmv : now vertical eddy viscosity at uw- and vw-points
436      !!----------------------------------------------------------------------
437      USE oce,     zmpdl  =>   ua   ! use ua as workspace
438      USE oce,     zmxlm  =>   va   ! use va as workspace
439      USE oce,     zmxld  =>   ta   ! use ta as workspace
440      !!
441      INTEGER  ::   ji, jj, jk            ! dummy loop arguments
442      REAL(wp) ::   zrn2, zraug           ! temporary scalars
443      REAL(wp) ::   ztx2, zdku            !    -         -
444      REAL(wp) ::   zty2, zdkv            !    -         -
445      REAL(wp) ::   zcoef, zav            !    -         -
446      REAL(wp) ::   zpdlr, zri, zsqen     !    -         -
447      REAL(wp) ::   zemxl, zemlm, zemlp   !    -         -
448      !!--------------------------------------------------------------------
449
450      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
451      !                     !  Mixing length
452      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
453      !
454      !                     !* Buoyancy length scale: l=sqrt(2*e/n**2)
455      !
456      IF( ln_mxl0 ) THEN         ! surface mixing length = F(stress) : l=vkarmn*2.e5*sqrt(utau^2 + vtau^2)/(rau0*g)
457!!gm  this should be useless
458         zmxlm(:,:,1) = 0.e0
459!!gm end
460         zraug = 0.5 * vkarmn * 2.e5 / ( rau0 * grav )
461         DO jj = 2, jpjm1
462!CDIR NOVERRCHK
463            DO ji = fs_2, fs_jpim1   ! vector opt.
464               ztx2 = utau(ji-1,jj  ) + utau(ji,jj)
465               zty2 = vtau(ji  ,jj-1) + vtau(ji,jj)
466               zmxlm(ji,jj,1) = MAX(  rn_lmin0,  zraug * SQRT( ztx2 * ztx2 + zty2 * zty2 )  )
467            END DO
468         END DO
469      ELSE                       ! surface set to the minimum value
470         zmxlm(:,:,1) = rn_lmin0
471      ENDIF
472      zmxlm(:,:,jpk) = rn_lmin   ! bottom set to the interior minium value
473      !
474!CDIR NOVERRCHK
475      DO jk = 2, jpkm1           ! interior value : l=sqrt(2*e/n**2)
476!CDIR NOVERRCHK
477         DO jj = 2, jpjm1
478!CDIR NOVERRCHK
479            DO ji = fs_2, fs_jpim1   ! vector opt.
480               zrn2 = MAX( rn2(ji,jj,jk), rsmall )
481               zmxlm(ji,jj,jk) = MAX(  rn_lmin,  SQRT( 2. * en(ji,jj,jk) / zrn2 )  )
482            END DO
483         END DO
484      END DO
485      !
486!!gm  CAUTION: to be added here the bottom boundary condition on zmxlm
487      !
488      !                     !* Physical limits for the mixing length
489      !
490      zmxld(:,:, 1 ) = zmxlm(:,:,1)   ! surface set to the minimum value
491      zmxld(:,:,jpk) = rn_lmin        ! bottom  set to the minimum value
492      !
493      SELECT CASE ( nn_mxl )
494      !
495      CASE ( 0 )           ! bounded by the distance to surface and bottom
496         DO jk = 2, jpkm1
497            DO jj = 2, jpjm1
498               DO ji = fs_2, fs_jpim1   ! vector opt.
499                  zemxl = MIN( fsdepw(ji,jj,jk), zmxlm(ji,jj,jk),   &
500                  &            fsdepw(ji,jj,mbathy(ji,jj)) - fsdepw(ji,jj,jk) )
501                  zmxlm(ji,jj,jk) = zemxl
502                  zmxld(ji,jj,jk) = zemxl
503               END DO
504            END DO
505         END DO
506         !
507      CASE ( 1 )           ! bounded by the vertical scale factor
508         DO jk = 2, jpkm1
509            DO jj = 2, jpjm1
510               DO ji = fs_2, fs_jpim1   ! vector opt.
511                  zemxl = MIN( fse3w(ji,jj,jk), zmxlm(ji,jj,jk) )
512                  zmxlm(ji,jj,jk) = zemxl
513                  zmxld(ji,jj,jk) = zemxl
514               END DO
515            END DO
516         END DO
517         !
518      CASE ( 2 )           ! |dk[xml]| bounded by e3t :
519         DO jk = 2, jpkm1         ! from the surface to the bottom :
520            DO jj = 2, jpjm1
521               DO ji = fs_2, fs_jpim1   ! vector opt.
522                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + fse3t(ji,jj,jk-1), zmxlm(ji,jj,jk) )
523               END DO
524            END DO
525         END DO
526         DO jk = jpkm1, 2, -1     ! from the bottom to the surface :
527            DO jj = 2, jpjm1
528               DO ji = fs_2, fs_jpim1   ! vector opt.
529                  zemxl = MIN( zmxlm(ji,jj,jk+1) + fse3t(ji,jj,jk+1), zmxlm(ji,jj,jk) )
530                  zmxlm(ji,jj,jk) = zemxl
531                  zmxld(ji,jj,jk) = zemxl
532               END DO
533            END DO
534         END DO
535         !
536      CASE ( 3 )           ! lup and ldown, |dk[xml]| bounded by e3t :
537         DO jk = 2, jpkm1         ! from the surface to the bottom : lup
538            DO jj = 2, jpjm1
539               DO ji = fs_2, fs_jpim1   ! vector opt.
540                  zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + fse3t(ji,jj,jk-1), zmxlm(ji,jj,jk) )
541               END DO
542            END DO
543         END DO
544         DO jk = jpkm1, 2, -1     ! from the bottom to the surface : ldown
545            DO jj = 2, jpjm1
546               DO ji = fs_2, fs_jpim1   ! vector opt.
547                  zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + fse3t(ji,jj,jk+1), zmxlm(ji,jj,jk) )
548               END DO
549            END DO
550         END DO
551!CDIR NOVERRCHK
552         DO jk = 2, jpkm1
553!CDIR NOVERRCHK
554            DO jj = 2, jpjm1
555!CDIR NOVERRCHK
556               DO ji = fs_2, fs_jpim1   ! vector opt.
557                  zemlm = MIN ( zmxld(ji,jj,jk),  zmxlm(ji,jj,jk) )
558                  zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) )
559                  zmxlm(ji,jj,jk) = zemlm
560                  zmxld(ji,jj,jk) = zemlp
561               END DO
562            END DO
563         END DO
564         !
565      END SELECT
566      !
567# if defined key_c1d
568      e_dis(:,:,:) = zmxld(:,:,:)      ! c1d configuration : save mixing and dissipation turbulent length scales
569      e_mix(:,:,:) = zmxlm(:,:,:)
570# endif
571
572      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
573      !                     !  Vertical eddy viscosity and diffusivity  (avmu, avmv, avt)
574      !                     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
575!CDIR NOVERRCHK
576      DO jk = 1, jpkm1            !* vertical eddy viscosity & diffivity at w-points
577!CDIR NOVERRCHK
578         DO jj = 2, jpjm1
579!CDIR NOVERRCHK
580            DO ji = fs_2, fs_jpim1   ! vector opt.
581               zsqen = SQRT( en(ji,jj,jk) )
582               zav   = rn_ediff * zmxlm(ji,jj,jk) * zsqen
583               avm  (ji,jj,jk) = MAX( zav,                  avmb(jk) ) * tmask(ji,jj,jk)
584               avt  (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk)
585               dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk)
586            END DO
587         END DO
588      END DO
589      CALL lbc_lnk( avm, 'W', 1. )      ! Lateral boundary conditions (sign unchanged)
590      !
591      DO jk = 2, jpkm1            !* vertical eddy viscosity at u- and v-points
592         DO jj = 2, jpjm1
593            DO ji = fs_2, fs_jpim1   ! vector opt.
594               avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj  ,jk) ) * umask(ji,jj,jk)
595               avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji  ,jj+1,jk) ) * vmask(ji,jj,jk)
596            END DO
597         END DO
598      END DO
599      CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )      ! Lateral boundary conditions
600      !
601      IF( nn_pdl == 1 ) THEN      !* Prandtl number case: update avt
602         DO jk = 2, jpkm1
603            DO jj = 2, jpjm1
604               DO ji = fs_2, fs_jpim1   ! vector opt.
605                  zcoef = 0.5 / ( fse3w(ji,jj,jk) * fse3w(ji,jj,jk) )
606                  !                                          ! shear
607                  zdku = avmu(ji-1,jj,jk) * ( un(ji-1,jj,jk-1) - un(ji-1,jj,jk) ) * ( ub(ji-1,jj,jk-1) - ub(ji-1,jj,jk) )   &
608                    &  + avmu(ji  ,jj,jk) * ( un(ji  ,jj,jk-1) - un(ji  ,jj,jk) ) * ( ub(ji  ,jj,jk-1) - ub(ji  ,jj,jk) )
609                  zdkv = avmv(ji,jj-1,jk) * ( vn(ji,jj-1,jk-1) - vn(ji,jj-1,jk) ) * ( vb(ji,jj-1,jk-1) - vb(ji,jj-1,jk) )   &
610                    &  + avmv(ji,jj  ,jk) * ( vn(ji,jj  ,jk-1) - vn(ji,jj  ,jk) ) * ( vb(ji,jj  ,jk-1) - vb(ji,jj  ,jk) )
611                  !                                          ! local Richardson number
612                  zri   = MAX( rn2b(ji,jj,jk), 0. ) * avm(ji,jj,jk) / (zcoef * (zdku + zdkv + rn_bshear ) )
613                  zpdlr = MAX(  0.1,  0.2 / MAX( 0.2 , zri )  )
614!!gm and even better with the use of the "true" ri_crit=0.22222...  (this change the results!)
615!!gm              zpdlr = MAX(  0.1,  ri_crit / MAX( ri_crit , zri )  )
616                  avt(ji,jj,jk)   = MAX( zpdlr * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk)
617# if defined key_c1d
618                  e_pdl(ji,jj,jk) = zpdlr * tmask(ji,jj,jk)    ! c1d configuration : save masked Prandlt number
619                  e_ric(ji,jj,jk) = zri * tmask(ji,jj,jk)                            ! c1d config. : save Ri
620# endif
621              END DO
622            END DO
623         END DO
624      ENDIF
625      CALL lbc_lnk( avt, 'W', 1. )                      ! Lateral boundary conditions on avt  (sign unchanged)
626
627      IF(ln_ctl) THEN
628         CALL prt_ctl( tab3d_1=en  , clinfo1=' tke  - e: ', tab3d_2=avt, clinfo2=' t: ', ovlap=1, kdim=jpk)
629         CALL prt_ctl( tab3d_1=avmu, clinfo1=' tke  - u: ', mask1=umask,                   &
630            &          tab3d_2=avmv, clinfo2=       ' v: ', mask2=vmask, ovlap=1, kdim=jpk )
631      ENDIF
632      !
633   END SUBROUTINE tke_avn
634
635
636   SUBROUTINE tke_init
637      !!----------------------------------------------------------------------
638      !!                  ***  ROUTINE tke_init  ***
639      !!                     
640      !! ** Purpose :   Initialization of the vertical eddy diffivity and
641      !!              viscosity when using a tke turbulent closure scheme
642      !!
643      !! ** Method  :   Read the namzdf_tke namelist and check the parameters
644      !!              called at the first timestep (nit000)
645      !!
646      !! ** input   :   Namlist namzdf_tke
647      !!
648      !! ** Action  :   Increase by 1 the nstop flag is setting problem encounter
649      !!----------------------------------------------------------------------
650      INTEGER ::   ji, jj, jk   ! dummy loop indices
651      !!
652      NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb, rn_emin,   &
653         &                 rn_emin0, rn_bshear, nn_mxl, ln_mxl0,   &
654         &                 rn_lmin , rn_lmin0 , nn_pdl, nn_etau,   &
655         &                 nn_htau , rn_efr   , ln_lc , rn_lc 
656      !!----------------------------------------------------------------------
657
658      REWIND ( numnam )               !* Read Namelist namzdf_tke : Turbulente Kinetic Energy
659      READ   ( numnam, namzdf_tke )
660     
661      ri_cri = 2. / ( 2. + rn_ediss / rn_ediff )      ! resulting critical Richardson number
662
663      IF(lwp) THEN                    !* Control print
664         WRITE(numout,*)
665         WRITE(numout,*) 'zdf_tke : tke turbulent closure scheme - initialisation'
666         WRITE(numout,*) '~~~~~~~~'
667         WRITE(numout,*) '   Namelist namzdf_tke : set tke mixing parameters'
668         WRITE(numout,*) '      coef. to compute avt                        rn_ediff = ', rn_ediff
669         WRITE(numout,*) '      Kolmogoroff dissipation coef.               rn_ediss = ', rn_ediss
670         WRITE(numout,*) '      tke surface input coef.                     rn_ebb   = ', rn_ebb
671         WRITE(numout,*) '      minimum value of tke                        rn_emin  = ', rn_emin
672         WRITE(numout,*) '      surface minimum value of tke                rn_emin0 = ', rn_emin0
673         WRITE(numout,*) '      background shear (>0)                       rn_bshear= ', rn_bshear
674         WRITE(numout,*) '      mixing length type                          nn_mxl   = ', nn_mxl
675         WRITE(numout,*) '      prandl number flag                          nn_pdl   = ', nn_pdl
676         WRITE(numout,*) '      surface mixing length = F(stress) or not    ln_mxl0  = ', ln_mxl0
677         WRITE(numout,*) '      surface  mixing length minimum value        rn_lmin0 = ', rn_lmin0
678         WRITE(numout,*) '      interior mixing length minimum value        rn_lmin0 = ', rn_lmin0
679         WRITE(numout,*) '      test param. to add tke induced by wind      nn_etau  = ', nn_etau
680         WRITE(numout,*) '      flag for computation of exp. tke profile    nn_htau  = ', nn_htau
681         WRITE(numout,*) '      % of rn_emin0 which pene. the thermocline   rn_efr   = ', rn_efr
682         WRITE(numout,*) '      flag to take into acc.  Langmuir circ.      ln_lc    = ', ln_lc
683         WRITE(numout,*) '      coef to compute verticla velocity of LC     rn_lc    = ', rn_lc
684         WRITE(numout,*)
685         WRITE(numout,*) '      critical Richardson nb with your parameters  ri_cri = ', ri_cri
686      ENDIF
687
688      !                               !* Check of some namelist values
689      IF( nn_mxl  < 0    .OR. nn_mxl  > 3   )   CALL ctl_stop( 'bad flag: nn_mxl is  0, 1 or 2 ' )
690      IF( nn_pdl  < 0    .OR. nn_pdl  > 1   )   CALL ctl_stop( 'bad flag: nn_pdl is  0 or 1    ' )
691      IF( nn_htau < 0    .OR. nn_htau > 1   )   CALL ctl_stop( 'bad flag: nn_htau is 0 or 1    ' )
692      IF( rn_lc   < 0.15 .OR. rn_lc   > 0.2 )   CALL ctl_stop( 'bad value: rn_lc must be between 0.15 and 0.2 ' )
693
694      IF( nn_etau == 2  )   CALL zdf_mxl( nit000 )      ! Initialization of nmln
695
696      !                               !* depth of penetration of surface tke
697      IF( nn_etau /= 0 ) THEN     
698         SELECT CASE( nn_htau )             ! Choice of the depth of penetration
699         CASE( 0 )                                    ! constant depth penetration (here 10 meters)
700            htau(:,:) = 10.e0
701         CASE( 1 )                                    ! F(latitude) : 0.5m to 30m at high lat.
702            DO jj = 1, jpj
703               DO ji = 1, jpi 
704                  htau(ji,jj) = MAX( 0.5, 3./4. * MIN( 40., 60.*ABS( SIN( rpi/180. * gphit(ji,jj) ) ) )   )
705               END DO
706            END DO
707         END SELECT
708      ENDIF
709
710      !                               !* set vertical eddy coef. to the background value
711      DO jk = 1, jpk
712         avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)
713         avm (:,:,jk) = avmb(jk) * tmask(:,:,jk)
714         avmu(:,:,jk) = avmb(jk) * umask(:,:,jk)
715         avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk)
716      END DO
717      dissl(:,:,:) = 1.e-12
718      !                               !* read or initialize all required files
719      CALL tke_rst( nit000, 'READ' )
720      !
721   END SUBROUTINE tke_init
722
723
724   SUBROUTINE tke_rst( kt, cdrw )
725     !!---------------------------------------------------------------------
726     !!                   ***  ROUTINE tke_rst  ***
727     !!                     
728     !! ** Purpose :   Read or write TKE file (en) in restart file
729     !!
730     !! ** Method  :   use of IOM library
731     !!                if the restart does not contain TKE, en is either
732     !!                set to rn_emin or recomputed
733     !!----------------------------------------------------------------------
734     INTEGER         , INTENT(in) ::   kt         ! ocean time-step
735     CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
736     !
737     INTEGER ::   jit, jk   ! dummy loop indices
738     INTEGER ::   id1, id2, id3, id4, id5, id6
739     !!----------------------------------------------------------------------
740     !
741     IF( TRIM(cdrw) == 'READ' ) THEN        ! Read/initialise
742        !                                   ! ---------------
743        IF( ln_rstart ) THEN                   !* Read the restart file
744           id1 = iom_varid( numror, 'en'   , ldstop = .FALSE. )
745           id2 = iom_varid( numror, 'avt'  , ldstop = .FALSE. )
746           id3 = iom_varid( numror, 'avm'  , ldstop = .FALSE. )
747           id4 = iom_varid( numror, 'avmu' , ldstop = .FALSE. )
748           id5 = iom_varid( numror, 'avmv' , ldstop = .FALSE. )
749           id6 = iom_varid( numror, 'dissl', ldstop = .FALSE. )
750           !
751           IF( id1 > 0 ) THEN                       ! 'en' exists
752              CALL iom_get( numror, jpdom_autoglo, 'en', en )
753              IF( MIN( id2, id3, id4, id5, id6 ) > 0 ) THEN        ! all required arrays exist
754                 CALL iom_get( numror, jpdom_autoglo, 'avt'  , avt   )
755                 CALL iom_get( numror, jpdom_autoglo, 'avm'  , avm   )
756                 CALL iom_get( numror, jpdom_autoglo, 'avmu' , avmu  )
757                 CALL iom_get( numror, jpdom_autoglo, 'avmv' , avmv  )
758                 CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl )
759              ELSE                                                 ! one at least array is missing
760                 CALL tke_avn                                          ! compute avt, avm, avmu, avmv and dissl (approximation)
761              ENDIF
762           ELSE                                     ! No TKE array found: initialisation
763              IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop'
764              en (:,:,:) = rn_emin * tmask(:,:,:)
765              CALL tke_avn                               ! recompute avt, avm, avmu, avmv and dissl (approximation)
766              DO jit = nit000 + 1, nit000 + 10   ;   CALL zdf_tke( jit )   ;   END DO
767           ENDIF
768        ELSE                                   !* Start from rest
769           en(:,:,:) = rn_emin * tmask(:,:,:)
770           DO jk = 1, jpk                           ! set the Kz to the background value
771              avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)
772              avm (:,:,jk) = avmb(jk) * tmask(:,:,jk)
773              avmu(:,:,jk) = avmb(jk) * umask(:,:,jk)
774              avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk)
775           END DO
776        ENDIF
777        !
778     ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN   ! Create restart file
779        !                                   ! -------------------
780        IF(lwp) WRITE(numout,*) '---- tke-rst ----'
781        CALL iom_rstput( kt, nitrst, numrow, 'en'   , en    )
782        CALL iom_rstput( kt, nitrst, numrow, 'avt'  , avt   )
783        CALL iom_rstput( kt, nitrst, numrow, 'avm'  , avm   )
784        CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu  )
785        CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv  )
786        CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl )
787        !
788     ENDIF
789     !
790   END SUBROUTINE tke_rst
791
792#else
793   !!----------------------------------------------------------------------
794   !!   Dummy module :                                        NO TKE scheme
795   !!----------------------------------------------------------------------
796   LOGICAL, PUBLIC, PARAMETER ::   lk_zdftke = .FALSE.   !: TKE flag
797CONTAINS
798   SUBROUTINE zdf_tke( kt )          ! Empty routine
799      WRITE(*,*) 'zdf_tke: You should not have seen this print! error?', kt
800   END SUBROUTINE zdf_tke
801   SUBROUTINE tke_rst( kt, cdrw )
802     CHARACTER(len=*) ::   cdrw
803     WRITE(*,*) 'tke_rst: You should not have seen this print! error?', kt, cdwr
804   END SUBROUTINE tke_rst
805#endif
806
807   !!======================================================================
808END MODULE zdftke
Note: See TracBrowser for help on using the repository browser.