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.
Changeset 14986 for NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/ZDF/zdfosm.F90 – NEMO

Ignore:
Timestamp:
2021-06-14T13:34:08+02:00 (3 years ago)
Author:
sparonuz
Message:

Merge trunk -r14984:HEAD

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/ZDF/zdfosm.F90

    r14933 r14986  
    3434   !! 16/05/2019 (19) Fox-Kemper parametrization of restratification through mixed layer eddies added to revised code. 
    3535   !! 23/05/19   (20) Old code where key_osmldpth1` is *not* set removed, together with the key key_osmldpth1 
     36   !!             4.2  !  2021-05  (S. Mueller)  Efficiency improvements, source-code clarity enhancements, and adaptation to tiling 
    3637   !!---------------------------------------------------------------------- 
    3738 
    3839   !!---------------------------------------------------------------------- 
    39    !!   'ln_zdfosm'                                             OSMOSIS scheme 
     40   !!   'ln_zdfosm'                                          OSMOSIS scheme 
    4041   !!---------------------------------------------------------------------- 
    41    !!   zdf_osm       : update momentum and tracer Kz from osm scheme 
    42    !!   zdf_osm_init  : initialization, namelist read, and parameters control 
    43    !!   osm_rst       : read (or initialize) and write osmosis restart fields 
    44    !!   tra_osm       : compute and add to the T & S trend the non-local flux 
    45    !!   trc_osm       : compute and add to the passive tracer trend the non-local flux (TBD) 
    46    !!   dyn_osm       : compute and add to u & v trensd the non-local flux 
    47    !! 
    48    !! Subroutines in revised code. 
     42   !!   zdf_osm        : update momentum and tracer Kz from osm scheme 
     43   !!      zdf_osm_vertical_average             : compute vertical averages over boundary layers 
     44   !!      zdf_osm_velocity_rotation            : rotate velocity components 
     45   !!         zdf_osm_velocity_rotation_2d      :    rotation of 2d fields 
     46   !!         zdf_osm_velocity_rotation_3d      :    rotation of 3d fields 
     47   !!      zdf_osm_osbl_state                   : determine the state of the OSBL 
     48   !!      zdf_osm_external_gradients           : calculate gradients below the OSBL 
     49   !!      zdf_osm_calculate_dhdt               : calculate rate of change of hbl 
     50   !!      zdf_osm_timestep_hbl                 : hbl timestep 
     51   !!      zdf_osm_pycnocline_thickness         : calculate thickness of pycnocline 
     52   !!      zdf_osm_diffusivity_viscosity        : compute eddy diffusivity and viscosity profiles 
     53   !!      zdf_osm_fgr_terms                    : compute flux-gradient relationship terms 
     54   !!         zdf_osm_pycnocline_buoyancy_profiles : calculate pycnocline buoyancy profiles 
     55   !!      zdf_osm_zmld_horizontal_gradients    : calculate horizontal buoyancy gradients for use with Fox-Kemper parametrization 
     56   !!      zdf_osm_osbl_state_fk                : determine state of OSBL and MLE layers 
     57   !!      zdf_osm_mle_parameters               : timestep MLE depth and calculate MLE fluxes 
     58   !!   zdf_osm_init   : initialization, namelist read, and parameters control 
     59   !!      zdf_osm_alloc                        : memory allocation 
     60   !!   osm_rst        : read (or initialize) and write osmosis restart fields 
     61   !!   tra_osm        : compute and add to the T & S trend the non-local flux 
     62   !!   trc_osm        : compute and add to the passive tracer trend the non-local flux (TBD) 
     63   !!   dyn_osm        : compute and add to u & v trensd the non-local flux 
     64   !!   zdf_osm_iomput : iom_put wrapper that accepts arrays without halo 
     65   !!      zdf_osm_iomput_2d                    : iom_put wrapper for 2D fields 
     66   !!      zdf_osm_iomput_3d                    : iom_put wrapper for 3D fields 
    4967   !!---------------------------------------------------------------------- 
    50    USE oce            ! ocean dynamics and active tracers 
    51                       ! uses ww from previous time step (which is now wb) to calculate hbl 
    52    USE dom_oce        ! ocean space and time domain 
    53    USE zdf_oce        ! ocean vertical physics 
    54    USE sbc_oce        ! surface boundary condition: ocean 
    55    USE sbcwave        ! surface wave parameters 
    56    USE phycst         ! physical constants 
    57    USE eosbn2         ! equation of state 
    58    USE traqsr         ! details of solar radiation absorption 
    59    USE zdfddm         ! double diffusion mixing (avs array) 
    60    USE iom            ! I/O library 
    61    USE lib_mpp        ! MPP library 
    62    USE trd_oce        ! ocean trends definition 
    63    USE trdtra         ! tracers trends 
    64    ! 
    65    USE in_out_manager ! I/O manager 
    66    USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    67    USE prtctl         ! Print control 
    68    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     68   USE oce                       ! Ocean dynamics and active tracers 
     69   !                             ! Uses ww from previous time step (which is now wb) to calculate hbl 
     70   USE dom_oce                   ! Ocean space and time domain 
     71   USE zdf_oce                   ! Ocean vertical physics 
     72   USE sbc_oce                   ! Surface boundary condition: ocean 
     73   USE sbcwave                   ! Surface wave parameters 
     74   USE phycst                    ! Physical constants 
     75   USE eosbn2                    ! Equation of state 
     76   USE traqsr                    ! Details of solar radiation absorption 
     77   USE zdfdrg, ONLY : rCdU_bot   ! Bottom friction velocity 
     78   USE zdfddm                    ! Double diffusion mixing (avs array) 
     79   USE iom                       ! I/O library 
     80   USE lib_mpp                   ! MPP library 
     81   USE trd_oce                   ! Ocean trends definition 
     82   USE trdtra                    ! Tracers trends 
     83   USE in_out_manager            ! I/O manager 
     84   USE lbclnk                    ! Ocean lateral boundary conditions (or mpp link) 
     85   USE prtctl                    ! Print control 
     86   USE lib_fortran               ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
    6987 
    7088   IMPLICIT NONE 
    7189   PRIVATE 
    7290 
    73    PUBLIC   zdf_osm       ! routine called by step.F90 
    74    PUBLIC   zdf_osm_init  ! routine called by nemogcm.F90 
    75    PUBLIC   osm_rst       ! routine called by step.F90 
    76    PUBLIC   tra_osm       ! routine called by step.F90 
    77    PUBLIC   trc_osm       ! routine called by trcstp.F90 
    78    PUBLIC   dyn_osm       ! routine called by step.F90 
    79  
    80    PUBLIC   ln_osm_mle    ! logical needed by tra_mle_init in tramle.F90 
    81  
    82    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamu    !: non-local u-momentum flux 
    83    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamv    !: non-local v-momentum flux 
    84    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamt    !: non-local temperature flux (gamma/<ws>o) 
    85    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghams    !: non-local salinity flux (gamma/<ws>o) 
    86    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   etmean   !: averaging operator for avt 
    87    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbl      !: boundary layer depth 
    88    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dh       ! depth of pycnocline 
    89    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hml      ! ML depth 
    90    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dstokes  !: penetration depth of the Stokes drift. 
    91  
    92    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)           ::   r1_ft    ! inverse of the modified Coriolis parameter at t-pts 
    93    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hmle     ! Depth of layer affexted by mixed layer eddies in Fox-Kemper parametrization 
    94    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdx_mle ! zonal buoyancy gradient in ML 
    95    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdy_mle ! meridional buoyancy gradient in ML 
    96    INTEGER,  PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mld_prof ! level of base of MLE layer. 
    97  
    98    !                      !!** Namelist  namzdf_osm  ** 
    99    LOGICAL  ::   ln_use_osm_la      ! Use namelist  rn_osm_la 
    100  
    101    LOGICAL  ::   ln_osm_mle           !: flag to activate the Mixed Layer Eddy (MLE) parameterisation 
    102  
    103    REAL(wp) ::   rn_osm_la          ! Turbulent Langmuir number 
    104    REAL(wp) ::   rn_osm_dstokes     ! Depth scale of Stokes drift 
    105    REAL(wp) ::   rn_zdfosm_adjust_sd = 1.0 ! factor to reduce Stokes drift by 
    106    REAL(wp) ::   rn_osm_hblfrac = 0.1! for nn_osm_wave = 3/4 specify fraction in top of hbl 
    107    LOGICAL  ::   ln_zdfosm_ice_shelter      ! flag to activate ice sheltering 
    108    REAL(wp) ::   rn_osm_hbl0 = 10._wp       ! Initial value of hbl for 1D runs 
    109    INTEGER  ::   nn_ave             ! = 0/1 flag for horizontal average on avt 
    110    INTEGER  ::   nn_osm_wave = 0    ! = 0/1/2 flag for getting stokes drift from La# / PM wind-waves/Inputs into sbcwave 
    111    INTEGER  ::   nn_osm_SD_reduce   ! = 0/1/2 flag for getting effective stokes drift from surface value 
    112    LOGICAL  ::   ln_dia_osm         ! Use namelist  rn_osm_la 
    113  
    114  
    115    LOGICAL  ::   ln_kpprimix  = .true.  ! Shear instability mixing 
    116    REAL(wp) ::   rn_riinfty   = 0.7     ! local Richardson Number limit for shear instability 
    117    REAL(wp) ::   rn_difri    =  0.005   ! maximum shear mixing at Rig = 0    (m2/s) 
    118    LOGICAL  ::   ln_convmix  = .true.   ! Convective instability mixing 
    119    REAL(wp) ::   rn_difconv = 1._wp     ! diffusivity when unstable below BL  (m2/s) 
    120  
    121 ! OSMOSIS mixed layer eddy parametrization constants 
    122    INTEGER  ::   nn_osm_mle             ! = 0/1 flag for horizontal average on avt 
    123    REAL(wp) ::   rn_osm_mle_ce           ! MLE coefficient 
    124    !                                        ! parameters used in nn_osm_mle = 0 case 
    125    REAL(wp) ::   rn_osm_mle_lf               ! typical scale of mixed layer front 
    126    REAL(wp) ::   rn_osm_mle_time             ! time scale for mixing momentum across the mixed layer 
    127    !                                        ! parameters used in nn_osm_mle = 1 case 
    128    REAL(wp) ::   rn_osm_mle_lat              ! reference latitude for a 5 km scale of ML front 
    129    LOGICAL  ::   ln_osm_hmle_limit           ! If true arbitrarily restrict hmle to rn_osm_hmle_limit*zmld 
    130    REAL(wp) ::   rn_osm_hmle_limit           ! If ln_osm_hmle_limit true arbitrarily restrict hmle to rn_osm_hmle_limit*zmld 
    131    REAL(wp) ::   rn_osm_mle_rho_c        ! Density criterion for definition of MLD used by FK 
    132    REAL(wp) ::   r5_21 = 5.e0 / 21.e0   ! factor used in mle streamfunction computation 
    133    REAL(wp) ::   rb_c                   ! ML buoyancy criteria = g rho_c /rho0 where rho_c is defined in zdfmld 
    134    REAL(wp) ::   rc_f                   ! MLE coefficient (= rn_ce / (5 km * fo) ) in nn_osm_mle=1 case 
    135    REAL(wp) ::   rn_osm_mle_thresh          ! Threshold buoyancy for deepening of MLE layer below OSBL base. 
    136    REAL(wp) ::   rn_osm_bl_thresh          ! Threshold buoyancy for deepening of OSBL base. 
    137    REAL(wp) ::   rn_osm_mle_tau             ! Adjustment timescale for MLE. 
    138  
    139  
    140    !                                    !!! ** General constants  ** 
    141    REAL(wp) ::   epsln   = 1.0e-20_wp   ! a small positive number to ensure no div by zero 
    142    REAL(wp) ::   depth_tol = 1.0e-6_wp  ! a small-ish positive number to give a hbl slightly shallower than gdepw 
    143    REAL(wp) ::   pthird  = 1._wp/3._wp  ! 1/3 
    144    REAL(wp) ::   p2third = 2._wp/3._wp  ! 2/3 
    145  
    146    INTEGER :: idebug = 236 
    147    INTEGER :: jdebug = 228 
     91   ! Public subroutines 
     92   PUBLIC zdf_osm        ! Routine called by step.F90 
     93   PUBLIC zdf_osm_init   ! Routine called by nemogcm.F90 
     94   PUBLIC osm_rst        ! Routine called by step.F90 
     95   PUBLIC tra_osm        ! Routine called by step.F90 
     96   PUBLIC trc_osm        ! Routine called by trcstp.F90 
     97   PUBLIC dyn_osm        ! Routine called by step.F90 
     98 
     99   ! Public variables 
     100   LOGICAL,  PUBLIC                                      ::   ln_osm_mle   !: Flag to activate the Mixed Layer Eddy (MLE) 
     101   !                                                                       !     parameterisation, needed by tra_mle_init in 
     102   !                                                                       !     tramle.F90 
     103   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamu        !: Non-local u-momentum flux 
     104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamv        !: Non-local v-momentum flux 
     105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamt        !: Non-local temperature flux (gamma/<ws>o) 
     106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghams        !: Non-local salinity flux (gamma/<ws>o) 
     107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hbl          !: Boundary layer depth 
     108   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hml          !: ML depth 
     109   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hmle         !: Depth of layer affexted by mixed layer eddies in Fox-Kemper parametrization 
     110   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdx_mle     !: Zonal buoyancy gradient in ML 
     111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdy_mle     !: Meridional buoyancy gradient in ML 
     112   INTEGER,  PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mld_prof     !: Level of base of MLE layer 
     113 
     114   INTERFACE zdf_osm_velocity_rotation 
     115      !!--------------------------------------------------------------------- 
     116      !!              ***  INTERFACE zdf_velocity_rotation  *** 
     117      !!--------------------------------------------------------------------- 
     118      MODULE PROCEDURE zdf_osm_velocity_rotation_2d 
     119      MODULE PROCEDURE zdf_osm_velocity_rotation_3d 
     120   END INTERFACE 
     121   ! 
     122   INTERFACE zdf_osm_iomput 
     123      !!--------------------------------------------------------------------- 
     124      !!                 ***  INTERFACE zdf_osm_iomput  *** 
     125      !!--------------------------------------------------------------------- 
     126      MODULE PROCEDURE zdf_osm_iomput_2d 
     127      MODULE PROCEDURE zdf_osm_iomput_3d 
     128   END INTERFACE 
     129 
     130   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   etmean      ! Averaging operator for avt 
     131   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dh          ! Depth of pycnocline 
     132   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   r1_ft       ! Inverse of the modified Coriolis parameter at t-pts 
     133   ! Layer indices 
     134   INTEGER,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   nbld        ! Level of boundary layer base 
     135   INTEGER,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   nmld        ! Level of mixed-layer depth (pycnocline top) 
     136   ! Layer type 
     137   INTEGER,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   n_ddh       ! Type of shear layer 
     138   !                                                              !    n_ddh=0: active shear layer 
     139   !                                                              !    n_ddh=1: shear layer not active 
     140   !                                                              !    n_ddh=2: shear production low 
     141   ! Layer flags 
     142   LOGICAL,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   l_conv      ! Unstable/stable bl 
     143   LOGICAL,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   l_shear     ! Shear layers 
     144   LOGICAL,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   l_coup      ! Coupling to bottom 
     145   LOGICAL,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   l_pyc       ! OSBL pycnocline present 
     146   LOGICAL,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   l_flux      ! Surface flux extends below OSBL into MLE layer 
     147   LOGICAL,  ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   l_mle       ! MLE layer increases in hickness. 
     148   ! Scales 
     149   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swth0       ! Surface heat flux (Kinematic) 
     150   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   sws0        ! Surface freshwater flux 
     151   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swb0        ! Surface buoyancy flux 
     152   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   suw0        ! Surface u-momentum flux 
     153   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   sustar      ! Friction velocity 
     154   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   scos_wind   ! Cos angle of surface stress 
     155   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ssin_wind   ! Sin angle of surface stress 
     156   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swthav      ! Heat flux - bl average 
     157   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swsav       ! Freshwater flux - bl average 
     158   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swbav       ! Buoyancy flux - bl average 
     159   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   sustke      ! Surface Stokes drift 
     160   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dstokes     ! Penetration depth of the Stokes drift 
     161   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swstrl      ! Langmuir velocity scale 
     162   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   swstrc      ! Convective velocity scale 
     163   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   sla         ! Trubulent Langmuir number 
     164   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   svstr       ! Velocity scale that tends to sustar for large Langmuir number 
     165   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   shol        ! Stability parameter for boundary layer 
     166   ! Layer averages: BL 
     167   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_t_bl     ! Temperature average 
     168   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_s_bl     ! Salinity average 
     169   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_u_bl     ! Velocity average (u) 
     170   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_v_bl     ! Velocity average (v) 
     171   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_b_bl     ! Buoyancy average 
     172   ! Difference between layer average and parameter at the base of the layer: BL 
     173   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_dt_bl    ! Temperature difference 
     174   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_ds_bl    ! Salinity difference 
     175   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_du_bl    ! Velocity difference (u) 
     176   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_dv_bl    ! Velocity difference (v) 
     177   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_db_bl    ! Buoyancy difference 
     178   ! Layer averages: ML 
     179   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_t_ml     ! Temperature average 
     180   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_s_ml     ! Salinity average 
     181   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_u_ml     ! Velocity average (u) 
     182   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_v_ml     ! Velocity average (v) 
     183   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_b_ml     ! Buoyancy average 
     184   ! Difference between layer average and parameter at the base of the layer: ML 
     185   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_dt_ml    ! Temperature difference 
     186   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_ds_ml    ! Salinity difference 
     187   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_du_ml    ! Velocity difference (u) 
     188   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_dv_ml    ! Velocity difference (v) 
     189   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_db_ml    ! Buoyancy difference 
     190   ! Layer averages: MLE 
     191   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_t_mle    ! Temperature average 
     192   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_s_mle    ! Salinity average 
     193   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_u_mle    ! Velocity average (u) 
     194   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_v_mle    ! Velocity average (v) 
     195   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   av_b_mle    ! Buoyancy average 
     196   ! Diagnostic output 
     197   REAL(WP), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   osmdia2d    ! Auxiliary array for diagnostic output 
     198   REAL(WP), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   osmdia3d    ! Auxiliary array for diagnostic output 
     199   LOGICAL  ::   ln_dia_pyc_scl = .FALSE.                         ! Output of pycnocline scalar-gradient profiles 
     200   LOGICAL  ::   ln_dia_pyc_shr = .FALSE.                         ! Output of pycnocline velocity-shear  profiles 
     201 
     202   !                                               !!* namelist namzdf_osm * 
     203   LOGICAL  ::   ln_use_osm_la                      ! Use namelist rn_osm_la 
     204   REAL(wp) ::   rn_osm_la                          ! Turbulent Langmuir number 
     205   REAL(wp) ::   rn_osm_dstokes                     ! Depth scale of Stokes drift 
     206   REAL(wp) ::   rn_zdfosm_adjust_sd   = 1.0_wp     ! Factor to reduce Stokes drift by 
     207   REAL(wp) ::   rn_osm_hblfrac        = 0.1_wp     ! For nn_osm_wave = 3/4 specify fraction in top of hbl 
     208   LOGICAL  ::   ln_zdfosm_ice_shelter              ! Flag to activate ice sheltering 
     209   REAL(wp) ::   rn_osm_hbl0           = 10.0_wp    ! Initial value of hbl for 1D runs 
     210   INTEGER  ::   nn_ave                             ! = 0/1 flag for horizontal average on avt 
     211   INTEGER  ::   nn_osm_wave = 0                    ! = 0/1/2 flag for getting stokes drift from La# / PM wind-waves/Inputs into 
     212   !                                                !    sbcwave 
     213   INTEGER  ::   nn_osm_SD_reduce                   ! = 0/1/2 flag for getting effective stokes drift from surface value 
     214   LOGICAL  ::   ln_dia_osm                         ! Use namelist  rn_osm_la 
     215   LOGICAL  ::   ln_kpprimix           = .TRUE.     ! Shear instability mixing 
     216   REAL(wp) ::   rn_riinfty            = 0.7_wp     ! Local Richardson Number limit for shear instability 
     217   REAL(wp) ::   rn_difri              = 0.005_wp   ! Maximum shear mixing at Rig = 0    (m2/s) 
     218   LOGICAL  ::   ln_convmix            = .TRUE.     ! Convective instability mixing 
     219   REAL(wp) ::   rn_difconv            = 1.0_wp     ! Diffusivity when unstable below BL  (m2/s) 
     220   ! OSMOSIS mixed layer eddy parametrization constants 
     221   INTEGER  ::   nn_osm_mle                         ! = 0/1 flag for horizontal average on avt 
     222   REAL(wp) ::   rn_osm_mle_ce                      ! MLE coefficient 
     223   !    Parameters used in nn_osm_mle = 0 case 
     224   REAL(wp) ::   rn_osm_mle_lf                      ! Typical scale of mixed layer front 
     225   REAL(wp) ::   rn_osm_mle_time                    ! Time scale for mixing momentum across the mixed layer 
     226   !    Parameters used in nn_osm_mle = 1 case 
     227   REAL(wp) ::   rn_osm_mle_lat                     ! Reference latitude for a 5 km scale of ML front 
     228   LOGICAL  ::   ln_osm_hmle_limit                  ! If true arbitrarily restrict hmle to rn_osm_hmle_limit*zmld 
     229   REAL(wp) ::   rn_osm_hmle_limit                  ! If ln_osm_hmle_limit true arbitrarily restrict hmle to rn_osm_hmle_limit*zmld 
     230   REAL(wp) ::   rn_osm_mle_rho_c                   ! Density criterion for definition of MLD used by FK 
     231   REAL(wp) ::   rb_c                               ! ML buoyancy criteria = g rho_c /rho0 where rho_c is defined in zdfmld 
     232   REAL(wp) ::   rc_f                               ! MLE coefficient (= rn_ce / (5 km * fo) ) in nn_osm_mle=1 case 
     233   REAL(wp) ::   rn_osm_mle_thresh                  ! Threshold buoyancy for deepening of MLE layer below OSBL base 
     234   REAL(wp) ::   rn_osm_bl_thresh                   ! Threshold buoyancy for deepening of OSBL base 
     235   REAL(wp) ::   rn_osm_mle_tau                     ! Adjustment timescale for MLE 
     236 
     237   ! General constants 
     238   REAL(wp) ::   epsln     = 1.0e-20_wp      ! A small positive number to ensure no div by zero 
     239   REAL(wp) ::   depth_tol = 1.0e-6_wp       ! A small-ish positive number to give a hbl slightly shallower than gdepw 
     240   REAL(wp) ::   pthird    = 1.0_wp/3.0_wp   ! 1/3 
     241   REAL(wp) ::   p2third   = 2.0_wp/3.0_wp   ! 2/3 
    148242 
    149243   !! * Substitutions 
     
    162256      !!                 ***  FUNCTION zdf_osm_alloc  *** 
    163257      !!---------------------------------------------------------------------- 
    164      ALLOCATE( ghamu(jpi,jpj,jpk), ghamv(jpi,jpj,jpk), ghamt(jpi,jpj,jpk),ghams(jpi,jpj,jpk), & 
    165           &       hbl(jpi,jpj), dh(jpi,jpj), hml(jpi,jpj), dstokes(jpi, jpj), & 
    166           &       etmean(jpi,jpj,jpk), STAT= zdf_osm_alloc ) 
    167  
    168      ALLOCATE(  hmle(jpi,jpj), r1_ft(jpi,jpj), dbdx_mle(jpi,jpj), dbdy_mle(jpi,jpj), & 
    169           &       mld_prof(jpi,jpj), STAT= zdf_osm_alloc ) 
    170  
    171      CALL mpp_sum ( 'zdfosm', zdf_osm_alloc ) 
    172      IF( zdf_osm_alloc /= 0 )   CALL ctl_warn('zdf_osm_alloc: failed to allocate zdf_osm arrays') 
    173  
     258      INTEGER ::   ierr 
     259      !!---------------------------------------------------------------------- 
     260      ! 
     261      zdf_osm_alloc = 0 
     262      ! 
     263      ALLOCATE( ghamu(jpi,jpj,jpk), ghamv(jpi,jpj,jpk), ghamt(jpi,jpj,jpk), ghams(jpi,jpj,jpk), hbl(jpi,jpj), hml(jpi,jpj),   & 
     264         &      hmle(jpi,jpj),      dbdx_mle(jpi,jpj),  dbdy_mle(jpi,jpj),  mld_prof(jpi,jpj),  STAT=ierr ) 
     265      zdf_osm_alloc = zdf_osm_alloc + ierr 
     266      ! 
     267      ALLOCATE( etmean(A2D(nn_hls-1),jpk), dh(jpi,jpj), r1_ft(A2D(nn_hls-1)), STAT=ierr ) 
     268      zdf_osm_alloc = zdf_osm_alloc + ierr 
     269      ! 
     270      ALLOCATE( nbld(jpi,jpj), nmld(A2D(nn_hls-1)), STAT=ierr ) 
     271      zdf_osm_alloc = zdf_osm_alloc + ierr 
     272      ! 
     273      ALLOCATE( n_ddh(A2D(nn_hls-1)), STAT=ierr ) 
     274      zdf_osm_alloc = zdf_osm_alloc + ierr 
     275      ! 
     276      ALLOCATE( l_conv(A2D(nn_hls-1)), l_shear(A2D(nn_hls-1)), l_coup(A2D(nn_hls-1)), l_pyc(A2D(nn_hls-1)),   & 
     277         &      l_flux(A2D(nn_hls-1)), l_mle(A2D(nn_hls-1)),   STAT=ierr ) 
     278      zdf_osm_alloc = zdf_osm_alloc + ierr 
     279      ! 
     280      ALLOCATE( swth0(A2D(nn_hls-1)),  sws0(A2D(nn_hls-1)),      swb0(A2D(nn_hls-1)),      suw0(A2D(nn_hls-1)),      & 
     281         &      sustar(A2D(nn_hls-1)), scos_wind(A2D(nn_hls-1)), ssin_wind(A2D(nn_hls-1)), swthav(A2D(nn_hls-1)),    & 
     282         &      swsav(A2D(nn_hls-1)),  swbav(A2D(nn_hls-1)),     sustke(A2D(nn_hls-1)),    dstokes(A2D(nn_hls-1)),   & 
     283         &      swstrl(A2D(nn_hls-1)), swstrc(A2D(nn_hls-1)),    sla(A2D(nn_hls-1)),       svstr(A2D(nn_hls-1)),     & 
     284         &      shol(A2D(nn_hls-1)),   STAT=ierr ) 
     285      zdf_osm_alloc = zdf_osm_alloc + ierr 
     286      ! 
     287      ALLOCATE( av_t_bl(jpi,jpj), av_s_bl(jpi,jpj), av_u_bl(jpi,jpj), av_v_bl(jpi,jpj),   & 
     288         &      av_b_bl(jpi,jpj), STAT=ierr) 
     289      zdf_osm_alloc = zdf_osm_alloc + ierr 
     290      ! 
     291      ALLOCATE( av_dt_bl(jpi,jpj), av_ds_bl(jpi,jpj), av_du_bl(jpi,jpj), av_dv_bl(jpi,jpj),   & 
     292         &      av_db_bl(jpi,jpj), STAT=ierr) 
     293      zdf_osm_alloc = zdf_osm_alloc + ierr 
     294      ! 
     295      ALLOCATE( av_t_ml(jpi,jpj), av_s_ml(jpi,jpj), av_u_ml(jpi,jpj), av_v_ml(jpi,jpj),   & 
     296         &      av_b_ml(jpi,jpj), STAT=ierr) 
     297      zdf_osm_alloc = zdf_osm_alloc + ierr 
     298      ! 
     299      ALLOCATE( av_dt_ml(jpi,jpj), av_ds_ml(jpi,jpj), av_du_ml(jpi,jpj), av_dv_ml(jpi,jpj),   & 
     300         &      av_db_ml(jpi,jpj), STAT=ierr) 
     301      zdf_osm_alloc = zdf_osm_alloc + ierr 
     302      ! 
     303      ALLOCATE( av_t_mle(jpi,jpj), av_s_mle(jpi,jpj), av_u_mle(jpi,jpj), av_v_mle(jpi,jpj),   & 
     304         &      av_b_mle(jpi,jpj), STAT=ierr) 
     305      zdf_osm_alloc = zdf_osm_alloc + ierr 
     306      ! 
     307      IF ( ln_dia_osm ) THEN 
     308         ALLOCATE( osmdia2d(jpi,jpj), osmdia3d(jpi,jpj,jpk), STAT=ierr ) 
     309         zdf_osm_alloc = zdf_osm_alloc + ierr 
     310      END IF 
     311      ! 
     312      CALL mpp_sum ( 'zdfosm', zdf_osm_alloc ) 
     313      IF( zdf_osm_alloc /= 0 ) CALL ctl_warn( 'zdf_osm_alloc: failed to allocate zdf_osm arrays' ) 
     314      ! 
    174315   END FUNCTION zdf_osm_alloc 
    175316 
    176  
    177    SUBROUTINE zdf_osm( kt, Kbb, Kmm, Krhs, p_avm, p_avt ) 
     317   SUBROUTINE zdf_osm( kt, Kbb, Kmm, Krhs, p_avm,   & 
     318      &                p_avt ) 
    178319      !!---------------------------------------------------------------------- 
    179320      !!                   ***  ROUTINE zdf_osm  *** 
     
    210351      !!         the equation number. (LMD94, here after) 
    211352      !!---------------------------------------------------------------------- 
    212       INTEGER                   , INTENT(in   ) ::  kt             ! ocean time step 
    213       INTEGER                   , INTENT(in   ) ::  Kbb, Kmm, Krhs ! ocean time level indices 
    214       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::  p_avm, p_avt   ! momentum and tracer Kz (w-points) 
    215       !! 
    216       INTEGER ::   ji, jj, jk                   ! dummy loop indices 
    217  
    218       INTEGER ::   jl                   ! dummy loop indices 
    219  
    220       INTEGER ::   ikbot, jkmax, jkm1, jkp2     ! 
    221  
    222       REAL(wp) ::   ztx, zty, zflageos, zstabl, zbuofdep,zucube      ! 
    223       REAL(wp) ::   zbeta, zthermal                                  ! 
    224       REAL(wp) ::   zehat, zeta, zhrib, zsig, zscale, zwst, zws, zwm ! Velocity scales 
    225       REAL(wp) ::   zwsun, zwmun, zcons, zconm, zwcons, zwconm       ! 
    226       REAL(wp) ::   zsr, zbw, ze, zb, zd, zc, zaw, za, zb1, za1, zkw, zk0, zcomp , zrhd,zrhdr,zbvzed   ! In situ density 
    227       INTEGER  ::   jm                          ! dummy loop indices 
    228       REAL(wp) ::   zr1, zr2, zr3, zr4, zrhop   ! Compression terms 
    229       REAL(wp) ::   zflag, zrn2, zdep21, zdep32, zdep43 
    230       REAL(wp) ::   zesh2, zri, zfri            ! Interior richardson mixing 
    231       REAL(wp) ::   zdelta, zdelta2, zdzup, zdzdn, zdzh, zvath, zgat1, zdat1, zkm1m, zkm1t 
    232       REAL(wp) :: zt,zs,zu,zv,zrh               ! variables used in constructing averages 
    233 ! Scales 
    234       REAL(wp), DIMENSION(jpi,jpj) :: zrad0     ! Surface solar temperature flux (deg m/s) 
    235       REAL(wp), DIMENSION(jpi,jpj) :: zradh     ! Radiative flux at bl base (Buoyancy units) 
    236       REAL(wp), DIMENSION(jpi,jpj) :: zradav    ! Radiative flux, bl average (Buoyancy Units) 
    237       REAL(wp), DIMENSION(jpi,jpj) :: zustar    ! friction velocity 
    238       REAL(wp), DIMENSION(jpi,jpj) :: zwstrl    ! Langmuir velocity scale 
    239       REAL(wp), DIMENSION(jpi,jpj) :: zvstr     ! Velocity scale that ends to zustar for large Langmuir number. 
    240       REAL(wp), DIMENSION(jpi,jpj) :: zwstrc    ! Convective velocity scale 
    241       REAL(wp), DIMENSION(jpi,jpj) :: zuw0      ! Surface u-momentum flux 
    242       REAL(wp), DIMENSION(jpi,jpj) :: zvw0      ! Surface v-momentum flux 
    243       REAL(wp), DIMENSION(jpi,jpj) :: zwth0     ! Surface heat flux (Kinematic) 
    244       REAL(wp), DIMENSION(jpi,jpj) :: zws0      ! Surface freshwater flux 
    245       REAL(wp), DIMENSION(jpi,jpj) :: zwb0      ! Surface buoyancy flux 
    246       REAL(wp), DIMENSION(jpi,jpj) :: zwthav    ! Heat flux - bl average 
    247       REAL(wp), DIMENSION(jpi,jpj) :: zwsav     ! freshwater flux - bl average 
    248       REAL(wp), DIMENSION(jpi,jpj) :: zwbav     ! Buoyancy flux - bl average 
    249       REAL(wp), DIMENSION(jpi,jpj) :: zwb_ent   ! Buoyancy entrainment flux 
    250       REAL(wp), DIMENSION(jpi,jpj) :: zwb_min 
    251  
    252  
    253       REAL(wp), DIMENSION(jpi,jpj) :: zwb_fk_b  ! MLE buoyancy flux averaged over OSBL 
    254       REAL(wp), DIMENSION(jpi,jpj) :: zwb_fk    ! max MLE buoyancy flux 
    255       REAL(wp), DIMENSION(jpi,jpj) :: zdiff_mle ! extra MLE vertical diff 
    256       REAL(wp), DIMENSION(jpi,jpj) :: zvel_mle  ! velocity scale for dhdt with stable ML and FK 
    257  
    258       REAL(wp), DIMENSION(jpi,jpj) :: zustke    ! Surface Stokes drift 
    259       REAL(wp), DIMENSION(jpi,jpj) :: zla       ! Trubulent Langmuir number 
    260       REAL(wp), DIMENSION(jpi,jpj) :: zcos_wind ! Cos angle of surface stress 
    261       REAL(wp), DIMENSION(jpi,jpj) :: zsin_wind ! Sin angle of surface stress 
    262       REAL(wp), DIMENSION(jpi,jpj) :: zhol      ! Stability parameter for boundary layer 
    263       LOGICAL, DIMENSION(jpi,jpj)  :: lconv     ! unstable/stable bl 
    264       LOGICAL, DIMENSION(jpi,jpj)  :: lshear    ! Shear layers 
    265       LOGICAL, DIMENSION(jpi,jpj)  :: lpyc      ! OSBL pycnocline present 
    266       LOGICAL, DIMENSION(jpi,jpj)  :: lflux     ! surface flux extends below OSBL into MLE layer. 
    267       LOGICAL, DIMENSION(jpi,jpj)  :: lmle      ! MLE layer increases in hickness. 
    268  
    269       ! mixed-layer variables 
    270  
    271       INTEGER, DIMENSION(jpi,jpj) :: ibld ! level of boundary layer base 
    272       INTEGER, DIMENSION(jpi,jpj) :: imld ! level of mixed-layer depth (pycnocline top) 
    273       INTEGER, DIMENSION(jpi,jpj) :: jp_ext, jp_ext_mle ! offset for external level 
    274       INTEGER, DIMENSION(jpi, jpj) :: j_ddh ! Type of shear layer 
    275  
    276       REAL(wp) :: ztgrad,zsgrad,zbgrad ! Temporary variables used to calculate pycnocline gradients 
    277       REAL(wp) :: zugrad,zvgrad        ! temporary variables for calculating pycnocline shear 
    278  
    279       REAL(wp), DIMENSION(jpi,jpj) :: zhbl  ! bl depth - grid 
    280       REAL(wp), DIMENSION(jpi,jpj) :: zhml  ! ml depth - grid 
    281  
    282       REAL(wp), DIMENSION(jpi,jpj) :: zhmle ! MLE depth - grid 
    283       REAL(wp), DIMENSION(jpi,jpj) :: zmld  ! ML depth on grid 
    284  
    285       REAL(wp), DIMENSION(jpi,jpj) :: zdh   ! pycnocline depth - grid 
    286       REAL(wp), DIMENSION(jpi,jpj) :: zdhdt ! BL depth tendency 
    287       REAL(wp), DIMENSION(jpi,jpj) :: zddhdt                                    ! correction to dhdt due to internal structure. 
    288       REAL(wp), DIMENSION(jpi,jpj) :: zdtdz_bl_ext,zdsdz_bl_ext,zdbdz_bl_ext              ! external temperature/salinity and buoyancy gradients 
    289       REAL(wp), DIMENSION(jpi,jpj) :: zdtdz_mle_ext,zdsdz_mle_ext,zdbdz_mle_ext              ! external temperature/salinity and buoyancy gradients 
    290       REAL(wp), DIMENSION(jpi,jpj) :: zdtdx, zdtdy, zdsdx, zdsdy      ! horizontal gradients for Fox-Kemper parametrization. 
    291  
    292       REAL(wp), DIMENSION(jpi,jpj) :: zt_bl,zs_bl,zu_bl,zv_bl,zb_bl  ! averages over the depth of the blayer 
    293       REAL(wp), DIMENSION(jpi,jpj) :: zt_ml,zs_ml,zu_ml,zv_ml,zb_ml  ! averages over the depth of the mixed layer 
    294       REAL(wp), DIMENSION(jpi,jpj) :: zt_mle,zs_mle,zu_mle,zv_mle,zb_mle  ! averages over the depth of the MLE layer 
    295       REAL(wp), DIMENSION(jpi,jpj) :: zdt_bl,zds_bl,zdu_bl,zdv_bl,zdb_bl ! difference between blayer average and parameter at base of blayer 
    296       REAL(wp), DIMENSION(jpi,jpj) :: zdt_ml,zds_ml,zdu_ml,zdv_ml,zdb_ml ! difference between mixed layer average and parameter at base of blayer 
    297       REAL(wp), DIMENSION(jpi,jpj) :: zdt_mle,zds_mle,zdu_mle,zdv_mle,zdb_mle ! difference between MLE layer average and parameter at base of blayer 
    298 !      REAL(wp), DIMENSION(jpi,jpj) :: zwth_ent,zws_ent ! heat and salinity fluxes at the top of the pycnocline 
    299       REAL(wp) :: zwth_ent,zws_ent ! heat and salinity fluxes at the top of the pycnocline 
    300       REAL(wp) :: zuw_bse,zvw_bse  ! momentum fluxes at the top of the pycnocline 
    301       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdtdz_pyc    ! parametrized gradient of temperature in pycnocline 
    302       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdsdz_pyc    ! parametrised gradient of salinity in pycnocline 
    303       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdbdz_pyc    ! parametrised gradient of buoyancy in the pycnocline 
    304       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdudz_pyc    ! u-shear across the pycnocline 
    305       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdvdz_pyc    ! v-shear across the pycnocline 
    306       REAL(wp), DIMENSION(jpi,jpj) :: zdbds_mle    ! Magnitude of horizontal buoyancy gradient. 
    307       ! Flux-gradient relationship variables 
    308       REAL(wp), DIMENSION(jpi, jpj) :: zshear, zri_i ! Shear production and interfacial richardon number. 
    309  
    310       REAL(wp) :: zl_c,zl_l,zl_eps  ! Used to calculate turbulence length scale. 
    311  
    312       REAL(wp) :: za_cubic, zb_cubic, zc_cubic, zd_cubic ! coefficients in cubic polynomial specifying diffusivity in pycnocline. 
    313       REAL(wp), DIMENSION(jpi,jpj) :: zsc_wth_1,zsc_ws_1 ! Temporary scales used to calculate scalar non-gradient terms. 
    314       REAL(wp), DIMENSION(jpi,jpj) :: zsc_wth_pyc, zsc_ws_pyc ! Scales for pycnocline transport term/ 
    315       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. 
    316       REAL(wp), DIMENSION(jpi,jpj) :: zhbl_t ! holds boundary layer depth updated by full timestep 
    317  
    318       ! For calculating Ri#-dependent mixing 
    319       REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3du   ! u-shear^2 
    320       REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3dv   ! v-shear^2 
    321       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zrimix ! spatial form of ri#-induced diffusion 
    322  
    323       ! Temporary variables 
    324       INTEGER :: inhml 
    325       REAL(wp) :: znd,znd_d,zznd_ml,zznd_pyc,zznd_d ! temporary non-dimensional depths used in various routines 
    326       REAL(wp) :: ztemp, zari, zpert, zzdhdt, zdb   ! temporary variables 
    327       REAL(wp) :: zthick, zz0, zz1 ! temporary variables 
    328       REAL(wp) :: zvel_max, zhbl_s ! temporary variables 
    329       REAL(wp) :: zfac, ztmp       ! temporary variable 
    330       REAL(wp) :: zus_x, zus_y     ! temporary Stokes drift 
    331       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zviscos ! viscosity 
    332       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdiffut ! t-diffusivity 
    333       REAL(wp), DIMENSION(jpi,jpj) :: zalpha_pyc 
    334       REAL(wp), DIMENSION(jpi,jpj) :: ztau_sc_u ! dissipation timescale at baes of WML. 
    335       REAL(wp) :: zdelta_pyc, zwt_pyc_sc_1, zws_pyc_sc_1, zzeta_pyc 
    336       REAL(wp) :: zbuoy_pyc_sc, zomega, zvw_max 
    337       INTEGER :: ibld_ext=0                          ! does not have to be zero for modified scheme 
    338       REAL(wp) :: zgamma_b_nd, zgamma_b, zdhoh, ztau 
    339       REAL(wp) :: zzeta_s = 0._wp 
    340       REAL(wp) :: zzeta_v = 0.46 
    341       REAL(wp) :: zabsstke 
    342       REAL(wp) :: zsqrtpi, z_two_thirds, zproportion, ztransp, zthickness 
    343       REAL(wp) :: z2k_times_thickness, zsqrt_depth, zexp_depth, zdstokes0, zf, zexperfc 
    344  
    345       ! For debugging 
    346       INTEGER :: ikt 
    347       !!-------------------------------------------------------------------- 
    348       ! 
    349       ibld(:,:)   = 0     ; imld(:,:)  = 0 
    350       zrad0(:,:)  = 0._wp ; zradh(:,:) = 0._wp ; zradav(:,:)    = 0._wp ; zustar(:,:)    = 0._wp 
    351       zwstrl(:,:) = 0._wp ; zvstr(:,:) = 0._wp ; zwstrc(:,:)    = 0._wp ; zuw0(:,:)      = 0._wp 
    352       zvw0(:,:)   = 0._wp ; zwth0(:,:) = 0._wp ; zws0(:,:)      = 0._wp ; zwb0(:,:)      = 0._wp 
    353       zwthav(:,:) = 0._wp ; zwsav(:,:) = 0._wp ; zwbav(:,:)     = 0._wp ; zwb_ent(:,:)   = 0._wp 
    354       zustke(:,:) = 0._wp ; zla(:,:)   = 0._wp ; zcos_wind(:,:) = 0._wp ; zsin_wind(:,:) = 0._wp 
    355       zhol(:,:)   = 0._wp 
    356       lconv(:,:)  = .FALSE.; lpyc(:,:) = .FALSE. ; lflux(:,:) = .FALSE. ;  lmle(:,:) = .FALSE. 
    357       ! mixed layer 
    358       ! no initialization of zhbl or zhml (or zdh?) 
    359       zhbl(:,:)    = 1._wp ; zhml(:,:)    = 1._wp ; zdh(:,:)      = 1._wp ; zdhdt(:,:)   = 0._wp 
    360       zt_bl(:,:)   = 0._wp ; zs_bl(:,:)   = 0._wp ; zu_bl(:,:)    = 0._wp 
    361       zv_bl(:,:)   = 0._wp ; zb_bl(:,:)  = 0._wp 
    362       zt_ml(:,:)   = 0._wp ; zs_ml(:,:)    = 0._wp ; zu_ml(:,:)   = 0._wp 
    363       zt_mle(:,:)   = 0._wp ; zs_mle(:,:)    = 0._wp ; zu_mle(:,:)   = 0._wp 
    364       zb_mle(:,:) = 0._wp 
    365       zv_ml(:,:)   = 0._wp ; zdt_bl(:,:)   = 0._wp ; zds_bl(:,:)  = 0._wp 
    366       zdu_bl(:,:)  = 0._wp ; zdv_bl(:,:)  = 0._wp ; zdb_bl(:,:)  = 0._wp 
    367       zdt_ml(:,:)  = 0._wp ; zds_ml(:,:)  = 0._wp ; zdu_ml(:,:)   = 0._wp ; zdv_ml(:,:)  = 0._wp 
    368       zdb_ml(:,:)  = 0._wp 
    369       zdt_mle(:,:)  = 0._wp ; zds_mle(:,:)  = 0._wp ; zdu_mle(:,:)   = 0._wp 
    370       zdv_mle(:,:)  = 0._wp ; zdb_mle(:,:)  = 0._wp 
    371       zwth_ent = 0._wp ; zws_ent = 0._wp 
    372       ! 
    373       zdtdz_pyc(:,:,:) = 0._wp ; zdsdz_pyc(:,:,:) = 0._wp ; zdbdz_pyc(:,:,:) = 0._wp 
    374       zdudz_pyc(:,:,:) = 0._wp ; zdvdz_pyc(:,:,:) = 0._wp 
    375       ! 
    376       zdtdz_bl_ext(:,:) = 0._wp ; zdsdz_bl_ext(:,:) = 0._wp ; zdbdz_bl_ext(:,:) = 0._wp 
    377  
    378       IF ( ln_osm_mle ) THEN  ! only initialise arrays if needed 
    379          zdtdx(:,:) = 0._wp ; zdtdy(:,:) = 0._wp ; zdsdx(:,:) = 0._wp 
    380          zdsdy(:,:) = 0._wp ; dbdx_mle(:,:) = 0._wp ; dbdy_mle(:,:) = 0._wp 
    381          zwb_fk(:,:) = 0._wp ; zvel_mle(:,:) = 0._wp; zdiff_mle(:,:) = 0._wp 
    382          zhmle(:,:) = 0._wp  ; zmld(:,:) = 0._wp 
     353      INTEGER                   , INTENT(in   ) ::  kt               ! Ocean time step 
     354      INTEGER                   , INTENT(in   ) ::  Kbb, Kmm, Krhs   ! Ocean time level indices 
     355      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::  p_avm, p_avt     ! Momentum and tracer Kz (w-points) 
     356      !! 
     357      INTEGER ::   ji, jj, jk, jl, jm, jkflt   ! Dummy loop indices 
     358      !! 
     359      REAL(wp) ::   zthermal, zbeta 
     360      REAL(wp) ::   zesh2, zri, zfri   ! Interior Richardson mixing 
     361      !! Scales 
     362      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zrad0       ! Surface solar temperature flux (deg m/s) 
     363      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zradh       ! Radiative flux at bl base (Buoyancy units) 
     364      REAL(wp)                           ::   zradav      ! Radiative flux, bl average (Buoyancy Units) 
     365      REAL(wp)                           ::   zvw0        ! Surface v-momentum flux 
     366      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb0tot     ! Total surface buoyancy flux including insolation 
     367      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_ent     ! Buoyancy entrainment flux 
     368      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_min 
     369      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_fk_b    ! MLE buoyancy flux averaged over OSBL 
     370      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwb_fk      ! Max MLE buoyancy flux 
     371      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdiff_mle   ! Extra MLE vertical diff 
     372      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zvel_mle    ! Velocity scale for dhdt with stable ML and FK 
     373      !! Mixed-layer variables 
     374      INTEGER,  DIMENSION(A2D(nn_hls-1)) ::   jk_nlev  ! Number of levels 
     375      INTEGER,  DIMENSION(A2D(nn_hls-1)) ::   jk_ext   ! Offset for external level 
     376      !! 
     377      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhbl   ! BL depth - grid 
     378      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhml   ! ML depth - grid 
     379      !! 
     380      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhmle   ! MLE depth - grid 
     381      REAL(wp), DIMENSION(A2D(nn_hls))   ::   zmld    ! ML depth on grid 
     382      !! 
     383      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdh                          ! Pycnocline depth - grid 
     384      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdhdt                        ! BL depth tendency 
     385      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdtdz_bl_ext, zdsdz_bl_ext   ! External temperature/salinity gradients 
     386      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdbdz_bl_ext                 ! External buoyancy gradients 
     387      REAL(wp), DIMENSION(A2D(nn_hls))   ::   zdtdx, zdtdy, zdsdx, zdsdy   ! Horizontal gradients for Fox-Kemper parametrization 
     388      !! 
     389      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdbds_mle   ! Magnitude of horizontal buoyancy gradient 
     390      !! Flux-gradient relationship variables 
     391      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zshear   ! Shear production 
     392      !! 
     393      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zhbl_t   ! Holds boundary layer depth updated by full timestep 
     394      !! For calculating Ri#-dependent mixing 
     395      REAL(wp), DIMENSION(A2D(nn_hls)) ::   z2du     ! u-shear^2 
     396      REAL(wp), DIMENSION(A2D(nn_hls)) ::   z2dv     ! v-shear^2 
     397      REAL(wp)                         ::   zrimix   ! Spatial form of ri#-induced diffusion 
     398      !! Temporary variables 
     399      REAL(wp)                                 ::   znd              ! Temporary non-dimensional depth 
     400      REAL(wp)                                 ::   zz0, zz1, zfac 
     401      REAL(wp)                                 ::   zus_x, zus_y     ! Temporary Stokes drift 
     402      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk)   ::   zviscos          ! Viscosity 
     403      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk)   ::   zdiffut          ! t-diffusivity 
     404      REAL(wp)                                 ::   zabsstke 
     405      REAL(wp)                                 ::   zsqrtpi, z_two_thirds, zthickness 
     406      REAL(wp)                                 ::   z2k_times_thickness, zsqrt_depth, zexp_depth, zf, zexperfc 
     407      !! For debugging 
     408      REAL(wp), PARAMETER ::   pp_large = -1e10_wp 
     409      !!---------------------------------------------------------------------- 
     410      ! 
     411      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     412         nmld(ji,jj)   = 0 
     413         sustke(ji,jj) = pp_large 
     414         l_pyc(ji,jj)  = .FALSE. 
     415         l_flux(ji,jj) = .FALSE. 
     416         l_mle(ji,jj)  = .FALSE. 
     417      END_2D 
     418      ! Mixed layer 
     419      ! No initialization of zhbl or zhml (or zdh?) 
     420      zhbl(:,:) = pp_large 
     421      zhml(:,:) = pp_large 
     422      zdh(:,:)  = pp_large 
     423      ! 
     424      IF ( ln_osm_mle ) THEN   ! Only initialise arrays if needed 
     425         zdtdx(:,:)  = pp_large ; zdtdy(:,:)    = pp_large ; zdsdx(:,:)     = pp_large 
     426         zdsdy(:,:)  = pp_large 
     427         zwb_fk(:,:) = pp_large ; zvel_mle(:,:) = pp_large 
     428         zhmle(:,:)  = pp_large ; zmld(:,:)     = pp_large 
     429         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 
     430            dbdx_mle(ji,jj) = pp_large 
     431            dbdy_mle(ji,jj) = pp_large 
     432         END_2D 
    383433      ENDIF 
    384       zwb_fk_b(:,:) = 0._wp   ! must be initialised even with ln_osm_mle=F as used in zdf_osm_calculate_dhdt 
    385  
    386       ! Flux-Gradient arrays. 
    387       zsc_wth_1(:,:)  = 0._wp ; zsc_ws_1(:,:)   = 0._wp ; zsc_uw_1(:,:)   = 0._wp 
    388       zsc_uw_2(:,:)   = 0._wp ; zsc_vw_1(:,:)   = 0._wp ; zsc_vw_2(:,:)   = 0._wp 
    389       zhbl_t(:,:)     = 0._wp ; zdhdt(:,:)      = 0._wp 
    390  
    391       zdiffut(:,:,:) = 0._wp ; zviscos(:,:,:) = 0._wp ; ghamt(:,:,:) = 0._wp 
    392       ghams(:,:,:)   = 0._wp ; ghamu(:,:,:)   = 0._wp ; ghamv(:,:,:) = 0._wp 
    393  
    394       zddhdt(:,:) = 0._wp 
    395       ! hbl = MAX(hbl,epsln) 
     434      zhbl_t(:,:)   = pp_large 
     435      ! 
     436      zdiffut(:,:,:) = 0.0_wp 
     437      zviscos(:,:,:) = 0.0_wp 
     438      ! 
     439      DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk ) 
     440         ghamt(ji,jj,jk) = pp_large 
     441         ghams(ji,jj,jk) = pp_large 
     442         ghamu(ji,jj,jk) = pp_large 
     443         ghamv(ji,jj,jk) = pp_large 
     444      END_3D 
     445      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
     446         ghamt(ji,jj,jk) = 0.0_wp 
     447         ghams(ji,jj,jk) = 0.0_wp 
     448         ghamu(ji,jj,jk) = 0.0_wp 
     449         ghamv(ji,jj,jk) = 0.0_wp 
     450      END_3D 
     451      ! 
     452      zdiff_mle(:,:) = 0.0_wp 
     453      ! 
     454      ! Ensure only positive hbl values are accessed when using extended halo 
     455      ! (nn_hls==2) 
     456      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     457         hbl(ji,jj) = MAX( hbl(ji,jj), epsln ) 
     458      END_2D 
     459      ! 
    396460      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    397461      ! Calculate boundary layer scales 
    398462      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    399  
    400       ! Assume two-band radiation model for depth of OSBL 
    401      zz0 =       rn_abs       ! surface equi-partition in 2-bands 
    402      zz1 =  1. - rn_abs 
    403      DO_2D( 0, 0, 0, 0 ) 
    404         ! Surface downward irradiance (so always +ve) 
    405         zrad0(ji,jj) = qsr(ji,jj) * r1_rho0_rcp 
    406         ! Downwards irradiance at base of boundary layer 
    407         zradh(ji,jj) = zrad0(ji,jj) * ( zz0 * EXP( -hbl(ji,jj)/rn_si0 ) + zz1 * EXP( -hbl(ji,jj)/rn_si1) ) 
    408         ! Downwards irradiance averaged over depth of the OSBL 
    409         zradav(ji,jj) = zrad0(ji,jj) * ( zz0 * ( 1.0 - EXP( -hbl(ji,jj)/rn_si0 ) )*rn_si0 & 
    410               &                         + zz1 * ( 1.0 - EXP( -hbl(ji,jj)/rn_si1 ) )*rn_si1 ) / hbl(ji,jj) 
    411      END_2D 
    412      ! Turbulent surface fluxes and fluxes averaged over depth of the OSBL 
    413      DO_2D( 0, 0, 0, 0 ) 
    414         zthermal = rab_n(ji,jj,1,jp_tem) 
    415         zbeta    = rab_n(ji,jj,1,jp_sal) 
    416         ! Upwards surface Temperature flux for non-local term 
    417         zwth0(ji,jj) = - qns(ji,jj) * r1_rho0_rcp * tmask(ji,jj,1) 
    418         ! Upwards surface salinity flux for non-local term 
    419         zws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * ts(ji,jj,1,jp_sal,Kmm)  + sfx(ji,jj) ) * r1_rho0 * tmask(ji,jj,1) 
    420         ! Non radiative upwards surface buoyancy flux 
    421         zwb0(ji,jj) = grav * zthermal * zwth0(ji,jj) -  grav * zbeta * zws0(ji,jj) 
    422         ! turbulent heat flux averaged over depth of OSBL 
    423         zwthav(ji,jj) = 0.5 * zwth0(ji,jj) - ( 0.5*( zrad0(ji,jj) + zradh(ji,jj) ) - zradav(ji,jj) ) 
    424         ! turbulent salinity flux averaged over depth of the OBSL 
    425         zwsav(ji,jj) = 0.5 * zws0(ji,jj) 
    426         ! turbulent buoyancy flux averaged over the depth of the OBSBL 
    427         zwbav(ji,jj) = grav  * zthermal * zwthav(ji,jj) - grav  * zbeta * zwsav(ji,jj) 
    428         ! Surface upward velocity fluxes 
    429         zuw0(ji,jj) = - 0.5 * (utau(ji-1,jj) + utau(ji,jj)) * r1_rho0 * tmask(ji,jj,1) 
    430         zvw0(ji,jj) = - 0.5 * (vtau(ji,jj-1) + vtau(ji,jj)) * r1_rho0 * tmask(ji,jj,1) 
    431         ! Friction velocity (zustar), at T-point : LMD94 eq. 2 
    432         zustar(ji,jj) = MAX( SQRT( SQRT( zuw0(ji,jj) * zuw0(ji,jj) + zvw0(ji,jj) * zvw0(ji,jj) ) ), 1.0e-8 ) 
    433         zcos_wind(ji,jj) = -zuw0(ji,jj) / ( zustar(ji,jj) * zustar(ji,jj) ) 
    434         zsin_wind(ji,jj) = -zvw0(ji,jj) / ( zustar(ji,jj) * zustar(ji,jj) ) 
    435      END_2D 
    436      ! Calculate Stokes drift in direction of wind (zustke) and Stokes penetration depth (dstokes) 
    437      SELECT CASE (nn_osm_wave) 
    438      ! Assume constant La#=0.3 
    439      CASE(0) 
    440         DO_2D( 0, 0, 0, 0 ) 
    441            zus_x = zcos_wind(ji,jj) * zustar(ji,jj) / 0.3**2 
    442            zus_y = zsin_wind(ji,jj) * zustar(ji,jj) / 0.3**2 
    443            ! Linearly 
    444            zustke(ji,jj) = MAX ( SQRT( zus_x*zus_x + zus_y*zus_y), 1.0e-8 ) 
    445            dstokes(ji,jj) = rn_osm_dstokes 
    446         END_2D 
    447      ! Assume Pierson-Moskovitz wind-wave spectrum 
    448      CASE(1) 
    449         DO_2D( 0, 0, 0, 0 ) 
    450            ! Use wind speed wndm included in sbc_oce module 
    451            zustke(ji,jj) =  MAX ( 0.016 * wndm(ji,jj), 1.0e-8 ) 
    452            dstokes(ji,jj) = MAX ( 0.12 * wndm(ji,jj)**2 / grav, 5.e-1) 
    453         END_2D 
    454      ! Use ECMWF wave fields as output from SBCWAVE 
    455      CASE(2) 
    456         zfac =  2.0_wp * rpi / 16.0_wp 
    457  
    458         DO_2D( 0, 0, 0, 0 ) 
    459            IF (hsw(ji,jj) > 1.e-4) THEN 
    460               ! Use  wave fields 
    461               zabsstke = SQRT(ut0sd(ji,jj)**2 + vt0sd(ji,jj)**2) 
    462               zustke(ji,jj) = MAX ( ( zcos_wind(ji,jj) * ut0sd(ji,jj) + zsin_wind(ji,jj)  * vt0sd(ji,jj) ), 1.0e-8) 
    463               dstokes(ji,jj) = MAX (zfac * hsw(ji,jj)*hsw(ji,jj) / ( MAX(zabsstke * wmp(ji,jj), 1.0e-7 ) ), 5.0e-1) 
    464            ELSE 
    465               ! Assume masking issue (e.g. ice in ECMWF reanalysis but not in model run) 
    466               ! .. so default to Pierson-Moskowitz 
    467               zustke(ji,jj) = MAX ( 0.016 * wndm(ji,jj), 1.0e-8 ) 
    468               dstokes(ji,jj) = MAX ( 0.12 * wndm(ji,jj)**2 / grav, 5.e-1) 
    469            END IF 
    470         END_2D 
    471      END SELECT 
    472  
    473      IF (ln_zdfosm_ice_shelter) THEN 
    474         ! Reduce both Stokes drift and its depth scale by ocean fraction to represent sheltering by ice 
    475         DO_2D( 0, 0, 0, 0 ) 
    476            zustke(ji,jj) = zustke(ji,jj) * (1.0_wp - fr_i(ji,jj)) 
    477            dstokes(ji,jj) = dstokes(ji,jj) * (1.0_wp - fr_i(ji,jj)) 
    478         END_2D 
    479      END IF 
    480  
    481      SELECT CASE (nn_osm_SD_reduce) 
    482      ! Reduce surface Stokes drift by a constant factor or following Breivik (2016) + van  Roekel (2012) or Grant (2020). 
    483      CASE(0) 
    484         ! The Langmur number from the ECMWF model (or from PM)  appears to give La<0.3 for wind-driven seas. 
    485         !    The coefficient rn_zdfosm_adjust_sd = 0.8 gives La=0.3  in this situation. 
    486         ! It could represent the effects of the spread of wave directions 
    487         ! around the mean wind. The effect of this adjustment needs to be tested. 
    488         IF(nn_osm_wave > 0) THEN 
    489            zustke(2:jpim1,2:jpjm1) = rn_zdfosm_adjust_sd * zustke(2:jpim1,2:jpjm1) 
    490         END IF 
    491      CASE(1) 
    492         ! van  Roekel (2012): consider average SD over top 10% of boundary layer 
    493         ! assumes approximate depth profile of SD from Breivik (2016) 
    494         zsqrtpi = SQRT(rpi) 
    495         z_two_thirds = 2.0_wp / 3.0_wp 
    496  
    497         DO_2D( 0, 0, 0, 0 ) 
    498            zthickness = rn_osm_hblfrac*hbl(ji,jj) 
    499            z2k_times_thickness =  zthickness * 2.0_wp / MAX( ABS( 5.97_wp * dstokes(ji,jj) ), 0.0000001_wp ) 
    500            zsqrt_depth = SQRT(z2k_times_thickness) 
    501            zexp_depth  = EXP(-z2k_times_thickness) 
    502            zustke(ji,jj) = zustke(ji,jj) * (1.0_wp - zexp_depth  & 
    503                 &              - z_two_thirds * ( zsqrtpi*zsqrt_depth*z2k_times_thickness * ERFC(zsqrt_depth) & 
    504                 &              + 1.0_wp - (1.0_wp + z2k_times_thickness)*zexp_depth ) ) / z2k_times_thickness 
    505  
    506         END_2D 
    507      CASE(2) 
    508         ! Grant (2020): Match to exponential with same SD and d/dz(Sd) at depth 10% of boundary layer 
    509         ! assumes approximate depth profile of SD from Breivik (2016) 
    510         zsqrtpi = SQRT(rpi) 
    511  
    512         DO_2D( 0, 0, 0, 0 ) 
    513            zthickness = rn_osm_hblfrac*hbl(ji,jj) 
    514            z2k_times_thickness =  zthickness * 2.0_wp / MAX( ABS( 5.97_wp * dstokes(ji,jj) ), 0.0000001_wp ) 
    515  
    516            IF(z2k_times_thickness < 50._wp) THEN 
    517               zsqrt_depth = SQRT(z2k_times_thickness) 
    518               zexperfc = zsqrtpi * zsqrt_depth * ERFC(zsqrt_depth) * EXP(z2k_times_thickness) 
    519            ELSE 
    520               ! asymptotic expansion of sqrt(pi)*zsqrt_depth*EXP(z2k_times_thickness)*ERFC(zsqrt_depth) for large z2k_times_thickness 
    521               ! See Abramowitz and Stegun, Eq. 7.1.23 
    522               ! zexperfc = 1._wp - (1/2)/(z2k_times_thickness)  + (3/4)/(z2k_times_thickness**2) - (15/8)/(z2k_times_thickness**3) 
    523               zexperfc = ((- 1.875_wp/z2k_times_thickness + 0.75_wp)/z2k_times_thickness - 0.5_wp)/z2k_times_thickness + 1.0_wp 
    524            END IF 
    525            zf = z2k_times_thickness*(1.0_wp/zexperfc - 1.0_wp) 
    526            dstokes(ji,jj) = 5.97 * zf * dstokes(ji,jj) 
    527            zustke(ji,jj) = zustke(ji,jj) * EXP(z2k_times_thickness * ( 1.0_wp / (2. * zf) - 1.0_wp )) * ( 1.0_wp - zexperfc) 
    528         END_2D 
    529      END SELECT 
    530  
    531      ! Langmuir velocity scale (zwstrl), La # (zla) 
    532      ! mixed scale (zvstr), convective velocity scale (zwstrc) 
    533      DO_2D( 0, 0, 0, 0 ) 
    534         ! Langmuir velocity scale (zwstrl), at T-point 
    535         zwstrl(ji,jj) = ( zustar(ji,jj) * zustar(ji,jj) * zustke(ji,jj) )**pthird 
    536         zla(ji,jj) = MAX(MIN(SQRT ( zustar(ji,jj) / ( zwstrl(ji,jj) + epsln ) )**3, 4.0), 0.2) 
    537         IF(zla(ji,jj) > 0.45) dstokes(ji,jj) = MIN(dstokes(ji,jj), 0.5_wp*hbl(ji,jj)) 
    538         ! Velocity scale that tends to zustar for large Langmuir numbers 
    539         zvstr(ji,jj) = ( zwstrl(ji,jj)**3  + & 
    540              & ( 1.0 - EXP( -0.5 * zla(ji,jj)**2 ) ) * zustar(ji,jj) * zustar(ji,jj) * zustar(ji,jj) )**pthird 
    541  
    542         ! limit maximum value of Langmuir number as approximate treatment for shear turbulence. 
    543         ! Note zustke and zwstrl are not amended. 
    544         ! 
    545         ! get convective velocity (zwstrc), stabilty scale (zhol) and logical conection flag lconv 
    546         IF ( zwbav(ji,jj) > 0.0) THEN 
    547            zwstrc(ji,jj) = ( 2.0 * zwbav(ji,jj) * 0.9 * hbl(ji,jj) )**pthird 
    548            zhol(ji,jj) = -0.9 * hbl(ji,jj) * 2.0 * zwbav(ji,jj) / (zvstr(ji,jj)**3 + epsln ) 
     463      ! 
     464      ! Turbulent surface fluxes and fluxes averaged over depth of the OSBL 
     465      zz0 =           rn_abs   ! Assume two-band radiation model for depth of OSBL - surface equi-partition in 2-bands 
     466      zz1 =  1.0_wp - rn_abs 
     467      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     468         zrad0(ji,jj)  = qsr(ji,jj) * r1_rho0_rcp   ! Surface downward irradiance (so always +ve) 
     469         zradh(ji,jj)  = zrad0(ji,jj) *                                &   ! Downwards irradiance at base of boundary layer 
     470            &            ( zz0 * EXP( -1.0_wp * hbl(ji,jj) / rn_si0 ) + zz1 * EXP( -1.0_wp * hbl(ji,jj) / rn_si1 ) ) 
     471         zradav        = zrad0(ji,jj) *                                              &            ! Downwards irradiance averaged 
     472            &            ( zz0 * ( 1.0_wp - EXP( -hbl(ji,jj)/rn_si0 ) ) * rn_si0 +   &            !    over depth of the OSBL 
     473            &              zz1 * ( 1.0_wp - EXP( -hbl(ji,jj)/rn_si1 ) ) * rn_si1 ) / hbl(ji,jj) 
     474         swth0(ji,jj)  = - qns(ji,jj) * r1_rho0_rcp * tmask(ji,jj,1)   ! Upwards surface Temperature flux for non-local term 
     475         swthav(ji,jj) = 0.5_wp * swth0(ji,jj) - ( 0.5_wp * ( zrad0(ji,jj) + zradh(ji,jj) ) -   &   ! Turbulent heat flux averaged 
     476            &                                                 zradav )                              !    over depth of OSBL 
     477      END_2D 
     478      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     479         sws0(ji,jj)    = -1.0_wp * ( ( emp(ji,jj) - rnf(ji,jj) ) * ts(ji,jj,1,jp_sal,Kmm) +   &   ! Upwards surface salinity flux 
     480            &                         sfx(ji,jj) ) * r1_rho0 * tmask(ji,jj,1)                      !    for non-local term 
     481         zthermal       = rab_n(ji,jj,1,jp_tem) 
     482         zbeta          = rab_n(ji,jj,1,jp_sal) 
     483         swb0(ji,jj)    = grav * zthermal * swth0(ji,jj) - grav * zbeta * sws0(ji,jj)   ! Non radiative upwards surface buoyancy flux 
     484         zwb0tot(ji,jj) = swb0(ji,jj) - grav * zthermal * ( zrad0(ji,jj) - zradh(ji,jj) )   ! Total upwards surface buoyancy flux 
     485         swsav(ji,jj)   = 0.5_wp * sws0(ji,jj)                              ! Turbulent salinity flux averaged over depth of the OBSL 
     486         swbav(ji,jj)   = grav  * zthermal * swthav(ji,jj) -            &   ! Turbulent buoyancy flux averaged over the depth of the 
     487            &             grav  * zbeta * swsav(ji,jj)                      ! OBSBL 
     488      END_2D 
     489      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     490         suw0(ji,jj)    = -0.5_wp * (utau(ji-1,jj) + utau(ji,jj)) * r1_rho0 * tmask(ji,jj,1)   ! Surface upward velocity fluxes 
     491         zvw0           = -0.5_wp * (vtau(ji,jj-1) + vtau(ji,jj)) * r1_rho0 * tmask(ji,jj,1) 
     492         sustar(ji,jj)  = MAX( SQRT( SQRT( suw0(ji,jj) * suw0(ji,jj) + zvw0 * zvw0 ) ),   &   ! Friction velocity (sustar), at 
     493            &                  1e-8_wp )                                                      !    T-point : LMD94 eq. 2 
     494         scos_wind(ji,jj) = -1.0_wp * suw0(ji,jj) / ( sustar(ji,jj) * sustar(ji,jj) ) 
     495         ssin_wind(ji,jj) = -1.0_wp * zvw0        / ( sustar(ji,jj) * sustar(ji,jj) ) 
     496      END_2D 
     497      ! Calculate Stokes drift in direction of wind (sustke) and Stokes penetration depth (dstokes) 
     498      SELECT CASE (nn_osm_wave) 
     499         ! Assume constant La#=0.3 
     500      CASE(0) 
     501         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     502            zus_x = scos_wind(ji,jj) * sustar(ji,jj) / 0.3_wp**2 
     503            zus_y = ssin_wind(ji,jj) * sustar(ji,jj) / 0.3_wp**2 
     504            ! Linearly 
     505            sustke(ji,jj)  = MAX( SQRT( zus_x * zus_x + zus_y * zus_y ), 1e-8_wp ) 
     506            dstokes(ji,jj) = rn_osm_dstokes 
     507         END_2D 
     508         ! Assume Pierson-Moskovitz wind-wave spectrum 
     509      CASE(1) 
     510         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     511            ! Use wind speed wndm included in sbc_oce module 
     512            sustke(ji,jj)  = MAX ( 0.016_wp * wndm(ji,jj), 1e-8_wp ) 
     513            dstokes(ji,jj) = MAX ( 0.12_wp * wndm(ji,jj)**2 / grav, 5e-1_wp ) 
     514         END_2D 
     515         ! Use ECMWF wave fields as output from SBCWAVE 
     516      CASE(2) 
     517         zfac =  2.0_wp * rpi / 16.0_wp 
     518         ! 
     519         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     520            IF ( hsw(ji,jj) > 1e-4_wp ) THEN 
     521               ! Use  wave fields 
     522               zabsstke       = SQRT( ut0sd(ji,jj)**2 + vt0sd(ji,jj)**2 ) 
     523               sustke(ji,jj)  = MAX( ( scos_wind(ji,jj) * ut0sd(ji,jj) + ssin_wind(ji,jj)  * vt0sd(ji,jj) ), 1e-8_wp ) 
     524               dstokes(ji,jj) = MAX( zfac * hsw(ji,jj) * hsw(ji,jj) / ( MAX( zabsstke * wmp(ji,jj), 1e-7 ) ), 5e-1_wp ) 
     525            ELSE 
     526               ! Assume masking issue (e.g. ice in ECMWF reanalysis but not in model run) 
     527               ! .. so default to Pierson-Moskowitz 
     528               sustke(ji,jj)  = MAX( 0.016_wp * wndm(ji,jj), 1e-8_wp ) 
     529               dstokes(ji,jj) = MAX( 0.12_wp * wndm(ji,jj)**2 / grav, 5e-1_wp ) 
     530            END IF 
     531         END_2D 
     532      END SELECT 
     533      ! 
     534      IF (ln_zdfosm_ice_shelter) THEN 
     535         ! Reduce both Stokes drift and its depth scale by ocean fraction to represent sheltering by ice 
     536         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     537            sustke(ji,jj)  = sustke(ji,jj)  * ( 1.0_wp - fr_i(ji,jj) ) 
     538            dstokes(ji,jj) = dstokes(ji,jj) * ( 1.0_wp - fr_i(ji,jj) ) 
     539         END_2D 
     540      END IF 
     541      ! 
     542      SELECT CASE (nn_osm_SD_reduce) 
     543         ! Reduce surface Stokes drift by a constant factor or following Breivik (2016) + van Roekel (2012) or Grant (2020). 
     544      CASE(0) 
     545         ! The Langmur number from the ECMWF model (or from PM) appears to give La<0.3 for wind-driven seas. 
     546         ! The coefficient rn_zdfosm_adjust_sd = 0.8 gives La=0.3 in this situation. 
     547         ! It could represent the effects of the spread of wave directions around the mean wind. The effect of this adjustment needs to be tested. 
     548         IF(nn_osm_wave > 0) THEN 
     549            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     550               sustke(ji,jj) = rn_zdfosm_adjust_sd * sustke(ji,jj) 
     551            END_2D 
     552         END IF 
     553      CASE(1) 
     554         ! Van Roekel (2012): consider average SD over top 10% of boundary layer 
     555         ! Assumes approximate depth profile of SD from Breivik (2016) 
     556         zsqrtpi = SQRT(rpi) 
     557         z_two_thirds = 2.0_wp / 3.0_wp 
     558         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     559            zthickness = rn_osm_hblfrac*hbl(ji,jj) 
     560            z2k_times_thickness =  zthickness * 2.0_wp / MAX( ABS( 5.97_wp * dstokes(ji,jj) ), 1e-7_wp ) 
     561            zsqrt_depth = SQRT( z2k_times_thickness ) 
     562            zexp_depth  = EXP( -1.0_wp * z2k_times_thickness ) 
     563            sustke(ji,jj) = sustke(ji,jj) * ( 1.0_wp - zexp_depth -   & 
     564               &                              z_two_thirds * ( zsqrtpi * zsqrt_depth * z2k_times_thickness * ERFC(zsqrt_depth) +   & 
     565               &                                               1.0_wp - ( 1.0_wp + z2k_times_thickness ) * zexp_depth ) ) /        & 
     566               &            z2k_times_thickness 
     567         END_2D 
     568      CASE(2) 
     569         ! Grant (2020): Match to exponential with same SD and d/dz(Sd) at depth 10% of boundary layer 
     570         ! Assumes approximate depth profile of SD from Breivik (2016) 
     571         zsqrtpi = SQRT(rpi) 
     572         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     573            zthickness = rn_osm_hblfrac*hbl(ji,jj) 
     574            z2k_times_thickness =  zthickness * 2.0_wp / MAX( ABS( 5.97_wp * dstokes(ji,jj) ), 1e-7_wp ) 
     575            IF( z2k_times_thickness < 50.0_wp ) THEN 
     576               zsqrt_depth = SQRT( z2k_times_thickness ) 
     577               zexperfc    = zsqrtpi * zsqrt_depth * ERFC(zsqrt_depth) * EXP( z2k_times_thickness ) 
     578            ELSE 
     579               ! Asymptotic expansion of sqrt(pi)*zsqrt_depth*EXP(z2k_times_thickness)*ERFC(zsqrt_depth) for large 
     580               !    z2k_times_thickness 
     581               ! See Abramowitz and Stegun, Eq. 7.1.23 
     582               ! zexperfc = 1._wp - (1/2)/(z2k_times_thickness) + (3/4)/(z2k_times_thickness**2) - (15/8)/(z2k_times_thickness**3) 
     583               zexperfc = ( ( -1.875_wp / z2k_times_thickness + 0.75_wp ) / z2k_times_thickness - 0.5_wp ) /   & 
     584                  &       z2k_times_thickness + 1.0_wp 
     585            END IF 
     586            zf = z2k_times_thickness * ( 1.0_wp / zexperfc - 1.0_wp ) 
     587            dstokes(ji,jj) = 5.97_wp * zf * dstokes(ji,jj) 
     588            sustke(ji,jj)  = sustke(ji,jj) * EXP( z2k_times_thickness * ( 1.0_wp / ( 2.0_wp * zf ) - 1.0_wp ) ) *   & 
     589               &             ( 1.0_wp - zexperfc ) 
     590         END_2D 
     591      END SELECT 
     592      ! 
     593      ! Langmuir velocity scale (swstrl), La # (sla) 
     594      ! Mixed scale (svstr), convective velocity scale (swstrc) 
     595      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     596         ! Langmuir velocity scale (swstrl), at T-point 
     597         swstrl(ji,jj) = ( sustar(ji,jj) * sustar(ji,jj) * sustke(ji,jj) )**pthird 
     598         sla(ji,jj)    = MAX( MIN( SQRT( sustar(ji,jj) / ( swstrl(ji,jj) + epsln ) )**3, 4.0_wp ), 0.2_wp ) 
     599         IF ( sla(ji,jj) > 0.45_wp ) dstokes(ji,jj) = MIN( dstokes(ji,jj), 0.5_wp * hbl(ji,jj) ) 
     600         ! Velocity scale that tends to sustar for large Langmuir numbers 
     601         svstr(ji,jj)  = ( swstrl(ji,jj)**3 + ( 1.0_wp - EXP( -0.5_wp * sla(ji,jj)**2 ) ) * sustar(ji,jj) * sustar(ji,jj) *   & 
     602            &                                 sustar(ji,jj) )**pthird 
     603         ! 
     604         ! Limit maximum value of Langmuir number as approximate treatment for shear turbulence 
     605         ! Note sustke and swstrl are not amended 
     606         ! 
     607         ! Get convective velocity (swstrc), stabilty scale (shol) and logical conection flag l_conv 
     608         IF ( swbav(ji,jj) > 0.0_wp ) THEN 
     609            swstrc(ji,jj) = ( 2.0_wp * swbav(ji,jj) * 0.9_wp * hbl(ji,jj) )**pthird 
     610            shol(ji,jj)   = -0.9_wp * hbl(ji,jj) * 2.0_wp * swbav(ji,jj) / ( svstr(ji,jj)**3 + epsln ) 
    549611         ELSE 
    550            zhol(ji,jj) = -hbl(ji,jj) *  2.0 * zwbav(ji,jj)/ (zvstr(ji,jj)**3  + epsln ) 
    551         ENDIF 
    552      END_2D 
    553  
    554      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    555      ! Mixed-layer model - calculate averages over the boundary layer, and the change in the boundary layer depth 
    556      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    557      ! BL must be always 4 levels deep. 
    558      ! For calculation of lateral buoyancy gradients for FK in 
    559      ! zdf_osm_zmld_horizontal_gradients need halo values for ibld, so must 
    560      ! previously exist for hbl also. 
    561  
    562      ! agn 23/6/20: not clear all this is needed, as hbl checked after it is re-calculated anyway 
    563      ! ########################################################################## 
    564       hbl(:,:) = MAX(hbl(:,:), gdepw(:,:,4,Kmm) ) 
    565       ibld(:,:) = 4 
    566       DO_3D( 1, 1, 1, 1, 5, jpkm1 ) 
    567          IF ( hbl(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) THEN 
    568             ibld(ji,jj) = MIN(mbkt(ji,jj), jk) 
     612            swstrc(ji,jj) = 0.0_wp 
     613            shol(ji,jj)   = -1.0_wp * hbl(ji,jj) * 2.0_wp * swbav(ji,jj) / ( svstr(ji,jj)**3  + epsln ) 
     614         ENDIF 
     615      END_2D 
     616      ! 
     617      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     618      ! Mixed-layer model - calculate averages over the boundary layer, and the change in the boundary layer depth 
     619      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     620      ! BL must be always 4 levels deep. 
     621      ! For calculation of lateral buoyancy gradients for FK in 
     622      ! zdf_osm_zmld_horizontal_gradients need halo values for nbld 
     623      ! 
     624      ! agn 23/6/20: not clear all this is needed, as hbl checked after it is re-calculated anyway 
     625      ! ########################################################################## 
     626      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     627         hbl(ji,jj) = MAX(hbl(ji,jj), gdepw(ji,jj,4,Kmm) ) 
     628      END_2D 
     629      DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 
     630         nbld(ji,jj) = 4 
     631      END_2D 
     632      DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 5, jpkm1 ) 
     633         IF ( MAX( hbl(ji,jj), gdepw(ji,jj,4,Kmm) ) >= gdepw(ji,jj,jk,Kmm) ) THEN 
     634            nbld(ji,jj) = MIN(mbkt(ji,jj)-2, jk) 
    569635         ENDIF 
    570636      END_3D 
    571      ! ########################################################################## 
    572  
    573       DO_2D( 0, 0, 0, 0 ) 
    574          zhbl(ji,jj) = gdepw(ji,jj,ibld(ji,jj),Kmm) 
    575          imld(ji,jj) = MAX(3,ibld(ji,jj) - MAX( INT( dh(ji,jj) / e3t(ji, jj, ibld(ji,jj), Kmm )) , 1 )) 
    576          zhml(ji,jj) = gdepw(ji,jj,imld(ji,jj),Kmm) 
     637      ! ########################################################################## 
     638      ! 
     639      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     640         zhbl(ji,jj) = gdepw(ji,jj,nbld(ji,jj),Kmm) 
     641         nmld(ji,jj) = MAX( 3, nbld(ji,jj) - MAX( INT( dh(ji,jj) / e3t(ji,jj,nbld(ji,jj)-1,Kmm) ), 1 ) ) 
     642         zhml(ji,jj) = gdepw(ji,jj,nmld(ji,jj),Kmm) 
    577643         zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj) 
    578644      END_2D 
    579       ! Averages over well-mixed and boundary layer 
    580       jp_ext(:,:) = 2 
    581       CALL zdf_osm_vertical_average(ibld, jp_ext, zt_bl, zs_bl, zb_bl, zu_bl, zv_bl, zdt_bl, zds_bl, zdb_bl, zdu_bl, zdv_bl) 
    582 !      jp_ext(:,:) = ibld(:,:) - imld(:,:) + 1 
    583       CALL zdf_osm_vertical_average(ibld, ibld-imld+1, zt_ml, zs_ml, zb_ml, zu_ml, zv_ml, zdt_ml, zds_ml, zdb_ml, zdu_ml, zdv_ml) 
    584 ! Velocity components in frame aligned with surface stress. 
    585       CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_ml, zv_ml, zdu_ml, zdv_ml ) 
    586       CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_bl, zv_bl, zdu_bl, zdv_bl ) 
    587 ! Determine the state of the OSBL, stable/unstable, shear/no shear 
    588       CALL zdf_osm_osbl_state( lconv, lshear, j_ddh, zwb_ent, zwb_min, zshear, zri_i ) 
    589  
     645      ! 
     646      ! Averages over well-mixed and boundary layer, note BL averages use jk_ext=2 everywhere 
     647      jk_nlev(:,:) = nbld(A2D(nn_hls-1)) 
     648      jk_ext(:,:) = 1   ! ag 19/03 
     649      CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_bl,  av_s_bl,    & 
     650         &                           av_b_bl,  av_u_bl,  av_v_bl,  jk_ext,   av_dt_bl,   & 
     651         &                           av_ds_bl, av_db_bl, av_du_bl, av_dv_bl ) 
     652      jk_nlev(:,:) = nmld(A2D(nn_hls-1)) - 1 
     653      jk_ext(:,:) = nbld(A2D(nn_hls-1)) - nmld(A2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03 
     654      CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_ml,  av_s_ml,    & 
     655         &                           av_b_ml,  av_u_ml,  av_v_ml,  jk_ext,   av_dt_ml,   & 
     656         &                           av_ds_ml, av_db_ml, av_du_ml, av_dv_ml ) 
     657      ! Velocity components in frame aligned with surface stress 
     658      CALL zdf_osm_velocity_rotation( av_u_ml,  av_v_ml  ) 
     659      CALL zdf_osm_velocity_rotation( av_du_ml, av_dv_ml ) 
     660      CALL zdf_osm_velocity_rotation( av_u_bl,  av_v_bl  ) 
     661      CALL zdf_osm_velocity_rotation( av_du_bl, av_dv_bl ) 
     662      ! 
     663      ! Determine the state of the OSBL, stable/unstable, shear/no shear 
     664      CALL zdf_osm_osbl_state( Kmm, zwb_ent, zwb_min, zshear, zhbl,     & 
     665         &                     zhml, zdh ) 
     666      ! 
    590667      IF ( ln_osm_mle ) THEN 
    591 ! Fox-Kemper Scheme 
    592          mld_prof = 4 
    593          DO_3D( 0, 0, 0, 0, 5, jpkm1 ) 
    594          IF ( hmle(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) mld_prof(ji,jj) = MIN(mbkt(ji,jj), jk) 
     668         ! Fox-Kemper Scheme 
     669         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 
     670            mld_prof(ji,jj) = 4 
     671         END_2D 
     672         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 5, jpkm1 ) 
     673            IF ( hmle(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) mld_prof(ji,jj) = MIN( mbkt(ji,jj), jk) 
    595674         END_3D 
    596          jp_ext_mle(:,:) = 2 
    597         CALL zdf_osm_vertical_average(mld_prof, jp_ext_mle, zt_mle, zs_mle, zb_mle, zu_mle, zv_mle, zdt_mle, zds_mle, zdb_mle, zdu_mle, zdv_mle) 
    598  
    599          DO_2D( 0, 0, 0, 0 ) 
    600            zhmle(ji,jj) = gdepw(ji,jj,mld_prof(ji,jj),Kmm) 
     675         jk_nlev(:,:) = mld_prof(A2D(nn_hls-1)) 
     676         CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_mle, av_s_mle,   & 
     677            &                           av_b_mle, av_u_mle, av_v_mle ) 
     678         ! 
     679         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     680            zhmle(ji,jj) = gdepw(ji,jj,mld_prof(ji,jj),Kmm) 
    601681         END_2D 
    602  
    603 !! External gradient 
    604          CALL zdf_osm_external_gradients( ibld+2, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext ) 
    605          CALL zdf_osm_zmld_horizontal_gradients( zmld, zdtdx, zdtdy, zdsdx, zdsdy, dbdx_mle, dbdy_mle, zdbds_mle ) 
    606          CALL zdf_osm_external_gradients( mld_prof, zdtdz_mle_ext, zdsdz_mle_ext, zdbdz_mle_ext ) 
    607          CALL zdf_osm_osbl_state_fk( lpyc, lflux, lmle, zwb_fk ) 
    608          CALL zdf_osm_mle_parameters( mld_prof, hmle, zhmle, zvel_mle, zdiff_mle ) 
     682         ! 
     683         ! Calculate fairly-well-mixed depth zmld & its index mld_prof + lateral zmld-averaged gradients 
     684         CALL zdf_osm_zmld_horizontal_gradients( Kmm, zmld, zdtdx, zdtdy, zdsdx,   & 
     685            &                                    zdsdy, zdbds_mle ) 
     686         ! Calculate max vertical FK flux zwb_fk & set logical descriptors 
     687         CALL zdf_osm_osbl_state_fk( Kmm, zwb_fk, zhbl, zhmle, zwb_ent,   & 
     688            &                        zdbds_mle ) 
     689         ! Recalculate hmle, zmle, zvel_mle, zdiff_mle & redefine mld_proc to be index for new hmle 
     690         CALL zdf_osm_mle_parameters( Kmm, zmld, zhmle, zvel_mle, zdiff_mle,   & 
     691            &                         zdbds_mle, zhbl, zwb0tot ) 
    609692      ELSE    ! ln_osm_mle 
    610 ! FK not selected, Boundary Layer only. 
    611          lpyc(:,:) = .TRUE. 
    612          lflux(:,:) = .FALSE. 
    613          lmle(:,:) = .FALSE. 
    614          DO_2D( 0, 0, 0, 0 ) 
    615           IF ( lconv(ji,jj) .AND. zdb_bl(ji,jj) < rn_osm_bl_thresh ) lpyc(ji,jj) = .FALSE. 
     693         ! FK not selected, Boundary Layer only. 
     694         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     695            l_pyc(ji,jj)  = .TRUE. 
     696            l_flux(ji,jj) = .FALSE. 
     697            l_mle(ji,jj)  = .FALSE. 
     698            IF ( l_conv(ji,jj) .AND. av_db_bl(ji,jj) < rn_osm_bl_thresh ) l_pyc(ji,jj) = .FALSE. 
    616699         END_2D 
    617700      ENDIF   ! ln_osm_mle 
    618  
    619 ! Test if pycnocline well resolved 
    620       DO_2D( 0, 0, 0, 0 ) 
    621        IF (lconv(ji,jj) ) THEN 
    622           ztmp = 0.2 * zhbl(ji,jj) / e3w(ji,jj,ibld(ji,jj),Kmm) 
    623           IF ( ztmp > 6 ) THEN 
    624    ! pycnocline well resolved 
    625             jp_ext(ji,jj) = 1 
    626           ELSE 
    627    ! pycnocline poorly resolved 
    628             jp_ext(ji,jj) = 0 
    629           ENDIF 
    630        ELSE 
    631    ! Stable conditions 
    632          jp_ext(ji,jj) = 0 
    633        ENDIF 
    634       END_2D 
    635  
    636       CALL zdf_osm_vertical_average(ibld, jp_ext, zt_bl, zs_bl, zb_bl, zu_bl, zv_bl, zdt_bl, zds_bl, zdb_bl, zdu_bl, zdv_bl ) 
    637 !      jp_ext = ibld-imld+1 
    638       CALL zdf_osm_vertical_average(imld-1, ibld-imld+1, zt_ml, zs_ml, zb_ml, zu_ml, zv_ml, zdt_ml, zds_ml, zdb_ml, zdu_ml, zdv_ml) 
    639 ! Rate of change of hbl 
    640       CALL zdf_osm_calculate_dhdt( zdhdt, zddhdt ) 
    641       DO_2D( 0, 0, 0, 0 ) 
    642        zhbl_t(ji,jj) = hbl(ji,jj) + (zdhdt(ji,jj) - ww(ji,jj,ibld(ji,jj)))* rn_Dt ! certainly need ww here, so subtract it 
    643             ! adjustment to represent limiting by ocean bottom 
    644        IF ( zhbl_t(ji,jj) >= gdepw(ji, jj, mbkt(ji,jj) + 1, Kmm ) ) THEN 
    645           zhbl_t(ji,jj) = MIN(zhbl_t(ji,jj), gdepw(ji,jj, mbkt(ji,jj) + 1, Kmm) - depth_tol)! ht(:,:)) 
    646           lpyc(ji,jj) = .FALSE. 
    647        ENDIF 
    648       END_2D 
    649  
    650       imld(:,:) = ibld(:,:)           ! use imld to hold previous blayer index 
    651       ibld(:,:) = 4 
    652  
    653       DO_3D( 0, 0, 0, 0, 4, jpkm1 ) 
     701      ! 
     702      !! External gradient below BL needed both with and w/o FK 
     703      jk_ext(:,:) = nbld(A2D(nn_hls-1)) + 1 
     704      CALL zdf_osm_external_gradients( Kmm, jk_ext, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext )   ! ag 19/03 
     705      ! 
     706      ! Test if pycnocline well resolved 
     707      !      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                                         Removed with ag 19/03 changes. A change in eddy diffusivity/viscosity 
     708      !         IF (l_conv(ji,jj) ) THEN                                  should account for this. 
     709      !            ztmp = 0.2 * zhbl(ji,jj) / e3w(ji,jj,nbld(ji,jj),Kmm) 
     710      !            IF ( ztmp > 6 ) THEN 
     711      !               ! pycnocline well resolved 
     712      !               jk_ext(ji,jj) = 1 
     713      !            ELSE 
     714      !               ! pycnocline poorly resolved 
     715      !               jk_ext(ji,jj) = 0 
     716      !            ENDIF 
     717      !         ELSE 
     718      !            ! Stable conditions 
     719      !            jk_ext(ji,jj) = 0 
     720      !         ENDIF 
     721      !      END_2D 
     722      ! 
     723      ! Recalculate bl averages using jk_ext & ml averages .... note no rotation of u & v here.. 
     724      jk_nlev(:,:) = nbld(A2D(nn_hls-1)) 
     725      jk_ext(:,:) = 1   ! ag 19/03 
     726      CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_bl,  av_s_bl,    & 
     727         &                           av_b_bl,  av_u_bl,  av_v_bl,  jk_ext,   av_dt_bl,   & 
     728         &                           av_ds_bl, av_db_bl, av_du_bl, av_dv_bl ) 
     729      jk_nlev(:,:) = nmld(A2D(nn_hls-1)) - 1 
     730      jk_ext(:,:) = nbld(A2D(nn_hls-1)) - nmld(A2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03 
     731      CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_ml,  av_s_ml,    & 
     732         &                           av_b_ml,  av_u_ml,  av_v_ml,  jk_ext,   av_dt_ml,   & 
     733         &                           av_ds_ml, av_db_ml, av_du_ml, av_dv_ml )   ! ag 19/03 
     734      ! 
     735      ! Rate of change of hbl 
     736      CALL zdf_osm_calculate_dhdt( zdhdt, zhbl, zdh, zwb_ent, zwb_min,   & 
     737         &                         zdbdz_bl_ext, zwb_fk_b, zwb_fk, zvel_mle ) 
     738      ! Test if surface boundary layer coupled to bottom 
     739      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     740         l_coup(ji,jj) = .FALSE.   ! ag 19/03 
     741         zhbl_t(ji,jj) = hbl(ji,jj) + ( zdhdt(ji,jj) - ww(ji,jj,nbld(ji,jj)) ) * rn_Dt   ! Certainly need ww here, so subtract it 
     742         ! Adjustment to represent limiting by ocean bottom 
     743         IF ( mbkt(ji,jj) > 2 ) THEN   ! To ensure mbkt(ji,jj) - 2 > 0 so no incorrect array access 
     744            IF ( zhbl_t(ji,jj) > gdepw(ji, jj,mbkt(ji,jj)-2,Kmm) ) THEN 
     745               zhbl_t(ji,jj) = MIN( zhbl_t(ji,jj), gdepw(ji,jj,mbkt(ji,jj)-2,Kmm) )   ! ht(:,:)) 
     746               l_pyc(ji,jj)  = .FALSE. 
     747               l_coup(ji,jj) = .TRUE.   ! ag 19/03 
     748            END IF 
     749         END IF 
     750      END_2D 
     751      ! 
     752      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     753         nmld(ji,jj) = nbld(ji,jj)           ! use nmld to hold previous blayer index 
     754         nbld(ji,jj) = 4 
     755      END_2D 
     756      ! 
     757      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 4, jpkm1 ) 
    654758         IF ( zhbl_t(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) THEN 
    655             ibld(ji,jj) = jk 
     759            nbld(ji,jj) = jk 
     760         END IF 
     761      END_3D 
     762      ! 
     763      ! 
     764      ! Step through model levels taking account of buoyancy change to determine the effect on dhdt 
     765      ! 
     766      CALL zdf_osm_timestep_hbl( Kmm, zdhdt, zhbl, zhbl_t, zwb_ent,   & 
     767         &                       zwb_fk_b ) 
     768      ! Is external level in bounds? 
     769      ! 
     770      ! Recalculate BL averages and differences using new BL depth 
     771      jk_nlev(:,:) = nbld(A2D(nn_hls-1)) 
     772      jk_ext(:,:) = 1   ! ag 19/03 
     773      CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_bl,  av_s_bl,    & 
     774         &                           av_b_bl,  av_u_bl,  av_v_bl,  jk_ext,   av_dt_bl,   & 
     775         &                           av_ds_bl, av_db_bl, av_du_bl, av_dv_bl ) 
     776      ! 
     777      CALL zdf_osm_pycnocline_thickness( Kmm, zdh, zhml, zdhdt, zhbl,   & 
     778         &                               zwb_ent, zdbdz_bl_ext, zwb_fk_b ) 
     779      ! 
     780      ! Reset l_pyc before calculating terms in the flux-gradient relationship 
     781      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     782         IF ( av_db_bl(ji,jj) < rn_osm_bl_thresh .OR. nbld(ji,jj) >= mbkt(ji,jj) - 2 .OR.   & 
     783            & nbld(ji,jj) - nmld(ji,jj) == 1   .OR. zdhdt(ji,jj) < 0.0_wp ) THEN   ! ag 19/03 
     784            l_pyc(ji,jj) = .FALSE.   ! ag 19/03 
     785            IF ( nbld(ji,jj) >= mbkt(ji,jj) -2 ) THEN 
     786               nmld(ji,jj) = nbld(ji,jj) - 1                                               ! ag 19/03 
     787               zdh(ji,jj)  = gdepw(ji,jj,nbld(ji,jj),Kmm) - gdepw(ji,jj,nmld(ji,jj),Kmm)   ! ag 19/03 
     788               zhml(ji,jj) = gdepw(ji,jj,nmld(ji,jj),Kmm)                                  ! ag 19/03 
     789               dh(ji,jj)   = zdh(ji,jj)                                                    ! ag 19/03   
     790               hml(ji,jj)  = hbl(ji,jj) - dh(ji,jj)                                        ! ag 19/03 
     791            ENDIF 
     792         ENDIF                                              ! ag 19/03 
     793      END_2D 
     794      ! 
     795      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )               ! Limit delta for shallow boundary layers for calculating 
     796         dstokes(ji,jj) = MIN ( dstokes(ji,jj), hbl(ji,jj) / 3.0_wp )   !    flux-gradient terms 
     797      END_2D 
     798      !                                                        
     799      ! 
     800      ! Average over the depth of the mixed layer in the convective boundary layer 
     801      !      jk_ext = nbld - nmld + 1 
     802      ! Recalculate ML averages and differences using new ML depth 
     803      jk_nlev(:,:) = nmld(A2D(nn_hls-1)) - 1 
     804      jk_ext(:,:) = nbld(A2D(nn_hls-1)) - nmld(A2D(nn_hls-1)) + jk_ext(:,:) + 1   ! ag 19/03 
     805      CALL zdf_osm_vertical_average( Kbb,      Kmm,      jk_nlev,  av_t_ml,  av_s_ml,    & 
     806         &                           av_b_ml,  av_u_ml,  av_v_ml,  jk_ext,   av_dt_ml,   & 
     807         &                           av_ds_ml, av_db_ml, av_du_ml, av_dv_ml ) 
     808      ! 
     809      jk_ext(:,:) = nbld(A2D(nn_hls-1)) + 1 
     810      CALL zdf_osm_external_gradients( Kmm, jk_ext, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext ) 
     811      ! Rotate mean currents and changes onto wind aligned co-ordinates 
     812      CALL zdf_osm_velocity_rotation( av_u_ml,  av_v_ml  ) 
     813      CALL zdf_osm_velocity_rotation( av_du_ml, av_dv_ml ) 
     814      CALL zdf_osm_velocity_rotation( av_u_bl,  av_v_bl  ) 
     815      CALL zdf_osm_velocity_rotation( av_du_bl, av_dv_bl ) 
     816      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     817      ! Eddy viscosity/diffusivity and non-gradient terms in the flux-gradient relationship 
     818      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     819      CALL zdf_osm_diffusivity_viscosity( Kbb, Kmm, zdiffut, zviscos, zhbl,    & 
     820         &                                zhml, zdh, zdhdt, zshear, zwb_ent,   & 
     821         &                                zwb_min ) 
     822      ! 
     823      ! Calculate non-gradient components of the flux-gradient relationships 
     824      ! -------------------------------------------------------------------- 
     825      jk_ext(:,:) = 1   ! ag 19/03 
     826      CALL zdf_osm_fgr_terms( Kmm, jk_ext, zhbl, zhml, zdh,                              & 
     827         &                    zdhdt, zshear, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext,   & 
     828         &                    zdiffut, zviscos ) 
     829      ! 
     830      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     831      ! Need to put in code for contributions that are applied explicitly to 
     832      ! the prognostic variables 
     833      !  1. Entrainment flux 
     834      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     835      ! 
     836      ! Rotate non-gradient velocity terms back to model reference frame 
     837      jk_nlev(:,:) = nbld(A2D(nn_hls-1)) 
     838      CALL zdf_osm_velocity_rotation( ghamu, ghamv, .FALSE.,  2, jk_nlev ) 
     839      ! 
     840      ! KPP-style Ri# mixing 
     841      IF ( ln_kpprimix ) THEN 
     842         jkflt = jpk 
     843         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     844            IF ( nbld(ji,jj) < jkflt ) jkflt = nbld(ji,jj) 
     845         END_2D 
     846         DO jk = jkflt+1, jpkm1 
     847            ! Shear production at uw- and vw-points (energy conserving form) 
     848            DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
     849               z2du(ji,jj) = 0.5_wp * ( uu(ji,jj,jk-1,Kmm) - uu(ji,jj,jk,Kmm) ) * ( uu(ji,jj,jk-1,Kbb) - uu(ji,jj,jk,Kbb) ) *   & 
     850                  &          wumask(ji,jj,jk) / ( e3uw(ji,jj,jk,Kmm) * e3uw(ji,jj,jk,Kbb) ) 
     851               z2dv(ji,jj) = 0.5_wp * ( vv(ji,jj,jk-1,Kmm) - vv(ji,jj,jk,Kmm) ) * ( vv(ji,jj,jk-1,Kbb) - vv(ji,jj,jk,Kbb) ) *   & 
     852                  &          wvmask(ji,jj,jk) / ( e3vw(ji,jj,jk,Kmm) * e3vw(ji,jj,jk,Kbb) ) 
     853            END_2D 
     854            DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     855               IF ( jk > nbld(ji,jj) ) THEN 
     856                  ! Shear prod. at w-point weightened by mask 
     857                  zesh2 = ( z2du(ji-1,jj) + z2du(ji,jj) ) / MAX( 1.0_wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) ) +   & 
     858                     &    ( z2dv(ji,jj-1) + z2dv(ji,jj) ) / MAX( 1.0_wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 
     859                  ! Local Richardson number 
     860                  zri     = MAX( rn2b(ji,jj,jk), 0.0_wp ) / MAX( zesh2, epsln ) 
     861                  zfri    = MIN( zri / rn_riinfty, 1.0_wp ) 
     862                  zfri    = ( 1.0_wp - zfri * zfri ) 
     863                  zrimix  =  zfri * zfri  * zfri * wmask(ji, jj, jk) 
     864                  zdiffut(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), zrimix*rn_difri ) 
     865                  zviscos(ji,jj,jk) = MAX( zviscos(ji,jj,jk), zrimix*rn_difri ) 
     866               END IF 
     867            END_2D 
     868         END DO 
     869      END IF   ! ln_kpprimix = .true. 
     870      ! 
     871      ! KPP-style set diffusivity large if unstable below BL 
     872      IF ( ln_convmix) THEN 
     873         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     874            DO jk = nbld(ji,jj) + 1, jpkm1 
     875               IF ( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1e-12_wp ) zdiffut(ji,jj,jk) = MAX( rn_difconv, zdiffut(ji,jj,jk) ) 
     876            END DO 
     877         END_2D 
     878      END IF   ! ln_convmix = .true. 
     879      ! 
     880      IF ( ln_osm_mle ) THEN   ! Set up diffusivity and non-gradient mixing 
     881         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     882            IF ( l_flux(ji,jj) ) THEN   ! MLE mixing extends below boundary layer 
     883               ! Calculate MLE flux contribution from surface fluxes 
     884               DO jk = 1, nbld(ji,jj) 
     885                  znd = gdepw(ji,jj,jk,Kmm) / MAX( zhbl(ji,jj), epsln ) 
     886                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) - ( swth0(ji,jj) - zrad0(ji,jj) + zradh(ji,jj) ) * ( 1.0_wp - znd ) 
     887                  ghams(ji,jj,jk) = ghams(ji,jj,jk) - sws0(ji,jj) * ( 1.0_wp - znd ) 
     888               END DO 
     889               DO jk = 1, mld_prof(ji,jj) 
     890                  znd = gdepw(ji,jj,jk,Kmm) / MAX( zhmle(ji,jj), epsln ) 
     891                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + ( swth0(ji,jj) - zrad0(ji,jj) + zradh(ji,jj) ) * ( 1.0_wp - znd ) 
     892                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + sws0(ji,jj) * ( 1.0_wp -znd ) 
     893               END DO 
     894               ! Viscosity for MLEs 
     895               DO jk = 1, mld_prof(ji,jj) 
     896                  znd = -1.0_wp * gdepw(ji,jj,jk,Kmm) / MAX( zhmle(ji,jj), epsln ) 
     897                  zdiffut(ji,jj,jk) = zdiffut(ji,jj,jk) + zdiff_mle(ji,jj) * ( 1.0_wp - ( 2.0_wp * znd + 1.0_wp )**2 ) *   & 
     898                     &                                    ( 1.0_wp + 5.0_wp / 21.0_wp * ( 2.0_wp * znd + 1.0_wp )**2 ) 
     899               END DO 
     900            ELSE   ! Surface transports limited to OSBL 
     901               ! Viscosity for MLEs 
     902               DO jk = 1, mld_prof(ji,jj) 
     903                  znd = -1.0_wp * gdepw(ji,jj,jk,Kmm) / MAX( zhmle(ji,jj), epsln ) 
     904                  zdiffut(ji,jj,jk) = zdiffut(ji,jj,jk) + zdiff_mle(ji,jj) * ( 1.0_wp - ( 2.0_wp * znd + 1.0_wp )**2 ) *   & 
     905                     &                                    ( 1.0_wp + 5.0_wp / 21.0_wp * ( 2.0_wp * znd + 1.0_wp )**2 ) 
     906               END DO 
     907            END IF 
     908         END_2D 
     909      ENDIF 
     910      ! 
     911      ! Lateral boundary conditions on zvicos (sign unchanged), needed to caclulate viscosities on u and v grids 
     912      ! CALL lbc_lnk( 'zdfosm', zviscos(:,:,:), 'W', 1.0_wp ) 
     913      ! GN 25/8: need to change tmask --> wmask 
     914      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
     915         p_avt(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk) 
     916         p_avm(ji,jj,jk) = MAX( zviscos(ji,jj,jk), avmb(jk) ) * tmask(ji,jj,jk) 
     917      END_3D 
     918      ! 
     919      IF ( ln_dia_osm ) THEN 
     920         SELECT CASE (nn_osm_wave) 
     921            ! Stokes drift set by assumimg onstant La#=0.3 (=0) or Pierson-Moskovitz spectrum (=1) 
     922         CASE(0:1) 
     923            CALL zdf_osm_iomput( "us_x", tmask(A2D(0),1) * sustke(A2D(0)) * scos_wind(A2D(0)) )   ! x surface Stokes drift 
     924            CALL zdf_osm_iomput( "us_y", tmask(A2D(0),1) * sustke(A2D(0)) * scos_wind(A2D(0)) )   ! y surface Stokes drift 
     925            CALL zdf_osm_iomput( "wind_wave_abs_power", 1000.0_wp * rho0 * tmask(A2D(0),1) * sustar(A2D(0))**2 * sustke(A2D(0)) ) 
     926            ! Stokes drift read in from sbcwave  (=2). 
     927         CASE(2:3) 
     928            CALL zdf_osm_iomput( "us_x",   ut0sd(A2D(0)) * umask(A2D(0),1) )                         ! x surface Stokes drift 
     929            CALL zdf_osm_iomput( "us_y",   vt0sd(A2D(0)) * vmask(A2D(0),1) )                         ! y surface Stokes drift 
     930            CALL zdf_osm_iomput( "wmp",    wmp(A2D(0)) * tmask(A2D(0),1) )                           ! Wave mean period 
     931            CALL zdf_osm_iomput( "hsw",    hsw(A2D(0)) * tmask(A2D(0),1) )                           ! Significant wave height 
     932            CALL zdf_osm_iomput( "wmp_NP", ( 2.0_wp * rpi * 1.026_wp / ( 0.877_wp * grav ) ) *   &   ! Wave mean period from NP 
     933               &                           wndm(A2D(0)) * tmask(A2D(0),1) )                          !    spectrum 
     934            CALL zdf_osm_iomput( "hsw_NP", ( 0.22_wp / grav ) * wndm(A2D(0))**2 * tmask(A2D(0),1) )  ! Significant wave height from 
     935            !                                                                                        !    NP spectrum 
     936            CALL zdf_osm_iomput( "wndm",   wndm(A2D(0)) * tmask(A2D(0),1) )                          ! U_10 
     937            CALL zdf_osm_iomput( "wind_wave_abs_power", 1000.0_wp * rho0 * tmask(A2D(0),1) * sustar(A2D(0))**2 *   & 
     938               &                                        SQRT( ut0sd(A2D(0))**2 + vt0sd(A2D(0))**2 ) ) 
     939         END SELECT 
     940         CALL zdf_osm_iomput( "zwth0",           tmask(A2D(0),1) * swth0(A2D(0))     )      ! <Tw_0> 
     941         CALL zdf_osm_iomput( "zws0",            tmask(A2D(0),1) * sws0(A2D(0))      )      ! <Sw_0> 
     942         CALL zdf_osm_iomput( "zwb0",            tmask(A2D(0),1) * swb0(A2D(0))      )      ! <Sw_0> 
     943         CALL zdf_osm_iomput( "zwbav",           tmask(A2D(0),1) * swth0(A2D(0))     )      ! Upward BL-avged turb buoyancy flux 
     944         CALL zdf_osm_iomput( "ibld",            tmask(A2D(0),1) * nbld(A2D(0))      )      ! Boundary-layer max k 
     945         CALL zdf_osm_iomput( "zdt_bl",          tmask(A2D(0),1) * av_dt_bl(A2D(0))  )      ! dt at ml base 
     946         CALL zdf_osm_iomput( "zds_bl",          tmask(A2D(0),1) * av_ds_bl(A2D(0))  )      ! ds at ml base 
     947         CALL zdf_osm_iomput( "zdb_bl",          tmask(A2D(0),1) * av_db_bl(A2D(0))  )      ! db at ml base 
     948         CALL zdf_osm_iomput( "zdu_bl",          tmask(A2D(0),1) * av_du_bl(A2D(0))  )      ! du at ml base 
     949         CALL zdf_osm_iomput( "zdv_bl",          tmask(A2D(0),1) * av_dv_bl(A2D(0))  )      ! dv at ml base 
     950         CALL zdf_osm_iomput( "dh",              tmask(A2D(0),1) * dh(A2D(0))        )      ! Initial boundary-layer depth 
     951         CALL zdf_osm_iomput( "hml",             tmask(A2D(0),1) * hml(A2D(0))       )      ! Initial boundary-layer depth 
     952         CALL zdf_osm_iomput( "zdt_ml",          tmask(A2D(0),1) * av_dt_ml(A2D(0))  )      ! dt at ml base 
     953         CALL zdf_osm_iomput( "zds_ml",          tmask(A2D(0),1) * av_ds_ml(A2D(0))  )      ! ds at ml base 
     954         CALL zdf_osm_iomput( "zdb_ml",          tmask(A2D(0),1) * av_db_ml(A2D(0))  )      ! db at ml base 
     955         CALL zdf_osm_iomput( "dstokes",         tmask(A2D(0),1) * dstokes(A2D(0))   )      ! Stokes drift penetration depth 
     956         CALL zdf_osm_iomput( "zustke",          tmask(A2D(0),1) * sustke(A2D(0))    )      ! Stokes drift magnitude at T-points 
     957         CALL zdf_osm_iomput( "zwstrc",          tmask(A2D(0),1) * swstrc(A2D(0))    )      ! Convective velocity scale 
     958         CALL zdf_osm_iomput( "zwstrl",          tmask(A2D(0),1) * swstrl(A2D(0))    )      ! Langmuir velocity scale 
     959         CALL zdf_osm_iomput( "zustar",          tmask(A2D(0),1) * sustar(A2D(0))    )      ! Friction velocity scale 
     960         CALL zdf_osm_iomput( "zvstr",           tmask(A2D(0),1) * svstr(A2D(0))     )      ! Mixed velocity scale 
     961         CALL zdf_osm_iomput( "zla",             tmask(A2D(0),1) * sla(A2D(0))       )      ! Langmuir # 
     962         CALL zdf_osm_iomput( "wind_power",      1000.0_wp * rho0 * tmask(A2D(0),1) *   &   ! BL depth internal to zdf_osm routine 
     963            &                                    sustar(A2D(0))**3 ) 
     964         CALL zdf_osm_iomput( "wind_wave_power", 1000.0_wp * rho0 * tmask(A2D(0),1) *   & 
     965            &                                    sustar(A2D(0))**2 * sustke(A2D(0))  ) 
     966         CALL zdf_osm_iomput( "zhbl",            tmask(A2D(0),1) * zhbl(A2D(0))      )      ! BL depth internal to zdf_osm routine 
     967         CALL zdf_osm_iomput( "zhml",            tmask(A2D(0),1) * zhml(A2D(0))      )      ! ML depth internal to zdf_osm routine 
     968         CALL zdf_osm_iomput( "imld",            tmask(A2D(0),1) * nmld(A2D(0))      )      ! Index for ML depth internal to zdf_osm 
     969         !                                                                                  !    routine 
     970         CALL zdf_osm_iomput( "jp_ext",          tmask(A2D(0),1) * jk_ext(A2D(0))    )      ! =1 if pycnocline resolved internal to 
     971         !                                                                                  !    zdf_osm routine 
     972         CALL zdf_osm_iomput( "j_ddh",           tmask(A2D(0),1) * n_ddh(A2D(0))     )      ! Index forpyc thicknessh internal to 
     973         !                                                                                  !    zdf_osm routine 
     974         CALL zdf_osm_iomput( "zshear",          tmask(A2D(0),1) * zshear(A2D(0))    )      ! Shear production of TKE internal to 
     975         !                                                                                  !    zdf_osm routine 
     976         CALL zdf_osm_iomput( "zdh",             tmask(A2D(0),1) * zdh(A2D(0))       )      ! Pyc thicknessh internal to zdf_osm 
     977         !                                                                                  !    routine 
     978         CALL zdf_osm_iomput( "zhol",            tmask(A2D(0),1) * shol(A2D(0))      )      ! ML depth internal to zdf_osm routine 
     979         CALL zdf_osm_iomput( "zwb_ent",         tmask(A2D(0),1) * zwb_ent(A2D(0))   )      ! Upward turb buoyancy entrainment flux 
     980         CALL zdf_osm_iomput( "zt_ml",           tmask(A2D(0),1) * av_t_ml(A2D(0))   )      ! Average T in ML 
     981         CALL zdf_osm_iomput( "zmld",            tmask(A2D(0),1) * zmld(A2D(0))      )      ! FK target layer depth 
     982         CALL zdf_osm_iomput( "zwb_fk",          tmask(A2D(0),1) * zwb_fk(A2D(0))    )      ! FK b flux 
     983         CALL zdf_osm_iomput( "zwb_fk_b",        tmask(A2D(0),1) * zwb_fk_b(A2D(0))  )      ! FK b flux averaged over ML 
     984         CALL zdf_osm_iomput( "mld_prof",        tmask(A2D(0),1) * mld_prof(A2D(0))  )      ! FK layer max k 
     985         CALL zdf_osm_iomput( "zdtdx",           umask(A2D(0),1) * zdtdx(A2D(0))     )      ! FK dtdx at u-pt 
     986         CALL zdf_osm_iomput( "zdtdy",           vmask(A2D(0),1) * zdtdy(A2D(0))     )      ! FK dtdy at v-pt 
     987         CALL zdf_osm_iomput( "zdsdx",           umask(A2D(0),1) * zdsdx(A2D(0))     )      ! FK dtdx at u-pt 
     988         CALL zdf_osm_iomput( "zdsdy",           vmask(A2D(0),1) * zdsdy(A2D(0))     )      ! FK dsdy at v-pt 
     989         CALL zdf_osm_iomput( "dbdx_mle",        umask(A2D(0),1) * dbdx_mle(A2D(0))  )      ! FK dbdx at u-pt 
     990         CALL zdf_osm_iomput( "dbdy_mle",        vmask(A2D(0),1) * dbdy_mle(A2D(0))  )      ! FK dbdy at v-pt 
     991         CALL zdf_osm_iomput( "zdiff_mle",       tmask(A2D(0),1) * zdiff_mle(A2D(0)) )      ! FK diff in MLE at t-pt 
     992         CALL zdf_osm_iomput( "zvel_mle",        tmask(A2D(0),1) * zdiff_mle(A2D(0)) )      ! FK diff in MLE at t-pt 
     993      END IF 
     994      ! 
     995      ! Lateral boundary conditions on ghamu and ghamv, currently on W-grid (sign unchanged), needed to caclulate gham[uv] on u and 
     996      !    v grids 
     997      IF ( .NOT. l_istiled .OR. ntile == nijtile ) THEN   ! Finalise ghamu, ghamv, hbl, and hmle only after full domain has been 
     998         !                                                !    processed 
     999         IF ( nn_hls == 1 ) CALL lbc_lnk( 'zdfosm', ghamu, 'W', 1.0_wp,   & 
     1000            &                                       ghamv, 'W', 1.0_wp ) 
     1001         DO jk = 2, jpkm1 
     1002            DO jj = Njs0, Nje0 
     1003               DO ji = Nis0, Nie0 
     1004                  ghamu(ji,jj,jk) = ( ghamu(ji,jj,jk) + ghamu(ji+1,jj,jk) ) /   & 
     1005                     &              MAX( 1.0_wp, tmask(ji,jj,jk) + tmask (ji+1,jj,jk) ) * umask(ji,jj,jk) 
     1006                  ghamv(ji,jj,jk) = ( ghamv(ji,jj,jk) + ghamv(ji,jj+1,jk) ) /   & 
     1007                     &              MAX( 1.0_wp, tmask(ji,jj,jk) + tmask (ji,jj+1,jk) ) * vmask(ji,jj,jk) 
     1008                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) * tmask(ji,jj,jk) 
     1009                  ghams(ji,jj,jk) = ghams(ji,jj,jk) * tmask(ji,jj,jk) 
     1010               END DO 
     1011            END DO 
     1012         END DO 
     1013         ! Lateral boundary conditions on final outputs for hbl, on T-grid (sign unchanged) 
     1014         CALL lbc_lnk( 'zdfosm', hbl,  'T', 1.0_wp,   & 
     1015            &                    hmle, 'T', 1.0_wp ) 
     1016         ! 
     1017         CALL zdf_osm_iomput( "ghamt", tmask * ghamt       )   ! <Tw_NL> 
     1018         CALL zdf_osm_iomput( "ghams", tmask * ghams       )   ! <Sw_NL> 
     1019         CALL zdf_osm_iomput( "ghamu", umask * ghamu       )   ! <uw_NL> 
     1020         CALL zdf_osm_iomput( "ghamv", vmask * ghamv       )   ! <vw_NL> 
     1021         CALL zdf_osm_iomput( "hbl",   tmask(:,:,1) * hbl  )   ! Boundary-layer depth 
     1022         CALL zdf_osm_iomput( "hmle",  tmask(:,:,1) * hmle )   ! FK layer depth 
     1023      END IF 
     1024      ! 
     1025   END SUBROUTINE zdf_osm 
     1026 
     1027   SUBROUTINE zdf_osm_vertical_average( Kbb, Kmm, knlev, pt, ps,   & 
     1028      &                                 pb, pu, pv, kp_ext, pdt,   & 
     1029      &                                 pds, pdb, pdu, pdv ) 
     1030      !!--------------------------------------------------------------------- 
     1031      !!                ***  ROUTINE zdf_vertical_average  *** 
     1032      !! 
     1033      !! ** Purpose : Determines vertical averages from surface to knlev, 
     1034      !!              and optionally the differences between these vertical 
     1035      !!              averages and values at an external level 
     1036      !! 
     1037      !! ** Method  : Averages are calculated from the surface to knlev. 
     1038      !!              The external level used to calculate differences is 
     1039      !!              knlev+kp_ext 
     1040      !!---------------------------------------------------------------------- 
     1041      INTEGER,                            INTENT(in   )           ::   Kbb, Kmm   ! Ocean time-level indices 
     1042      INTEGER,  DIMENSION(A2D(nn_hls-1)), INTENT(in   )           ::   knlev      ! Number of levels to average over. 
     1043      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out)           ::   pt, ps     ! Average temperature and salinity 
     1044      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out)           ::   pb         ! Average buoyancy 
     1045      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out)           ::   pu, pv     ! Average current components 
     1046      INTEGER,  DIMENSION(A2D(nn_hls-1)), INTENT(in   ), OPTIONAL ::   kp_ext     ! External-level offsets 
     1047      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pdt        ! Difference between average temperature, 
     1048      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pds        !    salinity, 
     1049      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pdb        !    buoyancy, and 
     1050      REAL(wp), DIMENSION(jpi,jpj),       INTENT(  out), OPTIONAL ::   pdu, pdv   !    velocity components and the OSBL 
     1051      !! 
     1052      INTEGER                              ::   jk, jkflt, jkmax, ji, jj   ! Loop indices 
     1053      INTEGER                              ::   ibld_ext                   ! External-layer index 
     1054      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zthick                     ! Layer thickness 
     1055      REAL(wp)                             ::   zthermal                   ! Thermal expansion coefficient 
     1056      REAL(wp)                             ::   zbeta                      ! Haline contraction coefficient 
     1057      !!---------------------------------------------------------------------- 
     1058      ! 
     1059      ! Averages over depth of boundary layer 
     1060      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1061         pt(ji,jj) = 0.0_wp 
     1062         ps(ji,jj) = 0.0_wp 
     1063         pu(ji,jj) = 0.0_wp 
     1064         pv(ji,jj) = 0.0_wp 
     1065      END_2D 
     1066      zthick(:,:) = epsln 
     1067      jkflt = jpk 
     1068      jkmax = 0 
     1069      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1070         IF ( knlev(ji,jj) < jkflt ) jkflt = knlev(ji,jj) 
     1071         IF ( knlev(ji,jj) > jkmax ) jkmax = knlev(ji,jj) 
     1072      END_2D 
     1073      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jkflt )   ! Upper, flat part of layer 
     1074         zthick(ji,jj) = zthick(ji,jj) + e3t(ji,jj,jk,Kmm) 
     1075         pt(ji,jj)     = pt(ji,jj)     + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) 
     1076         ps(ji,jj)     = ps(ji,jj)     + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) 
     1077         pu(ji,jj)     = pu(ji,jj)     + e3t(ji,jj,jk,Kmm) *                                        & 
     1078            &                               ( uu(ji,jj,jk,Kbb) + uu(ji - 1,jj,jk,Kbb) ) /           & 
     1079            &                               MAX( 1.0_wp , umask(ji,jj,jk) + umask(ji - 1,jj,jk) ) 
     1080         pv(ji,jj)     = pv(ji,jj)     + e3t(ji,jj,jk,Kmm) *                                        & 
     1081            &                               ( vv(ji,jj,jk,Kbb) + vv(ji,jj - 1,jk,Kbb) ) /           & 
     1082            &                               MAX( 1.0_wp , vmask(ji,jj,jk) + vmask(ji,jj - 1,jk) )          
     1083      END_3D 
     1084      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jkflt+1, jkmax )   ! Lower, non-flat part of layer 
     1085         IF ( knlev(ji,jj) >= jk ) THEN 
     1086            zthick(ji,jj) = zthick(ji,jj) + e3t(ji,jj,jk,Kmm) 
     1087            pt(ji,jj)     = pt(ji,jj)     + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) 
     1088            ps(ji,jj)     = ps(ji,jj)     + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) 
     1089            pu(ji,jj)     = pu(ji,jj)     + e3t(ji,jj,jk,Kmm) *                                        & 
     1090               &                               ( uu(ji,jj,jk,Kbb) + uu(ji - 1,jj,jk,Kbb) ) /           & 
     1091               &                               MAX( 1.0_wp , umask(ji,jj,jk) + umask(ji - 1,jj,jk) ) 
     1092            pv(ji,jj)     = pv(ji,jj)     + e3t(ji,jj,jk,Kmm) *                                        & 
     1093               &                               ( vv(ji,jj,jk,Kbb) + vv(ji,jj - 1,jk,Kbb) ) /           & 
     1094               &                               MAX( 1.0_wp , vmask(ji,jj,jk) + vmask(ji,jj - 1,jk) ) 
     1095         END IF 
     1096      END_3D 
     1097      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1098         pt(ji,jj) = pt(ji,jj) / zthick(ji,jj) 
     1099         ps(ji,jj) = ps(ji,jj) / zthick(ji,jj) 
     1100         pu(ji,jj) = pu(ji,jj) / zthick(ji,jj) 
     1101         pv(ji,jj) = pv(ji,jj) / zthick(ji,jj) 
     1102         zthermal  = rab_n(ji,jj,1,jp_tem)   ! ideally use nbld not 1?? 
     1103         zbeta     = rab_n(ji,jj,1,jp_sal) 
     1104         pb(ji,jj) = grav * zthermal * pt(ji,jj) - grav * zbeta * ps(ji,jj) 
     1105      END_2D 
     1106      ! 
     1107      ! Differences between vertical averages and values at an external layer 
     1108      IF ( PRESENT( kp_ext ) ) THEN 
     1109         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1110            ibld_ext = knlev(ji,jj) + kp_ext(ji,jj) 
     1111            IF ( ibld_ext <= mbkt(ji,jj)-1 ) THEN   ! ag 09/03 
     1112               ! Two external levels are available 
     1113               pdt(ji,jj) = pt(ji,jj) - ts(ji,jj,ibld_ext,jp_tem,Kmm) 
     1114               pds(ji,jj) = ps(ji,jj) - ts(ji,jj,ibld_ext,jp_sal,Kmm) 
     1115               pdu(ji,jj) = pu(ji,jj) - ( uu(ji,jj,ibld_ext,Kbb) + uu(ji-1,jj,ibld_ext,Kbb ) ) /              & 
     1116                  &                        MAX(1.0_wp , umask(ji,jj,ibld_ext ) + umask(ji-1,jj,ibld_ext ) ) 
     1117               pdv(ji,jj) = pv(ji,jj) - ( vv(ji,jj,ibld_ext,Kbb) + vv(ji,jj-1,ibld_ext,Kbb ) ) /              & 
     1118                  &                        MAX(1.0_wp , vmask(ji,jj,ibld_ext ) + vmask(ji,jj-1,ibld_ext ) ) 
     1119               zthermal   = rab_n(ji,jj,1,jp_tem)   ! ideally use nbld not 1?? 
     1120               zbeta      = rab_n(ji,jj,1,jp_sal) 
     1121               pdb(ji,jj) = grav * zthermal * pdt(ji,jj) - grav * zbeta * pds(ji,jj) 
     1122            ELSE 
     1123               pdt(ji,jj) = 0.0_wp 
     1124               pds(ji,jj) = 0.0_wp 
     1125               pdu(ji,jj) = 0.0_wp 
     1126               pdv(ji,jj) = 0.0_wp 
     1127               pdb(ji,jj) = 0.0_wp 
     1128            ENDIF 
     1129         END_2D 
     1130      END IF 
     1131      ! 
     1132   END SUBROUTINE zdf_osm_vertical_average 
     1133 
     1134   SUBROUTINE zdf_osm_velocity_rotation_2d( pu, pv, fwd ) 
     1135      !!--------------------------------------------------------------------- 
     1136      !!            ***  ROUTINE zdf_velocity_rotation_2d  *** 
     1137      !! 
     1138      !! ** Purpose : Rotates frame of reference of velocity components pu and 
     1139      !!              pv (2d) 
     1140      !! 
     1141      !! ** Method : The velocity components are rotated into (fwd=.TRUE.) or 
     1142      !!             from (fwd=.FALSE.) the frame specified by scos_wind and 
     1143      !!             ssin_wind 
     1144      !! 
     1145      !!----------------------------------------------------------------------       
     1146      REAL(wp),           INTENT(inout), DIMENSION(jpi,jpj) ::   pu, pv   ! Components of current 
     1147      LOGICAL,  OPTIONAL, INTENT(in   )                     ::   fwd      ! Forward (default) or reverse rotation 
     1148      !! 
     1149      INTEGER  ::   ji, jj       ! Loop indices 
     1150      REAL(wp) ::   ztmp, zfwd   ! Auxiliary variables 
     1151      !!----------------------------------------------------------------------       
     1152      ! 
     1153      zfwd = 1.0_wp 
     1154      IF( PRESENT(fwd) .AND. ( .NOT. fwd ) ) zfwd = -1.0_wp 
     1155      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1156         ztmp      = pu(ji,jj) 
     1157         pu(ji,jj) = pu(ji,jj) * scos_wind(ji,jj) + zfwd * pv(ji,jj) * ssin_wind(ji,jj) 
     1158         pv(ji,jj) = pv(ji,jj) * scos_wind(ji,jj) - zfwd * ztmp      * ssin_wind(ji,jj) 
     1159      END_2D 
     1160      ! 
     1161   END SUBROUTINE zdf_osm_velocity_rotation_2d 
     1162 
     1163   SUBROUTINE zdf_osm_velocity_rotation_3d( pu, pv, fwd, ktop, knlev ) 
     1164      !!--------------------------------------------------------------------- 
     1165      !!            ***  ROUTINE zdf_velocity_rotation_3d  *** 
     1166      !! 
     1167      !! ** Purpose : Rotates frame of reference of velocity components pu and 
     1168      !!              pv (3d) 
     1169      !! 
     1170      !! ** Method : The velocity components are rotated into (fwd=.TRUE.) or 
     1171      !!             from (fwd=.FALSE.) the frame specified by scos_wind and 
     1172      !!             ssin_wind; optionally, the rotation can be restricted at 
     1173      !!             each water column to span from the a minimum index ktop to 
     1174      !!             the depth index specified in array knlev 
     1175      !! 
     1176      !!----------------------------------------------------------------------       
     1177      REAL(wp),           INTENT(inout), DIMENSION(jpi,jpj,jpk)   ::   pu, pv   ! Components of current 
     1178      LOGICAL,  OPTIONAL, INTENT(in   )                           ::   fwd      ! Forward (default) or reverse rotation 
     1179      INTEGER,  OPTIONAL, INTENT(in   )                           ::   ktop     ! Minimum depth index 
     1180      INTEGER,  OPTIONAL, INTENT(in   ), DIMENSION(A2D(nn_hls-1)) ::   knlev    ! Array of maximum depth indices 
     1181      !! 
     1182      INTEGER  ::   ji, jj, jk, jktop, jkmax   ! Loop indices 
     1183      REAL(wp) ::   ztmp, zfwd                 ! Auxiliary variables 
     1184      LOGICAL  ::   llkbot                     ! Auxiliary variable 
     1185      !!----------------------------------------------------------------------       
     1186      ! 
     1187      zfwd = 1.0_wp 
     1188      IF( PRESENT(fwd) .AND. ( .NOT. fwd ) ) zfwd = -1.0_wp 
     1189      jktop = 1 
     1190      IF( PRESENT(ktop) ) jktop = ktop 
     1191      IF( PRESENT(knlev) ) THEN 
     1192         jkmax = 0 
     1193         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1194            IF ( knlev(ji,jj) > jkmax ) jkmax = knlev(ji,jj) 
     1195         END_2D 
     1196         llkbot = .FALSE. 
     1197      ELSE 
     1198         jkmax = jpk 
     1199         llkbot = .TRUE. 
     1200      END IF 
     1201      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jktop, jkmax ) 
     1202         IF ( llkbot .OR. knlev(ji,jj) >= jk ) THEN 
     1203            ztmp         = pu(ji,jj,jk) 
     1204            pu(ji,jj,jk) = pu(ji,jj,jk) * scos_wind(ji,jj) + zfwd * pv(ji,jj,jk) * ssin_wind(ji,jj) 
     1205            pv(ji,jj,jk) = pv(ji,jj,jk) * scos_wind(ji,jj) - zfwd * ztmp         * ssin_wind(ji,jj) 
     1206         END IF 
     1207      END_3D 
     1208      ! 
     1209   END SUBROUTINE zdf_osm_velocity_rotation_3d 
     1210 
     1211   SUBROUTINE zdf_osm_osbl_state( Kmm, pwb_ent, pwb_min, pshear, phbl,   & 
     1212      &                           phml, pdh ) 
     1213      !!--------------------------------------------------------------------- 
     1214      !!                 ***  ROUTINE zdf_osm_osbl_state  *** 
     1215      !! 
     1216      !! ** Purpose : Determines the state of the OSBL, stable/unstable, 
     1217      !!              shear/ noshear. Also determines shear production, 
     1218      !!              entrainment buoyancy flux and interfacial Richardson 
     1219      !!              number 
     1220      !! 
     1221      !! ** Method  : 
     1222      !! 
     1223      !!---------------------------------------------------------------------- 
     1224      INTEGER,                            INTENT(in   ) ::   Kmm       ! Ocean time-level index 
     1225      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pwb_ent   ! Buoyancy fluxes at base 
     1226      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pwb_min   !    of well-mixed layer 
     1227      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pshear    ! Production of TKE due to shear across the pycnocline 
     1228      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl      ! BL depth 
     1229      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phml      ! ML depth 
     1230      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdh       ! Pycnocline depth 
     1231      !! 
     1232      INTEGER :: jj, ji   ! Loop indices 
     1233      !! 
     1234      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zekman 
     1235      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zri_p, zri_b   ! Richardson numbers 
     1236      REAL(wp)                           ::   zshear_u, zshear_v, zwb_shr 
     1237      REAL(wp)                           ::   zwcor, zrf_conv, zrf_shear, zrf_langmuir, zr_stokes 
     1238      !! 
     1239      REAL(wp), PARAMETER ::   pp_a_shr         = 0.4_wp,  pp_b_shr    = 6.5_wp,  pp_a_wb_s = 0.8_wp 
     1240      REAL(wp), PARAMETER ::   pp_alpha_c       = 0.2_wp,  pp_alpha_lc = 0.03_wp 
     1241      REAL(wp), PARAMETER ::   pp_alpha_ls      = 0.06_wp, pp_alpha_s  = 0.15_wp 
     1242      REAL(wp), PARAMETER ::   pp_ri_p_thresh   = 27.0_wp 
     1243      REAL(wp), PARAMETER ::   pp_ri_c          = 0.25_wp 
     1244      REAL(wp), PARAMETER ::   pp_ek            = 4.0_wp 
     1245      REAL(wp), PARAMETER ::   pp_large         = -1e10_wp 
     1246      !!---------------------------------------------------------------------- 
     1247      ! 
     1248      ! Initialise arrays 
     1249      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1250         l_conv(ji,jj)  = .FALSE. 
     1251         l_shear(ji,jj) = .FALSE. 
     1252         n_ddh(ji,jj)   = 1 
     1253      END_2D 
     1254      ! Initialise INTENT(  out) arrays 
     1255      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1256         pwb_ent(ji,jj) = pp_large 
     1257         pwb_min(ji,jj) = pp_large 
     1258      END_2D 
     1259      ! 
     1260      ! Determins stability and set flag l_conv 
     1261      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1262         IF ( shol(ji,jj) < 0.0_wp ) THEN 
     1263            l_conv(ji,jj) = .TRUE. 
     1264         ELSE 
     1265            l_conv(ji,jj) = .FALSE. 
    6561266         ENDIF 
    657       END_3D 
    658  
    659 ! 
    660 ! Step through model levels taking account of buoyancy change to determine the effect on dhdt 
    661 ! 
    662       CALL zdf_osm_timestep_hbl( zdhdt ) 
    663 ! is external level in bounds? 
    664  
    665       CALL zdf_osm_vertical_average( ibld, jp_ext, zt_bl, zs_bl, zb_bl, zu_bl, zv_bl, zdt_bl, zds_bl, zdb_bl, zdu_bl, zdv_bl ) 
    666 ! 
    667 ! 
    668 ! Check to see if lpyc needs to be changed 
    669  
    670       CALL zdf_osm_pycnocline_thickness( dh, zdh ) 
    671  
    672       DO_2D( 0, 0, 0, 0 ) 
    673        IF ( zdb_bl(ji,jj) < rn_osm_bl_thresh .or. ibld(ji,jj) + jp_ext(ji,jj) >= mbkt(ji,jj) .or. ibld(ji,jj)-imld(ji,jj) == 1 ) lpyc(ji,jj) = .FALSE. 
    674       END_2D 
    675  
    676       dstokes(:,:) = MIN ( dstokes(:,:), hbl(:,:)/3. )  !  Limit delta for shallow boundary layers for calculating flux-gradient terms. 
    677 ! 
    678     ! Average over the depth of the mixed layer in the convective boundary layer 
    679 !      jp_ext = ibld - imld +1 
    680       CALL zdf_osm_vertical_average( imld-1, ibld-imld+1, zt_ml, zs_ml, zb_ml, zu_ml, zv_ml, zdt_ml, zds_ml, zdb_ml, zdu_ml, zdv_ml ) 
    681     ! rotate mean currents and changes onto wind align co-ordinates 
    682     ! 
    683      CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_ml, zv_ml, zdu_ml, zdv_ml ) 
    684      CALL zdf_osm_velocity_rotation( zcos_wind, zsin_wind, zu_bl, zv_bl, zdu_bl, zdv_bl ) 
    685       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    686       !  Pycnocline gradients for scalars and velocity 
    687       !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    688  
    689       CALL zdf_osm_external_gradients( ibld+2, zdtdz_bl_ext, zdsdz_bl_ext, zdbdz_bl_ext ) 
    690       CALL zdf_osm_pycnocline_scalar_profiles( zdtdz_pyc, zdsdz_pyc, zdbdz_pyc, zalpha_pyc ) 
    691       CALL zdf_osm_pycnocline_shear_profiles( zdudz_pyc, zdvdz_pyc ) 
    692        !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    693        ! Eddy viscosity/diffusivity and non-gradient terms in the flux-gradient relationship 
    694        !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    695        CALL zdf_osm_diffusivity_viscosity( zdiffut, zviscos ) 
    696  
    697        ! 
    698        ! calculate non-gradient components of the flux-gradient relationships 
    699        ! 
    700 ! Stokes term in scalar flux, flux-gradient relationship 
    701        WHERE ( lconv ) 
    702           zsc_wth_1 = zwstrl**3 * zwth0 / ( zvstr**3 + 0.5 * zwstrc**3 + epsln) 
    703           ! 
    704           zsc_ws_1 = zwstrl**3 * zws0 / ( zvstr**3 + 0.5 * zwstrc**3 + epsln ) 
    705        ELSEWHERE 
    706           zsc_wth_1 = 2.0 * zwthav 
    707           ! 
    708           zsc_ws_1 = 2.0 * zwsav 
    709        ENDWHERE 
    710  
    711  
    712        DO_2D( 0, 0, 0, 0 ) 
    713          IF ( lconv(ji,jj) ) THEN 
    714            DO jk = 2, imld(ji,jj) 
    715               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    716               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) 
    717               ! 
    718               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) 
    719            END DO ! end jk loop 
    720          ELSE     ! else for if (lconv) 
    721  ! Stable conditions 
    722             DO jk = 2, ibld(ji,jj) 
    723                zznd_d=gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    724                ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 1.5 * EXP ( -0.9 * zznd_d ) & 
    725                     &          *                 ( 1.0 - EXP ( -4.0 * zznd_d ) ) * zsc_wth_1(ji,jj) 
    726                ! 
    727                ghams(ji,jj,jk) = ghams(ji,jj,jk) + 1.5 * EXP ( -0.9 * zznd_d ) & 
    728                     &          *                 ( 1.0 - EXP ( -4.0 * zznd_d ) ) *  zsc_ws_1(ji,jj) 
    729             END DO 
    730          ENDIF               ! endif for check on lconv 
    731  
    732        END_2D 
    733  
    734 ! 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) 
    735        WHERE ( lconv ) 
    736           zsc_uw_1 = ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * zustke / MAX( ( 1.0 - 1.0 * 6.5 * zla**(8.0/3.0) ), 0.2 ) 
    737           zsc_uw_2 = ( zwstrl**3 + 0.5 * zwstrc**3 )**pthird * zustke / MIN( zla**(8.0/3.0) + epsln, 0.12 ) 
    738           zsc_vw_1 = ff_t * zhml * zustke**3 * MIN( zla**(8.0/3.0), 0.12 ) / ( ( zvstr**3 + 0.5 * zwstrc**3 )**(2.0/3.0) + epsln ) 
    739        ELSEWHERE 
    740           zsc_uw_1 = zustar**2 
    741           zsc_vw_1 = ff_t * zhbl * zustke**3 * MIN( zla**(8.0/3.0), 0.12 ) / (zvstr**2 + epsln) 
    742        ENDWHERE 
    743        IF(ln_dia_osm) THEN 
    744           IF ( iom_use("ghamu_00") ) CALL iom_put( "ghamu_00", wmask*ghamu ) 
    745           IF ( iom_use("ghamv_00") ) CALL iom_put( "ghamv_00", wmask*ghamv ) 
    746        END IF 
    747        DO_2D( 0, 0, 0, 0 ) 
    748           IF ( lconv(ji,jj) ) THEN 
    749              DO jk = 2, imld(ji,jj) 
    750                 zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    751                 ghamu(ji,jj,jk) = ghamu(ji,jj,jk) +      ( -0.05 * EXP ( -0.4 * zznd_d )   * zsc_uw_1(ji,jj)   & 
    752                      &          +                        0.00125 * EXP (      - zznd_d )   * zsc_uw_2(ji,jj) ) & 
    753                      &          *                          ( 1.0 - EXP ( -2.0 * zznd_d ) ) 
    754 ! 
    755                 ghamv(ji,jj,jk) = ghamv(ji,jj,jk) - 0.65 *  0.15 * EXP (      - zznd_d )                       & 
    756                      &          *                          ( 1.0 - EXP ( -2.0 * zznd_d ) ) * zsc_vw_1(ji,jj) 
    757              END DO   ! end jk loop 
    758           ELSE 
    759 ! Stable conditions 
    760              DO jk = 2, ibld(ji,jj) ! corrected to ibld 
    761                 zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    762                 ghamu(ji,jj,jk) = ghamu(ji,jj,jk) - 0.75 *   1.3 * EXP ( -0.5 * zznd_d )                       & 
    763                      &                                   * ( 1.0 - EXP ( -4.0 * zznd_d ) ) * zsc_uw_1(ji,jj) 
    764                 ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + 0._wp 
    765              END DO   ! end jk loop 
    766           ENDIF 
    767        END_2D 
    768  
    769 ! Buoyancy term in flux-gradient relationship [note : includes ROI ratio (X0.3) and pressure (X0.5)] 
    770  
    771        WHERE ( lconv ) 
    772           zsc_wth_1 = zwbav * zwth0 * ( 1.0 + EXP ( 0.2 * zhol ) ) / ( zvstr**3 + 0.5 * zwstrc**3 + epsln ) 
    773           zsc_ws_1  = zwbav * zws0  * ( 1.0 + EXP ( 0.2 * zhol ) ) / ( zvstr**3 + 0.5 * zwstrc**3 + epsln ) 
    774        ELSEWHERE 
    775           zsc_wth_1 = 0._wp 
    776           zsc_ws_1 = 0._wp 
    777        ENDWHERE 
    778  
    779        DO_2D( 0, 0, 0, 0 ) 
    780           IF (lconv(ji,jj) ) THEN 
    781              DO jk = 2, imld(ji,jj) 
    782                 zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj) 
    783                 ! calculate turbulent length scale 
    784                 zl_c = 0.9 * ( 1.0 - EXP ( - 7.0 * ( zznd_ml - zznd_ml**3 / 3.0 ) ) )                                           & 
    785                      &     * ( 1.0 - EXP ( -15.0 * (     1.1 - zznd_ml          ) ) ) 
    786                 zl_l = 2.0 * ( 1.0 - EXP ( - 2.0 * ( zznd_ml - zznd_ml**3 / 3.0 ) ) )                                           & 
    787                      &     * ( 1.0 - EXP ( - 5.0 * (     1.0 - zznd_ml          ) ) ) * ( 1.0 + dstokes(ji,jj) / zhml (ji,jj) ) 
    788                 zl_eps = zl_l + ( zl_c - zl_l ) / ( 1.0 + EXP ( -3.0 * LOG10 ( - zhol(ji,jj) ) ) ) ** (3.0 / 2.0) 
    789                 ! non-gradient buoyancy terms 
    790                 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 ) 
    791                 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 ) 
    792              END DO 
    793  
    794              IF ( lpyc(ji,jj) ) THEN 
    795                ztau_sc_u(ji,jj) = zhml(ji,jj) / ( zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**pthird 
    796                ztau_sc_u(ji,jj) = ztau_sc_u(ji,jj) * ( 1.4 -0.4 / ( 1.0 + EXP( -3.5 * LOG10( -zhol(ji,jj) ) ) )**1.5 ) 
    797                zwth_ent =  -0.003 * ( 0.15 * zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**pthird * ( 1.0 - zdh(ji,jj) /zhbl(ji,jj) ) * zdt_ml(ji,jj) 
    798                zws_ent =  -0.003 * ( 0.15 * zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**pthird * ( 1.0 - zdh(ji,jj) /zhbl(ji,jj) ) * zds_ml(ji,jj) 
    799 ! Cubic profile used for buoyancy term 
    800                za_cubic = 0.755 * ztau_sc_u(ji,jj) 
    801                zb_cubic = 0.25 * ztau_sc_u(ji,jj) 
    802                DO jk = 2, ibld(ji,jj) 
    803                  zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / zdh(ji,jj) 
    804                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) - 0.045 * ( ( zwth_ent * zdbdz_pyc(ji,jj,jk) ) * ztau_sc_u(ji,jj)**2 ) * MAX( ( 1.75 * zznd_pyc -0.15 * zznd_pyc**2 - 0.2 * zznd_pyc**3 ), 0.0 ) 
    805  
    806                  ghams(ji,jj,jk) = ghams(ji,jj,jk) - 0.045 * ( ( zws_ent * zdbdz_pyc(ji,jj,jk) ) * ztau_sc_u(ji,jj)**2 ) * MAX( ( 1.75 * zznd_pyc -0.15 * zznd_pyc**2 - 0.2 * zznd_pyc**3 ), 0.0 ) 
    807                END DO 
    808 ! 
    809                zbuoy_pyc_sc = zalpha_pyc(ji,jj) * zdb_ml(ji,jj) / zdh(ji,jj) + zdbdz_bl_ext(ji,jj) 
    810                zdelta_pyc = ( zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**pthird / SQRT( MAX( zbuoy_pyc_sc, ( zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**p2third / zdh(ji,jj)**2 ) ) 
    811 ! 
    812                zwt_pyc_sc_1 = 0.325 * ( zalpha_pyc(ji,jj) * zdt_ml(ji,jj) / zdh(ji,jj) + zdtdz_bl_ext(ji,jj) ) * zdelta_pyc**2 / zdh(ji,jj) 
    813 ! 
    814                zws_pyc_sc_1 = 0.325 * ( zalpha_pyc(ji,jj) * zds_ml(ji,jj) / zdh(ji,jj) + zdsdz_bl_ext(ji,jj) ) * zdelta_pyc**2 / zdh(ji,jj) 
    815 ! 
    816                zzeta_pyc = 0.15 - 0.175 / ( 1.0 + EXP( -3.5 * LOG10( -zhol(ji,jj) ) ) ) 
    817                DO jk = 2, ibld(ji,jj) 
    818                  zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / zdh(ji,jj) 
    819                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.05 * zwt_pyc_sc_1 * EXP( -0.25 * ( zznd_pyc / zzeta_pyc )**2 ) * zdh(ji,jj) / ( zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**pthird 
    820 ! 
    821                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.05 * zws_pyc_sc_1 * EXP( -0.25 * ( zznd_pyc / zzeta_pyc )**2 ) * zdh(ji,jj) / ( zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 )**pthird 
    822                END DO 
    823             ENDIF ! End of pycnocline 
    824           ELSE ! lconv test - stable conditions 
    825              DO jk = 2, ibld(ji,jj) 
    826                 ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zsc_wth_1(ji,jj) 
    827                 ghams(ji,jj,jk) = ghams(ji,jj,jk) +  zsc_ws_1(ji,jj) 
    828              END DO 
    829           ENDIF 
    830        END_2D 
    831  
    832        WHERE ( lconv ) 
    833           zsc_uw_1 = -zwb0 * zustar**2 * zhml / ( zvstr**3 + 0.5 * zwstrc**3 + epsln ) 
    834           zsc_uw_2 =  zwb0 * zustke    * zhml / ( zvstr**3 + 0.5 * zwstrc**3 + epsln )**(2.0/3.0) 
    835           zsc_vw_1 = 0._wp 
    836        ELSEWHERE 
    837          zsc_uw_1 = 0._wp 
    838          zsc_vw_1 = 0._wp 
    839        ENDWHERE 
    840  
    841        DO_2D( 0, 0, 0, 0 ) 
    842           IF ( lconv(ji,jj) ) THEN 
    843              DO jk = 2 , imld(ji,jj) 
    844                 zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    845                 ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.3 * 0.5 * ( zsc_uw_1(ji,jj) +   0.125 * EXP( -0.5 * zznd_d )     & 
    846                      &                                                            * (   1.0 - EXP( -0.5 * zznd_d ) )   & 
    847                      &                                          * zsc_uw_2(ji,jj)                                    ) 
    848                 ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj) 
    849              END DO  ! jk loop 
    850           ELSE 
    851           ! stable conditions 
    852              DO jk = 2, ibld(ji,jj) 
    853                 ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zsc_uw_1(ji,jj) 
    854                 ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj) 
    855              END DO 
    856           ENDIF 
    857        END_2D 
    858  
    859        DO_2D( 0, 0, 0, 0 ) 
    860         IF ( lpyc(ji,jj) ) THEN 
    861           IF ( j_ddh(ji,jj) == 0 ) THEN 
    862 ! Place holding code. Parametrization needs checking for these conditions. 
    863             zomega = ( 0.15 * zwstrl(ji,jj)**3 + zwstrc(ji,jj)**3 + 4.75 * ( zshear(ji,jj)* zhbl(ji,jj) )**pthird )**pthird 
    864             zuw_bse = -0.0035 * zomega * ( 1.0 - zdh(ji,jj) / zhbl(ji,jj) ) * zdu_ml(ji,jj) 
    865             zvw_bse = -0.0075 * zomega * ( 1.0 - zdh(ji,jj) / zhbl(ji,jj) ) * zdv_ml(ji,jj) 
    866           ELSE 
    867             zomega = ( 0.15 * zwstrl(ji,jj)**3 + zwstrc(ji,jj)**3 + 4.75 * ( zshear(ji,jj)* zhbl(ji,jj) )**pthird )**pthird 
    868             zuw_bse = -0.0035 * zomega * ( 1.0 - zdh(ji,jj) / zhbl(ji,jj) ) * zdu_ml(ji,jj) 
    869             zvw_bse = -0.0075 * zomega * ( 1.0 - zdh(ji,jj) / zhbl(ji,jj) ) * zdv_ml(ji,jj) 
    870           ENDIF 
    871           zd_cubic = zdh(ji,jj) / zhbl(ji,jj) * zuw0(ji,jj) - ( 2.0 + zdh(ji,jj) /zhml(ji,jj) ) * zuw_bse 
    872           zc_cubic = zuw_bse - zd_cubic 
    873 ! need ztau_sc_u to be available. Change to array. 
    874           DO jk = imld(ji,jj), ibld(ji,jj) 
    875              zznd_pyc = - ( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / zdh(ji,jj) 
    876              ghamu(ji,jj,jk) = ghamu(ji,jj,jk) - 0.045 * ztau_sc_u(ji,jj)**2 * ( zc_cubic * zznd_pyc**2 + zd_cubic * zznd_pyc**3 ) * ( 0.75 + 0.25 * zznd_pyc )**2 * zdbdz_pyc(ji,jj,jk) 
    877           END DO 
    878           zvw_max = 0.7 * ff_t(ji,jj) * ( zustke(ji,jj) * dstokes(ji,jj) + 0.75 * zustar(ji,jj) * zhml(ji,jj) ) 
    879           zd_cubic = zvw_max * zdh(ji,jj) / zhml(ji,jj) - ( 2.0 + zdh(ji,jj) /zhml(ji,jj) ) * zvw_bse 
    880           zc_cubic = zvw_bse - zd_cubic 
    881           DO jk = imld(ji,jj), ibld(ji,jj) 
    882             zznd_pyc = -( gdepw(ji,jj,jk,Kmm) -zhbl(ji,jj) ) / zdh(ji,jj) 
    883             ghamv(ji,jj,jk) = ghamv(ji,jj,jk) - 0.045 * ztau_sc_u(ji,jj)**2 * ( zc_cubic * zznd_pyc**2 + zd_cubic * zznd_pyc**3 ) * ( 0.75 + 0.25 * zznd_pyc )**2 * zdbdz_pyc(ji,jj,jk) 
    884           END DO 
    885         ENDIF  ! lpyc 
    886        END_2D 
    887  
    888        IF(ln_dia_osm) THEN 
    889           IF ( iom_use("ghamu_0") ) CALL iom_put( "ghamu_0", wmask*ghamu ) 
    890           IF ( iom_use("zsc_uw_1_0") ) CALL iom_put( "zsc_uw_1_0", tmask(:,:,1)*zsc_uw_1 ) 
    891        END IF 
    892 ! Transport term in flux-gradient relationship [note : includes ROI ratio (X0.3) ] 
    893  
    894        DO_2D( 1, 0, 1, 0 ) 
    895  
    896          IF ( lconv(ji,jj) ) THEN 
    897            zsc_wth_1(ji,jj) = zwth0(ji,jj) / ( 1.0 - 0.56 * EXP( zhol(ji,jj) ) ) 
    898            zsc_ws_1(ji,jj) = zws0(ji,jj) / (1.0 - 0.56 *EXP( zhol(ji,jj) ) ) 
    899            IF ( lpyc(ji,jj) ) THEN 
    900 ! Pycnocline scales 
    901               zsc_wth_pyc(ji,jj) = -0.2 * zwb0(ji,jj) * zdt_bl(ji,jj) / zdb_bl(ji,jj) 
    902               zsc_ws_pyc(ji,jj) = -0.2 * zwb0(ji,jj) * zds_bl(ji,jj) / zdb_bl(ji,jj) 
    903             ENDIF 
    904          ELSE 
    905            zsc_wth_1(ji,jj) = 2.0 * zwthav(ji,jj) 
    906            zsc_ws_1(ji,jj) = zws0(ji,jj) 
    907          ENDIF 
    908        END_2D 
    909  
    910        DO_2D( 0, 0, 0, 0 ) 
    911          IF ( lconv(ji,jj) ) THEN 
    912             DO jk = 2, imld(ji,jj) 
    913                zznd_ml=gdepw(ji,jj,jk,Kmm) / zhml(ji,jj) 
    914                ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * zsc_wth_1(ji,jj)                & 
    915                     &          * ( -2.0 + 2.75 * (       ( 1.0 + 0.6 * zznd_ml**4 )      & 
    916                     &                               - EXP(     - 6.0 * zznd_ml    ) ) )  & 
    917                     &          * ( 1.0 - EXP( - 15.0 * (         1.0 - zznd_ml    ) ) ) 
    918                ! 
    919                ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * zsc_ws_1(ji,jj)  & 
    920                     &          * ( -2.0 + 2.75 * (       ( 1.0 + 0.6 * zznd_ml**4 )      & 
    921                     &                               - EXP(     - 6.0 * zznd_ml    ) ) )  & 
    922                     &          * ( 1.0 - EXP ( -15.0 * (         1.0 - zznd_ml    ) ) ) 
    923             END DO 
    924 ! 
    925             IF ( lpyc(ji,jj) ) THEN 
    926 ! pycnocline 
    927               DO jk = imld(ji,jj), ibld(ji,jj) 
    928                 zznd_pyc = - ( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / zdh(ji,jj) 
    929                 ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 4.0 * zsc_wth_pyc(ji,jj) * ( 0.48 - EXP( -1.5 * ( zznd_pyc -0.3)**2 ) ) 
    930                 ghams(ji,jj,jk) = ghams(ji,jj,jk) + 4.0 * zsc_ws_pyc(ji,jj) * ( 0.48 - EXP( -1.5 * ( zznd_pyc -0.3)**2 ) ) 
    931               END DO 
    932            ENDIF 
    933          ELSE 
    934             IF( zdhdt(ji,jj) > 0. ) THEN 
    935               DO jk = 2, ibld(ji,jj) 
    936                  zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    937                  znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj) 
    938                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3 * ( -4.06 * EXP( -2.0 * zznd_d ) * (1.0 - EXP( -4.0 * zznd_d ) ) + & 
    939               &  7.5 * EXP ( -10.0 * ( 0.95 - znd )**2 ) * ( 1.0 - znd ) ) * zsc_wth_1(ji,jj) 
    940                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3 * ( -4.06 * EXP( -2.0 * zznd_d ) * (1.0 - EXP( -4.0 * zznd_d ) ) + & 
    941                &  7.5 * EXP ( -10.0 * ( 0.95 - znd )**2 ) * ( 1.0 - znd ) ) * zsc_ws_1(ji,jj) 
    942               END DO 
     1267      END_2D 
     1268      ! 
     1269      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1270         pshear(ji,jj) = 0.0_wp 
     1271      END_2D 
     1272      zekman(:,:) = EXP( -1.0_wp * pp_ek * ABS( ff_t(A2D(nn_hls-1)) ) * phbl(A2D(nn_hls-1)) /   & 
     1273         &               MAX( sustar(A2D(nn_hls-1)), 1.e-8 ) ) 
     1274      ! 
     1275      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1276         IF ( l_conv(ji,jj) ) THEN 
     1277            IF ( av_db_bl(ji,jj) > 0.0_wp ) THEN 
     1278               zri_p(ji,jj) = MAX (  SQRT( av_db_bl(ji,jj) * pdh(ji,jj) / MAX( av_du_bl(ji,jj)**2 + av_dv_bl(ji,jj)**2,     & 
     1279                  &                                                          1e-8_wp ) ) * ( phbl(ji,jj) / pdh(ji,jj) ) *   & 
     1280                  &                  ( svstr(ji,jj) / MAX( sustar(ji,jj), 1e-6_wp ) )**2 /                                  & 
     1281                  &                  MAX( zekman(ji,jj), 1.0e-6_wp ), 5.0_wp ) 
     1282               IF ( ff_t(ji,jj) >= 0.0_wp ) THEN   ! Northern hemisphere 
     1283                  zri_b(ji,jj) = av_db_ml(ji,jj) * pdh(ji,jj) / ( MAX( av_du_ml(ji,jj), 1e-5_wp )**2 +   & 
     1284                     &                                          MAX( -1.0_wp * av_dv_ml(ji,jj), 1e-5_wp)**2 ) 
     1285               ELSE                                ! Southern hemisphere 
     1286                  zri_b(ji,jj) = av_db_ml(ji,jj) * pdh(ji,jj) / ( MAX( av_du_ml(ji,jj), 1e-5_wp )**2 +   & 
     1287                     &                                          MAX(           av_dv_ml(ji,jj), 1e-5_wp)**2 ) 
     1288               END IF 
     1289               pshear(ji,jj) = pp_a_shr * zekman(ji,jj) *                                                   & 
     1290                  &            ( MAX( sustar(ji,jj)**2 * av_du_ml(ji,jj) / phbl(ji,jj), 0.0_wp ) +          & 
     1291                  &              pp_b_shr * MAX( -1.0_wp * ff_t(ji,jj) * sustke(ji,jj) * dstokes(ji,jj) *   & 
     1292                  &                            av_dv_ml(ji,jj) / phbl(ji,jj), 0.0_wp ) ) 
     1293               ! Stability dependence 
     1294               pshear(ji,jj) = pshear(ji,jj) * EXP( -0.75_wp * MAX( 0.0_wp, ( zri_b(ji,jj) - pp_ri_c ) / pp_ri_c ) ) 
     1295               !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     1296               ! Test ensures n_ddh=0 is not selected. Change to zri_p<27 when  ! 
     1297               ! full code available                                          ! 
     1298               !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     1299               IF ( pshear(ji,jj) > 1e-10 ) THEN 
     1300                  IF ( zri_p(ji,jj) < pp_ri_p_thresh .AND.   & 
     1301                     & MIN( hu(ji,jj,Kmm), hu(ji-1,jj,Kmm), hv(ji,jj,Kmm), hv(ji,jj-1,Kmm) ) > 100.0_wp ) THEN 
     1302                     ! Growing shear layer 
     1303                     n_ddh(ji,jj) = 0 
     1304                     l_shear(ji,jj) = .TRUE. 
     1305                  ELSE 
     1306                     n_ddh(ji,jj) = 1 
     1307                     !             IF ( zri_b <= 1.5 .and. pshear(ji,jj) > 0._wp ) THEN 
     1308                     ! Shear production large enough to determine layer charcteristics, but can't maintain a shear layer 
     1309                     l_shear(ji,jj) = .TRUE. 
     1310                     !             ELSE 
     1311                  END IF 
     1312               ELSE 
     1313                  n_ddh(ji,jj) = 2 
     1314                  l_shear(ji,jj) = .FALSE. 
     1315               END IF 
     1316               ! Shear production may not be zero, but is small and doesn't determine characteristics of pycnocline 
     1317               !               pshear(ji,jj) = 0.5 * pshear(ji,jj) 
     1318               !               l_shear(ji,jj) = .FALSE. 
     1319               !            ENDIF 
     1320            ELSE   ! av_db_bl test, note pshear set to zero 
     1321               n_ddh(ji,jj) = 2 
     1322               l_shear(ji,jj) = .FALSE. 
    9431323            ENDIF 
    9441324         ENDIF 
    945        END_2D 
    946  
    947        WHERE ( lconv ) 
    948           zsc_uw_1 = zustar**2 
    949           zsc_vw_1 = ff_t * zustke * zhml 
    950        ELSEWHERE 
    951           zsc_uw_1 = zustar**2 
    952           zsc_uw_2 = (2.25 - 3.0 * ( 1.0 - EXP( -1.25 * 2.0 ) ) ) * ( 1.0 - EXP( -4.0 * 2.0 ) ) * zsc_uw_1 
    953           zsc_vw_1 = ff_t * zustke * zhbl 
    954           zsc_vw_2 = -0.11 * SIN( 3.14159 * ( 2.0 + 0.4 ) ) * EXP(-( 1.5 + 2.0 )**2 ) * zsc_vw_1 
    955        ENDWHERE 
    956  
    957        DO_2D( 0, 0, 0, 0 ) 
    958           IF ( lconv(ji,jj) ) THEN 
    959             DO jk = 2, imld(ji,jj) 
    960                zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj) 
    961                zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    962                ghamu(ji,jj,jk) = ghamu(ji,jj,jk)& 
    963                     & + 0.3 * ( -2.0 + 2.5 * ( 1.0 + 0.1 * zznd_ml**4 ) - EXP ( -8.0 * zznd_ml ) ) * zsc_uw_1(ji,jj) 
     1325      END_2D 
     1326      ! 
     1327      ! Calculate entrainment buoyancy flux due to surface fluxes. 
     1328      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1329         IF ( l_conv(ji,jj) ) THEN 
     1330            zwcor        = ABS( ff_t(ji,jj) ) * phbl(ji,jj) + epsln 
     1331            zrf_conv     = TANH( ( swstrc(ji,jj) / zwcor )**0.69_wp ) 
     1332            zrf_shear    = TANH( ( sustar(ji,jj) / zwcor )**0.69_wp ) 
     1333            zrf_langmuir = TANH( ( swstrl(ji,jj) / zwcor )**0.69_wp ) 
     1334            IF ( nn_osm_SD_reduce > 0 ) THEN 
     1335               ! Effective Stokes drift already reduced from surface value 
     1336               zr_stokes = 1.0_wp 
     1337            ELSE 
     1338               ! Effective Stokes drift only reduced by factor rn_zdfodm_adjust_sd, 
     1339               ! requires further reduction where BL is deep 
     1340               zr_stokes = 1.0 - EXP( -25.0_wp * dstokes(ji,jj) / hbl(ji,jj) * ( 1.0_wp + 4.0_wp * dstokes(ji,jj) / hbl(ji,jj) ) ) 
     1341            END IF 
     1342            pwb_ent(ji,jj) = -2.0_wp * pp_alpha_c * zrf_conv * swbav(ji,jj) -                                          & 
     1343               &             pp_alpha_s * zrf_shear * sustar(ji,jj)**3 / phml(ji,jj) +                                 & 
     1344               &             zr_stokes * ( pp_alpha_s * EXP( -1.5_wp * sla(ji,jj) ) * zrf_shear * sustar(ji,jj)**3 -   & 
     1345               &                           zrf_langmuir * pp_alpha_lc * swstrl(ji,jj)**3 ) / phml(ji,jj) 
     1346         ENDIF 
     1347      END_2D 
     1348      ! 
     1349      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1350         IF ( l_shear(ji,jj) ) THEN 
     1351            IF ( l_conv(ji,jj) ) THEN 
     1352               ! Unstable OSBL 
     1353               zwb_shr = -1.0_wp * pp_a_wb_s * zri_b(ji,jj) * pshear(ji,jj) 
     1354               IF ( n_ddh(ji,jj) == 0 ) THEN 
     1355                  ! Developing shear layer, additional shear production possible. 
     1356 
     1357                  !    pshear_u = MAX( zustar(ji,jj)**2 * MAX( av_du_ml(ji,jj), 0._wp ) /  phbl(ji,jj), 0._wp ) 
     1358                  !    pshear(ji,jj) = pshear(ji,jj) + pshear_u * ( 1.0 - MIN( zri_p(ji,jj) / pp_ri_p_thresh, 1.d0 )**2 ) 
     1359                  !    pshear(ji,jj) = MIN( pshear(ji,jj), pshear_u ) 
     1360 
     1361                  !    zwb_shr = zwb_shr - 0.25 * MAX ( pshear_u, 0._wp) * ( 1.0 - MIN( zri_p(ji,jj) / pp_ri_p_thresh, 1._wp )**2 ) 
     1362                  !    zwb_shr = MAX( zwb_shr, -0.25 * pshear_u ) 
     1363               ENDIF 
     1364               pwb_ent(ji,jj) = pwb_ent(ji,jj) + zwb_shr 
     1365               !           pwb_min(ji,jj) = pwb_ent(ji,jj) + pdh(ji,jj) / phbl(ji,jj) * zwb0(ji,jj) 
     1366            ELSE   ! IF ( l_conv ) THEN - ENDIF 
     1367               ! Stable OSBL  - shear production not coded for first attempt. 
     1368            ENDIF   ! l_conv 
     1369         END IF   ! l_shear 
     1370         IF ( l_conv(ji,jj) ) THEN 
     1371            ! Unstable OSBL 
     1372            pwb_min(ji,jj) = pwb_ent(ji,jj) + pdh(ji,jj) / phbl(ji,jj) * 2.0_wp * swbav(ji,jj) 
     1373         END IF  ! l_conv 
     1374      END_2D 
     1375      ! 
     1376   END SUBROUTINE zdf_osm_osbl_state 
     1377 
     1378   SUBROUTINE zdf_osm_external_gradients( Kmm, kbase, pdtdz, pdsdz, pdbdz ) 
     1379      !!--------------------------------------------------------------------- 
     1380      !!                   ***  ROUTINE zdf_osm_external_gradients  *** 
     1381      !! 
     1382      !! ** Purpose : Calculates the gradients below the OSBL 
     1383      !! 
     1384      !! ** Method  : Uses nbld and ibld_ext to determine levels to calculate the gradient. 
     1385      !! 
     1386      !!----------------------------------------------------------------------    
     1387      INTEGER,                            INTENT(in   ) ::   Kmm            ! Ocean time-level index 
     1388      INTEGER,  DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   kbase          ! OSBL base layer index 
     1389      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pdtdz, pdsdz   ! External gradients of temperature, salinity 
     1390      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pdbdz          !    and buoyancy 
     1391      !! 
     1392      INTEGER  ::   ji, jj, jkb, jkb1 
     1393      REAL(wp) ::   zthermal, zbeta 
     1394      !! 
     1395      REAL(wp), PARAMETER ::   pp_large = -1e10_wp 
     1396      !!----------------------------------------------------------------------    
     1397      ! 
     1398      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1399         pdtdz(ji,jj) = pp_large 
     1400         pdsdz(ji,jj) = pp_large 
     1401         pdbdz(ji,jj) = pp_large 
     1402      END_2D 
     1403      ! 
     1404      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1405         IF ( kbase(ji,jj)+1 < mbkt(ji,jj) ) THEN 
     1406            zthermal = rab_n(ji,jj,1,jp_tem)   ! Ideally use nbld not 1?? 
     1407            zbeta    = rab_n(ji,jj,1,jp_sal) 
     1408            jkb = kbase(ji,jj) 
     1409            jkb1 = MIN( jkb + 1, mbkt(ji,jj) ) 
     1410            pdtdz(ji,jj) = -1.0_wp * ( ts(ji,jj,jkb1,jp_tem,Kmm) - ts(ji,jj,jkb,jp_tem,Kmm ) ) / e3w(ji,jj,jkb1,Kmm) 
     1411            pdsdz(ji,jj) = -1.0_wp * ( ts(ji,jj,jkb1,jp_sal,Kmm) - ts(ji,jj,jkb,jp_sal,Kmm ) ) / e3w(ji,jj,jkb1,Kmm) 
     1412            pdbdz(ji,jj) = grav * zthermal * pdtdz(ji,jj) - grav * zbeta * pdsdz(ji,jj) 
     1413         ELSE 
     1414            pdtdz(ji,jj) = 0.0_wp 
     1415            pdsdz(ji,jj) = 0.0_wp 
     1416            pdbdz(ji,jj) = 0.0_wp 
     1417         END IF 
     1418      END_2D 
     1419      ! 
     1420   END SUBROUTINE zdf_osm_external_gradients 
     1421 
     1422   SUBROUTINE zdf_osm_calculate_dhdt( pdhdt, phbl, pdh, pwb_ent, pwb_min,   & 
     1423      &                               pdbdz_bl_ext, pwb_fk_b, pwb_fk, pvel_mle ) 
     1424      !!--------------------------------------------------------------------- 
     1425      !!                   ***  ROUTINE zdf_osm_calculate_dhdt  *** 
     1426      !! 
     1427      !! ** Purpose : Calculates the rate at which hbl changes. 
     1428      !! 
     1429      !! ** Method  : 
     1430      !! 
     1431      !!---------------------------------------------------------------------- 
     1432      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pdhdt          ! Rate of change of hbl 
     1433      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl           ! BL depth 
     1434      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdh            ! Pycnocline depth 
     1435      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux 
     1436      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_min 
     1437      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients 
     1438      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(  out) ::   pwb_fk_b       ! MLE buoyancy flux averaged over OSBL 
     1439      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk         ! Max MLE buoyancy flux 
     1440      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pvel_mle       ! Vvelocity scale for dhdt with stable ML and FK 
     1441      !! 
     1442      INTEGER  ::   jj, ji 
     1443      REAL(wp) ::   zgamma_b_nd, zgamma_dh_nd, zpert, zpsi, zari 
     1444      REAL(wp) ::   zvel_max, zddhdt 
     1445      !! 
     1446      REAL(wp), PARAMETER ::   pp_alpha_b = 0.3_wp 
     1447      REAL(wp), PARAMETER ::   pp_ddh     = 2.5_wp, pp_ddh_2 = 3.5_wp   ! Also in pycnocline_depth 
     1448      REAL(wp), PARAMETER ::   pp_large   = -1e10_wp 
     1449      !!---------------------------------------------------------------------- 
     1450      ! 
     1451      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1452         pdhdt(ji,jj)    = pp_large 
     1453         pwb_fk_b(ji,jj) = pp_large 
     1454      END_2D 
     1455      ! 
     1456      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1457         ! 
     1458         IF ( l_shear(ji,jj) ) THEN 
     1459            ! 
     1460            IF ( l_conv(ji,jj) ) THEN   ! Convective 
    9641461               ! 
    965                ghamv(ji,jj,jk) = ghamv(ji,jj,jk)& 
    966                     & + 0.3 * 0.1 * ( EXP( -zznd_d ) + EXP( -5.0 * ( 1.0 - zznd_ml ) ) ) * zsc_vw_1(ji,jj) 
    967             END DO 
    968           ELSE 
    969             DO jk = 2, ibld(ji,jj) 
    970                znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj) 
    971                zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
    972                IF ( zznd_d <= 2.0 ) THEN 
    973                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.5 * 0.3 & 
    974                        &*  ( 2.25 - 3.0  * ( 1.0 - EXP( - 1.25 * zznd_d ) ) * ( 1.0 - EXP( -2.0 * zznd_d ) ) ) * zsc_uw_1(ji,jj) 
     1462               IF ( ln_osm_mle ) THEN 
     1463                  IF ( hmle(ji,jj) > hbl(ji,jj) ) THEN   ! Fox-Kemper buoyancy flux average over OSBL 
     1464                     pwb_fk_b(ji,jj) = pwb_fk(ji,jj) * ( 1.0_wp + hmle(ji,jj) / ( 6.0_wp * hbl(ji,jj) ) *   & 
     1465                        &                                         ( -1.0_wp + ( 1.0_wp - 2.0_wp * hbl(ji,jj) / hmle(ji,jj) )**3 ) ) 
     1466                  ELSE 
     1467                     pwb_fk_b(ji,jj) = 0.5_wp * pwb_fk(ji,jj) * hmle(ji,jj) / hbl(ji,jj) 
     1468                  ENDIF 
     1469                  zvel_max = ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
     1470                  IF ( ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) < 0.0_wp ) THEN   ! OSBL is deepening, 
     1471                     !                                                                 !    entrainment > restratification 
     1472                     IF ( av_db_bl(ji,jj) > 1e-15_wp ) THEN 
     1473                        zgamma_b_nd = MAX( pdbdz_bl_ext(ji,jj), 0.0_wp ) * pdh(ji,jj) /   & 
     1474                           &          ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1475                        zpsi = ( 1.0_wp - 0.5_wp * pdh(ji,jj) / phbl(ji,jj) ) *                                                & 
     1476                           &   ( swb0(ji,jj) - MIN( ( pwb_min(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ), 0.0_wp ) ) * pdh(ji,jj) /   & 
     1477                           &   phbl(ji,jj) 
     1478                        zpsi = zpsi + 1.75_wp * ( 1.0_wp - 0.5_wp * pdh(ji,jj) / phbl(ji,jj) ) *   & 
     1479                           &          ( pdh(ji,jj) / phbl(ji,jj) + zgamma_b_nd ) *   & 
     1480                           &          MIN( ( pwb_min(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ), 0.0_wp ) 
     1481                        zpsi = pp_alpha_b * MAX( zpsi, 0.0_wp ) 
     1482                        pdhdt(ji,jj) = -1.0_wp * ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) /      & 
     1483                           &                      ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) +   & 
     1484                           &            zpsi / ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1485                        IF ( n_ddh(ji,jj) == 1 ) THEN 
     1486                           IF ( ( swstrc(ji,jj) / svstr(ji,jj) )**3 <= 0.5_wp ) THEN 
     1487                              zari = MIN( 1.5_wp * av_db_bl(ji,jj) /                                                   & 
     1488                                 &        ( phbl(ji,jj) * ( MAX( pdbdz_bl_ext(ji,jj), 0.0_wp ) +                       & 
     1489                                 &                               av_db_bl(ji,jj)**2 / MAX( 4.5_wp * svstr(ji,jj)**2,   & 
     1490                                 &                                                       1e-12_wp ) ) ), 0.2_wp ) 
     1491                           ELSE 
     1492                              zari = MIN( 1.5_wp * av_db_bl(ji,jj) /                                                    & 
     1493                                 &        ( phbl(ji,jj) * ( MAX( pdbdz_bl_ext(ji,jj), 0.0_wp ) +                        & 
     1494                                 &                               av_db_bl(ji,jj)**2 / MAX( 4.5_wp * swstrc(ji,jj)**2,   & 
     1495                                 &                                                       1e-12_wp ) ) ), 0.2_wp ) 
     1496                           ENDIF 
     1497                           ! Relaxation to dh_ref = zari * hbl 
     1498                           zddhdt = -1.0_wp * pp_ddh_2 * ( 1.0_wp - pdh(ji,jj) / ( zari * phbl(ji,jj) ) ) * pwb_ent(ji,jj) /   & 
     1499                              &     ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1500                        ELSE IF ( n_ddh(ji,jj) == 0 ) THEN   ! Growing shear layer 
     1501                           zddhdt = -1.0_wp * pp_ddh * ( 1.0_wp - 1.6_wp * pdh(ji,jj) / phbl(ji,jj) ) * pwb_ent(ji,jj) /   & 
     1502                              &     ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1503                           zddhdt = EXP( -4.0_wp * ABS( ff_t(ji,jj) ) * phbl(ji,jj) / MAX( sustar(ji,jj), 1e-8_wp ) ) * zddhdt 
     1504                        ELSE 
     1505                           zddhdt = 0.0_wp 
     1506                        ENDIF   ! n_ddh 
     1507                        pdhdt(ji,jj) = pdhdt(ji,jj) + pp_alpha_b * ( 1.0_wp - 0.5_wp * pdh(ji,jj) / phbl(ji,jj) ) *   & 
     1508                           &                            av_db_ml(ji,jj) * MAX( zddhdt, 0.0_wp ) /   & 
     1509                           &                            ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1510                     ELSE   ! av_db_bl >0 
     1511                        pdhdt(ji,jj) = -1.0_wp * ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) /  MAX( zvel_max, 1e-15_wp ) 
     1512                     ENDIF 
     1513                  ELSE   ! pwb_min + 2*pwb_fk_b < 0 
     1514                     ! OSBL shoaling due to restratification flux. This is the velocity defined in Fox-Kemper et al (2008) 
     1515                     pdhdt(ji,jj) = -1.0_wp * MIN( pvel_mle(ji,jj), hbl(ji,jj) / 10800.0_wp ) 
     1516                  ENDIF 
     1517               ELSE   ! Fox-Kemper not used. 
     1518                  zvel_max = -1.0_wp * ( 1.0_wp + 1.0_wp * ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird *     & 
     1519                     &                                                         rn_Dt / hbl(ji,jj) ) * pwb_ent(ji,jj) /   & 
     1520                     &       MAX( ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird, epsln ) 
     1521                  pdhdt(ji,jj) = -1.0_wp * pwb_ent(ji,jj) / ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1522                  ! added ajgn 23 July as temporay fix 
     1523               ENDIF   ! ln_osm_mle 
     1524               ! 
     1525            ELSE   ! l_conv - Stable 
     1526               ! 
     1527               pdhdt(ji,jj) = ( 0.06_wp + 0.52_wp * shol(ji,jj) / 2.0_wp ) * svstr(ji,jj)**3 / hbl(ji,jj) + swbav(ji,jj) 
     1528               IF ( pdhdt(ji,jj) < 0.0_wp ) THEN   ! For long timsteps factor in brackets slows the rapid collapse of the OSBL 
     1529                  zpert = 2.0_wp * ( 1.0_wp + 0.0_wp * 2.0_wp * svstr(ji,jj) * rn_Dt / hbl(ji,jj) ) * svstr(ji,jj)**2 / hbl(ji,jj) 
     1530               ELSE 
     1531                  zpert = MAX( svstr(ji,jj)**2 / hbl(ji,jj), av_db_bl(ji,jj) ) 
     1532               ENDIF 
     1533               pdhdt(ji,jj) = 2.0_wp * pdhdt(ji,jj) / MAX( zpert, epsln ) 
     1534               pdhdt(ji,jj) = MAX( pdhdt(ji,jj), -1.0_wp * hbl(ji,jj) / 5400.0_wp ) 
     1535               ! 
     1536            ENDIF   ! l_conv 
     1537            ! 
     1538         ELSE   ! l_shear 
     1539            ! 
     1540            IF ( l_conv(ji,jj) ) THEN   ! Convective 
     1541               ! 
     1542               IF ( ln_osm_mle ) THEN 
     1543                  IF ( hmle(ji,jj) > hbl(ji,jj) ) THEN   ! Fox-Kemper buoyancy flux average over OSBL 
     1544                     pwb_fk_b(ji,jj) = pwb_fk(ji,jj) *                       & 
     1545                        ( 1.0_wp + hmle(ji,jj) / ( 6.0_wp * hbl(ji,jj) ) *   & 
     1546                        &          ( -1.0_wp + ( 1.0_wp - 2.0_wp * hbl(ji,jj) / hmle(ji,jj))**3) ) 
     1547                  ELSE 
     1548                     pwb_fk_b(ji,jj) = 0.5_wp * pwb_fk(ji,jj) * hmle(ji,jj) / hbl(ji,jj) 
     1549                  ENDIF 
     1550                  zvel_max = ( swstrl(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
     1551                  IF ( ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) < 0.0_wp ) THEN   ! OSBL is deepening, 
     1552                     !                                                                 !    entrainment > restratification 
     1553                     IF ( av_db_bl(ji,jj) > 0.0_wp .AND. pdbdz_bl_ext(ji,jj) > 0.0_wp ) THEN 
     1554                        pdhdt(ji,jj) = -1.0_wp * ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) /   & 
     1555                           &            ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1556                     ELSE 
     1557                        pdhdt(ji,jj) = -1.0_wp * ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) / MAX( zvel_max, 1e-15_wp ) 
     1558                     ENDIF 
     1559                  ELSE   ! OSBL shoaling due to restratification flux. This is the velocity defined in Fox-Kemper et al (2008) 
     1560                     pdhdt(ji,jj) = -1.0_wp * MIN( pvel_mle(ji,jj), hbl(ji,jj) / 10800.0_wp ) 
     1561                  ENDIF 
     1562               ELSE   ! Fox-Kemper not used 
     1563                  zvel_max = -1.0_wp * pwb_ent(ji,jj) / MAX( ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird, epsln ) 
     1564                  pdhdt(ji,jj) = -1.0_wp * pwb_ent(ji,jj) / ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15_wp ) ) 
     1565                  ! added ajgn 23 July as temporay fix 
     1566               ENDIF  ! ln_osm_mle 
     1567               ! 
     1568            ELSE                        ! Stable 
     1569               ! 
     1570               pdhdt(ji,jj) = ( 0.06_wp + 0.52_wp * shol(ji,jj) / 2.0_wp ) * svstr(ji,jj)**3 / hbl(ji,jj) + swbav(ji,jj) 
     1571               IF ( pdhdt(ji,jj) < 0.0_wp ) THEN 
     1572                  ! For long timsteps factor in brackets slows the rapid collapse of the OSBL 
     1573                  zpert = 2.0_wp * svstr(ji,jj)**2 / hbl(ji,jj) 
     1574               ELSE 
     1575                  zpert = MAX( svstr(ji,jj)**2 / hbl(ji,jj), av_db_bl(ji,jj) ) 
     1576               ENDIF 
     1577               pdhdt(ji,jj) = 2.0_wp * pdhdt(ji,jj) / MAX(zpert, epsln) 
     1578               pdhdt(ji,jj) = MAX( pdhdt(ji,jj), -1.0_wp * hbl(ji,jj) / 5400.0_wp ) 
     1579               ! 
     1580            ENDIF  ! l_conv 
     1581            ! 
     1582         ENDIF ! l_shear 
     1583         ! 
     1584      END_2D 
     1585      ! 
     1586   END SUBROUTINE zdf_osm_calculate_dhdt 
     1587 
     1588   SUBROUTINE zdf_osm_timestep_hbl( Kmm, pdhdt, phbl, phbl_t, pwb_ent,   & 
     1589      &                             pwb_fk_b ) 
     1590      !!--------------------------------------------------------------------- 
     1591      !!                ***  ROUTINE zdf_osm_timestep_hbl  *** 
     1592      !! 
     1593      !! ** Purpose : Increments hbl. 
     1594      !! 
     1595      !! ** Method  : If the change in hbl exceeds one model level the change is 
     1596      !!              is calculated by moving down the grid, changing the 
     1597      !!              buoyancy jump. This is to ensure that the change in hbl 
     1598      !!              does not overshoot a stable layer. 
     1599      !! 
     1600      !!---------------------------------------------------------------------- 
     1601      INTEGER,                            INTENT(in   ) ::   Kmm        ! Ocean time-level index 
     1602      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdhdt      ! Rates of change of hbl 
     1603      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   phbl       ! BL depth 
     1604      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl_t     ! BL depth 
     1605      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent    ! Buoyancy entrainment flux 
     1606      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk_b   ! MLE buoyancy flux averaged over OSBL 
     1607      !! 
     1608      INTEGER  ::   jk, jj, ji, jm 
     1609      REAL(wp) ::   zhbl_s, zvel_max, zdb 
     1610      REAL(wp) ::   zthermal, zbeta 
     1611      !!---------------------------------------------------------------------- 
     1612      ! 
     1613      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1614         IF ( nbld(ji,jj) - nmld(ji,jj) > 1 ) THEN 
     1615            ! 
     1616            ! If boundary layer changes by more than one level, need to check for stable layers between initial and final depths. 
     1617            ! 
     1618            zhbl_s   = hbl(ji,jj) 
     1619            jm       = nmld(ji,jj) 
     1620            zthermal = rab_n(ji,jj,1,jp_tem) 
     1621            zbeta    = rab_n(ji,jj,1,jp_sal) 
     1622            ! 
     1623            IF ( l_conv(ji,jj) ) THEN   ! Unstable 
     1624               ! 
     1625               IF( ln_osm_mle ) THEN 
     1626                  zvel_max = ( swstrl(ji,jj)**3 + swstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
     1627               ELSE 
     1628                  zvel_max = -1.0_wp * ( 1.0_wp + 1.0_wp * ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird * rn_Dt /   & 
     1629                     &                                     hbl(ji,jj) ) * pwb_ent(ji,jj) /                                     & 
     1630                     &       ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird 
     1631               ENDIF 
     1632               DO jk = nmld(ji,jj), nbld(ji,jj) 
     1633                  zdb = MAX( grav * ( zthermal * ( av_t_bl(ji,jj) - ts(ji,jj,jm,jp_tem,Kmm) ) -   & 
     1634                     &                zbeta    * ( av_s_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ), 0.0_wp ) + zvel_max 
    9751635                  ! 
    976                ELSE 
    977                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk)& 
    978                        & + 0.5 * 0.3 * ( 1.0 - EXP( -5.0 * ( 1.0 - znd ) ) ) * zsc_uw_2(ji,jj) 
     1636                  IF ( ln_osm_mle ) THEN 
     1637                     zhbl_s = zhbl_s + MIN( rn_Dt * ( ( -1.0_wp * pwb_ent(ji,jj) - 2.0_wp * pwb_fk_b(ji,jj) ) / zdb ) /   & 
     1638                        &                   REAL( nbld(ji,jj) - nmld(ji,jj), KIND=wp ), e3w(ji,jj,jm,Kmm) ) 
     1639                  ELSE 
     1640                     zhbl_s = zhbl_s + MIN( rn_Dt * ( -1.0_wp * pwb_ent(ji,jj) / zdb ) /   & 
     1641                        &                   REAL( nbld(ji,jj) - nmld(ji,jj), KIND=wp ), e3w(ji,jj,jm,Kmm) ) 
     1642                  ENDIF 
     1643                  !                    zhbl_s = MIN(zhbl_s,  gdepw(ji,jj, mbkt(ji,jj) + 1,Kmm) - depth_tol) 
     1644                  IF ( zhbl_s >= gdepw(ji,jj,mbkt(ji,jj) + 1,Kmm) ) THEN 
     1645                     zhbl_s = MIN( zhbl_s, gdepw(ji,jj, mbkt(ji,jj) + 1, Kmm ) - depth_tol ) 
     1646                     l_pyc(ji,jj) = .FALSE. 
     1647                  ENDIF 
     1648                  IF ( zhbl_s >= gdepw(ji,jj,jm+1,Kmm) ) jm = jm + 1 
     1649               END DO 
     1650               hbl(ji,jj)  = zhbl_s 
     1651               nbld(ji,jj) = jm 
     1652            ELSE   ! Stable 
     1653               DO jk = nmld(ji,jj), nbld(ji,jj) 
     1654                  zdb = MAX(  grav * ( zthermal * ( av_t_bl(ji,jj) - ts(ji,jj,jm,jp_tem,Kmm) ) -               & 
     1655                     &                 zbeta    * ( av_s_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ), 0.0_wp ) +   & 
     1656                     &  2.0_wp * svstr(ji,jj)**2 / zhbl_s 
    9791657                  ! 
    980                ENDIF 
    981  
    982                ghamv(ji,jj,jk) = ghamv(ji,jj,jk)& 
    983                     & + 0.3 * 0.15 * SIN( 3.14159 * ( 0.65 * zznd_d ) ) * EXP( -0.25 * zznd_d**2 ) * zsc_vw_1(ji,jj) 
    984                ghamv(ji,jj,jk) = ghamv(ji,jj,jk)& 
    985                     & + 0.3 * 0.15 * EXP( -5.0 * ( 1.0 - znd ) ) * ( 1.0 - EXP( -20.0 * ( 1.0 - znd ) ) ) * zsc_vw_2(ji,jj) 
    986             END DO 
    987           ENDIF 
    988        END_2D 
    989  
    990        IF(ln_dia_osm) THEN 
    991           IF ( iom_use("ghamu_f") ) CALL iom_put( "ghamu_f", wmask*ghamu ) 
    992           IF ( iom_use("ghamv_f") ) CALL iom_put( "ghamv_f", wmask*ghamv ) 
    993           IF ( iom_use("zsc_uw_1_f") ) CALL iom_put( "zsc_uw_1_f", tmask(:,:,1)*zsc_uw_1 ) 
    994           IF ( iom_use("zsc_vw_1_f") ) CALL iom_put( "zsc_vw_1_f", tmask(:,:,1)*zsc_vw_1 ) 
    995           IF ( iom_use("zsc_uw_2_f") ) CALL iom_put( "zsc_uw_2_f", tmask(:,:,1)*zsc_uw_2 ) 
    996           IF ( iom_use("zsc_vw_2_f") ) CALL iom_put( "zsc_vw_2_f", tmask(:,:,1)*zsc_vw_2 ) 
    997        END IF 
    998 ! 
    999 ! Make surface forced velocity non-gradient terms go to zero at the base of the mixed layer. 
    1000  
    1001  
    1002  ! Make surface forced velocity non-gradient terms go to zero at the base of the boundary layer. 
    1003  
    1004       DO_2D( 0, 0, 0, 0 ) 
    1005          IF ( .not. lconv(ji,jj) ) THEN 
    1006             DO jk = 2, ibld(ji,jj) 
    1007                znd = ( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / zhbl(ji,jj) !ALMG to think about 
    1008                IF ( znd >= 0.0 ) THEN 
    1009                   ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * ( 1.0 - EXP( -10.0 * znd**2 ) ) 
    1010                   ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * ( 1.0 - EXP( -10.0 * znd**2 ) ) 
    1011                ELSE 
    1012                   ghamu(ji,jj,jk) = 0._wp 
    1013                   ghamv(ji,jj,jk) = 0._wp 
    1014                ENDIF 
    1015             END DO 
     1658                  ! Alan is thuis right? I have simply changed hbli to hbl 
     1659                  shol(ji,jj)  = -1.0_wp * zhbl_s / ( ( svstr(ji,jj)**3 + epsln ) / swbav(ji,jj) ) 
     1660                  pdhdt(ji,jj) = -1.0_wp * ( swbav(ji,jj) - 0.04_wp / 2.0_wp * swstrl(ji,jj)**3 / zhbl_s -   & 
     1661                     &                       0.15_wp / 2.0_wp * ( 1.0_wp - EXP( -1.5_wp * sla(ji,jj) ) ) *   & 
     1662                     &                                 sustar(ji,jj)**3 / zhbl_s ) *                         & 
     1663                     &           ( 0.725_wp + 0.225_wp * EXP( -7.5_wp * shol(ji,jj) ) ) 
     1664                  pdhdt(ji,jj) = pdhdt(ji,jj) + swbav(ji,jj) 
     1665                  zhbl_s = zhbl_s + MIN( pdhdt(ji,jj) / zdb * rn_Dt / REAL( nbld(ji,jj) - nmld(ji,jj), KIND=wp ),   & 
     1666                     &                   e3w(ji,jj,jm,Kmm) ) 
     1667                   
     1668                  !                    zhbl_s = MIN(zhbl_s, gdepw(ji,jj, mbkt(ji,jj) + 1,Kmm) - depth_tol) 
     1669                  IF ( zhbl_s >= mbkt(ji,jj) + 1 ) THEN 
     1670                     zhbl_s      = MIN( zhbl_s,  gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) - depth_tol ) 
     1671                     l_pyc(ji,jj) = .FALSE. 
     1672                  ENDIF 
     1673                  IF ( zhbl_s >= gdepw(ji,jj,jm,Kmm) ) jm = jm + 1 
     1674               END DO 
     1675            ENDIF   ! IF ( l_conv ) 
     1676            hbl(ji,jj)  = MAX( zhbl_s, gdepw(ji,jj,4,Kmm) ) 
     1677            nbld(ji,jj) = MAX( jm, 4 ) 
     1678         ELSE 
     1679            ! change zero or one model level. 
     1680            hbl(ji,jj) = MAX( phbl_t(ji,jj), gdepw(ji,jj,4,Kmm) ) 
    10161681         ENDIF 
    1017       END_2D 
    1018  
    1019       ! pynocline contributions 
    1020        DO_2D( 0, 0, 0, 0 ) 
    1021          IF ( .not. lconv(ji,jj) ) THEN 
    1022           IF ( ibld(ji,jj) + jp_ext(ji,jj) < mbkt(ji,jj) ) THEN 
    1023              DO jk= 2, ibld(ji,jj) 
    1024                 znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj) 
    1025                 ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zdiffut(ji,jj,jk) * zdtdz_pyc(ji,jj,jk) 
    1026                 ghams(ji,jj,jk) = ghams(ji,jj,jk) + zdiffut(ji,jj,jk) * zdsdz_pyc(ji,jj,jk) 
    1027                 ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zviscos(ji,jj,jk) * zdudz_pyc(ji,jj,jk) 
    1028                 ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zviscos(ji,jj,jk) * zdvdz_pyc(ji,jj,jk) 
    1029              END DO 
    1030           END IF 
    1031          END IF 
    1032        END_2D 
    1033       IF(ln_dia_osm) THEN 
    1034           IF ( iom_use("ghamu_b") ) CALL iom_put( "ghamu_b", wmask*ghamu ) 
    1035           IF ( iom_use("ghamv_b") ) CALL iom_put( "ghamv_b", wmask*ghamv ) 
    1036        END IF 
    1037  
    1038        DO_2D( 0, 0, 0, 0 ) 
    1039           ghamt(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp 
    1040           ghams(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp 
    1041           ghamu(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp 
    1042           ghamv(ji,jj,ibld(ji,jj)+ibld_ext) = 0._wp 
    1043        END_2D 
    1044  
    1045        IF(ln_dia_osm) THEN 
    1046           IF ( iom_use("ghamu_1") ) CALL iom_put( "ghamu_1", wmask*ghamu ) 
    1047           IF ( iom_use("ghamv_1") ) CALL iom_put( "ghamv_1", wmask*ghamv ) 
    1048           IF ( iom_use("zdudz_pyc") ) CALL iom_put( "zdudz_pyc", wmask*zdudz_pyc ) 
    1049           IF ( iom_use("zdvdz_pyc") ) CALL iom_put( "zdvdz_pyc", wmask*zdvdz_pyc ) 
    1050           IF ( iom_use("zviscos") ) CALL iom_put( "zviscos", wmask*zviscos ) 
    1051        END IF 
    1052        !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    1053        ! Need to put in code for contributions that are applied explicitly to 
    1054        ! the prognostic variables 
    1055        !  1. Entrainment flux 
    1056        ! 
    1057        !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    1058  
    1059  
    1060  
    1061        ! rotate non-gradient velocity terms back to model reference frame 
    1062  
    1063        DO_2D( 0, 0, 0, 0 ) 
    1064           DO jk = 2, ibld(ji,jj) 
    1065              ztemp = ghamu(ji,jj,jk) 
    1066              ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * zcos_wind(ji,jj) - ghamv(ji,jj,jk) * zsin_wind(ji,jj) 
    1067              ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * zcos_wind(ji,jj) + ztemp * zsin_wind(ji,jj) 
    1068           END DO 
    1069        END_2D 
    1070  
    1071        IF(ln_dia_osm) THEN 
    1072           IF ( iom_use("zdtdz_pyc") ) CALL iom_put( "zdtdz_pyc", wmask*zdtdz_pyc ) 
    1073           IF ( iom_use("zdsdz_pyc") ) CALL iom_put( "zdsdz_pyc", wmask*zdsdz_pyc ) 
    1074           IF ( iom_use("zdbdz_pyc") ) CALL iom_put( "zdbdz_pyc", wmask*zdbdz_pyc ) 
    1075        END IF 
    1076  
    1077 ! KPP-style Ri# mixing 
    1078        IF( ln_kpprimix) THEN 
    1079           DO_3D( 1, 0, 1, 0, 2, jpkm1 )      !* Shear production at uw- and vw-points (energy conserving form) 
    1080              z3du(ji,jj,jk) = 0.5 * (  uu(ji,jj,jk-1,Kmm) -  uu(ji  ,jj,jk,Kmm) )   & 
    1081                   &                 * (  uu(ji,jj,jk-1,Kbb) -  uu(ji  ,jj,jk,Kbb) ) * wumask(ji,jj,jk) & 
    1082                   &                 / (  e3uw(ji,jj,jk,Kmm) * e3uw(ji,jj,jk,Kbb) ) 
    1083              z3dv(ji,jj,jk) = 0.5 * (  vv(ji,jj,jk-1,Kmm) -  vv(ji,jj  ,jk,Kmm) )   & 
    1084                   &                 * (  vv(ji,jj,jk-1,Kbb) -  vv(ji,jj  ,jk,Kbb) ) * wvmask(ji,jj,jk) & 
    1085                   &                 / (  e3vw(ji,jj,jk,Kmm) * e3vw(ji,jj,jk,Kbb) ) 
    1086           END_3D 
    1087       ! 
    1088          DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    1089             !                                          ! shear prod. at w-point weightened by mask 
    1090             zesh2  =  ( z3du(ji-1,jj,jk) + z3du(ji,jj,jk) ) / MAX( 1._wp , umask(ji-1,jj,jk) + umask(ji,jj,jk) )   & 
    1091                &    + ( z3dv(ji,jj-1,jk) + z3dv(ji,jj,jk) ) / MAX( 1._wp , vmask(ji,jj-1,jk) + vmask(ji,jj,jk) ) 
    1092             !                                          ! local Richardson number 
    1093             zri   = MAX( rn2b(ji,jj,jk), 0._wp ) / MAX(zesh2, epsln) 
    1094             zfri =  MIN( zri / rn_riinfty , 1.0_wp ) 
    1095             zfri  = ( 1.0_wp - zfri * zfri ) 
    1096             zrimix(ji,jj,jk)  =  zfri * zfri  * zfri * wmask(ji, jj, jk) 
    1097          END_3D 
    1098  
    1099           DO_2D( 0, 0, 0, 0 ) 
    1100              DO jk = ibld(ji,jj) + 1, jpkm1 
    1101                 zdiffut(ji,jj,jk) = zrimix(ji,jj,jk)*rn_difri 
    1102                 zviscos(ji,jj,jk) = zrimix(ji,jj,jk)*rn_difri 
    1103              END DO 
    1104           END_2D 
    1105  
    1106        END IF ! ln_kpprimix = .true. 
    1107  
    1108 ! KPP-style set diffusivity large if unstable below BL 
    1109        IF( ln_convmix) THEN 
    1110           DO_2D( 0, 0, 0, 0 ) 
    1111              DO jk = ibld(ji,jj) + 1, jpkm1 
    1112                IF(  MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) zdiffut(ji,jj,jk) = rn_difconv 
    1113              END DO 
    1114           END_2D 
    1115        END IF ! ln_convmix = .true. 
    1116  
    1117  
    1118  
    1119        IF ( ln_osm_mle ) THEN  ! set up diffusivity and non-gradient mixing 
    1120           DO_2D( 0, 0, 0, 0 ) 
    1121               IF ( lflux(ji,jj) ) THEN ! MLE mixing extends below boundary layer 
    1122              ! Calculate MLE flux contribution from surface fluxes 
    1123                 DO jk = 1, ibld(ji,jj) 
    1124                   znd = gdepw(ji,jj,jk,Kmm) / MAX(zhbl(ji,jj),epsln) 
    1125                   ghamt(ji,jj,jk) = ghamt(ji,jj,jk) - zwth0(ji,jj) * ( 1.0 - znd ) 
    1126                   ghams(ji,jj,jk) = ghams(ji,jj,jk) - zws0(ji,jj) * ( 1.0 - znd ) 
    1127                  END DO 
    1128                  DO jk = 1, mld_prof(ji,jj) 
    1129                    znd = gdepw(ji,jj,jk,Kmm) / MAX(zhmle(ji,jj),epsln) 
    1130                    ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zwth0(ji,jj) * ( 1.0 - znd ) 
    1131                    ghams(ji,jj,jk) = ghams(ji,jj,jk) + zws0(ji,jj) * ( 1.0 -znd ) 
    1132                  END DO 
    1133          ! Viscosity for MLEs 
    1134                  DO jk = 1, mld_prof(ji,jj) 
    1135                    znd = -gdepw(ji,jj,jk,Kmm) / MAX(zhmle(ji,jj),epsln) 
    1136                    zdiffut(ji,jj,jk) = zdiffut(ji,jj,jk) + zdiff_mle(ji,jj) * ( 1.0 - ( 2.0 * znd + 1.0 )**2 ) * ( 1.0 + 5.0 / 21.0 * ( 2.0 * znd + 1.0 )** 2 ) 
    1137                  END DO 
    1138               ELSE 
    1139 ! Surface transports limited to OSBL. 
    1140          ! Viscosity for MLEs 
    1141                  DO jk = 1, mld_prof(ji,jj) 
    1142                    znd = -gdepw(ji,jj,jk,Kmm) / MAX(zhmle(ji,jj),epsln) 
    1143                    zdiffut(ji,jj,jk) = zdiffut(ji,jj,jk) + zdiff_mle(ji,jj) * ( 1.0 - ( 2.0 * znd + 1.0 )**2 ) * ( 1.0 + 5.0 / 21.0 * ( 2.0 * znd + 1.0 )** 2 ) 
    1144                  END DO 
    1145               ENDIF 
    1146           END_2D 
    1147        ENDIF 
    1148  
    1149        IF(ln_dia_osm) THEN 
    1150           IF ( iom_use("zdtdz_pyc") ) CALL iom_put( "zdtdz_pyc", wmask*zdtdz_pyc ) 
    1151           IF ( iom_use("zdsdz_pyc") ) CALL iom_put( "zdsdz_pyc", wmask*zdsdz_pyc ) 
    1152           IF ( iom_use("zdbdz_pyc") ) CALL iom_put( "zdbdz_pyc", wmask*zdbdz_pyc ) 
    1153        END IF 
    1154  
    1155  
    1156        ! Lateral boundary conditions on zvicos (sign unchanged), needed to caclulate viscosities on u and v grids 
    1157        !CALL lbc_lnk( 'zdfosm', zviscos(:,:,:), 'W', 1.0_wp ) 
    1158  
    1159        ! GN 25/8: need to change tmask --> wmask 
    1160  
    1161      DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    1162           p_avt(ji,jj,jk) = MAX( zdiffut(ji,jj,jk), avtb(jk) ) * tmask(ji,jj,jk) 
    1163           p_avm(ji,jj,jk) = MAX( zviscos(ji,jj,jk), avmb(jk) ) * tmask(ji,jj,jk) 
    1164      END_3D 
    1165       ! Lateral boundary conditions on ghamu and ghamv, currently on W-grid  (sign unchanged), needed to caclulate gham[uv] on u and v grids 
    1166      CALL lbc_lnk( 'zdfosm', p_avt, 'W', 1.0_wp , p_avm, 'W', 1.0_wp,   & 
    1167         &                    ghamu, 'W', 1.0_wp , ghamv, 'W', 1.0_wp ) 
    1168        DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    1169             ghamu(ji,jj,jk) = ( ghamu(ji,jj,jk) + ghamu(ji+1,jj,jk) ) & 
    1170                &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji + 1,jj,jk) ) * umask(ji,jj,jk) 
    1171  
    1172             ghamv(ji,jj,jk) = ( ghamv(ji,jj,jk) + ghamv(ji,jj+1,jk) ) & 
    1173                 &  / MAX( 1., tmask(ji,jj,jk) + tmask (ji,jj+1,jk) ) * vmask(ji,jj,jk) 
    1174  
    1175             ghamt(ji,jj,jk) =  ghamt(ji,jj,jk) * tmask(ji,jj,jk) 
    1176             ghams(ji,jj,jk) =  ghams(ji,jj,jk) * tmask(ji,jj,jk) 
    1177        END_3D 
    1178         ! Lateral boundary conditions on final outputs for hbl,  on T-grid (sign unchanged) 
    1179         CALL lbc_lnk( 'zdfosm', hbl, 'T', 1._wp, dh, 'T', 1._wp, hmle, 'T', 1._wp ) 
    1180         ! Lateral boundary conditions on final outputs for gham[ts],  on W-grid  (sign unchanged) 
    1181         ! Lateral boundary conditions on final outputs for gham[uv],  on [UV]-grid  (sign changed) 
    1182         CALL lbc_lnk( 'zdfosm', ghamt, 'W',  1.0_wp , ghams, 'W',  1.0_wp,   & 
    1183            &                    ghamu, 'U', -1.0_wp , ghamv, 'V', -1.0_wp ) 
    1184  
    1185       IF(ln_dia_osm) THEN 
    1186          SELECT CASE (nn_osm_wave) 
    1187          ! Stokes drift set by assumimg onstant La#=0.3(=0)  or Pierson-Moskovitz spectrum (=1). 
    1188          CASE(0:1) 
    1189             IF ( iom_use("us_x") ) CALL iom_put( "us_x", tmask(:,:,1)*zustke*zcos_wind )   ! x surface Stokes drift 
    1190             IF ( iom_use("us_y") ) CALL iom_put( "us_y", tmask(:,:,1)*zustke*zsin_wind )  ! y surface Stokes drift 
    1191             IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rho0*tmask(:,:,1)*zustar**2*zustke ) 
    1192          ! Stokes drift read in from sbcwave  (=2). 
    1193          CASE(2:3) 
    1194             IF ( iom_use("us_x") ) CALL iom_put( "us_x", ut0sd*umask(:,:,1) )               ! x surface Stokes drift 
    1195             IF ( iom_use("us_y") ) CALL iom_put( "us_y", vt0sd*vmask(:,:,1) )               ! y surface Stokes drift 
    1196             IF ( iom_use("wmp") ) CALL iom_put( "wmp", wmp*tmask(:,:,1) )                   ! wave mean period 
    1197             IF ( iom_use("hsw") ) CALL iom_put( "hsw", hsw*tmask(:,:,1) )                   ! significant wave height 
    1198             IF ( iom_use("wmp_NP") ) CALL iom_put( "wmp_NP", (2.*rpi*1.026/(0.877*grav) )*wndm*tmask(:,:,1) )                  ! wave mean period from NP spectrum 
    1199             IF ( iom_use("hsw_NP") ) CALL iom_put( "hsw_NP", (0.22/grav)*wndm**2*tmask(:,:,1) )                   ! significant wave height from NP spectrum 
    1200             IF ( iom_use("wndm") ) CALL iom_put( "wndm", wndm*tmask(:,:,1) )                   ! U_10 
    1201             IF ( iom_use("wind_wave_abs_power") ) CALL iom_put( "wind_wave_abs_power", 1000.*rho0*tmask(:,:,1)*zustar**2* & 
    1202                  & SQRT(ut0sd**2 + vt0sd**2 ) ) 
    1203          END SELECT 
    1204          IF ( iom_use("ghamt") ) CALL iom_put( "ghamt", tmask*ghamt )            ! <Tw_NL> 
    1205          IF ( iom_use("ghams") ) CALL iom_put( "ghams", tmask*ghams )            ! <Sw_NL> 
    1206          IF ( iom_use("ghamu") ) CALL iom_put( "ghamu", umask*ghamu )            ! <uw_NL> 
    1207          IF ( iom_use("ghamv") ) CALL iom_put( "ghamv", vmask*ghamv )            ! <vw_NL> 
    1208          IF ( iom_use("zwth0") ) CALL iom_put( "zwth0", tmask(:,:,1)*zwth0 )            ! <Tw_0> 
    1209          IF ( iom_use("zws0") ) CALL iom_put( "zws0", tmask(:,:,1)*zws0 )                ! <Sw_0> 
    1210          IF ( iom_use("hbl") ) CALL iom_put( "hbl", tmask(:,:,1)*hbl )                  ! boundary-layer depth 
    1211          IF ( iom_use("ibld") ) CALL iom_put( "ibld", tmask(:,:,1)*ibld )               ! boundary-layer max k 
    1212          IF ( iom_use("zdt_bl") ) CALL iom_put( "zdt_bl", tmask(:,:,1)*zdt_bl )           ! dt at ml base 
    1213          IF ( iom_use("zds_bl") ) CALL iom_put( "zds_bl", tmask(:,:,1)*zds_bl )           ! ds at ml base 
    1214          IF ( iom_use("zdb_bl") ) CALL iom_put( "zdb_bl", tmask(:,:,1)*zdb_bl )           ! db at ml base 
    1215          IF ( iom_use("zdu_bl") ) CALL iom_put( "zdu_bl", tmask(:,:,1)*zdu_bl )           ! du at ml base 
    1216          IF ( iom_use("zdv_bl") ) CALL iom_put( "zdv_bl", tmask(:,:,1)*zdv_bl )           ! dv at ml base 
    1217          IF ( iom_use("dh") ) CALL iom_put( "dh", tmask(:,:,1)*dh )               ! Initial boundary-layer depth 
    1218          IF ( iom_use("hml") ) CALL iom_put( "hml", tmask(:,:,1)*hml )               ! Initial boundary-layer depth 
    1219          IF ( iom_use("dstokes") ) CALL iom_put( "dstokes", tmask(:,:,1)*dstokes )      ! Stokes drift penetration depth 
    1220          IF ( iom_use("zustke") ) CALL iom_put( "zustke", tmask(:,:,1)*zustke )            ! Stokes drift magnitude at T-points 
    1221          IF ( iom_use("zwstrc") ) CALL iom_put( "zwstrc", tmask(:,:,1)*zwstrc )         ! convective velocity scale 
    1222          IF ( iom_use("zwstrl") ) CALL iom_put( "zwstrl", tmask(:,:,1)*zwstrl )         ! Langmuir velocity scale 
    1223          IF ( iom_use("zustar") ) CALL iom_put( "zustar", tmask(:,:,1)*zustar )         ! friction velocity scale 
    1224          IF ( iom_use("zvstr") ) CALL iom_put( "zvstr", tmask(:,:,1)*zvstr )         ! mixed velocity scale 
    1225          IF ( iom_use("zla") ) CALL iom_put( "zla", tmask(:,:,1)*zla )         ! langmuir # 
    1226          IF ( iom_use("wind_power") ) CALL iom_put( "wind_power", 1000.*rho0*tmask(:,:,1)*zustar**3 ) ! BL depth internal to zdf_osm routine 
    1227          IF ( iom_use("wind_wave_power") ) CALL iom_put( "wind_wave_power", 1000.*rho0*tmask(:,:,1)*zustar**2*zustke ) 
    1228          IF ( iom_use("zhbl") ) CALL iom_put( "zhbl", tmask(:,:,1)*zhbl )               ! BL depth internal to zdf_osm routine 
    1229          IF ( iom_use("zhml") ) CALL iom_put( "zhml", tmask(:,:,1)*zhml )               ! ML depth internal to zdf_osm routine 
    1230          IF ( iom_use("imld") ) CALL iom_put( "imld", tmask(:,:,1)*imld )               ! index for ML depth internal to zdf_osm routine 
    1231          IF ( iom_use("zdh") ) CALL iom_put( "zdh", tmask(:,:,1)*zdh )                  ! pyc thicknessh internal to zdf_osm routine 
    1232          IF ( iom_use("zhol") ) CALL iom_put( "zhol", tmask(:,:,1)*zhol )               ! ML depth internal to zdf_osm routine 
    1233          IF ( iom_use("zwthav") ) CALL iom_put( "zwthav", tmask(:,:,1)*zwthav )         ! upward BL-avged turb temp flux 
    1234          IF ( iom_use("zwth_ent") ) CALL iom_put( "zwth_ent", tmask(:,:,1)*zwth_ent )   ! upward turb temp entrainment flux 
    1235          IF ( iom_use("zwb_ent") ) CALL iom_put( "zwb_ent", tmask(:,:,1)*zwb_ent )      ! upward turb buoyancy entrainment flux 
    1236          IF ( iom_use("zws_ent") ) CALL iom_put( "zws_ent", tmask(:,:,1)*zws_ent )      ! upward turb salinity entrainment flux 
    1237          IF ( iom_use("zt_ml") ) CALL iom_put( "zt_ml", tmask(:,:,1)*zt_ml )            ! average T in ML 
    1238  
    1239          IF ( iom_use("hmle") ) CALL iom_put( "hmle", tmask(:,:,1)*hmle )               ! FK layer depth 
    1240          IF ( iom_use("zmld") ) CALL iom_put( "zmld", tmask(:,:,1)*zmld )               ! FK target layer depth 
    1241          IF ( iom_use("zwb_fk") ) CALL iom_put( "zwb_fk", tmask(:,:,1)*zwb_fk )         ! FK b flux 
    1242          IF ( iom_use("zwb_fk_b") ) CALL iom_put( "zwb_fk_b", tmask(:,:,1)*zwb_fk_b )   ! FK b flux averaged over ML 
    1243          IF ( iom_use("mld_prof") ) CALL iom_put( "mld_prof", tmask(:,:,1)*mld_prof )! FK layer max k 
    1244          IF ( iom_use("zdtdx") ) CALL iom_put( "zdtdx", umask(:,:,1)*zdtdx )            ! FK dtdx at u-pt 
    1245          IF ( iom_use("zdtdy") ) CALL iom_put( "zdtdy", vmask(:,:,1)*zdtdy )            ! FK dtdy at v-pt 
    1246          IF ( iom_use("zdsdx") ) CALL iom_put( "zdsdx", umask(:,:,1)*zdsdx )            ! FK dtdx at u-pt 
    1247          IF ( iom_use("zdsdy") ) CALL iom_put( "zdsdy", vmask(:,:,1)*zdsdy )            ! FK dsdy at v-pt 
    1248          IF ( iom_use("dbdx_mle") ) CALL iom_put( "dbdx_mle", umask(:,:,1)*dbdx_mle )            ! FK dbdx at u-pt 
    1249          IF ( iom_use("dbdy_mle") ) CALL iom_put( "dbdy_mle", vmask(:,:,1)*dbdy_mle )            ! FK dbdy at v-pt 
    1250          IF ( iom_use("zdiff_mle") ) CALL iom_put( "zdiff_mle", tmask(:,:,1)*zdiff_mle )! FK diff in MLE at t-pt 
    1251          IF ( iom_use("zvel_mle") ) CALL iom_put( "zvel_mle", tmask(:,:,1)*zdiff_mle )! FK diff in MLE at t-pt 
    1252  
    1253       END IF 
    1254  
    1255 CONTAINS 
    1256 ! subroutine code changed, needs syntax checking. 
    1257   SUBROUTINE zdf_osm_diffusivity_viscosity( zdiffut, zviscos ) 
    1258  
    1259 !!--------------------------------------------------------------------- 
    1260      !!                   ***  ROUTINE zdf_osm_diffusivity_viscosity  *** 
    1261      !! 
    1262      !! ** Purpose : Determines the eddy diffusivity and eddy viscosity profiles in the mixed layer and the pycnocline. 
    1263      !! 
    1264      !! ** Method  : 
    1265      !! 
    1266      !! !!---------------------------------------------------------------------- 
    1267      REAL(wp), DIMENSION(:,:,:) :: zdiffut 
    1268      REAL(wp), DIMENSION(:,:,:) :: zviscos 
    1269 ! local 
    1270  
    1271 ! Scales used to calculate eddy diffusivity and viscosity profiles 
    1272       REAL(wp), DIMENSION(jpi,jpj) :: zdifml_sc, zvisml_sc 
    1273       REAL(wp), DIMENSION(jpi,jpj) :: zdifpyc_n_sc, zdifpyc_s_sc, zdifpyc_shr 
    1274       REAL(wp), DIMENSION(jpi,jpj) :: zvispyc_n_sc, zvispyc_s_sc,zvispyc_shr 
    1275       REAL(wp), DIMENSION(jpi,jpj) :: zbeta_d_sc, zbeta_v_sc 
    1276 ! 
    1277       REAL(wp) :: zvel_sc_pyc, zvel_sc_ml, zstab_fac 
    1278  
    1279       REAL(wp), PARAMETER :: rn_dif_ml = 0.8, rn_vis_ml = 0.375 
    1280       REAL(wp), PARAMETER :: rn_dif_pyc = 0.15, rn_vis_pyc = 0.142 
    1281       REAL(wp), PARAMETER :: rn_vispyc_shr = 0.15 
    1282  
    1283       DO_2D( 0, 0, 0, 0 ) 
    1284           IF ( lconv(ji,jj) ) THEN 
    1285  
    1286             zvel_sc_pyc = ( 0.15 * zvstr(ji,jj)**3 + zwstrc(ji,jj)**3 + 4.25 * zshear(ji,jj) * zhbl(ji,jj) )**pthird 
    1287             zvel_sc_ml = ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird 
    1288             zstab_fac = ( zhml(ji,jj) / zvel_sc_ml * ( 1.4 - 0.4 / ( 1.0 + EXP(-3.5 * LOG10(-zhol(ji,jj) ) ) )**1.25 ) )**2 
    1289  
    1290             zdifml_sc(ji,jj) = rn_dif_ml * zhml(ji,jj) * zvel_sc_ml 
    1291             zvisml_sc(ji,jj) = rn_vis_ml * zdifml_sc(ji,jj) 
    1292  
    1293             IF ( lpyc(ji,jj) ) THEN 
    1294               zdifpyc_n_sc(ji,jj) =  rn_dif_pyc * zvel_sc_ml * zdh(ji,jj) 
    1295  
    1296               IF ( lshear(ji,jj) .and. j_ddh(ji,jj) == 1 ) THEN 
    1297                 zdifpyc_n_sc(ji,jj) = zdifpyc_n_sc(ji,jj) + rn_vispyc_shr * ( zshear(ji,jj) * zhbl(ji,jj) )**pthird * zhbl(ji,jj) 
    1298               ENDIF 
    1299  
    1300               zdifpyc_s_sc(ji,jj) = zwb_ent(ji,jj) + 0.0025 * zvel_sc_pyc * ( zhbl(ji,jj) / zdh(ji,jj) - 1.0 ) * ( zb_ml(ji,jj) - zb_bl(ji,jj) ) 
    1301               zdifpyc_s_sc(ji,jj) = 0.09 * zdifpyc_s_sc(ji,jj) * zstab_fac 
    1302               zdifpyc_s_sc(ji,jj) = MAX( zdifpyc_s_sc(ji,jj), -0.5 * zdifpyc_n_sc(ji,jj) ) 
    1303  
    1304               zvispyc_n_sc(ji,jj) = 0.09 * zvel_sc_pyc * ( 1.0 - zhbl(ji,jj) / zdh(ji,jj) )**2 * ( 0.005 * ( zu_ml(ji,jj)-zu_bl(ji,jj) )**2 + 0.0075 * ( zv_ml(ji,jj)-zv_bl(ji,jj) )**2 ) / zdh(ji,jj) 
    1305               zvispyc_n_sc(ji,jj) = rn_vis_pyc * zvel_sc_ml * zdh(ji,jj) + zvispyc_n_sc(ji,jj) * zstab_fac 
    1306               IF ( lshear(ji,jj) .and. j_ddh(ji,jj) == 1 ) THEN 
    1307                 zvispyc_n_sc(ji,jj) = zvispyc_n_sc(ji,jj) + rn_vispyc_shr * ( zshear(ji,jj) * zhbl(ji,jj ) )**pthird * zhbl(ji,jj) 
    1308               ENDIF 
    1309  
    1310               zvispyc_s_sc(ji,jj) = 0.09 * ( zwb_min(ji,jj) + 0.0025 * zvel_sc_pyc * ( zhbl(ji,jj) / zdh(ji,jj) - 1.0 ) * ( zb_ml(ji,jj) - zb_bl(ji,jj) ) ) 
    1311               zvispyc_s_sc(ji,jj) = zvispyc_s_sc(ji,jj) * zstab_fac 
    1312               zvispyc_s_sc(ji,jj) = MAX( zvispyc_s_sc(ji,jj), -0.5 * zvispyc_s_sc(ji,jj) ) 
    1313  
    1314               zbeta_d_sc(ji,jj) = 1.0 - ( ( zdifpyc_n_sc(ji,jj) + 1.4 * zdifpyc_s_sc(ji,jj) ) / ( zdifml_sc(ji,jj) + epsln ) )**p2third 
    1315               zbeta_v_sc(ji,jj) = 1.0 -  2.0 * ( zvispyc_n_sc(ji,jj) + zvispyc_s_sc(ji,jj) ) / ( zvisml_sc(ji,jj) + epsln ) 
    1316             ELSE 
    1317               zbeta_d_sc(ji,jj) = 1.0 
    1318               zbeta_v_sc(ji,jj) = 1.0 
    1319             ENDIF 
    1320           ELSE 
    1321             zdifml_sc(ji,jj) = zvstr(ji,jj) * zhbl(ji,jj) * MAX( EXP ( -( zhol(ji,jj) / 0.6_wp )**2 ), 0.2_wp) 
    1322             zvisml_sc(ji,jj) = zvstr(ji,jj) * zhbl(ji,jj) * MAX( EXP ( -( zhol(ji,jj) / 0.6_wp )**2 ), 0.2_wp) 
    1323           END IF 
    1324       END_2D 
    1325 ! 
    1326        DO_2D( 0, 0, 0, 0 ) 
    1327           IF ( lconv(ji,jj) ) THEN 
    1328              DO jk = 2, imld(ji,jj)   ! mixed layer diffusivity 
    1329                  zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj) 
    1330                  ! 
    1331                  zdiffut(ji,jj,jk) = zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_d_sc(ji,jj) * zznd_ml )**1.5 
    1332                  ! 
    1333                  zviscos(ji,jj,jk) = zvisml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_v_sc(ji,jj) * zznd_ml ) & 
    1334    &            *                                      ( 1.0 - 0.5 * zznd_ml**2 ) 
    1335              END DO 
    1336 ! pycnocline 
    1337              IF ( lpyc(ji,jj) ) THEN 
    1338 ! Diffusivity profile in the pycnocline given by cubic polynomial. 
    1339                 za_cubic = 0.5 
    1340                 zb_cubic = -1.75 * zdifpyc_s_sc(ji,jj) / zdifpyc_n_sc(ji,jj) 
    1341                 zd_cubic = ( zdh(ji,jj) * zdifml_sc(ji,jj) / zhml(ji,jj) * SQRT( 1.0 - zbeta_d_sc(ji,jj) ) * ( 2.5 * zbeta_d_sc(ji,jj) - 1.0 ) & 
    1342                      & - 0.85 * zdifpyc_s_sc(ji,jj) ) / MAX(zdifpyc_n_sc(ji,jj), 1.e-8) 
    1343                 zd_cubic = zd_cubic - zb_cubic - 2.0 * ( 1.0 - za_cubic  - zb_cubic ) 
    1344                 zc_cubic = 1.0 - za_cubic - zb_cubic - zd_cubic 
    1345                 DO jk = imld(ji,jj) , ibld(ji,jj) 
    1346                   zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / MAX(zdh(ji,jj), 1.e-6) 
    1347                       ! 
    1348                   zdiffut(ji,jj,jk) = zdifpyc_n_sc(ji,jj) * ( za_cubic + zb_cubic * zznd_pyc + zc_cubic * zznd_pyc**2 +   zd_cubic * zznd_pyc**3 ) 
    1349  
    1350                   zdiffut(ji,jj,jk) = zdiffut(ji,jj,jk) + zdifpyc_s_sc(ji,jj) * ( 1.75 * zznd_pyc - 0.15 * zznd_pyc**2 - 0.2 * zznd_pyc**3 ) 
    1351                 END DO 
    1352  ! viscosity profiles. 
    1353                 za_cubic = 0.5 
    1354                 zb_cubic = -1.75 * zvispyc_s_sc(ji,jj) / zvispyc_n_sc(ji,jj) 
    1355                 zd_cubic = ( 0.5 * zvisml_sc(ji,jj) * zdh(ji,jj) / zhml(ji,jj) - 0.85 * zvispyc_s_sc(ji,jj)  )  / MAX(zvispyc_n_sc(ji,jj), 1.e-8) 
    1356                 zd_cubic = zd_cubic - zb_cubic - 2.0 * ( 1.0 - za_cubic - zd_cubic ) 
    1357                 zc_cubic = 1.0 - za_cubic - zb_cubic - zd_cubic 
    1358                 DO jk = imld(ji,jj) , ibld(ji,jj) 
    1359                    zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / MAX(zdh(ji,jj), 1.e-6) 
    1360                     zviscos(ji,jj,jk) = zvispyc_n_sc(ji,jj) * ( za_cubic + zb_cubic * zznd_pyc + zc_cubic * zznd_pyc**2 + zd_cubic * zznd_pyc**3 ) 
    1361                     zviscos(ji,jj,jk) = zviscos(ji,jj,jk) + zvispyc_s_sc(ji,jj) * ( 1.75 * zznd_pyc - 0.15 * zznd_pyc**2 -0.2 * zznd_pyc**3 ) 
    1362                 END DO 
    1363                 IF ( zdhdt(ji,jj) > 0._wp ) THEN 
    1364                  zdiffut(ji,jj,ibld(ji,jj)+1) = MAX( 0.5 * zdhdt(ji,jj) * e3w(ji,jj,ibld(ji,jj)+1,Kmm), 1.0e-6 ) 
    1365                  zviscos(ji,jj,ibld(ji,jj)+1) = MAX( 0.5 * zdhdt(ji,jj) * e3w(ji,jj,ibld(ji,jj)+1,Kmm), 1.0e-6 ) 
    1366                 ELSE 
    1367                   zdiffut(ji,jj,ibld(ji,jj)) = 0._wp 
    1368                   zviscos(ji,jj,ibld(ji,jj)) = 0._wp 
    1369                 ENDIF 
    1370              ENDIF 
    1371           ELSE 
    1372           ! stable conditions 
    1373              DO jk = 2, ibld(ji,jj) 
    1374                 zznd_ml = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj) 
    1375                 zdiffut(ji,jj,jk) = 0.75 * zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zznd_ml )**1.5 
    1376                 zviscos(ji,jj,jk) = 0.375 * zvisml_sc(ji,jj) * zznd_ml * (1.0 - zznd_ml) * ( 1.0 - zznd_ml**2 ) 
    1377              END DO 
    1378  
    1379              IF ( zdhdt(ji,jj) > 0._wp ) THEN 
    1380                 zdiffut(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj), 1.0e-6) * e3w(ji, jj, ibld(ji,jj), Kmm) 
    1381                 zviscos(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj), 1.0e-6) * e3w(ji, jj, ibld(ji,jj), Kmm) 
    1382              ENDIF 
    1383           ENDIF   ! end if ( lconv ) 
    1384           ! 
    1385        END_2D 
    1386  
    1387   END SUBROUTINE zdf_osm_diffusivity_viscosity 
    1388  
    1389   SUBROUTINE zdf_osm_osbl_state( lconv, lshear, j_ddh, zwb_ent, zwb_min, zshear, zri_i ) 
    1390  
    1391 !!--------------------------------------------------------------------- 
    1392      !!                   ***  ROUTINE zdf_osm_osbl_state  *** 
    1393      !! 
    1394      !! ** Purpose : Determines the state of the OSBL, stable/unstable, shear/ noshear. Also determines shear production, entrainment buoyancy flux and interfacial Richardson number 
    1395      !! 
    1396      !! ** Method  : 
    1397      !! 
    1398      !! !!---------------------------------------------------------------------- 
    1399  
    1400      INTEGER, DIMENSION(jpi,jpj) :: j_ddh  ! j_ddh = 0, active shear layer; j_ddh=1, shear layer not active; j_ddh=2 shear production low. 
    1401  
    1402      LOGICAL, DIMENSION(jpi,jpj) :: lconv, lshear 
    1403  
    1404      REAL(wp), DIMENSION(jpi,jpj) :: zwb_ent, zwb_min ! Buoyancy fluxes at base of well-mixed layer. 
    1405      REAL(wp), DIMENSION(jpi,jpj) :: zshear  ! production of TKE due to shear across the pycnocline 
    1406      REAL(wp), DIMENSION(jpi,jpj) :: zri_i  ! Interfacial Richardson Number 
    1407  
    1408 ! Local Variables 
    1409  
    1410      INTEGER :: jj, ji 
    1411  
    1412      REAL(wp), DIMENSION(jpi,jpj) :: zekman 
    1413      REAL(wp) :: zri_p, zri_b   ! Richardson numbers 
    1414      REAL(wp) :: zshear_u, zshear_v, zwb_shr 
    1415      REAL(wp) :: zwcor, zrf_conv, zrf_shear, zrf_langmuir, zr_stokes 
    1416  
    1417      REAL(wp), PARAMETER :: za_shr = 0.4, zb_shr = 6.5, za_wb_s = 0.1 
    1418      REAL(wp), PARAMETER :: rn_ri_thres_a = 0.5, rn_ri_thresh_b = 0.59 
    1419      REAL(wp), PARAMETER :: zalpha_c = 0.2, zalpha_lc = 0.04 
    1420      REAL(wp), PARAMETER :: zalpha_ls = 0.06, zalpha_s = 0.15 
    1421      REAL(wp), PARAMETER :: rn_ri_p_thresh = 27.0 
    1422      REAL(wp), PARAMETER :: zrot=0._wp  ! dummy rotation rate of surface stress. 
    1423  
    1424 ! Determins stability and set flag lconv 
    1425      DO_2D( 0, 0, 0, 0 ) 
    1426       IF ( zhol(ji,jj) < 0._wp ) THEN 
    1427          lconv(ji,jj) = .TRUE. 
    1428        ELSE 
    1429           lconv(ji,jj) = .FALSE. 
    1430        ENDIF 
    1431      END_2D 
    1432  
    1433      zekman(:,:) = EXP( - 4.0 * ABS( ff_t(:,:) ) * zhbl(:,:) / MAX(zustar(:,:), 1.e-8 ) ) 
    1434  
    1435      WHERE ( lconv ) 
    1436        zri_i = zdb_ml * zhml**2 / MAX( ( zvstr**3 + 0.5 * zwstrc**3 )**p2third * zdh, 1.e-12 ) 
    1437      END WHERE 
    1438  
    1439      zshear(:,:) = 0._wp 
    1440      j_ddh(:,:) = 1 
    1441  
    1442      DO_2D( 0, 0, 0, 0 ) 
    1443       IF ( lconv(ji,jj) ) THEN 
    1444          IF ( zdb_bl(ji,jj) > 0._wp ) THEN 
    1445            zri_p = MAX (  SQRT( zdb_bl(ji,jj) * zdh(ji,jj) / MAX( zdu_bl(ji,jj)**2 + zdv_bl(ji,jj)**2, 1.e-8) )  *  ( zhbl(ji,jj) / zdh(ji,jj) ) * ( zvstr(ji,jj) / MAX( zustar(ji,jj), 1.e-6 ) )**2 & 
    1446                 & / MAX( zekman(ji,jj), 1.e-6 )  , 5._wp ) 
    1447  
    1448            zri_b = zdb_ml(ji,jj) * zdh(ji,jj) / MAX( zdu_ml(ji,jj)**2 + zdv_ml(ji,jj)**2, 1.e-8 ) 
    1449  
    1450            zshear(ji,jj) = za_shr * zekman(ji,jj) * ( MAX( zustar(ji,jj)**2 * zdu_ml(ji,jj) / zhbl(ji,jj), 0._wp ) + zb_shr * MAX( -ff_t(ji,jj) * zustke(ji,jj) * dstokes(ji,jj) * zdv_ml(ji,jj) / zhbl(ji,jj), 0._wp ) ) 
    1451 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    1452 ! Test ensures j_ddh=0 is not selected. Change to zri_p<27 when  ! 
    1453 ! full code available                                          ! 
    1454 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    1455            IF ( zri_p < -rn_ri_p_thresh .and. zshear(ji,jj) > 0._wp ) THEN 
    1456 ! Growing shear layer 
    1457              j_ddh(ji,jj) = 0 
    1458              lshear(ji,jj) = .TRUE. 
    1459            ELSE 
    1460              j_ddh(ji,jj) = 1 
    1461              IF ( zri_b <= 1.5 .and. zshear(ji,jj) > 0._wp ) THEN 
    1462 ! shear production large enough to determine layer charcteristics, but can't maintain a shear layer. 
    1463                lshear(ji,jj) = .TRUE. 
    1464              ELSE 
    1465 ! Shear production may not be zero, but is small and doesn't determine characteristics of pycnocline. 
    1466                zshear(ji,jj) = 0.5 * zshear(ji,jj) 
    1467                lshear(ji,jj) = .FALSE. 
    1468              ENDIF 
    1469            ENDIF 
    1470          ELSE                ! zdb_bl test, note zshear set to zero 
    1471            j_ddh(ji,jj) = 2 
    1472            lshear(ji,jj) = .FALSE. 
    1473          ENDIF 
    1474        ENDIF 
    1475      END_2D 
    1476  
    1477 ! Calculate entrainment buoyancy flux due to surface fluxes. 
    1478  
    1479      DO_2D( 0, 0, 0, 0 ) 
    1480       IF ( lconv(ji,jj) ) THEN 
    1481         zwcor = ABS(ff_t(ji,jj)) * zhbl(ji,jj) + epsln 
    1482         zrf_conv = TANH( ( zwstrc(ji,jj) / zwcor )**0.69 ) 
    1483         zrf_shear = TANH( ( zustar(ji,jj) / zwcor )**0.69 ) 
    1484         zrf_langmuir = TANH( ( zwstrl(ji,jj) / zwcor )**0.69 ) 
    1485         IF (nn_osm_SD_reduce > 0 ) THEN 
    1486         ! Effective Stokes drift already reduced from surface value 
    1487            zr_stokes = 1.0_wp 
    1488         ELSE 
    1489          ! Effective Stokes drift only reduced by factor rn_zdfodm_adjust_sd, 
    1490           ! requires further reduction where BL is deep 
    1491            zr_stokes = 1.0 - EXP( -25.0 * dstokes(ji,jj) / hbl(ji,jj) & 
    1492          &                  * ( 1.0 + 4.0 * dstokes(ji,jj) / hbl(ji,jj) ) ) 
    1493         END IF 
    1494         zwb_ent(ji,jj) = - 2.0 * 0.2 * zrf_conv * zwbav(ji,jj) & 
    1495                &                  - 0.15 * zrf_shear * zustar(ji,jj)**3 /zhml(ji,jj) & 
    1496                &         + zr_stokes * ( 0.15 * EXP( -1.5 * zla(ji,jj) ) * zrf_shear * zustar(ji,jj)**3 & 
    1497                &                                         - zrf_langmuir * 0.03 * zwstrl(ji,jj)**3 ) / zhml(ji,jj) 
    1498           ! 
    1499       ENDIF 
    1500      END_2D 
    1501  
    1502      zwb_min(:,:) = 0._wp 
    1503  
    1504      DO_2D( 0, 0, 0, 0 ) 
    1505       IF ( lshear(ji,jj) ) THEN 
    1506         IF ( lconv(ji,jj) ) THEN 
    1507 ! Unstable OSBL 
    1508            zwb_shr = -za_wb_s * zshear(ji,jj) 
    1509            IF ( j_ddh(ji,jj) == 0 ) THEN 
    1510  
    1511 ! Developing shear layer, additional shear production possible. 
    1512  
    1513              zshear_u = MAX( zustar(ji,jj)**2 * zdu_ml(ji,jj) /  zhbl(ji,jj), 0._wp ) 
    1514              zshear(ji,jj) = zshear(ji,jj) + zshear_u * ( 1.0 - MIN( zri_p / rn_ri_p_thresh, 1.d0 ) ) 
    1515              zshear(ji,jj) = MIN( zshear(ji,jj), zshear_u ) 
    1516  
    1517              zwb_shr = -za_wb_s * zshear(ji,jj) 
    1518  
    1519            ENDIF 
    1520            zwb_ent(ji,jj) = zwb_ent(ji,jj) + zwb_shr 
    1521            zwb_min(ji,jj) = zwb_ent(ji,jj) + zdh(ji,jj) / zhbl(ji,jj) * zwb0(ji,jj) 
    1522         ELSE    ! IF ( lconv ) THEN - ENDIF 
    1523 ! Stable OSBL  - shear production not coded for first attempt. 
    1524         ENDIF  ! lconv 
    1525       ELSE  ! lshear 
    1526         IF ( lconv(ji,jj) ) THEN 
    1527 ! Unstable OSBL 
    1528            zwb_shr = -za_wb_s * zshear(ji,jj) 
    1529            zwb_ent(ji,jj) = zwb_ent(ji,jj) + zwb_shr 
    1530            zwb_min(ji,jj) = zwb_ent(ji,jj) + zdh(ji,jj) / zhbl(ji,jj) * zwb0(ji,jj) 
    1531         ENDIF  ! lconv 
    1532       ENDIF    ! lshear 
    1533      END_2D 
    1534    END SUBROUTINE zdf_osm_osbl_state 
    1535  
    1536  
    1537    SUBROUTINE zdf_osm_vertical_average( jnlev_av, jp_ext, zt, zs, zb, zu, zv, zdt, zds, zdb, zdu, zdv ) 
    1538      !!--------------------------------------------------------------------- 
    1539      !!                   ***  ROUTINE zdf_vertical_average  *** 
    1540      !! 
    1541      !! ** Purpose : Determines vertical averages from surface to jnlev. 
    1542      !! 
    1543      !! ** Method  : Averages are calculated from the surface to jnlev. 
    1544      !!              The external level used to calculate differences is ibld+ibld_ext 
    1545      !! 
    1546      !!---------------------------------------------------------------------- 
    1547  
    1548         INTEGER, DIMENSION(jpi,jpj) , INTENT(IN) :: jnlev_av  ! Number of levels to average over. 
    1549         INTEGER, DIMENSION(jpi,jpj) , INTENT(IN) :: jp_ext 
    1550  
    1551         ! Alan: do we need zb? 
    1552         REAL(wp), DIMENSION(jpi,jpj) :: zt, zs, zb        ! Average temperature and salinity 
    1553         REAL(wp), DIMENSION(jpi,jpj) :: zu,zv         ! Average current components 
    1554         REAL(wp), DIMENSION(jpi,jpj) :: zdt, zds, zdb ! Difference between average and value at base of OSBL 
    1555         REAL(wp), DIMENSION(jpi,jpj) :: zdu, zdv      ! Difference for velocity components. 
    1556  
    1557         INTEGER :: jk, ji, jj, ibld_ext 
    1558         REAL(wp) :: zthick, zthermal, zbeta 
    1559  
    1560  
    1561         zt   = 0._wp 
    1562         zs   = 0._wp 
    1563         zu   = 0._wp 
    1564         zv   = 0._wp 
    1565         DO_2D( 0, 0, 0, 0 ) 
    1566          zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1?? 
    1567          zbeta    = rab_n(ji,jj,1,jp_sal) 
    1568             ! average over depth of boundary layer 
    1569          zthick = epsln 
    1570          DO jk = 2, jnlev_av(ji,jj) 
    1571             zthick = zthick + e3t(ji,jj,jk,Kmm) 
    1572             zt(ji,jj)   = zt(ji,jj)  + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_tem,Kmm) 
    1573             zs(ji,jj)   = zs(ji,jj)  + e3t(ji,jj,jk,Kmm) * ts(ji,jj,jk,jp_sal,Kmm) 
    1574             zu(ji,jj)   = zu(ji,jj)  + e3t(ji,jj,jk,Kmm) & 
    1575                   &            * ( uu(ji,jj,jk,Kbb) + uu(ji - 1,jj,jk,Kbb) ) & 
    1576                   &            / MAX( 1. , umask(ji,jj,jk) + umask(ji - 1,jj,jk) ) 
    1577             zv(ji,jj)   = zv(ji,jj)  + e3t(ji,jj,jk,Kmm) & 
    1578                   &            * ( vv(ji,jj,jk,Kbb) + vv(ji,jj - 1,jk,Kbb) ) & 
    1579                   &            / MAX( 1. , vmask(ji,jj,jk) + vmask(ji,jj - 1,jk) ) 
    1580          END DO 
    1581          zt(ji,jj) = zt(ji,jj) / zthick 
    1582          zs(ji,jj) = zs(ji,jj) / zthick 
    1583          zu(ji,jj) = zu(ji,jj) / zthick 
    1584          zv(ji,jj) = zv(ji,jj) / zthick 
    1585          zb(ji,jj) = grav * zthermal * zt(ji,jj) - grav * zbeta * zs(ji,jj) 
    1586          ibld_ext = jnlev_av(ji,jj) + jp_ext(ji,jj) 
    1587          IF ( ibld_ext < mbkt(ji,jj) ) THEN 
    1588            zdt(ji,jj) = zt(ji,jj) - ts(ji,jj,ibld_ext,jp_tem,Kmm) 
    1589            zds(ji,jj) = zs(ji,jj) - ts(ji,jj,ibld_ext,jp_sal,Kmm) 
    1590            zdu(ji,jj) = zu(ji,jj) - ( uu(ji,jj,ibld_ext,Kbb) + uu(ji-1,jj,ibld_ext,Kbb ) ) & 
    1591                   &    / MAX(1. , umask(ji,jj,ibld_ext ) + umask(ji-1,jj,ibld_ext ) ) 
    1592            zdv(ji,jj) = zv(ji,jj) - ( vv(ji,jj,ibld_ext,Kbb) + vv(ji,jj-1,ibld_ext,Kbb ) ) & 
    1593                   &   / MAX(1. , vmask(ji,jj,ibld_ext ) + vmask(ji,jj-1,ibld_ext ) ) 
    1594            zdb(ji,jj) = grav * zthermal * zdt(ji,jj) - grav * zbeta * zds(ji,jj) 
    1595          ELSE 
    1596            zdt(ji,jj) = 0._wp 
    1597            zds(ji,jj) = 0._wp 
    1598            zdu(ji,jj) = 0._wp 
    1599            zdv(ji,jj) = 0._wp 
    1600            zdb(ji,jj) = 0._wp 
    1601          ENDIF 
    1602         END_2D 
    1603    END SUBROUTINE zdf_osm_vertical_average 
    1604  
    1605    SUBROUTINE zdf_osm_velocity_rotation( zcos_w, zsin_w, zu, zv, zdu, zdv ) 
    1606      !!--------------------------------------------------------------------- 
    1607      !!                   ***  ROUTINE zdf_velocity_rotation  *** 
    1608      !! 
    1609      !! ** Purpose : Rotates frame of reference of averaged velocity components. 
    1610      !! 
    1611      !! ** Method  : The velocity components are rotated into frame specified by zcos_w and zsin_w 
    1612      !! 
    1613      !!---------------------------------------------------------------------- 
    1614  
    1615         REAL(wp), DIMENSION(jpi,jpj) :: zcos_w, zsin_w       ! Cos and Sin of rotation angle 
    1616         REAL(wp), DIMENSION(jpi,jpj) :: zu, zv               ! Components of current 
    1617         REAL(wp), DIMENSION(jpi,jpj) :: zdu, zdv             ! Change in velocity components across pycnocline 
    1618  
    1619         INTEGER :: ji, jj 
    1620         REAL(wp) :: ztemp 
    1621  
    1622         DO_2D( 0, 0, 0, 0 ) 
    1623            ztemp = zu(ji,jj) 
    1624            zu(ji,jj) = zu(ji,jj) * zcos_w(ji,jj) + zv(ji,jj) * zsin_w(ji,jj) 
    1625            zv(ji,jj) = zv(ji,jj) * zcos_w(ji,jj) - ztemp * zsin_w(ji,jj) 
    1626            ztemp = zdu(ji,jj) 
    1627            zdu(ji,jj) = zdu(ji,jj) * zcos_w(ji,jj) + zdv(ji,jj) * zsin_w(ji,jj) 
    1628            zdv(ji,jj) = zdv(ji,jj) * zsin_w(ji,jj) - ztemp * zsin_w(ji,jj) 
    1629         END_2D 
    1630     END SUBROUTINE zdf_osm_velocity_rotation 
    1631  
    1632     SUBROUTINE zdf_osm_osbl_state_fk( lpyc, lflux, lmle, zwb_fk ) 
    1633      !!--------------------------------------------------------------------- 
    1634      !!                   ***  ROUTINE zdf_osm_osbl_state_fk  *** 
    1635      !! 
    1636      !! ** Purpose : Determines the state of the OSBL and MLE layer. Info is returned in the logicals lpyc,lflux and lmle. Used with Fox-Kemper scheme. 
    1637      !!  lpyc :: determines whether pycnocline flux-grad relationship needs to be determined 
    1638      !!  lflux :: determines whether effects of surface flux extend below the base of the OSBL 
    1639      !!  lmle  :: determines whether the layer with MLE is increasing with time or if base is relaxing towards hbl. 
    1640      !! 
    1641      !! ** Method  : 
    1642      !! 
    1643      !! 
    1644      !!---------------------------------------------------------------------- 
    1645  
    1646 ! Outputs 
    1647       LOGICAL,  DIMENSION(jpi,jpj)  :: lpyc, lflux, lmle 
    1648       REAL(wp), DIMENSION(jpi,jpj)  :: zwb_fk 
    1649 ! 
    1650       REAL(wp), DIMENSION(jpi,jpj)  :: znd_param 
    1651       REAL(wp)                      :: zbuoy, ztmp, zpe_mle_layer 
    1652       REAL(wp)                      :: zpe_mle_ref, zwb_ent, zdbdz_mle_int 
    1653  
    1654       znd_param(:,:) = 0._wp 
    1655  
    1656         DO_2D( 0, 0, 0, 0 ) 
    1657           ztmp =  r1_ft(ji,jj) *  MIN( 111.e3_wp , e1u(ji,jj) ) / rn_osm_mle_lf 
    1658           zwb_fk(ji,jj) = rn_osm_mle_ce * hmle(ji,jj) * hmle(ji,jj) * ztmp * zdbds_mle(ji,jj) * zdbds_mle(ji,jj) 
    1659         END_2D 
    1660         DO_2D( 0, 0, 0, 0 ) 
    1661                  ! 
    1662          IF ( lconv(ji,jj) ) THEN 
    1663            IF ( zhmle(ji,jj) > 1.2 * zhbl(ji,jj) ) THEN 
    1664              zt_mle(ji,jj) = ( zt_mle(ji,jj) * zhmle(ji,jj) - zt_bl(ji,jj) * zhbl(ji,jj) ) / ( zhmle(ji,jj) - zhbl(ji,jj) ) 
    1665              zs_mle(ji,jj) = ( zs_mle(ji,jj) * zhmle(ji,jj) - zs_bl(ji,jj) * zhbl(ji,jj) ) / ( zhmle(ji,jj) - zhbl(ji,jj) ) 
    1666              zb_mle(ji,jj) = ( zb_mle(ji,jj) * zhmle(ji,jj) - zb_bl(ji,jj) * zhbl(ji,jj) ) / ( zhmle(ji,jj) - zhbl(ji,jj) ) 
    1667              zdbdz_mle_int = ( zb_bl(ji,jj) - ( 2.0 * zb_mle(ji,jj) -zb_bl(ji,jj) ) ) / ( zhmle(ji,jj) - zhbl(ji,jj) ) 
    1668 ! Calculate potential energies of actual profile and reference profile. 
    1669              zpe_mle_layer = 0._wp 
    1670              zpe_mle_ref = 0._wp 
    1671              DO jk = ibld(ji,jj), mld_prof(ji,jj) 
    1672                zbuoy = grav * ( zthermal * ts(ji,jj,jk,jp_tem,Kmm) - zbeta * ts(ji,jj,jk,jp_sal,Kmm) ) 
    1673                zpe_mle_layer = zpe_mle_layer + zbuoy * gdepw(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    1674                zpe_mle_ref = zpe_mle_ref + ( zb_bl(ji,jj) - zdbdz_mle_int * ( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) ) * gdepw(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    1675              END DO 
    1676 ! Non-dimensional parameter to diagnose the presence of thermocline 
    1677  
    1678              znd_param(ji,jj) = ( zpe_mle_layer - zpe_mle_ref ) * ABS( ff_t(ji,jj) ) / ( MAX( zwb_fk(ji,jj), 1.0e-10 ) * zhmle(ji,jj) ) 
    1679            ENDIF 
    1680          ENDIF 
    1681         END_2D 
    1682  
    1683 ! Diagnosis 
    1684         DO_2D( 0, 0, 0, 0 ) 
    1685           IF ( lconv(ji,jj) ) THEN 
    1686             zwb_ent = - 2.0 * 0.2 * zwbav(ji,jj) & 
    1687                &                  - 0.15 * zustar(ji,jj)**3 /zhml(ji,jj) & 
    1688                &         + ( 0.15 * EXP( -1.5 * zla(ji,jj) ) * zustar(ji,jj)**3 & 
    1689                &         - 0.03 * zwstrl(ji,jj)**3 ) / zhml(ji,jj) 
    1690             IF ( -2.0 * zwb_fk(ji,jj) / zwb_ent > 0.5 ) THEN 
    1691               IF ( zhmle(ji,jj) > 1.2 * zhbl(ji,jj) ) THEN 
    1692 ! MLE layer growing 
    1693                 IF ( znd_param (ji,jj) > 100. ) THEN 
    1694 ! Thermocline present 
    1695                   lflux(ji,jj) = .FALSE. 
    1696                   lmle(ji,jj) =.FALSE. 
    1697                 ELSE 
    1698 ! Thermocline not present 
    1699                   lflux(ji,jj) = .TRUE. 
    1700                   lmle(ji,jj) = .TRUE. 
    1701                 ENDIF  ! znd_param > 100 
    1702 ! 
    1703                 IF ( zdb_bl(ji,jj) < rn_osm_bl_thresh ) THEN 
    1704                   lpyc(ji,jj) = .FALSE. 
    1705                 ELSE 
    1706                    lpyc = .TRUE. 
    1707                 ENDIF 
    1708               ELSE 
    1709 ! MLE layer restricted to OSBL or just below. 
    1710                 IF ( zdb_bl(ji,jj) < rn_osm_bl_thresh ) THEN 
    1711 ! Weak stratification MLE layer can grow. 
    1712                   lpyc(ji,jj) = .FALSE. 
    1713                   lflux(ji,jj) = .TRUE. 
    1714                   lmle(ji,jj) = .TRUE. 
    1715                 ELSE 
    1716 ! Strong stratification 
    1717                   lpyc(ji,jj) = .TRUE. 
    1718                   lflux(ji,jj) = .FALSE. 
    1719                   lmle(ji,jj) = .FALSE. 
    1720                 ENDIF ! zdb_bl < rn_mle_thresh_bl and 
    1721               ENDIF  ! zhmle > 1.2 zhbl 
    1722             ELSE 
    1723               lpyc(ji,jj) = .TRUE. 
    1724               lflux(ji,jj) = .FALSE. 
    1725               lmle(ji,jj) = .FALSE. 
    1726               IF ( zdb_bl(ji,jj) < rn_osm_bl_thresh ) lpyc(ji,jj) = .FALSE. 
    1727             ENDIF !  -2.0 * zwb_fk(ji,jj) / zwb_ent > 0.5 
    1728           ELSE 
    1729 ! Stable Boundary Layer 
    1730             lpyc(ji,jj) = .FALSE. 
    1731             lflux(ji,jj) = .FALSE. 
    1732             lmle(ji,jj) = .FALSE. 
    1733           ENDIF  ! lconv 
    1734         END_2D 
    1735     END SUBROUTINE zdf_osm_osbl_state_fk 
    1736  
    1737     SUBROUTINE zdf_osm_external_gradients(jbase, zdtdz, zdsdz, zdbdz ) 
    1738      !!--------------------------------------------------------------------- 
    1739      !!                   ***  ROUTINE zdf_osm_external_gradients  *** 
    1740      !! 
    1741      !! ** Purpose : Calculates the gradients below the OSBL 
    1742      !! 
    1743      !! ** Method  : Uses ibld and ibld_ext to determine levels to calculate the gradient. 
    1744      !! 
    1745      !!---------------------------------------------------------------------- 
    1746  
    1747      INTEGER, DIMENSION(jpi,jpj), INTENT(IN)  :: jbase 
    1748      REAL(wp), DIMENSION(jpi,jpj) :: zdtdz, zdsdz, zdbdz   ! External gradients of temperature, salinity and buoyancy. 
    1749  
    1750      INTEGER :: jj, ji, jkb, jkb1 
    1751      REAL(wp) :: zthermal, zbeta 
    1752  
    1753  
    1754      DO_2D( 0, 0, 0, 0 ) 
    1755         IF ( jbase(ji,jj)+1 < mbkt(ji,jj) ) THEN 
    1756            zthermal = rab_n(ji,jj,1,jp_tem) !ideally use ibld not 1?? 
    1757            zbeta    = rab_n(ji,jj,1,jp_sal) 
    1758            jkb = jbase(ji,jj) 
    1759            jkb1 = MIN(jkb + 1, mbkt(ji,jj)) 
    1760            zdtdz(ji,jj) = - ( ts(ji,jj,jkb1,jp_tem,Kmm) - ts(ji,jj,jkb,jp_tem,Kmm ) ) & 
    1761                 &   / e3t(ji,jj,ibld(ji,jj),Kmm) 
    1762            zdsdz(ji,jj) = - ( ts(ji,jj,jkb1,jp_sal,Kmm) - ts(ji,jj,jkb,jp_sal,Kmm ) ) & 
    1763                 &   / e3t(ji,jj,ibld(ji,jj),Kmm) 
    1764            zdbdz(ji,jj) = grav * zthermal * zdtdz(ji,jj) - grav * zbeta * zdsdz(ji,jj) 
    1765         ELSE 
    1766            zdtdz(ji,jj) = 0._wp 
    1767            zdsdz(ji,jj) = 0._wp 
    1768            zdbdz(ji,jj) = 0._wp 
    1769         END IF 
    1770      END_2D 
    1771     END SUBROUTINE zdf_osm_external_gradients 
    1772  
    1773     SUBROUTINE zdf_osm_pycnocline_scalar_profiles( zdtdz, zdsdz, zdbdz, zalpha ) 
    1774  
    1775      REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdtdz, zdsdz, zdbdz      ! gradients in the pycnocline 
    1776      REAL(wp), DIMENSION(jpi,jpj) :: zalpha 
    1777  
    1778      INTEGER :: jk, jj, ji 
    1779      REAL(wp) :: ztgrad, zsgrad, zbgrad 
    1780      REAL(wp) :: zgamma_b_nd, znd 
    1781      REAL(wp) :: zzeta_m, zzeta_en, zbuoy_pyc_sc 
    1782      REAL(wp), PARAMETER :: zgamma_b = 2.25, zzeta_sh = 0.15 
    1783  
    1784      DO_2D( 0, 0, 0, 0 ) 
    1785         IF ( ibld(ji,jj) + jp_ext(ji,jj) < mbkt(ji,jj) ) THEN 
    1786            IF ( lconv(ji,jj) ) THEN  ! convective conditions 
    1787              IF ( lpyc(ji,jj) ) THEN 
    1788                 zzeta_m = 0.1 + 0.3 / ( 1.0 + EXP( -3.5 * LOG10( -zhol(ji,jj) ) ) ) 
    1789                 zalpha(ji,jj) = 2.0 * ( 1.0 - ( 0.80 * zzeta_m + 0.5 * SQRT( 3.14159 / zgamma_b ) ) * zdbdz_bl_ext(ji,jj) * zdh(ji,jj) / zdb_ml(ji,jj) ) / ( 0.723 + SQRT( 3.14159 / zgamma_b ) ) 
    1790                 zalpha(ji,jj) = MAX( zalpha(ji,jj), 0._wp ) 
    1791  
    1792                 ztmp = 1._wp/MAX(zdh(ji,jj), epsln) 
    1793 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    1794 ! Commented lines in this section are not needed in new code, once tested ! 
    1795 ! can be removed                                                          ! 
    1796 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    1797 !                   ztgrad = zalpha * zdt_ml(ji,jj) * ztmp + zdtdz_bl_ext(ji,jj) 
    1798 !                   zsgrad = zalpha * zds_ml(ji,jj) * ztmp + zdsdz_bl_ext(ji,jj) 
    1799                 zbgrad = zalpha(ji,jj) * zdb_ml(ji,jj) * ztmp + zdbdz_bl_ext(ji,jj) 
    1800                 zgamma_b_nd = zdbdz_bl_ext(ji,jj) * zdh(ji,jj) / MAX(zdb_ml(ji,jj), epsln) 
    1801                 DO jk = 2, ibld(ji,jj)+ibld_ext 
    1802                   znd = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) * ztmp 
    1803                   IF ( znd <= zzeta_m ) THEN 
    1804 !                        zdtdz(ji,jj,jk) = zdtdz_bl_ext(ji,jj) + zalpha * zdt_ml(ji,jj) * ztmp * & 
    1805 !                &        EXP( -6.0 * ( znd -zzeta_m )**2 ) 
    1806 !                        zdsdz(ji,jj,jk) = zdsdz_bl_ext(ji,jj) + zalpha * zds_ml(ji,jj) * ztmp * & 
    1807 !                                  & EXP( -6.0 * ( znd -zzeta_m )**2 ) 
    1808                      zdbdz(ji,jj,jk) = zdbdz_bl_ext(ji,jj) + zalpha(ji,jj) * zdb_ml(ji,jj) * ztmp * & 
    1809                                & EXP( -6.0 * ( znd -zzeta_m )**2 ) 
    1810                   ELSE 
    1811 !                         zdtdz(ji,jj,jk) =  ztgrad * EXP( -zgamma_b * ( znd - zzeta_m )**2 ) 
    1812 !                         zdsdz(ji,jj,jk) =  zsgrad * EXP( -zgamma_b * ( znd - zzeta_m )**2 ) 
    1813                       zdbdz(ji,jj,jk) =  zbgrad * EXP( -zgamma_b * ( znd - zzeta_m )**2 ) 
    1814                   ENDIF 
    1815                END DO 
    1816             ENDIF ! if no pycnocline pycnocline gradients set to zero 
    1817            ELSE 
    1818               ! stable conditions 
    1819               ! if pycnocline profile only defined when depth steady of increasing. 
    1820               IF ( zdhdt(ji,jj) > 0.0 ) THEN        ! Depth increasing, or steady. 
    1821                  IF ( zdb_bl(ji,jj) > 0._wp ) THEN 
    1822                     IF ( zhol(ji,jj) >= 0.5 ) THEN      ! Very stable - 'thick' pycnocline 
    1823                        ztmp = 1._wp/MAX(zhbl(ji,jj), epsln) 
    1824                        ztgrad = zdt_bl(ji,jj) * ztmp 
    1825                        zsgrad = zds_bl(ji,jj) * ztmp 
    1826                        zbgrad = zdb_bl(ji,jj) * ztmp 
    1827                        DO jk = 2, ibld(ji,jj) 
    1828                           znd = gdepw(ji,jj,jk,Kmm) * ztmp 
    1829                           zdtdz(ji,jj,jk) =  ztgrad * EXP( -15.0 * ( znd - 0.9 )**2 ) 
    1830                           zdbdz(ji,jj,jk) =  zbgrad * EXP( -15.0 * ( znd - 0.9 )**2 ) 
    1831                           zdsdz(ji,jj,jk) =  zsgrad * EXP( -15.0 * ( znd - 0.9 )**2 ) 
    1832                        END DO 
    1833                     ELSE                                   ! Slightly stable - 'thin' pycnoline - needed when stable layer begins to form. 
    1834                        ztmp = 1._wp/MAX(zdh(ji,jj), epsln) 
    1835                        ztgrad = zdt_bl(ji,jj) * ztmp 
    1836                        zsgrad = zds_bl(ji,jj) * ztmp 
    1837                        zbgrad = zdb_bl(ji,jj) * ztmp 
    1838                        DO jk = 2, ibld(ji,jj) 
    1839                           znd = -( gdepw(ji,jj,jk,Kmm) - zhml(ji,jj) ) * ztmp 
    1840                           zdtdz(ji,jj,jk) =  ztgrad * EXP( -1.75 * ( znd + 0.75 )**2 ) 
    1841                           zdbdz(ji,jj,jk) =  zbgrad * EXP( -1.75 * ( znd + 0.75 )**2 ) 
    1842                           zdsdz(ji,jj,jk) =  zsgrad * EXP( -1.75 * ( znd + 0.75 )**2 ) 
    1843                        END DO 
    1844                     ENDIF ! IF (zhol >=0.5) 
    1845                  ENDIF    ! IF (zdb_bl> 0.) 
    1846               ENDIF       ! IF (zdhdt >= 0) zdhdt < 0 not considered since pycnocline profile is zero and profile arrays are intialized to zero 
    1847            ENDIF          ! IF (lconv) 
    1848         ENDIF      ! IF ( ibld(ji,jj) < mbkt(ji,jj) ) 
    1849      END_2D 
    1850  
    1851     END SUBROUTINE zdf_osm_pycnocline_scalar_profiles 
    1852  
    1853     SUBROUTINE zdf_osm_pycnocline_shear_profiles( zdudz, zdvdz ) 
     1682         phbl(ji,jj) = gdepw(ji,jj,nbld(ji,jj),Kmm) 
     1683      END_2D 
     1684      ! 
     1685   END SUBROUTINE zdf_osm_timestep_hbl 
     1686 
     1687   SUBROUTINE zdf_osm_pycnocline_thickness( Kmm, pdh, phml, pdhdt, phbl,   & 
     1688      &                                     pwb_ent, pdbdz_bl_ext, pwb_fk_b ) 
    18541689      !!--------------------------------------------------------------------- 
    1855       !!                   ***  ROUTINE zdf_osm_pycnocline_shear_profiles  *** 
    1856       !! 
    1857       !! ** Purpose : Calculates velocity shear in the pycnocline 
    1858       !! 
    1859       !! ** Method  : 
    1860       !! 
    1861       !!---------------------------------------------------------------------- 
    1862  
    1863       REAL(wp), DIMENSION(jpi,jpj,jpk) :: zdudz, zdvdz 
    1864  
    1865       INTEGER :: jk, jj, ji 
    1866       REAL(wp) :: zugrad, zvgrad, znd 
    1867       REAL(wp) :: zzeta_v = 0.45 
    1868       ! 
    1869       DO_2D( 0, 0, 0, 0 ) 
    1870          ! 
    1871          IF ( ibld(ji,jj) + jp_ext(ji,jj) < mbkt(ji,jj) ) THEN 
    1872             IF ( lconv (ji,jj) ) THEN 
    1873                ! Unstable conditions. Shouldn;t be needed with no pycnocline code. 
    1874 !                  zugrad = 0.7 * zdu_ml(ji,jj) / zdh(ji,jj) + 0.3 * zustar(ji,jj)*zustar(ji,jj) / & 
    1875 !                       &      ( ( ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * zhml(ji,jj) ) * & 
    1876 !                      &      MIN(zla(ji,jj)**(8.0/3.0) + epsln, 0.12 )) 
    1877                !Alan is this right? 
    1878 !                  zvgrad = ( 0.7 * zdv_ml(ji,jj) + & 
    1879 !                       &    2.0 * ff_t(ji,jj) * zustke(ji,jj) * dstokes(ji,jj) / & 
    1880 !                       &          ( ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird  + epsln ) & 
    1881 !                       &      )/ (zdh(ji,jj)  + epsln ) 
    1882 !                  DO jk = 2, ibld(ji,jj) - 1 + ibld_ext 
    1883 !                     znd = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / (zdh(ji,jj) + epsln ) - zzeta_v 
    1884 !                     IF ( znd <= 0.0 ) THEN 
    1885 !                        zdudz(ji,jj,jk) = 1.25 * zugrad * EXP( 3.0 * znd ) 
    1886 !                        zdvdz(ji,jj,jk) = 1.25 * zvgrad * EXP( 3.0 * znd ) 
    1887 !                     ELSE 
    1888 !                        zdudz(ji,jj,jk) = 1.25 * zugrad * EXP( -2.0 * znd ) 
    1889 !                        zdvdz(ji,jj,jk) = 1.25 * zvgrad * EXP( -2.0 * znd ) 
    1890 !                     ENDIF 
    1891 !                  END DO 
    1892             ELSE 
    1893                ! stable conditions 
    1894                zugrad = 3.25 * zdu_bl(ji,jj) / zhbl(ji,jj) 
    1895                zvgrad = 2.75 * zdv_bl(ji,jj) / zhbl(ji,jj) 
    1896                DO jk = 2, ibld(ji,jj) 
    1897                   znd = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj) 
    1898                   IF ( znd < 1.0 ) THEN 
    1899                      zdudz(ji,jj,jk) = zugrad * EXP( -40.0 * ( znd - 1.0 )**2 ) 
    1900                   ELSE 
    1901                      zdudz(ji,jj,jk) = zugrad * EXP( -20.0 * ( znd - 1.0 )**2 ) 
    1902                   ENDIF 
    1903                   zdvdz(ji,jj,jk) = zvgrad * EXP( -20.0 * ( znd - 0.85 )**2 ) 
    1904                END DO 
    1905             ENDIF 
    1906             ! 
    1907          END IF      ! IF ( ibld(ji,jj) + ibld_ext < mbkt(ji,jj) ) 
    1908       END_2D 
    1909     END SUBROUTINE zdf_osm_pycnocline_shear_profiles 
    1910  
    1911    SUBROUTINE zdf_osm_calculate_dhdt( zdhdt, zddhdt ) 
    1912      !!--------------------------------------------------------------------- 
    1913      !!                   ***  ROUTINE zdf_osm_calculate_dhdt  *** 
    1914      !! 
    1915      !! ** Purpose : Calculates the rate at which hbl changes. 
    1916      !! 
    1917      !! ** Method  : 
    1918      !! 
    1919      !!---------------------------------------------------------------------- 
    1920  
    1921     REAL(wp), DIMENSION(jpi,jpj) :: zdhdt, zddhdt        ! Rate of change of hbl 
    1922  
    1923     INTEGER :: jj, ji 
    1924     REAL(wp) :: zgamma_b_nd, zgamma_dh_nd, zpert, zpsi 
    1925     REAL(wp) :: zvel_max!, zwb_min 
    1926     REAL(wp) :: zzeta_m = 0.3 
    1927     REAL(wp) :: zgamma_c = 2.0 
    1928     REAL(wp) :: zdhoh = 0.1 
    1929     REAL(wp) :: alpha_bc = 0.5 
    1930     REAL(wp), PARAMETER :: a_ddh = 2.5, a_ddh_2 = 3.5 ! also in pycnocline_depth 
    1931  
    1932   DO_2D( 0, 0, 0, 0 ) 
    1933  
    1934     IF ( lshear(ji,jj) ) THEN 
    1935        IF ( lconv(ji,jj) ) THEN    ! Convective 
    1936  
    1937           IF ( ln_osm_mle ) THEN 
    1938  
    1939              IF ( hmle(ji,jj) > hbl(ji,jj) ) THEN 
    1940        ! Fox-Kemper buoyancy flux average over OSBL 
    1941                 zwb_fk_b(ji,jj) = zwb_fk(ji,jj) *  & 
    1942                      (1.0 + hmle(ji,jj) / ( 6.0 * hbl(ji,jj) ) * (-1.0 + ( 1.0 - 2.0 * hbl(ji,jj) / hmle(ji,jj))**3) ) 
    1943              ELSE 
    1944                 zwb_fk_b(ji,jj) = 0.5 * zwb_fk(ji,jj) * hmle(ji,jj) / hbl(ji,jj) 
    1945              ENDIF 
    1946              zvel_max = ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
    1947              IF ( ( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) < 0.0 ) THEN 
    1948                 ! OSBL is deepening, entrainment > restratification 
    1949                 IF ( zdb_bl(ji,jj) > 0.0 .and. zdbdz_bl_ext(ji,jj) > 0.0 ) THEN 
    1950 ! *** Used for shear Needs to be changed to work stabily 
    1951 !                zgamma_b_nd = zdbdz_bl_ext * dh / zdb_ml 
    1952 !                zalpha_b = 6.7 * zgamma_b_nd / ( 1.0 + zgamma_b_nd ) 
    1953 !                zgamma_b = zgamma_b_nd / ( 0.12 * ( 1.25 + zgamma_b_nd ) ) 
    1954 !                za_1 = 1.0 / zgamma_b**2 - 0.017 
    1955 !                za_2 = 1.0 / zgamma_b**3 - 0.0025 
    1956 !                zpsi = zalpha_b * ( 1.0 + zgamma_b_nd ) * ( za_1 - 2.0 * za_2 * dh / hbl ) 
    1957                    zpsi = 0._wp 
    1958                    zdhdt(ji,jj) = -( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) / ( zvel_max + MAX(zdb_bl(ji,jj), 1.0e-15) ) 
    1959                    zdhdt(ji,jj) = zdhdt(ji,jj)! - zpsi * ( -1.0 / zhml(ji,jj) + 2.4 * zdbdz_bl_ext(ji,jj) / zdb_ml(ji,jj) ) * zwb_min(ji,jj) * zdh(ji,jj) / zdb_bl(ji,jj) 
    1960                    IF ( j_ddh(ji,jj) == 1 ) THEN 
    1961                      IF ( ( zwstrc(ji,jj) / zvstr(ji,jj) )**3 <= 0.5 ) THEN 
    1962                         zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zvstr(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    1963                      ELSE 
    1964                         zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zwstrc(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    1965                      ENDIF 
    1966 ! Relaxation to dh_ref = zari * hbl 
    1967                      zddhdt(ji,jj) = -a_ddh_2 * ( 1.0 - zdh(ji,jj) / ( zari * zhbl(ji,jj) ) ) * zwb_ent(ji,jj) / zdb_bl(ji,jj) 
    1968  
    1969                    ELSE  ! j_ddh == 0 
    1970 ! Growing shear layer 
    1971                      zddhdt(ji,jj) = -a_ddh * ( 1.0 - zdh(ji,jj) / zhbl(ji,jj) ) * zwb_ent(ji,jj) / zdb_bl(ji,jj) 
    1972                    ENDIF ! j_ddh 
    1973                      zdhdt(ji,jj) = zdhdt(ji,jj) ! + zpsi * zddhdt(ji,jj) 
    1974                 ELSE    ! zdb_bl >0 
    1975                    zdhdt(ji,jj) = -( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) /  MAX( zvel_max, 1.0e-15) 
    1976                 ENDIF 
    1977              ELSE   ! zwb_min + 2*zwb_fk_b < 0 
    1978                 ! OSBL shoaling due to restratification flux. This is the velocity defined in Fox-Kemper et al (2008) 
    1979                 zdhdt(ji,jj) = - zvel_mle(ji,jj) 
    1980  
    1981  
    1982              ENDIF 
    1983  
    1984           ELSE 
    1985              ! Fox-Kemper not used. 
    1986  
    1987                zvel_max = - ( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_Dt / hbl(ji,jj) ) * zwb_ent(ji,jj) / & 
    1988                &        MAX((zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird, epsln) 
    1989                zdhdt(ji,jj) = -zwb_ent(ji,jj) / ( zvel_max + MAX(zdb_bl(ji,jj), 1.0e-15) ) 
    1990              ! added ajgn 23 July as temporay fix 
    1991  
    1992           ENDIF  ! ln_osm_mle 
    1993  
    1994          ELSE    ! lconv - Stable 
    1995              zdhdt(ji,jj) = ( 0.06 + 0.52 * zhol(ji,jj) / 2.0 ) * zvstr(ji,jj)**3 / hbl(ji,jj) + zwbav(ji,jj) 
    1996              IF ( zdhdt(ji,jj) < 0._wp ) THEN 
    1997                 ! For long timsteps factor in brackets slows the rapid collapse of the OSBL 
    1998                  zpert = 2.0 * ( 1.0 + 0.0 * 2.0 * zvstr(ji,jj) * rn_Dt / hbl(ji,jj) ) * zvstr(ji,jj)**2 / hbl(ji,jj) 
    1999              ELSE 
    2000                  zpert = MAX( 2.0 * zvstr(ji,jj)**2 / hbl(ji,jj), zdb_bl(ji,jj) ) 
    2001              ENDIF 
    2002              zdhdt(ji,jj) = 2.0 * zdhdt(ji,jj) / MAX(zpert, epsln) 
    2003          ENDIF  ! lconv 
    2004     ELSE ! lshear 
    2005       IF ( lconv(ji,jj) ) THEN    ! Convective 
    2006  
    2007           IF ( ln_osm_mle ) THEN 
    2008  
    2009              IF ( hmle(ji,jj) > hbl(ji,jj) ) THEN 
    2010        ! Fox-Kemper buoyancy flux average over OSBL 
    2011                 zwb_fk_b(ji,jj) = zwb_fk(ji,jj) *  & 
    2012                      (1.0 + hmle(ji,jj) / ( 6.0 * hbl(ji,jj) ) * (-1.0 + ( 1.0 - 2.0 * hbl(ji,jj) / hmle(ji,jj))**3) ) 
    2013              ELSE 
    2014                 zwb_fk_b(ji,jj) = 0.5 * zwb_fk(ji,jj) * hmle(ji,jj) / hbl(ji,jj) 
    2015              ENDIF 
    2016              zvel_max = ( zwstrl(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
    2017              IF ( ( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) < 0.0 ) THEN 
    2018                 ! OSBL is deepening, entrainment > restratification 
    2019                 IF ( zdb_bl(ji,jj) > 0.0 .and. zdbdz_bl_ext(ji,jj) > 0.0 ) THEN 
    2020                    zdhdt(ji,jj) = -( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) / ( zvel_max + MAX(zdb_bl(ji,jj), 1.0e-15) ) 
    2021                 ELSE 
    2022                    zdhdt(ji,jj) = -( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) /  MAX( zvel_max, 1.0e-15) 
    2023                 ENDIF 
    2024              ELSE 
    2025                 ! OSBL shoaling due to restratification flux. This is the velocity defined in Fox-Kemper et al (2008) 
    2026                 zdhdt(ji,jj) = - zvel_mle(ji,jj) 
    2027  
    2028  
    2029              ENDIF 
    2030  
    2031           ELSE 
    2032              ! Fox-Kemper not used. 
    2033  
    2034                zvel_max = -zwb_ent(ji,jj) / & 
    2035                &        MAX((zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird, epsln) 
    2036                zdhdt(ji,jj) = -zwb_ent(ji,jj) / ( zvel_max + MAX(zdb_bl(ji,jj), 1.0e-15) ) 
    2037              ! added ajgn 23 July as temporay fix 
    2038  
    2039           ENDIF  ! ln_osm_mle 
    2040  
    2041          ELSE                        ! Stable 
    2042              zdhdt(ji,jj) = ( 0.06 + 0.52 * zhol(ji,jj) / 2.0 ) * zvstr(ji,jj)**3 / hbl(ji,jj) + zwbav(ji,jj) 
    2043              IF ( zdhdt(ji,jj) < 0._wp ) THEN 
    2044                 ! For long timsteps factor in brackets slows the rapid collapse of the OSBL 
    2045                  zpert = 2.0 * zvstr(ji,jj)**2 / hbl(ji,jj) 
    2046              ELSE 
    2047                  zpert = MAX( 2.0 * zvstr(ji,jj)**2 / hbl(ji,jj), zdb_bl(ji,jj) ) 
    2048              ENDIF 
    2049              zdhdt(ji,jj) = 2.0 * zdhdt(ji,jj) / MAX(zpert, epsln) 
    2050          ENDIF  ! lconv 
    2051       ENDIF ! lshear 
    2052   END_2D 
    2053     END SUBROUTINE zdf_osm_calculate_dhdt 
    2054  
    2055     SUBROUTINE zdf_osm_timestep_hbl( zdhdt ) 
    2056      !!--------------------------------------------------------------------- 
    2057      !!                   ***  ROUTINE zdf_osm_timestep_hbl  *** 
    2058      !! 
    2059      !! ** Purpose : Increments hbl. 
    2060      !! 
    2061      !! ** Method  : If thechange in hbl exceeds one model level the change is 
    2062      !!              is calculated by moving down the grid, changing the buoyancy 
    2063      !!              jump. This is to ensure that the change in hbl does not 
    2064      !!              overshoot a stable layer. 
    2065      !! 
    2066      !!---------------------------------------------------------------------- 
    2067  
    2068  
    2069     REAL(wp), DIMENSION(jpi,jpj) :: zdhdt   ! rates of change of hbl. 
    2070  
    2071     INTEGER :: jk, jj, ji, jm 
    2072     REAL(wp) :: zhbl_s, zvel_max, zdb 
    2073     REAL(wp) :: zthermal, zbeta 
    2074  
    2075      DO_2D( 0, 0, 0, 0 ) 
    2076         IF ( ibld(ji,jj) - imld(ji,jj) > 1 ) THEN 
    2077 ! 
    2078 ! If boundary layer changes by more than one level, need to check for stable layers between initial and final depths. 
    2079 ! 
    2080            zhbl_s = hbl(ji,jj) 
    2081            jm = imld(ji,jj) 
    2082            zthermal = rab_n(ji,jj,1,jp_tem) 
    2083            zbeta = rab_n(ji,jj,1,jp_sal) 
    2084  
    2085  
    2086            IF ( lconv(ji,jj) ) THEN 
    2087 !unstable 
    2088  
    2089               IF( ln_osm_mle ) THEN 
    2090                  zvel_max = ( zwstrl(ji,jj)**3 + zwstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
    2091               ELSE 
    2092  
    2093                  zvel_max = -( 1.0 + 1.0 * ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * rn_Dt / hbl(ji,jj) ) * zwb_ent(ji,jj) / & 
    2094                    &      ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird 
    2095  
    2096               ENDIF 
    2097  
    2098               DO jk = imld(ji,jj), ibld(ji,jj) 
    2099                  zdb = MAX( grav * ( zthermal * ( zt_bl(ji,jj) - ts(ji,jj,jm,jp_tem,Kmm) ) & 
    2100                       & - zbeta * ( zs_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ), & 
    2101                       &  0.0 ) + zvel_max 
    2102  
    2103  
    2104                  IF ( ln_osm_mle ) THEN 
    2105                     zhbl_s = zhbl_s + MIN( & 
    2106                      & rn_Dt * ( ( -zwb_ent(ji,jj) - 2.0 * zwb_fk_b(ji,jj) )/ zdb ) / FLOAT(ibld(ji,jj) - imld(ji,jj) ), & 
    2107                      & e3w(ji,jj,jm,Kmm) ) 
    2108                  ELSE 
    2109                    zhbl_s = zhbl_s + MIN( & 
    2110                      & rn_Dt * (  -zwb_ent(ji,jj) / zdb ) / FLOAT(ibld(ji,jj) - imld(ji,jj) ), & 
    2111                      & e3w(ji,jj,jm,Kmm) ) 
    2112                  ENDIF 
    2113  
    2114 !                    zhbl_s = MIN(zhbl_s,  gdepw(ji,jj, mbkt(ji,jj) + 1,Kmm) - depth_tol) 
    2115                  IF ( zhbl_s >= gdepw(ji,jj,mbkt(ji,jj) + 1,Kmm) ) THEN 
    2116                    zhbl_s = MIN(zhbl_s,  gdepw(ji,jj, mbkt(ji,jj) + 1,Kmm) - depth_tol) 
    2117                    lpyc(ji,jj) = .FALSE. 
    2118                  ENDIF 
    2119                  IF ( zhbl_s >= gdepw(ji,jj,jm+1,Kmm) ) jm = jm + 1 
    2120               END DO 
    2121               hbl(ji,jj) = zhbl_s 
    2122               ibld(ji,jj) = jm 
    2123           ELSE 
    2124 ! stable 
    2125               DO jk = imld(ji,jj), ibld(ji,jj) 
    2126                  zdb = MAX( & 
    2127                       & grav * ( zthermal * ( zt_bl(ji,jj) - ts(ji,jj,jm,jp_tem,Kmm) )& 
    2128                       &           - zbeta * ( zs_bl(ji,jj) - ts(ji,jj,jm,jp_sal,Kmm) ) ),& 
    2129                       & 0.0 ) + & 
    2130           &       2.0 * zvstr(ji,jj)**2 / zhbl_s 
    2131  
    2132                  ! Alan is thuis right? I have simply changed hbli to hbl 
    2133                  zhol(ji,jj) = -zhbl_s / ( ( zvstr(ji,jj)**3 + epsln )/ zwbav(ji,jj) ) 
    2134                  zdhdt(ji,jj) = -( zwbav(ji,jj) - 0.04 / 2.0 * zwstrl(ji,jj)**3 / zhbl_s - 0.15 / 2.0 * ( 1.0 - EXP( -1.5 * zla(ji,jj) ) ) * & 
    2135             &                  zustar(ji,jj)**3 / zhbl_s ) * ( 0.725 + 0.225 * EXP( -7.5 * zhol(ji,jj) ) ) 
    2136                  zdhdt(ji,jj) = zdhdt(ji,jj) + zwbav(ji,jj) 
    2137                  zhbl_s = zhbl_s + MIN( zdhdt(ji,jj) / zdb * rn_Dt / FLOAT( ibld(ji,jj) - imld(ji,jj) ), e3w(ji,jj,jm,Kmm) ) 
    2138  
    2139 !                    zhbl_s = MIN(zhbl_s, gdepw(ji,jj, mbkt(ji,jj) + 1,Kmm) - depth_tol) 
    2140                  IF ( zhbl_s >= mbkt(ji,jj) + 1 ) THEN 
    2141                    zhbl_s = MIN(zhbl_s,  gdepw(ji,jj, mbkt(ji,jj) + 1,Kmm) - depth_tol) 
    2142                    lpyc(ji,jj) = .FALSE. 
    2143                  ENDIF 
    2144                  IF ( zhbl_s >= gdepw(ji,jj,jm,Kmm) ) jm = jm + 1 
    2145               END DO 
    2146           ENDIF   ! IF ( lconv ) 
    2147           hbl(ji,jj) = MAX(zhbl_s, gdepw(ji,jj,4,Kmm) ) 
    2148           ibld(ji,jj) = MAX(jm, 4 ) 
    2149         ELSE 
    2150 ! change zero or one model level. 
    2151           hbl(ji,jj) = MAX(zhbl_t(ji,jj), gdepw(ji,jj,4,Kmm) ) 
    2152         ENDIF 
    2153         zhbl(ji,jj) = gdepw(ji,jj,ibld(ji,jj),Kmm) 
    2154      END_2D 
    2155  
    2156     END SUBROUTINE zdf_osm_timestep_hbl 
    2157  
    2158     SUBROUTINE zdf_osm_pycnocline_thickness( dh, zdh ) 
    2159       !!--------------------------------------------------------------------- 
    2160       !!                   ***  ROUTINE zdf_osm_pycnocline_thickness  *** 
     1690      !!            ***  ROUTINE zdf_osm_pycnocline_thickness  *** 
    21611691      !! 
    21621692      !! ** Purpose : Calculates thickness of the pycnocline 
     
    21691699      !! 
    21701700      !!---------------------------------------------------------------------- 
    2171  
    2172       REAL(wp), DIMENSION(jpi,jpj) :: dh, zdh     ! pycnocline thickness. 
    2173        ! 
    2174       INTEGER :: jj, ji 
    2175       INTEGER :: inhml 
    2176       REAL(wp) :: zari, ztau, zdh_ref 
    2177       REAL(wp), PARAMETER :: a_ddh_2 = 3.5 ! also in pycnocline_depth 
    2178  
    2179     DO_2D( 0, 0, 0, 0 ) 
    2180  
    2181       IF ( lshear(ji,jj) ) THEN 
    2182          IF ( lconv(ji,jj) ) THEN 
    2183            IF ( j_ddh(ji,jj) == 0 ) THEN 
    2184 ! ddhdt for pycnocline determined in osm_calculate_dhdt 
    2185              dh(ji,jj) = dh(ji,jj) + zddhdt(ji,jj) * rn_Dt 
    2186            ELSE 
    2187 ! Temporary (probably) Recalculate dh_ref to ensure dh doesn't go negative. Can't do this using zddhdt from calculate_dhdt 
    2188              IF ( ( zwstrc(ji,jj) / zvstr(ji,jj) )**3 <= 0.5 ) THEN 
    2189                zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zvstr(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    2190              ELSE 
    2191                zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zwstrc(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    2192              ENDIF 
    2193              ztau = MAX( zdb_bl(ji,jj) * ( zari * hbl(ji,jj) ) / ( a_ddh_2 * MAX(-zwb_ent(ji,jj), 1.e-12) ), 2.0 * rn_Dt ) 
    2194              dh(ji,jj) = dh(ji,jj) * EXP( -rn_Dt / ztau ) + zari * zhbl(ji,jj) * ( 1.0 - EXP( -rn_Dt / ztau ) ) 
    2195              IF ( dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zari * zhbl(ji,jj) 
    2196            ENDIF 
    2197  
    2198          ELSE ! lconv 
    2199 ! Initially shear only for entraining OSBL. Stable code will be needed if extended to stable OSBL 
    2200  
    2201             ztau = hbl(ji,jj) / MAX(zvstr(ji,jj), epsln) 
    2202             IF ( zdhdt(ji,jj) >= 0.0 ) THEN    ! probably shouldn't include wm here 
    2203                ! boundary layer deepening 
    2204                IF ( zdb_bl(ji,jj) > 0._wp ) THEN 
    2205                   ! pycnocline thickness set by stratification - use same relationship as for neutral conditions. 
    2206                   zari = MIN( 4.5 * ( zvstr(ji,jj)**2 ) & 
    2207                        & /  MAX(zdb_bl(ji,jj) * zhbl(ji,jj), epsln ) + 0.01  , 0.2 ) 
    2208                   zdh_ref = MIN( zari, 0.2 ) * hbl(ji,jj) 
     1701      INTEGER,                            INTENT(in   ) ::   Kmm            ! Ocean time-level index 
     1702      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdh            ! Pycnocline thickness 
     1703      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   phml           ! ML depth 
     1704      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdhdt          ! BL depth tendency 
     1705      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl           ! BL depth 
     1706      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux 
     1707      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients 
     1708      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_fk_b       ! MLE buoyancy flux averaged over OSBL 
     1709      !! 
     1710      INTEGER  ::   jj, ji 
     1711      INTEGER  ::   inhml 
     1712      REAL(wp) ::   zari, ztau, zdh_ref, zddhdt, zvel_max 
     1713      REAL(wp) ::   ztmp   ! Auxiliary variable 
     1714      !! 
     1715      REAL, PARAMETER ::   pp_ddh = 2.5_wp, pp_ddh_2 = 3.5_wp   ! Also in pycnocline_depth 
     1716      !!---------------------------------------------------------------------- 
     1717      ! 
     1718      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1719         ! 
     1720         IF ( l_shear(ji,jj) ) THEN 
     1721            ! 
     1722            IF ( l_conv(ji,jj) ) THEN 
     1723               ! 
     1724               IF ( av_db_bl(ji,jj) > 1e-15_wp ) THEN 
     1725                  IF ( n_ddh(ji,jj) == 0 ) THEN 
     1726                     zvel_max = ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**p2third / hbl(ji,jj) 
     1727                     ! ddhdt for pycnocline determined in osm_calculate_dhdt 
     1728                     zddhdt = -1.0_wp * pp_ddh * ( 1.0_wp - 1.6_wp * pdh(ji,jj) / phbl(ji,jj) ) * pwb_ent(ji,jj) /   & 
     1729                        &     ( zvel_max + MAX( av_db_bl(ji,jj), 1e-15 ) ) 
     1730                     zddhdt = EXP( -4.0_wp * ABS( ff_t(ji,jj) ) * phbl(ji,jj) / MAX( sustar(ji,jj), 1e-8 ) ) * zddhdt 
     1731                     ! Maximum limit for how thick the shear layer can grow relative to the thickness of the boundary layer 
     1732                     dh(ji,jj) = MIN( dh(ji,jj) + zddhdt * rn_Dt, 0.625_wp * hbl(ji,jj) ) 
     1733                  ELSE   ! Need to recalculate because hbl has been updated 
     1734                     IF ( ( swstrc(ji,jj) / svstr(ji,jj) )**3 <= 0.5_wp ) THEN 
     1735                        ztmp = svstr(ji,jj) 
     1736                     ELSE 
     1737                        ztmp = swstrc(ji,jj) 
     1738                     END IF 
     1739                     zari = MIN( 1.5_wp * av_db_bl(ji,jj) / ( phbl(ji,jj) * ( MAX( pdbdz_bl_ext(ji,jj), 0.0_wp ) +        & 
     1740                        &                                                   av_db_bl(ji,jj)**2 / MAX( 4.5_wp * ztmp**2,   & 
     1741                        &                                                                           1e-12_wp ) ) ), 0.2_wp ) 
     1742                     ztau = MAX( av_db_bl(ji,jj) * ( zari * hbl(ji,jj) ) /   & 
     1743                        &        ( pp_ddh_2 * MAX( -1.0_wp * pwb_ent(ji,jj), 1e-12_wp ) ), 2.0_wp * rn_Dt ) 
     1744                     dh(ji,jj) = dh(ji,jj) * EXP( -1.0_wp * rn_Dt / ztau ) +   & 
     1745                        &        zari * phbl(ji,jj) * ( 1.0_wp - EXP( -1.0_wp * rn_Dt / ztau ) ) 
     1746                     IF ( dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zari * phbl(ji,jj) 
     1747                  END IF 
    22091748               ELSE 
    2210                   zdh_ref = 0.2 * hbl(ji,jj) 
     1749                  ztau = MAX( MAX( hbl(ji,jj) / ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird, epsln), 2.0_wp * rn_Dt ) 
     1750                  dh(ji,jj) = dh(ji,jj) * EXP( -1.0_wp * rn_Dt / ztau ) +   & 
     1751                     &        0.2_wp * phbl(ji,jj) * ( 1.0_wp - EXP( -1.0_wp * rn_Dt / ztau ) ) 
     1752                  IF ( dh(ji,jj) > hbl(ji,jj) ) dh(ji,jj) = 0.2_wp * hbl(ji,jj) 
     1753               END IF 
     1754               ! 
     1755            ELSE   ! l_conv 
     1756               ! Initially shear only for entraining OSBL. Stable code will be needed if extended to stable OSBL 
     1757               ztau = hbl(ji,jj) / MAX(svstr(ji,jj), epsln) 
     1758               IF ( pdhdt(ji,jj) >= 0.0_wp ) THEN   ! Probably shouldn't include wm here 
     1759                  ! Boundary layer deepening 
     1760                  IF ( av_db_bl(ji,jj) > 0.0_wp ) THEN 
     1761                     ! Pycnocline thickness set by stratification - use same relationship as for neutral conditions 
     1762                     zari    = MIN( 4.5_wp * ( svstr(ji,jj)**2 ) / MAX( av_db_bl(ji,jj) * phbl(ji,jj), epsln ) + 0.01_wp, 0.2_wp ) 
     1763                     zdh_ref = MIN( zari, 0.2_wp ) * hbl(ji,jj) 
     1764                  ELSE 
     1765                     zdh_ref = 0.2_wp * hbl(ji,jj) 
     1766                  ENDIF 
     1767               ELSE   ! IF(dhdt < 0) 
     1768                  zdh_ref = 0.2_wp * hbl(ji,jj) 
     1769               ENDIF   ! IF (dhdt >= 0) 
     1770               dh(ji,jj) = dh(ji,jj) * EXP( -1.0_wp * rn_Dt / ztau ) + zdh_ref * ( 1.0_wp - EXP( -1.0_wp * rn_Dt / ztau ) ) 
     1771               IF ( pdhdt(ji,jj) < 0.0_wp .AND. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref   ! Can be a problem with dh>hbl for 
     1772               !                                                                                !    rapid collapse 
     1773            ENDIF 
     1774            ! 
     1775         ELSE   ! l_shear = .FALSE., calculate ddhdt here 
     1776            ! 
     1777            IF ( l_conv(ji,jj) ) THEN 
     1778               ! 
     1779               IF( ln_osm_mle ) THEN 
     1780                  IF ( ( pwb_ent(ji,jj) + 2.0_wp * pwb_fk_b(ji,jj) ) < 0.0_wp ) THEN   ! OSBL is deepening. Note wb_fk_b is zero if 
     1781                     !                                                                 !    ln_osm_mle=F 
     1782                     IF ( av_db_bl(ji,jj) > 0.0_wp .AND. pdbdz_bl_ext(ji,jj) > 0.0_wp ) THEN 
     1783                        IF ( ( swstrc(ji,jj) / MAX( svstr(ji,jj), epsln) )**3 <= 0.5_wp ) THEN   ! Near neutral stability 
     1784                           ztmp = svstr(ji,jj) 
     1785                        ELSE   ! Unstable 
     1786                           ztmp = swstrc(ji,jj) 
     1787                        END IF 
     1788                        zari = MIN( 1.5_wp * av_db_bl(ji,jj) /                               & 
     1789                           &        ( phbl(ji,jj) * ( MAX( pdbdz_bl_ext(ji,jj), 0.0_wp ) +   & 
     1790                           &                          av_db_bl(ji,jj)**2 / MAX( 4.5_wp * ztmp**2 , 1e-12_wp ) ) ), 0.2_wp ) 
     1791                     ELSE 
     1792                        zari = 0.2_wp 
     1793                     END IF 
     1794                  ELSE 
     1795                     zari = 0.2_wp 
     1796                  END IF 
     1797                  ztau    = 0.2_wp * hbl(ji,jj) / MAX( epsln, ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird ) 
     1798                  zdh_ref = zari * hbl(ji,jj) 
     1799               ELSE   ! ln_osm_mle 
     1800                  IF ( av_db_bl(ji,jj) > 0.0_wp .AND. pdbdz_bl_ext(ji,jj) > 0.0_wp ) THEN 
     1801                     IF ( ( swstrc(ji,jj) / MAX( svstr(ji,jj), epsln ) )**3 <= 0.5_wp ) THEN   ! Near neutral stability 
     1802                        ztmp = svstr(ji,jj) 
     1803                     ELSE   ! Unstable 
     1804                        ztmp = swstrc(ji,jj) 
     1805                     END IF 
     1806                     zari    = MIN( 1.5_wp * av_db_bl(ji,jj) /                               & 
     1807                        &           ( phbl(ji,jj) * ( MAX( pdbdz_bl_ext(ji,jj), 0.0_wp ) +   & 
     1808                        &                             av_db_bl(ji,jj)**2 / MAX( 4.5_wp * ztmp**2 , 1e-12_wp ) ) ), 0.2_wp ) 
     1809                  ELSE 
     1810                     zari    = 0.2_wp 
     1811                  END IF 
     1812                  ztau    = hbl(ji,jj) / MAX( epsln, ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird ) 
     1813                  zdh_ref = zari * hbl(ji,jj) 
     1814               END IF   ! ln_osm_mle 
     1815               dh(ji,jj) = dh(ji,jj) * EXP( -1.0_wp * rn_Dt / ztau ) + zdh_ref * ( 1.0_wp - EXP( -1.0_wp * rn_Dt / ztau ) ) 
     1816               !               IF ( pdhdt(ji,jj) < 0._wp .and. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref 
     1817               IF ( dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref 
     1818               ! Alan: this hml is never defined or used 
     1819            ELSE   ! IF (l_conv) 
     1820               ! 
     1821               ztau = hbl(ji,jj) / MAX( svstr(ji,jj), epsln ) 
     1822               IF ( pdhdt(ji,jj) >= 0.0_wp ) THEN   ! Probably shouldn't include wm here 
     1823                  ! Boundary layer deepening 
     1824                  IF ( av_db_bl(ji,jj) > 0.0_wp ) THEN 
     1825                     ! Pycnocline thickness set by stratification - use same relationship as for neutral conditions. 
     1826                     zari    = MIN( 4.5_wp * ( svstr(ji,jj)**2 ) / MAX( av_db_bl(ji,jj) * phbl(ji,jj), epsln ) + 0.01_wp , 0.2_wp ) 
     1827                     zdh_ref = MIN( zari, 0.2_wp ) * hbl(ji,jj) 
     1828                  ELSE 
     1829                     zdh_ref = 0.2_wp * hbl(ji,jj) 
     1830                  END IF 
     1831               ELSE   ! IF(dhdt < 0) 
     1832                  zdh_ref = 0.2_wp * hbl(ji,jj) 
     1833               END IF   ! IF (dhdt >= 0) 
     1834               dh(ji,jj) = dh(ji,jj) * EXP( -1.0_wp * rn_Dt / ztau ) + zdh_ref * ( 1.0_wp - EXP( -1.0_wp * rn_Dt / ztau ) ) 
     1835               IF ( pdhdt(ji,jj) < 0.0_wp .AND. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref   ! Can be a problem with dh>hbl for 
     1836               !                                                                                !    rapid collapse 
     1837            END IF   ! IF (l_conv) 
     1838            ! 
     1839         END IF   ! l_shear 
     1840         ! 
     1841         hml(ji,jj)  = hbl(ji,jj) - dh(ji,jj) 
     1842         inhml       = MAX( INT( dh(ji,jj) / MAX( e3t(ji,jj,nbld(ji,jj)-1,Kmm), 1e-3_wp ) ), 1 ) 
     1843         nmld(ji,jj) = MAX( nbld(ji,jj) - inhml, 3 ) 
     1844         phml(ji,jj) = gdepw(ji,jj,nmld(ji,jj),Kmm) 
     1845         pdh(ji,jj)  = phbl(ji,jj) - phml(ji,jj) 
     1846         ! 
     1847      END_2D 
     1848      ! 
     1849   END SUBROUTINE zdf_osm_pycnocline_thickness 
     1850 
     1851   SUBROUTINE zdf_osm_pycnocline_buoyancy_profiles( Kmm, kp_ext, pdbdz, palpha, pdh,   & 
     1852      &                                             phbl, pdbdz_bl_ext, phml, pdhdt ) 
     1853      !!--------------------------------------------------------------------- 
     1854      !!       ***  ROUTINE zdf_osm_pycnocline_buoyancy_profiles  *** 
     1855      !! 
     1856      !! ** Purpose : calculate pycnocline buoyancy profiles 
     1857      !! 
     1858      !! ** Method  :  
     1859      !! 
     1860      !!---------------------------------------------------------------------- 
     1861      INTEGER,                                 INTENT(in   ) ::   Kmm            ! Ocean time-level index 
     1862      INTEGER,  DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   kp_ext         ! External-level offsets 
     1863      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(  out) ::   pdbdz          ! Gradients in the pycnocline 
     1864      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(  out) ::   palpha 
     1865      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline thickness 
     1866      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth 
     1867      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients 
     1868      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth 
     1869      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! Rates of change of hbl 
     1870      !! 
     1871      INTEGER  ::   jk, jj, ji 
     1872      REAL(wp) ::   zbgrad 
     1873      REAL(wp) ::   zgamma_b_nd, znd 
     1874      REAL(wp) ::   zzeta_m 
     1875      REAL(wp) ::   ztmp   ! Auxiliary variable 
     1876      !! 
     1877      REAL(wp), PARAMETER ::   pp_gamma_b = 2.25_wp 
     1878      REAL(wp), PARAMETER ::   pp_large   = -1e10_wp 
     1879      !!---------------------------------------------------------------------- 
     1880      ! 
     1881      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )       
     1882         pdbdz(ji,jj,:) = pp_large 
     1883         palpha(ji,jj)  = pp_large 
     1884      END_2D 
     1885      ! 
     1886      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     1887         ! 
     1888         IF ( nbld(ji,jj) + kp_ext(ji,jj) < mbkt(ji,jj) ) THEN 
     1889            ! 
     1890            IF ( l_conv(ji,jj) ) THEN   ! Convective conditions 
     1891               ! 
     1892               IF ( l_pyc(ji,jj) ) THEN 
     1893                  ! 
     1894                  zzeta_m = 0.1_wp + 0.3_wp / ( 1.0_wp + EXP( -3.5_wp * LOG10( -1.0_wp * shol(ji,jj) ) ) ) 
     1895                  palpha(ji,jj) = 2.0_wp * ( 1.0_wp - ( 0.80_wp * zzeta_m + 0.5_wp * SQRT( 3.14159_wp / pp_gamma_b ) ) *   & 
     1896                     &                                pdbdz_bl_ext(ji,jj) * pdh(ji,jj) / av_db_ml(ji,jj) ) /                & 
     1897                     &            ( 0.723_wp + SQRT( 3.14159_wp / pp_gamma_b ) ) 
     1898                  palpha(ji,jj) = MAX( palpha(ji,jj), 0.0_wp ) 
     1899                  ztmp = 1.0_wp / MAX( pdh(ji,jj), epsln ) 
     1900                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     1901                  ! Commented lines in this section are not needed in new code, once tested ! 
     1902                  ! can be removed                                                          ! 
     1903                  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     1904                  ! ztgrad = zalpha * av_dt_ml(ji,jj) * ztmp + zdtdz_bl_ext(ji,jj) 
     1905                  ! zsgrad = zalpha * av_ds_ml(ji,jj) * ztmp + zdsdz_bl_ext(ji,jj) 
     1906                  zbgrad = palpha(ji,jj) * av_db_ml(ji,jj) * ztmp + pdbdz_bl_ext(ji,jj) 
     1907                  zgamma_b_nd = pdbdz_bl_ext(ji,jj) * pdh(ji,jj) / MAX( av_db_ml(ji,jj), epsln ) 
     1908                  DO jk = 2, nbld(ji,jj) 
     1909                     znd = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) * ztmp 
     1910                     IF ( znd <= zzeta_m ) THEN 
     1911                        ! zdtdz(ji,jj,jk) = zdtdz_bl_ext(ji,jj) + zalpha * av_dt_ml(ji,jj) * ztmp * & 
     1912                        ! &        EXP( -6.0 * ( znd -zzeta_m )**2 ) 
     1913                        ! zdsdz(ji,jj,jk) = zdsdz_bl_ext(ji,jj) + zalpha * av_ds_ml(ji,jj) * ztmp * & 
     1914                        ! & EXP( -6.0 * ( znd -zzeta_m )**2 ) 
     1915                        pdbdz(ji,jj,jk) = pdbdz_bl_ext(ji,jj) + palpha(ji,jj) * av_db_ml(ji,jj) * ztmp * & 
     1916                           & EXP( -6.0_wp * ( znd -zzeta_m )**2 ) 
     1917                     ELSE 
     1918                        ! zdtdz(ji,jj,jk) =  ztgrad * EXP( -pp_gamma_b * ( znd - zzeta_m )**2 ) 
     1919                        ! zdsdz(ji,jj,jk) =  zsgrad * EXP( -pp_gamma_b * ( znd - zzeta_m )**2 ) 
     1920                        pdbdz(ji,jj,jk) =  zbgrad * EXP( -1.0_wp * pp_gamma_b * ( znd - zzeta_m )**2 ) 
     1921                     END IF 
     1922                  END DO 
     1923               END IF   ! If no pycnocline pycnocline gradients set to zero 
     1924               ! 
     1925            ELSE   ! Stable conditions 
     1926               ! If pycnocline profile only defined when depth steady of increasing. 
     1927               IF ( pdhdt(ji,jj) > 0.0_wp ) THEN   ! Depth increasing, or steady. 
     1928                  IF ( av_db_bl(ji,jj) > 0.0_wp ) THEN 
     1929                     IF ( shol(ji,jj) >= 0.5_wp ) THEN   ! Very stable - 'thick' pycnocline 
     1930                        ztmp = 1.0_wp / MAX( phbl(ji,jj), epsln ) 
     1931                        zbgrad = av_db_bl(ji,jj) * ztmp 
     1932                        DO jk = 2, nbld(ji,jj) 
     1933                           znd = gdepw(ji,jj,jk,Kmm) * ztmp 
     1934                           pdbdz(ji,jj,jk) = zbgrad * EXP( -15.0_wp * ( znd - 0.9_wp )**2 ) 
     1935                        END DO 
     1936                     ELSE   ! Slightly stable - 'thin' pycnoline - needed when stable layer begins to form. 
     1937                        ztmp = 1.0_wp / MAX( pdh(ji,jj), epsln ) 
     1938                        zbgrad = av_db_bl(ji,jj) * ztmp 
     1939                        DO jk = 2, nbld(ji,jj) 
     1940                           znd = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phml(ji,jj) ) * ztmp 
     1941                           pdbdz(ji,jj,jk) = zbgrad * EXP( -1.75_wp * ( znd + 0.75_wp )**2 ) 
     1942                        END DO 
     1943                     END IF   ! IF (shol >=0.5) 
     1944                  END IF      ! IF (av_db_bl> 0.) 
     1945               END IF         ! IF (pdhdt >= 0) pdhdt < 0 not considered since pycnocline profile is zero and profile arrays are 
     1946               !              !    intialized to zero 
     1947               ! 
     1948            END IF            ! IF (l_conv) 
     1949            ! 
     1950         END IF   ! IF ( nbld(ji,jj) < mbkt(ji,jj) ) 
     1951         ! 
     1952      END_2D 
     1953      ! 
     1954      IF ( ln_dia_pyc_scl ) THEN   ! Output of pycnocline gradient profiles 
     1955         CALL zdf_osm_iomput( "zdbdz_pyc", wmask(A2D(0),:) * pdbdz(A2D(0),:) ) 
     1956      END IF 
     1957      ! 
     1958   END SUBROUTINE zdf_osm_pycnocline_buoyancy_profiles 
     1959 
     1960   SUBROUTINE zdf_osm_diffusivity_viscosity( Kbb, Kmm, pdiffut, pviscos, phbl,   & 
     1961      &                                      phml, pdh, pdhdt, pshear,           & 
     1962      &                                      pwb_ent, pwb_min ) 
     1963      !!--------------------------------------------------------------------- 
     1964      !!           ***  ROUTINE zdf_osm_diffusivity_viscosity  *** 
     1965      !! 
     1966      !! ** Purpose : Determines the eddy diffusivity and eddy viscosity 
     1967      !!              profiles in the mixed layer and the pycnocline. 
     1968      !! 
     1969      !! ** Method  : 
     1970      !! 
     1971      !!---------------------------------------------------------------------- 
     1972      INTEGER,                                 INTENT(in   ) ::   Kbb, Kmm       ! Ocean time-level indices 
     1973      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(inout) ::   pdiffut        ! t-diffusivity 
     1974      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(inout) ::   pviscos        ! Viscosity 
     1975      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth 
     1976      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth 
     1977      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline depth 
     1978      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! BL depth tendency 
     1979      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pshear         ! Shear production 
     1980      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux 
     1981      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pwb_min 
     1982      !! 
     1983      INTEGER ::   ji, jj, jk   ! Loop indices 
     1984      !! Scales used to calculate eddy diffusivity and viscosity profiles 
     1985      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdifml_sc,    zvisml_sc 
     1986      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zdifpyc_n_sc, zdifpyc_s_sc 
     1987      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zvispyc_n_sc, zvispyc_s_sc 
     1988      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zbeta_d_sc,   zbeta_v_sc 
     1989      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zb_coup,      zc_coup_vis,  zc_coup_dif 
     1990      !! 
     1991      REAL(wp) ::   zvel_sc_pyc, zvel_sc_ml, zstab_fac, zz_b 
     1992      REAL(wp) ::   za_cubic, zb_d_cubic, zc_d_cubic, zd_d_cubic,   &   ! Coefficients in cubic polynomial specifying diffusivity 
     1993         &                    zb_v_cubic, zc_v_cubic, zd_v_cubic        ! and viscosity in pycnocline 
     1994      REAL(wp) ::   zznd_ml, zznd_pyc, ztmp 
     1995      REAL(wp) ::   zmsku, zmskv 
     1996      !! 
     1997      REAL(wp), PARAMETER ::   pp_dif_ml     = 0.8_wp,  pp_vis_ml  = 0.375_wp 
     1998      REAL(wp), PARAMETER ::   pp_dif_pyc    = 0.15_wp, pp_vis_pyc = 0.142_wp 
     1999      REAL(wp), PARAMETER ::   pp_vispyc_shr = 0.15_wp 
     2000      !!---------------------------------------------------------------------- 
     2001      ! 
     2002      zb_coup(:,:) = 0.0_wp 
     2003      ! 
     2004      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2005         IF ( l_conv(ji,jj) ) THEN 
     2006            ! 
     2007            zvel_sc_pyc = ( 0.15_wp * svstr(ji,jj)**3 + swstrc(ji,jj)**3 + 4.25_wp * pshear(ji,jj) * phbl(ji,jj) )**pthird 
     2008            zvel_sc_ml  = ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird 
     2009            zstab_fac   = ( phml(ji,jj) / zvel_sc_ml *   & 
     2010               &            ( 1.4_wp - 0.4_wp / ( 1.0_wp + EXP(-3.5_wp * LOG10( -1.0_wp * shol(ji,jj) ) ) )**1.25_wp ) )**2 
     2011            ! 
     2012            zdifml_sc(ji,jj) = pp_dif_ml * phml(ji,jj) * zvel_sc_ml 
     2013            zvisml_sc(ji,jj) = pp_vis_ml * zdifml_sc(ji,jj) 
     2014            ! 
     2015            IF ( l_pyc(ji,jj) ) THEN 
     2016               zdifpyc_n_sc(ji,jj) = pp_dif_pyc * zvel_sc_ml * pdh(ji,jj) 
     2017               zvispyc_n_sc(ji,jj) = 0.09_wp * zvel_sc_pyc * ( 1.0_wp - phbl(ji,jj) / pdh(ji,jj) )**2 *   & 
     2018                  &                  ( 0.005_wp  * ( av_u_ml(ji,jj) - av_u_bl(ji,jj) )**2 +     & 
     2019                  &                    0.0075_wp * ( av_v_ml(ji,jj) - av_v_bl(ji,jj) )**2 ) /   & 
     2020                  &                  pdh(ji,jj) 
     2021               zvispyc_n_sc(ji,jj) = pp_vis_pyc * zvel_sc_ml * pdh(ji,jj) + zvispyc_n_sc(ji,jj) * zstab_fac 
     2022               ! 
     2023               IF ( l_shear(ji,jj) .AND. n_ddh(ji,jj) /= 2 ) THEN 
     2024                  ztmp = pp_vispyc_shr * ( pshear(ji,jj) * phbl(ji,jj) )**pthird * phbl(ji,jj) 
     2025                  zdifpyc_n_sc(ji,jj) = zdifpyc_n_sc(ji,jj) + ztmp 
     2026                  zvispyc_n_sc(ji,jj) = zvispyc_n_sc(ji,jj) + ztmp 
    22112027               ENDIF 
    2212             ELSE     ! IF(dhdt < 0) 
    2213                zdh_ref = 0.2 * hbl(ji,jj) 
    2214             ENDIF    ! IF (dhdt >= 0) 
    2215             dh(ji,jj) = dh(ji,jj) * EXP( -rn_Dt / ztau )+ zdh_ref * ( 1.0 - EXP( -rn_Dt / ztau ) ) 
    2216             IF ( zdhdt(ji,jj) < 0._wp .and. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref       ! can be a problem with dh>hbl for rapid collapse 
    2217             ! Alan: this hml is never defined or used -- do we need it? 
     2028               ! 
     2029               zdifpyc_s_sc(ji,jj) = pwb_ent(ji,jj) + 0.0025_wp * zvel_sc_pyc * ( phbl(ji,jj) / pdh(ji,jj) - 1.0_wp ) *   & 
     2030                  &                                   ( av_b_ml(ji,jj) - av_b_bl(ji,jj) ) 
     2031               zvispyc_s_sc(ji,jj) = 0.09_wp * ( pwb_min(ji,jj) + 0.0025_wp * zvel_sc_pyc *                 & 
     2032                  &                                               ( phbl(ji,jj) / pdh(ji,jj) - 1.0_wp ) *   & 
     2033                  &                                               ( av_b_ml(ji,jj) - av_b_bl(ji,jj) ) ) 
     2034               zdifpyc_s_sc(ji,jj) = 0.09_wp * zdifpyc_s_sc(ji,jj) * zstab_fac 
     2035               zvispyc_s_sc(ji,jj) = zvispyc_s_sc(ji,jj) * zstab_fac 
     2036               ! 
     2037               zdifpyc_s_sc(ji,jj) = MAX( zdifpyc_s_sc(ji,jj), -0.5_wp * zdifpyc_n_sc(ji,jj) ) 
     2038               zvispyc_s_sc(ji,jj) = MAX( zvispyc_s_sc(ji,jj), -0.5_wp * zvispyc_n_sc(ji,jj) ) 
     2039                
     2040               zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zdifpyc_n_sc(ji,jj) + 1.4_wp * zdifpyc_s_sc(ji,jj) ) /   & 
     2041                  &                           ( zdifml_sc(ji,jj) + epsln ) )**p2third 
     2042               zbeta_v_sc(ji,jj) = 1.0_wp - 2.0_wp * ( zvispyc_n_sc(ji,jj) + zvispyc_s_sc(ji,jj) ) / ( zvisml_sc(ji,jj) + epsln ) 
     2043            ELSE 
     2044               zdifpyc_n_sc(ji,jj) = pp_dif_pyc * zvel_sc_ml * pdh(ji,jj)   ! ag 19/03 
     2045               zdifpyc_s_sc(ji,jj) = 0.0_wp   ! ag 19/03 
     2046               zvispyc_n_sc(ji,jj) = pp_vis_pyc * zvel_sc_ml * pdh(ji,jj)   ! ag 19/03 
     2047               zvispyc_s_sc(ji,jj) = 0.0_wp   ! ag 19/03 
     2048               IF(l_coup(ji,jj) ) THEN   ! ag 19/03 
     2049                  ! code from SUBROUTINE tke_tke zdftke.F90; uses bottom drag velocity rCdU_bot(ji,jj) = -Cd|ub| 
     2050                  !     already calculated at T-points in SUBROUTINE zdf_drg from zdfdrg.F90 
     2051                  !  Gives friction velocity sqrt bottom drag/rho_0 i.e. u* = SQRT(rCdU_bot*ub) 
     2052                  ! wet-cell averaging .. 
     2053                  zmsku = 0.5_wp * ( 2.0_wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     2054                  zmskv = 0.5_wp * ( 2.0_wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     2055                  zb_coup(ji,jj) = 0.4_wp * SQRT(-1.0_wp * rCdU_bot(ji,jj) *   & 
     2056                     &             SQRT(  ( zmsku*( uu(ji,jj,mbkt(ji,jj),Kbb)+uu(ji-1,jj,mbkt(ji,jj),Kbb) ) )**2   & 
     2057                     &                  + ( zmskv*( vv(ji,jj,mbkt(ji,jj),Kbb)+vv(ji,jj-1,mbkt(ji,jj),Kbb) ) )**2  ) ) 
     2058                   
     2059                  zz_b = -1.0_wp * gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)   ! ag 19/03 
     2060                  zc_coup_vis(ji,jj) = -0.5_wp * ( 0.5_wp * zvisml_sc(ji,jj) / phml(ji,jj) - zb_coup(ji,jj) ) /   & 
     2061                     &                 ( phml(ji,jj) + zz_b )   ! ag 19/03 
     2062                  zz_b = -1.0_wp * phml(ji,jj) + gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)   ! ag 19/03 
     2063                  zbeta_v_sc(ji,jj) = 1.0_wp - 2.0_wp * ( zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2 ) /   & 
     2064                     &                                  zvisml_sc(ji,jj)   ! ag 19/03 
     2065                  zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2 ) /   & 
     2066                     &                           zdifml_sc(ji,jj) )**p2third 
     2067                  zc_coup_dif(ji,jj) = 0.5_wp * ( -zdifml_sc(ji,jj) / phml(ji,jj) * ( 1.0_wp - zbeta_d_sc(ji,jj) )**1.5_wp +   & 
     2068                     &                 1.5_wp * ( zdifml_sc(ji,jj) / phml(ji,jj) ) * zbeta_d_sc(ji,jj) *   & 
     2069                     &                          SQRT( 1.0_wp - zbeta_d_sc(ji,jj) ) - zb_coup(ji,jj) ) / zz_b   ! ag 19/03 
     2070               ELSE   ! ag 19/03 
     2071                  zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zdifpyc_n_sc(ji,jj) + 1.4_wp * zdifpyc_s_sc(ji,jj) ) /   & 
     2072                     &                           ( zdifml_sc(ji,jj) + epsln ) )**p2third   ! ag 19/03 
     2073                  zbeta_v_sc(ji,jj) = 1.0_wp - 2.0_wp * ( zvispyc_n_sc(ji,jj) + zvispyc_s_sc(ji,jj) ) /   & 
     2074                     &                         ( zvisml_sc(ji,jj) + epsln )   ! ag 19/03 
     2075               ENDIF   ! ag 19/03 
     2076            ENDIF      ! ag 19/03 
     2077         ELSE 
     2078            zdifml_sc(ji,jj) = svstr(ji,jj) * phbl(ji,jj) * MAX( EXP ( -1.0_wp * ( shol(ji,jj) / 0.6_wp )**2 ), 0.2_wp) 
     2079            zvisml_sc(ji,jj) = zdifml_sc(ji,jj) 
     2080         END IF 
     2081      END_2D 
     2082      ! 
     2083      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2084         IF ( l_conv(ji,jj) ) THEN 
     2085            DO jk = 2, nmld(ji,jj)   ! Mixed layer diffusivity 
     2086               zznd_ml = gdepw(ji,jj,jk,Kmm) / phml(ji,jj) 
     2087               pdiffut(ji,jj,jk) = zdifml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zbeta_d_sc(ji,jj) * zznd_ml )**1.5 
     2088               pviscos(ji,jj,jk) = zvisml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zbeta_v_sc(ji,jj) * zznd_ml ) *   & 
     2089                  &                ( 1.0_wp - 0.5_wp * zznd_ml**2 ) 
     2090            END DO 
     2091            ! 
     2092            ! Coupling to bottom 
     2093            ! 
     2094            IF ( l_coup(ji,jj) ) THEN                                                         ! ag 19/03 
     2095               DO jk = mbkt(ji,jj), nmld(ji,jj), -1                                           ! ag 19/03 
     2096                  zz_b = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) )   ! ag 19/03 
     2097                  pviscos(ji,jj,jk) = zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2    ! ag 19/03 
     2098                  pdiffut(ji,jj,jk) = zb_coup(ji,jj) * zz_b + zc_coup_dif(ji,jj) * zz_b**2    ! ag 19/03 
     2099               END DO                                                                         ! ag 19/03 
     2100            ENDIF                                                                             ! ag 19/03 
     2101            ! Pycnocline 
     2102            IF ( l_pyc(ji,jj) ) THEN  
     2103               ! Diffusivity and viscosity profiles in the pycnocline given by 
     2104               ! cubic polynomial. Note, if l_pyc TRUE can't be coupled to seabed. 
     2105               za_cubic = 0.5_wp 
     2106               zb_d_cubic = -1.75_wp * zdifpyc_s_sc(ji,jj) / zdifpyc_n_sc(ji,jj) 
     2107               zd_d_cubic = ( pdh(ji,jj) * zdifml_sc(ji,jj) / phml(ji,jj) * SQRT( 1.0_wp - zbeta_d_sc(ji,jj) ) *   & 
     2108                  &           ( 2.5_wp * zbeta_d_sc(ji,jj) - 1.0_wp ) - 0.85_wp * zdifpyc_s_sc(ji,jj) ) /            & 
     2109                  &           MAX( zdifpyc_n_sc(ji,jj), 1.0e-8_wp ) 
     2110               zd_d_cubic = zd_d_cubic - zb_d_cubic - 2.0_wp * ( 1.0_wp - za_cubic  - zb_d_cubic ) 
     2111               zc_d_cubic = 1.0_wp - za_cubic - zb_d_cubic - zd_d_cubic 
     2112               zb_v_cubic = -1.75_wp * zvispyc_s_sc(ji,jj) / zvispyc_n_sc(ji,jj) 
     2113               zd_v_cubic = ( 0.5_wp * zvisml_sc(ji,jj) * pdh(ji,jj) / phml(ji,jj) - 0.85_wp * zvispyc_s_sc(ji,jj) ) /   & 
     2114                  &           MAX( zvispyc_n_sc(ji,jj), 1.0e-8_wp ) 
     2115               zd_v_cubic = zd_v_cubic - zb_v_cubic - 2.0_wp * ( 1.0_wp - za_cubic - zb_v_cubic ) 
     2116               zc_v_cubic = 1.0_wp - za_cubic - zb_v_cubic - zd_v_cubic 
     2117               DO jk = nmld(ji,jj) , nbld(ji,jj) 
     2118                  zznd_pyc = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) / MAX(pdh(ji,jj), 1.0e-6_wp ) 
     2119                  ztmp = ( 1.75_wp * zznd_pyc - 0.15_wp * zznd_pyc**2 - 0.2_wp * zznd_pyc**3 ) 
     2120                  ! 
     2121                  pdiffut(ji,jj,jk) = zdifpyc_n_sc(ji,jj) *   & 
     2122                     &                ( za_cubic + zb_d_cubic * zznd_pyc + zc_d_cubic * zznd_pyc**2 + zd_d_cubic * zznd_pyc**3 ) 
     2123                  ! 
     2124                  pdiffut(ji,jj,jk) = pdiffut(ji,jj,jk) + zdifpyc_s_sc(ji,jj) * ztmp 
     2125                  pviscos(ji,jj,jk) = zvispyc_n_sc(ji,jj) *   & 
     2126                     &                ( za_cubic + zb_v_cubic * zznd_pyc + zc_v_cubic * zznd_pyc**2 + zd_v_cubic * zznd_pyc**3 ) 
     2127                  pviscos(ji,jj,jk) = pviscos(ji,jj,jk) + zvispyc_s_sc(ji,jj) * ztmp 
     2128               END DO 
     2129   !                  IF ( pdhdt(ji,jj) > 0._wp ) THEN 
     2130   !                     zdiffut(ji,jj,nbld(ji,jj)+1) = MAX( 0.5 * pdhdt(ji,jj) * e3w(ji,jj,nbld(ji,jj)+1,Kmm), 1.0e-6 ) 
     2131   !                     zviscos(ji,jj,nbld(ji,jj)+1) = MAX( 0.5 * pdhdt(ji,jj) * e3w(ji,jj,nbld(ji,jj)+1,Kmm), 1.0e-6 ) 
     2132   !                  ELSE 
     2133   !                     zdiffut(ji,jj,nbld(ji,jj)) = 0._wp 
     2134   !                     zviscos(ji,jj,nbld(ji,jj)) = 0._wp 
     2135   !                  ENDIF 
     2136            ENDIF 
     2137         ELSE 
     2138            ! Stable conditions 
     2139            DO jk = 2, nbld(ji,jj) 
     2140               zznd_ml = gdepw(ji,jj,jk,Kmm) / phbl(ji,jj) 
     2141               pdiffut(ji,jj,jk) = 0.75_wp * zdifml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zznd_ml )**1.5_wp 
     2142               pviscos(ji,jj,jk) = 0.375_wp * zvisml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zznd_ml ) * ( 1.0_wp - zznd_ml**2 ) 
     2143            END DO 
     2144            ! 
     2145            IF ( pdhdt(ji,jj) > 0.0_wp ) THEN 
     2146               pdiffut(ji,jj,nbld(ji,jj)) = MAX( pdhdt(ji,jj), 1.0e-6_wp) * e3w(ji, jj, nbld(ji,jj), Kmm) 
     2147               pviscos(ji,jj,nbld(ji,jj)) = pdiffut(ji,jj,nbld(ji,jj)) 
     2148            ENDIF 
     2149         ENDIF   ! End if ( l_conv ) 
     2150         ! 
     2151      END_2D 
     2152      CALL zdf_osm_iomput( "pb_coup", tmask(A2D(0),1) * zb_coup(A2D(0)) )   ! BBL-coupling velocity scale 
     2153      ! 
     2154   END SUBROUTINE zdf_osm_diffusivity_viscosity 
     2155 
     2156   SUBROUTINE zdf_osm_fgr_terms( Kmm, kp_ext, phbl, phml, pdh,                              & 
     2157      &                          pdhdt, pshear, pdtdz_bl_ext, pdsdz_bl_ext, pdbdz_bl_ext,   & 
     2158      &                          pdiffut, pviscos ) 
     2159      !!--------------------------------------------------------------------- 
     2160      !!                 ***  ROUTINE zdf_osm_fgr_terms *** 
     2161      !! 
     2162      !! ** Purpose : Compute non-gradient terms in flux-gradient relationship 
     2163      !! 
     2164      !! ** Method  : 
     2165      !! 
     2166      !!---------------------------------------------------------------------- 
     2167      INTEGER,                                 INTENT(in   ) ::   Kmm            ! Time-level index 
     2168      INTEGER,  DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   kp_ext         ! Offset for external level 
     2169      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phbl           ! BL depth 
     2170      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   phml           ! ML depth 
     2171      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdh            ! Pycnocline depth 
     2172      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdhdt          ! BL depth tendency 
     2173      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pshear         ! Shear production 
     2174      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdtdz_bl_ext   ! External temperature gradients 
     2175      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdsdz_bl_ext   ! External salinity gradients 
     2176      REAL(wp), DIMENSION(A2D(nn_hls-1)),      INTENT(in   ) ::   pdbdz_bl_ext   ! External buoyancy gradients 
     2177      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(in   ) ::   pdiffut        ! t-diffusivity 
     2178      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk),  INTENT(in   ) ::   pviscos        ! Viscosity 
     2179      !! 
     2180      REAL(wp), DIMENSION(A2D(nn_hls-1))     ::   zalpha_pyc   ! 
     2181      REAL(wp), DIMENSION(A2D(nn_hls-1),jpk) ::   zdbdz_pyc    ! Parametrised gradient of buoyancy in the pycnocline 
     2182      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   z3ddz_pyc_1, z3ddz_pyc_2   ! Pycnocline gradient/shear profiles 
     2183      !! 
     2184      INTEGER                            ::   ji, jj, jk, jkm_bld, jkf_mld, jkm_mld   ! Loop indices 
     2185      INTEGER                            ::   istat                                   ! Memory allocation status 
     2186      REAL(wp)                           ::   zznd_d, zznd_ml, zznd_pyc, znd          ! Temporary non-dimensional depths 
     2187      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_wth_1,zsc_ws_1                      ! Temporary scales 
     2188      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_uw_1, zsc_uw_2                      ! Temporary scales 
     2189      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_vw_1, zsc_vw_2                      ! Temporary scales 
     2190      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   ztau_sc_u                               ! Dissipation timescale at base of WML 
     2191      REAL(wp)                           ::   zbuoy_pyc_sc, zdelta_pyc                ! 
     2192      REAL(wp)                           ::   zl_c,zl_l,zl_eps                        ! Used to calculate turbulence length scale 
     2193      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   za_cubic, zb_cubic                      ! Coefficients in cubic polynomial specifying 
     2194      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zc_cubic, zd_cubic                      !    diffusivity in pycnocline 
     2195      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwt_pyc_sc_1, zws_pyc_sc_1              ! 
     2196      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zzeta_pyc                               ! 
     2197      REAL(wp)                           ::   zomega, zvw_max                         ! 
     2198      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zuw_bse,zvw_bse                         ! Momentum, heat, and salinity fluxes 
     2199      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zwth_ent,zws_ent                        !    at the top of the pycnocline 
     2200      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   zsc_wth_pyc, zsc_ws_pyc                 ! Scales for pycnocline transport term 
     2201      REAL(wp)                           ::   ztmp                                    ! 
     2202      REAL(wp)                           ::   ztgrad, zsgrad, zbgrad                  ! Variables used to calculate pycnocline 
     2203      !!                                                                              !    gradients 
     2204      REAL(wp)                           ::   zugrad, zvgrad                          ! Variables for calculating pycnocline shear 
     2205      REAL(wp)                           ::   zdtdz_pyc                               ! Parametrized gradient of temperature in 
     2206      !!                                                                              !    pycnocline 
     2207      REAL(wp)                           ::   zdsdz_pyc                               ! Parametrised gradient of salinity in 
     2208      !!                                                                              !    pycnocline 
     2209      REAL(wp)                           ::   zdudz_pyc                               ! u-shear across the pycnocline 
     2210      REAL(wp)                           ::   zdvdz_pyc                               ! v-shear across the pycnocline 
     2211      !!---------------------------------------------------------------------- 
     2212      ! 
     2213      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
     2214      !  Pycnocline gradients for scalars and velocity 
     2215      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
     2216      CALL zdf_osm_pycnocline_buoyancy_profiles( Kmm, kp_ext, zdbdz_pyc, zalpha_pyc, pdh,    & 
     2217         &                                       phbl, pdbdz_bl_ext, phml, pdhdt ) 
     2218      ! 
     2219      ! Auxiliary indices 
     2220      ! ----------------- 
     2221      jkm_bld = 0 
     2222      jkf_mld = jpk 
     2223      jkm_mld = 0 
     2224      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2225         IF ( nbld(ji,jj) > jkm_bld ) jkm_bld = nbld(ji,jj) 
     2226         IF ( nmld(ji,jj) < jkf_mld ) jkf_mld = nmld(ji,jj) 
     2227         IF ( nmld(ji,jj) > jkm_mld ) jkm_mld = nmld(ji,jj) 
     2228      END_2D 
     2229      ! 
     2230      ! Stokes term in scalar flux, flux-gradient relationship 
     2231      ! ------------------------------------------------------ 
     2232      WHERE ( l_conv(A2D(nn_hls-1)) ) 
     2233         zsc_wth_1(:,:) = swstrl(A2D(nn_hls-1))**3 * swth0(A2D(nn_hls-1)) /   & 
     2234            &             ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln ) 
     2235         zsc_ws_1(:,:)  = swstrl(A2D(nn_hls-1))**3 * sws0(A2D(nn_hls-1))  /   & 
     2236            &             ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln ) 
     2237      ELSEWHERE 
     2238         zsc_wth_1(:,:) = 2.0_wp * swthav(A2D(nn_hls-1)) 
     2239         zsc_ws_1(:,:)  = 2.0_wp * swsav(A2D(nn_hls-1)) 
     2240      ENDWHERE 
     2241      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) ) 
     2242         IF ( l_conv(ji,jj) ) THEN 
     2243            IF ( jk <= nmld(ji,jj) ) THEN 
     2244               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2245               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 1.35_wp * EXP( -1.0_wp * zznd_d ) *   & 
     2246                  &                                ( 1.0_wp - EXP( -2.0_wp * zznd_d ) ) * zsc_wth_1(ji,jj) 
     2247               ghams(ji,jj,jk) = ghams(ji,jj,jk) + 1.35_wp * EXP( -1.0_wp * zznd_d ) *   & 
     2248                  &                                ( 1.0_wp - EXP( -2.0_wp * zznd_d ) ) * zsc_ws_1(ji,jj) 
     2249            END IF 
     2250         ELSE   ! Stable conditions 
     2251            IF ( jk <= nbld(ji,jj) ) THEN 
     2252               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2253               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 2.15_wp * EXP( -0.85_wp * zznd_d ) *   & 
     2254                  &                                ( 1.0_wp - EXP( -4.0_wp * zznd_d ) ) * zsc_wth_1(ji,jj) 
     2255               ghams(ji,jj,jk) = ghams(ji,jj,jk) + 2.15_wp * EXP( -0.85_wp * zznd_d ) *   & 
     2256                  &                                ( 1.0_wp - EXP( -4.0_wp * zznd_d ) ) * zsc_ws_1(ji,jj) 
     2257            END IF 
     2258         END IF   ! Check on l_conv 
     2259      END_3D 
     2260      ! 
     2261      IF ( ln_dia_osm ) THEN 
     2262         CALL zdf_osm_iomput( "ghamu_00", wmask(A2D(0),:) * ghamu(A2D(0),:) ) 
     2263         CALL zdf_osm_iomput( "ghamv_00", wmask(A2D(0),:) * ghamv(A2D(0),:) ) 
     2264      END IF 
     2265      ! 
     2266      ! Stokes term in flux-gradient relationship (note in zsc_uw_n don't use 
     2267      ! svstr since term needs to go to zero as swstrl goes to zero) 
     2268      ! --------------------------------------------------------------------- 
     2269      WHERE ( l_conv(A2D(nn_hls-1)) ) 
     2270         zsc_uw_1(:,:) = ( swstrl(A2D(nn_hls-1))**3 +                                                & 
     2271            &              0.5_wp * swstrc(A2D(nn_hls-1))**3 )**pthird * sustke(A2D(nn_hls-1)) /   & 
     2272            &              MAX( ( 1.0_wp - 1.0_wp * 6.5_wp * sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ) ), 0.2_wp ) 
     2273         zsc_uw_2(:,:) = ( swstrl(A2D(nn_hls-1))**3 +                                                & 
     2274            &              0.5_wp * swstrc(A2D(nn_hls-1))**3 )**pthird * sustke(A2D(nn_hls-1)) /   & 
     2275            &              MIN( sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ) + epsln, 0.12_wp ) 
     2276         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * phml(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1))**3 *   & 
     2277            &            MIN( sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ), 0.12_wp ) /                    & 
     2278            &            ( ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 )**( 2.0_wp / 3.0_wp ) + epsln ) 
     2279      ELSEWHERE 
     2280         zsc_uw_1(:,:) = sustar(A2D(nn_hls-1))**2 
     2281         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * phbl(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1))**3 *   & 
     2282            &            MIN( sla(A2D(nn_hls-1))**( 8.0_wp / 3.0_wp ), 0.12_wp ) / ( svstr(A2D(nn_hls-1))**2 + epsln ) 
     2283      ENDWHERE 
     2284      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) ) 
     2285         IF ( l_conv(ji,jj) ) THEN 
     2286            IF ( jk <= nmld(ji,jj) ) THEN 
     2287               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2288               ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + ( -0.05_wp   * EXP( -0.4_wp * zznd_d ) * zsc_uw_1(ji,jj) +     & 
     2289                  &                                  0.00125_wp * EXP( -1.0_wp * zznd_d ) * zsc_uw_2(ji,jj) ) *   & 
     2290                  &                                ( 1.0_wp - EXP( -2.0_wp * zznd_d ) ) 
     2291               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) - 0.65_wp *  0.15_wp * EXP( -1.0_wp * zznd_d ) *                 & 
     2292                  &                                ( 1.0_wp - EXP( -2.0_wp * zznd_d ) ) * zsc_vw_1(ji,jj) 
     2293            END IF 
     2294         ELSE   ! Stable conditions 
     2295            IF ( jk <= nbld(ji,jj) ) THEN   ! Corrected to nbld 
     2296               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2297               ghamu(ji,jj,jk) = ghamu(ji,jj,jk) - 0.75_wp * 1.3_wp * EXP( -0.5_wp * zznd_d ) *             & 
     2298                  &                                ( 1.0_wp - EXP( -4.0_wp * zznd_d ) ) * zsc_uw_1(ji,jj) 
     2299            END IF 
     2300         END IF 
     2301      END_3D 
     2302      ! 
     2303      ! Buoyancy term in flux-gradient relationship [note : includes ROI ratio 
     2304      ! (X0.3) and pressure (X0.5)] 
     2305      ! ---------------------------------------------------------------------- 
     2306      WHERE ( l_conv(A2D(nn_hls-1)) ) 
     2307         zsc_wth_1(:,:) = swbav(A2D(nn_hls-1)) * swth0(A2D(nn_hls-1)) * ( 1.0_wp + EXP( 0.2_wp * shol(A2D(nn_hls-1)) ) ) *   & 
     2308            &             phml(A2D(nn_hls-1)) / ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln ) 
     2309         zsc_ws_1(:,:)  = swbav(A2D(nn_hls-1)) * sws0(A2D(nn_hls-1))  * ( 1.0_wp + EXP( 0.2_wp * shol(A2D(nn_hls-1)) ) ) *   & 
     2310            &             phml(A2D(nn_hls-1)) / ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln ) 
     2311      ELSEWHERE 
     2312         zsc_wth_1(:,:) = 0.0_wp 
     2313         zsc_ws_1(:,:)  = 0.0_wp 
     2314      ENDWHERE 
     2315      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) ) 
     2316         IF ( l_conv(ji,jj) ) THEN 
     2317            IF ( jk <= nmld(ji,jj) ) THEN 
     2318               zznd_ml = gdepw(ji,jj,jk,Kmm) / phml(ji,jj) 
     2319               ! Calculate turbulent time scale 
     2320               zl_c   = 0.9_wp * ( 1.0_wp - EXP( -5.0_wp * ( zznd_ml + zznd_ml**3 / 3.0_wp ) ) ) *                         & 
     2321                  &     ( 1.0_wp - EXP( -15.0_wp * ( 1.2_wp - zznd_ml ) ) ) 
     2322               zl_l   = 2.0_wp * ( 1.0_wp - EXP( -2.0_wp * ( zznd_ml + zznd_ml**3 / 3.0_wp ) ) ) *                         & 
     2323                  &     ( 1.0_wp - EXP( -8.0_wp  * ( 1.15_wp - zznd_ml ) ) ) * ( 1.0_wp + dstokes(ji,jj) / phml (ji,jj) ) 
     2324               zl_eps = zl_l + ( zl_c - zl_l ) / ( 1.0_wp + EXP( -3.0_wp * LOG10( -1.0_wp * shol(ji,jj) ) ) )**( 3.0_wp / 2.0_wp ) 
     2325               ! Non-gradient buoyancy terms 
     2326               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3_wp * 0.4_wp * zsc_wth_1(ji,jj) * zl_eps / ( 0.15_wp + zznd_ml ) 
     2327               ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3_wp * 0.4_wp *  zsc_ws_1(ji,jj) * zl_eps / ( 0.15_wp + zznd_ml ) 
     2328            END IF 
     2329         ELSE   ! Stable conditions 
     2330            IF ( jk <= nbld(ji,jj) ) THEN 
     2331               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + zsc_wth_1(ji,jj) 
     2332               ghams(ji,jj,jk) = ghams(ji,jj,jk) +  zsc_ws_1(ji,jj) 
     2333            END IF 
     2334         END IF 
     2335      END_3D 
     2336      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2337         IF ( l_conv(ji,jj) .AND. l_pyc(ji,jj) ) THEN 
     2338            ztau_sc_u(ji,jj)    = phml(ji,jj) / ( svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**pthird *                             & 
     2339               &                ( 1.4_wp - 0.4_wp / ( 1.0_wp + EXP( -3.5_wp * LOG10( -1.0_wp * shol(ji,jj) ) ) )**1.5_wp ) 
     2340            zwth_ent(ji,jj)     = -0.003_wp * ( 0.15_wp * svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**pthird *   & 
     2341               &                ( 1.0_wp - pdh(ji,jj) / phbl(ji,jj) ) * av_dt_ml(ji,jj) 
     2342            zws_ent(ji,jj)      = -0.003_wp * ( 0.15_wp * svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**pthird *   & 
     2343               &                ( 1.0_wp - pdh(ji,jj) / phbl(ji,jj) ) * av_ds_ml(ji,jj) 
     2344            IF ( dh(ji,jj) < 0.2_wp * hbl(ji,jj) ) THEN 
     2345               zbuoy_pyc_sc        = 2.0_wp * MAX( av_db_ml(ji,jj), 0.0_wp ) / pdh(ji,jj) 
     2346               zdelta_pyc          = ( svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**pthird /   & 
     2347                  &                       SQRT( MAX( zbuoy_pyc_sc, ( svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**p2third / pdh(ji,jj)**2 ) ) 
     2348               zwt_pyc_sc_1(ji,jj) = 0.325_wp * ( zalpha_pyc(ji,jj) * av_dt_ml(ji,jj) / pdh(ji,jj) + pdtdz_bl_ext(ji,jj) ) *   & 
     2349                  &                     zdelta_pyc**2 / pdh(ji,jj) 
     2350               zws_pyc_sc_1(ji,jj) = 0.325_wp * ( zalpha_pyc(ji,jj) * av_ds_ml(ji,jj) / pdh(ji,jj) + pdsdz_bl_ext(ji,jj) ) *   & 
     2351                  &                     zdelta_pyc**2 / pdh(ji,jj) 
     2352               zzeta_pyc(ji,jj)    = 0.15_wp - 0.175_wp / ( 1.0_wp + EXP( -3.5_wp * LOG10( -1.0_wp * shol(ji,jj) ) ) ) 
     2353            END IF 
     2354         END IF 
     2355      END_2D 
     2356      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jkm_bld ) 
     2357         IF ( l_conv(ji,jj) .AND. l_pyc(ji,jj) .AND. ( jk <= nbld(ji,jj) ) ) THEN 
     2358            zznd_pyc = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) / pdh(ji,jj) 
     2359            ghamt(ji,jj,jk) = ghamt(ji,jj,jk) -                                                                                & 
     2360               &              0.045_wp * ( ( zwth_ent(ji,jj) * zdbdz_pyc(ji,jj,jk) ) * ztau_sc_u(ji,jj)**2 ) *                 & 
     2361               &                         MAX( ( 1.75_wp * zznd_pyc -0.15_wp * zznd_pyc**2 - 0.2_wp * zznd_pyc**3 ), 0.0_wp ) 
     2362            ghams(ji,jj,jk) = ghams(ji,jj,jk) -                                                                                & 
     2363               &              0.045_wp * ( ( zws_ent(ji,jj)  * zdbdz_pyc(ji,jj,jk) ) * ztau_sc_u(ji,jj)**2 ) *                 & 
     2364               &                         MAX( ( 1.75_wp * zznd_pyc -0.15_wp * zznd_pyc**2 - 0.2_wp * zznd_pyc**3 ), 0.0_wp ) 
     2365            IF ( dh(ji,jj) < 0.2_wp * hbl(ji,jj) .AND. nbld(ji,jj) - nmld(ji,jj) > 3 ) THEN 
     2366               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.05_wp  * zwt_pyc_sc_1(ji,jj) *                              & 
     2367                  &                                EXP( -0.25_wp * ( zznd_pyc / zzeta_pyc(ji,jj) )**2 ) *        & 
     2368                  &                                pdh(ji,jj) / ( svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**pthird 
     2369               ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.05_wp  * zws_pyc_sc_1(ji,jj) *                              & 
     2370                  &                                EXP( -0.25_wp * ( zznd_pyc / zzeta_pyc(ji,jj) )**2 ) *        & 
     2371                  &                                pdh(ji,jj) / ( svstr(ji,jj)**3 + swstrc(ji,jj)**3 )**pthird 
     2372            END IF 
     2373         END IF   ! End of pycnocline 
     2374      END_3D 
     2375      ! 
     2376      IF ( ln_dia_osm ) THEN 
     2377         CALL zdf_osm_iomput( "zwth_ent", tmask(A2D(0),1) * zwth_ent(A2D(0)) )   ! Upward turb. temperature entrainment flux 
     2378         CALL zdf_osm_iomput( "zws_ent",  tmask(A2D(0),1) * zws_ent(A2D(0))  )   ! Upward turb. salinity entrainment flux 
     2379      END IF 
     2380      ! 
     2381      zsc_vw_1(:,:) = 0.0_wp 
     2382      WHERE ( l_conv(A2D(nn_hls-1)) ) 
     2383         zsc_uw_1(:,:) = -1.0_wp * swb0(A2D(nn_hls-1)) * sustar(A2D(nn_hls-1))**2 * phml(A2D(nn_hls-1)) /   & 
     2384            &            ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln ) 
     2385         zsc_uw_2(:,:) =           swb0(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1))    * phml(A2D(nn_hls-1)) /   & 
     2386            &            ( svstr(A2D(nn_hls-1))**3 + 0.5_wp * swstrc(A2D(nn_hls-1))**3 + epsln )**( 2.0_wp / 3.0_wp ) 
     2387      ELSEWHERE 
     2388         zsc_uw_1(:,:) = 0.0_wp 
     2389      ENDWHERE 
     2390      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) ) 
     2391         IF ( l_conv(ji,jj) ) THEN 
     2392            IF ( jk <= nmld(ji,jj) ) THEN 
     2393               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2394               ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.3_wp * 0.5_wp *   & 
     2395                  &                                ( zsc_uw_1(ji,jj) + 0.125_wp * EXP( -0.5_wp * zznd_d ) *       & 
     2396                  &                                  (   1.0_wp - EXP( -0.5_wp * zznd_d ) ) * zsc_uw_2(ji,jj) ) 
     2397               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj) 
     2398            END IF 
     2399         ELSE   ! Stable conditions 
     2400            IF ( jk <= nbld(ji,jj) ) THEN 
     2401               ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + zsc_uw_1(ji,jj) 
     2402               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + zsc_vw_1(ji,jj) 
     2403            END IF 
    22182404         ENDIF 
    2219  
    2220       ELSE   ! lshear 
    2221 ! for lshear = .FALSE. calculate ddhdt here 
    2222  
    2223           IF ( lconv(ji,jj) ) THEN 
    2224  
    2225             IF( ln_osm_mle ) THEN 
    2226                IF ( ( zwb_ent(ji,jj) + 2.0 * zwb_fk_b(ji,jj) ) < 0._wp ) THEN 
    2227                   ! OSBL is deepening. Note wb_fk_b is zero if ln_osm_mle=F 
    2228                   IF ( zdb_bl(ji,jj) > 0._wp .and. zdbdz_bl_ext(ji,jj) > 0._wp)THEN 
    2229                      IF ( ( zwstrc(ji,jj) / MAX(zvstr(ji,jj), epsln) )**3 <= 0.5 ) THEN  ! near neutral stability 
    2230                         zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zvstr(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    2231                      ELSE                                                     ! unstable 
    2232                         zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zwstrc(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    2233                      ENDIF 
    2234                      ztau = 0.2 * hbl(ji,jj) / MAX(epsln, (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird) 
    2235                      zdh_ref = zari * hbl(ji,jj) 
     2405      END_3D 
     2406      ! 
     2407      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2408         IF ( l_conv(ji,jj) .AND. l_pyc(ji,jj) ) THEN 
     2409            IF ( n_ddh(ji,jj) == 0 ) THEN 
     2410               ! Place holding code. Parametrization needs checking for these conditions. 
     2411               zomega = ( 0.15_wp * swstrl(ji,jj)**3 + swstrc(ji,jj)**3 + 4.75_wp * ( pshear(ji,jj) * phbl(ji,jj) ) )**pthird 
     2412               zuw_bse(ji,jj) = -0.0035_wp * zomega * ( 1.0_wp - pdh(ji,jj) / phbl(ji,jj) ) * av_du_ml(ji,jj) 
     2413               zvw_bse(ji,jj) = -0.0075_wp * zomega * ( 1.0_wp - pdh(ji,jj) / phbl(ji,jj) ) * av_dv_ml(ji,jj) 
     2414            ELSE 
     2415               zomega = ( 0.15_wp * swstrl(ji,jj)**3 + swstrc(ji,jj)**3 + 4.75_wp * ( pshear(ji,jj) * phbl(ji,jj) ) )**pthird 
     2416               zuw_bse(ji,jj) = -0.0035_wp * zomega * ( 1.0_wp - pdh(ji,jj) / phbl(ji,jj) ) * av_du_ml(ji,jj) 
     2417               zvw_bse(ji,jj) = -0.0075_wp * zomega * ( 1.0_wp - pdh(ji,jj) / phbl(ji,jj) ) * av_dv_ml(ji,jj) 
     2418            ENDIF 
     2419            zb_cubic(ji,jj) = pdh(ji,jj) / phbl(ji,jj) * suw0(ji,jj) - ( 2.0_wp + pdh(ji,jj) / phml(ji,jj) ) * zuw_bse(ji,jj) 
     2420            za_cubic(ji,jj) = zuw_bse(ji,jj) - zb_cubic(ji,jj) 
     2421            zvw_max = 0.7_wp * ff_t(ji,jj) * ( sustke(ji,jj) * dstokes(ji,jj) + 0.7_wp * sustar(ji,jj) * phml(ji,jj) ) 
     2422            zd_cubic(ji,jj) = zvw_max * pdh(ji,jj) / phml(ji,jj) - ( 2.0_wp + pdh(ji,jj) / phml(ji,jj) ) * zvw_bse(ji,jj) 
     2423            zc_cubic(ji,jj) = zvw_bse(ji,jj) - zd_cubic(ji,jj) 
     2424         END IF 
     2425      END_2D 
     2426      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jkf_mld, jkm_bld )   ! Need ztau_sc_u to be available. Change to array. 
     2427         IF ( l_conv(ji,jj) .AND. l_pyc(ji,jj) .AND. ( jk >= nmld(ji,jj) ) .AND. ( jk <= nbld(ji,jj) ) ) THEN 
     2428            zznd_pyc = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) / pdh(ji,jj) 
     2429            ghamu(ji,jj,jk) = ghamu(ji,jj,jk) - 0.045_wp * ( ztau_sc_u(ji,jj)**2 ) * zuw_bse(ji,jj) *                 & 
     2430               &                                ( za_cubic(ji,jj) * zznd_pyc**2 + zb_cubic(ji,jj) * zznd_pyc**3 ) *   & 
     2431               &                                ( 0.75_wp + 0.25_wp * zznd_pyc )**2 * zdbdz_pyc(ji,jj,jk) 
     2432            ghamv(ji,jj,jk) = ghamv(ji,jj,jk) - 0.045_wp * ( ztau_sc_u(ji,jj)**2 ) * zvw_bse(ji,jj) *                 & 
     2433               &                                ( zc_cubic(ji,jj) * zznd_pyc**2 + zd_cubic(ji,jj) * zznd_pyc**3 ) *   & 
     2434               &                                ( 0.75_wp + 0.25_wp * zznd_pyc )**2 * zdbdz_pyc(ji,jj,jk) 
     2435         END IF   ! l_conv .AND. l_pyc 
     2436      END_3D 
     2437      ! 
     2438      IF ( ln_dia_osm ) THEN 
     2439         CALL zdf_osm_iomput( "ghamu_0",    wmask(A2D(0),:) * ghamu(A2D(0),:)  ) 
     2440         CALL zdf_osm_iomput( "zsc_uw_1_0", tmask(A2D(0),1) * zsc_uw_1(A2D(0)) ) 
     2441      END IF 
     2442      ! 
     2443      ! Transport term in flux-gradient relationship [note : includes ROI ratio 
     2444      ! (X0.3) ] 
     2445      ! ----------------------------------------------------------------------- 
     2446      WHERE ( l_conv(A2D(nn_hls-1)) ) 
     2447         zsc_wth_1(:,:) = swth0(A2D(nn_hls-1)) / ( 1.0_wp - 0.56_wp * EXP( shol(A2D(nn_hls-1)) ) ) 
     2448         zsc_ws_1(:,:)  = sws0(A2D(nn_hls-1))  / ( 1.0_wp - 0.56_wp * EXP( shol(A2D(nn_hls-1)) ) ) 
     2449         WHERE ( l_pyc(A2D(nn_hls-1)) )   ! Pycnocline scales 
     2450            zsc_wth_pyc(:,:) = -0.003_wp * swstrc(A2D(nn_hls-1)) * ( 1.0_wp - pdh(A2D(nn_hls-1)) / phbl(A2D(nn_hls-1)) ) *   & 
     2451               &               av_dt_ml(A2D(nn_hls-1)) 
     2452            zsc_ws_pyc(:,:)  = -0.003_wp * swstrc(A2D(nn_hls-1)) * ( 1.0_wp - pdh(A2D(nn_hls-1)) / phbl(A2D(nn_hls-1)) ) *   & 
     2453               &               av_ds_ml(A2D(nn_hls-1)) 
     2454         END WHERE 
     2455      ELSEWHERE 
     2456         zsc_wth_1(:,:) = 2.0_wp * swthav(A2D(nn_hls-1)) 
     2457         zsc_ws_1(:,:)  =          sws0(A2D(nn_hls-1)) 
     2458      END WHERE 
     2459      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, MAX( jkm_mld, jkm_bld ) ) 
     2460         IF ( l_conv(ji,jj) ) THEN 
     2461            IF ( ( jk > 1 ) .AND. ( jk <= nmld(ji,jj) ) ) THEN 
     2462               zznd_ml = gdepw(ji,jj,jk,Kmm) / phml(ji,jj) 
     2463               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3_wp * zsc_wth_1(ji,jj) *                                  & 
     2464                  &                                ( -2.0_wp + 2.75_wp * ( ( 1.0_wp + 0.6_wp * zznd_ml**4 ) -   & 
     2465                  &                                                        EXP( -6.0_wp * zznd_ml ) ) ) *       & 
     2466                  &                                ( 1.0_wp - EXP( -15.0_wp * ( 1.0_wp - zznd_ml ) ) ) 
     2467               ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3_wp * zsc_ws_1(ji,jj) *                                   & 
     2468                  &                                ( -2.0_wp + 2.75_wp * ( ( 1.0_wp + 0.6_wp * zznd_ml**4 ) -   & 
     2469                  &                                EXP( -6.0_wp * zznd_ml ) ) ) * ( 1.0_wp - EXP( -15.0_wp * ( 1.0_wp - zznd_ml ) ) ) 
     2470            END IF 
     2471            ! 
     2472            ! may need to comment out lpyc block 
     2473            IF ( l_pyc(ji,jj) .AND. ( jk >= nmld(ji,jj) ) .AND. ( jk <= nbld(ji,jj) ) ) THEN   ! Pycnocline 
     2474               zznd_pyc = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) / pdh(ji,jj) 
     2475               ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 4.0_wp * zsc_wth_pyc(ji,jj) *   & 
     2476                  &                                ( 0.48_wp - EXP( -1.5_wp * ( zznd_pyc - 0.3_wp )**2 ) ) 
     2477               ghams(ji,jj,jk) = ghams(ji,jj,jk) + 4.0_wp * zsc_ws_pyc(ji,jj)  *   & 
     2478                  &                                ( 0.48_wp - EXP( -1.5_wp * ( zznd_pyc - 0.3_wp )**2 ) ) 
     2479            END IF 
     2480         ELSE 
     2481            IF( pdhdt(ji,jj) > 0. ) THEN 
     2482               IF ( ( jk > 1 ) .AND. ( jk <= nbld(ji,jj) ) ) THEN 
     2483                  zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2484                  znd    = gdepw(ji,jj,jk,Kmm) / phbl(ji,jj) 
     2485                  ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + 0.3_wp * ( -4.06_wp * EXP( -2.0_wp * zznd_d ) * ( 1.0_wp - EXP( -4.0_wp * zznd_d ) ) +   & 
     2486                     7.5_wp * EXP ( -10.0_wp * ( 0.95_wp - znd )**2 ) * ( 1.0_wp - znd ) ) * zsc_wth_1(ji,jj) 
     2487                  ghams(ji,jj,jk) = ghams(ji,jj,jk) + 0.3_wp * ( -4.06_wp * EXP( -2.0_wp * zznd_d ) * ( 1.0_wp - EXP( -4.0_wp * zznd_d ) ) +   & 
     2488                     7.5_wp * EXP ( -10.0_wp * ( 0.95_wp - znd )**2 ) * ( 1.0_wp - znd ) ) * zsc_ws_1(ji,jj) 
     2489               END IF 
     2490            ENDIF 
     2491         ENDIF 
     2492      END_3D 
     2493      ! 
     2494      WHERE ( l_conv(A2D(nn_hls-1)) ) 
     2495         zsc_uw_1(:,:) = sustar(A2D(nn_hls-1))**2 
     2496         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1)) * phml(A2D(nn_hls-1)) 
     2497      ELSEWHERE 
     2498         zsc_uw_1(:,:) = sustar(A2D(nn_hls-1))**2 
     2499         zsc_uw_2(:,:) = ( 2.25_wp - 3.0_wp * ( 1.0_wp - EXP( -1.25_wp * 2.0_wp ) ) ) * ( 1.0_wp - EXP( -4.0_wp * 2.0_wp ) ) *   & 
     2500            &            zsc_uw_1(:,:) 
     2501         zsc_vw_1(:,:) = ff_t(A2D(nn_hls-1)) * sustke(A2D(nn_hls-1)) * phbl(A2D(nn_hls-1)) 
     2502         zsc_vw_2(:,:) = -0.11_wp * SIN( 3.14159_wp * ( 2.0_wp + 0.4_wp ) ) * EXP( -1.0_wp * ( 1.5_wp + 2.0_wp )**2 ) *   & 
     2503            &            zsc_vw_1(:,:) 
     2504      ENDWHERE 
     2505      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, MAX( jkm_mld, jkm_bld ) ) 
     2506         IF ( l_conv(ji,jj) ) THEN 
     2507            IF ( jk <= nmld(ji,jj) ) THEN 
     2508               zznd_ml = gdepw(ji,jj,jk,Kmm) / phml(ji,jj) 
     2509               zznd_d  = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2510               ghamu(ji,jj,jk) = ghamu(ji,jj,jk) +   & 
     2511                  &              0.3_wp * ( -2.0_wp + 2.5_wp * ( 1.0_wp + 0.1_wp * zznd_ml**4 ) - EXP( -8.0_wp * zznd_ml ) ) *   & 
     2512                  &              zsc_uw_1(ji,jj) 
     2513               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) +   & 
     2514                  &              0.3_wp * 0.1_wp * ( EXP( -1.0_wp * zznd_d ) + EXP( -5.0_wp * ( 1.0_wp - zznd_ml ) ) ) *   & 
     2515                  &              zsc_vw_1(ji,jj) 
     2516            END IF 
     2517         ELSE 
     2518            IF ( jk <= nbld(ji,jj) ) THEN 
     2519               znd    = gdepw(ji,jj,jk,Kmm) / phbl(ji,jj) 
     2520               zznd_d = gdepw(ji,jj,jk,Kmm) / dstokes(ji,jj) 
     2521               IF ( zznd_d <= 2.0_wp ) THEN 
     2522                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.5_wp * 0.3_wp *                                              & 
     2523                     &                                ( 2.25_wp - 3.0_wp * ( 1.0_wp - EXP( -1.25_wp * zznd_d ) ) *   & 
     2524                     &                                  ( 1.0_wp - EXP( -2.0_wp * zznd_d ) ) ) * zsc_uw_1(ji,jj) 
     2525               ELSE 
     2526                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + 0.5_wp * 0.3_wp *   & 
     2527                     &                                ( 1.0_wp - EXP( -5.0_wp * ( 1.0_wp - znd ) ) ) * zsc_uw_2(ji,jj) 
     2528               ENDIF 
     2529               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + 0.3_wp * 0.15_wp * SIN( 3.14159_wp * ( 0.65_wp * zznd_d ) ) *   & 
     2530                  &                                EXP( -0.25_wp * zznd_d**2 ) * zsc_vw_1(ji,jj) 
     2531               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + 0.3_wp * 0.15_wp * EXP( -5.0 * ( 1.0 - znd ) ) *   & 
     2532                  &                                ( 1.0 - EXP( -20.0 * ( 1.0 - znd ) ) ) * zsc_vw_2(ji,jj) 
     2533            END IF 
     2534         END IF 
     2535      END_3D 
     2536      ! 
     2537      IF ( ln_dia_osm ) THEN 
     2538         CALL zdf_osm_iomput( "ghamu_f",    wmask(A2D(0),:) * ghamu(A2D(0),:)  ) 
     2539         CALL zdf_osm_iomput( "ghamv_f",    wmask(A2D(0),:) * ghamv(A2D(0),:)  ) 
     2540         CALL zdf_osm_iomput( "zsc_uw_1_f", tmask(A2D(0),1) * zsc_uw_1(A2D(0)) ) 
     2541         CALL zdf_osm_iomput( "zsc_vw_1_f", tmask(A2D(0),1) * zsc_vw_1(A2D(0)) ) 
     2542         CALL zdf_osm_iomput( "zsc_uw_2_f", tmask(A2D(0),1) * zsc_uw_2(A2D(0)) ) 
     2543         CALL zdf_osm_iomput( "zsc_vw_2_f", tmask(A2D(0),1) * zsc_vw_2(A2D(0)) ) 
     2544      END IF 
     2545      ! 
     2546      ! Make surface forced velocity non-gradient terms go to zero at the base 
     2547      ! of the mixed layer. 
     2548      ! 
     2549      ! Make surface forced velocity non-gradient terms go to zero at the base 
     2550      ! of the boundary layer. 
     2551      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jkm_bld ) 
     2552         IF ( ( .NOT. l_conv(ji,jj) ) .AND. ( jk <= nbld(ji,jj) ) ) THEN 
     2553            znd = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) / phbl(ji,jj)   ! ALMG to think about 
     2554            IF ( znd >= 0.0_wp ) THEN 
     2555               ghamu(ji,jj,jk) = ghamu(ji,jj,jk) * ( 1.0_wp - EXP( -10.0_wp * znd**2 ) ) 
     2556               ghamv(ji,jj,jk) = ghamv(ji,jj,jk) * ( 1.0_wp - EXP( -10.0_wp * znd**2 ) ) 
     2557            ELSE 
     2558               ghamu(ji,jj,jk) = 0.0_wp 
     2559               ghamv(ji,jj,jk) = 0.0_wp 
     2560            ENDIF 
     2561         END IF 
     2562      END_3D 
     2563      ! 
     2564      ! Pynocline contributions 
     2565      ! 
     2566      IF ( ln_dia_pyc_scl .OR. ln_dia_pyc_shr ) THEN   ! Allocate arrays for output of pycnocline gradient/shear profiles 
     2567         ALLOCATE( z3ddz_pyc_1(A2D(nn_hls),jpk), z3ddz_pyc_2(A2D(nn_hls),jpk), STAT=istat ) 
     2568         IF ( istat /= 0 ) CALL ctl_stop( 'zdf_osm: failed to allocate temporary arrays' ) 
     2569         z3ddz_pyc_1(:,:,:) = 0.0_wp 
     2570         z3ddz_pyc_2(:,:,:) = 0.0_wp 
     2571      END IF 
     2572      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jkm_bld ) 
     2573         IF ( l_conv (ji,jj) ) THEN 
     2574            ! Unstable conditions. Shouldn;t be needed with no pycnocline code. 
     2575            !                  zugrad = 0.7 * av_du_ml(ji,jj) / zdh(ji,jj) + 0.3 * zustar(ji,jj)*zustar(ji,jj) / & 
     2576            !                       &      ( ( ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird * zhml(ji,jj) ) * & 
     2577            !                      &      MIN(zla(ji,jj)**(8.0/3.0) + epsln, 0.12 )) 
     2578            !Alan is this right? 
     2579            !                  zvgrad = ( 0.7 * av_dv_ml(ji,jj) + & 
     2580            !                       &    2.0 * ff_t(ji,jj) * zustke(ji,jj) * dstokes(ji,jj) / & 
     2581            !                       &          ( ( zvstr(ji,jj)**3 + 0.5 * zwstrc(ji,jj)**3 )**pthird  + epsln ) & 
     2582            !                       &      )/ (zdh(ji,jj)  + epsln ) 
     2583            !                  DO jk = 2, nbld(ji,jj) - 1 + ibld_ext 
     2584            !                     znd = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / (zdh(ji,jj) + epsln ) - zzeta_v 
     2585            !                     IF ( znd <= 0.0 ) THEN 
     2586            !                        zdudz(ji,jj,jk) = 1.25 * zugrad * EXP( 3.0 * znd ) 
     2587            !                        zdvdz(ji,jj,jk) = 1.25 * zvgrad * EXP( 3.0 * znd ) 
     2588            !                     ELSE 
     2589            !                        zdudz(ji,jj,jk) = 1.25 * zugrad * EXP( -2.0 * znd ) 
     2590            !                        zdvdz(ji,jj,jk) = 1.25 * zvgrad * EXP( -2.0 * znd ) 
     2591            !                     ENDIF 
     2592            !                  END DO 
     2593         ELSE   ! Stable conditions 
     2594            IF ( nbld(ji,jj) + kp_ext(ji,jj) < mbkt(ji,jj) ) THEN 
     2595               ! Pycnocline profile only defined when depth steady of increasing. 
     2596               IF ( pdhdt(ji,jj) > 0.0_wp ) THEN   ! Depth increasing, or steady. 
     2597                  IF ( av_db_bl(ji,jj) > 0.0_wp ) THEN 
     2598                     IF ( shol(ji,jj) >= 0.5_wp ) THEN   ! Very stable - 'thick' pycnocline 
     2599                        ztmp = 1.0_wp / MAX( phbl(ji,jj), epsln ) 
     2600                        ztgrad = av_dt_bl(ji,jj) * ztmp 
     2601                        zsgrad = av_ds_bl(ji,jj) * ztmp 
     2602                        zbgrad = av_db_bl(ji,jj) * ztmp 
     2603                        IF ( jk <= nbld(ji,jj) ) THEN 
     2604                           znd = gdepw(ji,jj,jk,Kmm) * ztmp 
     2605                           zdtdz_pyc =  ztgrad * EXP( -15.0_wp * ( znd - 0.9_wp )**2 ) 
     2606                           zdsdz_pyc =  zsgrad * EXP( -15.0_wp * ( znd - 0.9_wp )**2 ) 
     2607                           ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + pdiffut(ji,jj,jk) * zdtdz_pyc 
     2608                           ghams(ji,jj,jk) = ghams(ji,jj,jk) + pdiffut(ji,jj,jk) * zdsdz_pyc 
     2609                           IF ( ln_dia_pyc_scl ) THEN 
     2610                              z3ddz_pyc_1(ji,jj,jk) = zdtdz_pyc 
     2611                              z3ddz_pyc_2(ji,jj,jk) = zdsdz_pyc 
     2612                           END IF 
     2613                        END IF 
     2614                     ELSE   ! Slightly stable - 'thin' pycnoline - needed when stable layer begins to form. 
     2615                        ztmp = 1.0_wp / MAX( pdh(ji,jj), epsln ) 
     2616                        ztgrad = av_dt_bl(ji,jj) * ztmp 
     2617                        zsgrad = av_ds_bl(ji,jj) * ztmp 
     2618                        zbgrad = av_db_bl(ji,jj) * ztmp 
     2619                        IF ( jk <= nbld(ji,jj) ) THEN 
     2620                           znd = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phml(ji,jj) ) * ztmp 
     2621                           zdtdz_pyc =  ztgrad * EXP( -1.75_wp * ( znd + 0.75_wp )**2 ) 
     2622                           zdsdz_pyc =  zsgrad * EXP( -1.75_wp * ( znd + 0.75_wp )**2 ) 
     2623                           ghamt(ji,jj,jk) = ghamt(ji,jj,jk) + pdiffut(ji,jj,jk) * zdtdz_pyc 
     2624                           ghams(ji,jj,jk) = ghams(ji,jj,jk) + pdiffut(ji,jj,jk) * zdsdz_pyc 
     2625                           IF ( ln_dia_pyc_scl ) THEN 
     2626                              z3ddz_pyc_1(ji,jj,jk) = zdtdz_pyc 
     2627                              z3ddz_pyc_2(ji,jj,jk) = zdsdz_pyc 
     2628                           END IF 
     2629                        END IF 
     2630                     ENDIF   ! IF (shol >=0.5) 
     2631                  ENDIF      ! IF (av_db_bl> 0.) 
     2632               ENDIF         ! IF (zdhdt >= 0) zdhdt < 0 not considered since pycnocline profile is zero and profile arrays are 
     2633               !             !    intialized to zero 
     2634            END IF 
     2635         END IF 
     2636      END_3D 
     2637      IF ( ln_dia_pyc_scl ) THEN   ! Output of pycnocline gradient profiles 
     2638         CALL zdf_osm_iomput( "zdtdz_pyc", wmask(A2D(0),:) * z3ddz_pyc_1(A2D(0),:) ) 
     2639         CALL zdf_osm_iomput( "zdsdz_pyc", wmask(A2D(0),:) * z3ddz_pyc_2(A2D(0),:) ) 
     2640      END IF 
     2641      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jkm_bld ) 
     2642         IF ( .NOT. l_conv (ji,jj) ) THEN 
     2643            IF ( nbld(ji,jj) + kp_ext(ji,jj) < mbkt(ji,jj) ) THEN 
     2644               zugrad = 3.25_wp * av_du_bl(ji,jj) / phbl(ji,jj) 
     2645               zvgrad = 2.75_wp * av_dv_bl(ji,jj) / phbl(ji,jj) 
     2646               IF ( jk <= nbld(ji,jj) ) THEN 
     2647                  znd = gdepw(ji,jj,jk,Kmm) / phbl(ji,jj) 
     2648                  IF ( znd < 1.0 ) THEN 
     2649                     zdudz_pyc = zugrad * EXP( -40.0_wp * ( znd - 1.0_wp )**2 ) 
    22362650                  ELSE 
    2237                      ztau = 0.2 * hbl(ji,jj) / MAX(epsln, (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird) 
    2238                      zdh_ref = 0.2 * hbl(ji,jj) 
     2651                     zdudz_pyc = zugrad * EXP( -20.0_wp * ( znd - 1.0_wp )**2 ) 
    22392652                  ENDIF 
    2240                ELSE 
    2241                   ztau = 0.2 * hbl(ji,jj) /  MAX(epsln, (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird) 
    2242                   zdh_ref = 0.2 * hbl(ji,jj) 
    2243                ENDIF 
    2244             ELSE ! ln_osm_mle 
    2245                IF ( zdb_bl(ji,jj) > 0._wp .and. zdbdz_bl_ext(ji,jj) > 0._wp)THEN 
    2246                   IF ( ( zwstrc(ji,jj) / MAX(zvstr(ji,jj), epsln) )**3 <= 0.5 ) THEN  ! near neutral stability 
    2247                      zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zvstr(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    2248                   ELSE                                                     ! unstable 
    2249                      zari = MIN( 1.5 * zdb_bl(ji,jj) / ( zhbl(ji,jj) * ( MAX(zdbdz_bl_ext(ji,jj),0._wp) + zdb_bl(ji,jj)**2 / MAX(4.5 * zwstrc(ji,jj)**2 , 1.e-12 )) ), 0.2d0 ) 
    2250                   ENDIF 
    2251                   ztau = hbl(ji,jj) / MAX(epsln, (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird) 
    2252                   zdh_ref = zari * hbl(ji,jj) 
    2253                ELSE 
    2254                   ztau = hbl(ji,jj) / MAX(epsln, (zvstr(ji,jj)**3 + 0.5 *zwstrc(ji,jj)**3)**pthird) 
    2255                   zdh_ref = 0.2 * hbl(ji,jj) 
    2256                ENDIF 
    2257  
    2258             END IF  ! ln_osm_mle 
    2259  
    2260             dh(ji,jj) = dh(ji,jj) * EXP( -rn_Dt / ztau ) + zdh_ref * ( 1.0 - EXP( -rn_Dt / ztau ) ) 
    2261 !               IF ( zdhdt(ji,jj) < 0._wp .and. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref 
    2262             IF ( dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref 
    2263             ! Alan: this hml is never defined or used 
    2264          ELSE   ! IF (lconv) 
    2265             ztau = hbl(ji,jj) / MAX(zvstr(ji,jj), epsln) 
    2266             IF ( zdhdt(ji,jj) >= 0.0 ) THEN    ! probably shouldn't include wm here 
    2267                ! boundary layer deepening 
    2268                IF ( zdb_bl(ji,jj) > 0._wp ) THEN 
    2269                   ! pycnocline thickness set by stratification - use same relationship as for neutral conditions. 
    2270                   zari = MIN( 4.5 * ( zvstr(ji,jj)**2 ) & 
    2271                        & /  MAX(zdb_bl(ji,jj) * zhbl(ji,jj), epsln ) + 0.01  , 0.2 ) 
    2272                   zdh_ref = MIN( zari, 0.2 ) * hbl(ji,jj) 
    2273                ELSE 
    2274                   zdh_ref = 0.2 * hbl(ji,jj) 
    2275                ENDIF 
    2276             ELSE     ! IF(dhdt < 0) 
    2277                zdh_ref = 0.2 * hbl(ji,jj) 
    2278             ENDIF    ! IF (dhdt >= 0) 
    2279             dh(ji,jj) = dh(ji,jj) * EXP( -rn_Dt / ztau )+ zdh_ref * ( 1.0 - EXP( -rn_Dt / ztau ) ) 
    2280             IF ( zdhdt(ji,jj) < 0._wp .and. dh(ji,jj) >= hbl(ji,jj) ) dh(ji,jj) = zdh_ref       ! can be a problem with dh>hbl for rapid collapse 
    2281          ENDIF       ! IF (lconv) 
    2282       ENDIF  ! lshear 
    2283  
    2284       hml(ji,jj) = hbl(ji,jj) - dh(ji,jj) 
    2285       inhml = MAX( INT( dh(ji,jj) / MAX(e3t(ji,jj,ibld(ji,jj),Kmm), 1.e-3) ) , 1 ) 
    2286       imld(ji,jj) = MAX( ibld(ji,jj) - inhml, 3) 
    2287       zhml(ji,jj) = gdepw(ji,jj,imld(ji,jj),Kmm) 
    2288       zdh(ji,jj) = zhbl(ji,jj) - zhml(ji,jj) 
    2289     END_2D 
    2290  
    2291     END SUBROUTINE zdf_osm_pycnocline_thickness 
    2292  
    2293  
    2294    SUBROUTINE zdf_osm_zmld_horizontal_gradients( zmld, zdtdx, zdtdy, zdsdx, zdsdy, dbdx_mle, dbdy_mle, zdbds_mle ) 
    2295       !!---------------------------------------------------------------------- 
    2296       !!                  ***  ROUTINE zdf_osm_horizontal_gradients  *** 
    2297       !! 
    2298       !! ** Purpose :   Calculates horizontal gradients of buoyancy for use with Fox-Kemper parametrization. 
     2653                  zdvdz_pyc = zvgrad * EXP( -20.0_wp * ( znd - 0.85_wp )**2 ) 
     2654                  ghamu(ji,jj,jk) = ghamu(ji,jj,jk) + pviscos(ji,jj,jk) * zdudz_pyc 
     2655                  ghamv(ji,jj,jk) = ghamv(ji,jj,jk) + pviscos(ji,jj,jk) * zdvdz_pyc 
     2656                  IF ( ln_dia_pyc_shr ) THEN 
     2657                     z3ddz_pyc_1(ji,jj,jk) = zdudz_pyc 
     2658                     z3ddz_pyc_2(ji,jj,jk) = zdvdz_pyc 
     2659                  END IF 
     2660               END IF 
     2661            END IF 
     2662         END IF 
     2663      END_3D 
     2664      IF ( ln_dia_pyc_shr ) THEN   ! Output of pycnocline shear profiles 
     2665         CALL zdf_osm_iomput( "zdudz_pyc", wmask(A2D(0),:) * z3ddz_pyc_1(A2D(0),:) ) 
     2666         CALL zdf_osm_iomput( "zdvdz_pyc", wmask(A2D(0),:) * z3ddz_pyc_2(A2D(0),:) ) 
     2667      END IF 
     2668      IF ( ln_dia_osm ) THEN 
     2669         CALL zdf_osm_iomput( "ghamu_b", wmask(A2D(0),:) * ghamu(A2D(0),:) ) 
     2670         CALL zdf_osm_iomput( "ghamv_b", wmask(A2D(0),:) * ghamv(A2D(0),:) ) 
     2671      END IF 
     2672      IF ( ln_dia_pyc_scl .OR. ln_dia_pyc_shr ) THEN   ! Deallocate arrays used for output of pycnocline gradient/shear profiles 
     2673         DEALLOCATE( z3ddz_pyc_1, z3ddz_pyc_2 ) 
     2674      END IF 
     2675      ! 
     2676      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2677         ghamt(ji,jj,nbld(ji,jj)) = 0.0_wp 
     2678         ghams(ji,jj,nbld(ji,jj)) = 0.0_wp 
     2679         ghamu(ji,jj,nbld(ji,jj)) = 0.0_wp 
     2680         ghamv(ji,jj,nbld(ji,jj)) = 0.0_wp 
     2681      END_2D 
     2682      ! 
     2683      IF ( ln_dia_osm ) THEN 
     2684         CALL zdf_osm_iomput( "ghamu_1", wmask(A2D(0),:) * ghamu(A2D(0),:)   ) 
     2685         CALL zdf_osm_iomput( "ghamv_1", wmask(A2D(0),:) * ghamv(A2D(0),:)   ) 
     2686         CALL zdf_osm_iomput( "zviscos", wmask(A2D(0),:) * pviscos(A2D(0),:) ) 
     2687      END IF 
     2688      ! 
     2689   END SUBROUTINE zdf_osm_fgr_terms 
     2690 
     2691   SUBROUTINE zdf_osm_zmld_horizontal_gradients( Kmm, pmld, pdtdx, pdtdy, pdsdx,   & 
     2692      &                                          pdsdy, pdbds_mle ) 
     2693      !!---------------------------------------------------------------------- 
     2694      !!          ***  ROUTINE zdf_osm_zmld_horizontal_gradients  *** 
     2695      !! 
     2696      !! ** Purpose : Calculates horizontal gradients of buoyancy for use with 
     2697      !!              Fox-Kemper parametrization 
    22992698      !! 
    23002699      !! ** Method  : 
     
    23022701      !! References: Fox-Kemper et al., JPO, 38, 1145-1165, 2008 
    23032702      !!             Fox-Kemper and Ferrari, JPO, 38, 1166-1179, 2008 
    2304  
    2305  
    2306       REAL(wp), DIMENSION(jpi,jpj)     :: dbdx_mle, dbdy_mle ! MLE horiz gradients at u & v points 
    2307       REAL(wp), DIMENSION(jpi,jpj)     :: zdbds_mle ! Magnitude of horizontal buoyancy gradient. 
    2308       REAL(wp), DIMENSION(jpi,jpj)     :: zmld ! ==  estimated FK BLD used for MLE horiz gradients  == ! 
    2309       REAL(wp), DIMENSION(jpi,jpj)     :: zdtdx, zdtdy, zdsdx, zdsdy 
    2310  
    2311       INTEGER  ::   ji, jj, jk          ! dummy loop indices 
    2312       INTEGER  ::   ii, ij, ik, ikmax   ! local integers 
    2313       REAL(wp)                         :: zc 
    2314       REAL(wp)                         :: zN2_c           ! local buoyancy difference from 10m value 
    2315       REAL(wp), DIMENSION(jpi,jpj)     :: ztm, zsm, zLf_NH, zLf_MH 
    2316       REAL(wp), DIMENSION(jpi,jpj,jpts):: ztsm_midu, ztsm_midv, zabu, zabv 
    2317       REAL(wp), DIMENSION(jpi,jpj)     :: zmld_midu, zmld_midv 
    2318 !!---------------------------------------------------------------------- 
    2319       ! 
    2320       !                                      !==  MLD used for MLE  ==! 
    2321  
    2322       mld_prof(:,:)  = nlb10               ! Initialization to the number of w ocean point 
    2323       zmld(:,:)  = 0._wp               ! here hmlp used as a dummy variable, integrating vertically N^2 
    2324       zN2_c = grav * rn_osm_mle_rho_c * r1_rho0   ! convert density criteria into N^2 criteria 
    2325       DO_3D( 1, 1, 1, 1, nlb10, jpkm1 ) 
     2703      !! 
     2704      !!---------------------------------------------------------------------- 
     2705      INTEGER,                            INTENT(in   ) ::   Kmm          ! Time-level index 
     2706      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(  out) ::   pmld         ! == Estimated FK BLD used for MLE horizontal gradients == ! 
     2707      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdtdx        ! Horizontal gradient for Fox-Kemper parametrization 
     2708      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdtdy        ! Horizontal gradient for Fox-Kemper parametrization 
     2709      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdsdx        ! Horizontal gradient for Fox-Kemper parametrization 
     2710      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(inout) ::   pdsdy        ! Horizontal gradient for Fox-Kemper parametrization 
     2711      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdbds_mle    ! Magnitude of horizontal buoyancy gradient 
     2712      !! 
     2713      INTEGER                               ::   ji, jj, jk   ! Dummy loop indices 
     2714      INTEGER,  DIMENSION(A2D(nn_hls))      ::   jk_mld_prof  ! Base level of MLE layer 
     2715      INTEGER                               ::   ikt, ikmax   ! Local integers       
     2716      REAL(wp)                              ::   zc 
     2717      REAL(wp)                              ::   zN2_c        ! Local buoyancy difference from 10m value 
     2718      REAL(wp), DIMENSION(A2D(nn_hls))      ::   ztm 
     2719      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zsm 
     2720      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   ztsm_midu 
     2721      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   ztsm_midv 
     2722      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   zabu 
     2723      REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::   zabv 
     2724      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zmld_midu 
     2725      REAL(wp), DIMENSION(A2D(nn_hls))      ::   zmld_midv 
     2726      !!---------------------------------------------------------------------- 
     2727      ! 
     2728      ! ==  MLD used for MLE  ==! 
     2729      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     2730         jk_mld_prof(ji,jj) = nlb10    ! Initialization to the number of w ocean point 
     2731         pmld(ji,jj)        = 0.0_wp   ! Here hmlp used as a dummy variable, integrating vertically N^2 
     2732      END_2D 
     2733      zN2_c = grav * rn_osm_mle_rho_c * r1_rho0   ! Convert density criteria into N^2 criteria 
     2734      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, nlb10, jpkm1 ) 
    23262735         ikt = mbkt(ji,jj) 
    2327          zmld(ji,jj) = zmld(ji,jj) + MAX( rn2b(ji,jj,jk) , 0._wp ) * e3w(ji,jj,jk,Kmm) 
    2328          IF( zmld(ji,jj) < zN2_c )   mld_prof(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level 
     2736         pmld(ji,jj) = pmld(ji,jj) + MAX( rn2b(ji,jj,jk), 0.0_wp ) * e3w(ji,jj,jk,Kmm) 
     2737         IF( pmld(ji,jj) < zN2_c ) jk_mld_prof(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level 
    23292738      END_3D 
    2330       DO_2D( 1, 1, 1, 1 ) 
    2331          mld_prof(ji,jj) = MAX(mld_prof(ji,jj),ibld(ji,jj)) 
    2332          zmld(ji,jj) = gdepw(ji,jj,mld_prof(ji,jj),Kmm) 
    2333       END_2D 
    2334       ! ensure mld_prof .ge. ibld 
    2335       ! 
    2336       ikmax = MIN( MAXVAL( mld_prof(:,:) ), jpkm1 )                  ! max level of the computation 
    2337       ! 
    2338       ztm(:,:) = 0._wp 
    2339       zsm(:,:) = 0._wp 
    2340       DO_3D( 1, 1, 1, 1, 1, ikmax ) 
    2341          zc = e3t(ji,jj,jk,Kmm) * REAL( MIN( MAX( 0, mld_prof(ji,jj)-jk ) , 1  )  )    ! zc being 0 outside the ML t-points 
     2739      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     2740         jk_mld_prof(ji,jj) = MAX( jk_mld_prof(ji,jj), nbld(ji,jj) )   ! Ensure jk_mld_prof .ge. nbld 
     2741         pmld(ji,jj)     = gdepw(ji,jj,jk_mld_prof(ji,jj),Kmm) 
     2742      END_2D 
     2743      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2744         mld_prof(ji,jj) = jk_mld_prof(ji,jj) 
     2745      END_2D 
     2746      ! 
     2747      ikmax = MIN( MAXVAL( jk_mld_prof(A2D(nn_hls)) ), jpkm1 )   ! Max level of the computation 
     2748      ztm(:,:) = 0.0_wp 
     2749      zsm(:,:) = 0.0_wp 
     2750      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, ikmax ) 
     2751         zc = e3t(ji,jj,jk,Kmm) * REAL( MIN( MAX( 0, jk_mld_prof(ji,jj) - jk ), 1  ), KIND=wp )   ! zc being 0 outside the ML 
     2752         !                                                                                        !    t-points 
    23422753         ztm(ji,jj) = ztm(ji,jj) + zc * ts(ji,jj,jk,jp_tem,Kmm) 
    23432754         zsm(ji,jj) = zsm(ji,jj) + zc * ts(ji,jj,jk,jp_sal,Kmm) 
    23442755      END_3D 
    2345       ! average temperature and salinity. 
    2346       ztm(:,:) = ztm(:,:) / MAX( e3t(:,:,1,Kmm), zmld(:,:) ) 
    2347       zsm(:,:) = zsm(:,:) / MAX( e3t(:,:,1,Kmm), zmld(:,:) ) 
    2348       ! calculate horizontal gradients at u & v points 
    2349  
    2350       DO_2D( 1, 0, 0, 0 ) 
    2351          zdtdx(ji,jj) = ( ztm(ji+1,jj) - ztm( ji,jj) )  * umask(ji,jj,1) / e1u(ji,jj) 
    2352          zdsdx(ji,jj) = ( zsm(ji+1,jj) - zsm( ji,jj) )  * umask(ji,jj,1) / e1u(ji,jj) 
    2353          zmld_midu(ji,jj) = 0.25_wp * (zmld(ji+1,jj) + zmld( ji,jj)) 
    2354          ztsm_midu(ji,jj,jp_tem) = 0.5_wp * ( ztm(ji+1,jj) + ztm( ji,jj) ) 
    2355          ztsm_midu(ji,jj,jp_sal) = 0.5_wp * ( zsm(ji+1,jj) + zsm( ji,jj) ) 
    2356       END_2D 
    2357  
    2358       DO_2D( 0, 0, 1, 0 ) 
    2359          zdtdy(ji,jj) = ( ztm(ji,jj+1) - ztm( ji,jj) ) * vmask(ji,jj,1) / e1v(ji,jj) 
    2360          zdsdy(ji,jj) = ( zsm(ji,jj+1) - zsm( ji,jj) ) * vmask(ji,jj,1) / e1v(ji,jj) 
    2361          zmld_midv(ji,jj) = 0.25_wp * (zmld(ji,jj+1) + zmld( ji,jj)) 
    2362          ztsm_midv(ji,jj,jp_tem) = 0.5_wp * ( ztm(ji,jj+1) + ztm( ji,jj) ) 
    2363          ztsm_midv(ji,jj,jp_sal) = 0.5_wp * ( zsm(ji,jj+1) + zsm( ji,jj) ) 
    2364       END_2D 
    2365  
    2366       CALL eos_rab(ztsm_midu, zmld_midu, zabu, Kmm) 
    2367       CALL eos_rab(ztsm_midv, zmld_midv, zabv, Kmm) 
    2368  
    2369       DO_2D( 1, 0, 0, 0 ) 
    2370          dbdx_mle(ji,jj) = grav*(zdtdx(ji,jj)*zabu(ji,jj,jp_tem) - zdsdx(ji,jj)*zabu(ji,jj,jp_sal)) 
    2371       END_2D 
    2372       DO_2D( 0, 0, 1, 0 ) 
    2373          dbdy_mle(ji,jj) = grav*(zdtdy(ji,jj)*zabv(ji,jj,jp_tem) - zdsdy(ji,jj)*zabv(ji,jj,jp_sal)) 
    2374       END_2D 
    2375  
    2376       DO_2D( 0, 0, 0, 0 ) 
    2377         ztmp =  r1_ft(ji,jj) *  MIN( 111.e3_wp , e1u(ji,jj) ) / rn_osm_mle_lf 
    2378         zdbds_mle(ji,jj) = SQRT( 0.5_wp * ( dbdx_mle(ji,jj) * dbdx_mle(ji,jj) + dbdy_mle(ji,jj) * dbdy_mle(ji,jj) & 
    2379              & + dbdx_mle(ji-1,jj) * dbdx_mle(ji-1,jj) + dbdy_mle(ji,jj-1) * dbdy_mle(ji,jj-1) ) ) 
    2380       END_2D 
    2381  
    2382  END SUBROUTINE zdf_osm_zmld_horizontal_gradients 
    2383   SUBROUTINE zdf_osm_mle_parameters( mld_prof, hmle, zhmle, zvel_mle, zdiff_mle ) 
    2384       !!---------------------------------------------------------------------- 
    2385       !!                  ***  ROUTINE zdf_osm_mle_parameters  *** 
    2386       !! 
    2387       !! ** Purpose :   Timesteps the mixed layer eddy depth, hmle and calculates the mixed layer eddy fluxes for buoyancy, heat and salinity. 
     2756      ! Average temperature and salinity 
     2757      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     2758         ztm(ji,jj) = ztm(ji,jj) / MAX( e3t(ji,jj,1,Kmm), pmld(ji,jj) ) 
     2759         zsm(ji,jj) = zsm(ji,jj) / MAX( e3t(ji,jj,1,Kmm), pmld(ji,jj) ) 
     2760      END_2D 
     2761      ! Calculate horizontal gradients at u & v points 
     2762      zmld_midu(:,:)   =  0.0_wp 
     2763      ztsm_midu(:,:,:) = 10.0_wp 
     2764      DO_2D( nn_hls, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2765         pdtdx(ji,jj)            = ( ztm(ji+1,jj) - ztm(ji,jj) )  * umask(ji,jj,1) / e1u(ji,jj) 
     2766         pdsdx(ji,jj)            = ( zsm(ji+1,jj) - zsm(ji,jj) )  * umask(ji,jj,1) / e1u(ji,jj) 
     2767         zmld_midu(ji,jj)        = 0.25_wp * ( pmld(ji+1,jj) + pmld(ji,jj)) 
     2768         ztsm_midu(ji,jj,jp_tem) =  0.5_wp * ( ztm( ji+1,jj)  + ztm( ji,jj) ) 
     2769         ztsm_midu(ji,jj,jp_sal) =  0.5_wp * ( zsm( ji+1,jj)  + zsm( ji,jj) ) 
     2770      END_2D 
     2771      zmld_midv(:,:)   =  0.0_wp 
     2772      ztsm_midv(:,:,:) = 10.0_wp 
     2773      DO_2D( nn_hls-1, nn_hls-1, nn_hls, nn_hls-1 ) 
     2774         pdtdy(ji,jj)            = ( ztm(ji,jj+1) - ztm(ji,jj) ) * vmask(ji,jj,1) / e1v(ji,jj) 
     2775         pdsdy(ji,jj)            = ( zsm(ji,jj+1) - zsm(ji,jj) ) * vmask(ji,jj,1) / e1v(ji,jj) 
     2776         zmld_midv(ji,jj)        = 0.25_wp * ( pmld(ji,jj+1) + pmld( ji,jj) ) 
     2777         ztsm_midv(ji,jj,jp_tem) =  0.5_wp * ( ztm( ji,jj+1)  + ztm( ji,jj) ) 
     2778         ztsm_midv(ji,jj,jp_sal) =  0.5_wp * ( zsm( ji,jj+1)  + zsm( ji,jj) ) 
     2779      END_2D 
     2780      CALL eos_rab( ztsm_midu, zmld_midu, zabu, Kmm ) 
     2781      CALL eos_rab( ztsm_midv, zmld_midv, zabv, Kmm ) 
     2782      DO_2D_OVR( nn_hls, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2783         dbdx_mle(ji,jj) = grav * ( pdtdx(ji,jj) * zabu(ji,jj,jp_tem) - pdsdx(ji,jj) * zabu(ji,jj,jp_sal) ) 
     2784      END_2D 
     2785      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls, nn_hls-1 ) 
     2786         dbdy_mle(ji,jj) = grav * ( pdtdy(ji,jj) * zabv(ji,jj,jp_tem) - pdsdy(ji,jj) * zabv(ji,jj,jp_sal) ) 
     2787      END_2D 
     2788      DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2789         pdbds_mle(ji,jj) = SQRT( 0.5_wp * ( dbdx_mle(ji,  jj) * dbdx_mle(ji,  jj) + dbdy_mle(ji,jj  ) * dbdy_mle(ji,jj  ) +   & 
     2790            &                                dbdx_mle(ji-1,jj) * dbdx_mle(ji-1,jj) + dbdy_mle(ji,jj-1) * dbdy_mle(ji,jj-1) ) ) 
     2791      END_2D 
     2792      ! 
     2793   END SUBROUTINE zdf_osm_zmld_horizontal_gradients 
     2794 
     2795   SUBROUTINE zdf_osm_osbl_state_fk( Kmm, pwb_fk, phbl, phmle, pwb_ent,   & 
     2796      &                              pdbds_mle ) 
     2797      !!--------------------------------------------------------------------- 
     2798      !!               ***  ROUTINE zdf_osm_osbl_state_fk  *** 
     2799      !! 
     2800      !! ** Purpose : Determines the state of the OSBL and MLE layer. Info is 
     2801      !!              returned in the logicals l_pyc, l_flux and ldmle. Used 
     2802      !!              with Fox-Kemper scheme. 
     2803      !!                l_pyc  :: determines whether pycnocline flux-grad 
     2804      !!                          relationship needs to be determined 
     2805      !!                l_flux :: determines whether effects of surface flux 
     2806      !!                          extend below the base of the OSBL 
     2807      !!                ldmle  :: determines whether the layer with MLE is 
     2808      !!                          increasing with time or if base is relaxing 
     2809      !!                          towards hbl 
     2810      !! 
     2811      !! ** Method  : 
     2812      !! 
     2813      !!----------------------------------------------------------------------       
     2814      INTEGER,                            INTENT(in   ) ::   Kmm         ! Time-level index 
     2815      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pwb_fk 
     2816      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl        ! BL depth 
     2817      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phmle       ! MLE depth 
     2818      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb_ent     ! Buoyancy entrainment flux 
     2819      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbds_mle   ! Magnitude of horizontal buoyancy gradient 
     2820      !! 
     2821      INTEGER                            ::   ji, jj, jk        ! Dummy loop indices 
     2822      REAL(wp), DIMENSION(A2D(nn_hls-1)) ::   znd_param 
     2823      REAL(wp)                           ::   zthermal, zbeta 
     2824      REAL(wp)                           ::   zbuoy 
     2825      REAL(wp)                           ::   ztmp 
     2826      REAL(wp)                           ::   zpe_mle_layer 
     2827      REAL(wp)                           ::   zpe_mle_ref 
     2828      REAL(wp)                           ::   zdbdz_mle_int 
     2829      !!----------------------------------------------------------------------       
     2830      ! 
     2831      znd_param(:,:) = 0.0_wp 
     2832      ! 
     2833      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2834         ztmp =  r1_ft(ji,jj) *  MIN( 111.e3_wp , e1u(ji,jj) ) / rn_osm_mle_lf 
     2835         pwb_fk(ji,jj) = rn_osm_mle_ce * hmle(ji,jj) * hmle(ji,jj) * ztmp * pdbds_mle(ji,jj) * pdbds_mle(ji,jj) 
     2836      END_2D 
     2837      ! 
     2838      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2839         ! 
     2840         IF ( l_conv(ji,jj) ) THEN 
     2841            IF ( phmle(ji,jj) > 1.2_wp * phbl(ji,jj) ) THEN 
     2842               av_t_mle(ji,jj) = ( av_t_mle(ji,jj) * phmle(ji,jj) - av_t_bl(ji,jj) * phbl(ji,jj) ) / ( phmle(ji,jj) - phbl(ji,jj) ) 
     2843               av_s_mle(ji,jj) = ( av_s_mle(ji,jj) * phmle(ji,jj) - av_s_bl(ji,jj) * phbl(ji,jj) ) / ( phmle(ji,jj) - phbl(ji,jj) ) 
     2844               av_b_mle(ji,jj) = ( av_b_mle(ji,jj) * phmle(ji,jj) - av_b_bl(ji,jj) * phbl(ji,jj) ) / ( phmle(ji,jj) - phbl(ji,jj) ) 
     2845               zdbdz_mle_int = ( av_b_bl(ji,jj) - ( 2.0_wp * av_b_mle(ji,jj) - av_b_bl(ji,jj) ) ) / ( phmle(ji,jj) - phbl(ji,jj) ) 
     2846               ! Calculate potential energies of actual profile and reference profile 
     2847               zpe_mle_layer = 0.0_wp 
     2848               zpe_mle_ref   = 0.0_wp 
     2849               zthermal = rab_n(ji,jj,1,jp_tem) 
     2850               zbeta    = rab_n(ji,jj,1,jp_sal) 
     2851               DO jk = nbld(ji,jj), mld_prof(ji,jj) 
     2852                  zbuoy         = grav * ( zthermal * ts(ji,jj,jk,jp_tem,Kmm) - zbeta * ts(ji,jj,jk,jp_sal,Kmm) ) 
     2853                  zpe_mle_layer = zpe_mle_layer + zbuoy * gdepw(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
     2854                  zpe_mle_ref   = zpe_mle_ref   + ( av_b_bl(ji,jj) - zdbdz_mle_int * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) ) *   & 
     2855                     &                            gdepw(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
     2856               END DO 
     2857               ! Non-dimensional parameter to diagnose the presence of thermocline 
     2858               znd_param(ji,jj) = ( zpe_mle_layer - zpe_mle_ref ) * ABS( ff_t(ji,jj) ) /   & 
     2859                  &               ( MAX( pwb_fk(ji,jj), 1e-10 ) * phmle(ji,jj) ) 
     2860            END IF 
     2861         END IF 
     2862         ! 
     2863      END_2D 
     2864      ! 
     2865      ! Diagnosis 
     2866      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2867         ! 
     2868         IF ( l_conv(ji,jj) ) THEN 
     2869            IF ( -2.0_wp * pwb_fk(ji,jj) / pwb_ent(ji,jj) > 0.5_wp ) THEN 
     2870               IF ( phmle(ji,jj) > 1.2_wp * phbl(ji,jj) ) THEN   ! MLE layer growing 
     2871                  IF ( znd_param (ji,jj) > 100.0_wp ) THEN   ! Thermocline present 
     2872                     l_flux(ji,jj) = .FALSE. 
     2873                     l_mle(ji,jj)  = .FALSE. 
     2874                  ELSE   ! Thermocline not present 
     2875                     l_flux(ji,jj) = .TRUE. 
     2876                     l_mle(ji,jj)  = .TRUE. 
     2877                  ENDIF  ! znd_param > 100 
     2878                  ! 
     2879                  IF ( av_db_bl(ji,jj) < rn_osm_bl_thresh ) THEN 
     2880                     l_pyc(ji,jj) = .FALSE. 
     2881                  ELSE 
     2882                     l_pyc(ji,jj) = .TRUE. 
     2883                  ENDIF 
     2884               ELSE   ! MLE layer restricted to OSBL or just below 
     2885                  IF ( av_db_bl(ji,jj) < rn_osm_bl_thresh ) THEN   ! Weak stratification MLE layer can grow 
     2886                     l_pyc(ji,jj)  = .FALSE. 
     2887                     l_flux(ji,jj) = .TRUE. 
     2888                     l_mle(ji,jj)  = .TRUE. 
     2889                  ELSE   ! Strong stratification 
     2890                     l_pyc(ji,jj)  = .TRUE. 
     2891                     l_flux(ji,jj) = .FALSE. 
     2892                     l_mle(ji,jj)  = .FALSE. 
     2893                  END IF   ! av_db_bl < rn_mle_thresh_bl and 
     2894               END IF   ! phmle > 1.2 phbl 
     2895            ELSE 
     2896               l_pyc(ji,jj)  = .TRUE. 
     2897               l_flux(ji,jj) = .FALSE. 
     2898               l_mle(ji,jj)  = .FALSE. 
     2899               IF ( av_db_bl(ji,jj) < rn_osm_bl_thresh ) l_pyc(ji,jj) = .FALSE. 
     2900            END IF   !  -2.0 * pwb_fk(ji,jj) / pwb_ent > 0.5 
     2901         ELSE   ! Stable Boundary Layer 
     2902            l_pyc(ji,jj)  = .FALSE. 
     2903            l_flux(ji,jj) = .FALSE. 
     2904            l_mle(ji,jj)  = .FALSE. 
     2905         END IF   ! l_conv 
     2906         ! 
     2907      END_2D 
     2908      ! 
     2909   END SUBROUTINE zdf_osm_osbl_state_fk 
     2910 
     2911   SUBROUTINE zdf_osm_mle_parameters( Kmm, pmld, phmle, pvel_mle, pdiff_mle,   & 
     2912      &                               pdbds_mle, phbl, pwb0tot ) 
     2913      !!---------------------------------------------------------------------- 
     2914      !!               ***  ROUTINE zdf_osm_mle_parameters  *** 
     2915      !! 
     2916      !! ** Purpose : Timesteps the mixed layer eddy depth, hmle and calculates 
     2917      !!              the mixed layer eddy fluxes for buoyancy, heat and 
     2918      !!              salinity. 
    23882919      !! 
    23892920      !! ** Method  : 
     
    23912922      !! References: Fox-Kemper et al., JPO, 38, 1145-1165, 2008 
    23922923      !!             Fox-Kemper and Ferrari, JPO, 38, 1166-1179, 2008 
    2393  
    2394       INTEGER, DIMENSION(jpi,jpj)      :: mld_prof 
    2395       REAL(wp), DIMENSION(jpi,jpj)     :: hmle, zhmle, zwb_fk, zvel_mle, zdiff_mle 
    2396       INTEGER  ::   ji, jj, jk          ! dummy loop indices 
    2397       INTEGER  ::   ii, ij, ik, jkb, jkb1  ! local integers 
    2398       INTEGER , DIMENSION(jpi,jpj)     :: inml_mle 
    2399       REAL(wp) ::  ztmp, zdbdz, zdtdz, zdsdz, zthermal,zbeta, zbuoy, zdb_mle 
    2400  
    2401    ! Calculate vertical buoyancy, heat and salinity fluxes due to MLE. 
    2402  
    2403       DO_2D( 0, 0, 0, 0 ) 
    2404        IF ( lconv(ji,jj) ) THEN 
    2405           ztmp =  r1_ft(ji,jj) *  MIN( 111.e3_wp , e1u(ji,jj) ) / rn_osm_mle_lf 
    2406    ! This velocity scale, defined in Fox-Kemper et al (2008), is needed for calculating dhdt. 
    2407           zvel_mle(ji,jj) = zdbds_mle(ji,jj) * ztmp * hmle(ji,jj) * tmask(ji,jj,1) 
    2408           zdiff_mle(ji,jj) = 5.e-4_wp * rn_osm_mle_ce * ztmp * zdbds_mle(ji,jj) * zhmle(ji,jj)**2 
    2409        ENDIF 
    2410       END_2D 
    2411    ! Timestep mixed layer eddy depth. 
    2412       DO_2D( 0, 0, 0, 0 ) 
    2413         IF ( lmle(ji,jj) ) THEN  ! MLE layer growing. 
    2414 ! Buoyancy gradient at base of MLE layer. 
    2415            zthermal = rab_n(ji,jj,1,jp_tem) 
    2416            zbeta    = rab_n(ji,jj,1,jp_sal) 
    2417            jkb = mld_prof(ji,jj) 
    2418            jkb1 = MIN(jkb + 1, mbkt(ji,jj)) 
    2419 ! 
    2420            zbuoy = grav * ( zthermal * ts(ji,jj,mld_prof(ji,jj)+2,jp_tem,Kmm) - zbeta * ts(ji,jj,mld_prof(ji,jj)+2,jp_sal,Kmm) ) 
    2421            zdb_mle = zb_bl(ji,jj) - zbuoy 
    2422 ! Timestep hmle. 
    2423            hmle(ji,jj) = hmle(ji,jj) + zwb0(ji,jj) * rn_Dt / zdb_mle 
    2424         ELSE 
    2425            IF ( zhmle(ji,jj) > zhbl(ji,jj) ) THEN 
    2426               hmle(ji,jj) = hmle(ji,jj) - ( hmle(ji,jj) - hbl(ji,jj) ) * rn_Dt / rn_osm_mle_tau 
    2427            ELSE 
    2428               hmle(ji,jj) = hmle(ji,jj) - 10.0 * ( hmle(ji,jj) - hbl(ji,jj) ) * rn_Dt /rn_osm_mle_tau 
    2429            ENDIF 
    2430         ENDIF 
    2431         hmle(ji,jj) = MIN(hmle(ji,jj), ht(ji,jj)) 
    2432        IF(ln_osm_hmle_limit) hmle(ji,jj) = MIN(hmle(ji,jj), MAX(rn_osm_hmle_limit,1.2*hbl(ji,jj)) ) 
    2433       END_2D 
    2434  
    2435       mld_prof = 4 
    2436       DO_3D( 0, 0, 0, 0, 5, jpkm1 ) 
    2437       IF ( hmle(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) mld_prof(ji,jj) = MIN(mbkt(ji,jj), jk) 
     2924      !! 
     2925      !!---------------------------------------------------------------------- 
     2926      INTEGER,                            INTENT(in   ) ::   Kmm         ! Time-level index 
     2927      REAL(wp), DIMENSION(A2D(nn_hls)),   INTENT(in   ) ::   pmld        ! == Estimated FK BLD used for MLE horiz gradients == ! 
     2928      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   phmle       ! MLE depth 
     2929      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pvel_mle    ! Velocity scale for dhdt with stable ML and FK 
     2930      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(inout) ::   pdiff_mle   ! Extra MLE vertical diff 
     2931      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pdbds_mle   ! Magnitude of horizontal buoyancy gradient 
     2932      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   phbl        ! BL depth 
     2933      REAL(wp), DIMENSION(A2D(nn_hls-1)), INTENT(in   ) ::   pwb0tot     ! Total surface buoyancy flux including insolation 
     2934      !! 
     2935      INTEGER  ::   ji, jj, jk   ! Dummy loop indices 
     2936      REAL(wp) ::   ztmp 
     2937      REAL(wp) ::   zdbdz 
     2938      REAL(wp) ::   zdtdz 
     2939      REAL(wp) ::   zdsdz 
     2940      REAL(wp) ::   zthermal 
     2941      REAL(wp) ::   zbeta 
     2942      REAL(wp) ::   zbuoy 
     2943      REAL(wp) ::   zdb_mle 
     2944      !!---------------------------------------------------------------------- 
     2945      ! 
     2946      ! Calculate vertical buoyancy, heat and salinity fluxes due to MLE 
     2947      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2948         IF ( l_conv(ji,jj) ) THEN 
     2949            ztmp =  r1_ft(ji,jj) * MIN( 111e3_wp, e1u(ji,jj) ) / rn_osm_mle_lf 
     2950            ! This velocity scale, defined in Fox-Kemper et al (2008), is needed for calculating dhdt 
     2951            pvel_mle(ji,jj)  = pdbds_mle(ji,jj) * ztmp * hmle(ji,jj) * tmask(ji,jj,1) 
     2952            pdiff_mle(ji,jj) = 5e-4_wp * rn_osm_mle_ce * ztmp * pdbds_mle(ji,jj) * phmle(ji,jj)**2 
     2953         END IF 
     2954      END_2D 
     2955      ! Timestep mixed layer eddy depth 
     2956      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2957         IF ( l_mle(ji,jj) ) THEN   ! MLE layer growing 
     2958            ! Buoyancy gradient at base of MLE layer 
     2959            zthermal = rab_n(ji,jj,1,jp_tem) 
     2960            zbeta    = rab_n(ji,jj,1,jp_sal) 
     2961            zbuoy = grav * ( zthermal * ts(ji,jj,mld_prof(ji,jj)+2,jp_tem,Kmm) -   & 
     2962               &             zbeta    * ts(ji,jj,mld_prof(ji,jj)+2,jp_sal,Kmm) ) 
     2963            zdb_mle = av_b_bl(ji,jj) - zbuoy 
     2964            ! Timestep hmle 
     2965            hmle(ji,jj) = hmle(ji,jj) + pwb0tot(ji,jj) * rn_Dt / zdb_mle 
     2966         ELSE 
     2967            IF ( phmle(ji,jj) > phbl(ji,jj) ) THEN 
     2968               hmle(ji,jj) = hmle(ji,jj) - ( hmle(ji,jj) - hbl(ji,jj) ) * rn_Dt / rn_osm_mle_tau 
     2969            ELSE 
     2970               hmle(ji,jj) = hmle(ji,jj) - 10.0_wp * ( hmle(ji,jj) - hbl(ji,jj) ) * rn_Dt / rn_osm_mle_tau 
     2971            END IF 
     2972         END IF 
     2973         hmle(ji,jj) = MAX( MIN( hmle(ji,jj), ht(ji,jj) ), gdepw(ji,jj,4,Kmm) ) 
     2974         IF ( ln_osm_hmle_limit ) hmle(ji,jj) = MIN( hmle(ji,jj), rn_osm_hmle_limit*hbl(ji,jj) ) 
     2975         hmle(ji,jj) = pmld(ji,jj)   ! For now try just set hmle to pmld 
     2976      END_2D 
     2977      ! 
     2978      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 5, jpkm1 ) 
     2979         IF ( hmle(ji,jj) >= gdepw(ji,jj,jk,Kmm) ) mld_prof(ji,jj) = MIN( mbkt(ji,jj), jk ) 
    24382980      END_3D 
    2439       DO_2D( 0, 0, 0, 0 ) 
    2440          zhmle(ji,jj) = gdepw(ji,jj, mld_prof(ji,jj),Kmm) 
    2441       END_2D 
    2442 END SUBROUTINE zdf_osm_mle_parameters 
    2443  
    2444 END SUBROUTINE zdf_osm 
    2445  
     2981      DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     2982         phmle(ji,jj) = gdepw(ji,jj,mld_prof(ji,jj),Kmm) 
     2983      END_2D 
     2984      ! 
     2985   END SUBROUTINE zdf_osm_mle_parameters 
    24462986 
    24472987   SUBROUTINE zdf_osm_init( Kmm ) 
    2448      !!---------------------------------------------------------------------- 
    2449      !!                  ***  ROUTINE zdf_osm_init  *** 
    2450      !! 
    2451      !! ** Purpose :   Initialization of the vertical eddy diffivity and 
    2452      !!      viscosity when using a osm turbulent closure scheme 
    2453      !! 
    2454      !! ** Method  :   Read the namosm namelist and check the parameters 
    2455      !!      called at the first timestep (nit000) 
    2456      !! 
    2457      !! ** input   :   Namlist namosm 
    2458      !!---------------------------------------------------------------------- 
    2459      INTEGER, INTENT(in)   ::   Kmm       ! time level 
    2460      INTEGER  ::   ios            ! local integer 
    2461      INTEGER  ::   ji, jj, jk     ! dummy loop indices 
    2462      REAL(wp) :: z1_t2 
    2463      !! 
    2464      NAMELIST/namzdf_osm/ ln_use_osm_la, rn_osm_la, rn_osm_dstokes, nn_ave & 
    2465           & ,nn_osm_wave, ln_dia_osm, rn_osm_hbl0, rn_zdfosm_adjust_sd & 
    2466           & ,ln_kpprimix, rn_riinfty, rn_difri, ln_convmix, rn_difconv, nn_osm_wave & 
    2467           & ,nn_osm_SD_reduce, ln_osm_mle, rn_osm_hblfrac, rn_osm_bl_thresh, ln_zdfosm_ice_shelter 
    2468 ! Namelist for Fox-Kemper parametrization. 
    2469       NAMELIST/namosm_mle/ nn_osm_mle, rn_osm_mle_ce, rn_osm_mle_lf, rn_osm_mle_time, rn_osm_mle_lat,& 
    2470            & rn_osm_mle_rho_c, rn_osm_mle_thresh, rn_osm_mle_tau, ln_osm_hmle_limit, rn_osm_hmle_limit 
    2471  
    2472      !!---------------------------------------------------------------------- 
    2473      ! 
    2474      READ  ( numnam_ref, namzdf_osm, IOSTAT = ios, ERR = 901) 
    2475 901  IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_osm in reference namelist' ) 
    2476  
    2477      READ  ( numnam_cfg, namzdf_osm, IOSTAT = ios, ERR = 902 ) 
    2478 902  IF( ios >  0 ) CALL ctl_nam ( ios , 'namzdf_osm in configuration namelist' ) 
    2479      IF(lwm) WRITE ( numond, namzdf_osm ) 
    2480  
    2481      IF(lwp) THEN                    ! Control print 
    2482         WRITE(numout,*) 
    2483         WRITE(numout,*) 'zdf_osm_init : OSMOSIS Parameterisation' 
    2484         WRITE(numout,*) '~~~~~~~~~~~~' 
    2485         WRITE(numout,*) '   Namelist namzdf_osm : set osm mixing parameters' 
    2486         WRITE(numout,*) '     Use  rn_osm_la                                ln_use_osm_la = ', ln_use_osm_la 
    2487         WRITE(numout,*) '     Use  MLE in OBL, i.e. Fox-Kemper param        ln_osm_mle = ', ln_osm_mle 
    2488         WRITE(numout,*) '     Turbulent Langmuir number                     rn_osm_la   = ', rn_osm_la 
    2489         WRITE(numout,*) '     Stokes drift reduction factor                 rn_zdfosm_adjust_sd   = ', rn_zdfosm_adjust_sd 
    2490         WRITE(numout,*) '     Initial hbl for 1D runs                       rn_osm_hbl0   = ', rn_osm_hbl0 
    2491         WRITE(numout,*) '     Depth scale of Stokes drift                   rn_osm_dstokes = ', rn_osm_dstokes 
    2492         WRITE(numout,*) '     horizontal average flag                       nn_ave      = ', nn_ave 
    2493         WRITE(numout,*) '     Stokes drift                                  nn_osm_wave = ', nn_osm_wave 
    2494         SELECT CASE (nn_osm_wave) 
    2495         CASE(0) 
    2496            WRITE(numout,*) '     calculated assuming constant La#=0.3' 
    2497         CASE(1) 
    2498            WRITE(numout,*) '     calculated from Pierson Moskowitz wind-waves' 
    2499         CASE(2) 
    2500            WRITE(numout,*) '     calculated from ECMWF wave fields' 
     2988      !!---------------------------------------------------------------------- 
     2989      !!                  ***  ROUTINE zdf_osm_init  *** 
     2990      !! 
     2991      !! ** Purpose :   Initialization of the vertical eddy diffivity and 
     2992      !!      viscosity when using a osm turbulent closure scheme 
     2993      !! 
     2994      !! ** Method  :   Read the namosm namelist and check the parameters 
     2995      !!      called at the first timestep (nit000) 
     2996      !! 
     2997      !! ** input   :   Namlists namzdf_osm and namosm_mle 
     2998      !! 
     2999      !!---------------------------------------------------------------------- 
     3000      INTEGER, INTENT(in   ) ::   Kmm   ! Time level 
     3001      !! 
     3002      INTEGER  ::   ios            ! Local integer 
     3003      INTEGER  ::   ji, jj, jk     ! Dummy loop indices 
     3004      REAL(wp) ::   z1_t2 
     3005      !! 
     3006      REAL(wp), PARAMETER ::   pp_large = -1e10_wp 
     3007      !! 
     3008      NAMELIST/namzdf_osm/ ln_use_osm_la,    rn_osm_la,      rn_osm_dstokes,      nn_ave,                nn_osm_wave,        & 
     3009         &                 ln_dia_osm,       rn_osm_hbl0,    rn_zdfosm_adjust_sd, ln_kpprimix,           rn_riinfty,         & 
     3010         &                 rn_difri,         ln_convmix,     rn_difconv,          nn_osm_wave,           nn_osm_SD_reduce,   & 
     3011         &                 ln_osm_mle,       rn_osm_hblfrac, rn_osm_bl_thresh,    ln_zdfosm_ice_shelter 
     3012      !! Namelist for Fox-Kemper parametrization 
     3013      NAMELIST/namosm_mle/ nn_osm_mle,       rn_osm_mle_ce,     rn_osm_mle_lf,  rn_osm_mle_time,  rn_osm_mle_lat,   & 
     3014         &                 rn_osm_mle_rho_c, rn_osm_mle_thresh, rn_osm_mle_tau, ln_osm_hmle_limit, rn_osm_hmle_limit 
     3015      !!---------------------------------------------------------------------- 
     3016      ! 
     3017      READ  ( numnam_ref, namzdf_osm, IOSTAT = ios, ERR = 901) 
     3018901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_osm in reference namelist' ) 
     3019 
     3020      READ  ( numnam_cfg, namzdf_osm, IOSTAT = ios, ERR = 902 ) 
     3021902   IF( ios >  0 ) CALL ctl_nam ( ios , 'namzdf_osm in configuration namelist' ) 
     3022      IF(lwm) WRITE ( numond, namzdf_osm ) 
     3023 
     3024      IF(lwp) THEN                    ! Control print 
     3025         WRITE(numout,*) 
     3026         WRITE(numout,*) 'zdf_osm_init : OSMOSIS Parameterisation' 
     3027         WRITE(numout,*) '~~~~~~~~~~~~' 
     3028         WRITE(numout,*) '   Namelist namzdf_osm : set osm mixing parameters' 
     3029         WRITE(numout,*) '      Use  rn_osm_la                                     ln_use_osm_la         = ', ln_use_osm_la 
     3030         WRITE(numout,*) '      Use  MLE in OBL, i.e. Fox-Kemper param             ln_osm_mle            = ', ln_osm_mle 
     3031         WRITE(numout,*) '      Turbulent Langmuir number                          rn_osm_la             = ', rn_osm_la 
     3032         WRITE(numout,*) '      Stokes drift reduction factor                      rn_zdfosm_adjust_sd   = ', rn_zdfosm_adjust_sd 
     3033         WRITE(numout,*) '      Initial hbl for 1D runs                            rn_osm_hbl0           = ', rn_osm_hbl0 
     3034         WRITE(numout,*) '      Depth scale of Stokes drift                        rn_osm_dstokes        = ', rn_osm_dstokes 
     3035         WRITE(numout,*) '      Horizontal average flag                            nn_ave                = ', nn_ave 
     3036         WRITE(numout,*) '      Stokes drift                                       nn_osm_wave           = ', nn_osm_wave 
     3037         SELECT CASE (nn_osm_wave) 
     3038         CASE(0) 
     3039            WRITE(numout,*) '      Calculated assuming constant La#=0.3' 
     3040         CASE(1) 
     3041            WRITE(numout,*) '      Calculated from Pierson Moskowitz wind-waves' 
     3042         CASE(2) 
     3043            WRITE(numout,*) '      Calculated from ECMWF wave fields' 
    25013044         END SELECT 
    2502         WRITE(numout,*) '     Stokes drift reduction                        nn_osm_SD_reduce', nn_osm_SD_reduce 
    2503         WRITE(numout,*) '     fraction of hbl to average SD over/fit' 
    2504         WRITE(numout,*) '     exponential with nn_osm_SD_reduce = 1 or 2    rn_osm_hblfrac =  ', rn_osm_hblfrac 
    2505         SELECT CASE (nn_osm_SD_reduce) 
    2506         CASE(0) 
    2507            WRITE(numout,*) '     No reduction' 
    2508         CASE(1) 
    2509            WRITE(numout,*) '     Average SD over upper rn_osm_hblfrac of BL' 
    2510         CASE(2) 
    2511            WRITE(numout,*) '     Fit exponential to slope rn_osm_hblfrac of BL' 
    2512         END SELECT 
    2513         WRITE(numout,*) '     reduce surface SD and depth scale under ice   ln_zdfosm_ice_shelter=', ln_zdfosm_ice_shelter 
    2514         WRITE(numout,*) '     Output osm diagnostics                       ln_dia_osm  = ',  ln_dia_osm 
    2515         WRITE(numout,*) '         Threshold used to define BL              rn_osm_bl_thresh  = ', rn_osm_bl_thresh, 'm^2/s' 
    2516         WRITE(numout,*) '     Use KPP-style shear instability mixing       ln_kpprimix = ', ln_kpprimix 
    2517         WRITE(numout,*) '     local Richardson Number limit for shear instability rn_riinfty = ', rn_riinfty 
    2518         WRITE(numout,*) '     maximum shear diffusivity at Rig = 0    (m2/s) rn_difri = ', rn_difri 
    2519         WRITE(numout,*) '     Use large mixing below BL when unstable       ln_convmix = ', ln_convmix 
    2520         WRITE(numout,*) '     diffusivity when unstable below BL     (m2/s) rn_difconv = ', rn_difconv 
    2521      ENDIF 
    2522  
    2523  
    2524      !                              ! Check wave coupling settings ! 
    2525      !                         ! Further work needed - see ticket #2447 ! 
    2526      IF( nn_osm_wave == 2 ) THEN 
    2527         IF (.NOT. ( ln_wave .AND. ln_sdw )) & 
    2528            & CALL ctl_stop( 'zdf_osm_init : ln_zdfosm and nn_osm_wave=2, ln_wave and ln_sdw must be true' ) 
    2529      END IF 
    2530  
    2531      !                              ! allocate zdfosm arrays 
    2532      IF( zdf_osm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_osm_init : unable to allocate arrays' ) 
    2533  
    2534  
    2535      IF( ln_osm_mle ) THEN 
    2536 ! Initialise Fox-Kemper parametrization 
     3045         WRITE(numout,*) '      Stokes drift reduction                             nn_osm_SD_reduce      = ', nn_osm_SD_reduce 
     3046         WRITE(numout,*) '      Fraction of hbl to average SD over/fit' 
     3047         WRITE(numout,*) '      Exponential with nn_osm_SD_reduce = 1 or 2         rn_osm_hblfrac        = ', rn_osm_hblfrac 
     3048         SELECT CASE (nn_osm_SD_reduce) 
     3049         CASE(0) 
     3050            WRITE(numout,*) '     No reduction' 
     3051         CASE(1) 
     3052            WRITE(numout,*) '     Average SD over upper rn_osm_hblfrac of BL' 
     3053         CASE(2) 
     3054            WRITE(numout,*) '     Fit exponential to slope rn_osm_hblfrac of BL' 
     3055         END SELECT 
     3056         WRITE(numout,*) '     Reduce surface SD and depth scale under ice         ln_zdfosm_ice_shelter = ', ln_zdfosm_ice_shelter 
     3057         WRITE(numout,*) '     Output osm diagnostics                              ln_dia_osm            = ', ln_dia_osm 
     3058         WRITE(numout,*) '         Threshold used to define BL                     rn_osm_bl_thresh      = ', rn_osm_bl_thresh,   & 
     3059            &            'm^2/s' 
     3060         WRITE(numout,*) '     Use KPP-style shear instability mixing              ln_kpprimix           = ', ln_kpprimix 
     3061         WRITE(numout,*) '     Local Richardson Number limit for shear instability rn_riinfty            = ', rn_riinfty 
     3062         WRITE(numout,*) '     Maximum shear diffusivity at Rig = 0 (m2/s)         rn_difri              = ', rn_difri 
     3063         WRITE(numout,*) '     Use large mixing below BL when unstable             ln_convmix            = ', ln_convmix 
     3064         WRITE(numout,*) '     Diffusivity when unstable below BL (m2/s)           rn_difconv            = ', rn_difconv 
     3065      ENDIF 
     3066      ! 
     3067      !                              ! Check wave coupling settings ! 
     3068      !                         ! Further work needed - see ticket #2447 ! 
     3069      IF ( nn_osm_wave == 2 ) THEN 
     3070         IF (.NOT. ( ln_wave .AND. ln_sdw )) & 
     3071            & CALL ctl_stop( 'zdf_osm_init : ln_zdfosm and nn_osm_wave=2, ln_wave and ln_sdw must be true' ) 
     3072      END IF 
     3073      ! 
     3074      ! Flags associated with diagnostic output 
     3075      IF ( ln_dia_osm .AND. ( iom_use("zdudz_pyc") .OR. iom_use("zdvdz_pyc") ) )                            ln_dia_pyc_shr = .TRUE. 
     3076      IF ( ln_dia_osm .AND. ( iom_use("zdtdz_pyc") .OR. iom_use("zdsdz_pyc") .OR. iom_use("zdbdz_pyc" ) ) ) ln_dia_pyc_scl = .TRUE. 
     3077      ! 
     3078      ! Allocate zdfosm arrays 
     3079      IF( zdf_osm_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_osm_init : unable to allocate arrays' ) 
     3080      ! 
     3081      IF( ln_osm_mle ) THEN   ! Initialise Fox-Kemper parametrization 
    25373082         READ  ( numnam_ref, namosm_mle, IOSTAT = ios, ERR = 903) 
    2538 903      IF( ios /= 0 )   CALL ctl_nam ( ios , 'namosm_mle in reference namelist') 
    2539  
     3083903      IF( ios /= 0 ) CALL ctl_nam( ios, 'namosm_mle in reference namelist' ) 
    25403084         READ  ( numnam_cfg, namosm_mle, IOSTAT = ios, ERR = 904 ) 
    2541 904      IF( ios >  0 )   CALL ctl_nam ( ios , 'namosm_mle in configuration namelist') 
     3085904      IF( ios >  0 ) CALL ctl_nam( ios, 'namosm_mle in configuration namelist' ) 
    25423086         IF(lwm) WRITE ( numond, namosm_mle ) 
    2543  
    2544          IF(lwp) THEN                     ! Namelist print 
     3087         ! 
     3088         IF(lwp) THEN   ! Namelist print 
    25453089            WRITE(numout,*) 
    25463090            WRITE(numout,*) 'zdf_osm_init : initialise mixed layer eddy (MLE)' 
    25473091            WRITE(numout,*) '~~~~~~~~~~~~~' 
    25483092            WRITE(numout,*) '   Namelist namosm_mle : ' 
    2549             WRITE(numout,*) '         MLE type: =0 standard Fox-Kemper ; =1 new formulation        nn_osm_mle    = ', nn_osm_mle 
    2550             WRITE(numout,*) '         magnitude of the MLE (typical value: 0.06 to 0.08)           rn_osm_mle_ce    = ', rn_osm_mle_ce 
    2551             WRITE(numout,*) '         scale of ML front (ML radius of deformation) (nn_osm_mle=0)      rn_osm_mle_lf     = ', rn_osm_mle_lf, 'm' 
    2552             WRITE(numout,*) '         maximum time scale of MLE                    (nn_osm_mle=0)      rn_osm_mle_time   = ', rn_osm_mle_time, 's' 
    2553             WRITE(numout,*) '         reference latitude (degrees) of MLE coef.    (nn_osm_mle=1)      rn_osm_mle_lat    = ', rn_osm_mle_lat, 'deg' 
    2554             WRITE(numout,*) '         Density difference used to define ML for FK              rn_osm_mle_rho_c  = ', rn_osm_mle_rho_c 
    2555             WRITE(numout,*) '         Threshold used to define MLE for FK                      rn_osm_mle_thresh  = ', rn_osm_mle_thresh, 'm^2/s' 
    2556             WRITE(numout,*) '         Timescale for OSM-FK                                         rn_osm_mle_tau  = ', rn_osm_mle_tau, 's' 
    2557             WRITE(numout,*) '         switch to limit hmle                                      ln_osm_hmle_limit  = ', ln_osm_hmle_limit 
    2558             WRITE(numout,*) '         fraction of zmld to limit hmle to if ln_osm_hmle_limit =.T.  rn_osm_hmle_limit = ', rn_osm_hmle_limit 
    2559          ENDIF         ! 
    2560      ENDIF 
     3093            WRITE(numout,*) '      MLE type: =0 standard Fox-Kemper ; =1 new formulation   nn_osm_mle        = ', nn_osm_mle 
     3094            WRITE(numout,*) '      Magnitude of the MLE (typical value: 0.06 to 0.08)      rn_osm_mle_ce     = ', rn_osm_mle_ce 
     3095            WRITE(numout,*) '      Scale of ML front (ML radius of deform.) (nn_osm_mle=0) rn_osm_mle_lf     = ', rn_osm_mle_lf,    & 
     3096               &            'm' 
     3097            WRITE(numout,*) '      Maximum time scale of MLE                (nn_osm_mle=0) rn_osm_mle_time   = ',   & 
     3098               &            rn_osm_mle_time, 's' 
     3099            WRITE(numout,*) '      Reference latitude (deg) of MLE coef.    (nn_osm_mle=1) rn_osm_mle_lat    = ', rn_osm_mle_lat,   & 
     3100               &            'deg' 
     3101            WRITE(numout,*) '      Density difference used to define ML for FK             rn_osm_mle_rho_c  = ', rn_osm_mle_rho_c 
     3102            WRITE(numout,*) '      Threshold used to define MLE for FK                     rn_osm_mle_thresh = ',   & 
     3103               &            rn_osm_mle_thresh, 'm^2/s' 
     3104            WRITE(numout,*) '      Timescale for OSM-FK                                    rn_osm_mle_tau    = ', rn_osm_mle_tau, 's' 
     3105            WRITE(numout,*) '      Switch to limit hmle                                    ln_osm_hmle_limit = ', ln_osm_hmle_limit 
     3106            WRITE(numout,*) '      hmle limit (fraction of zmld) (ln_osm_hmle_limit = .T.) rn_osm_hmle_limit = ', rn_osm_hmle_limit 
     3107         END IF 
     3108      END IF 
    25613109      ! 
    25623110      IF(lwp) THEN 
    25633111         WRITE(numout,*) 
    2564          IF( ln_osm_mle ) THEN 
     3112         IF ( ln_osm_mle ) THEN 
    25653113            WRITE(numout,*) '   ==>>>   Mixed Layer Eddy induced transport added to OSMOSIS BL calculation' 
    25663114            IF( nn_osm_mle == 0 )   WRITE(numout,*) '              Fox-Kemper et al 2010 formulation' 
     
    25683116         ELSE 
    25693117            WRITE(numout,*) '   ==>>>   Mixed Layer induced transport NOT added to OSMOSIS BL calculation' 
    2570          ENDIF 
    2571       ENDIF 
    2572       ! 
    2573       IF( ln_osm_mle ) THEN                ! MLE initialisation 
     3118         END IF 
     3119      END IF 
     3120      ! 
     3121      IF( ln_osm_mle ) THEN   ! MLE initialisation 
    25743122         ! 
    2575          rb_c = grav * rn_osm_mle_rho_c /rho0        ! Mixed Layer buoyancy criteria 
     3123         rb_c = grav * rn_osm_mle_rho_c / rho0   ! Mixed Layer buoyancy criteria 
    25763124         IF(lwp) WRITE(numout,*) 
    25773125         IF(lwp) WRITE(numout,*) '      ML buoyancy criteria = ', rb_c, ' m/s2 ' 
    25783126         IF(lwp) WRITE(numout,*) '      associated ML density criteria defined in zdfmxl = ', rn_osm_mle_rho_c, 'kg/m3' 
    25793127         ! 
    2580          IF( nn_osm_mle == 0 ) THEN           ! MLE array allocation & initialisation            ! 
    2581 ! 
    2582          ELSEIF( nn_osm_mle == 1 ) THEN           ! MLE array allocation & initialisation 
    2583             rc_f = rn_osm_mle_ce/ (  5.e3_wp * 2._wp * omega * SIN( rad * rn_osm_mle_lat )  ) 
    2584             ! 
    2585          ENDIF 
    2586          !                                ! 1/(f^2+tau^2)^1/2 at t-point (needed in both nn_osm_mle case) 
    2587          z1_t2 = 2.e-5 
    2588          DO_2D( 1, 1, 1, 1 ) 
    2589             r1_ft(ji,jj) = MIN(1./( ABS(ff_t(ji,jj)) + epsln ), ABS(ff_t(ji,jj))/z1_t2**2) 
     3128         IF( nn_osm_mle == 1 ) THEN 
     3129            rc_f = rn_osm_mle_ce / ( 5e3_wp * 2.0_wp * omega * SIN( rad * rn_osm_mle_lat ) ) 
     3130         END IF 
     3131         ! 1/(f^2+tau^2)^1/2 at t-point (needed in both nn_osm_mle case) 
     3132         z1_t2 = 2e-5_wp 
     3133         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     3134            r1_ft(ji,jj) = MIN( 1.0_wp / ( ABS( ff_t(ji,jj)) + epsln ), ABS( ff_t(ji,jj) ) / z1_t2**2 ) 
    25903135         END_2D 
    25913136         ! z1_t2 = 1._wp / ( rn_osm_mle_time * rn_osm_mle_timeji,jj ) 
    25923137         ! r1_ft(:,:) = 1._wp / SQRT(  ff_t(:,:) * ff_t(:,:) + z1_t2  ) 
    25933138         ! 
    2594       ENDIF 
    2595  
    2596      call osm_rst( nit000, Kmm,  'READ' ) !* read or initialize hbl, dh, hmle 
    2597  
    2598  
    2599      IF( ln_zdfddm) THEN 
    2600         IF(lwp) THEN 
    2601            WRITE(numout,*) 
    2602            WRITE(numout,*) '    Double diffusion mixing on temperature and salinity ' 
    2603            WRITE(numout,*) '    CAUTION : done in routine zdfosm, not in routine zdfddm ' 
    2604         ENDIF 
    2605      ENDIF 
    2606  
    2607  
    2608      !set constants not in namelist 
    2609      !----------------------------- 
    2610  
    2611      IF(lwp) THEN 
    2612         WRITE(numout,*) 
    2613      ENDIF 
    2614  
    2615      IF (nn_osm_wave == 0) THEN 
    2616         dstokes(:,:) = rn_osm_dstokes 
    2617      END IF 
    2618  
    2619      ! Horizontal average : initialization of weighting arrays 
    2620      ! ------------------- 
    2621  
    2622      SELECT CASE ( nn_ave ) 
    2623  
    2624      CASE ( 0 )                ! no horizontal average 
    2625         IF(lwp) WRITE(numout,*) '          no horizontal average on avt' 
    2626         IF(lwp) WRITE(numout,*) '          only in very high horizontal resolution !' 
    2627         ! weighting mean arrays etmean 
    2628         !           ( 1  1 ) 
    2629         ! avt = 1/4 ( 1  1 ) 
    2630         ! 
    2631         etmean(:,:,:) = 0.e0 
    2632  
    2633         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    2634            etmean(ji,jj,jk) = tmask(ji,jj,jk)                     & 
    2635                 &  / MAX( 1.,  umask(ji-1,jj  ,jk) + umask(ji,jj,jk)   & 
    2636                 &            + vmask(ji  ,jj-1,jk) + vmask(ji,jj,jk)  ) 
    2637         END_3D 
    2638  
    2639      CASE ( 1 )                ! horizontal average 
    2640         IF(lwp) WRITE(numout,*) '          horizontal average on avt' 
    2641         ! weighting mean arrays etmean 
    2642         !           ( 1/2  1  1/2 ) 
    2643         ! avt = 1/8 ( 1    2  1   ) 
    2644         !           ( 1/2  1  1/2 ) 
    2645         etmean(:,:,:) = 0.e0 
    2646  
    2647         DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    2648            etmean(ji,jj,jk) = tmask(ji, jj,jk)                           & 
    2649                 & / MAX( 1., 2.* tmask(ji,jj,jk)                           & 
    2650                 &      +.5 * ( tmask(ji-1,jj+1,jk) + tmask(ji-1,jj-1,jk)   & 
    2651                 &             +tmask(ji+1,jj+1,jk) + tmask(ji+1,jj-1,jk) ) & 
    2652                 &      +1. * ( tmask(ji-1,jj  ,jk) + tmask(ji  ,jj+1,jk)   & 
    2653                 &             +tmask(ji  ,jj-1,jk) + tmask(ji+1,jj  ,jk) ) ) 
    2654         END_3D 
    2655  
    2656      CASE DEFAULT 
    2657         WRITE(ctmp1,*) '          bad flag value for nn_ave = ', nn_ave 
    2658         CALL ctl_stop( ctmp1 ) 
    2659  
    2660      END SELECT 
    2661  
    2662      ! Initialization of vertical eddy coef. to the background value 
    2663      ! ------------------------------------------------------------- 
    2664      DO jk = 1, jpk 
    2665         avt (:,:,jk) = avtb(jk) * tmask(:,:,jk) 
    2666      END DO 
    2667  
    2668      ! zero the surface flux for non local term and osm mixed layer depth 
    2669      ! ------------------------------------------------------------------ 
    2670      ghamt(:,:,:) = 0. 
    2671      ghams(:,:,:) = 0. 
    2672      ghamu(:,:,:) = 0. 
    2673      ghamv(:,:,:) = 0. 
    2674      ! 
     3139      END IF 
     3140      ! 
     3141      CALL osm_rst( nit000, Kmm,  'READ' )   ! Read or initialize hbl, dh, hmle 
     3142      ! 
     3143      IF ( ln_zdfddm ) THEN 
     3144         IF(lwp) THEN 
     3145            WRITE(numout,*) 
     3146            WRITE(numout,*) '    Double diffusion mixing on temperature and salinity ' 
     3147            WRITE(numout,*) '    CAUTION : done in routine zdfosm, not in routine zdfddm ' 
     3148         END IF 
     3149      END IF 
     3150      ! 
     3151      ! Set constants not in namelist 
     3152      ! ----------------------------- 
     3153      IF(lwp) THEN 
     3154         WRITE(numout,*) 
     3155      END IF 
     3156      ! 
     3157      dstokes(:,:) = pp_large 
     3158      IF (nn_osm_wave == 0) THEN 
     3159         dstokes(:,:) = rn_osm_dstokes 
     3160      END IF 
     3161      ! 
     3162      ! Horizontal average : initialization of weighting arrays 
     3163      ! ------------------- 
     3164      SELECT CASE ( nn_ave ) 
     3165      CASE ( 0 )                ! no horizontal average 
     3166         IF(lwp) WRITE(numout,*) '          no horizontal average on avt' 
     3167         IF(lwp) WRITE(numout,*) '          only in very high horizontal resolution !' 
     3168         ! Weighting mean arrays etmean 
     3169         !           ( 1  1 ) 
     3170         ! avt = 1/4 ( 1  1 ) 
     3171         ! 
     3172         etmean(:,:,:) = 0.0_wp 
     3173         ! 
     3174         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
     3175            etmean(ji,jj,jk) = tmask(ji,jj,jk) / MAX( 1.0_wp, umask(ji-1,jj,  jk) + umask(ji,jj,jk) +   & 
     3176               &                                              vmask(ji,  jj-1,jk) + vmask(ji,jj,jk) ) 
     3177         END_3D 
     3178      CASE ( 1 )                ! horizontal average 
     3179         IF(lwp) WRITE(numout,*) '          horizontal average on avt' 
     3180         ! Weighting mean arrays etmean 
     3181         !           ( 1/2  1  1/2 ) 
     3182         ! avt = 1/8 ( 1    2  1   ) 
     3183         !           ( 1/2  1  1/2 ) 
     3184         etmean(:,:,:) = 0.0_wp 
     3185         ! 
     3186         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
     3187            etmean(ji,jj,jk) = tmask(ji, jj,jk) / MAX( 1.0_wp, 2.0_wp *   tmask(ji,jj,jk) +                               & 
     3188               &                                               0.5_wp * ( tmask(ji-1,jj+1,jk) + tmask(ji-1,jj-1,jk) +     & 
     3189               &                                                          tmask(ji+1,jj+1,jk) + tmask(ji+1,jj-1,jk) ) +   & 
     3190               &                                               1.0_wp * ( tmask(ji-1,jj,  jk) + tmask(ji,  jj+1,jk) +     & 
     3191               &                                                          tmask(ji,  jj-1,jk) + tmask(ji+1,jj,  jk) ) ) 
     3192         END_3D 
     3193      CASE DEFAULT 
     3194         WRITE(ctmp1,*) '          bad flag value for nn_ave = ', nn_ave 
     3195         CALL ctl_stop( ctmp1 ) 
     3196      END SELECT 
     3197      ! 
     3198      ! Initialization of vertical eddy coef. to the background value 
     3199      ! ------------------------------------------------------------- 
     3200      DO jk = 1, jpk 
     3201         avt(:,:,jk) = avtb(jk) * tmask(:,:,jk) 
     3202      END DO 
     3203      ! 
     3204      ! Zero the surface flux for non local term and osm mixed layer depth 
     3205      ! ------------------------------------------------------------------ 
     3206      ghamt(:,:,:) = 0.0_wp 
     3207      ghams(:,:,:) = 0.0_wp 
     3208      ghamu(:,:,:) = 0.0_wp 
     3209      ghamv(:,:,:) = 0.0_wp 
     3210      ! 
     3211      IF ( ln_dia_osm ) THEN   ! Initialise auxiliary arrays for diagnostic output 
     3212         osmdia2d(:,:)   = 0.0_wp 
     3213         osmdia3d(:,:,:) = 0.0_wp 
     3214      END IF 
     3215      ! 
    26753216   END SUBROUTINE zdf_osm_init 
    26763217 
    2677  
    26783218   SUBROUTINE osm_rst( kt, Kmm, cdrw ) 
    2679      !!--------------------------------------------------------------------- 
    2680      !!                   ***  ROUTINE osm_rst  *** 
    2681      !! 
    2682      !! ** Purpose :   Read or write BL fields in restart file 
    2683      !! 
    2684      !! ** Method  :   use of IOM library. If the restart does not contain 
    2685      !!                required fields, they are recomputed from stratification 
    2686      !!---------------------------------------------------------------------- 
    2687  
    2688      INTEGER         , INTENT(in) ::   kt     ! ocean time step index 
    2689      INTEGER         , INTENT(in) ::   Kmm    ! ocean time level index (middle) 
    2690      CHARACTER(len=*), INTENT(in) ::   cdrw   ! "READ"/"WRITE" flag 
    2691  
    2692      INTEGER ::   id1, id2, id3   ! iom enquiry index 
    2693      INTEGER  ::   ji, jj, jk     ! dummy loop indices 
    2694      INTEGER  ::   iiki, ikt ! local integer 
    2695      REAL(wp) ::   zhbf           ! tempory scalars 
    2696      REAL(wp) ::   zN2_c           ! local scalar 
    2697      REAL(wp) ::   rho_c = 0.01_wp    !: density criterion for mixed layer depth 
    2698      INTEGER, DIMENSION(jpi,jpj) :: imld_rst ! level of mixed-layer depth (pycnocline top) 
    2699      !!---------------------------------------------------------------------- 
    2700      ! 
    2701      !!----------------------------------------------------------------------------- 
    2702      ! If READ/WRITE Flag is 'READ', try to get hbl from restart file. If successful then return 
    2703      !!----------------------------------------------------------------------------- 
    2704      IF( TRIM(cdrw) == 'READ'.AND. ln_rstart) THEN 
    2705         id1 = iom_varid( numror, 'wn'   , ldstop = .FALSE. ) 
    2706         IF( id1 > 0 ) THEN                       ! 'wn' exists; read 
    2707            CALL iom_get( numror, jpdom_auto, 'wn', ww ) 
    2708            WRITE(numout,*) ' ===>>>> :  wn read from restart file' 
    2709         ELSE 
    2710            ww(:,:,:) = 0._wp 
    2711            WRITE(numout,*) ' ===>>>> :  wn not in restart file, set to zero initially' 
    2712         END IF 
    2713  
    2714         id1 = iom_varid( numror, 'hbl'   , ldstop = .FALSE. ) 
    2715         id2 = iom_varid( numror, 'dh'   , ldstop = .FALSE. ) 
    2716         IF( id1 > 0 .AND. id2 > 0) THEN                       ! 'hbl' exists; read and return 
    2717            CALL iom_get( numror, jpdom_auto, 'hbl' , hbl  ) 
    2718            CALL iom_get( numror, jpdom_auto, 'dh', dh ) 
    2719            WRITE(numout,*) ' ===>>>> :  hbl & dh read from restart file' 
    2720            IF( ln_osm_mle ) THEN 
    2721               id3 = iom_varid( numror, 'hmle'   , ldstop = .FALSE. ) 
    2722               IF( id3 > 0) THEN 
    2723                  CALL iom_get( numror, jpdom_auto, 'hmle' , hmle ) 
    2724                  WRITE(numout,*) ' ===>>>> :  hmle read from restart file' 
    2725               ELSE 
    2726                  WRITE(numout,*) ' ===>>>> :  hmle not found, set to hbl' 
    2727                  hmle(:,:) = hbl(:,:)            ! Initialise MLE depth. 
    2728               END IF 
    2729            END IF 
    2730            RETURN 
    2731         ELSE                      ! 'hbl' & 'dh' not in restart file, recalculate 
    2732            WRITE(numout,*) ' ===>>>> : previous run without osmosis scheme, hbl computed from stratification' 
    2733         END IF 
    2734      END IF 
    2735  
    2736      !!----------------------------------------------------------------------------- 
    2737      ! If READ/WRITE Flag is 'WRITE', write hbl into the restart file, then return 
    2738      !!----------------------------------------------------------------------------- 
    2739      IF( TRIM(cdrw) == 'WRITE') THEN     !* Write hbl into the restart file, then return 
    2740         IF(lwp) WRITE(numout,*) '---- osm-rst ----' 
    2741          CALL iom_rstput( kt, nitrst, numrow, 'wn'     , ww  ) 
    2742          CALL iom_rstput( kt, nitrst, numrow, 'hbl'    , hbl ) 
    2743          CALL iom_rstput( kt, nitrst, numrow, 'dh'     , dh  ) 
    2744          IF( ln_osm_mle ) THEN 
     3219      !!--------------------------------------------------------------------- 
     3220      !!                   ***  ROUTINE osm_rst  *** 
     3221      !! 
     3222      !! ** Purpose :   Read or write BL fields in restart file 
     3223      !! 
     3224      !! ** Method  :   use of IOM library. If the restart does not contain 
     3225      !!                required fields, they are recomputed from stratification 
     3226      !! 
     3227      !!---------------------------------------------------------------------- 
     3228      INTEGER         , INTENT(in   ) ::   kt     ! Ocean time step index 
     3229      INTEGER         , INTENT(in   ) ::   Kmm    ! Ocean time level index (middle) 
     3230      CHARACTER(len=*), INTENT(in   ) ::   cdrw   ! "READ"/"WRITE" flag 
     3231      !! 
     3232      INTEGER  ::   id1, id2, id3                 ! iom enquiry index 
     3233      INTEGER  ::   ji, jj, jk                    ! Dummy loop indices 
     3234      INTEGER  ::   iiki, ikt                     ! Local integer 
     3235      REAL(wp) ::   zhbf                          ! Tempory scalars 
     3236      REAL(wp) ::   zN2_c                         ! Local scalar 
     3237      REAL(wp) ::   rho_c = 0.01_wp               ! Density criterion for mixed layer depth 
     3238      INTEGER, DIMENSION(jpi,jpj) ::   imld_rst   ! Level of mixed-layer depth (pycnocline top) 
     3239      !!---------------------------------------------------------------------- 
     3240      ! 
     3241      !!----------------------------------------------------------------------------- 
     3242      ! If READ/WRITE Flag is 'READ', try to get hbl from restart file. If successful then return 
     3243      !!----------------------------------------------------------------------------- 
     3244      IF( TRIM(cdrw) == 'READ' .AND. ln_rstart) THEN 
     3245         id1 = iom_varid( numror, 'wn', ldstop = .FALSE. ) 
     3246         IF( id1 > 0 ) THEN   ! 'wn' exists; read 
     3247            CALL iom_get( numror, jpdom_auto, 'wn', ww ) 
     3248            WRITE(numout,*) ' ===>>>> :  wn read from restart file' 
     3249         ELSE 
     3250            ww(:,:,:) = 0.0_wp 
     3251            WRITE(numout,*) ' ===>>>> :  wn not in restart file, set to zero initially' 
     3252         END IF 
     3253         ! 
     3254         id1 = iom_varid( numror, 'hbl', ldstop = .FALSE. ) 
     3255         id2 = iom_varid( numror, 'dh',  ldstop = .FALSE. ) 
     3256         IF( id1 > 0 .AND. id2 > 0 ) THEN   ! 'hbl' exists; read and return 
     3257            CALL iom_get( numror, jpdom_auto, 'hbl', hbl  ) 
     3258            CALL iom_get( numror, jpdom_auto, 'dh',  dh   ) 
     3259            hml(:,:) = hbl(:,:) - dh(:,:)   ! Initialise ML depth 
     3260            WRITE(numout,*) ' ===>>>> :  hbl & dh read from restart file' 
     3261            IF( ln_osm_mle ) THEN 
     3262               id3 = iom_varid( numror, 'hmle', ldstop = .FALSE. ) 
     3263               IF( id3 > 0 ) THEN 
     3264                  CALL iom_get( numror, jpdom_auto, 'hmle', hmle ) 
     3265                  WRITE(numout,*) ' ===>>>> :  hmle read from restart file' 
     3266               ELSE 
     3267                  WRITE(numout,*) ' ===>>>> :  hmle not found, set to hbl' 
     3268                  hmle(:,:) = hbl(:,:)   ! Initialise MLE depth 
     3269               END IF 
     3270            END IF 
     3271            RETURN 
     3272         ELSE   ! 'hbl' & 'dh' not in restart file, recalculate 
     3273            WRITE(numout,*) ' ===>>>> : previous run without osmosis scheme, hbl computed from stratification' 
     3274         END IF 
     3275      END IF 
     3276      ! 
     3277      !!----------------------------------------------------------------------------- 
     3278      ! If READ/WRITE Flag is 'WRITE', write hbl into the restart file, then return 
     3279      !!----------------------------------------------------------------------------- 
     3280      IF ( TRIM(cdrw) == 'WRITE' ) THEN 
     3281         IF(lwp) WRITE(numout,*) '---- osm-rst ----' 
     3282         CALL iom_rstput( kt, nitrst, numrow, 'wn',  ww  ) 
     3283         CALL iom_rstput( kt, nitrst, numrow, 'hbl', hbl ) 
     3284         CALL iom_rstput( kt, nitrst, numrow, 'dh',  dh  ) 
     3285         IF ( ln_osm_mle ) THEN 
    27453286            CALL iom_rstput( kt, nitrst, numrow, 'hmle', hmle ) 
    27463287         END IF 
    2747         RETURN 
    2748      END IF 
    2749  
    2750      !!----------------------------------------------------------------------------- 
    2751      ! Getting hbl, no restart file with hbl, so calculate from surface stratification 
    2752      !!----------------------------------------------------------------------------- 
    2753      IF( lwp ) WRITE(numout,*) ' ===>>>> : calculating hbl computed from stratification' 
    2754      ! w-level of the mixing and mixed layers 
    2755      CALL eos_rab( CASTWP(ts(:,:,:,:,Kmm)), rab_n, Kmm ) 
    2756      CALL bn2(CASTWP(ts(:,:,:,:,Kmm)), rab_n, rn2, Kmm) 
    2757      imld_rst(:,:)  = nlb10         ! Initialization to the number of w ocean point 
    2758      hbl(:,:)  = 0._wp              ! here hbl used as a dummy variable, integrating vertically N^2 
    2759      zN2_c = grav * rho_c * r1_rho0 ! convert density criteria into N^2 criteria 
    2760      ! 
    2761      hbl(:,:)  = 0._wp              ! here hbl used as a dummy variable, integrating vertically N^2 
    2762      DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 
    2763         ikt = mbkt(ji,jj) 
    2764         hbl(ji,jj) = hbl(ji,jj) + MAX( rn2(ji,jj,jk) , 0._wp ) * e3w(ji,jj,jk,Kmm) 
    2765         IF( hbl(ji,jj) < zN2_c )   imld_rst(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level 
    2766      END_3D 
    2767      ! 
    2768      DO_2D( 1, 1, 1, 1 ) 
    2769         iiki = MAX(4,imld_rst(ji,jj)) 
    2770         hbl (ji,jj) = gdepw(ji,jj,iiki,Kmm  )    ! Turbocline depth 
    2771         dh (ji,jj) = e3t(ji,jj,iiki-1,Kmm  )     ! Turbocline depth 
    2772      END_2D 
    2773  
    2774      WRITE(numout,*) ' ===>>>> : hbl computed from stratification' 
    2775  
    2776      IF( ln_osm_mle ) THEN 
    2777         hmle(:,:) = hbl(:,:)            ! Initialise MLE depth. 
    2778         WRITE(numout,*) ' ===>>>> : hmle set = to hbl' 
    2779      END IF 
    2780  
    2781      ww(:,:,:) = 0._wp 
    2782      WRITE(numout,*) ' ===>>>> :  wn not in restart file, set to zero initially' 
     3288         RETURN 
     3289      END IF 
     3290      ! 
     3291      !!----------------------------------------------------------------------------- 
     3292      ! Getting hbl, no restart file with hbl, so calculate from surface stratification 
     3293      !!----------------------------------------------------------------------------- 
     3294      IF( lwp ) WRITE(numout,*) ' ===>>>> : calculating hbl computed from stratification' 
     3295      ! w-level of the mixing and mixed layers 
     3296      CALL eos_rab( CASTWP(ts(:,:,:,:,Kmm)), rab_n, Kmm ) 
     3297      CALL bn2( CASTWP(ts(:,:,:,:,Kmm)), rab_n, rn2, Kmm ) 
     3298      imld_rst(:,:) = nlb10            ! Initialization to the number of w ocean point 
     3299      hbl(:,:) = 0.0_wp                ! Here hbl used as a dummy variable, integrating vertically N^2 
     3300      zN2_c = grav * rho_c * r1_rho0   ! Convert density criteria into N^2 criteria 
     3301      ! 
     3302      hbl(:,:)  = 0.0_wp   ! Here hbl used as a dummy variable, integrating vertically N^2 
     3303      DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     3304         ikt = mbkt(ji,jj) 
     3305         hbl(ji,jj) = hbl(ji,jj) + MAX( rn2(ji,jj,jk) , 0.0_wp ) * e3w(ji,jj,jk,Kmm) 
     3306         IF ( hbl(ji,jj) < zN2_c ) imld_rst(ji,jj) = MIN( jk , ikt ) + 1   ! Mixed layer level 
     3307      END_3D 
     3308      ! 
     3309      DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     3310         iiki = MAX( 4, imld_rst(ji,jj) ) 
     3311         hbl(ji,jj) = gdepw(ji,jj,iiki,Kmm  )   ! Turbocline depth 
     3312         dh(ji,jj)  = e3t(ji,jj,iiki-1,Kmm  )   ! Turbocline depth 
     3313         hml(ji,jj) = hbl(ji,jj) - dh(ji,jj) 
     3314      END_2D 
     3315      ! 
     3316      WRITE(numout,*) ' ===>>>> : hbl computed from stratification' 
     3317      ! 
     3318      IF( ln_osm_mle ) THEN 
     3319         hmle(:,:) = hbl(:,:)            ! Initialise MLE depth. 
     3320         WRITE(numout,*) ' ===>>>> : hmle set = to hbl' 
     3321      END IF 
     3322      ! 
     3323      ww(:,:,:) = 0.0_wp 
     3324      WRITE(numout,*) ' ===>>>> :  wn not in restart file, set to zero initially' 
     3325      ! 
    27833326   END SUBROUTINE osm_rst 
    27843327 
    2785  
    27863328   SUBROUTINE tra_osm( kt, Kmm, pts, Krhs ) 
    27873329      !!---------------------------------------------------------------------- 
     
    27913333      !! 
    27923334      !! ** Method  :   ??? 
    2793       !!---------------------------------------------------------------------- 
     3335      !! 
     3336      !!---------------------------------------------------------------------- 
     3337      INTEGER                                  , INTENT(in   ) ::   kt          ! Time step index 
     3338      INTEGER                                  , INTENT(in   ) ::   Kmm, Krhs   ! Time level indices 
     3339      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts         ! Active tracers and RHS of tracer equation 
     3340      !! 
     3341      INTEGER                                 ::   ji, jj, jk 
    27943342      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds   ! 3D workspace 
    27953343      !!---------------------------------------------------------------------- 
    2796       INTEGER                                  , INTENT(in)    :: kt        ! time step index 
    2797       INTEGER                                  , INTENT(in)    :: Kmm, Krhs ! time level indices 
    2798       REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation 
    2799       ! 
    2800       INTEGER :: ji, jj, jk 
    2801       ! 
    2802       IF( kt == nit000 ) THEN 
    2803          IF( ntile == 0 .OR. ntile == 1 ) THEN                    ! Do only on the first tile 
     3344      ! 
     3345      IF ( kt == nit000 ) THEN 
     3346         IF ( ntile == 0 .OR. ntile == 1 ) THEN   ! Do only on the first tile 
    28043347            IF(lwp) WRITE(numout,*) 
    28053348            IF(lwp) WRITE(numout,*) 'tra_osm : OSM non-local tracer fluxes' 
    28063349            IF(lwp) WRITE(numout,*) '~~~~~~~   ' 
    2807          ENDIF 
    2808       ENDIF 
    2809  
    2810       IF( l_trdtra )   THEN                    !* Save ta and sa trends 
    2811          ALLOCATE( ztrdt(jpi,jpj,jpk) )   ;    ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 
    2812          ALLOCATE( ztrds(jpi,jpj,jpk) )   ;    ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) 
    2813       ENDIF 
    2814  
     3350         END IF 
     3351      END IF 
     3352      ! 
     3353      IF ( l_trdtra ) THEN   ! Save ta and sa trends 
     3354         ALLOCATE( ztrdt(jpi,jpj,jpk), ztrds(jpi,jpj,jpk) ) 
     3355         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) 
     3356         ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) 
     3357      END IF 
     3358      ! 
    28153359      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    28163360         pts(ji,jj,jk,jp_tem,Krhs) =  pts(ji,jj,jk,jp_tem,Krhs)                      & 
     
    28213365            &                    - ghams(ji,jj,jk+1) ) / e3t(ji,jj,jk,Kmm) 
    28223366      END_3D 
    2823  
    2824       ! save the non-local tracer flux trends for diagnostics 
    2825       IF( l_trdtra )   THEN 
     3367      ! 
     3368      IF ( l_trdtra ) THEN   ! Save the non-local tracer flux trends for diagnostics 
    28263369         ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 
    28273370         ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:) 
    2828  
    28293371         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_osm, ztrdt ) 
    28303372         CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_osm, ztrds ) 
    2831          DEALLOCATE( ztrdt )      ;     DEALLOCATE( ztrds ) 
    2832       ENDIF 
    2833  
    2834       IF(sn_cfctl%l_prtctl) THEN 
     3373         DEALLOCATE( ztrdt, ztrds ) 
     3374      END IF 
     3375      ! 
     3376      IF ( sn_cfctl%l_prtctl ) THEN 
    28353377         CALL prt_ctl( tab3d_1=CASTWP(pts(:,:,:,jp_tem,Krhs)), clinfo1=' osm  - Ta: ', mask1=tmask,   & 
    2836          &             tab3d_2=CASTWP(pts(:,:,:,jp_sal,Krhs)), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    2837       ENDIF 
     3378            &          tab3d_2=CASTWP(pts(:,:,:,jp_sal,Krhs)), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     3379      END IF 
    28383380      ! 
    28393381   END SUBROUTINE tra_osm 
    28403382 
    2841  
    2842    SUBROUTINE trc_osm( kt )          ! Dummy routine 
     3383   SUBROUTINE trc_osm( kt )   ! Dummy routine 
    28433384      !!---------------------------------------------------------------------- 
    28443385      !!                  ***  ROUTINE trc_osm  *** 
     
    28493390      !! 
    28503391      !! ** Method  :   ??? 
    2851       !!---------------------------------------------------------------------- 
    2852       ! 
     3392      !! 
    28533393      !!---------------------------------------------------------------------- 
    28543394      INTEGER, INTENT(in) :: kt 
     3395      !!---------------------------------------------------------------------- 
     3396      ! 
    28553397      WRITE(*,*) 'trc_osm: Not written yet', kt 
     3398      ! 
    28563399   END SUBROUTINE trc_osm 
    2857  
    28583400 
    28593401   SUBROUTINE dyn_osm( kt, Kmm, puu, pvv, Krhs ) 
     
    28653407      !! 
    28663408      !! ** Method  :   ??? 
    2867       !!---------------------------------------------------------------------- 
    2868       INTEGER                             , INTENT( in )  ::  kt          ! ocean time step index 
    2869       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices 
    2870       REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation 
    2871       ! 
     3409      !! 
     3410      !!---------------------------------------------------------------------- 
     3411      INTEGER                             , INTENT(in   ) ::   kt          ! Ocean time step index 
     3412      INTEGER                             , INTENT(in   ) ::   Kmm, Krhs   ! Ocean time level indices 
     3413      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! Ocean velocities and RHS of momentum equation 
     3414      !! 
    28723415      INTEGER :: ji, jj, jk   ! dummy loop indices 
    28733416      !!---------------------------------------------------------------------- 
    28743417      ! 
    2875       IF( kt == nit000 ) THEN 
     3418      IF ( kt == nit000 ) THEN 
    28763419         IF(lwp) WRITE(numout,*) 
    28773420         IF(lwp) WRITE(numout,*) 'dyn_osm : OSM non-local velocity' 
    28783421         IF(lwp) WRITE(numout,*) '~~~~~~~   ' 
    2879       ENDIF 
    2880       !code saving tracer trends removed, replace with trdmxl_oce 
    2881  
    2882       DO_3D( 0, 0, 0, 0, 1, jpkm1 )       ! add non-local u and v fluxes 
    2883          puu(ji,jj,jk,Krhs) =  puu(ji,jj,jk,Krhs)                      & 
    2884             &                 - (  ghamu(ji,jj,jk  )  & 
    2885             &                    - ghamu(ji,jj,jk+1) ) / e3u(ji,jj,jk,Kmm) 
    2886          pvv(ji,jj,jk,Krhs) =  pvv(ji,jj,jk,Krhs)                      & 
    2887             &                 - (  ghamv(ji,jj,jk  )  & 
    2888             &                    - ghamv(ji,jj,jk+1) ) / e3v(ji,jj,jk,Kmm) 
     3422      END IF 
     3423      ! 
     3424      ! Code saving tracer trends removed, replace with trdmxl_oce 
     3425      ! 
     3426      DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! Add non-local u and v fluxes 
     3427         puu(ji,jj,jk,Krhs) =  puu(ji,jj,jk,Krhs) - ( ghamu(ji,jj,jk  ) -   & 
     3428            &                                         ghamu(ji,jj,jk+1) ) / e3u(ji,jj,jk,Kmm) 
     3429         pvv(ji,jj,jk,Krhs) =  pvv(ji,jj,jk,Krhs) - ( ghamv(ji,jj,jk  ) -   & 
     3430            &                                         ghamv(ji,jj,jk+1) ) / e3v(ji,jj,jk,Kmm) 
    28893431      END_3D 
    28903432      ! 
    2891       ! code for saving tracer trends removed 
     3433      ! Code for saving tracer trends removed 
    28923434      ! 
    28933435   END SUBROUTINE dyn_osm 
    28943436 
     3437   SUBROUTINE zdf_osm_iomput_2d( cdname, posmdia2d ) 
     3438      !!---------------------------------------------------------------------- 
     3439      !!                ***  ROUTINE zdf_osm_iomput_2d  *** 
     3440      !! 
     3441      !! ** Purpose :   Wrapper for subroutine iom_put that accepts 2D arrays 
     3442      !!                with and without halo 
     3443      !! 
     3444      !!---------------------------------------------------------------------- 
     3445      CHARACTER(LEN=*),         INTENT(in   ) ::   cdname 
     3446      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   posmdia2d 
     3447      !!---------------------------------------------------------------------- 
     3448      ! 
     3449      IF ( ln_dia_osm .AND. iom_use( cdname ) ) THEN 
     3450         IF ( SIZE( posmdia2d, 1 ) == ntei-ntsi+1 .AND. SIZE( posmdia2d, 2 ) == ntej-ntsj+1 ) THEN   ! Halo absent 
     3451            osmdia2d(A2D(0)) = posmdia2d(:,:) 
     3452            CALL iom_put( cdname, osmdia2d(A2D(nn_hls)) ) 
     3453         ELSE   ! Halo present 
     3454            CALL iom_put( cdname, osmdia2d ) 
     3455         END IF 
     3456      END IF 
     3457      ! 
     3458   END SUBROUTINE zdf_osm_iomput_2d 
     3459 
     3460   SUBROUTINE zdf_osm_iomput_3d( cdname, posmdia3d ) 
     3461      !!---------------------------------------------------------------------- 
     3462      !!                ***  ROUTINE zdf_osm_iomput_3d  *** 
     3463      !! 
     3464      !! ** Purpose :   Wrapper for subroutine iom_put that accepts 3D arrays 
     3465      !!                with and without halo 
     3466      !! 
     3467      !!---------------------------------------------------------------------- 
     3468      CHARACTER(LEN=*),           INTENT(in   ) ::   cdname 
     3469      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   posmdia3d 
     3470      !!---------------------------------------------------------------------- 
     3471      ! 
     3472      IF ( ln_dia_osm .AND. iom_use( cdname ) ) THEN 
     3473         IF ( SIZE( posmdia3d, 1 ) == ntei-ntsi+1 .AND. SIZE( posmdia3d, 2 ) == ntej-ntsj+1 ) THEN   ! Halo absent 
     3474            osmdia3d(A2D(0),:) = posmdia3d(:,:,:) 
     3475            CALL iom_put( cdname, osmdia3d(A2D(nn_hls),:) ) 
     3476         ELSE   ! Halo present 
     3477            CALL iom_put( cdname, osmdia3d ) 
     3478         END IF 
     3479      END IF 
     3480      ! 
     3481   END SUBROUTINE zdf_osm_iomput_3d 
     3482 
    28953483   !!====================================================================== 
    28963484 
Note: See TracChangeset for help on using the changeset viewer.