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_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/ZDF – NEMO

source: NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/ZDF/zdfosm.F90 @ 12317

Last change on this file since 12317 was 12317, checked in by agn, 4 years ago

hmle is now restartable

  • Property svn:keywords set to Id
File size: 126.6 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) Buoyancy flux due to entrainment changed to include contribution from shear turbulence.
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   !! ??/??/2018 (18) Revision to code structure, selected using key_osmldpth1. Inline code moved into subroutines. Changes to physics made,
32   !!                  (a) Pycnocline temperature and salinity profies changed for unstable layers
33   !!                  (b) The stable OSBL depth parametrization changed.
34   !! 16/05/2019 (19) Fox-Kemper parametrization of restratification through mixed layer eddies added to revised code.
35   !! 23/05/19   (20) Old code where key_osmldpth1` is *not* set removed, together with the key key_osmldpth1
36   !!----------------------------------------------------------------------
37
38   !!----------------------------------------------------------------------
39   !!   'ln_zdfosm'                                             OSMOSIS scheme
40   !!----------------------------------------------------------------------
41   !!   zdf_osm       : update momentum and tracer Kz from osm scheme
42   !!   zdf_osm_init  : initialization, namelist read, and parameters control
43   !!   osm_rst       : read (or initialize) and write osmosis restart fields
44   !!   tra_osm       : compute and add to the T & S trend the non-local flux
45   !!   trc_osm       : compute and add to the passive tracer trend the non-local flux (TBD)
46   !!   dyn_osm       : compute and add to u & v trensd the non-local flux
47   !!
48   !! Subroutines in revised code.
49   !!----------------------------------------------------------------------
50   USE oce            ! ocean dynamics and active tracers
51                      ! uses wn from previous time step (which is now wb) to calculate hbl
52   USE dom_oce        ! ocean space and time domain
53   USE zdf_oce        ! ocean vertical physics
54   USE sbc_oce        ! surface boundary condition: ocean
55   USE sbcwave        ! surface wave parameters
56   USE phycst         ! physical constants
57   USE eosbn2         ! equation of state
58   USE traqsr         ! details of solar radiation absorption
59   USE zdfddm         ! double diffusion mixing (avs array)
60   USE iom            ! I/O library
61   USE lib_mpp        ! MPP library
62   USE trd_oce        ! ocean trends definition
63   USE trdtra         ! tracers trends
64   !
65   USE in_out_manager ! I/O manager
66   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
67   USE prtctl         ! Print control
68   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
69
70   IMPLICIT NONE
71   PRIVATE
72
73   PUBLIC   zdf_osm       ! routine called by step.F90
74   PUBLIC   zdf_osm_init  ! routine called by nemogcm.F90
75   PUBLIC   osm_rst       ! routine called by step.F90
76   PUBLIC   tra_osm       ! routine called by step.F90
77   PUBLIC   trc_osm       ! routine called by trcstp.F90
78   PUBLIC   dyn_osm       ! routine called by step.F90
79
80   PUBLIC   ln_osm_mle    ! logical needed by tra_mle_init in tramle.F90
81
82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamu    !: non-local u-momentum flux
83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamv    !: non-local v-momentum flux
84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamt    !: non-local temperature flux (gamma/<ws>o)
85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghams    !: non-local salinity flux (gamma/<ws>o)
86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   etmean   !: averaging operator for avt
87   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbl      !: boundary layer depth
88   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dh       ! depth of pycnocline
89   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hml      ! ML depth
90   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dstokes  !: penetration depth of the Stokes drift.
91
92   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)           ::   r1_ft    ! inverse of the modified Coriolis parameter at t-pts
93   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hmle     ! Depth of layer affexted by mixed layer eddies in Fox-Kemper parametrization
94   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdx_mle ! zonal buoyancy gradient in ML
95   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdy_mle ! meridional buoyancy gradient in ML
96   INTEGER,  PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mld_prof ! level of base of MLE layer.
97
98   !                      !!** Namelist  namzdf_osm  **
99   LOGICAL  ::   ln_use_osm_la      ! Use namelist  rn_osm_la
100
101   LOGICAL  ::   ln_osm_mle           !: flag to activate the Mixed Layer Eddy (MLE) parameterisation
102
103   REAL(wp) ::   rn_osm_la          ! Turbulent Langmuir number
104   REAL(wp) ::   rn_osm_dstokes     ! Depth scale of Stokes drift
105   REAL(wp) ::   rn_osm_hbl0 = 10._wp       ! Initial value of hbl for 1D runs
106   INTEGER  ::   nn_ave             ! = 0/1 flag for horizontal average on avt
107   INTEGER  ::   nn_osm_wave = 0    ! = 0/1/2 flag for getting stokes drift from La# / PM wind-waves/Inputs into sbcwave
108   LOGICAL  ::   ln_dia_osm         ! Use namelist  rn_osm_la
109
110
111   LOGICAL  ::   ln_kpprimix  = .true.  ! Shear instability mixing
112   REAL(wp) ::   rn_riinfty   = 0.7     ! local Richardson Number limit for shear instability
113   REAL(wp) ::   rn_difri    =  0.005   ! maximum shear mixing at Rig = 0    (m2/s)
114   LOGICAL  ::   ln_convmix  = .true.   ! Convective instability mixing
115   REAL(wp) ::   rn_difconv = 1._wp     ! diffusivity when unstable below BL  (m2/s)
116
117! OSMOSIS mixed layer eddy parametrization constants
118   INTEGER  ::   nn_osm_mle             ! = 0/1 flag for horizontal average on avt
119   REAL(wp) ::   rn_osm_mle_ce           ! MLE coefficient
120   !                                        ! parameters used in nn_osm_mle = 0 case
121   REAL(wp) ::   rn_osm_mle_lf               ! typical scale of mixed layer front
122   REAL(wp) ::   rn_osm_mle_time             ! time scale for mixing momentum across the mixed layer
123   !                                        ! parameters used in nn_osm_mle = 1 case
124   REAL(wp) ::   rn_osm_mle_lat              ! reference latitude for a 5 km scale of ML front
125   REAL(wp) ::   rn_osm_mle_rho_c        ! Density criterion for definition of MLD used by FK
126   REAL(wp) ::   r5_21 = 5.e0 / 21.e0   ! factor used in mle streamfunction computation
127   REAL(wp) ::   rb_c                   ! ML buoyancy criteria = g rho_c /rau0 where rho_c is defined in zdfmld
128   REAL(wp) ::   rc_f                   ! MLE coefficient (= rn_ce / (5 km * fo) ) in nn_osm_mle=1 case
129   REAL(wp) ::   rn_osm_mle_thresh          ! Threshold buoyancy for deepening of MLE layer below OSBL base.
130   REAL(wp) ::   rn_osm_mle_tau             ! Adjustment timescale for MLE.
131
132
133   !                                    !!! ** General constants  **
134   REAL(wp) ::   epsln   = 1.0e-20_wp   ! a small positive number to ensure no div by zero
135   REAL(wp) ::   depth_tol = 1.0e-6_wp  ! a small-ish positive number to give a hbl slightly shallower than gdepw
136   REAL(wp) ::   pthird  = 1._wp/3._wp  ! 1/3
137   REAL(wp) ::   p2third = 2._wp/3._wp  ! 2/3
138
139   INTEGER :: idebug = 236
140   INTEGER :: jdebug = 228
141   !!----------------------------------------------------------------------
142   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
143   !! $Id$
144   !! Software governed by the CeCILL license (see ./LICENSE)
145   !!----------------------------------------------------------------------
146CONTAINS
147
148   INTEGER FUNCTION zdf_osm_alloc()
149      !!----------------------------------------------------------------------
150      !!                 ***  FUNCTION zdf_osm_alloc  ***
151      !!----------------------------------------------------------------------
152     ALLOCATE( ghamu(jpi,jpj,jpk), ghamv(jpi,jpj,jpk), ghamt(jpi,jpj,jpk),ghams(jpi,jpj,jpk), &
153          &       hbl(jpi,jpj), dh(jpi,jpj), hml(jpi,jpj), dstokes(jpi, jpj), &
154          &       etmean(jpi,jpj,jpk), STAT= zdf_osm_alloc )
155
156     ALLOCATE(  hmle(jpi,jpj), r1_ft(jpi,jpj), dbdx_mle(jpi,jpj), dbdy_mle(jpi,jpj), &
157          &       mld_prof(jpi,jpj), STAT= zdf_osm_alloc )
158
159!     ALLOCATE( ghamu(jpi,jpj,jpk), ghamv(jpi,jpj,jpk), ghamt(jpi,jpj,jpk),ghams(jpi,jpj,jpk), &    ! would ths be better ?
160!          &       hbl(jpi,jpj), dh(jpi,jpj), hml(jpi,jpj), dstokes(jpi, jpj), &
161!          &       etmean(jpi,jpj,jpk), STAT= zdf_osm_alloc )
162!     IF( zdf_osm_alloc /= 0 )   CALL ctl_warn('zdf_osm_alloc: failed to allocate zdf_osm arrays')
163!     IF ( ln_osm_mle ) THEN
164!        Allocate( hmle(jpi,jpj), r1_ft(jpi,jpj), STAT= zdf_osm_alloc )
165!        IF( zdf_osm_alloc /= 0 )   CALL ctl_warn('zdf_osm_alloc: failed to allocate zdf_osm mle arrays')
166!     ENDIF
167
168     IF( zdf_osm_alloc /= 0 )   CALL ctl_warn('zdf_osm_alloc: failed to allocate zdf_osm arrays')
169     CALL mpp_sum ( 'zdfosm', zdf_osm_alloc )
170   END FUNCTION zdf_osm_alloc
171
172
173   SUBROUTINE zdf_osm( kt, p_avm, p_avt )
174      !!----------------------------------------------------------------------
175      !!                   ***  ROUTINE zdf_osm  ***
176      !!
177      !! ** Purpose :   Compute the vertical eddy viscosity and diffusivity
178      !!      coefficients and non local mixing using the OSMOSIS scheme
179      !!
180      !! ** Method :   The boundary layer depth hosm is diagnosed at tracer points
181      !!      from profiles of buoyancy, and shear, and the surface forcing.
182      !!      Above hbl (sigma=-z/hbl <1) the mixing coefficients are computed from
183      !!
184      !!                      Kx =  hosm  Wx(sigma) G(sigma)
185      !!
186      !!             and the non local term ghamt = Cs / Ws(sigma) / hosm
187      !!      Below hosm  the coefficients are the sum of mixing due to internal waves
188      !!      shear instability and double diffusion.
189      !!
190      !!      -1- Compute the now interior vertical mixing coefficients at all depths.
191      !!      -2- Diagnose the boundary layer depth.
192      !!      -3- Compute the now boundary layer vertical mixing coefficients.
193      !!      -4- Compute the now vertical eddy vicosity and diffusivity.
194      !!      -5- Smoothing
195      !!
196      !!        N.B. The computation is done from jk=2 to jpkm1
197      !!             Surface value of avt are set once a time to zero
198      !!             in routine zdf_osm_init.
199      !!
200      !! ** Action  :   update the non-local terms ghamts
201      !!                update avt (before vertical eddy coef.)
202      !!
203      !! References : Large W.G., Mc Williams J.C. and Doney S.C.
204      !!         Reviews of Geophysics, 32, 4, November 1994
205      !!         Comments in the code refer to this paper, particularly
206      !!         the equation number. (LMD94, here after)
207      !!----------------------------------------------------------------------
208      INTEGER                   , INTENT(in   ) ::   kt            ! ocean time step
209      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::  p_avm, p_avt   ! momentum and tracer Kz (w-points)
210      !!
211      INTEGER ::   ji, jj, jk                   ! dummy loop indices
212
213      INTEGER ::   jl                   ! dummy loop indices
214
215      INTEGER ::   ikbot, jkmax, jkm1, jkp2     !
216
217      REAL(wp) ::   ztx, zty, zflageos, zstabl, zbuofdep,zucube      !
218      REAL(wp) ::   zbeta, zthermal                                  !
219      REAL(wp) ::   zehat, zeta, zhrib, zsig, zscale, zwst, zws, zwm ! Velocity scales
220      REAL(wp) ::   zwsun, zwmun, zcons, zconm, zwcons, zwconm      !
221
222      REAL(wp) ::   zsr, zbw, ze, zb, zd, zc, zaw, za, zb1, za1, zkw, zk0, zcomp , zrhd,zrhdr,zbvzed   ! In situ density
223      INTEGER  ::   jm                          ! dummy loop indices
224      REAL(wp) ::   zr1, zr2, zr3, zr4, zrhop   ! Compression terms
225      REAL(wp) ::   zflag, zrn2, zdep21, zdep32, zdep43
226      REAL(wp) ::   zesh2, zri, zfri            ! Interior richardson mixing
227      REAL(wp) ::   zdelta, zdelta2, zdzup, zdzdn, zdzh, zvath, zgat1, zdat1, zkm1m, zkm1t
228      REAL(wp) :: zt,zs,zu,zv,zrh               ! variables used in constructing averages
229! Scales
230      REAL(wp), DIMENSION(jpi,jpj) :: zrad0     ! Surface solar temperature flux (deg m/s)
231      REAL(wp), DIMENSION(jpi,jpj) :: zradh     ! Radiative flux at bl base (Buoyancy units)
232      REAL(wp), DIMENSION(jpi,jpj) :: zradav    ! Radiative flux, bl average (Buoyancy Units)
233      REAL(wp), DIMENSION(jpi,jpj) :: zustar    ! friction velocity
234      REAL(wp), DIMENSION(jpi,jpj) :: zwstrl    ! Langmuir velocity scale
235      REAL(wp), DIMENSION(jpi,jpj) :: zvstr     ! Velocity scale that ends to zustar for large Langmuir number.
236      REAL(wp), DIMENSION(jpi,jpj) :: zwstrc    ! Convective velocity scale
237      REAL(wp), DIMENSION(jpi,jpj) :: zuw0      ! Surface u-momentum flux
238      REAL(wp), DIMENSION(jpi,jpj) :: zvw0      ! Surface v-momentum flux
239      REAL(wp), DIMENSION(jpi,jpj) :: zwth0     ! Surface heat flux (Kinematic)
240      REAL(wp), DIMENSION(jpi,jpj) :: zws0      ! Surface freshwater flux
241      REAL(wp), DIMENSION(jpi,jpj) :: zwb0      ! Surface buoyancy flux
242      REAL(wp), DIMENSION(jpi,jpj) :: zwthav    ! Heat flux - bl average
243      REAL(wp), DIMENSION(jpi,jpj) :: zwsav     ! freshwater flux - bl average
244      REAL(wp), DIMENSION(jpi,jpj) :: zwbav     ! Buoyancy flux - bl average
245      REAL(wp), DIMENSION(jpi,jpj) :: zwb_ent   ! Buoyancy entrainment flux
246
247
248      REAL(wp), DIMENSION(jpi,jpj) :: zwb_fk_b  ! MLE buoyancy flux averaged over OSBL
249      REAL(wp), DIMENSION(jpi,jpj) :: zwb_fk    ! max MLE buoyancy flux
250      REAL(wp), DIMENSION(jpi,jpj) :: zdiff_mle ! extra MLE vertical diff
251      REAL(wp), DIMENSION(jpi,jpj) :: zvel_mle  ! velocity scale for dhdt with stable ML and FK
252
253      REAL(wp), DIMENSION(jpi,jpj) :: zustke    ! Surface Stokes drift
254      REAL(wp), DIMENSION(jpi,jpj) :: zla       ! Trubulent Langmuir number
255      REAL(wp), DIMENSION(jpi,jpj) :: zcos_wind ! Cos angle of surface stress
256      REAL(wp), DIMENSION(jpi,jpj) :: zsin_wind ! Sin angle of surface stress
257      REAL(wp), DIMENSION(jpi,jpj) :: zhol      ! Stability parameter for boundary layer
258      LOGICAL, DIMENSION(jpi,jpj)  :: lconv     ! unstable/stable bl
259
260      ! mixed-layer variables
261
262      INTEGER, DIMENSION(jpi,jpj) :: ibld ! level of boundary layer base
263      INTEGER, DIMENSION(jpi,jpj) :: imld ! level of mixed-layer depth (pycnocline top)
264
265      REAL(wp) :: ztgrad,zsgrad,zbgrad ! Temporary variables used to calculate pycnocline gradients
266      REAL(wp) :: zugrad,zvgrad        ! temporary variables for calculating pycnocline shear
267
268      REAL(wp), DIMENSION(jpi,jpj) :: zhbl  ! bl depth - grid
269      REAL(wp), DIMENSION(jpi,jpj) :: zhml  ! ml depth - grid
270
271      REAL(wp), DIMENSION(jpi,jpj) :: zhmle ! MLE depth - grid
272      REAL(wp), DIMENSION(jpi,jpj) :: zmld  ! ML depth on grid
273
274      REAL(wp), DIMENSION(jpi,jpj) :: zdh   ! pycnocline depth - grid
275      REAL(wp), DIMENSION(jpi,jpj) :: zdhdt ! BL depth tendency
276      REAL(wp), DIMENSION(jpi,jpj) :: zdhdt_2                                    ! correction to dhdt due to internal structure.
277      REAL(wp), DIMENSION(jpi,jpj) :: zdtdz_ext,zdsdz_ext,zdbdz_ext              ! external temperature/salinity and buoyancy gradients
278
279      REAL(wp), DIMENSION(jpi,jpj) :: zdtdx, zdtdy, zdsdx, zdsdy      ! horizontal gradients for Fox-Kemper parametrization.
280
281      REAL(wp), DIMENSION(jpi,jpj) :: zt_bl,zs_bl,zu_bl,zv_bl,zrh_bl  ! averages over the depth of the blayer
282      REAL(wp), DIMENSION(jpi,jpj) :: zt_ml,zs_ml,zu_ml,zv_ml,zrh_ml  ! averages over the depth of the mixed layer
283      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
284      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
285      REAL(wp), DIMENSION(jpi,jpj) :: zwth_ent,zws_ent ! heat and salinity fluxes at the top of the pycnocline
286      REAL(wp), DIMENSION(jpi,jpj) :: zuw_bse,zvw_bse  ! momentum fluxes at the top of the pycnocline
287      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdtdz_pyc    ! parametrized gradient of temperature in pycnocline
288      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdsdz_pyc    ! parametrised gradient of salinity in pycnocline
289      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdbdz_pyc    ! parametrised gradient of buoyancy in the pycnocline
290      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdudz_pyc    ! u-shear across the pycnocline
291      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdvdz_pyc    ! v-shear across the pycnocline
292
293      ! Flux-gradient relationship variables
294
295      REAL(wp) :: zl_c,zl_l,zl_eps  ! Used to calculate turbulence length scale.
296
297      REAL(wp), DIMENSION(jpi,jpj) :: zdifml_sc,zvisml_sc,zdifpyc_sc,zvispyc_sc,zbeta_d_sc,zbeta_v_sc ! Scales for eddy diffusivity/viscosity
298      REAL(wp), DIMENSION(jpi,jpj) :: zsc_wth_1,zsc_ws_1 ! Temporary scales used to calculate scalar non-gradient terms.
299      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.
300      REAL(wp), DIMENSION(jpi,jpj) :: zhbl_t ! holds boundary layer depth updated by full timestep
301
302      ! For calculating Ri#-dependent mixing
303      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3du   ! u-shear^2
304      REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3dv   ! v-shear^2
305      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrimix ! spatial form of ri#-induced diffusion
306
307      ! Temporary variables
308      INTEGER :: inhml
309      REAL(wp) :: znd,znd_d,zznd_ml,zznd_pyc,zznd_d ! temporary non-dimensional depths used in various routines
310      REAL(wp) :: ztemp, zari, zpert, zzdhdt, zdb   ! temporary variables
311      REAL(wp) :: zthick, zz0, zz1 ! temporary variables
312      REAL(wp) :: zvel_max, zhbl_s ! temporary variables
313      REAL(wp) :: zfac             ! temporary variable
314      REAL(wp) :: zus_x, zus_y     ! temporary Stokes drift
315      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zviscos ! viscosity
316      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdiffut ! t-diffusivity
317
318      INTEGER :: ibld_ext=0                          ! does not have to be zero for modified scheme
319      REAL(wp) :: zwb_min, zgamma_b_nd, zgamma_b, zdhoh, ztau, zddhdt
320      REAL(wp) :: zzeta_s = 0._wp
321      REAL(wp) :: zzeta_v = 0.46
322      REAL(wp) :: zabsstke
323
324      ! For debugging
325      INTEGER :: ikt
326      !!--------------------------------------------------------------------
327      !
328      ibld(:,:)   = 0     ; imld(:,:)  = 0
329      zrad0(:,:)  = 0._wp ; zradh(:,:) = 0._wp ; zradav(:,:)    = 0._wp ; zustar(:,:)    = 0._wp
330      zwstrl(:,:) = 0._wp ; zvstr(:,:) = 0._wp ; zwstrc(:,:)    = 0._wp ; zuw0(:,:)      = 0._wp
331      zvw0(:,:)   = 0._wp ; zwth0(:,:) = 0._wp ; zws0(:,:)      = 0._wp ; zwb0(:,:)      = 0._wp
332      zwthav(:,:) = 0._wp ; zwsav(:,:) = 0._wp ; zwbav(:,:)     = 0._wp ; zwb_ent(:,:)   = 0._wp
333      zustke(:,:) = 0._wp ; zla(:,:)   = 0._wp ; zcos_wind(:,:) = 0._wp ; zsin_wind(:,:) = 0._wp
334      zhol(:,:)   = 0._wp
335      lconv(:,:)  = .FALSE.
336      ! mixed layer
337      ! no initialization of zhbl or zhml (or zdh?)
338      zhbl(:,:)    = 1._wp ; zhml(:,:)    = 1._wp ; zdh(:,:)      = 1._wp ; zdhdt(:,:)   = 0._wp
339      zt_bl(:,:)   = 0._wp ; zs_bl(:,:)   = 0._wp ; zu_bl(:,:)    = 0._wp ; zv_bl(:,:)   = 0._wp
340      zrh_bl(:,:)  = 0._wp ; zt_ml(:,:)   = 0._wp ; zs_ml(:,:)    = 0._wp ; zu_ml(:,:)   = 0._wp
341
342      zv_ml(:,:)   = 0._wp ; zrh_ml(:,:)  = 0._wp ; zdt_bl(:,:)   = 0._wp ; zds_bl(:,:)  = 0._wp
343      zdu_bl(:,:)  = 0._wp ; zdv_bl(:,:)  = 0._wp ; zdrh_bl(:,:)  = 0._wp ; zdb_bl(:,:)  = 0._wp
344      zdt_ml(:,:)  = 0._wp ; zds_ml(:,:)  = 0._wp ; zdu_ml(:,:)   = 0._wp ; zdv_ml(:,:)  = 0._wp
345      zdrh_ml(:,:) = 0._wp ; zdb_ml(:,:)  = 0._wp ; zwth_ent(:,:) = 0._wp ; zws_ent(:,:) = 0._wp
346      zuw_bse(:,:) = 0._wp ; zvw_bse(:,:) = 0._wp
347      !
348      zdtdz_pyc(:,:,:) = 0._wp ; zdsdz_pyc(:,:,:) = 0._wp ; zdbdz_pyc(:,:,:) = 0._wp
349      zdudz_pyc(:,:,:) = 0._wp ; zdvdz_pyc(:,:,:) = 0._wp
350      !
351      zdtdz_ext(:,:) = 0._wp ; zdsdz_ext(:,:) = 0._wp ; zdbdz_ext(:,:) = 0._wp
352
353      IF ( ln_osm_mle ) THEN  ! only initialise arrays if needed
354         zdtdx(:,:) = 0._wp ; zdtdy(:,:) = 0._wp ; zdsdx(:,:) = 0._wp
355         zdsdy(:,:) = 0._wp ; dbdx_mle(:,:) = 0._wp ; dbdy_mle(:,:) = 0._wp
356         zwb_fk(:,:) = 0._wp ; zvel_mle(:,:) = 0._wp; zdiff_mle(:,:) = 0._wp
357         zhmle(:,:) = 0._wp  ; zmld(:,:) = 0._wp
358      ENDIF
359      zwb_fk_b(:,:) = 0._wp   ! must be initialised even with ln_osm_mle=F as used in zdf_osm_calculate_dhdt
360
361      ! Flux-Gradient arrays.
362      zdifml_sc(:,:)  = 0._wp ; zvisml_sc(:,:)  = 0._wp ; zdifpyc_sc(:,:) = 0._wp
363      zvispyc_sc(:,:) = 0._wp ; zbeta_d_sc(:,:) = 0._wp ; zbeta_v_sc(:,:) = 0._wp
364      zsc_wth_1(:,:)  = 0._wp ; zsc_ws_1(:,:)   = 0._wp ; zsc_uw_1(:,:)   = 0._wp
365      zsc_uw_2(:,:)   = 0._wp ; zsc_vw_1(:,:)   = 0._wp ; zsc_vw_2(:,:)   = 0._wp
366      zhbl_t(:,:)     = 0._wp ; zdhdt(:,:)      = 0._wp
367
368      zdiffut(:,:,:) = 0._wp ; zviscos(:,:,:) = 0._wp ; ghamt(:,:,:) = 0._wp
369      ghams(:,:,:)   = 0._wp ; ghamu(:,:,:)   = 0._wp ; ghamv(:,:,:) = 0._wp
370
371      zdhdt_2(:,:) = 0._wp
372      ! hbl = MAX(hbl,epsln)
373      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
374      ! Calculate boundary layer scales
375      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
376
377      ! Assume two-band radiation model for depth of OSBL
378     zz0 =       rn_abs       ! surface equi-partition in 2-bands
379     zz1 =  1. - rn_abs
380     DO jj = 2, jpjm1
381        DO ji = 2, jpim1
382           ! Surface downward irradiance (so always +ve)
383           zrad0(ji,jj) = qsr(ji,jj) * r1_rau0_rcp
384           ! Downwards irradiance at base of boundary layer
385           zradh(ji,jj) = zrad0(ji,jj) * ( zz0 * EXP( -hbl(ji,jj)/rn_si0 ) + zz1 * EXP( -hbl(ji,jj)/rn_si1) )
386           ! Downwards irradiance averaged over depth of the OSBL
387           zradav(ji,jj) = zrad0(ji,jj) * ( zz0 * ( 1.0 - EXP( -hbl(ji,jj)/rn_si0 ) )*rn_si0 &
388                 &                         + zz1 * ( 1.0 - EXP( -hbl(ji,jj)/rn_si1 ) )*rn_si1 ) / hbl(ji,jj)
389        END DO
390     END DO
391     ! Turbulent surface fluxes and fluxes averaged over depth of the OSBL
392     DO jj = 2, jpjm1
393        DO ji = 2, jpim1
394           zthermal = rab_n(ji,jj,1,jp_tem)
395           zbeta    = rab_n(ji,jj,1,jp_sal)
396           ! Upwards surface Temperature flux for non-local term
397           zwth0(ji,jj) = - qns(ji,jj) * r1_rau0_rcp * tmask(ji,jj,1)
398           ! Upwards surface salinity flux for non-local term
399           zws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * tsn(ji,jj,1,jp_sal)  + sfx(ji,jj) ) * r1_rau0 * tmask(ji,jj,1)
400           ! Non radiative upwards surface buoyancy flux
401           zwb0(ji,jj) = grav * zthermal * zwth0(ji,jj) -  grav * zbeta * zws0(ji,jj)
402           ! turbulent heat flux averaged over depth of OSBL
403           zwthav(ji,jj) = 0.5 * zwth0(ji,jj) - ( 0.5*( zrad0(ji,jj) + zradh(ji,jj) ) - zradav(ji,jj) )
404           ! turbulent salinity flux averaged over depth of the OBSL
405           zwsav(ji,jj) = 0.5 * zws0(ji,jj)
406           ! turbulent buoyancy flux averaged over the depth of the OBSBL
407           zwbav(ji,jj) = grav  * zthermal * zwthav(ji,jj) - grav  * zbeta * zwsav(ji,jj)
408           ! Surface upward velocity fluxes
409           zuw0(ji,jj) = -utau(ji,jj) * r1_rau0 * tmask(ji,jj,1)
410           zvw0(ji,jj) = -vtau(ji,jj) * r1_rau0 * tmask(ji,jj,1)
411           ! Friction velocity (zustar), at T-point : LMD94 eq. 2
412           zustar(ji,jj) = MAX( SQRT( SQRT( zuw0(ji,jj) * zuw0(ji,jj) + zvw0(ji,jj) * zvw0(ji,jj) ) ), 1.0e-8 )
413           zcos_wind(ji,jj) = -zuw0(ji,jj) / ( zustar(ji,jj) * zustar(ji,jj) )
414           zsin_wind(ji,jj) = -zvw0(ji,jj) / ( zustar(ji,jj) * zustar(ji,jj) )
415        END DO
416     END DO
417     ! Calculate Stokes drift in direction of wind (zustke) and Stokes penetration depth (dstokes)
418     SELECT CASE (nn_osm_wave)
419     ! Assume constant La#=0.3
420     CASE(0)
421        DO jj = 2, jpjm1
422           DO ji = 2, jpim1
423              zus_x = zcos_wind(ji,jj) * zustar(ji,jj) / 0.3**2
424              zus_y = zsin_wind(ji,jj) * zustar(ji,jj) / 0.3**2
425              zustke(ji,jj) = MAX ( SQRT( zus_x*zus_x + zus_y*zus_y), 1.0e-8 )
426              ! dstokes(ji,jj) set to constant value rn_osm_dstokes from namelist in zdf_osm_init
427           END DO
428        END DO
429     ! Assume Pierson-Moskovitz wind-wave spectrum
430     CASE(1)
431        DO jj = 2, jpjm1
432           DO ji = 2, jpim1
433              ! Use wind speed wndm included in sbc_oce module
434              zustke(ji,jj) = MAX ( 0.016 * wndm(ji,jj), 1.0e-8 )
435              dstokes(ji,jj) = MAX( 0.12 * wndm(ji,jj)**2 / grav, 5.e-1)
436           END DO
437        END DO
438     ! Use ECMWF wave fields as output from SBCWAVE
439     CASE(2)
440        zfac =  2.0_wp * rpi / 16.0_wp
441        DO jj = 2, jpjm1
442           DO ji = 2, jpim1
443              ! The Langmur number from the ECMWF model appears to give La<0.3 for wind-driven seas.
444              !    The coefficient 0.8 gives La=0.3  in this situation.
445              ! It could represent the effects of the spread of wave directions
446              ! around the mean wind. The effect of this adjustment needs to be tested.
447              zabsstke = SQRT(ut0sd(ji,jj)**2 + vt0sd(ji,jj)**2)
448              zustke(ji,jj) = MAX (0.8 * ( zcos_wind(ji,jj) * ut0sd(ji,jj) + zsin_wind(ji,jj)  * vt0sd(ji,jj) ), 1.0e-8)
449              dstokes(ji,jj) = MAX(zfac * hsw(ji,jj)*hsw(ji,jj) / ( MAX(zabsstke*wmp(ji,jj), 1.0e-7 ) ), 5.0e-1) !rn_osm_dstokes !
450           END DO
451        END DO
452     END SELECT
453
454     ! Langmuir velocity scale (zwstrl), La # (zla)
455     ! mixed scale (zvstr), convective velocity scale (zwstrc)
456     DO jj = 2, jpjm1
457        DO ji = 2, jpim1
458           ! Langmuir velocity scale (zwstrl), at T-point
459           zwstrl(ji,jj) = ( zustar(ji,jj) * zustar(ji,jj) * zustke(ji,jj) )**pthird
460           zla(ji,jj) = MAX(MIN(SQRT ( zustar(ji,jj) / ( zwstrl(ji,jj) + epsln ) )**3, 4.0), 0.2)
461           IF(zla(ji,jj) > 0.45) dstokes(ji,jj) = MIN(dstokes(ji,jj), 0.5_wp*hbl(ji,jj))
462           ! Velocity scale that tends to zustar for large Langmuir numbers
463           zvstr(ji,jj) = ( zwstrl(ji,jj)**3  + &
464                & ( 1.0 - EXP( -0.5 * zla(ji,jj)**2 ) ) * zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj) )**pthird
465
466           ! limit maximum value of Langmuir number as approximate treatment for shear turbulence.
467           ! Note zustke and zwstrl are not amended.
468           !
469           ! get convective velocity (zwstrc), stabilty scale (zhol) and logical conection flag lconv
470           IF ( zwbav(ji,jj) > 0.0) THEN
471              zwstrc(ji,jj) = ( 2.0 * zwbav(ji,jj) * 0.9 * hbl(ji,jj) )**pthird
472              zhol(ji,jj) = -0.9 * hbl(ji,jj) * 2.0 * zwbav(ji,jj) / (zvstr(ji,jj)**3 + epsln )
473              lconv(ji,jj) = .TRUE.
474           ELSE
475              zhol(ji,jj) = -hbl(ji,jj) *  2.0 * zwbav(ji,jj)/ (zvstr(ji,jj)**3  + epsln )
476              lconv(ji,jj) = .FALSE.
477           ENDIF
478        END DO
479     END DO
480
481     !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
482     ! Mixed-layer model - calculate averages over the boundary layer, and the change in the boundary layer depth
483     !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
484     ! BL must be always 4 levels deep.
485      hbl(:,:) = MAX(hbl(:,:), gdepw_n(:,:,4) )
486      ibld(:,:) = 4
487      DO jk = 5, jpkm1
488         DO jj = 2, jpjm1
489            DO ji = 2, jpim1
490               IF ( hbl(ji,jj) >= gdepw_n(ji,jj,jk) ) THEN
491                  ibld(ji,jj) = MIN(mbkt(ji,jj), jk)
492               ENDIF
493            END DO
494         END DO
495      END DO
496
497      DO jj = 2, jpjm1
498         DO ji = 2, jpim1
499            zhbl(ji,jj) = gdepw_n(ji,jj,ibld(ji,jj))
500            imld(ji,jj) = MAX(3,ibld(ji,jj) - MAX( INT( dh(ji,jj) / e3t_n(ji, jj, ibld(ji,jj) )) , 1 ))
501            zhml(ji,jj) = gdepw_n(ji,jj,imld(ji,jj))
502         END DO
503      END DO
504      ! Averages over well-mixed and boundary layer
505      ! Alan: do we need zb_nl?, zb_ml?
506      CALL zdf_osm_vertical_average(ibld, zt_bl, zs_bl, zu_bl, zv_bl, zdt_bl, zds_bl, zdb_bl, zdu_bl, zdv_bl)
507      CALL zdf_osm_vertical_average(imld, zt_ml, zs_ml, zu_ml, zv_ml, zdt_ml, zds_ml, zdb_ml, zdu_ml, zdv_ml)
508! External gradient
509      CALL zdf_osm_external_gradients( zdtdz_ext, zdsdz_ext, zdbdz_ext )
510
511
512      IF ( ln_osm_mle ) THEN
513         CALL zdf_osm_zmld_horizontal_gradients( zmld, zdtdx, zdtdy, zdsdx, zdsdy, dbdx_mle, dbdy_mle )
514         CALL zdf_osm_mle_parameters( hmle, zwb_fk, zvel_mle, zdiff_mle )
515       ENDIF
516
517! Rate of change of hbl
518      CALL zdf_osm_calculate_dhdt( zdhdt, zdhdt_2 )
519      ! Calculate averages over depth of boundary layer
520         DO jj = 2, jpjm1
521            DO ji = 2, jpim1
522               zhbl_t(ji,jj) = hbl(ji,jj) + (zdhdt(ji,jj) - wn(ji,jj,ibld(ji,jj)))* rn_rdt ! certainly need wn here, so subtract it
523               ! adjustment to represent limiting by ocean bottom
524               zhbl_t(ji,jj) = MIN(zhbl_t(ji,jj), gdepw_n(ji,jj, mbkt(ji,jj) + 1) - depth_tol)! ht_n(:,:))
525            END DO
526         END DO
527
528      imld = ibld           ! use imld to hold previous blayer index
529      ibld(:,:) = 4
530
531      DO jk = 4, jpkm1
532         DO jj = 2, jpjm1
533            DO ji = 2, jpim1
534               IF ( zhbl_t(ji,jj) >= gdepw_n(ji,jj,jk) ) THEN
535                  ibld(ji,jj) = jk
536               ENDIF
537            END DO
538         END DO
539      END DO
540
541!
542! Step through model levels taking account of buoyancy change to determine the effect on dhdt
543!
544      CALL zdf_osm_timestep_hbl( zdhdt, zdhdt_2 )
545      ! Alan: do we need zb_ml?
546      CALL zdf_osm_vertical_average( ibld, zt_bl, zs_bl, zu_bl, zv_bl, zdt_bl, zds_bl, zdb_bl, zdu_bl, zdv_bl )
547!
548!
549      CALL zdf_osm_pycnocline_thickness( dh, zdh )
550      dstokes(:,:) = MIN ( dstokes(:,:), hbl(:,:)/3. )  !  Limit delta for shallow boundary layers for calculating flux-gradient terms.
551!
552    ! Average over the depth of the mixed layer in the convective boundary layer
553    ! Alan: do we need zb_ml?
554    CALL zdf_osm_vertical_average( imld, zt_ml, zs_ml, zu_ml, zv_ml, zdt_ml, zds_ml, zdb_ml, zdu_ml, zdv_ml )
555    ! rotate mean currents and changes onto wind align co-ordinates
556    !
557    CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_ml, zv_ml, zdu_ml, zdv_ml )
558    CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_bl, zv_bl, zdu_bl, zdv_bl )
559     zuw_bse = 0._wp
560     zvw_bse = 0._wp
561     zwth_ent = 0._wp
562     zws_ent = 0._wp
563     DO jj = 2, jpjm1
564        DO ji = 2, jpim1
565           IF ( ibld(ji,jj) < mbkt(ji,jj) ) THEN
566              IF ( lconv(ji,jj) ) THEN
567             zuw_bse(ji,jj) = -0.0075*((zvstr(ji,jj)**3+0.5*zwstrc(ji,jj)**3)**pthird*zdu_ml(ji,jj) + &
568                      &                    1.5*zustar(ji,jj)**2*(zhbl(ji,jj)-zhml(ji,jj)) )/ &
569                      &                     ( zhml(ji,jj)*MIN(zla(ji,jj)**(8./3.),1.) + epsln)
570            zvw_bse(ji,jj) = 0.01*(-(zvstr(ji,jj)**3+0.5*zwstrc(ji,jj)**3)**pthird*zdv_ml(ji,jj)+ &
571                      &                    2.0*ff_t(ji,jj)*zustke(ji,jj)*dstokes(ji,jj)*zla(ji,jj))
572                 IF ( zdb_ml(ji,jj) > 0._wp ) THEN
573                    zwth_ent(ji,jj) = zwb_ent(ji,jj) * zdt_ml(ji,jj) / (zdb_ml(ji,jj) + epsln)
574                    zws_ent(ji,jj) = zwb_ent(ji,jj) * zds_ml(ji,jj) / (zdb_ml(ji,jj) + epsln)
575                 ENDIF
576              ELSE
577                 zwth_ent(ji,jj) = -2.0 * zwthav(ji,jj) * ( (1.0 - 0.8) - ( 1.0 - 0.8)**(3.0/2.0) )
578                 zws_ent(ji,jj) = -2.0 * zwsav(ji,jj) * ( (1.0 - 0.8 ) - ( 1.0 - 0.8 )**(3.0/2.0) )
579              ENDIF
580           ENDIF
581        END DO
582     END DO
583
584      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
585      !  Pycnocline gradients for scalars and velocity
586      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
587
588      CALL zdf_osm_external_gradients( zdtdz_ext, zdsdz_ext, zdbdz_ext )
589      CALL zdf_osm_pycnocline_scalar_profiles( zdtdz_pyc, zdsdz_pyc, zdbdz_pyc )
590      CALL zdf_osm_pycnocline_shear_profiles( zdudz_pyc, zdvdz_pyc )
591       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
592       ! Eddy viscosity/diffusivity and non-gradient terms in the flux-gradient relationship
593       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
594
595       DO jj = 2, jpjm1
596          DO ji = 2, jpim1
597             IF ( lconv(ji,jj) ) THEN
598               zdifml_sc(ji,jj) = zhml(ji,jj) * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
599               zvisml_sc(ji,jj) = zdifml_sc(ji,jj)
600               zdifpyc_sc(ji,jj) = 0.165 * ( zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3 )**pthird * zdh(ji,jj)
601               zvispyc_sc(ji,jj) = 0.142 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * zdh(ji,jj)
602               zbeta_d_sc(ji,jj) = 1.0 - (0.165 / 0.8 * zdh(ji,jj) / zhbl(ji,jj) )**p2third
603               zbeta_v_sc(ji,jj) = 1.0 -  2.0 * (0.142 /0.375) * zdh(ji,jj) / ( zhml(ji,jj) + epsln )
604             ELSE
605               zdifml_sc(ji,jj) = zvstr(ji,jj) * zhbl(ji,jj) * EXP ( -( zhol(ji,jj) / 0.6_wp )**2 )
606               zvisml_sc(ji,jj) = zvstr(ji,jj) * zhbl(ji,jj) * EXP ( -( zhol(ji,jj) / 0.6_wp )**2 )
607             END IF
608          END DO
609       END DO
610!
611       DO jj = 2, jpjm1
612          DO ji = 2, jpim1
613             IF ( lconv(ji,jj) ) THEN
614                DO jk = 2, imld(ji,jj)   ! mixed layer diffusivity
615                    zznd_ml = gdepw_n(ji,jj,jk) / zhml(ji,jj)
616                    !
617                    zdiffut(ji,jj,jk) = 0.8   * zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_d_sc(ji,jj) * zznd_ml    )**1.5
618                    !
619                    zviscos(ji,jj,jk) = 0.375 * zvisml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_v_sc(ji,jj) * zznd_ml    ) &
620                         &            *                                      ( 1.0 -               0.5 * zznd_ml**2 )
621                END DO
622                ! pycnocline - if present linear profile
623                IF ( zdh(ji,jj) > 0._wp ) THEN
624                   zgamma_b = 6.0
625                   DO jk = imld(ji,jj)+1 , ibld(ji,jj)
626                       zznd_pyc = -( gdepw_n(ji,jj,jk) - zhml(ji,jj) ) / zdh(ji,jj)
627                       !
628                       zdiffut(ji,jj,jk) = zdifpyc_sc(ji,jj) * EXP( zgamma_b * zznd_pyc )
629                       !
630                       zviscos(ji,jj,jk) = zvispyc_sc(ji,jj) * EXP( zgamma_b * zznd_pyc )
631                   END DO
632                   IF ( ibld_ext == 0 ) THEN
633                       zdiffut(ji,jj,ibld(ji,jj)) = 0._wp
634                       zviscos(ji,jj,ibld(ji,jj)) = 0._wp
635                   ELSE
636                       zdiffut(ji,jj,ibld(ji,jj)) = zdhdt(ji,jj) * ( hbl(ji,jj) - gdepw_n(ji, jj, ibld(ji,jj)-1) )
637                       zviscos(ji,jj,ibld(ji,jj)) = zdhdt(ji,jj) * ( hbl(ji,jj) - gdepw_n(ji, jj, ibld(ji,jj)-1) )
638                   ENDIF
639                ENDIF
640                ! Temporary fix to ensure zdiffut is +ve; won't be necessary with wn taken out
641                zdiffut(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj) * e3t_n(ji,jj,ibld(ji,jj)), 1.e-6)
642                zviscos(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj) * e3t_n(ji,jj,ibld(ji,jj)), 1.e-5)
643                ! could be taken out, take account of entrainment represents as a diffusivity
644                ! should remove w from here, represents entrainment
645             ELSE
646             ! stable conditions
647                DO jk = 2, ibld(ji,jj)
648                   zznd_ml = gdepw_n(ji,jj,jk) / zhbl(ji,jj)
649                   zdiffut(ji,jj,jk) = 0.75 * zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zznd_ml )**1.5
650                   zviscos(ji,jj,jk) = 0.375 * zvisml_sc(ji,jj) * zznd_ml * (1.0 - zznd_ml) * ( 1.0 - zznd_ml**2 )
651                END DO
652
653                IF ( ibld_ext == 0 ) THEN
654                   zdiffut(ji,jj,ibld(ji,jj)) = 0._wp
655                   zviscos(ji,jj,ibld(ji,jj)) = 0._wp
656                ELSE
657                   zdiffut(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj), 0._wp) * e3w_n(ji, jj, ibld(ji,jj))
658                   zviscos(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj), 0._wp) * e3w_n(ji, jj, ibld(ji,jj))
659                ENDIF
660             ENDIF   ! end if ( lconv )
661             !
662          END DO  ! end of ji loop
663       END DO     ! end of jj loop
664
665       !
666       ! calculate non-gradient components of the flux-gradient relationships
667       !
668! Stokes term in scalar flux, flux-gradient relationship
669       WHERE ( lconv )
670          zsc_wth_1 = zwstrl**3 * zwth0 / ( zvstr**3 + 0.5 * zwstrc**3 + epsln)
671          !
672          zsc_ws_1 = zwstrl**3 * zws0 / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
673       ELSEWHERE
674          zsc_wth_1 = 2.0 * zwthav
675          !
676          zsc_ws_1 = 2.0 * zwsav
677       ENDWHERE
678
679
680       DO jj = 2, jpjm1
681          DO ji = 2, jpim1
682            IF ( lconv(ji,jj) ) THEN
683              DO jk = 2, imld(ji,jj)
684                 zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
685                 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)
686                 !
687                 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)
688              END DO ! end jk loop
689            ELSE     ! else for if (lconv)
690 ! Stable conditions
691               DO jk = 2, ibld(ji,jj)
692                  zznd_d=gdepw_n(ji,jj,jk) / dstokes(ji,jj)
693                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 1.5 * EXP ( -0.9 * zznd_d ) &
694                       &          *                 ( 1.0 - EXP ( -4.0 * zznd_d ) ) * zsc_wth_1(ji,jj)
695                  !
696                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 1.5 * EXP ( -0.9 * zznd_d ) &
697                       &          *                 ( 1.0 - EXP ( -4.0 * zznd_d ) ) *  zsc_ws_1(ji,jj)
698               END DO
699            ENDIF               ! endif for check on lconv
700
701          END DO  ! end of ji loop
702       END DO     ! end of jj loop
703
704! 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)
705       WHERE ( lconv )
706          zsc_uw_1 = ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * zustke / MAX( ( 1.0 - 1.0 * 6.5 * zla**(8.0/3.0) ), 0.2 )
707          zsc_uw_2 = ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * zustke / MIN( zla**(8.0/3.0) + epsln, 0.12 )
708          zsc_vw_1 = ff_t * zhml * zustke**3 * MIN( zla**(8.0/3.0), 0.12 ) / ( ( zvstr**3 + 0.5 * zwstrc**3 )**(2.0/3.0) + epsln )
709       ELSEWHERE
710          zsc_uw_1 = zustar**2
711          zsc_vw_1 = ff_t * zhbl * zustke**3 * MIN( zla**(8.0/3.0), 0.12 ) / (zvstr**2 + epsln)
712       ENDWHERE
713       IF(ln_dia_osm) THEN
714          IF ( iom_use("ghamu_00") ) CALL iom_put( "ghamu_00", wmask*ghamu )
715          IF ( iom_use("ghamv_00") ) CALL iom_put( "ghamv_00", wmask*ghamv )
716       END IF
717       DO jj = 2, jpjm1
718          DO ji = 2, jpim1
719             IF ( lconv(ji,jj) ) THEN
720                DO jk = 2, imld(ji,jj)
721                   zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
722                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) +      ( -0.05 * EXP ( -0.4 * zznd_d )   * zsc_uw_1(ji,jj)   &
723                        &          +                        0.00125 * EXP (      - zznd_d )   * zsc_uw_2(ji,jj) ) &
724                        &          *                          ( 1.0 - EXP ( -2.0 * zznd_d ) )
725!
726                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) - 0.65 *  0.15 * EXP (      - zznd_d )                       &
727                        &          *                          ( 1.0 - EXP ( -2.0 * zznd_d ) ) * zsc_vw_1(ji,jj)
728                END DO   ! end jk loop
729             ELSE
730! Stable conditions
731                DO jk = 2, ibld(ji,jj) ! corrected to ibld
732                   zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
733                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) - 0.75 *   1.3 * EXP ( -0.5 * zznd_d )                       &
734                        &                                   * ( 1.0 - EXP ( -4.0 * zznd_d ) ) * zsc_uw_1(ji,jj)
735                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + 0._wp
736                END DO   ! end jk loop
737             ENDIF
738          END DO  ! ji loop
739       END DO     ! jj loo
740
741! Buoyancy term in flux-gradient relationship [note : includes ROI ratio (X0.3) and pressure (X0.5)]
742
743       WHERE ( lconv )
744          zsc_wth_1 = zwbav * zwth0 * ( 1.0 + EXP ( 0.2 * zhol ) ) / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
745          zsc_ws_1  = zwbav * zws0  * ( 1.0 + EXP ( 0.2 * zhol ) ) / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
746       ELSEWHERE
747          zsc_wth_1 = 0._wp
748          zsc_ws_1 = 0._wp
749       ENDWHERE
750
751       DO jj = 2, jpjm1
752          DO ji = 2, jpim1
753             IF (lconv(ji,jj) ) THEN
754                DO jk = 2, imld(ji,jj)
755                   zznd_ml = gdepw_n(ji,jj,jk) / zhml(ji,jj)
756                   ! calculate turbulent length scale
757                   zl_c = 0.9 * ( 1.0 - EXP ( - 7.0 * ( zznd_ml - zznd_ml**3 / 3.0 ) ) )                                           &
758                        &     * ( 1.0 - EXP ( -15.0 * (     1.1 - zznd_ml          ) ) )
759                   zl_l = 2.0 * ( 1.0 - EXP ( - 2.0 * ( zznd_ml - zznd_ml**3 / 3.0 ) ) )                                           &
760                        &     * ( 1.0 - EXP ( - 5.0 * (     1.0 - zznd_ml          ) ) ) * ( 1.0 + dstokes(ji,jj) / zhml (ji,jj) )
761                   zl_eps = zl_l + ( zl_c - zl_l ) / ( 1.0 + EXP ( -3.0 * LOG10 ( - zhol(ji,jj) ) ) ) ** (3.0/2.0)
762                   ! non-gradient buoyancy terms
763                   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 )
764                   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 )
765                END DO
766             ELSE
767                DO jk = 2, ibld(ji,jj)
768                   ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zsc_wth_1(ji,jj)
769                   ghams(ji,jj,jk) = ghams(ji,jj,jk) +  zsc_ws_1(ji,jj)
770                END DO
771             ENDIF
772          END DO   ! ji loop
773       END DO      ! jj loop
774
775       WHERE ( lconv )
776          zsc_uw_1 = -zwb0 * zustar**2 * zhml / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )
777          zsc_uw_2 =  zwb0 * zustke    * zhml / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )**(2.0/3.0)
778          zsc_vw_1 = 0._wp
779       ELSEWHERE
780         zsc_uw_1 = 0._wp
781         zsc_vw_1 = 0._wp
782       ENDWHERE
783
784       DO jj = 2, jpjm1
785          DO ji = 2, jpim1
786             IF ( lconv(ji,jj) ) THEN
787                DO jk = 2 , imld(ji,jj)
788                   zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
789                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.3 * 0.5 * ( zsc_uw_1(ji,jj) +   0.125 * EXP( -0.5 * zznd_d )     &
790                        &                                                            * (   1.0 - EXP( -0.5 * zznd_d ) )   &
791                        &                                          * zsc_uw_2(ji,jj)                                    )
792                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj)
793                END DO  ! jk loop
794             ELSE
795             ! stable conditions
796                DO jk = 2, ibld(ji,jj)
797                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zsc_uw_1(ji,jj)
798                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj)
799                END DO
800             ENDIF
801          END DO        ! ji loop
802       END DO           ! jj loop
803
804       IF(ln_dia_osm) THEN
805          IF ( iom_use("ghamu_0") ) CALL iom_put( "ghamu_0", wmask*ghamu )
806          IF ( iom_use("zsc_uw_1_0") ) CALL iom_put( "zsc_uw_1_0", tmask(:,:,1)*zsc_uw_1 )
807       END IF
808! Transport term in flux-gradient relationship [note : includes ROI ratio (X0.3) ]
809
810       WHERE ( lconv )
811          zsc_wth_1 = zwth0
812          zsc_ws_1 = zws0
813       ELSEWHERE
814          zsc_wth_1 = 2.0 * zwthav
815          zsc_ws_1 = zws0
816       ENDWHERE
817
818       DO jj = 2, jpjm1
819          DO ji = 2, jpim1
820            IF ( lconv(ji,jj) ) THEN
821               DO jk = 2, imld(ji,jj)
822                  zznd_ml=gdepw_n(ji,jj,jk) / zhml(ji,jj)
823                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * zsc_wth_1(ji,jj)                &
824                       &          * ( -2.0 + 2.75 * (       ( 1.0 + 0.6 * zznd_ml**4 )      &
825                       &                               - EXP(     - 6.0 * zznd_ml    ) ) )  &
826                       &          * ( 1.0 - EXP( - 15.0 * (         1.0 - zznd_ml    ) ) )
827                  !
828                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * zsc_ws_1(ji,jj)  &
829                       &          * ( -2.0 + 2.75 * (       ( 1.0 + 0.6 * zznd_ml**4 )      &
830                       &                               - EXP(     - 6.0 * zznd_ml    ) ) )  &
831                       &          * ( 1.0 - EXP ( -15.0 * (         1.0 - zznd_ml    ) ) )
832               END DO
833            ELSE
834               DO jk = 2, ibld(ji,jj)
835                  zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
836                  znd = gdepw_n(ji,jj,jk) / zhbl(ji,jj)
837                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * ( -4.06 * EXP( -2.0 * zznd_d ) * (1.0 - EXP( -4.0 * zznd_d ) ) + &
838               &  7.5 * EXP ( -10.0 * ( 0.95 - znd )**2 ) * ( 1.0 - znd ) ) * zsc_wth_1(ji,jj)
839                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * ( -4.06 * EXP( -2.0 * zznd_d ) * (1.0 - EXP( -4.0 * zznd_d ) ) + &
840               &  7.5 * EXP ( -10.0 * ( 0.95 - znd )**2 ) * ( 1.0 - znd ) ) * zsc_ws_1(ji,jj)
841               END DO
842            ENDIF
843          ENDDO    ! ji loop
844       END DO      ! jj loop
845
846       WHERE ( lconv )
847          zsc_uw_1 = zustar**2
848          zsc_vw_1 = ff_t * zustke * zhml
849       ELSEWHERE
850          zsc_uw_1 = zustar**2
851          zsc_uw_2 = (2.25 - 3.0 * ( 1.0 - EXP( -1.25 * 2.0 ) ) ) * ( 1.0 - EXP( -4.0 * 2.0 ) ) * zsc_uw_1
852          zsc_vw_1 = ff_t * zustke * zhbl
853          zsc_vw_2 = -0.11 * SIN( 3.14159 * ( 2.0 + 0.4 ) ) * EXP(-( 1.5 + 2.0 )**2 ) * zsc_vw_1
854       ENDWHERE
855
856       DO jj = 2, jpjm1
857          DO ji = 2, jpim1
858             IF ( lconv(ji,jj) ) THEN
859               DO jk = 2, imld(ji,jj)
860                  zznd_ml = gdepw_n(ji,jj,jk) / zhml(ji,jj)
861                  zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
862                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk)&
863                       & + 0.3 * ( -2.0 + 2.5 * ( 1.0 + 0.1 * zznd_ml**4 ) - EXP ( -8.0 * zznd_ml ) ) * zsc_uw_1(ji,jj)
864                  !
865                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk)&
866                       & + 0.3 * 0.1 * ( EXP( -zznd_d ) + EXP( -5.0 * ( 1.0 - zznd_ml ) ) ) * zsc_vw_1(ji,jj)
867               END DO
868             ELSE
869               DO jk = 2, ibld(ji,jj)
870                  znd = gdepw_n(ji,jj,jk) / zhbl(ji,jj)
871                  zznd_d = gdepw_n(ji,jj,jk) / dstokes(ji,jj)
872                  IF ( zznd_d <= 2.0 ) THEN
873                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.5 * 0.3 &
874                          &*  ( 2.25 - 3.0  * ( 1.0 - EXP( - 1.25 * zznd_d ) ) * ( 1.0 - EXP( -2.0 * zznd_d ) ) ) * zsc_uw_1(ji,jj)
875                     !
876                  ELSE
877                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk)&
878                          & + 0.5 * 0.3 * ( 1.0 - EXP( -5.0 * ( 1.0 - znd ) ) ) * zsc_uw_2(ji,jj)
879                     !
880                  ENDIF
881
882                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk)&
883                       & + 0.3 * 0.15 * SIN( 3.14159 * ( 0.65 * zznd_d ) ) * EXP( -0.25 * zznd_d**2 ) * zsc_vw_1(ji,jj)
884                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk)&
885                       & + 0.3 * 0.15 * EXP( -5.0 * ( 1.0 - znd ) ) * ( 1.0 - EXP( -20.0 * ( 1.0 - znd ) ) ) * zsc_vw_2(ji,jj)
886               END DO
887             ENDIF
888          END DO
889       END DO
890
891       IF(ln_dia_osm) THEN
892          IF ( iom_use("ghamu_f") ) CALL iom_put( "ghamu_f", wmask*ghamu )
893          IF ( iom_use("ghamv_f") ) CALL iom_put( "ghamv_f", wmask*ghamv )
894          IF ( iom_use("zsc_uw_1_f") ) CALL iom_put( "zsc_uw_1_f", tmask(:,:,1)*zsc_uw_1 )
895          IF ( iom_use("zsc_vw_1_f") ) CALL iom_put( "zsc_vw_1_f", tmask(:,:,1)*zsc_vw_1 )
896          IF ( iom_use("zsc_uw_2_f") ) CALL iom_put( "zsc_uw_2_f", tmask(:,:,1)*zsc_uw_2 )
897          IF ( iom_use("zsc_vw_2_f") ) CALL iom_put( "zsc_vw_2_f", tmask(:,:,1)*zsc_vw_2 )
898       END IF
899!
900! Make surface forced velocity non-gradient terms go to zero at the base of the mixed layer.
901
902      DO jj = 2, jpjm1
903         DO ji = 2, jpim1
904            IF ( lconv(ji,jj) ) THEN
905               DO jk = 2, ibld(ji,jj)
906                  znd = ( gdepw_n(ji,jj,jk) - zhml(ji,jj) ) / zhml(ji,jj) !ALMG to think about
907                  IF ( znd >= 0.0 ) THEN
908                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * ( 1.0 - EXP( -30.0 * znd**2 ) )
909                     ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * ( 1.0 - EXP( -30.0 * znd**2 ) )
910                  ELSE
911                     ghamu(ji,jj,jk) = 0._wp
912                     ghamv(ji,jj,jk) = 0._wp
913                  ENDIF
914               END DO
915            ELSE
916               DO jk = 2, ibld(ji,jj)
917                  znd = ( gdepw_n(ji,jj,jk) - zhml(ji,jj) ) / zhml(ji,jj) !ALMG to think about
918                  IF ( znd >= 0.0 ) THEN
919                     ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * ( 1.0 - EXP( -10.0 * znd**2 ) )
920                     ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * ( 1.0 - EXP( -10.0 * znd**2 ) )
921                  ELSE
922                     ghamu(ji,jj,jk) = 0._wp
923                     ghamv(ji,jj,jk) = 0._wp
924                  ENDIF
925               END DO
926            ENDIF
927         END DO
928      END DO
929
930       IF(ln_dia_osm) THEN
931          IF ( iom_use("ghamu_b") ) CALL iom_put( "ghamu_b", wmask*ghamu )
932          IF ( iom_use("ghamv_b") ) CALL iom_put( "ghamv_b", wmask*ghamv )
933       END IF
934      ! pynocline contributions
935       ! Temporary fix to avoid instabilities when zdb_bl becomes very very small
936       zsc_uw_1 = 0._wp ! 50.0 * zla**(8.0/3.0) * zustar**2 * zhbl / ( zdb_bl + epsln )
937       DO jj = 2, jpjm1
938          DO ji = 2, jpim1
939             IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) ) THEN
940                DO jk= 2, ibld(ji,jj)
941                   znd = gdepw_n(ji,jj,jk) / zhbl(ji,jj)
942                   ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zdiffut(ji,jj,jk) * zdtdz_pyc(ji,jj,jk)
943                   ghams(ji,jj,jk) = ghams(ji,jj,jk) + zdiffut(ji,jj,jk) * zdsdz_pyc(ji,jj,jk)
944                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zviscos(ji,jj,jk) * zdudz_pyc(ji,jj,jk)
945                   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)
946                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zviscos(ji,jj,jk) * zdvdz_pyc(ji,jj,jk)
947                END DO
948             END IF
949          END DO
950       END DO
951
952! Entrainment contribution.
953
954       DO jj=2, jpjm1
955          DO ji = 2, jpim1
956            IF ( lconv(ji,jj) .AND. ibld(ji,jj) + ibld_ext < mbkt(ji,jj)) THEN
957               DO jk = 1, imld(ji,jj) - 1
958                  znd=gdepw_n(ji,jj,jk) / zhml(ji,jj)
959                  ! ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zwth_ent(ji,jj) * znd
960                  ! ghams(ji,jj,jk) = ghams(ji,jj,jk) + zws_ent(ji,jj) * znd
961                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zuw_bse(ji,jj) * znd
962                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zvw_bse(ji,jj) * znd
963               END DO
964               DO jk = imld(ji,jj), ibld(ji,jj)
965                  znd = -( gdepw_n(ji,jj,jk) - zhml(ji,jj) ) / zdh(ji,jj)
966                  ! ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zwth_ent(ji,jj) * ( 1.0 + znd )
967                  ! ghams(ji,jj,jk) = ghams(ji,jj,jk) + zws_ent(ji,jj) * ( 1.0 + znd )
968                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zuw_bse(ji,jj) * ( 1.0 + znd )
969                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zvw_bse(ji,jj) * ( 1.0 + znd )
970                END DO
971             ENDIF
972
973             ghamt(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp
974             ghams(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp
975             ghamu(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp
976             ghamv(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp
977          END DO       ! ji loop
978       END DO          ! jj loop
979
980       IF(ln_dia_osm) THEN
981          IF ( iom_use("ghamu_1") ) CALL iom_put( "ghamu_1", wmask*ghamu )
982          IF ( iom_use("ghamv_1") ) CALL iom_put( "ghamv_1", wmask*ghamv )
983          IF ( iom_use("zuw_bse") ) CALL iom_put( "zuw_bse", tmask(:,:,1)*zuw_bse )
984          IF ( iom_use("zvw_bse") ) CALL iom_put( "zvw_bse", tmask(:,:,1)*zvw_bse )
985          IF ( iom_use("zdudz_pyc") ) CALL iom_put( "zdudz_pyc", wmask*zdudz_pyc )
986          IF ( iom_use("zdvdz_pyc") ) CALL iom_put( "zdvdz_pyc", wmask*zdvdz_pyc )
987          IF ( iom_use("zviscos") ) CALL iom_put( "zviscos", wmask*zviscos )
988       END IF
989       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
990       ! Need to put in code for contributions that are applied explicitly to
991       ! the prognostic variables
992       !  1. Entrainment flux
993       !
994       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
995
996
997
998       ! rotate non-gradient velocity terms back to model reference frame
999
1000       DO jj = 2, jpjm1
1001          DO ji = 2, jpim1
1002             DO jk = 2, ibld(ji,jj)
1003                ztemp = ghamu(ji,jj,jk)
1004                ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * zcos_wind(ji,jj) - ghamv(ji,jj,jk) * zsin_wind(ji,jj)
1005                ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * zcos_wind(ji,jj) + ztemp * zsin_wind(ji,jj)
1006             END DO
1007          END DO
1008       END DO
1009
1010       IF(ln_dia_osm) THEN
1011          IF ( iom_use("zdtdz_pyc") ) CALL iom_put( "zdtdz_pyc", wmask*zdtdz_pyc )
1012          IF ( iom_use("zdsdz_pyc") ) CALL iom_put( "zdsdz_pyc", wmask*zdsdz_pyc )
1013          IF ( iom_use("zdbdz_pyc") ) CALL iom_put( "zdbdz_pyc", wmask*zdbdz_pyc )
1014       END IF
1015
1016! KPP-style Ri# mixing
1017       IF( ln_kpprimix) THEN
1018          DO jk = 2, jpkm1           !* Shear production at uw- and vw-points (energy conserving form)
1019             DO jj = 1, jpjm1
1020                DO ji = 1, jpim1   ! vector opt.
1021                   z3du(ji,jj,jk) = 0.5 * (  un(ji,jj,jk-1) -  un(ji  ,jj,jk) )   &
1022                        &                 * (  ub(ji,jj,jk-1) -  ub(ji  ,jj,jk) ) * wumask(ji,jj,jk) &
1023                        &                 / (  e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) )
1024                   z3dv(ji,jj,jk) = 0.5 * (  vn(ji,jj,jk-1) -  vn(ji,jj  ,jk) )   &
1025                        &                 * (  vb(ji,jj,jk-1) -  vb(ji,jj  ,jk) ) * wvmask(ji,jj,jk) &
1026                        &                 / (  e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) )
1027                END DO
1028             END DO
1029          END DO
1030      !
1031         DO jk = 2, jpkm1
1032            DO jj = 2, jpjm1
1033               DO ji = 2, jpim1   ! vector opt.
1034                  !                                          ! shear prod. at w-point weightened by mask
1035                  zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   &
1036                     &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) )
1037                  !                                          ! local Richardson number
1038                  zri   = MAX( rn2b(ji,jj,jk), 0._wp ) / MAX(zesh2, epsln)
1039                  zfri =  MIN( zri / rn_riinfty , 1.0_wp )
1040                  zfri  = ( 1.0_wp - zfri * zfri )
1041                  zrimix(ji,jj,jk)  =  zfri * zfri  * zfri * wmask(ji, jj, jk)
1042                END DO
1043             END DO
1044          END DO
1045
1046          DO jj = 2, jpjm1
1047             DO ji = 2, jpim1
1048                DO jk = ibld(ji,jj) + 1, jpkm1
1049                   zdiffut(ji,jj,jk) = zrimix(ji,jj,jk)*rn_difri
1050                   zviscos(ji,jj,jk) = zrimix(ji,jj,jk)*rn_difri
1051                END DO
1052             END DO
1053          END DO
1054
1055       END IF ! ln_kpprimix = .true.
1056
1057! KPP-style set diffusivity large if unstable below BL
1058       IF( ln_convmix) THEN
1059          DO jj = 2, jpjm1
1060             DO ji = 2, jpim1
1061                DO jk = ibld(ji,jj) + 1, jpkm1
1062                  IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) zdiffut(ji,jj,jk) = rn_difconv
1063                END DO
1064             END DO
1065          END DO
1066       END IF ! ln_convmix = .true.
1067
1068
1069 
1070       IF ( ln_osm_mle ) THEN  ! set up diffusivity and non-gradient mixing
1071          DO jj = 2 , jpjm1
1072             DO ji = 2, jpim1
1073                IF ( lconv(ji,jj) .AND. mld_prof(ji,jj) - ibld(ji,jj) > 1 ) THEN ! MLE mmixing extends below the OSBL.
1074            ! Calculate MLE flux profiles
1075                   ! DO jk = 1, mld_prof(ji,jj)
1076                   !    znd = - gdepw_n(ji,jj,jk) / MAX(zhmle(ji,jj),epsln)
1077                   !    ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + &
1078                   !         & zwt_fk(ji,jj) * ( 1.0 - ( 2.0 * znd + 1.0 )**2 ) * ( 1.0 + r5_21 * ( 2.0 * znd + 1.0 )**2 )
1079                   !    ghams(ji,jj,jk) = ghams(ji,jj,jk) + &
1080                   !         & zws_fk(ji,jj) * ( 1.0 - ( 2.0 * znd + 1.0 )**2 ) * ( 1.0 + r5_21 * ( 2.0 * znd + 1.0 )**2 )
1081                   ! END DO
1082            ! Calculate MLE flux contribution from surface fluxes
1083                   DO jk = 1, ibld(ji,jj)
1084                     znd = gdepw_n(ji,jj,jk) / MAX(zhbl(ji,jj),epsln)
1085                     ghamt(ji,jj,jk) = ghamt(ji,jj,jk) - zwth0(ji,jj) * ( 1.0 - znd )
1086                     ghams(ji,jj,jk) = ghams(ji,jj,jk) - zws0(ji,jj) * ( 1.0 - znd )
1087                    END DO
1088                    DO jk = 1, mld_prof(ji,jj)
1089                      znd = gdepw_n(ji,jj,jk) / MAX(zhmle(ji,jj),epsln)
1090                      ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zwth0(ji,jj) * ( 1.0 - znd )
1091                      ghams(ji,jj,jk) = ghams(ji,jj,jk) + zws0(ji,jj) * ( 1.0 -znd )
1092                    END DO
1093            ! Viscosity for MLEs
1094                    DO jk = ibld(ji,jj), mld_prof(ji,jj)
1095                      zdiffut(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), zdiff_mle(ji,jj) )
1096                    END DO
1097            ! Iterate to find approx vertical index for depth 1.1*zhmle(ji,jj)
1098                    jl = MIN(mld_prof(ji,jj) + 2, mbkt(ji,jj))
1099                    jl = MIN( MAX(INT( 0.1 * zhmle(ji,jj) / e3t_n(ji,jj,jl)), 2 ) + mld_prof(ji,jj), mbkt(ji,jj))
1100                    DO jk = mld_prof(ji,jj),  jl
1101                       zdiffut(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), zdiff_mle(ji,jj) * &
1102                            & ( gdepw_n(ji,jj,jk) - gdepw_n(ji,jj,jl) ) / &
1103                            & ( gdepw_n(ji,jj,mld_prof(ji,jj)) - gdepw_n(ji,jj,jl) - epsln))
1104                    END DO
1105                ENDIF
1106            END DO
1107          END DO
1108       ENDIF
1109
1110       IF(ln_dia_osm) THEN
1111          IF ( iom_use("zdtdz_pyc") ) CALL iom_put( "zdtdz_pyc", wmask*zdtdz_pyc )
1112          IF ( iom_use("zdsdz_pyc") ) CALL iom_put( "zdsdz_pyc", wmask*zdsdz_pyc )
1113          IF ( iom_use("zdbdz_pyc") ) CALL iom_put( "zdbdz_pyc", wmask*zdbdz_pyc )
1114       END IF
1115
1116
1117       ! Lateral boundary conditions on zvicos (sign unchanged), needed to caclulate viscosities on u and v grids
1118       !CALL lbc_lnk( zviscos(:,:,:), 'W', 1. )
1119
1120       ! GN 25/8: need to change tmask --> wmask
1121
1122     DO jk = 2, jpkm1
1123         DO jj = 2, jpjm1
1124             DO ji = 2, jpim1
1125                p_avt(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk)
1126                p_avm(ji,jj,jk) = MAX( zviscos(ji,jj,jk), avmb(jk) ) * tmask(ji,jj,jk)
1127             END DO
1128         END DO
1129     END DO
1130      ! Lateral boundary conditions on ghamu and ghamv, currently on W-grid  (sign unchanged), needed to caclulate gham[uv] on u and v grids
1131     CALL lbc_lnk_multi( 'zdfosm', p_avt, 'W', 1. , p_avm, 'W', 1.,   &
1132      &                  ghamu, 'W', 1. , ghamv, 'W', 1. )
1133       DO jk = 2, jpkm1
1134           DO jj = 2, jpjm1
1135               DO ji = 2, jpim1
1136                  ghamu(ji,jj,jk) = ( ghamu(ji,jj,jk) + ghamu(ji+1,jj,jk) ) &
1137                     &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji + 1,jj,jk) ) * umask(ji,jj,jk)
1138
1139                  ghamv(ji,jj,jk) = ( ghamv(ji,jj,jk) + ghamv(ji,jj+1,jk) ) &
1140                      &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji,jj+1,jk) ) * vmask(ji,jj,jk)
1141
1142                  ghamt(ji,jj,jk) =  ghamt(ji,jj,jk) * tmask(ji,jj,jk)
1143                  ghams(ji,jj,jk) =  ghams(ji,jj,jk) * tmask(ji,jj,jk)
1144               END DO
1145           END DO
1146        END DO
1147        ! Lateral boundary conditions on final outputs for gham[ts],  on W-grid  (sign unchanged)
1148        ! Lateral boundary conditions on final outputs for gham[uv],  on [UV]-grid  (sign unchanged)
1149        CALL lbc_lnk_multi( 'zdfosm', ghamt, 'W', 1. , ghams, 'W', 1.,   &
1150         &                  ghamu, 'U', -1. , ghamv, 'V', -1. )
1151
1152      IF(ln_dia_osm) THEN
1153         SELECT CASE (nn_osm_wave)
1154         ! Stokes drift set by assumimg onstant La#=0.3(=0)  or Pierson-Moskovitz spectrum (=1).
1155         CASE(0:1)
1156            IF ( iom_use("us_x") ) CALL iom_put( "us_x", tmask(:,:,1)*zustke*zcos_wind )   ! x surface Stokes drift
1157            IF ( iom_use("us_y") ) CALL iom_put( "us_y", tmask(:,:,1)*zustke*zsin_wind )  ! y surface Stokes drift
1158            IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rau0*tmask(:,:,1)*zustar**2*zustke )
1159         ! Stokes drift read in from sbcwave  (=2).
1160         CASE(2)
1161            IF ( iom_use("us_x") ) CALL iom_put( "us_x", ut0sd*umask(:,:,1) )               ! x surface Stokes drift
1162            IF ( iom_use("us_y") ) CALL iom_put( "us_y", vt0sd*vmask(:,:,1) )               ! y surface Stokes drift
1163            IF ( iom_use("wmp") ) CALL iom_put( "wmp", wmp*tmask(:,:,1) )                   ! wave mean period
1164            IF ( iom_use("hsw") ) CALL iom_put( "hsw", hsw*tmask(:,:,1) )                   ! significant wave height
1165            IF ( iom_use("wmp_NP") ) CALL iom_put( "wmp_NP", (2.*rpi*1.026/(0.877*grav) )*wndm*tmask(:,:,1) )                  ! wave mean period from NP spectrum
1166            IF ( iom_use("hsw_NP") ) CALL iom_put( "hsw_NP", (0.22/grav)*wndm**2*tmask(:,:,1) )                   ! significant wave height from NP spectrum
1167            IF ( iom_use("wndm") ) CALL iom_put( "wndm", wndm*tmask(:,:,1) )                   ! U_10
1168            IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rau0*tmask(:,:,1)*zustar**2* &
1169                 & SQRT(ut0sd**2 + vt0sd**2 ) )
1170         END SELECT
1171         IF ( iom_use("ghamt") ) CALL iom_put( "ghamt", tmask*ghamt )            ! <Tw_NL>
1172         IF ( iom_use("ghams") ) CALL iom_put( "ghams", tmask*ghams )            ! <Sw_NL>
1173         IF ( iom_use("ghamu") ) CALL iom_put( "ghamu", umask*ghamu )            ! <uw_NL>
1174         IF ( iom_use("ghamv") ) CALL iom_put( "ghamv", vmask*ghamv )            ! <vw_NL>
1175         IF ( iom_use("zwth0") ) CALL iom_put( "zwth0", tmask(:,:,1)*zwth0 )            ! <Tw_0>
1176         IF ( iom_use("zws0") ) CALL iom_put( "zws0", tmask(:,:,1)*zws0 )                ! <Sw_0>
1177         IF ( iom_use("hbl") ) CALL iom_put( "hbl", tmask(:,:,1)*hbl )                  ! boundary-layer depth
1178         IF ( iom_use("ibld") ) CALL iom_put( "ibld", tmask(:,:,1)*ibld )               ! boundary-layer max k
1179         IF ( iom_use("zdt_bl") ) CALL iom_put( "zdt_bl", tmask(:,:,1)*zdt_bl )           ! dt at ml base
1180         IF ( iom_use("zds_bl") ) CALL iom_put( "zds_bl", tmask(:,:,1)*zds_bl )           ! ds at ml base
1181         IF ( iom_use("zdb_bl") ) CALL iom_put( "zdb_bl", tmask(:,:,1)*zdb_bl )           ! db at ml base
1182         IF ( iom_use("zdu_bl") ) CALL iom_put( "zdu_bl", tmask(:,:,1)*zdu_bl )           ! du at ml base
1183         IF ( iom_use("zdv_bl") ) CALL iom_put( "zdv_bl", tmask(:,:,1)*zdv_bl )           ! dv at ml base
1184         IF ( iom_use("dh") ) CALL iom_put( "dh", tmask(:,:,1)*dh )               ! Initial boundary-layer depth
1185         IF ( iom_use("hml") ) CALL iom_put( "hml", tmask(:,:,1)*hml )               ! Initial boundary-layer depth
1186         IF ( iom_use("dstokes") ) CALL iom_put( "dstokes", tmask(:,:,1)*dstokes )      ! Stokes drift penetration depth
1187         IF ( iom_use("zustke") ) CALL iom_put( "zustke", tmask(:,:,1)*zustke )            ! Stokes drift magnitude at T-points
1188         IF ( iom_use("zwstrc") ) CALL iom_put( "zwstrc", tmask(:,:,1)*zwstrc )         ! convective velocity scale
1189         IF ( iom_use("zwstrl") ) CALL iom_put( "zwstrl", tmask(:,:,1)*zwstrl )         ! Langmuir velocity scale
1190         IF ( iom_use("zustar") ) CALL iom_put( "zustar", tmask(:,:,1)*zustar )         ! friction velocity scale
1191         IF ( iom_use("zvstr") ) CALL iom_put( "zvstr", tmask(:,:,1)*zvstr )         ! mixed velocity scale
1192         IF ( iom_use("zla") ) CALL iom_put( "zla", tmask(:,:,1)*zla )         ! langmuir #
1193         IF ( iom_use("wind_power") ) CALL iom_put( "wind_power", 1000.*rau0*tmask(:,:,1)*zustar**3 ) ! BL depth internal to zdf_osm routine
1194         IF ( iom_use("wind_wave_power") ) CALL iom_put( "wind_wave_power", 1000.*rau0*tmask(:,:,1)*zustar**2*zustke )
1195         IF ( iom_use("zhbl") ) CALL iom_put( "zhbl", tmask(:,:,1)*zhbl )               ! BL depth internal to zdf_osm routine
1196         IF ( iom_use("zhml") ) CALL iom_put( "zhml", tmask(:,:,1)*zhml )               ! ML depth internal to zdf_osm routine
1197         IF ( iom_use("imld") ) CALL iom_put( "imld", tmask(:,:,1)*imld )               ! index for ML depth internal to zdf_osm routine
1198         IF ( iom_use("zdh") ) CALL iom_put( "zdh", tmask(:,:,1)*zdh )                  ! pyc thicknessh internal to zdf_osm routine
1199         IF ( iom_use("zhol") ) CALL iom_put( "zhol", tmask(:,:,1)*zhol )               ! ML depth internal to zdf_osm routine
1200         IF ( iom_use("zwthav") ) CALL iom_put( "zwthav", tmask(:,:,1)*zwthav )         ! upward BL-avged turb temp flux
1201         IF ( iom_use("zwth_ent") ) CALL iom_put( "zwth_ent", tmask(:,:,1)*zwth_ent )   ! upward turb temp entrainment flux
1202         IF ( iom_use("zwb_ent") ) CALL iom_put( "zwb_ent", tmask(:,:,1)*zwb_ent )      ! upward turb buoyancy entrainment flux
1203         IF ( iom_use("zws_ent") ) CALL iom_put( "zws_ent", tmask(:,:,1)*zws_ent )      ! upward turb salinity entrainment flux
1204         IF ( iom_use("zt_ml") ) CALL iom_put( "zt_ml", tmask(:,:,1)*zt_ml )            ! average T in ML
1205
1206         IF ( iom_use("hmle") ) CALL iom_put( "hmle", tmask(:,:,1)*hmle )               ! FK layer depth
1207         IF ( iom_use("zmld") ) CALL iom_put( "zmld", tmask(:,:,1)*zmld )               ! FK target layer depth
1208         IF ( iom_use("zwb_fk") ) CALL iom_put( "zwb_fk", tmask(:,:,1)*zwb_fk )         ! FK b flux
1209         IF ( iom_use("zwb_fk_b") ) CALL iom_put( "zwb_fk_b", tmask(:,:,1)*zwb_fk_b )   ! FK b flux averaged over ML
1210         IF ( iom_use("mld_prof") ) CALL iom_put( "mld_prof", tmask(:,:,1)*mld_prof )! FK layer max k
1211         IF ( iom_use("zdtdx") ) CALL iom_put( "zdtdx", umask(:,:,1)*zdtdx )            ! FK dtdx at u-pt
1212         IF ( iom_use("zdtdy") ) CALL iom_put( "zdtdy", vmask(:,:,1)*zdtdy )            ! FK dtdy at v-pt
1213         IF ( iom_use("zdsdx") ) CALL iom_put( "zdsdx", umask(:,:,1)*zdsdx )            ! FK dtdx at u-pt
1214         IF ( iom_use("zdsdy") ) CALL iom_put( "zdsdy", vmask(:,:,1)*zdsdy )            ! FK dsdy at v-pt
1215         IF ( iom_use("dbdx_mle") ) CALL iom_put( "dbdx_mle", umask(:,:,1)*dbdx_mle )            ! FK dbdx at u-pt
1216         IF ( iom_use("dbdy_mle") ) CALL iom_put( "dbdy_mle", vmask(:,:,1)*dbdy_mle )            ! FK dbdy at v-pt
1217         IF ( iom_use("zdiff_mle") ) CALL iom_put( "zdiff_mle", tmask(:,:,1)*zdiff_mle )! FK diff in MLE at t-pt
1218         IF ( iom_use("zvel_mle") ) CALL iom_put( "zvel_mle", tmask(:,:,1)*zdiff_mle )! FK diff in MLE at t-pt
1219
1220      END IF
1221
1222CONTAINS
1223
1224
1225   ! Alan: do we need zb?
1226   SUBROUTINE zdf_osm_vertical_average( jnlev_av, zt, zs, zu, zv, zdt, zds, zdb, zdu, zdv )
1227     !!---------------------------------------------------------------------
1228     !!                   ***  ROUTINE zdf_vertical_average  ***
1229     !!
1230     !! ** Purpose : Determines vertical averages from surface to jnlev.
1231     !!
1232     !! ** Method  : Averages are calculated from the surface to jnlev.
1233     !!              The external level used to calculate differences is ibld+ibld_ext
1234     !!
1235     !!----------------------------------------------------------------------
1236
1237        INTEGER, DIMENSION(jpi,jpj) :: jnlev_av  ! Number of levels to average over.
1238
1239        ! Alan: do we need zb?
1240        REAL(wp), DIMENSION(jpi,jpj) :: zt, zs        ! Average temperature and salinity
1241        REAL(wp), DIMENSION(jpi,jpj) :: zu,zv         ! Average current components
1242        REAL(wp), DIMENSION(jpi,jpj) :: zdt, zds, zdb ! Difference between average and value at base of OSBL
1243        REAL(wp), DIMENSION(jpi,jpj) :: zdu, zdv      ! Difference for velocity components.
1244
1245        INTEGER :: jk, ji, jj
1246        REAL(wp) :: zthick, zthermal, zbeta
1247
1248
1249        zt   = 0._wp
1250        zs   = 0._wp
1251        zu   = 0._wp
1252        zv   = 0._wp
1253        DO jj = 2, jpjm1                                 !  Vertical slab
1254         DO ji = 2, jpim1
1255            zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1??
1256            zbeta    = rab_n(ji,jj,1,jp_sal)
1257               ! average over depth of boundary layer
1258            zthick = epsln
1259            DO jk = 2, jnlev_av(ji,jj)
1260               zthick = zthick + e3t_n(ji,jj,jk)
1261               zt(ji,jj)   = zt(ji,jj)  + e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_tem)
1262               zs(ji,jj)   = zs(ji,jj)  + e3t_n(ji,jj,jk) * tsn(ji,jj,jk,jp_sal)
1263               zu(ji,jj)   = zu(ji,jj)  + e3t_n(ji,jj,jk) &
1264                     &            * ( ub(ji,jj,jk) + ub(ji - 1,jj,jk) ) &
1265                     &            / MAX( 1. , umask(ji,jj,jk) + umask(ji - 1,jj,jk) )
1266               zv(ji,jj)   = zv(ji,jj)  + e3t_n(ji,jj,jk) &
1267                     &            * ( vb(ji,jj,jk) + vb(ji,jj - 1,jk) ) &
1268                     &            / MAX( 1. , vmask(ji,jj,jk) + vmask(ji,jj - 1,jk) )
1269            END DO
1270            zt(ji,jj) = zt(ji,jj) / zthick
1271            zs(ji,jj) = zs(ji,jj) / zthick
1272            zu(ji,jj) = zu(ji,jj) / zthick
1273            zv(ji,jj) = zv(ji,jj) / zthick
1274            ! Alan: do we need zb?
1275            zdt(ji,jj) = zt(ji,jj) - tsn(ji,jj,ibld(ji,jj)+ibld_ext,jp_tem)
1276            zds(ji,jj) = zs(ji,jj) - tsn(ji,jj,ibld(ji,jj)+ibld_ext,jp_sal)
1277            zdu(ji,jj) = zu(ji,jj) - ( ub(ji,jj,ibld(ji,jj)+ibld_ext) + ub(ji-1,jj,ibld(ji,jj)+ibld_ext ) ) &
1278                     &    / MAX(1. , umask(ji,jj,ibld(ji,jj)+ibld_ext ) + umask(ji-1,jj,ibld(ji,jj)+ibld_ext ) )
1279            zdv(ji,jj) = zv(ji,jj) - ( vb(ji,jj,ibld(ji,jj)+ibld_ext) + vb(ji,jj-1,ibld(ji,jj)+ibld_ext ) ) &
1280                     &   / MAX(1. , vmask(ji,jj,ibld(ji,jj)+ibld_ext ) + vmask(ji,jj-1,ibld(ji,jj)+ibld_ext ) )
1281            zdb(ji,jj) = grav * zthermal * zdt(ji,jj) - grav * zbeta * zds(ji,jj)
1282         END DO
1283        END DO
1284   END SUBROUTINE zdf_osm_vertical_average
1285
1286   SUBROUTINE zdf_osm_velocity_rotation( zcos_w, zsin_w, zu, zv, zdu, zdv )
1287     !!---------------------------------------------------------------------
1288     !!                   ***  ROUTINE zdf_velocity_rotation  ***
1289     !!
1290     !! ** Purpose : Rotates frame of reference of averaged velocity components.
1291     !!
1292     !! ** Method  : The velocity components are rotated into frame specified by zcos_w and zsin_w
1293     !!
1294     !!----------------------------------------------------------------------
1295
1296        REAL(wp), DIMENSION(jpi,jpj) :: zcos_w, zsin_w       ! Cos and Sin of rotation angle
1297        REAL(wp), DIMENSION(jpi,jpj) :: zu, zv               ! Components of current
1298        REAL(wp), DIMENSION(jpi,jpj) :: zdu, zdv             ! Change in velocity components across pycnocline
1299
1300        INTEGER :: ji, jj
1301        REAL(wp) :: ztemp
1302
1303        DO jj = 2, jpjm1
1304           DO ji = 2, jpim1
1305              ztemp = zu(ji,jj)
1306              zu(ji,jj) = zu(ji,jj) * zcos_w(ji,jj) + zv(ji,jj) * zsin_w(ji,jj)
1307              zv(ji,jj) = zv(ji,jj) * zcos_w(ji,jj) - ztemp * zsin_w(ji,jj)
1308              ztemp = zdu(ji,jj)
1309              zdu(ji,jj) = zdu(ji,jj) * zcos_w(ji,jj) + zdv(ji,jj) * zsin_w(ji,jj)
1310              zdv(ji,jj) = zdv(ji,jj) * zsin_w(ji,jj) - ztemp * zsin_w(ji,jj)
1311           END DO
1312        END DO
1313    END SUBROUTINE zdf_osm_velocity_rotation
1314
1315    SUBROUTINE zdf_osm_external_gradients( zdtdz, zdsdz, zdbdz )
1316     !!---------------------------------------------------------------------
1317     !!                   ***  ROUTINE zdf_osm_external_gradients  ***
1318     !!
1319     !! ** Purpose : Calculates the gradients below the OSBL
1320     !!
1321     !! ** Method  : Uses ibld and ibld_ext to determine levels to calculate the gradient.
1322     !!
1323     !!----------------------------------------------------------------------
1324
1325     REAL(wp), DIMENSION(jpi,jpj) :: zdtdz, zdsdz, zdbdz   ! External gradients of temperature, salinity and buoyancy.
1326
1327     INTEGER :: jj, ji, jkb, jkb1
1328     REAL(wp) :: zthermal, zbeta
1329
1330
1331     DO jj = 2, jpjm1
1332        DO ji = 2, jpim1
1333           IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) ) THEN
1334              zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1??
1335              zbeta    = rab_n(ji,jj,1,jp_sal)
1336              jkb = ibld(ji,jj) + ibld_ext
1337              jkb1 = MIN(jkb + 1, mbkt(ji,jj))
1338              zdtdz(ji,jj) = - ( tsn(ji,jj,jkb1,jp_tem) - tsn(ji,jj,jkb,jp_tem ) ) &
1339                   &   / e3t_n(ji,jj,ibld(ji,jj))
1340              zdsdz(ji,jj) = - ( tsn(ji,jj,jkb1,jp_sal) - tsn(ji,jj,jkb,jp_sal ) ) &
1341                   &   / e3t_n(ji,jj,ibld(ji,jj))
1342              zdbdz(ji,jj) = grav * zthermal * zdtdz(ji,jj) - grav * zbeta * zdsdz(ji,jj)
1343           END IF
1344        END DO
1345     END DO
1346    END SUBROUTINE zdf_osm_external_gradients
1347
1348    SUBROUTINE zdf_osm_pycnocline_scalar_profiles( zdtdz, zdsdz, zdbdz )
1349
1350     REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdtdz, zdsdz, zdbdz      ! gradients in the pycnocline
1351
1352     INTEGER :: jk, jj, ji
1353     REAL(wp) :: ztgrad, zsgrad, zbgrad
1354     REAL(wp) :: zgamma_b_nd, zgamma_c, znd
1355     REAL(wp) :: zzeta_s=0.3
1356
1357     DO jj = 2, jpjm1
1358        DO ji = 2, jpim1
1359           IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) ) THEN
1360              IF ( lconv(ji,jj) ) THEN  ! convective conditions
1361                    IF ( zdbdz_ext(ji,jj) > 0._wp .AND. &
1362                         & (zdhdt(ji,jj) > 0._wp .AND. ln_osm_mle .AND. zdb_bl(ji,jj) > rn_osm_mle_thresh &
1363                         &  .OR.  zdb_bl(ji,jj) > 0._wp)) THEN  ! zdhdt could be <0 due to FK, hence check zdhdt>0
1364                       ztgrad = 0.5 * zdt_ml(ji,jj) / zdh(ji,jj) + zdtdz_ext(ji,jj)
1365                       zsgrad = 0.5 * zds_ml(ji,jj) / zdh(ji,jj) + zdsdz_ext(ji,jj)
1366                       zbgrad = 0.5 * zdb_ml(ji,jj) / zdh(ji,jj) + zdbdz_ext(ji,jj)
1367                       zgamma_b_nd = zdbdz_ext(ji,jj) * zdh(ji,jj) / zdb_ml(ji,jj)
1368                       zgamma_c = ( 3.14159 / 4.0 ) * ( 0.5 + zgamma_b_nd ) /&
1369                            & ( 1.0 - 0.25 * SQRT( 3.14159 / 6.0 ) - 2.0 * zgamma_b_nd * zzeta_s )**2 ! check
1370                       DO jk = 2, ibld(ji,jj)+ibld_ext
1371                          znd = -( gdepw_n(ji,jj,jk) - zhbl(ji,jj) ) / zdh(ji,jj)
1372                          IF ( znd <= zzeta_s ) THEN
1373                             zdtdz(ji,jj,jk) = zdtdz_ext(ji,jj) + 0.5 * zdt_ml(ji,jj) / zdh(ji,jj) * &
1374                                  & EXP( -6.0 * ( znd -zzeta_s )**2 )
1375                             zdsdz(ji,jj,jk) = zdsdz_ext(ji,jj) + 0.5 * zds_ml(ji,jj) / zdh(ji,jj) * &
1376                                  & EXP( -6.0 * ( znd -zzeta_s )**2 )
1377                             zdbdz(ji,jj,jk) = zdbdz_ext(ji,jj) + 0.5 * zdb_ml(ji,jj) / zdh(ji,jj) * &
1378                                  & EXP( -6.0 * ( znd -zzeta_s )**2 )
1379                          ELSE
1380                             zdtdz(ji,jj,jk) =  ztgrad * EXP( -zgamma_c * ( znd - zzeta_s )**2 )
1381                             zdsdz(ji,jj,jk) =  zsgrad * EXP( -zgamma_c * ( znd - zzeta_s )**2 )
1382                             zdbdz(ji,jj,jk) =  zbgrad * EXP( -zgamma_c * ( znd - zzeta_s )**2 )
1383                          ENDIF
1384                       END DO
1385                    ENDIF ! If condition not satisfied, no pycnocline present. Gradients have been initialised to zero, so do nothing
1386              ELSE
1387                 ! stable conditions
1388                 ! if pycnocline profile only defined when depth steady of increasing.
1389                 IF ( zdhdt(ji,jj) >= 0.0 ) THEN        ! Depth increasing, or steady.
1390                    IF ( zdb_bl(ji,jj) > 0._wp ) THEN
1391                       IF ( zhol(ji,jj) >= 0.5 ) THEN      ! Very stable - 'thick' pycnocline
1392                          ztgrad = zdt_bl(ji,jj) / zhbl(ji,jj)
1393                          zsgrad = zds_bl(ji,jj) / zhbl(ji,jj)
1394                          zbgrad = zdb_bl(ji,jj) / zhbl(ji,jj)
1395                          DO jk = 2, ibld(ji,jj)
1396                             znd = gdepw_n(ji,jj,jk) / zhbl(ji,jj)
1397                             zdtdz(ji,jj,jk) =  ztgrad * EXP( -15.0 * ( znd - 0.9 )**2 )
1398                             zdbdz(ji,jj,jk) =  zbgrad * EXP( -15.0 * ( znd - 0.9 )**2 )
1399                             zdsdz(ji,jj,jk) =  zsgrad * EXP( -15.0 * ( znd - 0.9 )**2 )
1400                          END DO
1401                       ELSE                                   ! Slightly stable - 'thin' pycnoline - needed when stable layer begins to form.
1402                          ztgrad = zdt_bl(ji,jj) / zdh(ji,jj)
1403                          zsgrad = zds_bl(ji,jj) / zdh(ji,jj)
1404                          zbgrad = zdb_bl(ji,jj) / zdh(ji,jj)
1405                          DO jk = 2, ibld(ji,jj)
1406                             znd = -( gdepw_n(ji,jj,jk) - zhml(ji,jj) ) / zdh(ji,jj)
1407                             zdtdz(ji,jj,jk) =  ztgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
1408                             zdbdz(ji,jj,jk) =  zbgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
1409                             zdsdz(ji,jj,jk) =  zsgrad * EXP( -1.75 * ( znd + 0.75 )**2 )
1410                          END DO
1411                       ENDIF ! IF (zhol >=0.5)
1412                    ENDIF    ! IF (zdb_bl> 0.)
1413                 ENDIF       ! IF (zdhdt >= 0) zdhdt < 0 not considered since pycnocline profile is zero and profile arrays are intialized to zero
1414              ENDIF          ! IF (lconv)
1415           END IF      ! IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) )
1416        END DO
1417     END DO
1418
1419    END SUBROUTINE zdf_osm_pycnocline_scalar_profiles
1420
1421    SUBROUTINE zdf_osm_pycnocline_shear_profiles( zdudz, zdvdz )
1422      !!---------------------------------------------------------------------
1423      !!                   ***  ROUTINE zdf_osm_pycnocline_shear_profiles  ***
1424      !!
1425      !! ** Purpose : Calculates velocity shear in the pycnocline
1426      !!
1427      !! ** Method  :
1428      !!
1429      !!----------------------------------------------------------------------
1430
1431      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdudz, zdvdz
1432
1433      INTEGER :: jk, jj, ji
1434      REAL(wp) :: zugrad, zvgrad, znd
1435      REAL(wp) :: zzeta_v = 0.45
1436      !
1437      DO jj = 2, jpjm1
1438         DO ji = 2, jpim1
1439            !
1440            IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) ) THEN
1441               IF ( lconv (ji,jj) ) THEN
1442                  ! Unstable conditions
1443                  zugrad = 0.7 * zdu_ml(ji,jj) / zdh(ji,jj) + 0.3 * zustar(ji,jj)*zustar(ji,jj) / &
1444                       &      ( ( ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * zhml(ji,jj) ) * &
1445                       &      MIN(zla(ji,jj)**(8.0/3.0) + epsln, 0.12 ))
1446                  !Alan is this right?
1447                  zvgrad = ( 0.7 * zdv_ml(ji,jj) + &
1448                       &    2.0 * ff_t(ji,jj) * zustke(ji,jj) * dstokes(ji,jj) / &
1449                       &          ( ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird  + epsln ) &
1450                       &      )/ (zdh(ji,jj)  + epsln )
1451                  DO jk = 2, ibld(ji,jj) - 1 + ibld_ext
1452                     znd = -( gdepw_n(ji,jj,jk) - zhbl(ji,jj) ) / (zdh(ji,jj) + epsln ) - zzeta_v
1453                     IF ( znd <= 0.0 ) THEN
1454                        zdudz(ji,jj,jk) = 1.25 * zugrad * EXP( 3.0 * znd )
1455                        zdvdz(ji,jj,jk) = 1.25 * zvgrad * EXP( 3.0 * znd )
1456                     ELSE
1457                        zdudz(ji,jj,jk) = 1.25 * zugrad * EXP( -2.0 * znd )
1458                        zdvdz(ji,jj,jk) = 1.25 * zvgrad * EXP( -2.0 * znd )
1459                     ENDIF
1460                  END DO
1461               ELSE
1462                  ! stable conditions
1463                  zugrad = 3.25 * zdu_bl(ji,jj) / zhbl(ji,jj)
1464                  zvgrad = 2.75 * zdv_bl(ji,jj) / zhbl(ji,jj)
1465                  DO jk = 2, ibld(ji,jj)
1466                     znd = gdepw_n(ji,jj,jk) / zhbl(ji,jj)
1467                     IF ( znd < 1.0 ) THEN
1468                        zdudz(ji,jj,jk) = zugrad * EXP( -40.0 * ( znd - 1.0 )**2 )
1469                     ELSE
1470                        zdudz(ji,jj,jk) = zugrad * EXP( -20.0 * ( znd - 1.0 )**2 )
1471                     ENDIF
1472                     zdvdz(ji,jj,jk) = zvgrad * EXP( -20.0 * ( znd - 0.85 )**2 )
1473                  END DO
1474               ENDIF
1475               !
1476            END IF      ! IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) )
1477         END DO
1478      END DO
1479    END SUBROUTINE zdf_osm_pycnocline_shear_profiles
1480
1481    SUBROUTINE zdf_osm_calculate_dhdt( zdhdt, zdhdt_2 )
1482     !!---------------------------------------------------------------------
1483     !!                   ***  ROUTINE zdf_osm_calculate_dhdt  ***
1484     !!
1485     !! ** Purpose : Calculates the rate at which hbl changes.
1486     !!
1487     !! ** Method  :
1488     !!
1489     !!----------------------------------------------------------------------
1490
1491    REAL(wp), DIMENSION(jpi,jpj) :: zdhdt, zdhdt_2        ! Rate of change of hbl
1492
1493    INTEGER :: jj, ji
1494    REAL(wp) :: zgamma_b_nd, zgamma_dh_nd, zpert
1495    REAL(wp) :: zvel_max, zwb_min
1496    REAL(wp) :: zwcor, zrf_conv, zrf_shear, zrf_langmuir, zr_stokes
1497    REAL(wp) :: zzeta_m = 0.3
1498    REAL(wp) :: zgamma_c = 2.0
1499    REAL(wp) :: zdhoh = 0.1
1500    REAL(wp) :: alpha_bc = 0.5
1501
1502    DO jj = 2, jpjm1
1503       DO ji = 2, jpim1
1504          IF ( lconv(ji,jj) ) THEN    ! Convective
1505             ! Alan is this right?  Yes, it's a bit different from the previous relationship
1506             ! zwb_ent(ji,jj) = - 2.0 * 0.2 * zwbav(ji,jj) &
1507             !   &            - ( 0.15 * ( 1.0 - EXP( -1.5 * zla(ji,jj) ) ) * zustar(ji,jj)**3 + 0.03 * zwstrl(ji,jj)**3 ) / zhml(ji,jj)
1508             zwcor = ABS(ff_t(ji,jj)) * zhbl(ji,jj) + epsln
1509             zrf_conv = TANH( ( zwstrc(ji,jj) / zwcor )**0.69 )
1510             zrf_shear = TANH( ( zustar(ji,jj) / zwcor )**0.69 )
1511             zrf_langmuir = TANH( ( zwstrl(ji,jj) / zwcor )**0.69 )
1512             zr_stokes = 1.0 - EXP( -25.0 * dstokes(ji,jj) / hbl(ji,jj) &
1513                  &                  * ( 1.0 + 4.0 * dstokes(ji,jj) / hbl(ji,jj) ) )
1514
1515             zwb_ent(ji,jj) = - 2.0 * 0.2 * zrf_conv * zwbav(ji,jj) &
1516                  &                  - 0.15 * zrf_shear * zustar(ji,jj)**3 /zhml(ji,jj) &
1517                  &         + zr_stokes * ( 0.15 * EXP( -1.5 * zla(ji,jj) ) * zrf_shear * zustar(ji,jj)**3 &
1518                  &                                         - zrf_langmuir * 0.03 * zwstrl(ji,jj)**3 ) / zhml(ji,jj)
1519             !
1520             zwb_min = dh(ji,jj) * zwb0(ji,jj) / zhml(ji,jj) + zwb_ent(ji,jj)
1521
1522             IF ( ln_osm_mle ) THEN
1523                  !  zwb_fk_b(ji,jj) = zwb_fk(ji,jj) *  hmle(ji,jj) / ( 6.0 * hbl(ji,jj) ) * ( 6.0 * hbl(ji,jj) / hmle(ji,jj) - 1.0 + &
1524                ! &            ( 1.0 - 2.0 * hbl(ji,jj) / hmle(ji,jj))**3 )          ! Fox-Kemper buoyancy flux average over OSBL
1525                IF ( hmle(ji,jj) > hbl(ji,jj) ) THEN
1526                   zwb_fk_b(ji,jj) = zwb_fk(ji,jj) *  &
1527                        (1.0 + hmle(ji,jj) / ( 6.0 * hbl(ji,jj) ) * (-1.0 + ( 1.0 - 2.0 * hbl(ji,jj) / hmle(ji,jj))**3) )
1528                ELSE
1529                   zwb_fk_b(ji,jj) = 0.5 * zwb_fk(ji,jj) * hmle(ji,jj) / hbl(ji,jj)
1530                ENDIF
1531                zvel_max = ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**p2third / hbl(ji,jj)
1532                IF ( ( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) < 0.0 ) THEN
1533                   ! OSBL is deepening, entrainment > restratification
1534                   IF ( zdb_bl(ji,jj) > 0.0 .and. zdbdz_ext(ji,jj) > 0.0 ) THEN
1535                      zdhdt(ji,jj) = -( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) / ( zvel_max + MAX(zdb_bl(ji,jj), 1.0e-15) )
1536                   ELSE
1537                      zdhdt(ji,jj) = -( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) /  MAX( zvel_max, 1.0e-15)
1538                   ENDIF
1539                ELSE
1540                   ! OSBL shoaling due to restratification flux. This is the velocity defined in Fox-Kemper et al (2008)
1541                   zdhdt(ji,jj) = - zvel_mle(ji,jj)
1542
1543
1544                ENDIF
1545
1546             ELSE
1547                ! Fox-Kemper not used.
1548
1549                  zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_rdt / hbl(ji,jj) ) * zwb_ent(ji,jj) / &
1550                  &        ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
1551                  zdhdt(ji,jj) = -zwb_ent(ji,jj) / ( zvel_max + MAX(zdb_bl(ji,jj), 1.0e-15) )
1552                ! added ajgn 23 July as temporay fix
1553
1554             ENDIF
1555
1556             zdhdt_2(ji,jj) = 0._wp
1557
1558                ! commented out ajgn 23 July as temporay fix
1559!                 IF ( zdb_ml(ji,jj) > 0.0 .and. zdbdz_ext(ji,jj) > 0.0 ) THEN
1560! !additional term to account for thickness of pycnocline on dhdt. Small correction, so could get rid of this if necessary.
1561!                     zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj)
1562!                     zgamma_b_nd = zdbdz_ext(ji,jj) * zhml(ji,jj) / zdb_ml(ji,jj)
1563!                     zgamma_dh_nd = zdbdz_ext(ji,jj) * zdh(ji,jj) / zdb_ml(ji,jj)
1564!                     zdhdt_2(ji,jj) = ( 1.0 - SQRT( 3.1415 / ( 4.0 * zgamma_c) ) * zdhoh ) * zdh(ji,jj) / zhml(ji,jj)
1565!                     zdhdt_2(ji,jj) = zdhdt_2(ji,jj) * ( zwb0(ji,jj) - (1.0 + zgamma_b_nd / alpha_bc ) * zwb_min )
1566!                     ! Alan no idea what this should be?
1567!                     zdhdt_2(ji,jj) = alpha_bc / ( 4.0 * zgamma_c ) * zdhdt_2(ji,jj) &
1568!                        &        + (alpha_bc + zgamma_dh_nd ) * ( 1.0 + SQRT( 3.1414 / ( 4.0 * zgamma_c ) ) * zdh(ji,jj) / zhbl(ji,jj) ) &
1569!                        &        * (1.0 / ( 4.0 * zgamma_c * alpha_bc ) ) * zwb_min * zdh(ji,jj) / zhbl(ji,jj)
1570!                     zdhdt_2(ji,jj) = zdhdt_2(ji,jj) / ( zvel_max + MAX( zdb_bl(ji,jj), 1.0e-15 ) )
1571!                     IF ( zdhdt_2(ji,jj) <= 0.2 * zdhdt(ji,jj) ) THEN
1572!                         zdhdt(ji,jj) = zdhdt(ji,jj) + zdhdt_2(ji,jj)
1573!                 ENDIF
1574            ELSE                        ! Stable
1575                zdhdt(ji,jj) = ( 0.06 + 0.52 * zhol(ji,jj) / 2.0 ) * zvstr(ji,jj)**3 / hbl(ji,jj) + zwbav(ji,jj)
1576                zdhdt_2(ji,jj) = 0._wp
1577                IF ( zdhdt(ji,jj) < 0._wp ) THEN
1578                   ! For long timsteps factor in brackets slows the rapid collapse of the OSBL
1579                    zpert = 2.0 * ( 1.0 + 0.0 * 2.0 * zvstr(ji,jj) * rn_rdt / hbl(ji,jj) ) * zvstr(ji,jj)**2 / hbl(ji,jj)
1580                ELSE
1581                    zpert = MAX( 2.0 * ( 1.0 + 0.0 * 2.0 * zvstr(ji,jj) * rn_rdt / hbl(ji,jj) ) * zvstr(ji,jj)**2 / hbl(ji,jj), zdb_bl(ji,jj) )
1582                ENDIF
1583                zdhdt(ji,jj) = 2.0 * zdhdt(ji,jj) / zpert
1584            ENDIF
1585         END DO
1586      END DO
1587    END SUBROUTINE zdf_osm_calculate_dhdt
1588
1589    SUBROUTINE zdf_osm_timestep_hbl( zdhdt, zdhdt_2 )
1590     !!---------------------------------------------------------------------
1591     !!                   ***  ROUTINE zdf_osm_timestep_hbl  ***
1592     !!
1593     !! ** Purpose : Increments hbl.
1594     !!
1595     !! ** Method  : If thechange in hbl exceeds one model level the change is
1596     !!              is calculated by moving down the grid, changing the buoyancy
1597     !!              jump. This is to ensure that the change in hbl does not
1598     !!              overshoot a stable layer.
1599     !!
1600     !!----------------------------------------------------------------------
1601
1602
1603    REAL(wp), DIMENSION(jpi,jpj) :: zdhdt, zdhdt_2   ! rates of change of hbl.
1604
1605    INTEGER :: jk, jj, ji, jm
1606    REAL(wp) :: zhbl_s, zvel_max, zdb
1607    REAL(wp) :: zthermal, zbeta
1608
1609     DO jj = 2, jpjm1
1610         DO ji = 2, jpim1
1611           IF ( ibld(ji,jj) - imld(ji,jj) > 1 ) THEN
1612!
1613! If boundary layer changes by more than one level, need to check for stable layers between initial and final depths.
1614!
1615              zhbl_s = hbl(ji,jj)
1616              jm = imld(ji,jj)
1617              zthermal = rab_n(ji,jj,1,jp_tem)
1618              zbeta = rab_n(ji,jj,1,jp_sal)
1619
1620
1621              IF ( lconv(ji,jj) ) THEN
1622!unstable
1623
1624                 IF( ln_osm_mle ) THEN
1625                    zvel_max = ( zwstrl(ji,jj)**3 + zwstrc(ji,jj)**3 )**p2third / hbl(ji,jj)
1626                 ELSE
1627
1628                    zvel_max = -( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_rdt / hbl(ji,jj) ) * zwb_ent(ji,jj) / &
1629                      &      ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
1630
1631                 ENDIF
1632
1633                 DO jk = imld(ji,jj), ibld(ji,jj)
1634                    zdb = MAX( grav * ( zthermal * ( zt_bl(ji,jj) - tsn(ji,jj,jm,jp_tem) ) &
1635                         & - zbeta * ( zs_bl(ji,jj) - tsn(ji,jj,jm,jp_sal) ) ), &
1636                         &  0.0 ) + zvel_max
1637
1638
1639                    IF ( ln_osm_mle ) THEN
1640                       zhbl_s = zhbl_s + MIN( &
1641                        & rn_rdt * ( ( -zwb_ent(ji,jj) - 2.0 * zwb_fk_b(ji,jj) )/ zdb + zdhdt_2(ji,jj) ) / FLOAT(ibld(ji,jj) - imld(ji,jj) ), &
1642                        & e3w_n(ji,jj,jm) )
1643                    ELSE
1644                      zhbl_s = zhbl_s + MIN( &
1645                        & rn_rdt * (  -zwb_ent(ji,jj) / zdb + zdhdt_2(ji,jj) ) / FLOAT(ibld(ji,jj) - imld(ji,jj) ), &
1646                        & e3w_n(ji,jj,jm) )
1647                    ENDIF
1648
1649                    zhbl_s = MIN(zhbl_s,  gdepw_n(ji,jj, mbkt(ji,jj) + 1) - depth_tol)
1650
1651                    IF ( zhbl_s >= gdepw_n(ji,jj,jm+1) ) jm = jm + 1
1652                 END DO
1653                 hbl(ji,jj) = zhbl_s
1654                 ibld(ji,jj) = jm
1655             ELSE
1656! stable
1657                 DO jk = imld(ji,jj), ibld(ji,jj)
1658                    zdb = MAX( &
1659                         & grav * ( zthermal * ( zt_bl(ji,jj) - tsn(ji,jj,jm,jp_tem) )&
1660                         &           - zbeta * ( zs_bl(ji,jj) - tsn(ji,jj,jm,jp_sal) ) ),&
1661                         & 0.0 ) + &
1662             &       2.0 * zvstr(ji,jj)**2 / zhbl_s
1663
1664                    ! Alan is thuis right? I have simply changed hbli to hbl
1665                    zhol(ji,jj) = -zhbl_s / ( ( zvstr(ji,jj)**3 + epsln )/ zwbav(ji,jj) )
1666                    zdhdt(ji,jj) = -( zwbav(ji,jj) - 0.04 / 2.0 * zwstrl(ji,jj)**3 / zhbl_s - 0.15 / 2.0 * ( 1.0 - EXP( -1.5 * zla(ji,jj) ) ) * &
1667               &                  zustar(ji,jj)**3 / zhbl_s ) * ( 0.725 + 0.225 * EXP( -7.5 * zhol(ji,jj) ) )
1668                    zdhdt(ji,jj) = zdhdt(ji,jj) + zwbav(ji,jj)
1669                    zhbl_s = zhbl_s + MIN( zdhdt(ji,jj) / zdb * rn_rdt / FLOAT( ibld(ji,jj) - imld(ji,jj) ), e3w_n(ji,jj,jm) )
1670
1671                    zhbl_s = MIN(zhbl_s, gdepw_n(ji,jj, mbkt(ji,jj) + 1) - depth_tol)
1672                    IF ( zhbl_s >= gdepw_n(ji,jj,jm) ) jm = jm + 1
1673                 END DO
1674             ENDIF   ! IF ( lconv )
1675             hbl(ji,jj) = MAX(zhbl_s, gdepw_n(ji,jj,4) )
1676             ibld(ji,jj) = MAX(jm, 4 )
1677           ELSE
1678! change zero or one model level.
1679             hbl(ji,jj) = MAX(zhbl_t(ji,jj), gdepw_n(ji,jj,4) )
1680           ENDIF
1681           zhbl(ji,jj) = gdepw_n(ji,jj,ibld(ji,jj))
1682         END DO
1683      END DO
1684
1685    END SUBROUTINE zdf_osm_timestep_hbl
1686
1687    SUBROUTINE zdf_osm_pycnocline_thickness( dh, zdh )
1688      !!---------------------------------------------------------------------
1689      !!                   ***  ROUTINE zdf_osm_pycnocline_thickness  ***
1690      !!
1691      !! ** Purpose : Calculates thickness of the pycnocline
1692      !!
1693      !! ** Method  : The thickness is calculated from a prognostic equation
1694      !!              that relaxes the pycnocine thickness to a diagnostic
1695      !!              value. The time change is calculated assuming the
1696      !!              thickness relaxes exponentially. This is done to deal
1697      !!              with large timesteps.
1698      !!
1699      !!----------------------------------------------------------------------
1700
1701      REAL(wp), DIMENSION(jpi,jpj) :: dh, zdh     ! pycnocline thickness.
1702      !
1703      INTEGER :: jj, ji
1704      INTEGER :: inhml
1705      REAL(wp) :: zari, ztau, zddhdt
1706
1707
1708      DO jj = 2, jpjm1
1709         DO ji = 2, jpim1
1710            IF ( lconv(ji,jj) ) THEN
1711
1712               IF( ln_osm_mle ) THEN
1713                  IF ( ( zwb_ent(ji,jj) + zwb_fk_b(ji,jj) ) < 0._wp ) THEN
1714                     ! OSBL is deepening. Note wb_fk_b is zero if ln_osm_mle=F
1715                     IF ( zdb_bl(ji,jj) > 0._wp .and. zdbdz_ext(ji,jj) > 0._wp)THEN
1716                        IF ( ( zwstrc(ji,jj) / zvstr(ji,jj) )**3 <= 0.5 ) THEN  ! near neutral stability
1717                           zari = MIN( 1.5 * ( zdb_bl(ji,jj) / ( zdbdz_ext(ji,jj) * zhbl(ji,jj) ) ) / &
1718                                (1.0 + zdb_bl(ji,jj)**2 / ( 4.5 * zvstr(ji,jj)**2 * zdbdz_ext(ji,jj) ) ), 0.2 )
1719                        ELSE                                                     ! unstable
1720                           zari = MIN( 1.5 * ( zdb_bl(ji,jj) / ( zdbdz_ext(ji,jj) * zhbl(ji,jj) ) ) / &
1721                                (1.0 + zdb_bl(ji,jj)**2 / ( 4.5 * zwstrc(ji,jj)**2 * zdbdz_ext(ji,jj) ) ), 0.2 )
1722                        ENDIF
1723                        ztau = 0.2 * hbl(ji,jj) / (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird
1724                        zddhdt = zari * hbl(ji,jj)
1725                     ELSE
1726                        ztau = 0.2 * hbl(ji,jj) / ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
1727                        zddhdt = 0.2 * hbl(ji,jj)
1728                     ENDIF
1729                  ELSE
1730                     ztau = 0.2 * hbl(ji,jj) / ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
1731                     zddhdt = 0.2 * hbl(ji,jj)
1732                  ENDIF
1733               ELSE ! ln_osm_mle
1734                  IF ( zdb_bl(ji,jj) > 0._wp .and. zdbdz_ext(ji,jj) > 0._wp)THEN
1735                     IF ( ( zwstrc(ji,jj) / zvstr(ji,jj) )**3 <= 0.5 ) THEN  ! near neutral stability
1736                        zari = MIN( 1.5 * ( zdb_bl(ji,jj) / ( zdbdz_ext(ji,jj) * zhbl(ji,jj) ) ) / &
1737                             (1.0 + zdb_bl(ji,jj)**2 / ( 4.5 * zvstr(ji,jj)**2 * zdbdz_ext(ji,jj) ) ), 0.2 )
1738                     ELSE                                                     ! unstable
1739                        zari = MIN( 1.5 * ( zdb_bl(ji,jj) / ( zdbdz_ext(ji,jj) * zhbl(ji,jj) ) ) / &
1740                             (1.0 + zdb_bl(ji,jj)**2 / ( 4.5 * zwstrc(ji,jj)**2 * zdbdz_ext(ji,jj) ) ), 0.2 )
1741                     ENDIF
1742                     ztau = hbl(ji,jj) / (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird
1743                     zddhdt = zari * hbl(ji,jj)
1744                  ELSE
1745                     ztau = hbl(ji,jj) / ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird
1746                     zddhdt = 0.2 * hbl(ji,jj)
1747                  ENDIF
1748
1749               END IF  ! ln_osm_mle
1750
1751               dh(ji,jj) = dh(ji,jj) * EXP( -rn_rdt / ztau ) + zddhdt * ( 1.0 - EXP( -rn_rdt / ztau ) )
1752               ! Alan: this hml is never defined or used
1753            ELSE   ! IF (lconv)
1754               ztau = hbl(ji,jj) / zvstr(ji,jj)
1755               IF ( zdhdt(ji,jj) >= 0.0 ) THEN    ! probably shouldn't include wm here
1756                  ! boundary layer deepening
1757                  IF ( zdb_bl(ji,jj) > 0._wp ) THEN
1758                     ! pycnocline thickness set by stratification - use same relationship as for neutral conditions.
1759                     zari = MIN( 4.5 * ( zvstr(ji,jj)**2 ) &
1760                          & / ( zdb_bl(ji,jj) * zhbl(ji,jj) ) + 0.01  , 0.2 )
1761                     zddhdt = MIN( zari, 0.2 ) * hbl(ji,jj)
1762                  ELSE
1763                     zddhdt = 0.2 * hbl(ji,jj)
1764                  ENDIF
1765               ELSE     ! IF(dhdt < 0)
1766                  zddhdt = 0.2 * hbl(ji,jj)
1767               ENDIF    ! IF (dhdt >= 0)
1768               dh(ji,jj) = dh(ji,jj) * EXP( -rn_rdt / ztau )+ zddhdt * ( 1.0 - EXP( -rn_rdt / ztau ) )
1769               IF ( zdhdt(ji,jj) < 0._wp .and. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zddhdt       ! can be a problem with dh>hbl for rapid collapse
1770               ! Alan: this hml is never defined or used -- do we need it?
1771            ENDIF       ! IF (lconv)
1772
1773            hml(ji,jj) = hbl(ji,jj) - dh(ji,jj)
1774            inhml = MAX( INT( dh(ji,jj) / e3t_n(ji,jj,ibld(ji,jj)) ) , 1 )
1775            imld(ji,jj) = MAX( ibld(ji,jj) - inhml, 3)
1776            zhml(ji,jj) = gdepw_n(ji,jj,imld(ji,jj))
1777            zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj)
1778         END DO
1779      END DO
1780
1781    END SUBROUTINE zdf_osm_pycnocline_thickness
1782
1783
1784   SUBROUTINE zdf_osm_zmld_horizontal_gradients( zmld, zdtdx, zdtdy, zdsdx, zdsdy, dbdx_mle, dbdy_mle )
1785      !!----------------------------------------------------------------------
1786      !!                  ***  ROUTINE zdf_osm_horizontal_gradients  ***
1787      !!
1788      !! ** Purpose :   Calculates horizontal gradients of buoyancy for use with Fox-Kemper parametrization.
1789      !!
1790      !! ** Method  :
1791      !!
1792      !! References: Fox-Kemper et al., JPO, 38, 1145-1165, 2008
1793      !!             Fox-Kemper and Ferrari, JPO, 38, 1166-1179, 2008
1794
1795
1796      REAL(wp), DIMENSION(jpi,jpj)     :: dbdx_mle, dbdy_mle ! MLE horiz gradients at u & v points
1797      REAL(wp), DIMENSION(jpi,jpj)     :: zmld ! ==  estimated FK BLD used for MLE horiz gradients  == !
1798      REAL(wp), DIMENSION(jpi,jpj)     :: zdtdx, zdtdy, zdsdx, zdsdy
1799
1800      INTEGER  ::   ji, jj, jk          ! dummy loop indices
1801      INTEGER  ::   ii, ij, ik, ikmax   ! local integers
1802      REAL(wp)                         :: zc
1803      REAL(wp)                         :: zN2_c           ! local buoyancy difference from 10m value
1804      REAL(wp), DIMENSION(jpi,jpj)     :: ztm, zsm, zLf_NH, zLf_MH
1805      REAL(wp), DIMENSION(jpi,jpj,jpts):: ztsm_midu, ztsm_midv, zabu, zabv
1806      REAL(wp), DIMENSION(jpi,jpj)     :: zmld_midu, zmld_midv
1807!!----------------------------------------------------------------------
1808      !
1809      !                                      !==  MLD used for MLE  ==!
1810
1811      mld_prof(:,:)  = nlb10               ! Initialization to the number of w ocean point
1812      zmld(:,:)  = 0._wp               ! here hmlp used as a dummy variable, integrating vertically N^2
1813      zN2_c = grav * rn_osm_mle_rho_c * r1_rau0   ! convert density criteria into N^2 criteria
1814      DO jk = nlb10, jpkm1
1815         DO jj = 1, jpj                ! Mixed layer level: w-level
1816            DO ji = 1, jpi
1817               ikt = mbkt(ji,jj)
1818               zmld(ji,jj) = zmld(ji,jj) + MAX( rn2b(ji,jj,jk) , 0._wp ) * e3w_n(ji,jj,jk)
1819               IF( zmld(ji,jj) < zN2_c )   mld_prof(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level
1820            END DO
1821         END DO
1822      END DO
1823      DO jj = 1, jpj
1824         DO ji = 1, jpi
1825            mld_prof(ji,jj) = MAX(mld_prof(ji,jj),ibld(ji,jj))
1826            zmld(ji,jj) = gdepw_n(ji,jj,mld_prof(ji,jj))
1827         END DO
1828      END DO
1829      ! ensure mld_prof .ge. ibld
1830      !
1831      ikmax = MIN( MAXVAL( mld_prof(:,:) ), jpkm1 )                  ! max level of the computation
1832      !
1833      ztm(:,:) = 0._wp
1834      zsm(:,:) = 0._wp
1835      DO jk = 1, ikmax                                 ! MLD and mean buoyancy and N2 over the mixed layer
1836         DO jj = 1, jpj
1837            DO ji = 1, jpi
1838               zc = e3t_n(ji,jj,jk) * REAL( MIN( MAX( 0, mld_prof(ji,jj)-jk ) , 1  )  )    ! zc being 0 outside the ML t-points
1839               ztm(ji,jj) = ztm(ji,jj) + zc * tsn(ji,jj,jk,jp_tem)
1840               zsm(ji,jj) = zsm(ji,jj) + zc * tsn(ji,jj,jk,jp_sal)
1841            END DO
1842         END DO
1843      END DO
1844      ! average temperature and salinity.
1845      ztm(:,:) = ztm(:,:) / MAX( e3t_n(:,:,1), zmld(:,:) )
1846      zsm(:,:) = zsm(:,:) / MAX( e3t_n(:,:,1), zmld(:,:) )
1847      ! calculate horizontal gradients at u & v points
1848
1849      DO jj = 2, jpjm1
1850         DO ji = 1, jpim1
1851            zdtdx(ji,jj) = ( ztm(ji+1,jj) - ztm( ji,jj) )  * umask(ji,jj,1) / e1u(ji,jj)
1852            zdsdx(ji,jj) = ( zsm(ji+1,jj) - zsm( ji,jj) )  * umask(ji,jj,1) / e1u(ji,jj)
1853            zmld_midu(ji,jj) = 0.25_wp * (zmld(ji+1,jj) + zmld( ji,jj))
1854            ztsm_midu(ji,jj,jp_tem) = 0.5_wp * ( ztm(ji+1,jj) + ztm( ji,jj) )
1855            ztsm_midu(ji,jj,jp_sal) = 0.5_wp * ( zsm(ji+1,jj) + zsm( ji,jj) )
1856         END DO
1857      END DO
1858
1859      DO jj = 1, jpjm1
1860         DO ji = 2, jpim1
1861            zdtdy(ji,jj) = ( ztm(ji,jj+1) - ztm( ji,jj) ) * vmask(ji,jj,1) / e1v(ji,jj)
1862            zdsdy(ji,jj) = ( zsm(ji,jj+1) - zsm( ji,jj) ) * vmask(ji,jj,1) / e1v(ji,jj)
1863            zmld_midv(ji,jj) = 0.25_wp * (zmld(ji,jj+1) + zmld( ji,jj))
1864            ztsm_midv(ji,jj,jp_tem) = 0.5_wp * ( ztm(ji,jj+1) + ztm( ji,jj) )
1865            ztsm_midv(ji,jj,jp_sal) = 0.5_wp * ( zsm(ji,jj+1) + zsm( ji,jj) )
1866         END DO
1867      END DO
1868
1869      CALL eos_rab(ztsm_midu, zmld_midu, zabu)
1870      CALL eos_rab(ztsm_midv, zmld_midv, zabv)
1871
1872      DO jj = 2, jpjm1
1873         DO ji = 1, jpim1
1874            dbdx_mle(ji,jj) = grav*(zdtdx(ji,jj)*zabu(ji,jj,jp_tem) - zdsdx(ji,jj)*zabu(ji,jj,jp_sal))
1875         END DO
1876      END DO
1877      DO jj = 1, jpjm1
1878         DO ji = 2, jpim1
1879            dbdy_mle(ji,jj) = grav*(zdtdy(ji,jj)*zabv(ji,jj,jp_tem) - zdsdy(ji,jj)*zabv(ji,jj,jp_sal))
1880         END DO
1881      END DO
1882
1883 END SUBROUTINE zdf_osm_zmld_horizontal_gradients
1884  SUBROUTINE zdf_osm_mle_parameters( hmle, zwb_fk, zvel_mle, zdiff_mle )
1885      !!----------------------------------------------------------------------
1886      !!                  ***  ROUTINE zdf_osm_mle_parameters  ***
1887      !!
1888      !! ** Purpose :   Timesteps the mixed layer eddy depth, hmle and calculates the mixed layer eddy fluxes for buoyancy, heat and salinity.
1889      !!
1890      !! ** Method  :
1891      !!
1892      !! References: Fox-Kemper et al., JPO, 38, 1145-1165, 2008
1893      !!             Fox-Kemper and Ferrari, JPO, 38, 1166-1179, 2008
1894
1895      REAL(wp), DIMENSION(jpi,jpj)     :: hmle, zwb_fk, zvel_mle, zdiff_mle
1896      INTEGER  ::   ji, jj, jk          ! dummy loop indices
1897      INTEGER  ::   ii, ij, ik  ! local integers
1898      INTEGER , DIMENSION(jpi,jpj)     :: inml_mle
1899      REAL(wp) ::   zdb_mle, ztmp, zdbds_mle
1900
1901      mld_prof(:,:) = 4
1902      DO jk = 5, jpkm1
1903        DO jj = 2, jpjm1
1904          DO ji = 2, jpim1
1905            IF ( hmle(ji,jj) >= gdepw_n(ji,jj,jk) ) mld_prof(ji,jj) = MIN(mbkt(ji,jj), jk)
1906          END DO
1907        END DO
1908      END DO
1909      ! DO jj = 2, jpjm1
1910      !    DO ji = 1, jpim1
1911      !       zhmle(ji,jj) = gdepw_n(ji,jj,mld_prof(ji,jj))
1912      !    END DO
1913      !  END DO
1914   ! Timestep mixed layer eddy depth.
1915      DO jj = 2, jpjm1
1916        DO ji = 2, jpim1
1917          zdb_mle = grav * (rhop(ji,jj,mld_prof(ji,jj)) - rhop(ji,jj,ibld(ji,jj) )) * r1_rau0 ! check ALMG
1918          IF ( lconv(ji,jj) .and. ( zdb_bl(ji,jj) < rn_osm_mle_thresh .and. mld_prof(ji,jj) > ibld(ji,jj) .and. zdb_mle > 0.0 ) ) THEN
1919             hmle(ji,jj) = hmle(ji,jj) + zwb0(ji,jj) * rn_rdt / MAX( zdb_mle, rn_osm_mle_thresh )  ! MLE layer deepening through encroachment. Don't have a good maximum value for deepening, so use threshold buoyancy.
1920          ELSE
1921            ! MLE layer relaxes towards mixed layer depth on timescale tau_mle, or tau_mle/10
1922             ! IF ( hmle(ji,jj) > zmld(ji,jj) ) THEN
1923             !   hmle(ji,jj) = hmle(ji,jj) - ( hmle(ji,jj) - zmld(ji,jj) ) * rn_rdt / rn_osm_mle_tau
1924             ! ELSE
1925             !   hmle(ji,jj) = hmle(ji,jj) - 10.0 * ( hmle(ji,jj) - zmld(ji,jj) ) * rn_rdt / rn_osm_mle_tau ! fast relaxation if MLE layer shallower than MLD
1926             ! ENDIF
1927             IF ( hmle(ji,jj) > hbl(ji,jj) ) THEN
1928               hmle(ji,jj) = hmle(ji,jj) - ( hmle(ji,jj) - hbl(ji,jj) ) * rn_rdt / rn_osm_mle_tau
1929             ELSE
1930               hmle(ji,jj) = hmle(ji,jj) - 10.0 * ( hmle(ji,jj) - hbl(ji,jj) ) * rn_rdt / rn_osm_mle_tau ! fast relaxation if MLE layer shallower than MLD
1931             ENDIF
1932          ENDIF
1933          hmle(ji,jj) = MIN(hmle(ji,jj), ht_n(ji,jj))
1934        END DO
1935      END DO
1936
1937      mld_prof = 4
1938      DO jk = 5, jpkm1
1939        DO jj = 2, jpjm1
1940          DO ji = 2, jpim1
1941            IF ( hmle(ji,jj) >= gdepw_n(ji,jj,jk) ) mld_prof(ji,jj) = MIN(mbkt(ji,jj), jk)
1942          END DO
1943        END DO
1944      END DO
1945      DO jj = 2, jpjm1
1946         DO ji = 2, jpim1
1947            zhmle(ji,jj) = gdepw_n(ji,jj, mld_prof(ji,jj))
1948         END DO
1949       END DO
1950   ! Calculate vertical buoyancy, heat and salinity fluxes due to MLE.
1951
1952      DO jj = 2, jpjm1
1953        DO ji = 2, jpim1
1954          IF ( lconv(ji,jj) ) THEN
1955             ztmp =  r1_ft(ji,jj) *  MIN( 111.e3_wp , e1u(ji,jj) ) / rn_osm_mle_lf
1956             ! zwt_fk(ji,jj) = 0.5_wp * ztmp * ( dbdx_mle(ji,jj) * zdtdx(ji,jj) + dbdy_mle(ji,jj) * zdtdy(ji,jj) &
1957             !      & + dbdx_mle(ji-1,jj) * zdtdx(ji-1,jj) + dbdy_mle(ji,jj-1) * zdtdy(ji,jj-1) )
1958             ! zws_fk(ji,jj) = 0.5_wp * ztmp * ( dbdx_mle(ji,jj) * zdsdx(ji,jj) + dbdy_mle(ji,jj) * zdsdy(ji,jj) &
1959             !      & + dbdx_mle(ji-1,jj) * zdsdx(ji-1,jj) + dbdy_mle(ji,jj-1) * zdsdy(ji,jj-1) )
1960             zdbds_mle = SQRT( 0.5_wp * ( dbdx_mle(ji,jj) * dbdx_mle(ji,jj) + dbdy_mle(ji,jj) * dbdy_mle(ji,jj) &
1961                  & + dbdx_mle(ji-1,jj) * dbdx_mle(ji-1,jj) + dbdy_mle(ji,jj-1) * dbdy_mle(ji,jj-1) ) )
1962             zwb_fk(ji,jj) = rn_osm_mle_ce * hmle(ji,jj) * hmle(ji,jj) *ztmp * zdbds_mle * zdbds_mle
1963      ! This vbelocity scale, defined in Fox-Kemper et al (2008), is needed for calculating dhdt.
1964             zvel_mle(ji,jj) = zdbds_mle * ztmp * hmle(ji,jj) * tmask(ji,jj,1) 
1965             zdiff_mle(ji,jj) = 1.e-4_wp * ztmp * zdbds_mle * zhmle(ji,jj)**3  / rn_osm_mle_lf
1966          ENDIF
1967        END DO
1968      END DO
1969END SUBROUTINE zdf_osm_mle_parameters
1970
1971END SUBROUTINE zdf_osm
1972
1973
1974   SUBROUTINE zdf_osm_init
1975     !!----------------------------------------------------------------------
1976     !!                  ***  ROUTINE zdf_osm_init  ***
1977     !!
1978     !! ** Purpose :   Initialization of the vertical eddy diffivity and
1979     !!      viscosity when using a osm turbulent closure scheme
1980     !!
1981     !! ** Method  :   Read the namosm namelist and check the parameters
1982     !!      called at the first timestep (nit000)
1983     !!
1984     !! ** input   :   Namlist namosm
1985     !!----------------------------------------------------------------------
1986     INTEGER  ::   ios            ! local integer
1987     INTEGER  ::   ji, jj, jk     ! dummy loop indices
1988     REAL z1_t2
1989     !!
1990     NAMELIST/namzdf_osm/ ln_use_osm_la, rn_osm_la, rn_osm_dstokes, nn_ave &
1991          & ,nn_osm_wave, ln_dia_osm, rn_osm_hbl0 &
1992          & ,ln_kpprimix, rn_riinfty, rn_difri, ln_convmix, rn_difconv, nn_osm_wave &
1993          & ,ln_osm_mle
1994! Namelist for Fox-Kemper parametrization.
1995      NAMELIST/namosm_mle/ nn_osm_mle, rn_osm_mle_ce, rn_osm_mle_lf, rn_osm_mle_time, rn_osm_mle_lat,&
1996           & rn_osm_mle_rho_c,rn_osm_mle_thresh,rn_osm_mle_tau
1997
1998     !!----------------------------------------------------------------------
1999     !
2000     REWIND( numnam_ref )              ! Namelist namzdf_osm in reference namelist : Osmosis ML model
2001     READ  ( numnam_ref, namzdf_osm, IOSTAT = ios, ERR = 901)
2002901  IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_osm in reference namelist' )
2003
2004     REWIND( numnam_cfg )              ! Namelist namzdf_tke in configuration namelist : Turbulent Kinetic Energy
2005     READ  ( numnam_cfg, namzdf_osm, IOSTAT = ios, ERR = 902 )
2006902  IF( ios >  0 ) CALL ctl_nam ( ios , 'namzdf_osm in configuration namelist' )
2007     IF(lwm) WRITE ( numond, namzdf_osm )
2008
2009     IF(lwp) THEN                    ! Control print
2010        WRITE(numout,*)
2011        WRITE(numout,*) 'zdf_osm_init : OSMOSIS Parameterisation'
2012        WRITE(numout,*) '~~~~~~~~~~~~'
2013        WRITE(numout,*) '   Namelist namzdf_osm : set osm mixing parameters'
2014        WRITE(numout,*) '     Use  rn_osm_la                                ln_use_osm_la = ', ln_use_osm_la
2015        WRITE(numout,*) '     Use  MLE in OBL, i.e. Fox-Kemper param        ln_osm_mle = ', ln_osm_mle
2016        WRITE(numout,*) '     Turbulent Langmuir number                     rn_osm_la   = ', rn_osm_la
2017        WRITE(numout,*) '     Initial hbl for 1D runs                       rn_osm_hbl0   = ', rn_osm_hbl0
2018        WRITE(numout,*) '     Depth scale of Stokes drift                   rn_osm_dstokes = ', rn_osm_dstokes
2019        WRITE(numout,*) '     horizontal average flag                       nn_ave      = ', nn_ave
2020        WRITE(numout,*) '     Stokes drift                                  nn_osm_wave = ', nn_osm_wave
2021        SELECT CASE (nn_osm_wave)
2022        CASE(0)
2023           WRITE(numout,*) '     calculated assuming constant La#=0.3'
2024        CASE(1)
2025           WRITE(numout,*) '     calculated from Pierson Moskowitz wind-waves'
2026        CASE(2)
2027           WRITE(numout,*) '     calculated from ECMWF wave fields'
2028        END SELECT
2029        WRITE(numout,*) '     Output osm diagnostics                       ln_dia_osm  = ',  ln_dia_osm
2030        WRITE(numout,*) '     Use KPP-style shear instability mixing       ln_kpprimix = ', ln_kpprimix
2031        WRITE(numout,*) '     local Richardson Number limit for shear instability rn_riinfty = ', rn_riinfty
2032        WRITE(numout,*) '     maximum shear diffusivity at Rig = 0    (m2/s) rn_difri = ', rn_difri
2033        WRITE(numout,*) '     Use large mixing below BL when unstable       ln_convmix = ', ln_convmix
2034        WRITE(numout,*) '     diffusivity when unstable below BL     (m2/s) rn_difconv = ', rn_difconv
2035     ENDIF
2036
2037     !                              ! allocate zdfosm arrays
2038     IF( zdf_osm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_osm_init : unable to allocate arrays' )
2039
2040
2041     IF( ln_osm_mle ) THEN
2042! Initialise Fox-Kemper parametrization
2043         REWIND( numnam_ref )              ! Namelist namosm_mle in reference namelist : Tracer advection scheme
2044         READ  ( numnam_ref, namosm_mle, IOSTAT = ios, ERR = 903)
2045903      IF( ios /= 0 )   CALL ctl_nam ( ios , 'namosm_mle in reference namelist')
2046
2047         REWIND( numnam_cfg )              ! Namelist namosm_mle in configuration namelist : Tracer advection scheme
2048         READ  ( numnam_cfg, namosm_mle, IOSTAT = ios, ERR = 904 )
2049904      IF( ios >  0 )   CALL ctl_nam ( ios , 'namosm_mle in configuration namelist')
2050         IF(lwm) WRITE ( numond, namosm_mle )
2051
2052         IF(lwp) THEN                     ! Namelist print
2053            WRITE(numout,*)
2054            WRITE(numout,*) 'zdf_osm_init : initialise mixed layer eddy (MLE)'
2055            WRITE(numout,*) '~~~~~~~~~~~~~'
2056            WRITE(numout,*) '   Namelist namosm_mle : '
2057            WRITE(numout,*) '         MLE type: =0 standard Fox-Kemper ; =1 new formulation        nn_osm_mle    = ', nn_osm_mle
2058            WRITE(numout,*) '         magnitude of the MLE (typical value: 0.06 to 0.08)           rn_osm_mle_ce    = ', rn_osm_mle_ce
2059            WRITE(numout,*) '         scale of ML front (ML radius of deformation) (nn_osm_mle=0)      rn_osm_mle_lf     = ', rn_osm_mle_lf, 'm'
2060            WRITE(numout,*) '         maximum time scale of MLE                    (nn_osm_mle=0)      rn_osm_mle_time   = ', rn_osm_mle_time, 's'
2061            WRITE(numout,*) '         reference latitude (degrees) of MLE coef.    (nn_osm_mle=1)      rn_osm_mle_lat    = ', rn_osm_mle_lat, 'deg'
2062            WRITE(numout,*) '         Density difference used to define ML for FK              rn_osm_mle_rho_c  = ', rn_osm_mle_rho_c
2063            WRITE(numout,*) '         Threshold used to define ML for FK                      rn_osm_mle_thresh  = ', rn_osm_mle_thresh, 'm^2/s'
2064            WRITE(numout,*) '         Timescale for OSM-FK                                         rn_osm_mle_tau  = ', rn_osm_mle_tau, 's'
2065         ENDIF         !
2066     ENDIF
2067      !
2068      IF(lwp) THEN
2069         WRITE(numout,*)
2070         IF( ln_osm_mle ) THEN
2071            WRITE(numout,*) '   ==>>>   Mixed Layer Eddy induced transport added to OSMOSIS BL calculation'
2072            IF( nn_osm_mle == 0 )   WRITE(numout,*) '              Fox-Kemper et al 2010 formulation'
2073            IF( nn_osm_mle == 1 )   WRITE(numout,*) '              New formulation'
2074         ELSE
2075            WRITE(numout,*) '   ==>>>   Mixed Layer induced transport NOT added to OSMOSIS BL calculation'
2076         ENDIF
2077      ENDIF
2078      !
2079      IF( ln_osm_mle ) THEN                ! MLE initialisation
2080         !
2081         rb_c = grav * rn_osm_mle_rho_c /rau0        ! Mixed Layer buoyancy criteria
2082         IF(lwp) WRITE(numout,*)
2083         IF(lwp) WRITE(numout,*) '      ML buoyancy criteria = ', rb_c, ' m/s2 '
2084         IF(lwp) WRITE(numout,*) '      associated ML density criteria defined in zdfmxl = ', rn_osm_mle_rho_c, 'kg/m3'
2085         !
2086         IF( nn_osm_mle == 0 ) THEN           ! MLE array allocation & initialisation            !
2087!
2088         ELSEIF( nn_osm_mle == 1 ) THEN           ! MLE array allocation & initialisation
2089            rc_f = rn_osm_mle_ce/ (  5.e3_wp * 2._wp * omega * SIN( rad * rn_osm_mle_lat )  )
2090            !
2091         ENDIF
2092         !                                ! 1/(f^2+tau^2)^1/2 at t-point (needed in both nn_osm_mle case)
2093         z1_t2 = 2.e-5
2094         do jj=1,jpj
2095            do ji = 1,jpi
2096               r1_ft(ji,jj) = MIN(1./( ABS(ff_t(ji,jj)) + epsln ), ABS(ff_t(ji,jj))/z1_t2**2)
2097            end do
2098         end do
2099         ! z1_t2 = 1._wp / ( rn_osm_mle_time * rn_osm_mle_timeji,jj )
2100         ! r1_ft(:,:) = 1._wp / SQRT(  ff_t(:,:) * ff_t(:,:) + z1_t2  )
2101         !
2102      ENDIF
2103
2104     call osm_rst( nit000, 'READ' ) !* read or initialize hbl, dh, hmle
2105
2106
2107     IF( ln_zdfddm) THEN
2108        IF(lwp) THEN
2109           WRITE(numout,*)
2110           WRITE(numout,*) '    Double diffusion mixing on temperature and salinity '
2111           WRITE(numout,*) '    CAUTION : done in routine zdfosm, not in routine zdfddm '
2112        ENDIF
2113     ENDIF
2114
2115
2116     !set constants not in namelist
2117     !-----------------------------
2118
2119     IF(lwp) THEN
2120        WRITE(numout,*)
2121     ENDIF
2122
2123     IF (nn_osm_wave == 0) THEN
2124        dstokes(:,:) = rn_osm_dstokes
2125     END IF
2126
2127     ! Horizontal average : initialization of weighting arrays
2128     ! -------------------
2129
2130     SELECT CASE ( nn_ave )
2131
2132     CASE ( 0 )                ! no horizontal average
2133        IF(lwp) WRITE(numout,*) '          no horizontal average on avt'
2134        IF(lwp) WRITE(numout,*) '          only in very high horizontal resolution !'
2135        ! weighting mean arrays etmean
2136        !           ( 1  1 )
2137        ! avt = 1/4 ( 1  1 )
2138        !
2139        etmean(:,:,:) = 0.e0
2140
2141        DO jk = 1, jpkm1
2142           DO jj = 2, jpjm1
2143              DO ji = 2, jpim1   ! vector opt.
2144                 etmean(ji,jj,jk) = tmask(ji,jj,jk)                     &
2145                      &  / MAX( 1.,  umask(ji-1,jj  ,jk) + umask(ji,jj,jk)   &
2146                      &            + vmask(ji  ,jj-1,jk) + vmask(ji,jj,jk)  )
2147              END DO
2148           END DO
2149        END DO
2150
2151     CASE ( 1 )                ! horizontal average
2152        IF(lwp) WRITE(numout,*) '          horizontal average on avt'
2153        ! weighting mean arrays etmean
2154        !           ( 1/2  1  1/2 )
2155        ! avt = 1/8 ( 1    2  1   )
2156        !           ( 1/2  1  1/2 )
2157        etmean(:,:,:) = 0.e0
2158
2159        DO jk = 1, jpkm1
2160           DO jj = 2, jpjm1
2161              DO ji = 2, jpim1   ! vector opt.
2162                 etmean(ji,jj,jk) = tmask(ji, jj,jk)                           &
2163                      & / MAX( 1., 2.* tmask(ji,jj,jk)                           &
2164                      &      +.5 * ( tmask(ji-1,jj+1,jk) + tmask(ji-1,jj-1,jk)   &
2165                      &             +tmask(ji+1,jj+1,jk) + tmask(ji+1,jj-1,jk) ) &
2166                      &      +1. * ( tmask(ji-1,jj  ,jk) + tmask(ji  ,jj+1,jk)   &
2167                      &             +tmask(ji  ,jj-1,jk) + tmask(ji+1,jj  ,jk) ) )
2168              END DO
2169           END DO
2170        END DO
2171
2172     CASE DEFAULT
2173        WRITE(ctmp1,*) '          bad flag value for nn_ave = ', nn_ave
2174        CALL ctl_stop( ctmp1 )
2175
2176     END SELECT
2177
2178     ! Initialization of vertical eddy coef. to the background value
2179     ! -------------------------------------------------------------
2180     DO jk = 1, jpk
2181        avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)
2182     END DO
2183
2184     ! zero the surface flux for non local term and osm mixed layer depth
2185     ! ------------------------------------------------------------------
2186     ghamt(:,:,:) = 0.
2187     ghams(:,:,:) = 0.
2188     ghamu(:,:,:) = 0.
2189     ghamv(:,:,:) = 0.
2190     !
2191     IF( lwxios ) THEN
2192        CALL iom_set_rstw_var_active('wn')
2193        CALL iom_set_rstw_var_active('hbl')
2194        CALL iom_set_rstw_var_active('hbli')
2195     ENDIF
2196   END SUBROUTINE zdf_osm_init
2197
2198
2199   SUBROUTINE osm_rst( kt, cdrw )
2200     !!---------------------------------------------------------------------
2201     !!                   ***  ROUTINE osm_rst  ***
2202     !!
2203     !! ** Purpose :   Read or write BL fields in restart file
2204     !!
2205     !! ** Method  :   use of IOM library. If the restart does not contain
2206     !!                required fields, they are recomputed from stratification
2207     !!----------------------------------------------------------------------
2208
2209     INTEGER, INTENT(in) :: kt
2210     CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag
2211
2212     INTEGER ::   id1, id2, id3   ! iom enquiry index
2213     INTEGER  ::   ji, jj, jk     ! dummy loop indices
2214     INTEGER  ::   iiki, ikt ! local integer
2215     REAL(wp) ::   zhbf           ! tempory scalars
2216     REAL(wp) ::   zN2_c           ! local scalar
2217     REAL(wp) ::   rho_c = 0.01_wp    !: density criterion for mixed layer depth
2218     INTEGER, DIMENSION(jpi,jpj) :: imld_rst ! level of mixed-layer depth (pycnocline top)
2219     !!----------------------------------------------------------------------
2220     !
2221     !!-----------------------------------------------------------------------------
2222     ! If READ/WRITE Flag is 'READ', try to get hbl from restart file. If successful then return
2223     !!-----------------------------------------------------------------------------
2224     IF( TRIM(cdrw) == 'READ'.AND. ln_rstart) THEN
2225        id1 = iom_varid( numror, 'wn'   , ldstop = .FALSE. )
2226        IF( id1 > 0 ) THEN                       ! 'wn' exists; read
2227           CALL iom_get( numror, jpdom_autoglo, 'wn', wn, ldxios = lrxios )
2228           WRITE(numout,*) ' ===>>>> :  wn read from restart file'
2229        ELSE
2230           wn(:,:,:) = 0._wp
2231           WRITE(numout,*) ' ===>>>> :  wn not in restart file, set to zero initially'
2232        END IF
2233
2234        id1 = iom_varid( numror, 'hbl'   , ldstop = .FALSE. )
2235        id2 = iom_varid( numror, 'dh'   , ldstop = .FALSE. )
2236        IF( id1 > 0 .AND. id2 > 0) THEN                       ! 'hbl' exists; read and return
2237           CALL iom_get( numror, jpdom_autoglo, 'hbl' , hbl , ldxios = lrxios )
2238           CALL iom_get( numror, jpdom_autoglo, 'dh', dh, ldxios = lrxios  )
2239           WRITE(numout,*) ' ===>>>> :  hbl & dh read from restart file'
2240           IF( ln_osm_mle ) THEN
2241              id3 = iom_varid( numror, 'hmle'   , ldstop = .FALSE. )
2242              IF( id3 > 0) THEN
2243                 CALL iom_get( numror, jpdom_autoglo, 'hmle' , hmle , ldxios = lrxios )
2244                 WRITE(numout,*) ' ===>>>> :  hmle read from restart file'
2245              ELSE
2246                 WRITE(numout,*) ' ===>>>> :  hmle not found, set to hbl'
2247                 hmle(:,:) = hbl(:,:)            ! Initialise MLE depth.
2248              END IF
2249           END IF
2250           RETURN
2251        ELSE                      ! 'hbl' & 'dh' not in restart file, recalculate
2252           WRITE(numout,*) ' ===>>>> : previous run without osmosis scheme, hbl computed from stratification'
2253        END IF
2254     END IF
2255
2256     !!-----------------------------------------------------------------------------
2257     ! If READ/WRITE Flag is 'WRITE', write hbl into the restart file, then return
2258     !!-----------------------------------------------------------------------------
2259     IF( TRIM(cdrw) == 'WRITE') THEN     !* Write hbli into the restart file, then return
2260        IF(lwp) WRITE(numout,*) '---- osm-rst ----'
2261         CALL iom_rstput( kt, nitrst, numrow, 'wn'     , wn,   ldxios = lwxios )
2262         CALL iom_rstput( kt, nitrst, numrow, 'hbl'    , hbl,  ldxios = lwxios )
2263         CALL iom_rstput( kt, nitrst, numrow, 'dh'     , dh,   ldxios = lwxios )
2264         IF( ln_osm_mle ) THEN
2265            CALL iom_rstput( kt, nitrst, numrow, 'hmle', hmle, ldxios = lwxios )
2266         END IF
2267        RETURN
2268     END IF
2269
2270     !!-----------------------------------------------------------------------------
2271     ! Getting hbl, no restart file with hbl, so calculate from surface stratification
2272     !!-----------------------------------------------------------------------------
2273     IF( lwp ) WRITE(numout,*) ' ===>>>> : calculating hbl computed from stratification'
2274     ! w-level of the mixing and mixed layers
2275     CALL eos_rab( tsn, rab_n )
2276     CALL bn2(tsn, rab_n, rn2)
2277     imld_rst(:,:)  = nlb10         ! Initialization to the number of w ocean point
2278     hbl(:,:)  = 0._wp              ! here hbl used as a dummy variable, integrating vertically N^2
2279     zN2_c = grav * rho_c * r1_rau0 ! convert density criteria into N^2 criteria
2280     !
2281     hbl(:,:)  = 0._wp              ! here hbl used as a dummy variable, integrating vertically N^2
2282     DO jk = 1, jpkm1
2283        DO jj = 1, jpj              ! Mixed layer level: w-level
2284           DO ji = 1, jpi
2285              ikt = mbkt(ji,jj)
2286              hbl(ji,jj) = hbl(ji,jj) + MAX( rn2(ji,jj,jk) , 0._wp ) * e3w_n(ji,jj,jk)
2287              IF( hbl(ji,jj) < zN2_c )   imld_rst(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level
2288           END DO
2289        END DO
2290     END DO
2291     !
2292     DO jj = 1, jpj
2293        DO ji = 1, jpi
2294           iiki = MAX(4,imld_rst(ji,jj))
2295           hbl (ji,jj) = gdepw_n(ji,jj,iiki  )    ! Turbocline depth
2296           dh (ji,jj) = e3t_n(ji,jj,iiki-1  )     ! Turbocline depth
2297        END DO
2298     END DO
2299
2300     WRITE(numout,*) ' ===>>>> : hbl computed from stratification'
2301
2302     IF( ln_osm_mle ) THEN
2303        hmle(:,:) = hbl(:,:)            ! Initialise MLE depth.
2304        WRITE(numout,*) ' ===>>>> : hmle set = to hbl'
2305     END IF
2306
2307     wn(:,:,:) = 0._wp
2308     WRITE(numout,*) ' ===>>>> :  wn not in restart file, set to zero initially'
2309   END SUBROUTINE osm_rst
2310
2311
2312   SUBROUTINE tra_osm( kt )
2313      !!----------------------------------------------------------------------
2314      !!                  ***  ROUTINE tra_osm  ***
2315      !!
2316      !! ** Purpose :   compute and add to the tracer trend the non-local tracer flux
2317      !!
2318      !! ** Method  :   ???
2319      !!----------------------------------------------------------------------
2320      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds   ! 3D workspace
2321      !!----------------------------------------------------------------------
2322      INTEGER, INTENT(in) :: kt
2323      INTEGER :: ji, jj, jk
2324      !
2325      IF( kt == nit000 ) THEN
2326         IF(lwp) WRITE(numout,*)
2327         IF(lwp) WRITE(numout,*) 'tra_osm : OSM non-local tracer fluxes'
2328         IF(lwp) WRITE(numout,*) '~~~~~~~   '
2329      ENDIF
2330
2331      IF( l_trdtra )   THEN                    !* Save ta and sa trends
2332         ALLOCATE( ztrdt(jpi,jpj,jpk) )   ;    ztrdt(:,:,:) = tsa(:,:,:,jp_tem)
2333         ALLOCATE( ztrds(jpi,jpj,jpk) )   ;    ztrds(:,:,:) = tsa(:,:,:,jp_sal)
2334      ENDIF
2335
2336      DO jk = 1, jpkm1
2337         DO jj = 2, jpjm1
2338            DO ji = 2, jpim1
2339               tsa(ji,jj,jk,jp_tem) =  tsa(ji,jj,jk,jp_tem)                      &
2340                  &                 - (  ghamt(ji,jj,jk  )  &
2341                  &                    - ghamt(ji,jj,jk+1) ) /e3t_n(ji,jj,jk)
2342               tsa(ji,jj,jk,jp_sal) =  tsa(ji,jj,jk,jp_sal)                      &
2343                  &                 - (  ghams(ji,jj,jk  )  &
2344                  &                    - ghams(ji,jj,jk+1) ) / e3t_n(ji,jj,jk)
2345            END DO
2346         END DO
2347      END DO
2348
2349      ! save the non-local tracer flux trends for diagnostics
2350      IF( l_trdtra )   THEN
2351         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) - ztrdt(:,:,:)
2352         ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:)
2353
2354         CALL trd_tra( kt, 'TRA', jp_tem, jptra_osm, ztrdt )
2355         CALL trd_tra( kt, 'TRA', jp_sal, jptra_osm, ztrds )
2356         DEALLOCATE( ztrdt )      ;     DEALLOCATE( ztrds )
2357      ENDIF
2358
2359      IF(ln_ctl) THEN
2360         CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' osm  - Ta: ', mask1=tmask,   &
2361         &             tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' )
2362      ENDIF
2363      !
2364   END SUBROUTINE tra_osm
2365
2366
2367   SUBROUTINE trc_osm( kt )          ! Dummy routine
2368      !!----------------------------------------------------------------------
2369      !!                  ***  ROUTINE trc_osm  ***
2370      !!
2371      !! ** Purpose :   compute and add to the passive tracer trend the non-local
2372      !!                 passive tracer flux
2373      !!
2374      !!
2375      !! ** Method  :   ???
2376      !!----------------------------------------------------------------------
2377      !
2378      !!----------------------------------------------------------------------
2379      INTEGER, INTENT(in) :: kt
2380      WRITE(*,*) 'trc_osm: Not written yet', kt
2381   END SUBROUTINE trc_osm
2382
2383
2384   SUBROUTINE dyn_osm( kt )
2385      !!----------------------------------------------------------------------
2386      !!                  ***  ROUTINE dyn_osm  ***
2387      !!
2388      !! ** Purpose :   compute and add to the velocity trend the non-local flux
2389      !! copied/modified from tra_osm
2390      !!
2391      !! ** Method  :   ???
2392      !!----------------------------------------------------------------------
2393      INTEGER, INTENT(in) ::   kt   !
2394      !
2395      INTEGER :: ji, jj, jk   ! dummy loop indices
2396      !!----------------------------------------------------------------------
2397      !
2398      IF( kt == nit000 ) THEN
2399         IF(lwp) WRITE(numout,*)
2400         IF(lwp) WRITE(numout,*) 'dyn_osm : OSM non-local velocity'
2401         IF(lwp) WRITE(numout,*) '~~~~~~~   '
2402      ENDIF
2403      !code saving tracer trends removed, replace with trdmxl_oce
2404
2405      DO jk = 1, jpkm1           ! add non-local u and v fluxes
2406         DO jj = 2, jpjm1
2407            DO ji = 2, jpim1
2408               ua(ji,jj,jk) =  ua(ji,jj,jk)                      &
2409                  &                 - (  ghamu(ji,jj,jk  )  &
2410                  &                    - ghamu(ji,jj,jk+1) ) / e3u_n(ji,jj,jk)
2411               va(ji,jj,jk) =  va(ji,jj,jk)                      &
2412                  &                 - (  ghamv(ji,jj,jk  )  &
2413                  &                    - ghamv(ji,jj,jk+1) ) / e3v_n(ji,jj,jk)
2414            END DO
2415         END DO
2416      END DO
2417      !
2418      ! code for saving tracer trends removed
2419      !
2420   END SUBROUTINE dyn_osm
2421
2422   !!======================================================================
2423
2424END MODULE zdfosm
Note: See TracBrowser for help on using the repository browser.