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/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF – NEMO

source: NEMO/branches/2020/dev_r12377_KERNEL-06_techene_e3/src/OCE/ZDF/zdfosm.F90 @ 12622

Last change on this file since 12622 was 12622, checked in by techene, 4 years ago

all: add e3 substitute (sometimes it requires to add ze3t/u/v/w) and limit precompiled files lines to about 130 character

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