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 14775 for NEMO – NEMO

Changeset 14775 for NEMO


Ignore:
Timestamp:
2021-04-30T13:27:48+02:00 (3 years ago)
Author:
smueller
Message:

Upgrade of internal subroutines zdf_osm_osbl_state and zdf_osm_diffusivity_viscosity to module subroutines of module zdfosm (ticket #2353)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14122_HPC-08_Mueller_OSMOSIS_streamlining/src/OCE/ZDF/zdfosm.F90

    r14760 r14775  
    3939   !!   'ln_zdfosm'                                             OSMOSIS scheme 
    4040   !!---------------------------------------------------------------------- 
    41    !!   zdf_osm                  : update momentum and tracer Kz from osm scheme 
    42    !!   zdf_osm_vertical_average : compute vertical averages over boundary layers 
    43    !!   zdf_osm_init             : initialization, namelist read, and parameters control 
    44    !!   osm_rst                  : read (or initialize) and write osmosis restart fields 
    45    !!   tra_osm                  : compute and add to the T & S trend the non-local flux 
    46    !!   trc_osm                  : compute and add to the passive tracer trend the non-local flux (TBD) 
    47    !!   dyn_osm                  : compute and add to u & v trensd the non-local flux 
    48    !! 
    49    !! Subroutines in revised code. 
     41   !!   zdf_osm        : update momentum and tracer Kz from osm scheme 
     42   !!      zdf_osm_vertical_average        : compute vertical averages over boundary layers 
     43   !!      zdf_osm_velocity_rotation       : rotate velocity components 
     44   !!         zdf_osm_velocity_rotation_2d :    rotation of 2d fields 
     45   !!         zdf_osm_velocity_rotation_3d :    rotation of 3d fields 
     46   !!      zdf_osm_osbl_state              : determine the state of the OSBL 
     47   !!      zdf_osm_diffusivity_viscosity   : compute eddy diffusivity and viscosity profiles 
     48   !!      zdf_osm_fgr_terms               : compute flux-gradient relationship terms 
     49   !!   zdf_osm_init   : initialization, namelist read, and parameters control 
     50   !!   osm_rst        : read (or initialize) and write osmosis restart fields 
     51   !!   tra_osm        : compute and add to the T & S trend the non-local flux 
     52   !!   trc_osm        : compute and add to the passive tracer trend the non-local flux (TBD) 
     53   !!   dyn_osm        : compute and add to u & v trensd the non-local flux 
    5054   !!---------------------------------------------------------------------- 
    5155   USE oce            ! ocean dynamics and active tracers 
     
    8387   PUBLIC   ln_osm_mle    ! logical needed by tra_mle_init in tramle.F90 
    8488 
    85    ! Scales 
    86    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swth0     ! Surface heat flux (Kinematic) 
    87    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sws0      ! Surface freshwater flux 
    88    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swb0      ! Surface buoyancy flux 
    89    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: suw0      ! Surface u-momentum flux 
    90    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sustar    ! Friction velocity 
    91    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: scos_wind ! Cos angle of surface stress 
    92    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ssin_wind ! Sin angle of surface stress 
    93    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swthav    ! Heat flux - bl average 
    94    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swsav     ! Freshwater flux - bl average 
    95    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swbav     ! Buoyancy flux - bl average 
    96    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sustke    ! Surface Stokes drift 
    97    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: dstokes   ! Penetration depth of the Stokes drift 
    98    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swstrl    ! Langmuir velocity scale 
    99    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swstrc    ! Convective velocity scale 
    100    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sla       ! Trubulent Langmuir number 
    101    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: svstr     ! Velocity scale that tends to sustar for large Langmuir number 
    102    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: shol      ! Stability parameter for boundary layer 
    103  
    10489   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamu    !: non-local u-momentum flux 
    10590   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ghamv    !: non-local v-momentum flux 
     
    11196   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hml      ! ML depth 
    11297 
    113    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)           ::   r1_ft    ! inverse of the modified Coriolis parameter at t-pts 
    11498   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   hmle     ! Depth of layer affexted by mixed layer eddies in Fox-Kemper parametrization 
    11599   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdx_mle ! zonal buoyancy gradient in ML 
    116100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   dbdy_mle ! meridional buoyancy gradient in ML 
    117101   INTEGER,  PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mld_prof ! level of base of MLE layer. 
     102 
     103   INTERFACE zdf_osm_velocity_rotation 
     104      !!--------------------------------------------------------------------- 
     105      !!              ***  INTERFACE zdf_velocity_rotation  *** 
     106      !!--------------------------------------------------------------------- 
     107      MODULE PROCEDURE zdf_osm_velocity_rotation_2d 
     108      MODULE PROCEDURE zdf_osm_velocity_rotation_3d 
     109   END INTERFACE 
     110 
     111   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: r1_ft       ! inverse of the modified Coriolis parameter at t-pts 
     112 
     113   ! Scales 
     114   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swth0       ! Surface heat flux (Kinematic) 
     115   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sws0        ! Surface freshwater flux 
     116   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swb0        ! Surface buoyancy flux 
     117   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: suw0        ! Surface u-momentum flux 
     118   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sustar      ! Friction velocity 
     119   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: scos_wind   ! Cos angle of surface stress 
     120   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: ssin_wind   ! Sin angle of surface stress 
     121   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swthav      ! Heat flux - bl average 
     122   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swsav       ! Freshwater flux - bl average 
     123   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swbav       ! Buoyancy flux - bl average 
     124   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sustke      ! Surface Stokes drift 
     125   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: dstokes     ! Penetration depth of the Stokes drift 
     126   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swstrl      ! Langmuir velocity scale 
     127   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: swstrc      ! Convective velocity scale 
     128   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: sla         ! Trubulent Langmuir number 
     129   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: svstr       ! Velocity scale that tends to sustar for large Langmuir number 
     130   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   :: shol        ! Stability parameter for boundary layer 
    118131 
    119132   !                      !!** Namelist  namzdf_osm  ** 
     
    174187   INTEGER :: idebug = 236 
    175188   INTEGER :: jdebug = 228 
    176  
    177    INTERFACE zdf_osm_velocity_rotation 
    178       !!--------------------------------------------------------------------- 
    179       !!              ***  INTERFACE zdf_velocity_rotation  *** 
    180       !!--------------------------------------------------------------------- 
    181       MODULE PROCEDURE zdf_osm_velocity_rotation_2d 
    182       MODULE PROCEDURE zdf_osm_velocity_rotation_3d 
    183    END INTERFACE 
    184189 
    185190   !! * Substitutions 
     
    287292      REAL(wp), DIMENSION(jpi,jpj) :: zwb_min 
    288293 
    289  
    290294      REAL(wp), DIMENSION(jpi,jpj) :: zwb_fk_b  ! MLE buoyancy flux averaged over OSBL 
    291295      REAL(wp), DIMENSION(jpi,jpj) :: zwb_fk    ! max MLE buoyancy flux 
     
    366370      swstrl(:,:) = zlarge ; svstr(:,:)      = zlarge ; swstrc(:,:)     = zlarge ; suw0(:,:)      = zlarge 
    367371      swth0(:,:)  = zlarge ; sws0(:,:)       = zlarge ; swb0(:,:)       = zlarge 
    368       swthav(:,:) = zlarge ; swsav(:,:)      = zlarge ; swbav(:,:)      = zlarge ; zwb_ent(:,:)   = zlarge 
     372      swthav(:,:) = zlarge ; swsav(:,:)      = zlarge ; swbav(:,:)      = zlarge 
    369373      sustke(:,:) = zlarge ; sla(:,:)        = zlarge ; scos_wind(:,:)  = zlarge ; ssin_wind(:,:) = zlarge 
    370374      shol(:,:)   = zlarge ; zalpha_pyc(:,:) = zlarge 
    371       lconv(:,:)  = .FALSE.; lpyc(:,:) = .FALSE. ; lflux(:,:) = .FALSE. ;  lmle(:,:) = .FALSE. 
     375      lpyc(:,:) = .FALSE. ; lflux(:,:) = .FALSE. ;  lmle(:,:) = .FALSE. 
    372376      ! mixed layer 
    373377      ! no initialization of zhbl or zhml (or zdh?) 
     
    705709 
    706710      ! Determine the state of the OSBL, stable/unstable, shear/no shear 
    707       CALL zdf_osm_osbl_state( lconv, lshear, j_ddh, zwb_ent, zwb_min, zshear ) 
     711      CALL zdf_osm_osbl_state( Kmm, lconv, lshear, j_ddh, zwb_ent, zwb_min, zshear,   & 
     712         &                     zhbl, zhml, zdh, zdb_bl, zdu_bl, zdv_bl, zdb_ml, zdu_ml, zdv_ml ) 
    708713 
    709714#ifdef key_osm_debug 
     
    965970      ! Eddy viscosity/diffusivity and non-gradient terms in the flux-gradient relationship 
    966971      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
    967       CALL zdf_osm_diffusivity_viscosity( zdiffut, zviscos ) 
     972      CALL zdf_osm_diffusivity_viscosity( Kbb, Kmm, ibld, imld, lconv, lshear, lpyc, lcoup, j_ddh, zdiffut, zviscos,           & 
     973         &                                zhbl, zhml, zdh, zdhdt, zshear, zb_bl, zu_bl, zv_bl, zb_ml, zu_ml, zv_ml, zwb_ent,   & 
     974         &                                zwb_min ) 
    968975#ifdef key_osm_debug 
    969976      IF(narea==nn_narea_db) THEN 
     
    12121219 
    12131220   CONTAINS 
    1214       ! subroutine code changed, needs syntax checking. 
    1215       SUBROUTINE zdf_osm_diffusivity_viscosity( zdiffut, zviscos ) 
    1216           
    1217          !!--------------------------------------------------------------------- 
    1218          !!                   ***  ROUTINE zdf_osm_diffusivity_viscosity  *** 
    1219          !! 
    1220          !! ** Purpose : Determines the eddy diffusivity and eddy viscosity profiles in the mixed layer and the pycnocline. 
    1221          !! 
    1222          !! ** Method  : 
    1223          !! 
    1224          !! !!---------------------------------------------------------------------- 
    1225          REAL(wp), DIMENSION(:,:,:) :: zdiffut 
    1226          REAL(wp), DIMENSION(:,:,:) :: zviscos 
    1227          ! local 
    1228  
    1229          ! Scales used to calculate eddy diffusivity and viscosity profiles 
    1230          REAL(wp), DIMENSION(jpi,jpj) :: zdifml_sc, zvisml_sc 
    1231          REAL(wp), DIMENSION(jpi,jpj) :: zdifpyc_n_sc, zdifpyc_s_sc, zdifpyc_shr 
    1232          REAL(wp), DIMENSION(jpi,jpj) :: zvispyc_n_sc, zvispyc_s_sc,zvispyc_shr 
    1233          REAL(wp), DIMENSION(jpi,jpj) :: zbeta_d_sc, zbeta_v_sc 
    1234          REAL(wp), DIMENSION(jpi,jpj) ::   zb_coup, zc_coup_vis, zc_coup_dif 
    1235          ! 
    1236          REAL(wp) :: zvel_sc_pyc, zvel_sc_ml, zstab_fac, zz_b 
    1237          REAL(wp) ::   za_cubic, zb_cubic, zc_cubic, zd_cubic   ! Coefficients in cubic polynomial specifying diffusivity in pycnocline 
    1238          REAL(wp) ::   zznd_ml, zznd_pyc 
    1239          REAL(wp) ::   zmsku, zmskv 
    1240  
    1241          REAL(wp), PARAMETER :: rn_dif_ml = 0.8, rn_vis_ml = 0.375 
    1242          REAL(wp), PARAMETER :: rn_dif_pyc = 0.15, rn_vis_pyc = 0.142 
    1243          REAL(wp), PARAMETER :: rn_vispyc_shr = 0.15 
    1244  
    1245          IF( ln_timing ) CALL timing_start('zdf_osm_dv') 
    1246  
    1247          zb_coup(:,:) = 0.0_wp 
    1248  
    1249          DO_2D( 0, 0, 0, 0 ) 
    1250             IF ( lconv(ji,jj) ) THEN 
    1251  
    1252                zvel_sc_pyc = ( 0.15 * svstr(ji,jj)**3 + swstrc(ji,jj)**3 + 4.25 * zshear(ji,jj) * zhbl(ji,jj) )**pthird 
    1253                zvel_sc_ml = ( svstr(ji,jj)**3 + 0.5 * swstrc(ji,jj)**3 )**pthird 
    1254                zstab_fac = ( zhml(ji,jj) / zvel_sc_ml * ( 1.4 - 0.4 / ( 1.0 + EXP(-3.5 * LOG10(-shol(ji,jj) ) ) )**1.25 ) )**2 
    1255  
    1256                zdifml_sc(ji,jj) = rn_dif_ml * zhml(ji,jj) * zvel_sc_ml 
    1257                zvisml_sc(ji,jj) = rn_vis_ml * zdifml_sc(ji,jj) 
    1258 #ifdef key_osm_debug 
    1259                IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1260                   WRITE(narea+100,'(2(a,g11.3))')'Start of 1st major loop of osm_diffusivity_viscositys, lconv=T: zdifml_sc=',zdifml_sc(ji,jj),' zvisml_sc=',zvisml_sc(ji,jj) 
    1261                   WRITE(narea+100,'(3(a,g11.3))')'zvel_sc_pyc=',zvel_sc_pyc,' zvel_sc_ml=',zvel_sc_ml,' zstab_fac=',zstab_fac 
    1262                   FLUSH(narea+100) 
    1263                END IF 
    1264 #endif 
    1265  
    1266                IF ( lpyc(ji,jj) ) THEN 
    1267                   zdifpyc_n_sc(ji,jj) =  rn_dif_pyc * zvel_sc_ml * zdh(ji,jj) 
    1268                   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) 
    1269                   zvispyc_n_sc(ji,jj) = rn_vis_pyc * zvel_sc_ml * zdh(ji,jj) + zvispyc_n_sc(ji,jj) * zstab_fac 
    1270 #ifdef key_osm_debug 
    1271                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1272                      WRITE(narea+100,'(2(a,g11.3))')' lpyc=lconv=T, variables w/o shear contributions: zdifpyc_n_sc',zdifpyc_n_sc(ji,jj) ,' zvispyc_n_sc=',zvispyc_n_sc(ji,jj) 
    1273                      FLUSH(narea+100) 
    1274                   END IF 
    1275 #endif 
    1276  
    1277                   IF ( lshear(ji,jj) .AND. j_ddh(ji,jj) /= 2 ) THEN 
    1278                      zdifpyc_n_sc(ji,jj) = zdifpyc_n_sc(ji,jj) + rn_vispyc_shr * ( zshear(ji,jj) * zhbl(ji,jj) )**pthird * zhbl(ji,jj) 
    1279                      zvispyc_n_sc(ji,jj) = zvispyc_n_sc(ji,jj) + rn_vispyc_shr * ( zshear(ji,jj) * zhbl(ji,jj ) )**pthird * zhbl(ji,jj) 
    1280                   ENDIF 
    1281 #ifdef key_osm_debug 
    1282                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1283                      WRITE(narea+100,'(2(a,g11.3))')' lpyc=lconv=T, variables w shear contributions: zdifpyc_n_sc',zdifpyc_n_sc(ji,jj) ,' zvispyc_n_sc=',zvispyc_n_sc(ji,jj) 
    1284                      FLUSH(narea+100) 
    1285                   END IF 
    1286 #endif 
    1287  
    1288                   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) ) 
    1289                   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) ) ) 
    1290 #ifdef key_osm_debug 
    1291                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1292                      WRITE(narea+100,'(2(a,g11.3))')' 1st shot at: zdifpyc_s_sc',zdifpyc_s_sc(ji,jj) ,' zvispyc_s_sc=',zvispyc_s_sc(ji,jj) 
    1293                      FLUSH(narea+100) 
    1294                   END IF 
    1295 #endif 
    1296                   zdifpyc_s_sc(ji,jj) = 0.09 * zdifpyc_s_sc(ji,jj) * zstab_fac 
    1297                   zvispyc_s_sc(ji,jj) = zvispyc_s_sc(ji,jj) * zstab_fac 
    1298 #ifdef key_osm_debug 
    1299                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1300                      WRITE(narea+100,'(2(a,g11.3))')' 2nd shot at: zdifpyc_s_sc',zdifpyc_s_sc(ji,jj) ,' zvispyc_s_sc=',zvispyc_s_sc(ji,jj) 
    1301                      FLUSH(narea+100) 
    1302                   END IF 
    1303 #endif 
    1304  
    1305                   zdifpyc_s_sc(ji,jj) = MAX( zdifpyc_s_sc(ji,jj), -0.5 * zdifpyc_n_sc(ji,jj) ) 
    1306                   zvispyc_s_sc(ji,jj) = MAX( zvispyc_s_sc(ji,jj), -0.5_wp * zvispyc_n_sc(ji,jj) ) 
    1307  
    1308                   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 
    1309                   zbeta_v_sc(ji,jj) = 1.0 -  2.0 * ( zvispyc_n_sc(ji,jj) + zvispyc_s_sc(ji,jj) ) / ( zvisml_sc(ji,jj) + epsln ) 
    1310                ELSE 
    1311                   zdifpyc_n_sc(ji,jj) = rn_dif_pyc * zvel_sc_ml * zdh(ji,jj)   ! ag 19/03 
    1312                   zdifpyc_s_sc(ji,jj) = 0.0_wp   ! ag 19/03 
    1313                   zvispyc_n_sc(ji,jj) = rn_vis_pyc * zvel_sc_ml * zdh(ji,jj)   ! ag 19/03 
    1314                   zvispyc_s_sc(ji,jj) = 0.0_wp   ! ag 19/03 
    1315                   IF(lcoup(ji,jj) ) THEN   ! ag 19/03 
    1316                      ! code from SUBROUTINE tke_tke zdftke.F90; uses bottom drag velocity rCdU_bot(ji,jj) = -Cd|ub| 
    1317                      !     already calculated at T-points in SUBROUTINE zdf_drg from zdfdrg.F90 
    1318                      !  Gives friction velocity sqrt bottom drag/rho_0 i.e. u* = SQRT(rCdU_bot*ub) 
    1319                      ! wet-cell averaging .. 
    1320                      zmsku = 0.5_wp * ( 2.0_wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
    1321                      zmskv = 0.5_wp * ( 2.0_wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
    1322                      zb_coup(ji,jj) = 0.4_wp * SQRT(-1.0_wp * rCdU_bot(ji,jj) *   & 
    1323                         &             SQRT(  ( zmsku*( uu(ji,jj,mbkt(ji,jj),Kbb)+uu(ji-1,jj,mbkt(ji,jj),Kbb) ) )**2   & 
    1324                         &                  + ( zmskv*( vv(ji,jj,mbkt(ji,jj),Kbb)+vv(ji,jj-1,mbkt(ji,jj),Kbb) ) )**2  ) ) 
    1325  
    1326                      zz_b = -gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)   ! ag 19/03 
    1327                      zc_coup_vis(ji,jj) = -0.5_wp * ( 0.5_wp * zvisml_sc(ji,jj) / zhml(ji,jj) - zb_coup(ji,jj) ) /   & 
    1328                         &                 ( zhml(ji,jj) + zz_b )   ! ag 19/03 
    1329 #ifdef key_osm_debug 
    1330                      IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1331                         WRITE(narea+100,'(4(a,g11.3))')' lcoup = T; 1st pz_b= ', zz_b, ' pb_coup ', zb_coup(ji,jj),   & 
    1332                            &                           ' pc_coup_vis ', zc_coup_vis(ji,jj), ' rCdU_bot ',rCdU_bot(ji,jj) 
    1333                         WRITE(narea+100,'(2(a,g11.3))')' zmsku ', zmsku, ' zmskv ', zmskv 
    1334                         FLUSH(narea+100) 
    1335                      END IF 
    1336 #endif 
    1337 !#ifdef key_osm_debug 
    1338 !                     WRITE(narea+400,'(4(a,i7))') ' lcoup = T at ji=',ji,' jj= ',jj,' jig= ', mig(ji), ' jjg= ', mjg(jj) 
    1339 !                     WRITE(narea+400,'(3(a,g11.3))') '1st pz_b= ', zz_b, 'pb_coup', zb_coup(ji,jj),   & 
    1340 !                        &                            ' pc_coup_vis', zc_coup_vis(ji,jj) 
    1341 !                     FLUSH(narea+400) 
    1342 !#endif 
    1343                      zz_b = -zhml(ji,jj) + gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)   ! ag 19/03 
    1344                      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 ) /   & 
    1345                         &                                  zvisml_sc(ji,jj)   ! ag 19/03 
    1346                      zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2 ) /   & 
    1347                         &                           zdifml_sc(ji,jj) )**p2third 
    1348                      zc_coup_dif(ji,jj) = 0.5_wp * ( -zdifml_sc(ji,jj) / zhml(ji,jj) * ( 1.0_wp - zbeta_d_sc(ji,jj) )**1.5_wp +   & 
    1349                         &                 1.5_wp * ( zdifml_sc(ji,jj) / zhml(ji,jj) ) * zbeta_d_sc(ji,jj) *   & 
    1350                         &                          SQRT( 1.0_wp - zbeta_d_sc(ji,jj) ) - zb_coup(ji,jj) ) / zz_b   ! ag 19/03 
    1351 #ifdef key_osm_debug 
    1352                      IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1353                         WRITE(narea+100,'(2(a,g11.3))')' 2nd pz_b= ', zz_b, ' pc_coup_dif', zc_coup_dif(ji,jj) 
    1354                         FLUSH(narea+100) 
    1355                      END IF 
    1356 #endif 
    1357 !#ifdef key_osm_debug 
    1358 !                     WRITE(narea+400,'(3(a,g11.3))') '2nd pz_b= ', pz_b,' pc_coup_dif', zc_coup_dif(ji,jj) 
    1359 !                     FLUSH(narea+400) 
    1360 !#endif 
    1361                   ELSE   ! ag 19/03 
    1362                     zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zdifpyc_n_sc(ji,jj) + 1.4_wp * zdifpyc_s_sc(ji,jj) ) /   & 
    1363                        &                           ( zdifml_sc(ji,jj) + epsln ) )**p2third   ! ag 19/03 
    1364                     zbeta_v_sc(ji,jj) = 1.0_wp - 2.0_wp * ( zvispyc_n_sc(ji,jj) + zvispyc_s_sc(ji,jj) ) /   & 
    1365                        &                         ( zvisml_sc(ji,jj) + epsln )   ! ag 19/03 
    1366                   ENDIF   ! ag 19/03 
    1367                ENDIF      ! ag 19/03 
    1368 #ifdef key_osm_debug 
    1369                IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1370                   WRITE(narea+100,'(2(a,g11.3))')'lconv=T: zbeta_d_sc',zbeta_d_sc(ji,jj) ,' zbeta_v_sc=',zbeta_v_sc(ji,jj) 
    1371                   WRITE(narea+100,'(2(a,g11.3))')' Final zdifpyc_n_sc',zdifpyc_n_sc(ji,jj) ,' zvispyc_n_sc=',zvispyc_n_sc(ji,jj) 
    1372                   WRITE(narea+100,'(2(a,g11.3))')' Final zdifpyc_s_sc',zdifpyc_s_sc(ji,jj) ,' zvispyc_s_sc=',zvispyc_s_sc(ji,jj) 
    1373                   FLUSH(narea+100) 
    1374                END IF 
    1375 #endif 
    1376             ELSE 
    1377                zdifml_sc(ji,jj) = svstr(ji,jj) * zhbl(ji,jj) * MAX( EXP ( -( shol(ji,jj) / 0.6_wp )**2 ), 0.2_wp) 
    1378                zvisml_sc(ji,jj) = svstr(ji,jj) * zhbl(ji,jj) * MAX( EXP ( -( shol(ji,jj) / 0.6_wp )**2 ), 0.2_wp) 
    1379 #ifdef key_osm_debug 
    1380                IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1381                   WRITE(narea+100,'(a,g11.3)')'End of 1st major loop of osm_diffusivity_viscositys, lconv=F: zdifml_sc=',zdifml_sc(ji,jj),' zvisml_sc=',zvisml_sc(ji,jj) 
    1382                   FLUSH(narea+100) 
    1383                END IF 
    1384 #endif 
    1385             END IF 
    1386          END_2D 
    1387          ! 
    1388          DO_2D( 0, 0, 0, 0 ) 
    1389             IF ( lconv(ji,jj) ) THEN 
    1390                DO jk = 2, imld(ji,jj)   ! mixed layer diffusivity 
    1391                   zznd_ml = gdepw(ji,jj,jk,Kmm) / zhml(ji,jj) 
    1392                   ! 
    1393                   zdiffut(ji,jj,jk) = zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_d_sc(ji,jj) * zznd_ml )**1.5 
    1394                   ! 
    1395                   zviscos(ji,jj,jk) = zvisml_sc(ji,jj) * zznd_ml * ( 1.0 - zbeta_v_sc(ji,jj) * zznd_ml ) & 
    1396                      &            *                                      ( 1.0 - 0.5 * zznd_ml**2 ) 
    1397                END DO 
    1398  
    1399                ! Coupling to bottom 
    1400              
    1401                IF ( lcoup(ji,jj) ) THEN                                                          ! ag 19/03 
    1402                   DO jk = mbkt(ji,jj), imld(ji,jj), -1                                           ! ag 19/03 
    1403                      zz_b = - ( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) )           ! ag 19/03 
    1404                      zviscos(ji,jj,jk) = zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2    ! ag 19/03 
    1405                      zdiffut(ji,jj,jk) = zb_coup(ji,jj) * zz_b + zc_coup_dif(ji,jj) * zz_b**2    ! ag 19/03 
    1406                   END DO                                                                         ! ag 19/03 
    1407                ENDIF                                                                             ! ag 19/03 
    1408                ! pycnocline 
    1409                IF ( lpyc(ji,jj) ) THEN  
    1410                   ! Diffusivity profile in the pycnocline given by cubic polynomial. Note, if lpyc TRUE can't be coupled to seabed. 
    1411                   za_cubic = 0.5 
    1412                   zb_cubic = -1.75 * zdifpyc_s_sc(ji,jj) / zdifpyc_n_sc(ji,jj) 
    1413                   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 ) & 
    1414                      & - 0.85 * zdifpyc_s_sc(ji,jj) ) / MAX(zdifpyc_n_sc(ji,jj), 1.e-8) 
    1415                   zd_cubic = zd_cubic - zb_cubic - 2.0 * ( 1.0 - za_cubic  - zb_cubic ) 
    1416                   zc_cubic = 1.0 - za_cubic - zb_cubic - zd_cubic 
    1417                   DO jk = imld(ji,jj) , ibld(ji,jj) 
    1418                      zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / MAX(zdh(ji,jj), 1.e-6) 
    1419                      ! 
    1420                      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 ) 
    1421  
    1422                      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 ) 
    1423                   END DO 
    1424                   ! viscosity profiles. 
    1425                   za_cubic = 0.5 
    1426                   zb_cubic = -1.75 * zvispyc_s_sc(ji,jj) / zvispyc_n_sc(ji,jj) 
    1427                   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) 
    1428                   zd_cubic = zd_cubic - zb_cubic - 2.0 * ( 1.0 - za_cubic - zb_cubic ) 
    1429                   zc_cubic = 1.0 - za_cubic - zb_cubic - zd_cubic 
    1430                   DO jk = imld(ji,jj) , ibld(ji,jj) 
    1431                      zznd_pyc = -( gdepw(ji,jj,jk,Kmm) - zhbl(ji,jj) ) / MAX(zdh(ji,jj), 1.e-6) 
    1432                      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 ) 
    1433                      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 ) 
    1434                   END DO 
    1435 !                  IF ( zdhdt(ji,jj) > 0._wp ) THEN 
    1436 !                     zdiffut(ji,jj,ibld(ji,jj)+1) = MAX( 0.5 * zdhdt(ji,jj) * e3w(ji,jj,ibld(ji,jj)+1,Kmm), 1.0e-6 ) 
    1437 !                     zviscos(ji,jj,ibld(ji,jj)+1) = MAX( 0.5 * zdhdt(ji,jj) * e3w(ji,jj,ibld(ji,jj)+1,Kmm), 1.0e-6 ) 
    1438 !                  ELSE 
    1439 !                     zdiffut(ji,jj,ibld(ji,jj)) = 0._wp 
    1440 !                     zviscos(ji,jj,ibld(ji,jj)) = 0._wp 
    1441 !                  ENDIF 
    1442                ENDIF 
    1443             ELSE 
    1444                ! stable conditions 
    1445                DO jk = 2, ibld(ji,jj) 
    1446                   zznd_ml = gdepw(ji,jj,jk,Kmm) / zhbl(ji,jj) 
    1447                   zdiffut(ji,jj,jk) = 0.75 * zdifml_sc(ji,jj) * zznd_ml * ( 1.0 - zznd_ml )**1.5 
    1448                   zviscos(ji,jj,jk) = 0.375 * zvisml_sc(ji,jj) * zznd_ml * (1.0 - zznd_ml) * ( 1.0 - zznd_ml**2 ) 
    1449                END DO 
    1450  
    1451                IF ( zdhdt(ji,jj) > 0._wp ) THEN 
    1452                   zdiffut(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj), 1.0e-6) * e3w(ji, jj, ibld(ji,jj), Kmm) 
    1453                   zviscos(ji,jj,ibld(ji,jj)) = MAX(zdhdt(ji,jj), 1.0e-6) * e3w(ji, jj, ibld(ji,jj), Kmm) 
    1454                ENDIF 
    1455             ENDIF   ! end if ( lconv ) 
    1456             ! 
    1457          END_2D 
    1458          IF( iom_use("pb_coup") ) CALL iom_put( "pb_coup", tmask(:,:,1) * zb_coup(:,:) )   ! BBL-coupling velocity scale 
    1459          IF( ln_timing ) CALL timing_stop('zdf_osm_dv') 
    1460  
    1461       END SUBROUTINE zdf_osm_diffusivity_viscosity 
    1462  
    1463       SUBROUTINE zdf_osm_osbl_state( lconv, lshear, j_ddh, zwb_ent, zwb_min, zshear ) 
    1464  
    1465          !!--------------------------------------------------------------------- 
    1466          !!                   ***  ROUTINE zdf_osm_osbl_state  *** 
    1467          !! 
    1468          !! ** Purpose : Determines the state of the OSBL, stable/unstable, shear/ noshear. Also determines shear production, entrainment buoyancy flux and interfacial Richardson number 
    1469          !! 
    1470          !! ** Method  : 
    1471          !! 
    1472          !! !!---------------------------------------------------------------------- 
    1473  
    1474          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. 
    1475  
    1476          LOGICAL, DIMENSION(jpi,jpj) :: lconv, lshear 
    1477  
    1478          REAL(wp), DIMENSION(jpi,jpj) :: zwb_ent, zwb_min ! Buoyancy fluxes at base of well-mixed layer. 
    1479          REAL(wp), DIMENSION(jpi,jpj) :: zshear  ! production of TKE due to shear across the pycnocline 
    1480  
    1481          ! Local Variables 
    1482  
    1483          INTEGER :: jj, ji 
    1484  
    1485          REAL(wp), DIMENSION(jpi,jpj) :: zekman 
    1486          REAL(wp), DIMENSION(jpi,jpj) :: zri_p, zri_b   ! Richardson numbers 
    1487          REAL(wp) :: zshear_u, zshear_v, zwb_shr 
    1488          REAL(wp) :: zwcor, zrf_conv, zrf_shear, zrf_langmuir, zr_stokes 
    1489  
    1490          REAL, PARAMETER :: za_shr = 0.4, zb_shr = 6.5, za_wb_s = 0.8 
    1491          REAL, PARAMETER :: zalpha_c = 0.2, zalpha_lc = 0.03 
    1492          REAL, PARAMETER :: zalpha_ls = 0.06, zalpha_s = 0.15 
    1493          REAL, PARAMETER :: rn_ri_p_thresh = 27.0 
    1494          REAL, PARAMETER :: zri_c = 0.25 
    1495          REAL, PARAMETER :: zek = 4.0 
    1496          REAL, PARAMETER :: zrot=0._wp  ! dummy rotation rate of surface stress. 
    1497  
    1498          IF( ln_timing ) CALL timing_start('zdf_osm_os') 
    1499          ! Determins stability and set flag lconv 
    1500          DO_2D( 0, 0, 0, 0 ) 
    1501             IF ( shol(ji,jj) < 0._wp ) THEN 
    1502                lconv(ji,jj) = .TRUE. 
    1503             ELSE 
    1504                lconv(ji,jj) = .FALSE. 
    1505             ENDIF 
    1506          END_2D 
    1507  
    1508          zekman(A2D(0)) = EXP( -1.0_wp * zek * ABS( ff_t(A2D(0)) ) * zhbl(A2D(0)) / MAX(sustar(A2D(0)), 1.e-8 ) ) 
    1509  
    1510          zshear(:,:) = zlarge 
    1511          zshear(A2D(0)) = 0._wp 
    1512 #ifdef key_osm_debug 
    1513          IF(narea==nn_narea_db) THEN 
    1514             ji=iloc_db; jj=jloc_db 
    1515             WRITE(narea+100,'(a,g11.3)') & 
    1516                & 'zdf_osm_osbl_state start: zekman=', zekman(ji,jj) 
    1517             FLUSH(narea+100) 
    1518          END IF 
    1519 #endif 
    1520          j_ddh(A2D(0)) = 1 
    1521  
    1522          DO_2D( 0, 0, 0, 0 ) 
    1523             IF ( lconv(ji,jj) ) THEN 
    1524                IF ( zdb_bl(ji,jj) > 0._wp ) THEN 
    1525                   zri_p(ji,jj) = 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) ) * ( svstr(ji,jj) / MAX( sustar(ji,jj), 1.e-6 ) )**2 & 
    1526                      & / MAX( zekman(ji,jj), 1.e-6 )  , 5._wp ) 
    1527  
    1528                   IF ( ff_t(ji,jj) >= 0.0_wp ) THEN 
    1529                      ! Northern hemisphere 
    1530                      zri_b(ji,jj) = zdb_ml(ji,jj) * zdh(ji,jj) / ( MAX( zdu_ml(ji,jj), 1e-5_wp )**2 + MAX( -1.0_wp * zdv_ml(ji,jj), 1e-5_wp)**2 ) 
    1531                   ELSE 
    1532                      ! Southern hemisphere 
    1533                      zri_b(ji,jj) = zdb_ml(ji,jj) * zdh(ji,jj) / ( MAX( zdu_ml(ji,jj), 1e-5_wp )**2 + MAX(           zdv_ml(ji,jj), 1e-5_wp)**2 ) 
    1534                   END IF 
    1535                   zshear(ji,jj) = za_shr * zekman(ji,jj) * ( MAX( sustar(ji,jj)**2 * zdu_ml(ji,jj) / zhbl(ji,jj), 0._wp ) + zb_shr * MAX( -ff_t(ji,jj) * sustke(ji,jj) * dstokes(ji,jj) * zdv_ml(ji,jj) / zhbl(ji,jj), 0._wp ) ) 
    1536 #ifdef key_osm_debug 
    1537                   ! IF(narea==nn_narea_db)THEN 
    1538                   !    WRITE(narea+100,'(2(a,i10.4))')'ji',ji,'jj',jj 
    1539                   !    WRITE(narea+100,'(2(a,i10.4))')'iloc_db',iloc_db,'jloc_db',jloc_db 
    1540                   !    WRITE(narea+100,'(2(a,i10.4))')'iloc_db+',mi0(nn_idb),'jloc_db+',mj0(nn_jdb) 
    1541                   !    FLUSH(narea+100) 
    1542                   ! END IF 
    1543                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1544                      WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state 1st zshear: zshear=',zshear(ji,jj) 
    1545                      WRITE(narea+100,'(2(a,g11.3))')'zdf_osm_osbl_state 1st zshear: zri_b=',zri_b(ji,jj),' zri_p=',zri_p(ji,jj) 
    1546                      FLUSH(narea+100) 
    1547                   END IF 
    1548 #endif 
    1549                   ! Stability dependence 
    1550                   zshear(ji,jj) = zshear(ji,jj) * EXP( -0.75_wp * MAX( 0.0_wp, ( zri_b(ji,jj) - zri_c ) / zri_c ) ) 
    1551 #ifdef key_osm_debug 
    1552                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1553                      WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state 1st zshear: zshear inc ri part=',zshear(ji,jj) 
    1554                      FLUSH(narea+100) 
    1555                   END IF 
    1556 #endif 
    1557  
    1558                   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    1559                   ! Test ensures j_ddh=0 is not selected. Change to zri_p<27 when  ! 
    1560                   ! full code available                                          ! 
    1561                   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    1562                   IF ( zshear(ji,jj) > 1e-10 ) THEN 
    1563                      IF ( zri_p(ji,jj) < rn_ri_p_thresh .AND. MIN( hu(ji,jj,Kmm), hu(ji-1,jj,Kmm), hv(ji,jj,Kmm), hv(ji,jj-1,Kmm) ) > 100.0_wp ) THEN 
    1564                         ! Growing shear layer 
    1565                         j_ddh(ji,jj) = 0 
    1566                         lshear(ji,jj) = .TRUE. 
    1567                      ELSE 
    1568                         j_ddh(ji,jj) = 1 
    1569                         !                 IF ( zri_b <= 1.5 .and. zshear(ji,jj) > 0._wp ) THEN 
    1570                         ! shear production large enough to determine layer charcteristics, but can't maintain a shear layer. 
    1571                         lshear(ji,jj) = .TRUE. 
    1572                         !             ELSE 
    1573                      END IF 
    1574                   ELSE 
    1575                      j_ddh(ji,jj) = 2 
    1576                      lshear(ji,jj) = .FALSE. 
    1577                   END IF 
    1578                   ! Shear production may not be zero, but is small and doesn't determine characteristics of pycnocline. 
    1579                   !               zshear(ji,jj) = 0.5 * zshear(ji,jj) 
    1580                   !               lshear(ji,jj) = .FALSE. 
    1581                   !             ENDIF 
    1582                ELSE                ! zdb_bl test, note zshear set to zero 
    1583                   j_ddh(ji,jj) = 2 
    1584                   lshear(ji,jj) = .FALSE. 
    1585                ENDIF 
    1586             ENDIF 
    1587          END_2D 
    1588  
    1589          ! Calculate entrainment buoyancy flux due to surface fluxes. 
    1590  
    1591          DO_2D( 0, 0, 0, 0 ) 
    1592             IF ( lconv(ji,jj) ) THEN 
    1593                zwcor = ABS(ff_t(ji,jj)) * zhbl(ji,jj) + epsln 
    1594                zrf_conv = TANH( ( swstrc(ji,jj) / zwcor )**0.69 ) 
    1595                zrf_shear = TANH( ( sustar(ji,jj) / zwcor )**0.69 ) 
    1596                zrf_langmuir = TANH( ( swstrl(ji,jj) / zwcor )**0.69 ) 
    1597                IF (nn_osm_SD_reduce > 0 ) THEN 
    1598                   ! Effective Stokes drift already reduced from surface value 
    1599                   zr_stokes = 1.0_wp 
    1600                ELSE 
    1601                   ! Effective Stokes drift only reduced by factor rn_zdfodm_adjust_sd, 
    1602                   ! requires further reduction where BL is deep 
    1603                   zr_stokes = 1.0 - EXP( -25.0 * dstokes(ji,jj) / hbl(ji,jj) & 
    1604                      &                  * ( 1.0 + 4.0 * dstokes(ji,jj) / hbl(ji,jj) ) ) 
    1605                END IF 
    1606                zwb_ent(ji,jj) = -2.0_wp * zalpha_c * zrf_conv * swbav(ji,jj) & 
    1607                   &                  - zalpha_s * zrf_shear * sustar(ji,jj)**3 / zhml(ji,jj) & 
    1608                   &         + zr_stokes * ( zalpha_s * EXP( -1.5_wp * sla(ji,jj) ) * zrf_shear * sustar(ji,jj)**3 & 
    1609                   &                                         - zrf_langmuir * zalpha_lc * swstrl(ji,jj)**3 ) / zhml(ji,jj) 
    1610                ! 
    1611 #ifdef key_osm_debug 
    1612                IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1613                   WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state conv+shear0/lang: zwb_ent=',zwb_ent(ji,jj) 
    1614                   FLUSH(narea+100) 
    1615                END IF 
    1616 #endif 
    1617  
    1618             ENDIF 
    1619          END_2D 
    1620  
    1621          zwb_min(:,:) = zlarge 
    1622  
    1623          DO_2D( 0, 0, 0, 0 ) 
    1624             IF ( lshear(ji,jj) ) THEN 
    1625                IF ( lconv(ji,jj) ) THEN 
    1626                   ! Unstable OSBL 
    1627                   zwb_shr = -1.0_wp * za_wb_s * zri_b(ji,jj) * zshear(ji,jj) 
    1628 #ifdef key_osm_debug 
    1629                   IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1630                      WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state 1st zwb_shr: zwb_shr=',zwb_shr 
    1631                      FLUSH(narea+100) 
    1632                   END IF 
    1633 #endif 
    1634                   IF ( j_ddh(ji,jj) == 0 ) THEN 
    1635  
    1636                      ! ! Developing shear layer, additional shear production possible. 
    1637  
    1638                      !              zshear_u = MAX( zustar(ji,jj)**2 * MAX( zdu_ml(ji,jj), 0._wp ) /  zhbl(ji,jj), 0._wp ) 
    1639                      !              zshear(ji,jj) = zshear(ji,jj) + zshear_u * ( 1.0 - MIN( zri_p(ji,jj) / rn_ri_p_thresh, 1.d0 )**2 ) 
    1640                      !              zshear(ji,jj) = MIN( zshear(ji,jj), zshear_u ) 
    1641  
    1642                      !              zwb_shr = zwb_shr - 0.25 * MAX ( zshear_u, 0._wp) * ( 1.0 - MIN( zri_p(ji,jj) / rn_ri_p_thresh, 1._wp )**2 ) 
    1643                      !              zwb_shr = MAX( zwb_shr, -0.25 * zshear_u ) 
    1644 #ifdef key_osm_debug 
    1645                      IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1646                         WRITE(narea+100,'(3(a,g11.3))')'zdf_osm_osbl_state j_ddh(ji,jj) == 0:zwb_shr=',zwb_shr, & 
    1647                            & '  zshear=',zshear(ji,jj),'  zshear_u=', zshear_u 
    1648                         FLUSH(narea+100) 
    1649                      END IF 
    1650 #endif 
    1651  
    1652                   ENDIF 
    1653                   zwb_ent(ji,jj) = zwb_ent(ji,jj) + zwb_shr 
    1654                   !           zwb_min(ji,jj) = zwb_ent(ji,jj) + zdh(ji,jj) / zhbl(ji,jj) * zwb0(ji,jj) 
    1655                ELSE    ! IF ( lconv ) THEN - ENDIF 
    1656                   ! Stable OSBL  - shear production not coded for first attempt. 
    1657                ENDIF  ! lconv 
    1658             END IF  ! lshear 
    1659             IF ( lconv(ji,jj) ) THEN 
    1660                ! Unstable OSBL 
    1661                zwb_min(ji,jj) = zwb_ent(ji,jj) + zdh(ji,jj) / zhbl(ji,jj) * 2.0_wp * swbav(ji,jj) 
    1662             END IF  ! lconv 
    1663 #ifdef key_osm_debug 
    1664             IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
    1665                WRITE(narea+100,'(3(a,g11.3))')'end of zdf_osm_osbl_state:zwb_ent=',zwb_ent(ji,jj), & 
    1666                   & '  zwb_min=',zwb_min(ji,jj), '  zwb0tot=', zwb0tot(ji,jj), '  swbav= ', swbav(ji,jj) 
    1667                FLUSH(narea+100) 
    1668             END IF 
    1669 #endif 
    1670          END_2D 
    1671          IF( ln_timing ) CALL timing_stop('zdf_osm_os') 
    1672       END SUBROUTINE zdf_osm_osbl_state 
    1673  
    16741221 
    16751222      SUBROUTINE zdf_osm_osbl_state_fk( lpyc, lflux, lmle, zwb_fk ) 
     
    27522299      ! 
    27532300   END SUBROUTINE zdf_osm_velocity_rotation_3d 
     2301 
     2302   SUBROUTINE zdf_osm_osbl_state( Kmm, ldconv, ldshear, k_ddh, pwb_ent, pwb_min, pshear,   & 
     2303      &                           phbl, phml, pdh, pdb_bl, pdu_bl, pdv_bl, pdb_ml, pdu_ml, pdv_ml ) 
     2304      !!--------------------------------------------------------------------- 
     2305      !!                 ***  ROUTINE zdf_osm_osbl_state  *** 
     2306      !! 
     2307      !! ** Purpose : Determines the state of the OSBL, stable/unstable, 
     2308      !!              shear/ noshear. Also determines shear production, 
     2309      !!              entrainment buoyancy flux and interfacial Richardson 
     2310      !!              number 
     2311      !! 
     2312      !! ** Method  : 
     2313      !! 
     2314      !!---------------------------------------------------------------------- 
     2315      INTEGER,                  INTENT(in   ) ::   Kmm       ! Ocean time-level index 
     2316      LOGICAL,  DIMENSION(:,:), INTENT(  out) ::   ldconv    ! BL stability flags 
     2317      LOGICAL,  DIMENSION(:,:), INTENT(  out) ::   ldshear   ! Shear layers 
     2318      INTEGER,  DIMENSION(:,:), INTENT(  out) ::   k_ddh     ! k_ddh=0: active shear layer 
     2319      !                                                      ! k_ddh=1: shear layer not active 
     2320      !                                                      ! k_ddh=2: shear production low 
     2321      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pwb_ent   ! Buoyancy fluxes at base 
     2322      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pwb_min   !    of well-mixed layer 
     2323      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pshear    ! Production of TKE due to shear across the pycnocline 
     2324      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   phbl      ! BL depth 
     2325      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   phml      ! ML depth 
     2326      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdh       ! Pycnocline depth 
     2327      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdb_bl    ! Buoyancy diff. between BL average and basal value 
     2328      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdu_bl    ! Velocity diff. (u) between BL average and basal value 
     2329      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdv_bl    ! Velocity diff. (v) between BL average and basal value 
     2330      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdb_ml    ! Buoyancy diff. between mixed-layer average and basal value 
     2331      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdu_ml    ! Velocity diff. (u) between mixed-layer average and basal value 
     2332      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   pdv_ml    ! Velocity diff. (v) between mixed-layer average and basal value 
     2333      ! 
     2334      ! Local Variables 
     2335      INTEGER :: jj, ji   ! Loop indices 
     2336      ! 
     2337      REAL(wp), DIMENSION(A2D(0)) ::   zekman 
     2338      REAL(wp), DIMENSION(A2D(0)) ::   zri_p, zri_b   ! Richardson numbers 
     2339      REAL(wp)                    ::   zshear_u, zshear_v, zwb_shr 
     2340      REAL(wp)                    ::   zwcor, zrf_conv, zrf_shear, zrf_langmuir, zr_stokes 
     2341      ! 
     2342      REAL(wp), PARAMETER ::   za_shr         = 0.4_wp,  zb_shr    = 6.5_wp,  za_wb_s = 0.8_wp 
     2343      REAL(wp), PARAMETER ::   zalpha_c       = 0.2_wp,  zalpha_lc = 0.03_wp 
     2344      REAL(wp), PARAMETER ::   zalpha_ls      = 0.06_wp, zalpha_s  = 0.15_wp 
     2345      REAL(wp), PARAMETER ::   rn_ri_p_thresh = 27.0_wp 
     2346      REAL(wp), PARAMETER ::   zri_c          = 0.25_wp 
     2347      REAL(wp), PARAMETER ::   zek            = 4.0_wp 
     2348      REAL(wp), PARAMETER ::   zrot           = 0.0_wp   ! Dummy rotation rate of surface stress 
     2349      REAL(wp), PARAMETER ::   zlarge         = -1e10_wp 
     2350      ! 
     2351      IF( ln_timing ) CALL timing_start('zdf_osm_os') 
     2352      ! 
     2353      ! Initialise INTENT(  out) arrays 
     2354      ldconv(:,:)  = .FALSE. 
     2355      ldshear(:,:) = .FALSE. 
     2356      k_ddh(:,:)   = 1 
     2357      pwb_ent(:,:) = zlarge 
     2358      pwb_min(:,:) = zlarge 
     2359      pshear(:,:)  = zlarge 
     2360      ! 
     2361      ! Determins stability and set flag ldconv 
     2362      DO_2D( 0, 0, 0, 0 ) 
     2363         IF ( shol(ji,jj) < 0._wp ) THEN 
     2364            ldconv(ji,jj) = .TRUE. 
     2365         ELSE 
     2366            ldconv(ji,jj) = .FALSE. 
     2367         ENDIF 
     2368      END_2D 
     2369      ! 
     2370      pshear(A2D(0)) = 0._wp 
     2371      zekman(:,:) = EXP( -1.0_wp * zek * ABS( ff_t(A2D(0)) ) * phbl(A2D(0)) / MAX(sustar(A2D(0)), 1.e-8 ) ) 
     2372      ! 
     2373#ifdef key_osm_debug 
     2374      IF(narea==nn_narea_db) THEN 
     2375         ji=iloc_db; jj=jloc_db 
     2376         WRITE(narea+100,'(a,g11.3)') & 
     2377            & 'zdf_osm_osbl_state start: zekman=', zekman(ji,jj) 
     2378         FLUSH(narea+100) 
     2379      END IF 
     2380#endif 
     2381      ! 
     2382      DO_2D( 0, 0, 0, 0 ) 
     2383         IF ( ldconv(ji,jj) ) THEN 
     2384            IF ( pdb_bl(ji,jj) > 0.0_wp ) THEN 
     2385               zri_p(ji,jj) = MAX (  SQRT( pdb_bl(ji,jj) * pdh(ji,jj) / MAX( pdu_bl(ji,jj)**2 + pdv_bl(ji,jj)**2, 1e-8_wp ) ) *   & 
     2386                  &                  ( phbl(ji,jj) / pdh(ji,jj) ) * ( svstr(ji,jj) / MAX( sustar(ji,jj), 1e-6_wp ) )**2 /         & 
     2387                  &                  MAX( zekman(ji,jj), 1.0e-6_wp )  , 5.0_wp ) 
     2388               IF ( ff_t(ji,jj) >= 0.0_wp ) THEN   ! Northern hemisphere 
     2389                  zri_b(ji,jj) = pdb_ml(ji,jj) * pdh(ji,jj) / ( MAX( pdu_ml(ji,jj), 1e-5_wp )**2 +   & 
     2390                     &                                          MAX( -1.0_wp * pdv_ml(ji,jj), 1e-5_wp)**2 ) 
     2391               ELSE                                ! Southern hemisphere 
     2392                  zri_b(ji,jj) = pdb_ml(ji,jj) * pdh(ji,jj) / ( MAX( pdu_ml(ji,jj), 1e-5_wp )**2 +   & 
     2393                     &                                          MAX(           pdv_ml(ji,jj), 1e-5_wp)**2 ) 
     2394               END IF 
     2395               pshear(ji,jj) = za_shr * zekman(ji,jj) *                                                   & 
     2396                  &            ( MAX( sustar(ji,jj)**2 * pdu_ml(ji,jj) / phbl(ji,jj), 0.0_wp ) +          & 
     2397                  &              zb_shr * MAX( -1.0_wp * ff_t(ji,jj) * sustke(ji,jj) * dstokes(ji,jj) *   & 
     2398                  &                            pdv_ml(ji,jj) / phbl(ji,jj), 0.0_wp ) ) 
     2399#ifdef key_osm_debug 
     2400               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2401                  WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state 1st zshear: zshear=',pshear(ji,jj) 
     2402                  WRITE(narea+100,'(2(a,g11.3))')'zdf_osm_osbl_state 1st zshear: zri_b=',zri_b(ji,jj),' zri_p=',zri_p(ji,jj) 
     2403                  FLUSH(narea+100) 
     2404               END IF 
     2405#endif 
     2406               ! Stability dependence 
     2407               pshear(ji,jj) = pshear(ji,jj) * EXP( -0.75_wp * MAX( 0.0_wp, ( zri_b(ji,jj) - zri_c ) / zri_c ) ) 
     2408#ifdef key_osm_debug 
     2409               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2410                  WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state 1st zshear: zshear inc ri part=',pshear(ji,jj) 
     2411                  FLUSH(narea+100) 
     2412               END IF 
     2413#endif 
     2414               !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     2415               ! Test ensures k_ddh=0 is not selected. Change to zri_p<27 when  ! 
     2416               ! full code available                                          ! 
     2417               !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     2418               IF ( pshear(ji,jj) > 1e-10 ) THEN 
     2419                  IF ( zri_p(ji,jj) < rn_ri_p_thresh .AND. MIN( hu(ji,jj,Kmm), hu(ji-1,jj,Kmm), hv(ji,jj,Kmm), hv(ji,jj-1,Kmm) ) > 100.0_wp ) THEN 
     2420                     ! Growing shear layer 
     2421                     k_ddh(ji,jj) = 0 
     2422                     ldshear(ji,jj) = .TRUE. 
     2423                  ELSE 
     2424                     k_ddh(ji,jj) = 1 
     2425                     !             IF ( zri_b <= 1.5 .and. pshear(ji,jj) > 0._wp ) THEN 
     2426                     ! Shear production large enough to determine layer charcteristics, but can't maintain a shear layer 
     2427                     ldshear(ji,jj) = .TRUE. 
     2428                     !             ELSE 
     2429                  END IF 
     2430               ELSE 
     2431                  k_ddh(ji,jj) = 2 
     2432                  ldshear(ji,jj) = .FALSE. 
     2433               END IF 
     2434               ! Shear production may not be zero, but is small and doesn't determine characteristics of pycnocline 
     2435               !               pshear(ji,jj) = 0.5 * pshear(ji,jj) 
     2436               !               ldshear(ji,jj) = .FALSE. 
     2437               !            ENDIF 
     2438            ELSE   ! pdb_bl test, note pshear set to zero 
     2439               k_ddh(ji,jj) = 2 
     2440               ldshear(ji,jj) = .FALSE. 
     2441            ENDIF 
     2442         ENDIF 
     2443      END_2D 
     2444      ! 
     2445      ! Calculate entrainment buoyancy flux due to surface fluxes. 
     2446      DO_2D( 0, 0, 0, 0 ) 
     2447         IF ( ldconv(ji,jj) ) THEN 
     2448            zwcor        = ABS( ff_t(ji,jj) ) * phbl(ji,jj) + epsln 
     2449            zrf_conv     = TANH( ( swstrc(ji,jj) / zwcor )**0.69_wp ) 
     2450            zrf_shear    = TANH( ( sustar(ji,jj) / zwcor )**0.69_wp ) 
     2451            zrf_langmuir = TANH( ( swstrl(ji,jj) / zwcor )**0.69_wp ) 
     2452            IF ( nn_osm_SD_reduce > 0 ) THEN 
     2453               ! Effective Stokes drift already reduced from surface value 
     2454               zr_stokes = 1.0_wp 
     2455            ELSE 
     2456               ! Effective Stokes drift only reduced by factor rn_zdfodm_adjust_sd, 
     2457               ! requires further reduction where BL is deep 
     2458               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) ) ) 
     2459            END IF 
     2460            pwb_ent(ji,jj) = -2.0_wp * zalpha_c * zrf_conv * swbav(ji,jj) -                                          & 
     2461               &             zalpha_s * zrf_shear * sustar(ji,jj)**3 / phml(ji,jj) +                                 & 
     2462               &             zr_stokes * ( zalpha_s * EXP( -1.5_wp * sla(ji,jj) ) * zrf_shear * sustar(ji,jj)**3 -   & 
     2463               &                           zrf_langmuir * zalpha_lc * swstrl(ji,jj)**3 ) / phml(ji,jj) 
     2464#ifdef key_osm_debug 
     2465            IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2466               WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state conv+shear0/lang: zwb_ent=',pwb_ent(ji,jj) 
     2467               FLUSH(narea+100) 
     2468            END IF 
     2469#endif 
     2470         ENDIF 
     2471      END_2D 
     2472      ! 
     2473      DO_2D( 0, 0, 0, 0 ) 
     2474         IF ( ldshear(ji,jj) ) THEN 
     2475            IF ( ldconv(ji,jj) ) THEN 
     2476               ! Unstable OSBL 
     2477               zwb_shr = -1.0_wp * za_wb_s * zri_b(ji,jj) * pshear(ji,jj) 
     2478#ifdef key_osm_debug 
     2479               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2480                  WRITE(narea+100,'(a,g11.3)')'zdf_osm_osbl_state 1st zwb_shr: zwb_shr=',zwb_shr 
     2481                  FLUSH(narea+100) 
     2482               END IF 
     2483#endif 
     2484               IF ( k_ddh(ji,jj) == 0 ) THEN 
     2485                  ! Developing shear layer, additional shear production possible. 
     2486 
     2487                  !              pshear_u = MAX( zustar(ji,jj)**2 * MAX( pdu_ml(ji,jj), 0._wp ) /  phbl(ji,jj), 0._wp ) 
     2488                  !              pshear(ji,jj) = pshear(ji,jj) + pshear_u * ( 1.0 - MIN( zri_p(ji,jj) / rn_ri_p_thresh, 1.d0 )**2 ) 
     2489                  !              pshear(ji,jj) = MIN( pshear(ji,jj), pshear_u ) 
     2490 
     2491                  !              zwb_shr = zwb_shr - 0.25 * MAX ( pshear_u, 0._wp) * ( 1.0 - MIN( zri_p(ji,jj) / rn_ri_p_thresh, 1._wp )**2 ) 
     2492                  !              zwb_shr = MAX( zwb_shr, -0.25 * pshear_u ) 
     2493#ifdef key_osm_debug 
     2494                  IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2495                     WRITE(narea+100,'(3(a,g11.3))')'zdf_osm_osbl_state k_ddh(ji,jj) == 0:zwb_shr=',zwb_shr, & 
     2496                        & '  zshear=',pshear(ji,jj),'  zshear_u=', pshear_u 
     2497                     FLUSH(narea+100) 
     2498                  END IF 
     2499#endif 
     2500               ENDIF 
     2501               pwb_ent(ji,jj) = pwb_ent(ji,jj) + zwb_shr 
     2502               !           pwb_min(ji,jj) = pwb_ent(ji,jj) + pdh(ji,jj) / phbl(ji,jj) * zwb0(ji,jj) 
     2503            ELSE   ! IF ( ldconv ) THEN - ENDIF 
     2504               ! Stable OSBL  - shear production not coded for first attempt. 
     2505            ENDIF   ! ldconv 
     2506         END IF   ! ldshear 
     2507         IF ( ldconv(ji,jj) ) THEN 
     2508            ! Unstable OSBL 
     2509            pwb_min(ji,jj) = pwb_ent(ji,jj) + pdh(ji,jj) / phbl(ji,jj) * 2.0_wp * swbav(ji,jj) 
     2510         END IF  ! ldconv 
     2511#ifdef key_osm_debug 
     2512         IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2513            WRITE(narea+100,'(3(a,g11.3))')'end of zdf_osm_osbl_state:zwb_ent=',pwb_ent(ji,jj), & 
     2514               & '  zwb_min=',pwb_min(ji,jj), '  zwb0tot=', zwb0tot(ji,jj), '  swbav= ', swbav(ji,jj) 
     2515            FLUSH(narea+100) 
     2516         END IF 
     2517#endif 
     2518      END_2D 
     2519      ! 
     2520      IF( ln_timing ) CALL timing_stop('zdf_osm_os') 
     2521      ! 
     2522   END SUBROUTINE zdf_osm_osbl_state 
     2523 
     2524   SUBROUTINE zdf_osm_diffusivity_viscosity( Kbb, Kmm, kbld, kmld, ldconv, ldshear, ldpyc, ldcoup, k_ddh, pdiffut, pviscos,       & 
     2525      &                                      phbl, phml, pdh, pdhdt, pshear, pb_bl, pu_bl, pv_bl, pb_ml, pu_ml, pv_ml, pwb_ent,   & 
     2526      &                                      pwb_min ) 
     2527      !!--------------------------------------------------------------------- 
     2528      !!           ***  ROUTINE zdf_osm_diffusivity_viscosity  *** 
     2529      !! 
     2530      !! ** Purpose : Determines the eddy diffusivity and eddy viscosity 
     2531      !!              profiles in the mixed layer and the pycnocline. 
     2532      !! 
     2533      !! ** Method  : 
     2534      !! 
     2535      !!---------------------------------------------------------------------- 
     2536      INTEGER,                    INTENT(in   ) ::   Kbb, Kmm       ! Ocean time-level indices 
     2537      INTEGER,  DIMENSION(:,:),   INTENT(in   ) ::   kbld           ! BL base layer 
     2538      INTEGER,  DIMENSION(:,:),   INTENT(in   ) ::   kmld           ! ML base layer 
     2539      LOGICAL,  DIMENSION(:,:),   INTENT(in   ) ::   ldconv         ! BL stability flags 
     2540      LOGICAL,  DIMENSION(:,:),   INTENT(in   ) ::   ldshear        ! Shear layers 
     2541      LOGICAL,  DIMENSION(:,:),   INTENT(in   ) ::   ldpyc          ! Pycnocline flags 
     2542      LOGICAL,  DIMENSION(:,:),   INTENT(in   ) ::   ldcoup         ! Coupling to bottom 
     2543      INTEGER,  DIMENSION(:,:),   INTENT(in   ) ::   k_ddh          ! Type of shear layer 
     2544      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdiffut        ! t-diffusivity 
     2545      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pviscos        ! Viscosity 
     2546      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   phbl           ! BL depth 
     2547      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   phml           ! ML depth 
     2548      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pdh            ! Pycnocline depth 
     2549      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pdhdt          ! BL depth tendency 
     2550      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pshear         ! Shear production 
     2551      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pb_bl          ! Buoyancy average over the depth of the boundary layer 
     2552      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pu_bl          ! Velocity average over the depth of the boundary layer 
     2553      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pv_bl          ! Velocity average over the depth of the boundary layer 
     2554      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pb_ml          ! Buoyancy average over the depth of the mixed layer 
     2555      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pu_ml          ! Velocity average over the depth of the mixed layer 
     2556      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pv_ml          ! Velocity average over the depth of the mixed layer 
     2557      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pwb_ent        ! Buoyancy entrainment flux 
     2558      REAL(wp), DIMENSION(:,:),   INTENT(in   ) ::   pwb_min 
     2559      ! 
     2560      ! Local variables 
     2561      INTEGER ::   ji, jj, jk   ! Loop indices 
     2562      ! 
     2563      ! Scales used to calculate eddy diffusivity and viscosity profiles 
     2564      REAL(wp), DIMENSION(A2D(0)) ::   zdifml_sc,    zvisml_sc 
     2565      REAL(wp), DIMENSION(A2D(0)) ::   zdifpyc_n_sc, zdifpyc_s_sc 
     2566      REAL(wp), DIMENSION(A2D(0)) ::   zvispyc_n_sc, zvispyc_s_sc 
     2567      REAL(wp), DIMENSION(A2D(0)) ::   zbeta_d_sc,   zbeta_v_sc 
     2568      REAL(wp), DIMENSION(A2D(0)) ::   zb_coup,      zc_coup_vis,  zc_coup_dif 
     2569      ! 
     2570      REAL(wp) ::   zvel_sc_pyc, zvel_sc_ml, zstab_fac, zz_b 
     2571      REAL(wp) ::   za_cubic, zb_d_cubic, zc_d_cubic, zd_d_cubic,   &   ! Coefficients in cubic polynomial specifying diffusivity 
     2572         &                    zb_v_cubic, zc_v_cubic, zd_v_cubic        ! and viscosity in pycnocline 
     2573      REAL(wp) ::   zznd_ml, zznd_pyc, ztmp 
     2574      REAL(wp) ::   zmsku, zmskv 
     2575      ! 
     2576      REAL(wp), PARAMETER :: rn_dif_ml     = 0.8_wp,  rn_vis_ml  = 0.375_wp 
     2577      REAL(wp), PARAMETER :: rn_dif_pyc    = 0.15_wp, rn_vis_pyc = 0.142_wp 
     2578      REAL(wp), PARAMETER :: rn_vispyc_shr = 0.15_wp 
     2579      ! 
     2580      IF( ln_timing ) CALL timing_start('zdf_osm_dv') 
     2581      ! 
     2582      zb_coup(:,:) = 0.0_wp 
     2583      ! 
     2584      DO_2D( 0, 0, 0, 0 ) 
     2585         IF ( ldconv(ji,jj) ) THEN 
     2586            ! 
     2587            zvel_sc_pyc = ( 0.15_wp * svstr(ji,jj)**3 + swstrc(ji,jj)**3 + 4.25_wp * pshear(ji,jj) * phbl(ji,jj) )**pthird 
     2588            zvel_sc_ml  = ( svstr(ji,jj)**3 + 0.5_wp * swstrc(ji,jj)**3 )**pthird 
     2589            zstab_fac   = ( phml(ji,jj) / zvel_sc_ml *   & 
     2590               &            ( 1.4_wp - 0.4_wp / ( 1.0_wp + EXP(-3.5_wp * LOG10(-shol(ji,jj) ) ) )**1.25_wp ) )**2 
     2591            ! 
     2592            zdifml_sc(ji,jj) = rn_dif_ml * phml(ji,jj) * zvel_sc_ml 
     2593            zvisml_sc(ji,jj) = rn_vis_ml * zdifml_sc(ji,jj) 
     2594#ifdef key_osm_debug 
     2595            IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2596               WRITE(narea+100,'(2(a,g11.3))')'Start of 1st major loop of osm_diffusivity_viscositys, ldconv=T: zdifml_sc=',zdifml_sc(ji,jj),' zvisml_sc=',zvisml_sc(ji,jj) 
     2597               WRITE(narea+100,'(3(a,g11.3))')'zvel_sc_pyc=',zvel_sc_pyc,' zvel_sc_ml=',zvel_sc_ml,' zstab_fac=',zstab_fac 
     2598               FLUSH(narea+100) 
     2599            END IF 
     2600#endif 
     2601            ! 
     2602            IF ( ldpyc(ji,jj) ) THEN 
     2603               zdifpyc_n_sc(ji,jj) = rn_dif_pyc * zvel_sc_ml * pdh(ji,jj) 
     2604               zvispyc_n_sc(ji,jj) = 0.09_wp * zvel_sc_pyc * ( 1.0_wp - phbl(ji,jj) / pdh(ji,jj) )**2 *                           & 
     2605                  &                  ( 0.005 * ( pu_ml(ji,jj)-pu_bl(ji,jj) )**2 + 0.0075 * ( pv_ml(ji,jj)-pv_bl(ji,jj) )**2 ) /   & 
     2606                  &                  pdh(ji,jj) 
     2607               zvispyc_n_sc(ji,jj) = rn_vis_pyc * zvel_sc_ml * pdh(ji,jj) + zvispyc_n_sc(ji,jj) * zstab_fac 
     2608#ifdef key_osm_debug 
     2609               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2610                  WRITE(narea+100,'(2(a,g11.3))')' lpyc=ldconv=T, variables w/o shear contributions: zdifpyc_n_sc',zdifpyc_n_sc(ji,jj) ,' zvispyc_n_sc=',zvispyc_n_sc(ji,jj) 
     2611                  FLUSH(narea+100) 
     2612               END IF 
     2613#endif 
     2614               ! 
     2615               IF ( ldshear(ji,jj) .AND. k_ddh(ji,jj) /= 2 ) THEN 
     2616                  ztmp = rn_vispyc_shr * ( pshear(ji,jj) * phbl(ji,jj) )**pthird * phbl(ji,jj) 
     2617                  zdifpyc_n_sc(ji,jj) = zdifpyc_n_sc(ji,jj) + ztmp 
     2618                  zvispyc_n_sc(ji,jj) = zvispyc_n_sc(ji,jj) + ztmp 
     2619               ENDIF 
     2620#ifdef key_osm_debug 
     2621               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2622                  WRITE(narea+100,'(2(a,g11.3))')' lpyc=ldconv=T, variables w shear contributions: zdifpyc_n_sc',zdifpyc_n_sc(ji,jj) ,' zvispyc_n_sc=',zvispyc_n_sc(ji,jj) 
     2623                  FLUSH(narea+100) 
     2624               END IF 
     2625#endif 
     2626               ! 
     2627               zdifpyc_s_sc(ji,jj) = pwb_ent(ji,jj) + 0.0025_wp * zvel_sc_pyc * ( phbl(ji,jj) / pdh(ji,jj) - 1.0_wp ) *   & 
     2628                  &                                   ( pb_ml(ji,jj) - pb_bl(ji,jj) ) 
     2629               zvispyc_s_sc(ji,jj) = 0.09_wp * ( pwb_min(ji,jj) + 0.0025_wp * zvel_sc_pyc *                 & 
     2630                  &                                               ( phbl(ji,jj) / pdh(ji,jj) - 1.0_wp ) *   & 
     2631                  &                                               ( pb_ml(ji,jj) - pb_bl(ji,jj) ) ) 
     2632#ifdef key_osm_debug 
     2633               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2634                  WRITE(narea+100,'(2(a,g11.3))')' 1st shot at: zdifpyc_s_sc',zdifpyc_s_sc(ji,jj) ,' zvispyc_s_sc=',zvispyc_s_sc(ji,jj) 
     2635                  FLUSH(narea+100) 
     2636               END IF 
     2637#endif 
     2638               zdifpyc_s_sc(ji,jj) = 0.09_wp * zdifpyc_s_sc(ji,jj) * zstab_fac 
     2639               zvispyc_s_sc(ji,jj) = zvispyc_s_sc(ji,jj) * zstab_fac 
     2640#ifdef key_osm_debug 
     2641               IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2642                  WRITE(narea+100,'(2(a,g11.3))')' 2nd shot at: zdifpyc_s_sc',zdifpyc_s_sc(ji,jj) ,' zvispyc_s_sc=',zvispyc_s_sc(ji,jj) 
     2643                  FLUSH(narea+100) 
     2644               END IF 
     2645#endif 
     2646               ! 
     2647               zdifpyc_s_sc(ji,jj) = MAX( zdifpyc_s_sc(ji,jj), -0.5_wp * zdifpyc_n_sc(ji,jj) ) 
     2648               zvispyc_s_sc(ji,jj) = MAX( zvispyc_s_sc(ji,jj), -0.5_wp * zvispyc_n_sc(ji,jj) ) 
     2649                
     2650               zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zdifpyc_n_sc(ji,jj) + 1.4_wp * zdifpyc_s_sc(ji,jj) ) /   & 
     2651                  &                           ( zdifml_sc(ji,jj) + epsln ) )**p2third 
     2652               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 ) 
     2653            ELSE 
     2654               zdifpyc_n_sc(ji,jj) = rn_dif_pyc * zvel_sc_ml * pdh(ji,jj)   ! ag 19/03 
     2655               zdifpyc_s_sc(ji,jj) = 0.0_wp   ! ag 19/03 
     2656               zvispyc_n_sc(ji,jj) = rn_vis_pyc * zvel_sc_ml * pdh(ji,jj)   ! ag 19/03 
     2657               zvispyc_s_sc(ji,jj) = 0.0_wp   ! ag 19/03 
     2658               IF(ldcoup(ji,jj) ) THEN   ! ag 19/03 
     2659                  ! code from SUBROUTINE tke_tke zdftke.F90; uses bottom drag velocity rCdU_bot(ji,jj) = -Cd|ub| 
     2660                  !     already calculated at T-points in SUBROUTINE zdf_drg from zdfdrg.F90 
     2661                  !  Gives friction velocity sqrt bottom drag/rho_0 i.e. u* = SQRT(rCdU_bot*ub) 
     2662                  ! wet-cell averaging .. 
     2663                  zmsku = 0.5_wp * ( 2.0_wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     2664                  zmskv = 0.5_wp * ( 2.0_wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) 
     2665                  zb_coup(ji,jj) = 0.4_wp * SQRT(-1.0_wp * rCdU_bot(ji,jj) *   & 
     2666                     &             SQRT(  ( zmsku*( uu(ji,jj,mbkt(ji,jj),Kbb)+uu(ji-1,jj,mbkt(ji,jj),Kbb) ) )**2   & 
     2667                     &                  + ( zmskv*( vv(ji,jj,mbkt(ji,jj),Kbb)+vv(ji,jj-1,mbkt(ji,jj),Kbb) ) )**2  ) ) 
     2668                   
     2669                  zz_b = -1.0_wp * gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)   ! ag 19/03 
     2670                  zc_coup_vis(ji,jj) = -0.5_wp * ( 0.5_wp * zvisml_sc(ji,jj) / phml(ji,jj) - zb_coup(ji,jj) ) /   & 
     2671                     &                 ( phml(ji,jj) + zz_b )   ! ag 19/03 
     2672#ifdef key_osm_debug 
     2673                  IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2674                     WRITE(narea+100,'(4(a,g11.3))')' lcoup = T; 1st pz_b= ', zz_b, ' pb_coup ', zb_coup(ji,jj),   & 
     2675                        &                           ' pc_coup_vis ', zc_coup_vis(ji,jj), ' rCdU_bot ',rCdU_bot(ji,jj) 
     2676                     WRITE(narea+100,'(2(a,g11.3))')' zmsku ', zmsku, ' zmskv ', zmskv 
     2677                     FLUSH(narea+100) 
     2678                  END IF 
     2679#endif 
     2680                  zz_b = -1.0_wp * phml(ji,jj) + gdepw(ji,jj,mbkt(ji,jj)+1,Kmm)   ! ag 19/03 
     2681                  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 ) /   & 
     2682                     &                                  zvisml_sc(ji,jj)   ! ag 19/03 
     2683                  zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2 ) /   & 
     2684                     &                           zdifml_sc(ji,jj) )**p2third 
     2685                  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 +   & 
     2686                     &                 1.5_wp * ( zdifml_sc(ji,jj) / phml(ji,jj) ) * zbeta_d_sc(ji,jj) *   & 
     2687                     &                          SQRT( 1.0_wp - zbeta_d_sc(ji,jj) ) - zb_coup(ji,jj) ) / zz_b   ! ag 19/03 
     2688#ifdef key_osm_debug 
     2689                  IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2690                     WRITE(narea+100,'(2(a,g11.3))')' 2nd pz_b= ', zz_b, ' pc_coup_dif', zc_coup_dif(ji,jj) 
     2691                     FLUSH(narea+100) 
     2692                  END IF 
     2693#endif 
     2694               ELSE   ! ag 19/03 
     2695                  zbeta_d_sc(ji,jj) = 1.0_wp - ( ( zdifpyc_n_sc(ji,jj) + 1.4_wp * zdifpyc_s_sc(ji,jj) ) /   & 
     2696                     &                           ( zdifml_sc(ji,jj) + epsln ) )**p2third   ! ag 19/03 
     2697                  zbeta_v_sc(ji,jj) = 1.0_wp - 2.0_wp * ( zvispyc_n_sc(ji,jj) + zvispyc_s_sc(ji,jj) ) /   & 
     2698                     &                         ( zvisml_sc(ji,jj) + epsln )   ! ag 19/03 
     2699               ENDIF   ! ag 19/03 
     2700            ENDIF      ! ag 19/03 
     2701#ifdef key_osm_debug 
     2702            IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2703               WRITE(narea+100,'(2(a,g11.3))')'ldconv=T: zbeta_d_sc',zbeta_d_sc(ji,jj) ,' zbeta_v_sc=',zbeta_v_sc(ji,jj) 
     2704               WRITE(narea+100,'(2(a,g11.3))')' Final zdifpyc_n_sc',zdifpyc_n_sc(ji,jj) ,' zvispyc_n_sc=',zvispyc_n_sc(ji,jj) 
     2705               WRITE(narea+100,'(2(a,g11.3))')' Final zdifpyc_s_sc',zdifpyc_s_sc(ji,jj) ,' zvispyc_s_sc=',zvispyc_s_sc(ji,jj) 
     2706               FLUSH(narea+100) 
     2707            END IF 
     2708#endif 
     2709         ELSE 
     2710            zdifml_sc(ji,jj) = svstr(ji,jj) * phbl(ji,jj) * MAX( EXP ( -( shol(ji,jj) / 0.6_wp )**2 ), 0.2_wp) 
     2711            zvisml_sc(ji,jj) = zdifml_sc(ji,jj) 
     2712#ifdef key_osm_debug 
     2713            IF(narea==nn_narea_db.and.ji==iloc_db.and.jj==jloc_db)THEN 
     2714               WRITE(narea+100,'(a,g11.3)')'End of 1st major loop of osm_diffusivity_viscositys, ldconv=F: zdifml_sc=',zdifml_sc(ji,jj),' zvisml_sc=',zvisml_sc(ji,jj) 
     2715               FLUSH(narea+100) 
     2716            END IF 
     2717#endif 
     2718         END IF 
     2719      END_2D 
     2720      ! 
     2721      DO_2D( 0, 0, 0, 0 ) 
     2722      IF ( ldconv(ji,jj) ) THEN 
     2723         DO jk = 2, kmld(ji,jj)   ! Mixed layer diffusivity 
     2724            zznd_ml = gdepw(ji,jj,jk,Kmm) / phml(ji,jj) 
     2725            pdiffut(ji,jj,jk) = zdifml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zbeta_d_sc(ji,jj) * zznd_ml )**1.5 
     2726            pviscos(ji,jj,jk) = zvisml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zbeta_v_sc(ji,jj) * zznd_ml ) *   & 
     2727               &                ( 1.0_wp - 0.5_wp * zznd_ml**2 ) 
     2728         END DO 
     2729         ! 
     2730         ! Coupling to bottom 
     2731         ! 
     2732         IF ( ldcoup(ji,jj) ) THEN                                                         ! ag 19/03 
     2733            DO jk = mbkt(ji,jj), kmld(ji,jj), -1                                           ! ag 19/03 
     2734               zz_b = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) )   ! ag 19/03 
     2735               pviscos(ji,jj,jk) = zb_coup(ji,jj) * zz_b + zc_coup_vis(ji,jj) * zz_b**2    ! ag 19/03 
     2736               pdiffut(ji,jj,jk) = zb_coup(ji,jj) * zz_b + zc_coup_dif(ji,jj) * zz_b**2    ! ag 19/03 
     2737            END DO                                                                         ! ag 19/03 
     2738         ENDIF                                                                             ! ag 19/03 
     2739         ! Pycnocline 
     2740         IF ( ldpyc(ji,jj) ) THEN  
     2741            ! Diffusivity and viscosity profiles in the pycnocline given by 
     2742            ! cubic polynomial. Note, if ldpyc TRUE can't be coupled to seabed. 
     2743            za_cubic = 0.5_wp 
     2744            zb_d_cubic = -1.75_wp * zdifpyc_s_sc(ji,jj) / zdifpyc_n_sc(ji,jj) 
     2745            zd_d_cubic = ( pdh(ji,jj) * zdifml_sc(ji,jj) / phml(ji,jj) * SQRT( 1.0_wp - zbeta_d_sc(ji,jj) ) *   & 
     2746               &           ( 2.5_wp * zbeta_d_sc(ji,jj) - 1.0_wp ) - 0.85_wp * zdifpyc_s_sc(ji,jj) ) /            & 
     2747               &           MAX( zdifpyc_n_sc(ji,jj), 1.0e-8_wp ) 
     2748            zd_d_cubic = zd_d_cubic - zb_d_cubic - 2.0_wp * ( 1.0_wp - za_cubic  - zb_d_cubic ) 
     2749            zc_d_cubic = 1.0_wp - za_cubic - zb_d_cubic - zd_d_cubic 
     2750            zb_v_cubic = -1.75_wp * zvispyc_s_sc(ji,jj) / zvispyc_n_sc(ji,jj) 
     2751            zd_v_cubic = ( 0.5_wp * zvisml_sc(ji,jj) * pdh(ji,jj) / phml(ji,jj) - 0.85_wp * zvispyc_s_sc(ji,jj) ) /   & 
     2752               &           MAX( zvispyc_n_sc(ji,jj), 1.0e-8_wp ) 
     2753            zd_v_cubic = zd_v_cubic - zb_v_cubic - 2.0_wp * ( 1.0_wp - za_cubic - zb_v_cubic ) 
     2754            zc_v_cubic = 1.0_wp - za_cubic - zb_v_cubic - zd_v_cubic 
     2755            DO jk = kmld(ji,jj) , kbld(ji,jj) 
     2756               zznd_pyc = -1.0_wp * ( gdepw(ji,jj,jk,Kmm) - phbl(ji,jj) ) / MAX(pdh(ji,jj), 1.0e-6_wp ) 
     2757               ztmp = ( 1.75_wp * zznd_pyc - 0.15_wp * zznd_pyc**2 - 0.2_wp * zznd_pyc**3 ) 
     2758               ! 
     2759               pdiffut(ji,jj,jk) = zdifpyc_n_sc(ji,jj) *   & 
     2760                  &                ( za_cubic + zb_d_cubic * zznd_pyc + zc_d_cubic * zznd_pyc**2 + zd_d_cubic * zznd_pyc**3 ) 
     2761               ! 
     2762               pdiffut(ji,jj,jk) = pdiffut(ji,jj,jk) + zdifpyc_s_sc(ji,jj) * ztmp 
     2763               pviscos(ji,jj,jk) = zvispyc_n_sc(ji,jj) *   & 
     2764                  &                ( za_cubic + zb_v_cubic * zznd_pyc + zc_v_cubic * zznd_pyc**2 + zd_v_cubic * zznd_pyc**3 ) 
     2765               pviscos(ji,jj,jk) = pviscos(ji,jj,jk) + zvispyc_s_sc(ji,jj) * ztmp 
     2766            END DO 
     2767!                  IF ( pdhdt(ji,jj) > 0._wp ) THEN 
     2768!                     zdiffut(ji,jj,ibld(ji,jj)+1) = MAX( 0.5 * pdhdt(ji,jj) * e3w(ji,jj,ibld(ji,jj)+1,Kmm), 1.0e-6 ) 
     2769!                     zviscos(ji,jj,ibld(ji,jj)+1) = MAX( 0.5 * pdhdt(ji,jj) * e3w(ji,jj,ibld(ji,jj)+1,Kmm), 1.0e-6 ) 
     2770!                  ELSE 
     2771!                     zdiffut(ji,jj,ibld(ji,jj)) = 0._wp 
     2772!                     zviscos(ji,jj,ibld(ji,jj)) = 0._wp 
     2773!                  ENDIF 
     2774         ENDIF 
     2775      ELSE 
     2776         ! Stable conditions 
     2777         DO jk = 2, kbld(ji,jj) 
     2778            zznd_ml = gdepw(ji,jj,jk,Kmm) / phbl(ji,jj) 
     2779            pdiffut(ji,jj,jk) = 0.75_wp * zdifml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zznd_ml )**1.5_wp 
     2780            pviscos(ji,jj,jk) = 0.375_wp * zvisml_sc(ji,jj) * zznd_ml * ( 1.0_wp - zznd_ml ) * ( 1.0_wp - zznd_ml**2 ) 
     2781         END DO 
     2782         ! 
     2783         IF ( pdhdt(ji,jj) > 0.0_wp ) THEN 
     2784            pdiffut(ji,jj,kbld(ji,jj)) = MAX( pdhdt(ji,jj), 1.0e-6_wp) * e3w(ji, jj, kbld(ji,jj), Kmm) 
     2785            pviscos(ji,jj,kbld(ji,jj)) = pdiffut(ji,jj,kbld(ji,jj)) 
     2786         ENDIF 
     2787      ENDIF   ! End if ( ldconv ) 
     2788      ! 
     2789      END_2D 
     2790      IF( iom_use("pb_coup") ) CALL iom_put( "pb_coup", tmask(:,:,1) * zb_coup(:,:) )   ! BBL-coupling velocity scale 
     2791      IF( ln_timing ) CALL timing_stop('zdf_osm_dv') 
     2792      ! 
     2793   END SUBROUTINE zdf_osm_diffusivity_viscosity 
    27542794 
    27552795   SUBROUTINE zdf_osm_fgr_terms( Kmm, kbld, kmld, kp_ext, ldconv, ldpyc, k_ddh, phbl, phml, pdh, pdhdt, pshear,             & 
Note: See TracChangeset for help on using the changeset viewer.