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 branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfosm.F90 @ 9089

Last change on this file since 9089 was 9089, checked in by gm, 6 years ago

dev_merge_2017: bug correction in zdfdrg + ISOMIP cfg

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