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.
zdfosm.F90 in NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/ZDF – NEMO

source: NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/ZDF/zdfosm.F90 @ 10955

Last change on this file since 10955 was 10955, checked in by acc, 5 years ago

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : Convert ZDF modules and all knock on effects of these conversions. SETTE tested

  • Property svn:keywords set to Id
File size: 91.9 KB
Line 
1MODULE zdfosm
2   !!======================================================================
3   !!                       ***  MODULE  zdfosm  ***
4   !! Ocean physics:  vertical mixing coefficient compute from the OSMOSIS
5   !!                 turbulent closure parameterization
6   !!=====================================================================
7   !!  History : NEMO 4.0  ! A. Grant, G. Nurser
8   !! 15/03/2017  Changed calculation of pycnocline thickness in unstable conditions and stable conditions AG
9   !! 15/03/2017  Calculation of pycnocline gradients for stable conditions changed. Pycnocline gradients now depend on stability of the OSBL. A.G
10   !! 06/06/2017  (1) Checks on sign of buoyancy jump in calculation of  OSBL depth.  A.G.
11   !!             (2) Removed variable zbrad0, zbradh and zbradav since they are not used.
12   !!             (3) Approximate treatment for shear turbulence.
13   !!                        Minimum values for zustar and zustke.
14   !!                        Add velocity scale, zvstr, that tends to zustar for large Langmuir numbers.
15   !!                        Limit maximum value for Langmuir number.
16   !!                        Use zvstr in definition of stability parameter zhol.
17   !!             (4) Modified parametrization of entrainment flux, changing original coefficient 0.0485 for Langmuir contribution to 0.135 * zla
18   !!             (5) For stable boundary layer add factor that depends on length of timestep to 'slow' collapse and growth. Make sure buoyancy jump not negative.
19   !!             (6) For unstable conditions when growth is over multiple levels, limit change to maximum of one level per cycle through loop.
20   !!             (7) Change lower limits for loops that calculate OSBL averages from 1 to 2. Large gradients between levels 1 and 2 can cause problems.
21   !!             (8) Change upper limits from ibld-1 to ibld.
22   !!             (9) Calculation of pycnocline thickness in unstable conditions. Check added to ensure that buoyancy jump is positive before calculating Ri.
23   !!            (10) Thickness of interface layer at base of the stable OSBL set by Richardson number. Gives continuity in transition from unstable OSBL.
24   !!            (11) Checks that buoyancy jump is poitive when calculating pycnocline profiles.
25   !!            (12) Replace zwstrl with zvstr in calculation of eddy viscosity.
26   !! 27/09/2017 (13) Calculate Stokes drift and Stokes penetration depth from wave information
27   !!            (14) Bouyancy flux due to entrainment changed to include contribution from shear turbulence (for testing commented out).
28   !! 28/09/2017 (15) Calculation of Stokes drift moved into separate do-loops to allow for different options for the determining the Stokes drift to be added.
29   !!            (16) Calculation of Stokes drift from windspeed for PM spectrum (for testing, commented out)
30   !!            (17) Modification to Langmuir velocity scale to include effects due to the Stokes penetration depth (for testing, commented out)
31   !!----------------------------------------------------------------------
32
33   !!----------------------------------------------------------------------
34   !!   'ln_zdfosm'                                             OSMOSIS scheme
35   !!----------------------------------------------------------------------
36   !!   zdf_osm       : update momentum and tracer Kz from osm scheme
37   !!   zdf_osm_init  : initialization, namelist read, and parameters control
38   !!   osm_rst       : read (or initialize) and write osmosis restart fields
39   !!   tra_osm       : compute and add to the T & S trend the non-local flux
40   !!   trc_osm       : compute and add to the passive tracer trend the non-local flux (TBD)
41   !!   dyn_osm       : compute and add to u & v trensd the non-local flux
42   !!----------------------------------------------------------------------
43   USE oce            ! ocean dynamics and active tracers
44                      ! uses ww from previous time step (which is now wb) to calculate hbl
45   USE dom_oce        ! ocean space and time domain
46   USE zdf_oce        ! ocean vertical physics
47   USE sbc_oce        ! surface boundary condition: ocean
48   USE sbcwave        ! surface wave parameters
49   USE phycst         ! physical constants
50   USE eosbn2         ! equation of state
51   USE traqsr         ! details of solar radiation absorption
52   USE zdfddm         ! double diffusion mixing (avs array)
53   USE iom            ! I/O library
54   USE lib_mpp        ! MPP library
55   USE trd_oce        ! ocean trends definition
56   USE trdtra         ! tracers trends
57   !
58   USE in_out_manager ! I/O manager
59   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
60   USE prtctl         ! Print control
61   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
62
63   IMPLICIT NONE
64   PRIVATE
65
66   PUBLIC   zdf_osm       ! routine called by step.F90
67   PUBLIC   zdf_osm_init  ! routine called by nemogcm.F90
68   PUBLIC   osm_rst       ! routine called by step.F90
69   PUBLIC   tra_osm       ! routine called by step.F90
70   PUBLIC   trc_osm       ! routine called by trcstp.F90
71   PUBLIC   dyn_osm       ! routine called by 'step.F90'
72
73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamu    !: non-local u-momentum flux
74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamv    !: non-local v-momentum flux
75   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamt    !: non-local temperature flux (gamma/<ws>o)
76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghams    !: non-local salinity flux (gamma/<ws>o)
77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   etmean   !: averaging operator for avt
78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbl      !: boundary layer depth
79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbli     !: intial boundary layer depth for stable blayer
80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dstokes  !: penetration depth of the Stokes drift.
81
82   !                      !!** Namelist  namzdf_osm  **
83   LOGICAL  ::   ln_use_osm_la      ! Use namelist  rn_osm_la
84   REAL(wp) ::   rn_osm_la          ! Turbulent Langmuir number
85   REAL(wp) ::   rn_osm_dstokes     ! Depth scale of Stokes drift
86   REAL(wp) ::   rn_osm_hbl0 = 10._wp       ! Initial value of hbl for 1D runs
87   INTEGER  ::   nn_ave             ! = 0/1 flag for horizontal average on avt
88   INTEGER  ::   nn_osm_wave = 0    ! = 0/1/2 flag for getting stokes drift from La# / PM wind-waves/Inputs into sbcwave
89   LOGICAL  ::   ln_dia_osm         ! Use namelist  rn_osm_la
90
91
92   LOGICAL  ::   ln_kpprimix  = .true.  ! Shear instability mixing
93   REAL(wp) ::   rn_riinfty   = 0.7     ! local Richardson Number limit for shear instability
94   REAL(wp) ::   rn_difri    =  0.005   ! maximum shear mixing at Rig = 0    (m2/s)
95   LOGICAL  ::   ln_convmix  = .true.   ! Convective instability mixing
96   REAL(wp) ::   rn_difconv = 1._wp     ! diffusivity when unstable below BL  (m2/s)
97
98   !                                    !!! ** General constants  **
99   REAL(wp) ::   epsln   = 1.0e-20_wp   ! a small positive number
100   REAL(wp) ::   pthird  = 1._wp/3._wp  ! 1/3
101   REAL(wp) ::   p2third = 2._wp/3._wp  ! 2/3
102
103   INTEGER :: idebug = 236
104   INTEGER :: jdebug = 228
105   !!----------------------------------------------------------------------
106   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
107   !! $Id$
108   !! Software governed by the CeCILL license (see ./LICENSE)
109   !!----------------------------------------------------------------------
110CONTAINS
111
112   INTEGER FUNCTION zdf_osm_alloc()
113      !!----------------------------------------------------------------------
114      !!                 ***  FUNCTION zdf_osm_alloc  ***
115      !!----------------------------------------------------------------------
116     ALLOCATE( ghamu(jpi,jpj,jpk), ghamv(jpi,jpj,jpk), ghamt(jpi,jpj,jpk), ghams(jpi,jpj,jpk), &
117          &      hbl(jpi,jpj)    ,  hbli(jpi,jpj)    , dstokes(jpi, jpj) ,                     &
118          &   etmean(jpi,jpj,jpk),  STAT= zdf_osm_alloc )
119     IF( zdf_osm_alloc /= 0 )   CALL ctl_warn('zdf_osm_alloc: failed to allocate zdf_osm arrays')
120     CALL mpp_sum ( 'zdfosm', zdf_osm_alloc )
121   END FUNCTION zdf_osm_alloc
122
123
124   SUBROUTINE zdf_osm( kt, Kbb, Kmm, Krhs, p_avm, p_avt )
125      !!----------------------------------------------------------------------
126      !!                   ***  ROUTINE zdf_osm  ***
127      !!
128      !! ** Purpose :   Compute the vertical eddy viscosity and diffusivity
129      !!      coefficients and non local mixing using the OSMOSIS scheme
130      !!
131      !! ** Method :   The boundary layer depth hosm is diagnosed at tracer points
132      !!      from profiles of buoyancy, and shear, and the surface forcing.
133      !!      Above hbl (sigma=-z/hbl <1) the mixing coefficients are computed from
134      !!
135      !!                      Kx =  hosm  Wx(sigma) G(sigma)
136      !!
137      !!             and the non local term ghamt = Cs / Ws(sigma) / hosm
138      !!      Below hosm  the coefficients are the sum of mixing due to internal waves
139      !!      shear instability and double diffusion.
140      !!
141      !!      -1- Compute the now interior vertical mixing coefficients at all depths.
142      !!      -2- Diagnose the boundary layer depth.
143      !!      -3- Compute the now boundary layer vertical mixing coefficients.
144      !!      -4- Compute the now vertical eddy vicosity and diffusivity.
145      !!      -5- Smoothing
146      !!
147      !!        N.B. The computation is done from jk=2 to jpkm1
148      !!             Surface value of avt are set once a time to zero
149      !!             in routine zdf_osm_init.
150      !!
151      !! ** Action  :   update the non-local terms ghamts
152      !!                update avt (before vertical eddy coef.)
153      !!
154      !! References : Large W.G., Mc Williams J.C. and Doney S.C.
155      !!         Reviews of Geophysics, 32, 4, November 1994
156      !!         Comments in the code refer to this paper, particularly
157      !!         the equation number. (LMD94, here after)
158      !!----------------------------------------------------------------------
159      INTEGER                   , INTENT(in   ) ::  kt             ! ocean time step
160      INTEGER                   , INTENT(in   ) ::  Kbb, Kmm, Krhs ! ocean time level indices
161      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::  p_avm, p_avt   ! momentum and tracer Kz (w-points)
162      !!
163      INTEGER ::   ji, jj, jk                   ! dummy loop indices
164      INTEGER ::   ikbot, jkmax, jkm1, jkp2     !
165
166      REAL(wp) ::   ztx, zty, zflageos, zstabl, zbuofdep,zucube      !
167      REAL(wp) ::   zbeta, zthermal                                  !
168      REAL(wp) ::   zehat, zeta, zhrib, zsig, zscale, zwst, zws, zwm ! Velocity scales
169      REAL(wp) ::   zwsun, zwmun, zcons, zconm, zwcons, zwconm       !
170      REAL(wp) ::   zsr, zbw, ze, zb, zd, zc, zaw, za, zb1, za1, zkw, zk0, zcomp , zrhd,zrhdr,zbvzed   ! In situ density
171      INTEGER  ::   jm                          ! dummy loop indices
172      REAL(wp) ::   zr1, zr2, zr3, zr4, zrhop   ! Compression terms
173      REAL(wp) ::   zflag, zrn2, zdep21, zdep32, zdep43
174      REAL(wp) ::   zesh2, zri, zfri            ! Interior richardson mixing
175      REAL(wp) ::   zdelta, zdelta2, zdzup, zdzdn, zdzh, zvath, zgat1, zdat1, zkm1m, zkm1t
176      REAL(wp) :: zt,zs,zu,zv,zrh               ! variables used in constructing averages
177! Scales
178      REAL(wp), DIMENSION(jpi,jpj) :: zrad0     ! Surface solar temperature flux (deg m/s)
179      REAL(wp), DIMENSION(jpi,jpj) :: zradh     ! Radiative flux at bl base (Buoyancy units)
180      REAL(wp), DIMENSION(jpi,jpj) :: zradav    ! Radiative flux, bl average (Buoyancy Units)
181      REAL(wp), DIMENSION(jpi,jpj) :: zustar    ! friction velocity
182      REAL(wp), DIMENSION(jpi,jpj) :: zwstrl    ! Langmuir velocity scale
183      REAL(wp), DIMENSION(jpi,jpj) :: zvstr     ! Velocity scale that ends to zustar for large Langmuir number.
184      REAL(wp), DIMENSION(jpi,jpj) :: zwstrc    ! Convective velocity scale
185      REAL(wp), DIMENSION(jpi,jpj) :: zuw0      ! Surface u-momentum flux
186      REAL(wp), DIMENSION(jpi,jpj) :: zvw0      ! Surface v-momentum flux
187      REAL(wp), DIMENSION(jpi,jpj) :: zwth0     ! Surface heat flux (Kinematic)
188      REAL(wp), DIMENSION(jpi,jpj) :: zws0      ! Surface freshwater flux
189      REAL(wp), DIMENSION(jpi,jpj) :: zwb0      ! Surface buoyancy flux
190      REAL(wp), DIMENSION(jpi,jpj) :: zwthav    ! Heat flux - bl average
191      REAL(wp), DIMENSION(jpi,jpj) :: zwsav     ! freshwater flux - bl average
192      REAL(wp), DIMENSION(jpi,jpj) :: zwbav     ! Buoyancy flux - bl average
193      REAL(wp), DIMENSION(jpi,jpj) :: zwb_ent   ! Buoyancy entrainment flux
194      REAL(wp), DIMENSION(jpi,jpj) :: zustke    ! Surface Stokes drift
195      REAL(wp), DIMENSION(jpi,jpj) :: zla       ! Trubulent Langmuir number
196      REAL(wp), DIMENSION(jpi,jpj) :: zcos_wind ! Cos angle of surface stress
197      REAL(wp), DIMENSION(jpi,jpj) :: zsin_wind ! Sin angle of surface stress
198      REAL(wp), DIMENSION(jpi,jpj) :: zhol      ! Stability parameter for boundary layer
199      LOGICAL, DIMENSION(:,:), ALLOCATABLE :: lconv ! unstable/stable bl
200
201      ! mixed-layer variables
202
203      INTEGER, DIMENSION(jpi,jpj) :: ibld ! level of boundary layer base
204      INTEGER, DIMENSION(jpi,jpj) :: imld ! level of mixed-layer depth (pycnocline top)
205
206      REAL(wp) :: ztgrad,zsgrad,zbgrad ! Temporary variables used to calculate pycnocline gradients
207      REAL(wp) :: zugrad,zvgrad        ! temporary variables for calculating pycnocline shear
208
209      REAL(wp), DIMENSION(jpi,jpj) :: zhbl  ! bl depth - grid
210      REAL(wp), DIMENSION(jpi,jpj) :: zhml  ! ml depth - grid
211      REAL(wp), DIMENSION(jpi,jpj) :: zdh   ! pycnocline depth - grid
212      REAL(wp), DIMENSION(jpi,jpj) :: zdhdt ! BL depth tendency
213      REAL(wp), DIMENSION(jpi,jpj) :: zt_bl,zs_bl,zu_bl,zv_bl,zrh_bl  ! averages over the depth of the blayer
214      REAL(wp), DIMENSION(jpi,jpj) :: zt_ml,zs_ml,zu_ml,zv_ml,zrh_ml  ! averages over the depth of the mixed layer
215      REAL(wp), DIMENSION(jpi,jpj) :: zdt_bl,zds_bl,zdu_bl,zdv_bl,zdrh_bl,zdb_bl ! difference between blayer average and parameter at base of blayer
216      REAL(wp), DIMENSION(jpi,jpj) :: zdt_ml,zds_ml,zdu_ml,zdv_ml,zdrh_ml,zdb_ml ! difference between mixed layer average and parameter at base of blayer
217      REAL(wp), DIMENSION(jpi,jpj) :: zwth_ent,zws_ent ! heat and salinity fluxes at the top of the pycnocline
218      REAL(wp), DIMENSION(jpi,jpj) :: zuw_bse,zvw_bse  ! momentum fluxes at the top of the pycnocline
219      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdtdz_pyc    ! parametrized gradient of temperature in pycnocline
220      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdsdz_pyc    ! parametrised gradient of salinity in pycnocline
221      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdbdz_pyc    ! parametrised gradient of buoyancy in the pycnocline
222      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdudz_pyc    ! u-shear across the pycnocline
223      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdvdz_pyc    ! v-shear across the pycnocline
224
225      ! Flux-gradient relationship variables
226
227      REAL(wp) :: zl_c,zl_l,zl_eps  ! Used to calculate turbulence length scale.
228
229      REAL(wp), DIMENSION(jpi,jpj) :: zdifml_sc,zvisml_sc,zdifpyc_sc,zvispyc_sc,zbeta_d_sc,zbeta_v_sc ! Scales for eddy diffusivity/viscosity
230      REAL(wp), DIMENSION(jpi,jpj) :: zsc_wth_1,zsc_ws_1 ! Temporary scales used to calculate scalar non-gradient terms.
231      REAL(wp), DIMENSION(jpi,jpj) :: zsc_uw_1,zsc_uw_2,zsc_vw_1,zsc_vw_2 ! Temporary scales for non-gradient momentum flux terms.
232      REAL(wp), DIMENSION(jpi,jpj) :: zhbl_t ! holds boundary layer depth updated by full timestep
233
234      ! For calculating Ri#-dependent mixing
235      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3du   ! u-shear^2
236      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3dv   ! v-shear^2
237      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrimix ! spatial form of ri#-induced diffusion
238
239      ! Temporary variables
240      INTEGER :: inhml
241      INTEGER :: i_lconv_alloc
242      REAL(wp) :: znd,znd_d,zznd_ml,zznd_pyc,zznd_d ! temporary non-dimensional depths used in various routines
243      REAL(wp) :: ztemp, zari, zpert, zzdhdt, zdb   ! temporary variables
244      REAL(wp) :: zthick, zz0, zz1 ! temporary variables
245      REAL(wp) :: zvel_max, zhbl_s ! temporary variables
246      REAL(wp) :: zfac             ! temporary variable
247      REAL(wp) :: zus_x, zus_y     ! temporary Stokes drift
248      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zviscos ! viscosity
249      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdiffut ! t-diffusivity
250
251      ! For debugging
252      INTEGER :: ikt
253      !!--------------------------------------------------------------------
254      !
255      ALLOCATE( lconv(jpi,jpj),  STAT= i_lconv_alloc )
256      IF( i_lconv_alloc /= 0 )   CALL ctl_warn('zdf_osm: failed to allocate lconv')
257
258      ibld(:,:)   = 0     ; imld(:,:)  = 0
259      zrad0(:,:)  = 0._wp ; zradh(:,:) = 0._wp ; zradav(:,:)    = 0._wp ; zustar(:,:)    = 0._wp
260      zwstrl(:,:) = 0._wp ; zvstr(:,:) = 0._wp ; zwstrc(:,:)    = 0._wp ; zuw0(:,:)      = 0._wp
261      zvw0(:,:)   = 0._wp ; zwth0(:,:) = 0._wp ; zws0(:,:)      = 0._wp ; zwb0(:,:)      = 0._wp
262      zwthav(:,:) = 0._wp ; zwsav(:,:) = 0._wp ; zwbav(:,:)     = 0._wp ; zwb_ent(:,:)   = 0._wp
263      zustke(:,:) = 0._wp ; zla(:,:)   = 0._wp ; zcos_wind(:,:) = 0._wp ; zsin_wind(:,:) = 0._wp
264      zhol(:,:)   = 0._wp
265      lconv(:,:)  = .FALSE.
266      ! mixed layer
267      ! no initialization of zhbl or zhml (or zdh?)
268      zhbl(:,:)    = 1._wp ; zhml(:,:)    = 1._wp ; zdh(:,:)      = 1._wp ; zdhdt(:,:)   = 0._wp
269      zt_bl(:,:)   = 0._wp ; zs_bl(:,:)   = 0._wp ; zu_bl(:,:)    = 0._wp ; zv_bl(:,:)   = 0._wp
270      zrh_bl(:,:)  = 0._wp ; zt_ml(:,:)   = 0._wp ; zs_ml(:,:)    = 0._wp ; zu_ml(:,:)   = 0._wp
271      zv_ml(:,:)   = 0._wp ; zrh_ml(:,:)  = 0._wp ; zdt_bl(:,:)   = 0._wp ; zds_bl(:,:)  = 0._wp
272      zdu_bl(:,:)  = 0._wp ; zdv_bl(:,:)  = 0._wp ; zdrh_bl(:,:)  = 0._wp ; zdb_bl(:,:)  = 0._wp
273      zdt_ml(:,:)  = 0._wp ; zds_ml(:,:)  = 0._wp ; zdu_ml(:,:)   = 0._wp ; zdv_ml(:,:)  = 0._wp
274      zdrh_ml(:,:) = 0._wp ; zdb_ml(:,:)  = 0._wp ; zwth_ent(:,:) = 0._wp ; zws_ent(:,:) = 0._wp
275      zuw_bse(:,:) = 0._wp ; zvw_bse(:,:) = 0._wp
276      !
277      zdtdz_pyc(:,:,:) = 0._wp ; zdsdz_pyc(:,:,:) = 0._wp ; zdbdz_pyc(:,:,:) = 0._wp
278      zdudz_pyc(:,:,:) = 0._wp ; zdvdz_pyc(:,:,:) = 0._wp
279      !
280      ! Flux-Gradient arrays.
281      zdifml_sc(:,:)  = 0._wp ; zvisml_sc(:,:)  = 0._wp ; zdifpyc_sc(:,:) = 0._wp
282      zvispyc_sc(:,:) = 0._wp ; zbeta_d_sc(:,:) = 0._wp ; zbeta_v_sc(:,:) = 0._wp
283      zsc_wth_1(:,:)  = 0._wp ; zsc_ws_1(:,:)   = 0._wp ; zsc_uw_1(:,:)   = 0._wp
284      zsc_uw_2(:,:)   = 0._wp ; zsc_vw_1(:,:)   = 0._wp ; zsc_vw_2(:,:)   = 0._wp
285      zhbl_t(:,:)     = 0._wp ; zdhdt(:,:)      = 0._wp
286
287      zdiffut(:,:,:) = 0._wp ; zviscos(:,:,:) = 0._wp ; ghamt(:,:,:) = 0._wp
288      ghams(:,:,:)   = 0._wp ; ghamu(:,:,:)   = 0._wp ; ghamv(:,:,:) = 0._wp
289
290      ! hbl = MAX(hbl,epsln)
291      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
292      ! Calculate boundary layer scales
293      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
294
295      ! Assume two-band radiation model for depth of OSBL
296     zz0 =       rn_abs       ! surface equi-partition in 2-bands
297     zz1 =  1. - rn_abs
298     DO jj = 2, jpjm1
299        DO ji = 2, jpim1
300           ! Surface downward irradiance (so always +ve)
301           zrad0(ji,jj) = qsr(ji,jj) * r1_rau0_rcp
302           ! Downwards irradiance at base of boundary layer
303           zradh(ji,jj) = zrad0(ji,jj) * ( zz0 * EXP( -hbl(ji,jj)/rn_si0 ) + zz1 * EXP( -hbl(ji,jj)/rn_si1) )
304           ! Downwards irradiance averaged over depth of the OSBL
305           zradav(ji,jj) = zrad0(ji,jj) * ( zz0 * ( 1.0 - EXP( -hbl(ji,jj)/rn_si0 ) )*rn_si0 &
306                 &                         + zz1 * ( 1.0 - EXP( -hbl(ji,jj)/rn_si1 ) )*rn_si1 ) / hbl(ji,jj)
307        END DO
308     END DO
309     ! Turbulent surface fluxes and fluxes averaged over depth of the OSBL
310     DO jj = 2, jpjm1
311        DO ji = 2, jpim1
312           zthermal = rab_n(ji,jj,1,jp_tem)
313           zbeta    = rab_n(ji,jj,1,jp_sal)
314           ! Upwards surface Temperature flux for non-local term
315           zwth0(ji,jj) = - qns(ji,jj) * r1_rau0_rcp * tmask(ji,jj,1)
316           ! Upwards surface salinity flux for non-local term
317           zws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * ts(ji,jj,1,jp_sal,Kmm)  + sfx(ji,jj) ) * r1_rau0 * tmask(ji,jj,1)
318           ! Non radiative upwards surface buoyancy flux
319           zwb0(ji,jj) = grav * zthermal * zwth0(ji,jj) -  grav * zbeta * zws0(ji,jj)
320           ! turbulent heat flux averaged over depth of OSBL
321           zwthav(ji,jj) = 0.5 * zwth0(ji,jj) - ( 0.5*( zrad0(ji,jj) + zradh(ji,jj) ) - zradav(ji,jj) )
322           ! turbulent salinity flux averaged over depth of the OBSL
323           zwsav(ji,jj) = 0.5 * zws0(ji,jj)
324           ! turbulent buoyancy flux averaged over the depth of the OBSBL
325           zwbav(ji,jj) = grav  * zthermal * zwthav(ji,jj) - grav  * zbeta * zwsav(ji,jj)
326           ! Surface upward velocity fluxes
327           zuw0(ji,jj) = -utau(ji,jj) * r1_rau0 * tmask(ji,jj,1)
328           zvw0(ji,jj) = -vtau(ji,jj) * r1_rau0 * tmask(ji,jj,1)
329           ! Friction velocity (zustar), at T-point : LMD94 eq. 2
330           zustar(ji,jj) = MAX( SQRT( SQRT( zuw0(ji,jj) * zuw0(ji,jj) + zvw0(ji,jj) * zvw0(ji,jj) ) ), 1.0e-8 )
331           zcos_wind(ji,jj) = -zuw0(ji,jj) / ( zustar(ji,jj) * zustar(ji,jj) )
332           zsin_wind(ji,jj) = -zvw0(ji,jj) / ( zustar(ji,jj) * zustar(ji,jj) )
333        END DO
334     END DO
335     ! Calculate Stokes drift in direction of wind (zustke) and Stokes penetration depth (dstokes)
336     SELECT CASE (nn_osm_wave)
337     ! Assume constant La#=0.3
338     CASE(0)
339        DO jj = 2, jpjm1
340           DO ji = 2, jpim1
341              zus_x = zcos_wind(ji,jj) * zustar(ji,jj) / 0.3**2
342              zus_y = zsin_wind(ji,jj) * zustar(ji,jj) / 0.3**2
343              zustke(ji,jj) = MAX ( SQRT( zus_x*zus_x + zus_y*zus_y), 1.0e-8 )
344              ! dstokes(ji,jj) set to constant value rn_osm_dstokes from namelist in zdf_osm_init
345           END DO
346        END DO
347     ! Assume Pierson-Moskovitz wind-wave spectrum
348     CASE(1)
349        DO jj = 2, jpjm1
350           DO ji = 2, jpim1
351              ! Use wind speed wndm included in sbc_oce module
352              zustke(ji,jj) = MAX ( 0.016 * wndm(ji,jj), 1.0e-8 )
353              dstokes(ji,jj) = 0.12 * wndm(ji,jj)**2 / grav
354           END DO
355        END DO
356     ! Use ECMWF wave fields as output from SBCWAVE
357     CASE(2)
358        zfac =  2.0_wp * rpi / 16.0_wp
359        DO jj = 2, jpjm1
360           DO ji = 2, jpim1
361              ! The Langmur number from the ECMWF model appears to give La<0.3 for wind-driven seas.
362              !    The coefficient 0.8 gives La=0.3  in this situation.
363              ! It could represent the effects of the spread of wave directions
364              ! around the mean wind. The effect of this adjustment needs to be tested.
365              zustke(ji,jj) = MAX ( 1.0 * ( zcos_wind(ji,jj) * ut0sd(ji,jj ) + zsin_wind(ji,jj)  * vt0sd(ji,jj) ), &
366                   &                zustar(ji,jj) / ( 0.45 * 0.45 )                                                  )
367              dstokes(ji,jj) = MAX(zfac * hsw(ji,jj)*hsw(ji,jj) / ( MAX(zustke(ji,jj)*wmp(ji,jj), 1.0e-7 ) ), 5.0e-1) !rn_osm_dstokes !
368           END DO
369        END DO
370     END SELECT
371
372     ! Langmuir velocity scale (zwstrl), La # (zla)
373     ! mixed scale (zvstr), convective velocity scale (zwstrc)
374     DO jj = 2, jpjm1
375        DO ji = 2, jpim1
376           ! Langmuir velocity scale (zwstrl), at T-point
377           zwstrl(ji,jj) = ( zustar(ji,jj) * zustar(ji,jj) * zustke(ji,jj) )**pthird
378           ! Modify zwstrl to allow for small and large values of dstokes/hbl.
379           ! Intended as a possible test. Doesn't affect LES results for entrainment,
380           !  but hasn't been shown to be correct as dstokes/h becomes large or small.
381           zwstrl(ji,jj) = zwstrl(ji,jj) *  &
382                & (1.12 * ( 1.0 - ( 1.0 - EXP( -hbl(ji,jj) / dstokes(ji,jj) ) ) * dstokes(ji,jj) / hbl(ji,jj) ))**pthird * &
383                & ( 1.0 - EXP( -15.0 * dstokes(ji,jj) / hbl(ji,jj) ))
384           ! define La this way so effects of Stokes penetration depth on velocity scale are included
385           zla(ji,jj) = SQRT ( zustar(ji,jj) / zwstrl(ji,jj) )**3
386           ! Velocity scale that tends to zustar for large Langmuir numbers
387           zvstr(ji,jj) = ( zwstrl(ji,jj)**3  + &
388                & ( 1.0 - EXP( -0.5 * zla(ji,jj)**2 ) ) * zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj) )**pthird
389
390           ! limit maximum value of Langmuir number as approximate treatment for shear turbulence.
391           ! Note zustke and zwstrl are not amended.
392           IF ( zla(ji,jj) >= 0.45 ) zla(ji,jj) = 0.45
393           !
394           ! get convective velocity (zwstrc), stabilty scale (zhol) and logical conection flag lconv
395           IF ( zwbav(ji,jj) > 0.0) THEN
396              zwstrc(ji,jj) = ( 2.0 * zwbav(ji,jj) * 0.9 * hbl(ji,jj) )**pthird
397              zhol(ji,jj) = -0.9 * hbl(ji,jj) * 2.0 * zwbav(ji,jj) / (zvstr(ji,jj)**3 + epsln )
398              lconv(ji,jj) = .TRUE.
399           ELSE
400              zhol(ji,jj) = -hbl(ji,jj) *  2.0 * zwbav(ji,jj)/ (zvstr(ji,jj)**3  + epsln )
401              lconv(ji,jj) = .FALSE.
402           ENDIF
403        END DO
404     END DO
405
406     !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
407     ! Mixed-layer model - calculate averages over the boundary layer, and the change in the boundary layer depth
408     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
409     ! BL must be always 2 levels deep.
410      hbl(:,:) = MAX(hbl(:,:), gdepw(:,:,3,Kmm) )
411      ibld(:,:) = 3
412      DO jk = 4, jpkm1
413         DO jj = 2, jpjm1
414            DO ji = 2, jpim1
415               IF ( hbl(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) THEN
416                  ibld(ji,jj) = MIN(mbkt(ji,jj), jk)
417               ENDIF
418            END DO
419         END DO
420      END DO
421
422      DO jj = 2, jpjm1                                 !  Vertical slab
423         DO ji = 2, jpim1
424               zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1??
425               zbeta    = rab_n(ji,jj,1,jp_sal)
426               zt   = 0._wp
427               zs   = 0._wp
428               zu   = 0._wp
429               zv   = 0._wp
430               ! average over depth of boundary layer
431               zthick=0._wp
432               DO jm = 2, ibld(ji,jj)
433                  zthick=zthick+e3t(ji,jj,jm,Kmm)
434                  zt   = zt  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_tem,Kmm)
435                  zs   = zs  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_sal,Kmm)
436                  zu   = zu  + e3t(ji,jj,jm,Kmm) &
437                     &            * ( uu(ji,jj,jm,Kbb) + uu(ji - 1,jj,jm,Kbb) ) &
438                     &            / MAX( 1. , umask(ji,jj,jm) + umask(ji - 1,jj,jm) )
439                  zv   = zv  + e3t(ji,jj,jm,Kmm) &
440                     &            * ( vv(ji,jj,jm,Kbb) + vv(ji,jj - 1,jm,Kbb) ) &
441                     &            / MAX( 1. , vmask(ji,jj,jm) + vmask(ji,jj - 1,jm) )
442               END DO
443               zt_bl(ji,jj) = zt / zthick
444               zs_bl(ji,jj) = zs / zthick
445               zu_bl(ji,jj) = zu / zthick
446               zv_bl(ji,jj) = zv / zthick
447               zdt_bl(ji,jj) = zt_bl(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_tem,Kmm)
448               zds_bl(ji,jj) = zs_bl(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_sal,Kmm)
449               zdu_bl(ji,jj) = zu_bl(ji,jj) - ( uu(ji,jj,ibld(ji,jj),Kbb) + uu(ji-1,jj,ibld(ji,jj) ,Kbb) ) &
450                     &    / MAX(1. , umask(ji,jj,ibld(ji,jj) ) + umask(ji-1,jj,ibld(ji,jj) ) )
451               zdv_bl(ji,jj) = zv_bl(ji,jj) - ( vv(ji,jj,ibld(ji,jj),Kbb) + vv(ji,jj-1,ibld(ji,jj) ,Kbb) ) &
452                     &   / MAX(1. , vmask(ji,jj,ibld(ji,jj) ) + vmask(ji,jj-1,ibld(ji,jj) ) )
453               zdb_bl(ji,jj) = grav * zthermal * zdt_bl(ji,jj) - grav * zbeta * zds_bl(ji,jj)
454               IF ( lconv(ji,jj) ) THEN    ! Convective
455                      zwb_ent(ji,jj) = -( 2.0 * 0.2 * zwbav(ji,jj) &
456                           &            + 0.135 * zla(ji,jj) * zwstrl(ji,jj)**3/hbl(ji,jj) )
457
458                      zvel_max =  - ( 1.0 + 1.0 * ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_rdt / hbl(ji,jj) ) &
459                           &   * zwb_ent(ji,jj) / ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
460! Entrainment including component due to shear turbulence. Modified Langmuir component, but gives same result for La=0.3 For testing uncomment.
461!                      zwb_ent(ji,jj) = -( 2.0 * 0.2 * zwbav(ji,jj) &
462!                           &            + ( 0.15 * ( 1.0 - EXP( -0.5 * zla(ji,jj) ) ) + 0.03 / zla(ji,jj)**2 ) * zustar(ji,jj)**3/hbl(ji,jj) )
463
464!                      zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_rdt / zhbl(ji,jj) ) * zwb_ent(ji,jj) / &
465!                           &       ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
466                      zzdhdt = - zwb_ent(ji,jj) / ( zvel_max + MAX(zdb_bl(ji,jj),0.0) )
467               ELSE                        ! Stable
468                      zzdhdt = 0.32 * ( hbli(ji,jj) / hbl(ji,jj) -1.0 ) * zwstrl(ji,jj)**3 / hbli(ji,jj) &
469                           &   + ( ( 0.32 / 3.0 ) * exp ( -2.5 * ( hbli(ji,jj) / hbl(ji,jj) - 1.0 ) ) &
470                           & - ( 0.32 / 3.0 - 0.135 * zla(ji,jj) ) * exp ( -12.5 * ( hbli(ji,jj) / hbl(ji,jj) ) ) ) &
471                           &  * zwstrl(ji,jj)**3 / hbli(ji,jj)
472                      zzdhdt = zzdhdt + zwbav(ji,jj)
473                      IF ( zzdhdt < 0._wp ) THEN
474                      ! For long timsteps factor in brackets slows the rapid collapse of the OSBL
475                         zpert   = 2.0 * ( 1.0 + 2.0 * zwstrl(ji,jj) * rn_rdt / hbl(ji,jj) ) * zwstrl(ji,jj)**2 / hbl(ji,jj)
476                      ELSE
477                         zpert   = 2.0 * ( 1.0 + 2.0 * zwstrl(ji,jj) * rn_rdt / hbl(ji,jj) ) * zwstrl(ji,jj)**2 / hbl(ji,jj) &
478                              &  + MAX( zdb_bl(ji,jj), 0.0 )
479                      ENDIF
480                      zzdhdt = 2.0 * zzdhdt / zpert
481               ENDIF
482               zdhdt(ji,jj) = zzdhdt
483           END DO
484      END DO
485
486      ! Calculate averages over depth of boundary layer
487      imld = ibld           ! use imld to hold previous blayer index
488      ibld(:,:) = 3
489
490      zhbl_t(:,:) = hbl(:,:) + (zdhdt(:,:) - ww(ji,jj,ibld(ji,jj)))* rn_rdt ! certainly need wb here, so subtract it
491      zhbl_t(:,:) = MIN(zhbl_t(:,:), ht_n(:,:))
492      zdhdt(:,:) = MIN(zdhdt(:,:), (zhbl_t(:,:) - hbl(:,:))/rn_rdt + ww(ji,jj,ibld(ji,jj))) ! adjustment to represent limiting by ocean bottom
493
494      DO jk = 4, jpkm1
495         DO jj = 2, jpjm1
496            DO ji = 2, jpim1
497               IF ( zhbl_t(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) THEN
498                  ibld(ji,jj) =  MIN(mbkt(ji,jj), jk)
499               ENDIF
500            END DO
501         END DO
502      END DO
503
504!
505! Step through model levels taking account of buoyancy change to determine the effect on dhdt
506!
507      DO jj = 2, jpjm1
508         DO ji = 2, jpim1
509            IF ( ibld(ji,jj) - imld(ji,jj) > 1 ) THEN
510!
511! If boundary layer changes by more than one level, need to check for stable layers between initial and final depths.
512!
513               zhbl_s = hbl(ji,jj)
514               jm = imld(ji,jj)
515               zthermal = rab_n(ji,jj,1,jp_tem)
516               zbeta = rab_n(ji,jj,1,jp_sal)
517               IF ( lconv(ji,jj) ) THEN
518!unstable
519                  zvel_max =  - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_rdt / hbl(ji,jj) ) &
520                       &   * zwb_ent(ji,jj) / ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
521
522                  DO jk = imld(ji,jj), ibld(ji,jj)
523                     zdb = MAX( grav * ( zthermal * ( zt_bl(ji,jj) - ts(ji,jj,jm,jp_tem,Kmm) ) &
524                          & - zbeta * ( zs_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ), 0.0 ) + zvel_max
525
526                     zhbl_s = zhbl_s + MIN( - zwb_ent(ji,jj) / zdb * rn_rdt / FLOAT(ibld(ji,jj)-imld(ji,jj) ), e3w(ji,jj,jk,Kmm) )
527                     zhbl_s = MIN(zhbl_s, ht_n(ji,jj))
528
529                     IF ( zhbl_s >= gdepw(ji,jj,jm+1,Kmm) ) jm = jm + 1
530                  END DO
531                  hbl(ji,jj) = zhbl_s
532                  ibld(ji,jj) = jm
533                  hbli(ji,jj) = hbl(ji,jj)
534               ELSE
535! stable
536                  DO jk = imld(ji,jj), ibld(ji,jj)
537                     zdb = MAX( grav * ( zthermal * ( zt_bl(ji,jj) - ts(ji,jj,jm,jp_tem,Kmm) )          &
538                          &               - zbeta * ( zs_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ), 0.0 ) &
539                          & + 2.0 * zwstrl(ji,jj)**2 / zhbl_s
540
541                     zhbl_s = zhbl_s +  (                                                                                &
542                          &                     0.32         *                         ( hbli(ji,jj) / zhbl_s -1.0 )     &
543                          &               * zwstrl(ji,jj)**3 / hbli(ji,jj)                                               &
544                          &               + ( ( 0.32 / 3.0 )           * EXP( -  2.5 * ( hbli(ji,jj) / zhbl_s -1.0 ) )   &
545                          &               -   ( 0.32 / 3.0  - 0.0485 ) * EXP( - 12.5 * ( hbli(ji,jj) / zhbl_s      ) ) ) &
546                          &          * zwstrl(ji,jj)**3 / hbli(ji,jj) ) / zdb * e3w(ji,jj,jk,Kmm) / zdhdt(ji,jj)  ! ALMG to investigate whether need to include ww here
547
548                     zhbl_s = MIN(zhbl_s, ht_n(ji,jj))
549                     IF ( zhbl_s >= gdepw(ji,jj,jm,Kmm) ) jm = jm + 1
550                  END DO
551                  hbl(ji,jj) = MAX(zhbl_s, gdepw(ji,jj,3,Kmm) )
552                  ibld(ji,jj) = MAX(jm, 3 )
553                  IF ( hbl(ji,jj) > hbli(ji,jj) ) hbli(ji,jj) = hbl(ji,jj)
554               ENDIF   ! IF ( lconv )
555            ELSE
556! change zero or one model level.
557               hbl(ji,jj) = zhbl_t(ji,jj)
558               IF ( lconv(ji,jj) ) THEN
559                  hbli(ji,jj) = hbl(ji,jj)
560               ELSE
561                  hbl(ji,jj) = MAX(hbl(ji,jj), gdepw(ji,jj,3,Kmm) )
562                  IF ( hbl(ji,jj) > hbli(ji,jj) ) hbli(ji,jj) = hbl(ji,jj)
563               ENDIF
564            ENDIF
565            zhbl(ji,jj) = gdepw(ji,jj,ibld(ji,jj),Kmm)
566         END DO
567      END DO
568      dstokes(:,:) = MIN ( dstokes(:,:), hbl(:,:)/3. )  !  Limit delta for shallow boundary layers for calculating flux-gradient terms.
569
570! Recalculate averages over boundary layer after depth updated
571     ! Consider later  combining this into the loop above and looking for columns
572     ! where the index for base of the boundary layer have changed
573      DO jj = 2, jpjm1                                 !  Vertical slab
574         DO ji = 2, jpim1
575               zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1??
576               zbeta    = rab_n(ji,jj,1,jp_sal)
577               zt   = 0._wp
578               zs   = 0._wp
579               zu   = 0._wp
580               zv   = 0._wp
581               ! average over depth of boundary layer
582               zthick=0._wp
583               DO jm = 2, ibld(ji,jj)
584                  zthick=zthick+e3t(ji,jj,jm,Kmm)
585                  zt   = zt  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_tem,Kmm)
586                  zs   = zs  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_sal,Kmm)
587                  zu   = zu  + e3t(ji,jj,jm,Kmm) &
588                     &            * ( uu(ji,jj,jm,Kbb) + uu(ji - 1,jj,jm,Kbb) ) &
589                     &            / MAX( 1. , umask(ji,jj,jm) + umask(ji - 1,jj,jm) )
590                  zv   = zv  + e3t(ji,jj,jm,Kmm) &
591                     &            * ( vv(ji,jj,jm,Kbb) + vv(ji,jj - 1,jm,Kbb) ) &
592                     &            / MAX( 1. , vmask(ji,jj,jm) + vmask(ji,jj - 1,jm) )
593               END DO
594               zt_bl(ji,jj) = zt / zthick
595               zs_bl(ji,jj) = zs / zthick
596               zu_bl(ji,jj) = zu / zthick
597               zv_bl(ji,jj) = zv / zthick
598               zdt_bl(ji,jj) = zt_bl(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_tem,Kmm)
599               zds_bl(ji,jj) = zs_bl(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_sal,Kmm)
600               zdu_bl(ji,jj) = zu_bl(ji,jj) - ( uu(ji,jj,ibld(ji,jj),Kbb) + uu(ji-1,jj,ibld(ji,jj) ,Kbb) ) &
601                      &   / MAX(1. , umask(ji,jj,ibld(ji,jj) ) + umask(ji-1,jj,ibld(ji,jj) ) )
602               zdv_bl(ji,jj) = zv_bl(ji,jj) - ( vv(ji,jj,ibld(ji,jj),Kbb) + vv(ji,jj-1,ibld(ji,jj) ,Kbb) ) &
603                      &  / MAX(1. , vmask(ji,jj,ibld(ji,jj) ) + vmask(ji,jj-1,ibld(ji,jj) ) )
604               zdb_bl(ji,jj) = grav * zthermal * zdt_bl(ji,jj) - grav * zbeta * zds_bl(ji,jj)
605               zhbl(ji,jj) = gdepw(ji,jj,ibld(ji,jj),Kmm)
606               IF ( lconv(ji,jj) ) THEN
607                  IF ( zdb_bl(ji,jj) > 0._wp )THEN
608                     IF ( ( zwstrc(ji,jj) / zvstr(ji,jj) )**3 <= 0.5 ) THEN  ! near neutral stability
609                           zari = 4.5 * ( zvstr(ji,jj)**2 ) &
610                             & / ( zdb_bl(ji,jj) * zhbl(ji,jj) ) + 0.01
611                     ELSE                                                     ! unstable
612                           zari = 4.5 * ( zwstrc(ji,jj)**2 ) &
613                             & / ( zdb_bl(ji,jj) * zhbl(ji,jj) ) + 0.01
614                     ENDIF
615                     IF ( zari > 0.2 ) THEN                                                ! This test checks for weakly stratified pycnocline
616                        zari = 0.2
617                        zwb_ent(ji,jj) = 0._wp
618                     ENDIF
619                     inhml = MAX( INT( zari * zhbl(ji,jj) / e3t(ji,jj,ibld(ji,jj),Kmm) ) , 1 )
620                     imld(ji,jj) = MAX( ibld(ji,jj) - inhml, 1)
621                     zhml(ji,jj) = gdepw(ji,jj,imld(ji,jj),Kmm)
622                     zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj)
623                  ELSE  ! IF (zdb_bl)
624                     imld(ji,jj) = ibld(ji,jj) - 1
625                     zhml(ji,jj) = gdepw(ji,jj,imld(ji,jj),Kmm)
626                     zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj)
627                  ENDIF
628               ELSE   ! IF (lconv)
629                  IF ( zdhdt(ji,jj) >= 0.0 ) THEN    ! probably shouldn't include wm here
630                  ! boundary layer deepening
631                     IF ( zdb_bl(ji,jj) > 0._wp ) THEN
632                  ! pycnocline thickness set by stratification - use same relationship as for neutral conditions.
633                        zari = MIN( 4.5 * ( zvstr(ji,jj)**2 ) &
634                          & / ( zdb_bl(ji,jj) * zhbl(ji,jj) ) + 0.01  , 0.2 )
635                        inhml = MAX( INT( zari * zhbl(ji,jj) / e3t(ji,jj,ibld(ji,jj),Kmm) ) , 1 )
636                        imld(ji,jj) = MAX( ibld(ji,jj) - inhml, 1)
637                        zhml(ji,jj) = gdepw(ji,jj,imld(ji,jj),Kmm)
638                        zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj)
639                     ELSE
640                        imld(ji,jj) = ibld(ji,jj) - 1
641                        zhml(ji,jj) = gdepw(ji,jj,imld(ji,jj),Kmm)
642                        zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj)
643                     ENDIF ! IF (zdb_bl > 0.0)
644                  ELSE     ! IF(dhdt >= 0)
645                  ! boundary layer collapsing.
646                     imld(ji,jj) = ibld(ji,jj)
647                     zhml(ji,jj) = zhbl(ji,jj)
648                     zdh(ji,jj) = 0._wp
649                  ENDIF    ! IF (dhdt >= 0)
650               ENDIF       ! IF (lconv)
651         END DO
652      END DO
653
654      ! Average over the depth of the mixed layer in the convective boundary layer
655      ! Also calculate entrainment fluxes for temperature and salinity
656      DO jj = 2, jpjm1                                 !  Vertical slab
657         DO ji = 2, jpim1
658            zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1??
659            zbeta    = rab_n(ji,jj,1,jp_sal)
660            IF ( lconv(ji,jj) ) THEN
661               zt   = 0._wp
662               zs   = 0._wp
663               zu   = 0._wp
664               zv   = 0._wp
665               ! average over depth of boundary layer
666               zthick=0._wp
667               DO jm = 2, imld(ji,jj)
668                  zthick=zthick+e3t(ji,jj,jm,Kmm)
669                  zt   = zt  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_tem,Kmm)
670                  zs   = zs  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_sal,Kmm)
671                  zu   = zu  + e3t(ji,jj,jm,Kmm) &
672                     &            * ( uu(ji,jj,jm,Kbb) + uu(ji - 1,jj,jm,Kbb) ) &
673                     &            / MAX( 1. , umask(ji,jj,jm) + umask(ji - 1,jj,jm) )
674                  zv   = zv  + e3t(ji,jj,jm,Kmm) &
675                     &            * ( vv(ji,jj,jm,Kbb) + vv(ji,jj - 1,jm,Kbb) ) &
676                     &            / MAX( 1. , vmask(ji,jj,jm) + vmask(ji,jj - 1,jm) )
677               END DO
678               zt_ml(ji,jj) = zt / zthick
679               zs_ml(ji,jj) = zs / zthick
680               zu_ml(ji,jj) = zu / zthick
681               zv_ml(ji,jj) = zv / zthick
682               zdt_ml(ji,jj) = zt_ml(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_tem,Kmm)
683               zds_ml(ji,jj) = zs_ml(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_sal,Kmm)
684               zdu_ml(ji,jj) = zu_ml(ji,jj) - ( uu(ji,jj,ibld(ji,jj),Kbb) + uu(ji-1,jj,ibld(ji,jj) ,Kbb) ) &
685                     &    / MAX(1. , umask(ji,jj,ibld(ji,jj) ) + umask(ji-1,jj,ibld(ji,jj) ) )
686               zdv_ml(ji,jj) = zv_ml(ji,jj) - ( vv(ji,jj,ibld(ji,jj),Kbb) + vv(ji,jj-1,ibld(ji,jj) ,Kbb) ) &
687                     &    / MAX(1. , vmask(ji,jj,ibld(ji,jj) ) + vmask(ji,jj-1,ibld(ji,jj) ) )
688               zdb_ml(ji,jj) = grav * zthermal * zdt_ml(ji,jj) - grav * zbeta * zds_ml(ji,jj)
689            ELSE
690            ! stable, if entraining calulate average below interface layer.
691               IF ( zdhdt(ji,jj) >= 0._wp ) THEN
692                  zt   = 0._wp
693                  zs   = 0._wp
694                  zu   = 0._wp
695                  zv   = 0._wp
696                  ! average over depth of boundary layer
697                  zthick=0._wp
698                  DO jm = 2, imld(ji,jj)
699                     zthick=zthick+e3t(ji,jj,jm,Kmm)
700                     zt   = zt  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_tem,Kmm)
701                     zs   = zs  + e3t(ji,jj,jm,Kmm) * ts(ji,jj,jm,jp_sal,Kmm)
702                     zu   = zu  + e3t(ji,jj,jm,Kmm) &
703                        &            * ( uu(ji,jj,jm,Kbb) + uu(ji - 1,jj,jm,Kbb) ) &
704                        &            / MAX( 1. , umask(ji,jj,jm) + umask(ji - 1,jj,jm) )
705                     zv   = zv  + e3t(ji,jj,jm,Kmm) &
706                        &            * ( vv(ji,jj,jm,Kbb) + vv(ji,jj - 1,jm,Kbb) ) &
707                        &            / MAX( 1. , vmask(ji,jj,jm) + vmask(ji,jj - 1,jm) )
708                  END DO
709                  zt_ml(ji,jj) = zt / zthick
710                  zs_ml(ji,jj) = zs / zthick
711                  zu_ml(ji,jj) = zu / zthick
712                  zv_ml(ji,jj) = zv / zthick
713                  zdt_ml(ji,jj) = zt_ml(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_tem,Kmm)
714                  zds_ml(ji,jj) = zs_ml(ji,jj) - ts(ji,jj,ibld(ji,jj),jp_sal,Kmm)
715                  zdu_ml(ji,jj) = zu_ml(ji,jj) - ( uu(ji,jj,ibld(ji,jj),Kbb) + uu(ji-1,jj,ibld(ji,jj) ,Kbb) ) &
716                        &    / MAX(1. , umask(ji,jj,ibld(ji,jj) ) + umask(ji-1,jj,ibld(ji,jj) ) )
717                  zdv_ml(ji,jj) = zv_ml(ji,jj) - ( vv(ji,jj,ibld(ji,jj),Kbb) + vv(ji,jj-1,ibld(ji,jj) ,Kbb) ) &
718                        &    / MAX(1. , vmask(ji,jj,ibld(ji,jj) ) + vmask(ji,jj-1,ibld(ji,jj) ) )
719                  zdb_ml(ji,jj) = grav * zthermal * zdt_ml(ji,jj) - grav * zbeta * zds_ml(ji,jj)
720               ENDIF
721            ENDIF
722         END DO
723      END DO
724    !
725    ! rotate mean currents and changes onto wind align co-ordinates
726    !
727
728      DO jj = 2, jpjm1
729         DO ji = 2, jpim1
730            ztemp = zu_ml(ji,jj)
731            zu_ml(ji,jj) = zu_ml(ji,jj) * zcos_wind(ji,jj) + zv_ml(ji,jj) * zsin_wind(ji,jj)
732            zv_ml(ji,jj) = zv_ml(ji,jj) * zcos_wind(ji,jj) - ztemp * zsin_wind(ji,jj)
733            ztemp = zdu_ml(ji,jj)
734            zdu_ml(ji,jj) = zdu_ml(ji,jj) * zcos_wind(ji,jj) + zdv_ml(ji,jj) * zsin_wind(ji,jj)
735            zdv_ml(ji,jj) = zdv_ml(ji,jj) * zsin_wind(ji,jj) - ztemp * zsin_wind(ji,jj)
736    !
737            ztemp = zu_bl(ji,jj)
738            zu_bl = zu_bl(ji,jj) * zcos_wind(ji,jj) + zv_bl(ji,jj) * zsin_wind(ji,jj)
739            zv_bl(ji,jj) = zv_bl(ji,jj) * zcos_wind(ji,jj) - ztemp * zsin_wind(ji,jj)
740            ztemp = zdu_bl(ji,jj)
741            zdu_bl(ji,jj) = zdu_bl(ji,jj) * zcos_wind(ji,jj) + zdv_bl(ji,jj) * zsin_wind(ji,jj)
742            zdv_bl(ji,jj) = zdv_bl(ji,jj) * zsin_wind(ji,jj) - ztemp * zsin_wind(ji,jj)
743         END DO
744      END DO
745
746     zuw_bse = 0._wp
747     zvw_bse = 0._wp
748     DO jj = 2, jpjm1
749        DO ji = 2, jpim1
750
751           IF ( lconv(ji,jj) ) THEN
752              IF ( zdb_bl(ji,jj) > 0._wp ) THEN
753                 zwth_ent(ji,jj) = zwb_ent(ji,jj) * zdt_ml(ji,jj) / (zdb_ml(ji,jj) + epsln)
754                 zws_ent(ji,jj) = zwb_ent(ji,jj) * zds_ml(ji,jj) / (zdb_ml(ji,jj) + epsln)
755              ENDIF
756           ELSE
757              zwth_ent(ji,jj) = -2.0 * zwthav(ji,jj) * ( (1.0 - 0.8) - ( 1.0 - 0.8)**(3.0/2.0) )
758              zws_ent(ji,jj) = -2.0 * zwsav(ji,jj) * ( (1.0 - 0.8 ) - ( 1.0 - 0.8 )**(3.0/2.0) )
759           ENDIF
760        END DO
761     END DO
762
763      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
764      !  Pycnocline gradients for scalars and velocity
765      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
766
767       DO jj = 2, jpjm1
768          DO ji = 2, jpim1
769          !
770             IF ( lconv (ji,jj) ) THEN
771             ! Unstable conditions
772                IF( zdb_bl(ji,jj) > 0._wp ) THEN
773                ! calculate pycnocline profiles, no need if zdb_bl <= 0. since profile is zero and arrays have been initialized to zero
774                   ztgrad = ( zdt_ml(ji,jj) / zdh(ji,jj) )
775                   zsgrad = ( zds_ml(ji,jj) / zdh(ji,jj) )
776                   zbgrad = ( zdb_ml(ji,jj) / zdh(ji,jj) )
777                   DO jk = 2 , ibld(ji,jj)
778                      znd = -( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zdh(ji,jj)
779                      zdtdz_pyc(ji,jj,jk) =  ztgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
780                      zdbdz_pyc(ji,jj,jk) =  zbgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
781                      zdsdz_pyc(ji,jj,jk) =  zsgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
782                   END DO
783                ENDIF
784             ELSE
785             ! stable conditions
786             ! if pycnocline profile only defined when depth steady of increasing.
787                IF ( zdhdt(ji,jj) >= 0.0 ) THEN        ! Depth increasing, or steady.
788                   IF ( zdb_bl(ji,jj) > 0._wp ) THEN
789                     IF ( zhol(ji,jj) >= 0.5 ) THEN      ! Very stable - 'thick' pycnocline
790                         ztgrad = zdt_bl(ji,jj) / zhbl(ji,jj)
791                         zsgrad = zds_bl(ji,jj) / zhbl(ji,jj)
792                         zbgrad = zdb_bl(ji,jj) / zhbl(ji,jj)
793                         DO jk = 2, ibld(ji,jj)
794                            znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj)
795                            zdtdz_pyc(ji,jj,jk) =  ztgrad * EXP( -15.0 * ( znd - 0.9 )**2 )
796                            zdbdz_pyc(ji,jj,jk) =  zbgrad * EXP( -15.0 * ( znd - 0.9 )**2 )
797                            zdsdz_pyc(ji,jj,jk) =  zsgrad * EXP( -15.0 * ( znd - 0.9 )**2 )
798                         END DO
799                     ELSE                                   ! Slightly stable - 'thin' pycnoline - needed when stable layer begins to form.
800                         ztgrad = zdt_bl(ji,jj) / zdh(ji,jj)
801                         zsgrad = zds_bl(ji,jj) / zdh(ji,jj)
802                         zbgrad = zdb_bl(ji,jj) / zdh(ji,jj)
803                         DO jk = 2, ibld(ji,jj)
804                            znd = -( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zdh(ji,jj)
805                            zdtdz_pyc(ji,jj,jk) =  ztgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
806                            zdbdz_pyc(ji,jj,jk) =  zbgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
807                            zdsdz_pyc(ji,jj,jk) =  zsgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
808                         END DO
809                      ENDIF ! IF (zhol >=0.5)
810                   ENDIF    ! IF (zdb_bl> 0.)
811                ENDIF       ! IF (zdhdt >= 0) zdhdt < 0 not considered since pycnocline profile is zero, profile arrays are intialized to zero
812             ENDIF          ! IF (lconv)
813            !
814          END DO
815       END DO
816!
817       DO jj = 2, jpjm1
818          DO ji = 2, jpim1
819          !
820             IF ( lconv (ji,jj) ) THEN
821             ! Unstable conditions
822                 zugrad = ( zdu_ml(ji,jj) / zdh(ji,jj) ) + 0.275 * zustar(ji,jj)*zustar(ji,jj) / &
823               & (( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * zhml(ji,jj) ) / zla(ji,jj)**(8.0/3.0)
824                zvgrad = ( zdv_ml(ji,jj) / zdh(ji,jj) ) + 3.5 * ff_t(ji,jj) * zustke(ji,jj) / &
825              & ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
826                DO jk = 2 , ibld(ji,jj)-1
827                   znd = -( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zdh(ji,jj)
828                   zdudz_pyc(ji,jj,jk) =  zugrad * EXP( -1.75 * ( znd + 0.75 )**2 )
829                   zdvdz_pyc(ji,jj,jk) = zvgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
830                END DO
831             ELSE
832             ! stable conditions
833                zugrad = 3.25 * zdu_bl(ji,jj) / zhbl(ji,jj)
834                zvgrad = 2.75 * zdv_bl(ji,jj) / zhbl(ji,jj)
835                DO jk = 2, ibld(ji,jj)
836                   znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj)
837                   IF ( znd < 1.0 ) THEN
838                      zdudz_pyc(ji,jj,jk) = zugrad * EXP( -40.0 * ( znd - 1.0 )**2 )
839                   ELSE
840                      zdudz_pyc(ji,jj,jk) = zugrad * EXP( -20.0 * ( znd - 1.0 )**2 )
841                   ENDIF
842                   zdvdz_pyc(ji,jj,jk) = zvgrad * EXP( -20.0 * ( znd - 0.85 )**2 )
843                END DO
844             ENDIF
845            !
846          END DO
847       END DO
848       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
849       ! Eddy viscosity/diffusivity and non-gradient terms in the flux-gradient relationship
850       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
851
852      ! WHERE ( lconv )
853      !     zdifml_sc = zhml * ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird
854      !     zvisml_sc = zdifml_sc
855      !     zdifpyc_sc = 0.165 * ( zwstrl**3 + zwstrc**3 )**pthird * ( zhbl - zhml )
856      !     zvispyc_sc = 0.142 * ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * ( zhbl - zhml )
857      !     zbeta_d_sc = 1.0 - (0.165 / 0.8 * ( zhbl - zhml ) / zhbl )**p2third
858      !     zbeta_v_sc = 1.0 -  2.0 * (0.142 /0.375) * (zhbl - zhml ) / zhml
859      !  ELSEWHERE
860      !     zdifml_sc = zwstrl * zhbl * EXP ( -( zhol / 0.183_wp )**2 )
861      !     zvisml_sc = zwstrl * zhbl * EXP ( -( zhol / 0.183_wp )**2 )
862      !  ENDWHERE
863       DO jj = 2, jpjm1
864          DO ji = 2, jpim1
865             IF ( lconv(ji,jj) ) THEN
866               zdifml_sc(ji,jj) = zhml(ji,jj) * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
867               zvisml_sc(ji,jj) = zdifml_sc(ji,jj)
868               zdifpyc_sc(ji,jj) = 0.165 * ( zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3 )**pthird * zdh(ji,jj)
869               zvispyc_sc(ji,jj) = 0.142 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * zdh(ji,jj)
870               zbeta_d_sc(ji,jj) = 1.0 - (0.165 / 0.8 * zdh(ji,jj) / zhbl(ji,jj) )**p2third
871               zbeta_v_sc(ji,jj) = 1.0 -  2.0 * (0.142 /0.375) * zdh(ji,jj) / zhml(ji,jj)
872             ELSE
873               zdifml_sc(ji,jj) = zvstr(ji,jj) * zhbl(ji,jj) * EXP ( -( zhol(ji,jj) / 0.6_wp )**2 )
874               zvisml_sc(ji,jj) = zvstr(ji,jj) * zhbl(ji,jj) * EXP ( -( zhol(ji,jj) / 0.6_wp )**2 )
875            END IF
876        END DO
877    END DO
878!
879       DO jj = 2, jpjm1
880          DO ji = 2, jpim1
881             IF ( lconv(ji,jj) ) THEN
882                DO jk = 2, imld(ji,jj)   ! mixed layer diffusivity
883                    zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj)
884                    !
885                    zdiffut(ji,jj,jk) = 0.8   * zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_d_sc(ji,jj) * zznd_ml    )**1.5
886                    !
887                    zviscos(ji,jj,jk) = 0.375 * zvisml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_v_sc(ji,jj) * zznd_ml    ) &
888                         &            *                                      ( 1.0 -               0.5 * zznd_ml**2 )
889                END DO
890                ! pycnocline - if present linear profile
891                IF ( zdh(ji,jj) > 0._wp ) THEN
892                   DO jk = imld(ji,jj)+1 , ibld(ji,jj)
893                       zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zdh(ji,jj)
894                       !
895                       zdiffut(ji,jj,jk) = zdifpyc_sc(ji,jj) * ( 1.0 + zznd_pyc )
896                       !
897                       zviscos(ji,jj,jk) = zvispyc_sc(ji,jj) * ( 1.0 + zznd_pyc )
898                   END DO
899                ENDIF
900                ! Temporay fix to ensure zdiffut is +ve; won't be necessary with ww taken out
901                zdiffut(ji,jj,ibld(ji,jj)) = zdhdt(ji,jj)* e3t(ji,jj,ibld(ji,jj),Kmm)
902                ! could be taken out, take account of entrainment represents as a diffusivity
903                ! should remove w from here, represents entrainment
904             ELSE
905             ! stable conditions
906                DO jk = 2, ibld(ji,jj)
907                   zznd_ml = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj)
908                   zdiffut(ji,jj,jk) = 0.75 * zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zznd_ml )**1.5
909                   zviscos(ji,jj,jk) = 0.375 * zvisml_sc(ji,jj) * zznd_ml * (1.0 - zznd_ml) * ( 1.0 - zznd_ml**2 )
910                END DO
911             ENDIF   ! end if ( lconv )
912!
913          END DO  ! end of ji loop
914       END DO     ! end of jj loop
915
916       !
917       ! calculate non-gradient components of the flux-gradient relationships
918       !
919! Stokes term in scalar flux, flux-gradient relationship
920       WHERE ( lconv )
921          zsc_wth_1 = zwstrl**3 * zwth0 / ( zvstr**3 + 0.5 * zwstrc**3 + epsln)
922          !
923          zsc_ws_1 = zwstrl**3 * zws0 / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
924       ELSEWHERE
925          zsc_wth_1 = 2.0 * zwthav
926          !
927          zsc_ws_1 = 2.0 * zwsav
928       ENDWHERE
929
930
931       DO jj = 2, jpjm1
932          DO ji = 2, jpim1
933            IF ( lconv(ji,jj) ) THEN
934              DO jk = 2, imld(ji,jj)
935                 zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
936                 ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 1.35 * EXP ( -zznd_d ) * ( 1.0 - EXP ( -2.0 * zznd_d ) ) * zsc_wth_1(ji,jj)
937                 !
938                 ghams(ji,jj,jk) = ghams(ji,jj,jk) + 1.35 * EXP ( -zznd_d ) * ( 1.0 - EXP ( -2.0 * zznd_d ) ) *  zsc_ws_1(ji,jj)
939              END DO ! end jk loop
940            ELSE     ! else for if (lconv)
941 ! Stable conditions
942               DO jk = 2, ibld(ji,jj)
943                  zznd_d=gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
944                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 1.5 * EXP ( -0.9 * zznd_d ) &
945                       &          *                 ( 1.0 - EXP ( -4.0 * zznd_d ) ) * zsc_wth_1(ji,jj)
946                  !
947                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 1.5 * EXP ( -0.9 * zznd_d ) &
948                       &          *                 ( 1.0 - EXP ( -4.0 * zznd_d ) ) *  zsc_ws_1(ji,jj)
949               END DO
950            ENDIF               ! endif for check on lconv
951
952          END DO  ! end of ji loop
953       END DO     ! end of jj loop
954
955
956! Stokes term in flux-gradient relationship (note in zsc_uw_n don't use zvstr since term needs to go to zero as zwstrl goes to zero)
957       WHERE ( lconv )
958          zsc_uw_1 = ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * zustke /( 1.0 - 1.0 * 6.5 * zla**(8.0/3.0) )
959          zsc_uw_2 = ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * zustke / ( zla**(8.0/3.0) + epsln )
960          zsc_vw_1 = ff_t * zhml * zustke**3 * zla**(8.0/3.0) / ( ( zvstr**3 + 0.5 * zwstrc**3 )**(2.0/3.0) + epsln )
961       ELSEWHERE
962          zsc_uw_1 = zustar**2
963          zsc_vw_1 = ff_t * zhbl * zustke**3 * zla**(8.0/3.0) / (zvstr**2 + epsln)
964       ENDWHERE
965
966       DO jj = 2, jpjm1
967          DO ji = 2, jpim1
968             IF ( lconv(ji,jj) ) THEN
969                DO jk = 2, imld(ji,jj)
970                   zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
971                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) +      ( -0.05 * EXP ( -0.4 * zznd_d )   * zsc_uw_1(ji,jj)   &
972                        &          +                        0.00125 * EXP (      - zznd_d )   * zsc_uw_2(ji,jj) ) &
973                        &          *                          ( 1.0 - EXP ( -2.0 * zznd_d ) )
974!
975                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) - 0.65 *  0.15 * EXP (      - zznd_d )                       &
976                        &          *                          ( 1.0 - EXP ( -2.0 * zznd_d ) ) * zsc_vw_1(ji,jj)
977                END DO   ! end jk loop
978             ELSE
979! Stable conditions
980                DO jk = 2, ibld(ji,jj) ! corrected to ibld
981                   zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
982                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) - 0.75 *   1.3 * EXP ( -0.5 * zznd_d )                       &
983                        &                                   * ( 1.0 - EXP ( -4.0 * zznd_d ) ) * zsc_uw_1(ji,jj)
984                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + 0._wp
985                END DO   ! end jk loop
986             ENDIF
987          END DO  ! ji loop
988       END DO     ! jj loo
989
990! Buoyancy term in flux-gradient relationship [note : includes ROI ratio (X0.3) and pressure (X0.5)]
991
992       WHERE ( lconv )
993          zsc_wth_1 = zwbav * zwth0 * ( 1.0 + EXP ( 0.2 * zhol ) ) / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
994          zsc_ws_1  = zwbav * zws0  * ( 1.0 + EXP ( 0.2 * zhol ) ) / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
995       ELSEWHERE
996          zsc_wth_1 = 0._wp
997          zsc_ws_1 = 0._wp
998       ENDWHERE
999
1000       DO jj = 2, jpjm1
1001          DO ji = 2, jpim1
1002             IF (lconv(ji,jj) ) THEN
1003                DO jk = 2, imld(ji,jj)
1004                   zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj)
1005                   ! calculate turbulent length scale
1006                   zl_c = 0.9 * ( 1.0 - EXP ( - 7.0 * ( zznd_ml - zznd_ml**3 / 3.0 ) ) )                                           &
1007                        &     * ( 1.0 - EXP ( -15.0 * (     1.1 - zznd_ml          ) ) )
1008                   zl_l = 2.0 * ( 1.0 - EXP ( - 2.0 * ( zznd_ml - zznd_ml**3 / 3.0 ) ) )                                           &
1009                        &     * ( 1.0 - EXP ( - 5.0 * (     1.0 - zznd_ml          ) ) ) * ( 1.0 + dstokes(ji,jj) / zhml (ji,jj) )
1010                   zl_eps = zl_l + ( zl_c - zl_l ) / ( 1.0 + EXP ( 3.0 * LOG10 ( - zhol(ji,jj) ) ) ) ** (3.0/2.0)
1011                   ! non-gradient buoyancy terms
1012                   ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * 0.5 * zsc_wth_1(ji,jj) * zl_eps * zhml(ji,jj) / ( 0.15 + zznd_ml )
1013                   ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * 0.5 *  zsc_ws_1(ji,jj) * zl_eps * zhml(ji,jj) / ( 0.15 + zznd_ml )
1014                END DO
1015             ELSE
1016                DO jk = 2, ibld(ji,jj)
1017                   ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zsc_wth_1(ji,jj)
1018                   ghams(ji,jj,jk) = ghams(ji,jj,jk) +  zsc_ws_1(ji,jj)
1019                END DO
1020             ENDIF
1021          END DO   ! ji loop
1022       END DO      ! jj loop
1023
1024
1025       WHERE ( lconv )
1026          zsc_uw_1 = -zwb0 * zustar**2 * zhml / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
1027          zsc_uw_2 =  zwb0 * zustke    * zhml / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )**(2.0/3.0)
1028          zsc_vw_1 = 0._wp
1029       ELSEWHERE
1030         zsc_uw_1 = 0._wp
1031         zsc_vw_1 = 0._wp
1032       ENDWHERE
1033
1034       DO jj = 2, jpjm1
1035          DO ji = 2, jpim1
1036             IF ( lconv(ji,jj) ) THEN
1037                DO jk = 2 , imld(ji,jj)
1038                   zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
1039                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.3 * 0.5 * ( zsc_uw_1(ji,jj) +   0.125 * EXP( -0.5 * zznd_d )     &
1040                        &                                                            * (   1.0 - EXP( -0.5 * zznd_d ) )   &
1041                        &                                          * zsc_uw_2(ji,jj)                                    )
1042                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj)
1043                END DO  ! jk loop
1044             ELSE
1045             ! stable conditions
1046                DO jk = 2, ibld(ji,jj)
1047                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zsc_uw_1(ji,jj)
1048                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj)
1049                END DO
1050             ENDIF
1051          END DO        ! ji loop
1052       END DO           ! jj loop
1053
1054! Transport term in flux-gradient relationship [note : includes ROI ratio (X0.3) ]
1055
1056       WHERE ( lconv )
1057          zsc_wth_1 = zwth0
1058          zsc_ws_1 = zws0
1059       ELSEWHERE
1060          zsc_wth_1 = 2.0 * zwthav
1061          zsc_ws_1 = zws0
1062       ENDWHERE
1063
1064       DO jj = 2, jpjm1
1065          DO ji = 2, jpim1
1066            IF ( lconv(ji,jj) ) THEN
1067               DO jk = 2, imld(ji,jj)
1068                  zznd_ml=gdepw(ji,jj,jk,Kmm) / zhml(ji,jj)
1069                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * zsc_wth_1(ji,jj)                &
1070                       &          * ( -2.0 + 2.75 * (       ( 1.0 + 0.6 * zznd_ml**4 )      &
1071                       &                               - EXP(     - 6.0 * zznd_ml    ) ) )  &
1072                       &          * ( 1.0 - EXP( - 15.0 * (         1.0 - zznd_ml    ) ) )
1073                  !
1074                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * zsc_ws_1(ji,jj)  &
1075                       &          * ( -2.0 + 2.75 * (       ( 1.0 + 0.6 * zznd_ml**4 )      &
1076                       &                               - EXP(     - 6.0 * zznd_ml    ) ) )  &
1077                       &          * ( 1.0 - EXP ( -15.0 * (         1.0 - zznd_ml    ) ) )
1078               END DO
1079            ELSE
1080               DO jk = 2, ibld(ji,jj)
1081                  zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
1082                  znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj)
1083                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * ( -4.06 * EXP( -2.0 * zznd_d ) * (1.0 - EXP( -4.0 * zznd_d ) ) + &
1084               &  7.5 * EXP ( -10.0 * ( 0.95 - znd )**2 ) * ( 1.0 - znd ) ) * zsc_wth_1(ji,jj)
1085                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * ( -4.06 * EXP( -2.0 * zznd_d ) * (1.0 - EXP( -4.0 * zznd_d ) ) + &
1086               &  7.5 * EXP ( -10.0 * ( 0.95 - znd )**2 ) * ( 1.0 - znd ) ) * zsc_ws_1(ji,jj)
1087               END DO
1088            ENDIF
1089          ENDDO    ! ji loop
1090       END DO      ! jj loop
1091
1092
1093       WHERE ( lconv )
1094          zsc_uw_1 = zustar**2
1095          zsc_vw_1 = ff_t * zustke * zhml
1096       ELSEWHERE
1097          zsc_uw_1 = zustar**2
1098          zsc_uw_2 = (2.25 - 3.0 * ( 1.0 - EXP( -1.25 * 2.0 ) ) ) * ( 1.0 - EXP( -4.0 * 2.0 ) ) * zsc_uw_1
1099          zsc_vw_1 = ff_t * zustke * zhbl
1100          zsc_vw_2 = -0.11 * SIN( 3.14159 * ( 2.0 + 0.4 ) ) * EXP(-( 1.5 + 2.0 )**2 ) * zsc_vw_1
1101       ENDWHERE
1102
1103       DO jj = 2, jpjm1
1104          DO ji = 2, jpim1
1105             IF ( lconv(ji,jj) ) THEN
1106               DO jk = 2, imld(ji,jj)
1107                  zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj)
1108                  zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
1109                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk)&
1110                       & + 0.3 * ( -2.0 + 2.5 * ( 1.0 + 0.1 * zznd_ml**4 ) - EXP ( -8.0 * zznd_ml ) ) * zsc_uw_1(ji,jj)
1111                  !
1112                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk)&
1113                       & + 0.3 * 0.1 * ( EXP( -zznd_d ) + EXP( -5.0 * ( 1.0 - zznd_ml ) ) ) * zsc_vw_1(ji,jj)
1114               END DO
1115             ELSE
1116               DO jk = 2, ibld(ji,jj)
1117                  znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj)
1118                  zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj)
1119                  IF ( zznd_d <= 2.0 ) THEN
1120                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.5 * 0.3 &
1121                          &*  ( 2.25 - 3.0  * ( 1.0 - EXP( - 1.25 * zznd_d ) ) * ( 1.0 - EXP( -2.0 * zznd_d ) ) ) * zsc_uw_1(ji,jj)
1122                     !
1123                  ELSE
1124                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk)&
1125                          & + 0.5 * 0.3 * ( 1.0 - EXP( -5.0 * ( 1.0 - znd ) ) ) * zsc_uw_2(ji,jj)
1126                     !
1127                  ENDIF
1128
1129                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk)&
1130                       & + 0.3 * 0.15 * SIN( 3.14159 * ( 0.65 * zznd_d ) ) * EXP( -0.25 * zznd_d**2 ) * zsc_vw_1(ji,jj)
1131                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk)&
1132                       & + 0.3 * 0.15 * EXP( -5.0 * ( 1.0 - znd ) ) * ( 1.0 - EXP( -20.0 * ( 1.0 - znd ) ) ) * zsc_vw_2(ji,jj)
1133               END DO
1134             ENDIF
1135          END DO
1136       END DO
1137!
1138! Make surface forced velocity non-gradient terms go to zero at the base of the mixed layer.
1139
1140      DO jj = 2, jpjm1
1141         DO ji = 2, jpim1
1142            IF ( lconv(ji,jj) ) THEN
1143               DO jk = 2, ibld(ji,jj)
1144                  znd = ( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zhml(ji,jj) !ALMG to think about
1145                  IF ( znd >= 0.0 ) THEN
1146                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * ( 1.0 - EXP( -30.0 * znd**2 ) )
1147                     ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * ( 1.0 - EXP( -30.0 * znd**2 ) )
1148                  ELSE
1149                     ghamu(ji,jj,jk) = 0._wp
1150                     ghamv(ji,jj,jk) = 0._wp
1151                  ENDIF
1152               END DO
1153            ELSE
1154               DO jk = 2, ibld(ji,jj)
1155                  znd = ( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zhml(ji,jj) !ALMG to think about
1156                  IF ( znd >= 0.0 ) THEN
1157                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * ( 1.0 - EXP( -10.0 * znd**2 ) )
1158                     ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * ( 1.0 - EXP( -10.0 * znd**2 ) )
1159                  ELSE
1160                     ghamu(ji,jj,jk) = 0._wp
1161                     ghamv(ji,jj,jk) = 0._wp
1162                  ENDIF
1163               END DO
1164            ENDIF
1165         END DO
1166      END DO
1167
1168      ! pynocline contributions
1169       ! Temporary fix to avoid instabilities when zdb_bl becomes very very small
1170       zsc_uw_1 = 0._wp ! 50.0 * zla**(8.0/3.0) * zustar**2 * zhbl / ( zdb_bl + epsln )
1171       DO jj = 2, jpjm1
1172          DO ji = 2, jpim1
1173             DO jk= 2, ibld(ji,jj)
1174                znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj)
1175                ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zdiffut(ji,jj,jk) * zdtdz_pyc(ji,jj,jk)
1176                ghams(ji,jj,jk) = ghams(ji,jj,jk) + zdiffut(ji,jj,jk) * zdsdz_pyc(ji,jj,jk)
1177                ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zviscos(ji,jj,jk) * zdudz_pyc(ji,jj,jk)
1178                ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zsc_uw_1(ji,jj) * ( 1.0 - znd )**(7.0/4.0) * zdbdz_pyc(ji,jj,jk)
1179                ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zviscos(ji,jj,jk) * zdvdz_pyc(ji,jj,jk)
1180             END DO
1181           END DO
1182       END DO
1183
1184! Entrainment contribution.
1185
1186       DO jj=2, jpjm1
1187          DO ji = 2, jpim1
1188             IF ( lconv(ji,jj) ) THEN
1189               DO jk = 1, imld(ji,jj) - 1
1190                  znd=gdepw(ji,jj,jk,Kmm) / zhml(ji,jj)
1191                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zwth_ent(ji,jj) * znd
1192                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + zws_ent(ji,jj) * znd
1193                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zuw_bse(ji,jj) * znd
1194                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zvw_bse(ji,jj) * znd
1195               END DO
1196               DO jk = imld(ji,jj), ibld(ji,jj)
1197                  znd = -( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) / zdh(ji,jj)
1198                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zwth_ent(ji,jj) * ( 1.0 + znd )
1199                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + zws_ent(ji,jj) * ( 1.0 + znd )
1200                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zuw_bse(ji,jj) * ( 1.0 + znd )
1201                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zvw_bse(ji,jj) * ( 1.0 + znd )
1202                END DO
1203             ENDIF
1204             ghamt(ji,jj,ibld(ji,jj)) = 0._wp
1205             ghams(ji,jj,ibld(ji,jj)) = 0._wp
1206             ghamu(ji,jj,ibld(ji,jj)) = 0._wp
1207             ghamv(ji,jj,ibld(ji,jj)) = 0._wp
1208          END DO       ! ji loop
1209       END DO          ! jj loop
1210
1211
1212       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1213       ! Need to put in code for contributions that are applied explicitly to
1214       ! the prognostic variables
1215       !  1. Entrainment flux
1216       !
1217       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
1218
1219
1220
1221       ! rotate non-gradient velocity terms back to model reference frame
1222
1223       DO jj = 2, jpjm1
1224          DO ji = 2, jpim1
1225             DO jk = 2, ibld(ji,jj)
1226                ztemp = ghamu(ji,jj,jk)
1227                ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * zcos_wind(ji,jj) - ghamv(ji,jj,jk) * zsin_wind(ji,jj)
1228                ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * zcos_wind(ji,jj) + ztemp * zsin_wind(ji,jj)
1229             END DO
1230          END DO
1231       END DO
1232
1233       IF(ln_dia_osm) THEN
1234          IF ( iom_use("zdtdz_pyc") ) CALL iom_put( "zdtdz_pyc", wmask*zdtdz_pyc )
1235       END IF
1236
1237! KPP-style Ri# mixing
1238       IF( ln_kpprimix) THEN
1239          DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form)
1240             DO jj = 1, jpjm1
1241                DO ji = 1, jpim1   ! vector opt.
1242                   z3du(ji,jj,jk) = 0.5 * (  uu(ji,jj,jk-1,Kmm) -  uu(ji  ,jj,jk,Kmm) )   &
1243                        &                 * (  uu(ji,jj,jk-1,Kbb) -  uu(ji  ,jj,jk,Kbb) ) * wumask(ji,jj,jk) &
1244                        &                 / (  e3uw(ji,jj,jk,Kmm) * e3uw(ji,jj,jk,Kbb) )
1245                   z3dv(ji,jj,jk) = 0.5 * (  vv(ji,jj,jk-1,Kmm) -  vv(ji,jj  ,jk,Kmm) )   &
1246                        &                 * (  vv(ji,jj,jk-1,Kbb) -  vv(ji,jj  ,jk,Kbb) ) * wvmask(ji,jj,jk) &
1247                        &                 / (  e3vw(ji,jj,jk,Kmm) * e3vw(ji,jj,jk,Kbb) )
1248                END DO
1249             END DO
1250          END DO
1251      !
1252         DO jk = 2, jpkm1
1253            DO jj = 2, jpjm1
1254               DO ji = 2, jpim1   ! vector opt.
1255                  !                                          ! shear prod. at w-point weightened by mask
1256                  zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   &
1257                     &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )
1258                  !                                          ! local Richardson number
1259                  zri   = MAX( rn2b(ji,jj,jk), 0._wp ) / MAX(zesh2, epsln)
1260                  zfri =  MIN( zri / rn_riinfty , 1.0_wp )
1261                  zfri  = ( 1.0_wp - zfri * zfri )
1262                  zrimix(ji,jj,jk)  =  zfri * zfri  * zfri * wmask(ji, jj, jk)
1263                END DO
1264             END DO
1265          END DO
1266
1267          DO jj = 2, jpjm1
1268             DO ji = 2, jpim1
1269                DO jk = ibld(ji,jj) + 1, jpkm1
1270                   zdiffut(ji,jj,jk) = zrimix(ji,jj,jk)*rn_difri
1271                   zviscos(ji,jj,jk) = zrimix(ji,jj,jk)*rn_difri
1272                END DO
1273             END DO
1274          END DO
1275
1276       END IF ! ln_kpprimix = .true.
1277
1278! KPP-style set diffusivity large if unstable below BL
1279       IF( ln_convmix) THEN
1280          DO jj = 2, jpjm1
1281             DO ji = 2, jpim1
1282                DO jk = ibld(ji,jj) + 1, jpkm1
1283                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) zdiffut(ji,jj,jk) = rn_difconv
1284                END DO
1285             END DO
1286          END DO
1287       END IF ! ln_convmix = .true.
1288
1289       ! Lateral boundary conditions on zvicos (sign unchanged), needed to caclulate viscosities on u and v grids
1290       CALL lbc_lnk( 'zdfosm', zviscos(:,:,:), 'W', 1. )
1291
1292       ! GN 25/8: need to change tmask --> wmask
1293
1294     DO jk = 2, jpkm1
1295         DO jj = 2, jpjm1
1296             DO ji = 2, jpim1
1297                p_avt(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk)
1298                p_avm(ji,jj,jk) = MAX( zviscos(ji,jj,jk), avmb(jk) ) * tmask(ji,jj,jk)
1299             END DO
1300         END DO
1301     END DO
1302      ! Lateral boundary conditions on ghamu and ghamv, currently on W-grid  (sign unchanged), needed to caclulate gham[uv] on u and v grids
1303     CALL lbc_lnk_multi( 'zdfosm', p_avt, 'W', 1. , p_avm, 'W', 1.,   &
1304      &                  ghamu, 'W', 1. , ghamv, 'W', 1. )
1305       DO jk = 2, jpkm1
1306           DO jj = 2, jpjm1
1307               DO ji = 2, jpim1
1308                  ghamu(ji,jj,jk) = ( ghamu(ji,jj,jk) + ghamu(ji+1,jj,jk) ) &
1309                     &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji + 1,jj,jk) ) * umask(ji,jj,jk)
1310
1311                  ghamv(ji,jj,jk) = ( ghamv(ji,jj,jk) + ghamv(ji,jj+1,jk) ) &
1312                      &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji,jj+1,jk) ) * vmask(ji,jj,jk)
1313
1314                  ghamt(ji,jj,jk) =  ghamt(ji,jj,jk) * tmask(ji,jj,jk)
1315                  ghams(ji,jj,jk) =  ghams(ji,jj,jk) * tmask(ji,jj,jk)
1316               END DO
1317           END DO
1318        END DO
1319        ! Lateral boundary conditions on final outputs for gham[ts],  on W-grid  (sign unchanged)
1320        ! Lateral boundary conditions on final outputs for gham[uv],  on [UV]-grid  (sign unchanged)
1321        CALL lbc_lnk_multi( 'zdfosm', ghamt, 'W', 1. , ghams, 'W', 1.,   &
1322         &                  ghamu, 'U', 1. , ghamv, 'V', 1. )
1323
1324       IF(ln_dia_osm) THEN
1325         SELECT CASE (nn_osm_wave)
1326         ! Stokes drift set by assumimg onstant La#=0.3(=0)  or Pierson-Moskovitz spectrum (=1).
1327         CASE(0:1)
1328            IF ( iom_use("us_x") ) CALL iom_put( "us_x", tmask(:,:,1)*zustke*zcos_wind )   ! x surface Stokes drift
1329            IF ( iom_use("us_y") ) CALL iom_put( "us_y", tmask(:,:,1)*zustke*zsin_wind )  ! y surface Stokes drift
1330            IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rau0*tmask(:,:,1)*zustar**2*zustke )
1331         ! Stokes drift read in from sbcwave  (=2).
1332         CASE(2)
1333            IF ( iom_use("us_x") ) CALL iom_put( "us_x", ut0sd )               ! x surface Stokes drift
1334            IF ( iom_use("us_y") ) CALL iom_put( "us_y", vt0sd )               ! y surface Stokes drift
1335            IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rau0*tmask(:,:,1)*zustar**2* &
1336                 & SQRT(ut0sd**2 + vt0sd**2 ) )
1337         END SELECT
1338         IF ( iom_use("ghamt") ) CALL iom_put( "ghamt", tmask*ghamt )            ! <Tw_NL>
1339         IF ( iom_use("ghams") ) CALL iom_put( "ghams", tmask*ghams )            ! <Sw_NL>
1340         IF ( iom_use("ghamu") ) CALL iom_put( "ghamu", umask*ghamu )            ! <uw_NL>
1341         IF ( iom_use("ghamv") ) CALL iom_put( "ghamv", vmask*ghamv )            ! <vw_NL>
1342         IF ( iom_use("zwth0") ) CALL iom_put( "zwth0", tmask(:,:,1)*zwth0 )            ! <Tw_0>
1343         IF ( iom_use("zws0") ) CALL iom_put( "zws0", tmask(:,:,1)*zws0 )                ! <Sw_0>
1344         IF ( iom_use("hbl") ) CALL iom_put( "hbl", tmask(:,:,1)*hbl )                  ! boundary-layer depth
1345         IF ( iom_use("hbli") ) CALL iom_put( "hbli", tmask(:,:,1)*hbli )               ! Initial boundary-layer depth
1346         IF ( iom_use("dstokes") ) CALL iom_put( "dstokes", tmask(:,:,1)*dstokes )      ! Stokes drift penetration depth
1347         IF ( iom_use("zustke") ) CALL iom_put( "zustke", tmask(:,:,1)*zustke )            ! Stokes drift magnitude at T-points
1348         IF ( iom_use("zwstrc") ) CALL iom_put( "zwstrc", tmask(:,:,1)*zwstrc )         ! convective velocity scale
1349         IF ( iom_use("zwstrl") ) CALL iom_put( "zwstrl", tmask(:,:,1)*zwstrl )         ! Langmuir velocity scale
1350         IF ( iom_use("zustar") ) CALL iom_put( "zustar", tmask(:,:,1)*zustar )         ! friction velocity scale
1351         IF ( iom_use("wind_power") ) CALL iom_put( "wind_power", 1000.*rau0*tmask(:,:,1)*zustar**3 ) ! BL depth internal to zdf_osm routine
1352         IF ( iom_use("wind_wave_power") ) CALL iom_put( "wind_wave_power", 1000.*rau0*tmask(:,:,1)*zustar**2*zustke )
1353         IF ( iom_use("zhbl") ) CALL iom_put( "zhbl", tmask(:,:,1)*zhbl )               ! BL depth internal to zdf_osm routine
1354         IF ( iom_use("zhml") ) CALL iom_put( "zhml", tmask(:,:,1)*zhml )               ! ML depth internal to zdf_osm routine
1355         IF ( iom_use("zdh") ) CALL iom_put( "zdh", tmask(:,:,1)*zdh )               ! ML depth internal to zdf_osm routine
1356         IF ( iom_use("zhol") ) CALL iom_put( "zhol", tmask(:,:,1)*zhol )               ! ML depth internal to zdf_osm routine
1357         IF ( iom_use("zwthav") ) CALL iom_put( "zwthav", tmask(:,:,1)*zwthav )               ! ML depth internal to zdf_osm routine
1358         IF ( iom_use("zwth_ent") ) CALL iom_put( "zwth_ent", tmask(:,:,1)*zwth_ent )               ! ML depth internal to zdf_osm routine
1359         IF ( iom_use("zt_ml") ) CALL iom_put( "zt_ml", tmask(:,:,1)*zt_ml )               ! average T in ML
1360      END IF
1361      ! Lateral boundary conditions on p_avt  (sign unchanged)
1362      CALL lbc_lnk( 'zdfosm', p_avt(:,:,:), 'W', 1. )
1363      !
1364   END SUBROUTINE zdf_osm
1365
1366
1367   SUBROUTINE zdf_osm_init( Kmm ) 
1368     !!----------------------------------------------------------------------
1369     !!                  ***  ROUTINE zdf_osm_init  ***
1370     !!
1371     !! ** Purpose :   Initialization of the vertical eddy diffivity and
1372     !!      viscosity when using a osm turbulent closure scheme
1373     !!
1374     !! ** Method  :   Read the namosm namelist and check the parameters
1375     !!      called at the first timestep (nit000)
1376     !!
1377     !! ** input   :   Namlist namosm
1378     !!----------------------------------------------------------------------
1379     INTEGER, INTENT(in)    :: Kmm ! time level index (middle)
1380     !
1381     INTEGER  ::   ios            ! local integer
1382     INTEGER  ::   ji, jj, jk     ! dummy loop indices
1383     !!
1384     NAMELIST/namzdf_osm/ ln_use_osm_la, rn_osm_la, rn_osm_dstokes, nn_ave &
1385          & ,nn_osm_wave, ln_dia_osm, rn_osm_hbl0 &
1386          & ,ln_kpprimix, rn_riinfty, rn_difri, ln_convmix, rn_difconv
1387     !!----------------------------------------------------------------------
1388     !
1389     REWIND( numnam_ref )              ! Namelist namzdf_osm in reference namelist : Osmosis ML model
1390     READ  ( numnam_ref, namzdf_osm, IOSTAT = ios, ERR = 901)
1391901  IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_osm in reference namelist', lwp )
1392
1393     REWIND( numnam_cfg )              ! Namelist namzdf_tke in configuration namelist : Turbulent Kinetic Energy
1394     READ  ( numnam_cfg, namzdf_osm, IOSTAT = ios, ERR = 902 )
1395902  IF( ios >  0 ) CALL ctl_nam ( ios , 'namzdf_osm in configuration namelist', lwp )
1396     IF(lwm) WRITE ( numond, namzdf_osm )
1397
1398     IF(lwp) THEN                    ! Control print
1399        WRITE(numout,*)
1400        WRITE(numout,*) 'zdf_osm_init : OSMOSIS Parameterisation'
1401        WRITE(numout,*) '~~~~~~~~~~~~'
1402        WRITE(numout,*) '   Namelist namzdf_osm : set tke mixing parameters'
1403        WRITE(numout,*) '     Use namelist  rn_osm_la                     ln_use_osm_la = ', ln_use_osm_la
1404        WRITE(numout,*) '     Turbulent Langmuir number                     rn_osm_la   = ', rn_osm_la
1405        WRITE(numout,*) '     Initial hbl for 1D runs                       rn_osm_hbl0   = ', rn_osm_hbl0
1406        WRITE(numout,*) '     Depth scale of Stokes drift                rn_osm_dstokes = ', rn_osm_dstokes
1407        WRITE(numout,*) '     horizontal average flag                       nn_ave      = ', nn_ave
1408        WRITE(numout,*) '     Stokes drift                                  nn_osm_wave = ', nn_osm_wave
1409        SELECT CASE (nn_osm_wave)
1410        CASE(0)
1411           WRITE(numout,*) '     calculated assuming constant La#=0.3'
1412        CASE(1)
1413           WRITE(numout,*) '     calculated from Pierson Moskowitz wind-waves'
1414        CASE(2)
1415           WRITE(numout,*) '     calculated from ECMWF wave fields'
1416        END SELECT
1417        WRITE(numout,*) '     Output osm diagnostics                       ln_dia_osm  = ',  ln_dia_osm
1418        WRITE(numout,*) '     Use KPP-style shear instability mixing       ln_kpprimix = ', ln_kpprimix
1419        WRITE(numout,*) '     local Richardson Number limit for shear instability rn_riinfty = ', rn_riinfty
1420        WRITE(numout,*) '     maximum shear diffusivity at Rig = 0    (m2/s) rn_difri = ', rn_difri
1421        WRITE(numout,*) '     Use large mixing below BL when unstable       ln_convmix = ', ln_convmix
1422        WRITE(numout,*) '     diffusivity when unstable below BL     (m2/s) rn_difconv = ', rn_difconv
1423     ENDIF
1424
1425     !                              ! allocate zdfosm arrays
1426     IF( zdf_osm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_osm_init : unable to allocate arrays' )
1427
1428     call osm_rst( nit000, Kmm, 'READ' ) !* read or initialize hbl
1429
1430     IF( ln_zdfddm) THEN
1431        IF(lwp) THEN
1432           WRITE(numout,*)
1433           WRITE(numout,*) '    Double diffusion mixing on temperature and salinity '
1434           WRITE(numout,*) '    CAUTION : done in routine zdfosm, not in routine zdfddm '
1435        ENDIF
1436     ENDIF
1437
1438
1439     !set constants not in namelist
1440     !-----------------------------
1441
1442     IF(lwp) THEN
1443        WRITE(numout,*)
1444     ENDIF
1445
1446     IF (nn_osm_wave == 0) THEN
1447        dstokes(:,:) = rn_osm_dstokes
1448     END IF
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'
1457        IF(lwp) WRITE(numout,*) '          only in very high horizontal resolution !'
1458        ! weighting mean arrays etmean
1459        !           ( 1  1 )
1460        ! avt = 1/4 ( 1  1 )
1461        !
1462        etmean(:,:,:) = 0.e0
1463
1464        DO jk = 1, jpkm1
1465           DO jj = 2, jpjm1
1466              DO ji = 2, jpim1   ! vector opt.
1467                 etmean(ji,jj,jk) = tmask(ji,jj,jk)                     &
1468                      &  / MAX( 1.,  umask(ji-1,jj  ,jk) + umask(ji,jj,jk)   &
1469                      &            + vmask(ji  ,jj-1,jk) + vmask(ji,jj,jk)  )
1470              END DO
1471           END DO
1472        END DO
1473
1474     CASE ( 1 )                ! horizontal average
1475        IF(lwp) WRITE(numout,*) '          horizontal average on avt'
1476        ! weighting mean arrays etmean
1477        !           ( 1/2  1  1/2 )
1478        ! avt = 1/8 ( 1    2  1   )
1479        !           ( 1/2  1  1/2 )
1480        etmean(:,:,:) = 0.e0
1481
1482        DO jk = 1, jpkm1
1483           DO jj = 2, jpjm1
1484              DO ji = 2, jpim1   ! vector opt.
1485                 etmean(ji,jj,jk) = tmask(ji, jj,jk)                           &
1486                      & / MAX( 1., 2.* tmask(ji,jj,jk)                           &
1487                      &      +.5 * ( tmask(ji-1,jj+1,jk) + tmask(ji-1,jj-1,jk)   &
1488                      &             +tmask(ji+1,jj+1,jk) + tmask(ji+1,jj-1,jk) ) &
1489                      &      +1. * ( tmask(ji-1,jj  ,jk) + tmask(ji  ,jj+1,jk)   &
1490                      &             +tmask(ji  ,jj-1,jk) + tmask(ji+1,jj  ,jk) ) )
1491              END DO
1492           END DO
1493        END DO
1494
1495     CASE DEFAULT
1496        WRITE(ctmp1,*) '          bad flag value for nn_ave = ', nn_ave
1497        CALL ctl_stop( ctmp1 )
1498
1499     END SELECT
1500
1501     ! Initialization of vertical eddy coef. to the background value
1502     ! -------------------------------------------------------------
1503     DO jk = 1, jpk
1504        avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)
1505     END DO
1506
1507     ! zero the surface flux for non local term and osm mixed layer depth
1508     ! ------------------------------------------------------------------
1509     ghamt(:,:,:) = 0.
1510     ghams(:,:,:) = 0.
1511     ghamu(:,:,:) = 0.
1512     ghamv(:,:,:) = 0.
1513     !
1514     IF( lwxios ) THEN
1515        CALL iom_set_rstw_var_active('wn')
1516        CALL iom_set_rstw_var_active('hbl')
1517        CALL iom_set_rstw_var_active('hbli')
1518     ENDIF
1519   END SUBROUTINE zdf_osm_init
1520
1521
1522   SUBROUTINE osm_rst( kt, Kmm, cdrw )
1523     !!---------------------------------------------------------------------
1524     !!                   ***  ROUTINE osm_rst  ***
1525     !!
1526     !! ** Purpose :   Read or write BL fields in restart file
1527     !!
1528     !! ** Method  :   use of IOM library. If the restart does not contain
1529     !!                required fields, they are recomputed from stratification
1530     !!----------------------------------------------------------------------
1531
1532     INTEGER         , INTENT(in) ::   kt     ! ocean time step index
1533     INTEGER         , INTENT(in) ::   Kmm    ! ocean time level index (middle)
1534     CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
1535
1536     INTEGER ::   id1, id2   ! iom enquiry index
1537     INTEGER  ::   ji, jj, jk     ! dummy loop indices
1538     INTEGER  ::   iiki, ikt ! local integer
1539     REAL(wp) ::   zhbf           ! tempory scalars
1540     REAL(wp) ::   zN2_c           ! local scalar
1541     REAL(wp) ::   rho_c = 0.01_wp    !: density criterion for mixed layer depth
1542     INTEGER, DIMENSION(:,:), ALLOCATABLE :: imld_rst ! level of mixed-layer depth (pycnocline top)
1543     !!----------------------------------------------------------------------
1544     !
1545     !!-----------------------------------------------------------------------------
1546     ! If READ/WRITE Flag is 'READ', try to get hbl from restart file. If successful then return
1547     !!-----------------------------------------------------------------------------
1548     IF( TRIM(cdrw) == 'READ'.AND. ln_rstart) THEN
1549        id1 = iom_varid( numror, 'wn'   , ldstop = .FALSE. )
1550        IF( id1 > 0 ) THEN                       ! 'wn' exists; read
1551           CALL iom_get( numror, jpdom_autoglo, 'wn', ww, ldxios = lrxios )
1552           WRITE(numout,*) ' ===>>>> :  ww read from restart file'
1553        ELSE
1554           ww(:,:,:) = 0._wp
1555           WRITE(numout,*) ' ===>>>> :  ww not in restart file, set to zero initially'
1556        END IF
1557        id1 = iom_varid( numror, 'hbl'   , ldstop = .FALSE. )
1558        id2 = iom_varid( numror, 'hbli'   , ldstop = .FALSE. )
1559        IF( id1 > 0 .AND. id2 > 0) THEN                       ! 'hbl' exists; read and return
1560           CALL iom_get( numror, jpdom_autoglo, 'hbl' , hbl , ldxios = lrxios )
1561           CALL iom_get( numror, jpdom_autoglo, 'hbli', hbli, ldxios = lrxios  )
1562           WRITE(numout,*) ' ===>>>> :  hbl & hbli read from restart file'
1563           RETURN
1564        ELSE                      ! 'hbl' & 'hbli' not in restart file, recalculate
1565           WRITE(numout,*) ' ===>>>> : previous run without osmosis scheme, hbl computed from stratification'
1566        END IF
1567     END IF
1568
1569     !!-----------------------------------------------------------------------------
1570     ! If READ/WRITE Flag is 'WRITE', write hbl into the restart file, then return
1571     !!-----------------------------------------------------------------------------
1572     IF( TRIM(cdrw) == 'WRITE') THEN     !* Write hbli into the restart file, then return
1573        IF(lwp) WRITE(numout,*) '---- osm-rst ----'
1574         CALL iom_rstput( kt, nitrst, numrow, 'wn'     , ww  , ldxios = lwxios )
1575         CALL iom_rstput( kt, nitrst, numrow, 'hbl'    , hbl , ldxios = lwxios )
1576         CALL iom_rstput( kt, nitrst, numrow, 'hbli'   , hbli, ldxios = lwxios )
1577        RETURN
1578     END IF
1579
1580     !!-----------------------------------------------------------------------------
1581     ! Getting hbl, no restart file with hbl, so calculate from surface stratification
1582     !!-----------------------------------------------------------------------------
1583     IF( lwp ) WRITE(numout,*) ' ===>>>> : calculating hbl computed from stratification'
1584     ALLOCATE( imld_rst(jpi,jpj) )
1585     ! w-level of the mixing and mixed layers
1586     CALL eos_rab( ts(:,:,:,:,Kmm), rab_n, Kmm )
1587     CALL bn2(ts(:,:,:,:,Kmm), rab_n, rn2, Kmm)
1588     imld_rst(:,:)  = nlb10         ! Initialization to the number of w ocean point
1589     hbl(:,:)  = 0._wp              ! here hbl used as a dummy variable, integrating vertically N^2
1590     zN2_c = grav * rho_c * r1_rau0 ! convert density criteria into N^2 criteria
1591     !
1592     hbl(:,:)  = 0._wp              ! here hbl used as a dummy variable, integrating vertically N^2
1593     DO jk = 1, jpkm1
1594        DO jj = 1, jpj              ! Mixed layer level: w-level
1595           DO ji = 1, jpi
1596              ikt = mbkt(ji,jj)
1597              hbl(ji,jj) = hbl(ji,jj) + MAX( rn2(ji,jj,jk) , 0._wp ) * e3w(ji,jj,jk,Kmm)
1598              IF( hbl(ji,jj) < zN2_c )   imld_rst(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level
1599           END DO
1600        END DO
1601     END DO
1602     !
1603     DO jj = 1, jpj
1604        DO ji = 1, jpi
1605           iiki = imld_rst(ji,jj)
1606           hbl (ji,jj) = gdepw(ji,jj,iiki  ,Kmm) * ssmask(ji,jj)    ! Turbocline depth
1607        END DO
1608     END DO
1609     hbl = MAX(hbl,epsln)
1610     hbli(:,:) = hbl(:,:)
1611     DEALLOCATE( imld_rst )
1612     WRITE(numout,*) ' ===>>>> : hbl computed from stratification'
1613   END SUBROUTINE osm_rst
1614
1615
1616   SUBROUTINE tra_osm( kt, Kmm, pts, Krhs )
1617      !!----------------------------------------------------------------------
1618      !!                  ***  ROUTINE tra_osm  ***
1619      !!
1620      !! ** Purpose :   compute and add to the tracer trend the non-local tracer flux
1621      !!
1622      !! ** Method  :   ???
1623      !!----------------------------------------------------------------------
1624      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds   ! 3D workspace
1625      !!----------------------------------------------------------------------
1626      INTEGER                                  , INTENT(in)    :: kt        ! time step index
1627      INTEGER                                  , INTENT(in)    :: Kmm, Krhs ! time level indices
1628      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
1629      !
1630      INTEGER :: ji, jj, jk
1631      !
1632      IF( kt == nit000 ) THEN
1633         IF(lwp) WRITE(numout,*)
1634         IF(lwp) WRITE(numout,*) 'tra_osm : OSM non-local tracer fluxes'
1635         IF(lwp) WRITE(numout,*) '~~~~~~~   '
1636      ENDIF
1637
1638      IF( l_trdtra )   THEN                    !* Save ta and sa trends
1639         ALLOCATE( ztrdt(jpi,jpj,jpk) )   ;    ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs)
1640         ALLOCATE( ztrds(jpi,jpj,jpk) )   ;    ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs)
1641      ENDIF
1642
1643      ! add non-local temperature and salinity flux
1644      DO jk = 1, jpkm1
1645         DO jj = 2, jpjm1
1646            DO ji = 2, jpim1
1647               pts(ji,jj,jk,jp_tem,Krhs) =  pts(ji,jj,jk,jp_tem,Krhs)                      &
1648                  &                 - (  ghamt(ji,jj,jk  )  &
1649                  &                    - ghamt(ji,jj,jk+1) ) /e3t(ji,jj,jk,Kmm)
1650               pts(ji,jj,jk,jp_sal,Krhs) =  pts(ji,jj,jk,jp_sal,Krhs)                      &
1651                  &                 - (  ghams(ji,jj,jk  )  &
1652                  &                    - ghams(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm)
1653            END DO
1654         END DO
1655      END DO
1656
1657
1658      ! save the non-local tracer flux trends for diagnostic
1659      IF( l_trdtra )   THEN
1660         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:)
1661         ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:)
1662!!bug gm jpttdzdf ==> jpttosm
1663         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_zdf, ztrdt )
1664         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_zdf, ztrds )
1665         DEALLOCATE( ztrdt )      ;     DEALLOCATE( ztrds )
1666      ENDIF
1667
1668      IF(ln_ctl) THEN
1669         CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' osm  - Ta: ', mask1=tmask,   &
1670         &             tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
1671      ENDIF
1672      !
1673   END SUBROUTINE tra_osm
1674
1675
1676   SUBROUTINE trc_osm( kt )          ! Dummy routine
1677      !!----------------------------------------------------------------------
1678      !!                  ***  ROUTINE trc_osm  ***
1679      !!
1680      !! ** Purpose :   compute and add to the passive tracer trend the non-local
1681      !!                 passive tracer flux
1682      !!
1683      !!
1684      !! ** Method  :   ???
1685      !!----------------------------------------------------------------------
1686      !
1687      !!----------------------------------------------------------------------
1688      INTEGER, INTENT(in) :: kt
1689      WRITE(*,*) 'trc_osm: Not written yet', kt
1690   END SUBROUTINE trc_osm
1691
1692
1693   SUBROUTINE dyn_osm( kt, Kmm, puu, pvv, Krhs )
1694      !!----------------------------------------------------------------------
1695      !!                  ***  ROUTINE dyn_osm  ***
1696      !!
1697      !! ** Purpose :   compute and add to the velocity trend the non-local flux
1698      !! copied/modified from tra_osm
1699      !!
1700      !! ** Method  :   ???
1701      !!----------------------------------------------------------------------
1702      INTEGER                             , INTENT( in )  ::  kt          ! ocean time step index
1703      INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
1704      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
1705      !
1706      INTEGER :: ji, jj, jk   ! dummy loop indices
1707      !!----------------------------------------------------------------------
1708      !
1709      IF( kt == nit000 ) THEN
1710         IF(lwp) WRITE(numout,*)
1711         IF(lwp) WRITE(numout,*) 'dyn_osm : OSM non-local velocity'
1712         IF(lwp) WRITE(numout,*) '~~~~~~~   '
1713      ENDIF
1714      !code saving tracer trends removed, replace with trdmxl_oce
1715
1716      DO jk = 1, jpkm1           ! add non-local u and v fluxes
1717         DO jj = 2, jpjm1
1718            DO ji = 2, jpim1
1719               puu(ji,jj,jk,Krhs) =  puu(ji,jj,jk,Krhs)                      &
1720                  &                 - (  ghamu(ji,jj,jk  )  &
1721                  &                    - ghamu(ji,jj,jk+1) ) / e3u(ji,jj,jk,Kmm)
1722               pvv(ji,jj,jk,Krhs) =  pvv(ji,jj,jk,Krhs)                      &
1723                  &                 - (  ghamv(ji,jj,jk  )  &
1724                  &                    - ghamv(ji,jj,jk+1) ) / e3v(ji,jj,jk,Kmm)
1725            END DO
1726         END DO
1727      END DO
1728      !
1729      ! code for saving tracer trends removed
1730      !
1731   END SUBROUTINE dyn_osm
1732
1733   !!======================================================================
1734END MODULE zdfosm
Note: See TracBrowser for help on using the repository browser.