- Timestamp:
- 2015-10-26T15:59:39+01:00 (9 years ago)
- Location:
- branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdf_oce.F90
r4147 r5837 40 40 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:) :: avtb_2d !: horizontal shape of background Kz profile 41 41 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:) :: bfrua, bfrva !: Bottom friction coefficients set in zdfbfr 42 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:) :: tfrua, tfrva !: top friction coefficients set in zdfbfr 42 43 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avmu , avmv !: vertical viscosity coef at uw- & vw-pts [m2/s] 43 44 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avm , avt !: vertical viscosity & diffusivity coef at w-pt [m2/s] … … 57 58 ALLOCATE(avmb(jpk) , bfrua(jpi,jpj) , & 58 59 & avtb(jpk) , bfrva(jpi,jpj) , avtb_2d(jpi,jpj) , & 60 & tfrua(jpi, jpj), tfrva(jpi, jpj) , & 59 61 & avmu(jpi,jpj,jpk), avm(jpi,jpj,jpk) , & 60 62 & avmv(jpi,jpj,jpk), avt(jpi,jpj,jpk) , STAT = zdf_oce_alloc ) -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfbfr.F90
r4624 r5837 41 41 REAL(wp), PUBLIC :: rn_bfrien ! local factor to enhance coefficient bfri (PUBLIC for TAM) 42 42 LOGICAL , PUBLIC :: ln_bfr2d ! logical switch for 2D enhancement (PUBLIC for TAM) 43 REAL(wp), PUBLIC :: rn_tfri1 ! top drag coefficient (linear case) (PUBLIC for TAM) 44 REAL(wp), PUBLIC :: rn_tfri2 ! top drag coefficient (non linear case) (PUBLIC for TAM) 45 REAL(wp), PUBLIC :: rn_tfri2_max ! Maximum top drag coefficient (non linear case and ln_loglayer=T) (PUBLIC for TAM) 46 REAL(wp), PUBLIC :: rn_tfeb2 ! background top turbulent kinetic energy [m2/s2] (PUBLIC for TAM) 47 REAL(wp), PUBLIC :: rn_tfrien ! local factor to enhance coefficient tfri (PUBLIC for TAM) 48 LOGICAL , PUBLIC :: ln_tfr2d ! logical switch for 2D enhancement (PUBLIC for TAM) 49 43 50 LOGICAL , PUBLIC :: ln_loglayer ! switch for log layer bfr coeff. (PUBLIC for TAM) 44 51 REAL(wp), PUBLIC :: rn_bfrz0 ! bottom roughness for loglayer bfr coeff (PUBLIC for TAM) 52 REAL(wp), PUBLIC :: rn_tfrz0 ! bottom roughness for loglayer bfr coeff (PUBLIC for TAM) 45 53 LOGICAL , PUBLIC :: ln_bfrimp ! logical switch for implicit bottom friction 46 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: bfrcoef2d ! 2D bottomdrag coefficient (PUBLIC for TAM)54 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:), PUBLIC :: bfrcoef2d, tfrcoef2d ! 2D bottom/top drag coefficient (PUBLIC for TAM) 47 55 48 56 !! * Substitutions … … 60 68 !! *** FUNCTION zdf_bfr_alloc *** 61 69 !!---------------------------------------------------------------------- 62 ALLOCATE( bfrcoef2d(jpi,jpj), STAT=zdf_bfr_alloc )70 ALLOCATE( bfrcoef2d(jpi,jpj), tfrcoef2d(jpi,jpj), STAT=zdf_bfr_alloc ) 63 71 ! 64 72 IF( lk_mpp ) CALL mpp_sum ( zdf_bfr_alloc ) … … 88 96 INTEGER :: ikbt, ikbu, ikbv ! local integers 89 97 REAL(wp) :: zvu, zuv, zecu, zecv, ztmp ! temporary scalars 90 REAL(wp), POINTER, DIMENSION(:,:) :: zbfrt 98 REAL(wp), POINTER, DIMENSION(:,:) :: zbfrt, ztfrt 91 99 !!---------------------------------------------------------------------- 92 100 ! … … 101 109 IF( nn_bfr == 2 ) THEN ! quadratic bottom friction only 102 110 ! 103 CALL wrk_alloc( jpi, jpj, zbfrt )111 CALL wrk_alloc( jpi, jpj, zbfrt, ztfrt ) 104 112 105 113 IF ( ln_loglayer.AND.lk_vvl ) THEN ! "log layer" bottom friction coefficient 106 114 107 # if defined key_vectopt_loop108 DO jj = 1, 1109 !CDIR NOVERRCHK110 DO ji = 1, jpij ! vector opt. (forced unrolling)111 # else112 !CDIR NOVERRCHK113 115 DO jj = 1, jpj 114 !CDIR NOVERRCHK115 116 DO ji = 1, jpi 116 # endif117 117 ikbt = mbkt(ji,jj) 118 ! JC: possible WAD implementation should modify line below if layers vanish118 !! JC: possible WAD implementation should modify line below if layers vanish 119 119 ztmp = tmask(ji,jj,ikbt) * ( vkarmn / LOG( 0.5_wp * fse3t_n(ji,jj,ikbt) / rn_bfrz0 ))**2._wp 120 120 zbfrt(ji,jj) = MAX(bfrcoef2d(ji,jj), ztmp) … … 122 122 END DO 123 123 END DO 124 ! (ISF) 125 IF ( ln_isfcav ) THEN 126 DO jj = 1, jpj 127 DO ji = 1, jpi 128 ikbt = mikt(ji,jj) 129 ! JC: possible WAD implementation should modify line below if layers vanish 130 ztmp = (1-tmask(ji,jj,1)) * ( vkarmn / LOG( 0.5_wp * fse3t_n(ji,jj,ikbt) / rn_bfrz0 ))**2._wp 131 ztfrt(ji,jj) = MAX(tfrcoef2d(ji,jj), ztmp) 132 ztfrt(ji,jj) = MIN(ztfrt(ji,jj), rn_tfri2_max) 133 END DO 134 END DO 135 END IF 124 136 ! 125 137 ELSE 126 138 zbfrt(:,:) = bfrcoef2d(:,:) 127 ENDIF 128 129 # if defined key_vectopt_loop 130 DO jj = 1, 1 131 !CDIR NOVERRCHK 132 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 133 # else 134 !CDIR NOVERRCHK 139 ztfrt(:,:) = tfrcoef2d(:,:) 140 ENDIF 141 135 142 DO jj = 2, jpjm1 136 !CDIR NOVERRCHK137 143 DO ji = 2, jpim1 138 # endif139 144 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 140 145 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) … … 150 155 bfrua(ji,jj) = - 0.5_wp * ( zbfrt(ji,jj) + zbfrt(ji+1,jj ) ) * zecu 151 156 bfrva(ji,jj) = - 0.5_wp * ( zbfrt(ji,jj) + zbfrt(ji ,jj+1) ) * zecv 157 ! 158 ! in case of 2 cell water column, we assume each cell feels the top and bottom friction 159 IF ( ln_isfcav ) THEN 160 IF ( miku(ji,jj) + 1 .GE. mbku(ji,jj) ) THEN 161 bfrua(ji,jj) = - 0.5_wp * ( ( zbfrt(ji,jj) + zbfrt(ji+1,jj ) ) & 162 & + ( ztfrt(ji,jj) + ztfrt(ji+1,jj ) ) ) & 163 & * zecu * (1._wp - umask(ji,jj,1)) 164 END IF 165 IF ( mikv(ji,jj) + 1 .GE. mbkv(ji,jj) ) THEN 166 bfrva(ji,jj) = - 0.5_wp * ( ( zbfrt(ji,jj) + zbfrt(ji ,jj+1) ) & 167 & + ( ztfrt(ji,jj) + ztfrt(ji ,jj+1) ) ) & 168 & * zecv * (1._wp - vmask(ji,jj,1)) 169 END IF 170 END IF 152 171 END DO 153 172 END DO 154 155 !156 173 CALL lbc_lnk( bfrua, 'U', 1. ) ; CALL lbc_lnk( bfrva, 'V', 1. ) ! Lateral boundary condition 174 175 IF ( ln_isfcav ) THEN 176 DO jj = 2, jpjm1 177 DO ji = 2, jpim1 178 ! (ISF) ======================================================================== 179 ikbu = miku(ji,jj) ! ocean top level at u- and v-points 180 ikbv = mikv(ji,jj) ! (1st wet ocean u- and v-points) 181 ! 182 zvu = 0.25 * ( vn(ji,jj ,ikbu) + vn(ji+1,jj ,ikbu) & 183 & + vn(ji,jj-1,ikbu) + vn(ji+1,jj-1,ikbu) ) 184 zuv = 0.25 * ( un(ji,jj ,ikbv) + un(ji-1,jj ,ikbv) & 185 & + un(ji,jj+1,ikbv) + un(ji-1,jj+1,ikbv) ) 186 ! 187 zecu = SQRT( un(ji,jj,ikbu) * un(ji,jj,ikbu) + zvu*zvu + rn_tfeb2 ) 188 zecv = SQRT( vn(ji,jj,ikbv) * vn(ji,jj,ikbv) + zuv*zuv + rn_tfeb2 ) 189 ! 190 tfrua(ji,jj) = - 0.5_wp * ( ztfrt(ji,jj) + ztfrt(ji+1,jj ) ) * zecu * (1._wp - umask(ji,jj,1)) 191 tfrva(ji,jj) = - 0.5_wp * ( ztfrt(ji,jj) + ztfrt(ji ,jj+1) ) * zecv * (1._wp - vmask(ji,jj,1)) 192 ! (ISF) END ==================================================================== 193 ! in case of 2 cell water column, we assume each cell feels the top and bottom friction 194 IF ( miku(ji,jj) + 1 .GE. mbku(ji,jj) ) THEN 195 tfrua(ji,jj) = - 0.5_wp * ( ( ztfrt(ji,jj) + ztfrt(ji+1,jj ) ) & 196 & + ( zbfrt(ji,jj) + zbfrt(ji+1,jj ) ) ) & 197 & * zecu * (1._wp - umask(ji,jj,1)) 198 END IF 199 IF ( mikv(ji,jj) + 1 .GE. mbkv(ji,jj) ) THEN 200 tfrva(ji,jj) = - 0.5_wp * ( ( ztfrt(ji,jj) + ztfrt(ji ,jj+1) ) & 201 & + ( zbfrt(ji,jj) + zbfrt(ji ,jj+1) ) ) & 202 & * zecv * (1._wp - vmask(ji,jj,1)) 203 END IF 204 END DO 205 END DO 206 CALL lbc_lnk( tfrua, 'U', 1. ) ; CALL lbc_lnk( tfrva, 'V', 1. ) ! Lateral boundary condition 207 END IF 208 ! 157 209 ! 158 210 IF(ln_ctl) CALL prt_ctl( tab2d_1=bfrua, clinfo1=' bfr - u: ', mask1=umask, & 159 211 & tab2d_2=bfrva, clinfo2= ' v: ', mask2=vmask,ovlap=1 ) 160 CALL wrk_dealloc( jpi,jpj,zbfrt )212 CALL wrk_dealloc( jpi,jpj,zbfrt, ztfrt ) 161 213 ENDIF 162 214 ! … … 183 235 INTEGER :: ios 184 236 REAL(wp) :: zminbfr, zmaxbfr ! temporary scalars 237 REAL(wp) :: zmintfr, zmaxtfr ! temporary scalars 185 238 REAL(wp) :: ztmp, zfru, zfrv ! - - 186 239 !! 187 240 NAMELIST/nambfr/ nn_bfr, rn_bfri1, rn_bfri2, rn_bfri2_max, rn_bfeb2, rn_bfrz0, ln_bfr2d, & 188 & rn_bfrien, ln_bfrimp, ln_loglayer 241 & rn_tfri1, rn_tfri2, rn_tfri2_max, rn_tfeb2, rn_tfrz0, ln_tfr2d, & 242 & rn_bfrien, rn_tfrien, ln_bfrimp, ln_loglayer 189 243 !!---------------------------------------------------------------------- 190 244 ! … … 215 269 bfrua(:,:) = 0.e0 216 270 bfrva(:,:) = 0.e0 271 tfrua(:,:) = 0.e0 272 tfrva(:,:) = 0.e0 217 273 ! 218 274 CASE( 1 ) 219 275 IF(lwp) WRITE(numout,*) ' linear botton friction' 220 IF(lwp) WRITE(numout,*) ' friction coef. rn_bfri1 = ', rn_bfri1276 IF(lwp) WRITE(numout,*) ' bottom friction coef. rn_bfri1 = ', rn_bfri1 221 277 IF( ln_bfr2d ) THEN 222 278 IF(lwp) WRITE(numout,*) ' read coef. enhancement distribution from file ln_bfr2d = ', ln_bfr2d 223 279 IF(lwp) WRITE(numout,*) ' coef rn_bfri2 enhancement factor rn_bfrien = ',rn_bfrien 224 280 ENDIF 281 IF ( ln_isfcav ) THEN 282 IF(lwp) WRITE(numout,*) ' top friction coef. rn_bfri1 = ', rn_tfri1 283 IF( ln_tfr2d ) THEN 284 IF(lwp) WRITE(numout,*) ' read coef. enhancement distribution from file ln_tfr2d = ', ln_tfr2d 285 IF(lwp) WRITE(numout,*) ' coef rn_tfri2 enhancement factor rn_tfrien = ',rn_tfrien 286 ENDIF 287 END IF 225 288 ! 226 289 IF(ln_bfr2d) THEN … … 236 299 bfrua(:,:) = - bfrcoef2d(:,:) 237 300 bfrva(:,:) = - bfrcoef2d(:,:) 301 ! 302 IF ( ln_isfcav ) THEN 303 IF(ln_tfr2d) THEN 304 ! tfr_coef is a coefficient in [0,1] giving the mask where to apply the bfr enhancement 305 CALL iom_open('tfr_coef.nc',inum) 306 CALL iom_get (inum, jpdom_data, 'tfr_coef',tfrcoef2d,1) ! tfrcoef2d is used as tmp array 307 CALL iom_close(inum) 308 tfrcoef2d(:,:) = rn_tfri1 * ( 1 + rn_tfrien * tfrcoef2d(:,:) ) 309 ELSE 310 tfrcoef2d(:,:) = rn_tfri1 ! initialize tfrcoef2d to the namelist variable 311 ENDIF 312 ! 313 tfrua(:,:) = - tfrcoef2d(:,:) 314 tfrva(:,:) = - tfrcoef2d(:,:) 315 END IF 238 316 ! 239 317 CASE( 2 ) … … 252 330 IF(lwp) WRITE(numout,*) ' coef rn_bfri2 enhancement factor rn_bfrien = ',rn_bfrien 253 331 ENDIF 332 IF ( ln_isfcav ) THEN 333 IF(lwp) WRITE(numout,*) ' quadratic top friction' 334 IF(lwp) WRITE(numout,*) ' friction coef. rn_tfri2 = ', rn_tfri2 335 IF(lwp) WRITE(numout,*) ' Max. coef. (log case) rn_tfri2_max = ', rn_tfri2_max 336 IF(lwp) WRITE(numout,*) ' background tke rn_tfeb2 = ', rn_tfeb2 337 IF(lwp) WRITE(numout,*) ' log formulation ln_tfr2d = ', ln_loglayer 338 IF(lwp) WRITE(numout,*) ' top roughness rn_tfrz0 [m] = ', rn_tfrz0 339 IF( rn_tfrz0<=0.e0 ) THEN 340 WRITE(ctmp1,*) ' top roughness must be strictly positive' 341 CALL ctl_stop( ctmp1 ) 342 ENDIF 343 IF( ln_tfr2d ) THEN 344 IF(lwp) WRITE(numout,*) ' read coef. enhancement distribution from file ln_tfr2d = ', ln_tfr2d 345 IF(lwp) WRITE(numout,*) ' coef rn_tfri2 enhancement factor rn_tfrien = ',rn_tfrien 346 ENDIF 347 END IF 254 348 ! 255 349 IF(ln_bfr2d) THEN … … 263 357 bfrcoef2d(:,:) = rn_bfri2 ! initialize bfrcoef2d to the namelist variable 264 358 ENDIF 359 360 IF ( ln_isfcav ) THEN 361 IF(ln_tfr2d) THEN 362 ! tfr_coef is a coefficient in [0,1] giving the mask where to apply the bfr enhancement 363 CALL iom_open('tfr_coef.nc',inum) 364 CALL iom_get (inum, jpdom_data, 'tfr_coef',tfrcoef2d,1) ! tfrcoef2d is used as tmp array 365 CALL iom_close(inum) 366 ! 367 tfrcoef2d(:,:) = rn_tfri2 * ( 1 + rn_tfrien * tfrcoef2d(:,:) ) 368 ELSE 369 tfrcoef2d(:,:) = rn_tfri2 ! initialize tfrcoef2d to the namelist variable 370 ENDIF 371 END IF 265 372 ! 266 373 IF ( ln_loglayer.AND.(.NOT.lk_vvl) ) THEN ! set "log layer" bottom friction once for all 267 # if defined key_vectopt_loop268 DO jj = 1, 1269 !CDIR NOVERRCHK270 DO ji = 1, jpij ! vector opt. (forced unrolling)271 # else272 !CDIR NOVERRCHK273 374 DO jj = 1, jpj 274 !CDIR NOVERRCHK275 375 DO ji = 1, jpi 276 # endif277 376 ikbt = mbkt(ji,jj) 278 377 ztmp = tmask(ji,jj,ikbt) * ( vkarmn / LOG( 0.5_wp * fse3t_n(ji,jj,ikbt) / rn_bfrz0 ))**2._wp … … 281 380 END DO 282 381 END DO 382 IF ( ln_isfcav ) THEN 383 DO jj = 1, jpj 384 DO ji = 1, jpi 385 ikbt = mikt(ji,jj) 386 ztmp = tmask(ji,jj,ikbt) * ( vkarmn / LOG( 0.5_wp * fse3t_n(ji,jj,ikbt) / rn_tfrz0 ))**2._wp 387 tfrcoef2d(ji,jj) = MAX(tfrcoef2d(ji,jj), ztmp) 388 tfrcoef2d(ji,jj) = MIN(tfrcoef2d(ji,jj), rn_tfri2_max) 389 END DO 390 END DO 391 END IF 283 392 ENDIF 284 393 ! … … 308 417 zminbfr = 1.e10_wp ! initialise tracker for minimum of bottom friction coefficient 309 418 zmaxbfr = -1.e10_wp ! initialise tracker for maximum of bottom friction coefficient 310 ! 311 # if defined key_vectopt_loop 312 DO jj = 1, 1 313 !CDIR NOVERRCHK 314 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 315 # else 316 !CDIR NOVERRCHK 419 zmintfr = 1.e10_wp ! initialise tracker for minimum of bottom friction coefficient 420 zmaxtfr = -1.e10_wp ! initialise tracker for maximum of bottom friction coefficient 421 ! 317 422 DO jj = 2, jpjm1 318 !CDIR NOVERRCHK319 423 DO ji = 2, jpim1 320 # endif321 424 ikbu = mbku(ji,jj) ! deepest ocean level at u- and v-points 322 425 ikbv = mbkv(ji,jj) … … 339 442 zminbfr = MIN( zminbfr, MIN( zfru, ABS( bfrcoef2d(ji,jj) ) ) ) 340 443 zmaxbfr = MAX( zmaxbfr, MIN( zfrv, ABS( bfrcoef2d(ji,jj) ) ) ) 444 ! (ISF) 445 IF ( ln_isfcav ) THEN 446 ikbu = miku(ji,jj) ! 1st wet ocean level at u- and v-points 447 ikbv = mikv(ji,jj) 448 zfru = 0.5 * fse3u(ji,jj,ikbu) / rdt 449 zfrv = 0.5 * fse3v(ji,jj,ikbv) / rdt 450 IF( ABS( tfrcoef2d(ji,jj) ) > zfru ) THEN 451 IF( ln_ctl ) THEN 452 WRITE(numout,*) 'TFR ', narea, nimpp+ji, njmpp+jj, ikbu 453 WRITE(numout,*) 'TFR ', ABS( tfrcoef2d(ji,jj) ), zfru 454 ENDIF 455 ictu = ictu + 1 456 ENDIF 457 IF( ABS( tfrcoef2d(ji,jj) ) > zfrv ) THEN 458 IF( ln_ctl ) THEN 459 WRITE(numout,*) 'TFR ', narea, nimpp+ji, njmpp+jj, ikbv 460 WRITE(numout,*) 'TFR ', tfrcoef2d(ji,jj), zfrv 461 ENDIF 462 ictv = ictv + 1 463 ENDIF 464 zmintfr = MIN( zmintfr, MIN( zfru, ABS( tfrcoef2d(ji,jj) ) ) ) 465 zmaxtfr = MAX( zmaxtfr, MIN( zfrv, ABS( tfrcoef2d(ji,jj) ) ) ) 466 END IF 467 ! END ISF 341 468 END DO 342 469 END DO … … 346 473 CALL mpp_min( zminbfr ) 347 474 CALL mpp_max( zmaxbfr ) 475 IF ( ln_isfcav) CALL mpp_min( zmintfr ) 476 IF ( ln_isfcav) CALL mpp_max( zmaxtfr ) 348 477 ENDIF 349 478 IF( .NOT.ln_bfrimp) THEN 350 479 IF( lwp .AND. ictu + ictv > 0 ) THEN 351 WRITE(numout,*) ' Bottom friction stability check failed at ', ictu, ' U-points '352 WRITE(numout,*) ' Bottom friction stability check failed at ', ictv, ' V-points '480 WRITE(numout,*) ' Bottom/Top friction stability check failed at ', ictu, ' U-points ' 481 WRITE(numout,*) ' Bottom/Top friction stability check failed at ', ictv, ' V-points ' 353 482 WRITE(numout,*) ' Bottom friction coefficient now ranges from: ', zminbfr, ' to ', zmaxbfr 354 WRITE(numout,*) ' Bottom friction coefficient will be reduced where necessary' 483 IF ( ln_isfcav ) WRITE(numout,*) ' Top friction coefficient now ranges from: ', zmintfr, ' to ', zmaxtfr 484 WRITE(numout,*) ' Bottom/Top friction coefficient will be reduced where necessary' 355 485 ENDIF 356 486 ENDIF -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfddm.F90
r4624 r5837 6 6 !! History : OPA ! 2000-08 (G. Madec) double diffusive mixing 7 7 !! NEMO 1.0 ! 2002-06 (G. Madec) F90: Free form and module 8 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 8 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 9 !! 3.6 ! 2013-04 (G. Madec, F. Roquet) zrau compute locally using interpolation of alpha & beta 9 10 !!---------------------------------------------------------------------- 10 11 #if defined key_zdfddm || defined key_esopa … … 18 19 USE dom_oce ! ocean space and time domain variables 19 20 USE zdf_oce ! ocean vertical physics variables 21 USE eosbn2 ! equation of state 22 ! 20 23 USE in_out_manager ! I/O manager 21 24 USE lbclnk ! ocean lateral boundary conditions (or mpp link) … … 34 37 LOGICAL , PUBLIC, PARAMETER :: lk_zdfddm = .TRUE. !: double diffusive mixing flag 35 38 36 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avs !: salinity vertical diffusivity coeff. at w-point 37 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: rrau !: heat/salt buoyancy flux ratio 38 39 ! !!* Namelist namzdf_ddm : double diffusive mixing * 40 REAL(wp) :: rn_avts ! maximum value of avs for salt fingering 41 REAL(wp) :: rn_hsbfr ! heat/salt buoyancy flux ratio 39 REAL(wp), PUBLIC, SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avs !: salinity vertical diffusivity coeff. at w-point 40 41 ! !!* Namelist namzdf_ddm : double diffusive mixing * 42 REAL(wp) :: rn_avts ! maximum value of avs for salt fingering 43 REAL(wp) :: rn_hsbfr ! heat/salt buoyancy flux ratio 42 44 43 45 !! * Substitutions 46 # include "domzgr_substitute.h90" 44 47 # include "vectopt_loop_substitute.h90" 45 48 !!---------------------------------------------------------------------- 46 !! NEMO/OPA 4.0 , NEMO Consortium (2011)49 !! NEMO/OPA 3.7 , NEMO Consortium (2014) 47 50 !! $Id$ 48 51 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 54 57 !! *** ROUTINE zdf_ddm_alloc *** 55 58 !!---------------------------------------------------------------------- 56 ALLOCATE( avs(jpi,jpj,jpk), rrau(jpi,jpj,jpk), STAT= zdf_ddm_alloc ) 57 ! 59 ALLOCATE( avs(jpi,jpj,jpk) , STAT= zdf_ddm_alloc ) 58 60 IF( lk_mpp ) CALL mpp_sum ( zdf_ddm_alloc ) 59 61 IF( zdf_ddm_alloc /= 0 ) CALL ctl_warn('zdf_ddm_alloc: failed to allocate arrays') … … 71 73 !! diffusive mixing (i.e. salt fingering and diffusive layering) 72 74 !! following Merryfield et al. (1999). The rate of double diffusive 73 !! mixing depend on the buoyancy ratio: Rrau=alpha/beta dk[T]/dk[S] 74 !! which is computed in rn2.F 75 !! mixing depend on the buoyancy ratio (R=alpha/beta dk[T]/dk[S]): 75 76 !! * salt fingering (Schmitt 1981): 76 !! for R rau > 1 and rn2 > 0 : zavfs = rn_avts / ( 1 + (Rrau/rn_hsbfr)^6 )77 !! for R rau> 1 and rn2 > 0 : zavfs = O78 !! otherwise : zavft = 0.7 zavs / R rau77 !! for R > 1 and rn2 > 0 : zavfs = rn_avts / ( 1 + (R/rn_hsbfr)^6 ) 78 !! for R > 1 and rn2 > 0 : zavfs = O 79 !! otherwise : zavft = 0.7 zavs / R 79 80 !! * diffusive layering (Federov 1988): 80 !! for 0< Rrau < 1 and rn2 > 0 : zavdt = 1.3635e-6 81 !! * exp( 4.6 exp(-0.54 (1/Rrau-1) ) ) 81 !! for 0< R < 1 and N^2 > 0 : zavdt = 1.3635e-6 * exp( 4.6 exp(-0.54 (1/R-1) ) ) 82 82 !! otherwise : zavdt = 0 83 !! for .5 < R rau < 1 and rn2 > 0 : zavds = zavdt (1.885 Rrau-0.85)84 !! for 0 < R rau <.5 and rn2 > 0 : zavds = zavdt 0.15 Rrau83 !! for .5 < R < 1 and N^2 > 0 : zavds = zavdt (1.885 R -0.85) 84 !! for 0 < R <.5 and N^2 > 0 : zavds = zavdt 0.15 R 85 85 !! otherwise : zavds = 0 86 86 !! * update the eddy diffusivity: … … 96 96 ! 97 97 INTEGER :: ji, jj , jk ! dummy loop indices 98 REAL(wp) :: zinr, zrr ! temporary scalars 99 REAL(wp) :: zavft, zavfs ! - - 100 REAL(wp) :: zavdt, zavds ! - - 101 REAL(wp), POINTER, DIMENSION(:,:) :: zmsks, zmskf, zmskd1, zmskd2, zmskd3 98 REAL(wp) :: zaw, zbw, zrw ! local scalars 99 REAL(wp) :: zdt, zds 100 REAL(wp) :: zinr, zrr ! - - 101 REAL(wp) :: zavft, zavfs ! - - 102 REAL(wp) :: zavdt, zavds ! - - 103 REAL(wp), POINTER, DIMENSION(:,:) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 102 104 !!---------------------------------------------------------------------- 103 105 ! 104 106 IF( nn_timing == 1 ) CALL timing_start('zdf_ddm') 105 107 ! 106 CALL wrk_alloc( jpi,jpj, z msks, zmskf, zmskd1, zmskd2, zmskd3 )107 108 CALL wrk_alloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 ) 109 ! 108 110 ! ! =============== 109 111 DO jk = 2, jpkm1 ! Horizontal slab … … 111 113 ! Define the mask 112 114 ! --------------- 113 rrau(:,:,jk) = MAX( 1.e-20, rrau(:,:,jk) ) ! only retains positive value of rrau 115 DO jj = 1, jpj ! R=zrau = (alpha / beta) (dk[t] / dk[s]) 116 DO ji = 1, jpi 117 zrw = ( fsdepw(ji,jj,jk ) - fsdept(ji,jj,jk) ) & 118 & / ( fsdept(ji,jj,jk-1) - fsdept(ji,jj,jk) ) 119 ! 120 zaw = ( rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem) * zrw ) & 121 & * tmask(ji,jj,jk) * tmask(ji,jj,jk-1) 122 zbw = ( rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal) * zrw ) & 123 & * tmask(ji,jj,jk) * tmask(ji,jj,jk-1) 124 ! 125 zdt = zaw * ( tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) 126 zds = zbw * ( tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) 127 IF( ABS( zds) <= 1.e-20_wp ) zds = 1.e-20_wp 128 zrau(ji,jj) = MAX( 1.e-20, zdt / zds ) ! only retains positive value of zrau 129 END DO 130 END DO 114 131 115 132 DO jj = 1, jpj ! indicators: … … 119 136 ELSE ; zmsks(ji,jj) = 1._wp 120 137 ENDIF 121 ! salt fingering indicator: msksf=1 if rrau>1; 0 elsewhere122 IF( rrau(ji,jj,jk) <= 1.) THEN ; zmskf(ji,jj) = 0._wp138 ! salt fingering indicator: msksf=1 if R>1; 0 elsewhere 139 IF( zrau(ji,jj) <= 1. ) THEN ; zmskf(ji,jj) = 0._wp 123 140 ELSE ; zmskf(ji,jj) = 1._wp 124 141 ENDIF 125 142 ! diffusive layering indicators: 126 ! ! mskdl1=1 if 0< rrau<1; 0 elsewhere127 IF( rrau(ji,jj,jk) >= 1.) THEN ; zmskd1(ji,jj) = 0._wp143 ! ! mskdl1=1 if 0< R <1; 0 elsewhere 144 IF( zrau(ji,jj) >= 1. ) THEN ; zmskd1(ji,jj) = 0._wp 128 145 ELSE ; zmskd1(ji,jj) = 1._wp 129 146 ENDIF 130 ! ! mskdl2=1 if 0< rrau<0.5; 0 elsewhere131 IF( rrau(ji,jj,jk) >= 0.5) THEN ; zmskd2(ji,jj) = 0._wp147 ! ! mskdl2=1 if 0< R <0.5; 0 elsewhere 148 IF( zrau(ji,jj) >= 0.5 ) THEN ; zmskd2(ji,jj) = 0._wp 132 149 ELSE ; zmskd2(ji,jj) = 1._wp 133 150 ENDIF 134 ! mskdl3=1 if 0.5< rrau<1; 0 elsewhere135 IF( rrau(ji,jj,jk) <= 0.5 .OR. rrau(ji,jj,jk) >= 1. ) THEN ; zmskd3(ji,jj) = 0._wp136 ELSE 151 ! mskdl3=1 if 0.5< R <1; 0 elsewhere 152 IF( zrau(ji,jj) <= 0.5 .OR. zrau(ji,jj) >= 1. ) THEN ; zmskd3(ji,jj) = 0._wp 153 ELSE ; zmskd3(ji,jj) = 1._wp 137 154 ENDIF 138 155 END DO 139 156 END DO 140 157 ! mask zmsk in order to have avt and avs masked 141 zmsks(:,:) = zmsks(:,:) * tmask(:,:,jk)158 zmsks(:,:) = zmsks(:,:) * wmask(:,:,jk) 142 159 143 160 … … 149 166 !CDIR NOVERRCHK 150 167 DO ji = 1, jpi 151 zinr = 1. /rrau(ji,jj,jk)168 zinr = 1._wp / zrau(ji,jj) 152 169 ! salt fingering 153 zrr = rrau(ji,jj,jk)/rn_hsbfr170 zrr = zrau(ji,jj) / rn_hsbfr 154 171 zrr = zrr * zrr 155 172 zavfs = rn_avts / ( 1 + zrr*zrr*zrr ) * zmsks(ji,jj) * zmskf(ji,jj) … … 157 174 ! diffusive layering 158 175 zavdt = 1.3635e-6 * EXP( 4.6 * EXP( -0.54*(zinr-1.) ) ) * zmsks(ji,jj) * zmskd1(ji,jj) 159 zavds = zavdt * zmsks(ji,jj) * ( ( 1.85 * rrau(ji,jj,jk) - 0.85 ) * zmskd3(ji,jj) &160 & + 0.15 * rrau(ji,jj,jk) * zmskd2(ji,jj) )176 zavds = zavdt * zmsks(ji,jj) * ( ( 1.85 * zrau(ji,jj) - 0.85 ) * zmskd3(ji,jj) & 177 & + 0.15 * zrau(ji,jj) * zmskd2(ji,jj) ) 161 178 ! add to the eddy viscosity coef. previously computed 162 179 avs (ji,jj,jk) = avt(ji,jj,jk) + zavfs + zavds … … 174 191 avmu(ji,jj,jk) = MAX( avmu(ji,jj,jk), & 175 192 & avt(ji,jj,jk), avt(ji+1,jj,jk), & 176 & avs(ji,jj,jk), avs(ji+1,jj,jk) ) * umask(ji,jj,jk)193 & avs(ji,jj,jk), avs(ji+1,jj,jk) ) * wumask(ji,jj,jk) 177 194 avmv(ji,jj,jk) = MAX( avmv(ji,jj,jk), & 178 195 & avt(ji,jj,jk), avt(ji,jj+1,jk), & 179 & avs(ji,jj,jk), avs(ji,jj+1,jk) ) * vmask(ji,jj,jk)196 & avs(ji,jj,jk), avs(ji,jj+1,jk) ) * wvmask(ji,jj,jk) 180 197 END DO 181 198 END DO … … 196 213 ENDIF 197 214 ! 198 CALL wrk_dealloc( jpi,jpj, z msks, zmskf, zmskd1, zmskd2, zmskd3 )215 CALL wrk_dealloc( jpi,jpj, zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 ) 199 216 ! 200 217 IF( nn_timing == 1 ) CALL timing_stop('zdf_ddm') … … 212 229 !! called by zdf_ddm at the first timestep (nit000) 213 230 !!---------------------------------------------------------------------- 231 INTEGER :: ios ! local integer 232 !! 214 233 NAMELIST/namzdf_ddm/ rn_avts, rn_hsbfr 215 INTEGER :: ios ! Local integer output status for namelist read216 234 !!---------------------------------------------------------------------- 217 235 ! … … 237 255 IF( zdf_ddm_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_ddm_init : unable to allocate arrays' ) 238 256 ! ! initialization to masked Kz 239 avs(:,:,:) = rn_avt0 * tmask(:,:,:)257 avs(:,:,:) = rn_avt0 * wmask(:,:,:) 240 258 ! 241 259 END SUBROUTINE zdf_ddm_init -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90
r3294 r5837 78 78 ! 79 79 DO jk = 1, jpkm1 80 #if defined key_vectopt_loop81 DO jj = 1, 1 ! big loop forced82 DO ji = jpi+2, jpij83 #else84 80 DO jj = 2, jpj ! no vector opt. 85 81 DO ji = 2, jpi 86 #endif87 82 #if defined key_zdfkpp 88 83 ! no evd mixing in the boundary layer with KPP … … 110 105 DO jk = 1, jpkm1 111 106 !!! WHERE( rn2(:,:,jk) <= -1.e-12 ) avt(:,:,jk) = tmask(:,:,jk) * avevd ! agissant sur T SEUL! 112 #if defined key_vectopt_loop113 DO jj = 1, 1 ! big loop forced114 DO ji = 1, jpij115 #else116 107 DO jj = 1, jpj ! loop over the whole domain (no lbc_lnk call) 117 108 DO ji = 1, jpi 118 #endif119 109 #if defined key_zdfkpp 120 110 ! no evd mixing in the boundary layer with KPP -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90
r4624 r5837 20 20 USE domvvl ! ocean space and time domain : variable volume layer 21 21 USE zdf_oce ! ocean vertical physics 22 USE zdfbfr ! bottom friction (only for rn_bfrz0) 22 23 USE sbc_oce ! surface boundary condition: ocean 23 24 USE phycst ! physical constants … … 52 53 53 54 ! !! ** Namelist namzdf_gls ** 54 LOGICAL :: ln_crban ! =T use Craig and Banner scheme55 55 LOGICAL :: ln_length_lim ! use limit on the dissipation rate under stable stratification (Galperin et al. 1988) 56 56 LOGICAL :: ln_sigpsi ! Activate Burchard (2003) modification for k-eps closure & wave breaking mixing 57 INTEGER :: nn_tkebc_surf ! TKE surface boundary condition (=0/1) 58 INTEGER :: nn_tkebc_bot ! TKE bottom boundary condition (=0/1) 59 INTEGER :: nn_psibc_surf ! PSI surface boundary condition (=0/1) 60 INTEGER :: nn_psibc_bot ! PSI bottom boundary condition (=0/1) 57 INTEGER :: nn_bc_surf ! surface boundary condition (=0/1) 58 INTEGER :: nn_bc_bot ! bottom boundary condition (=0/1) 59 INTEGER :: nn_z0_met ! Method for surface roughness computation 61 60 INTEGER :: nn_stab_func ! stability functions G88, KC or Canuto (=0/1/2) 62 61 INTEGER :: nn_clos ! closure 0/1/2/3 MY82/k-eps/k-w/gen … … 66 65 REAL(wp) :: rn_charn ! Charnock constant for surface breaking waves mixing : 1400. (standard) or 2.e5 (Stacey value) 67 66 REAL(wp) :: rn_crban ! Craig and Banner constant for surface breaking waves mixing 68 69 REAL(wp) :: hsro = 0.003_wp ! Minimum surface roughness70 REAL(wp) :: hbro = 0.003_wp ! Bottom roughness (m) 67 REAL(wp) :: rn_hsro ! Minimum surface roughness 68 REAL(wp) :: rn_frac_hs ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 69 71 70 REAL(wp) :: rcm_sf = 0.73_wp ! Shear free turbulence parameters 72 71 REAL(wp) :: ra_sf = -2.0_wp ! Must be negative -2 < ra_sf < -1 … … 96 95 REAL(wp) :: rm7 = 0.0_wp 97 96 REAL(wp) :: rm8 = 0.318_wp 98 97 REAL(wp) :: rtrans = 0.1_wp 99 98 REAL(wp) :: rc02, rc02r, rc03, rc04 ! coefficients deduced from above parameters 100 REAL(wp) :: rc03_sqrt2_galp ! - - - - 101 REAL(wp) :: rsbc_tke1, rsbc_tke2, rsbc_tke3, rfact_tke ! - - - - 102 REAL(wp) :: rsbc_psi1, rsbc_psi2, rsbc_psi3, rfact_psi ! - - - - 103 REAL(wp) :: rsbc_mb , rsbc_std , rsbc_zs ! - - - - 99 REAL(wp) :: rsbc_tke1, rsbc_tke2, rfact_tke ! - - - - 100 REAL(wp) :: rsbc_psi1, rsbc_psi2, rfact_psi ! - - - - 101 REAL(wp) :: rsbc_zs1, rsbc_zs2 ! - - - - 104 102 REAL(wp) :: rc0, rc2, rc3, rf6, rcff, rc_diff ! - - - - 105 103 REAL(wp) :: rs0, rs1, rs2, rs4, rs5, rs6 ! - - - - … … 147 145 REAL(wp) :: gh, gm, shr, dif, zsqen, zav ! - - 148 146 REAL(wp), POINTER, DIMENSION(:,: ) :: zdep 147 REAL(wp), POINTER, DIMENSION(:,: ) :: zkar 149 148 REAL(wp), POINTER, DIMENSION(:,: ) :: zflxs ! Turbulence fluxed induced by internal waves 150 149 REAL(wp), POINTER, DIMENSION(:,: ) :: zhsro ! Surface roughness (surface waves) … … 153 152 REAL(wp), POINTER, DIMENSION(:,:,:) :: shear ! vertical shear 154 153 REAL(wp), POINTER, DIMENSION(:,:,:) :: eps ! dissipation rate 155 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwall_psi ! Wall function use in the wb case (ln_sigpsi.AND.ln_crban=T) 156 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_a, z_elem_b, z_elem_c, psi 154 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwall_psi ! Wall function use in the wb case (ln_sigpsi) 155 REAL(wp), POINTER, DIMENSION(:,:,:) :: psi ! psi at time now 156 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_a ! element of the first matrix diagonal 157 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_b ! element of the second matrix diagonal 158 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_c ! element of the third matrix diagonal 157 159 !!-------------------------------------------------------------------- 158 160 ! 159 161 IF( nn_timing == 1 ) CALL timing_start('zdf_gls') 160 162 ! 161 CALL wrk_alloc( jpi,jpj, zdep, z flxs, zhsro )162 CALL wrk_alloc( jpi,jpj,jpk, eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi )163 163 CALL wrk_alloc( jpi,jpj, zdep, zkar, zflxs, zhsro ) 164 CALL wrk_alloc( jpi,jpj,jpk, eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 165 164 166 ! Preliminary computing 165 167 … … 174 176 175 177 ! Compute surface and bottom friction at T-points 176 !CDIR NOVERRCHK 177 DO jj = 2, jpjm1 178 !CDIR NOVERRCHK 179 DO ji = fs_2, fs_jpim1 ! vector opt. 180 ! 181 ! surface friction 178 !CDIR NOVERRCHK 179 DO jj = 2, jpjm1 180 !CDIR NOVERRCHK 181 DO ji = fs_2, fs_jpim1 ! vector opt. 182 ! 183 ! surface friction 182 184 ustars2(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 183 ! 184 ! bottom friction (explicit before friction) 185 ! Note that we chose here not to bound the friction as in dynbfr) 186 ztx2 = ( bfrua(ji,jj) * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) ) & 187 & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1) ) 188 zty2 = ( bfrva(ji,jj) * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1)) ) & 189 & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1) ) 190 ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) 191 END DO 192 END DO 193 194 ! In case of breaking surface waves mixing, 195 ! Compute surface roughness length according to Charnock formula: 196 IF( ln_crban ) THEN ; zhsro(:,:) = MAX(rsbc_zs * ustars2(:,:), hsro) 197 ELSE ; zhsro(:,:) = hsro 198 ENDIF 185 ! 186 ! bottom friction (explicit before friction) 187 ! Note that we chose here not to bound the friction as in dynbfr) 188 ztx2 = ( bfrua(ji,jj) * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) ) & 189 & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1) ) 190 zty2 = ( bfrva(ji,jj) * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1)) ) & 191 & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1) ) 192 ustarb2(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) 193 END DO 194 END DO 195 196 ! Set surface roughness length 197 SELECT CASE ( nn_z0_met ) 198 ! 199 CASE ( 0 ) ! Constant roughness 200 zhsro(:,:) = rn_hsro 201 CASE ( 1 ) ! Standard Charnock formula 202 zhsro(:,:) = MAX(rsbc_zs1 * ustars2(:,:), rn_hsro) 203 CASE ( 2 ) ! Roughness formulae according to Rascle et al., Ocean Modelling (2008) 204 zdep(:,:) = 30.*TANH(2.*0.3/(28.*SQRT(MAX(ustars2(:,:),rsmall)))) ! Wave age (eq. 10) 205 zhsro(:,:) = MAX(rsbc_zs2 * ustars2(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 206 ! 207 END SELECT 199 208 200 209 ! Compute shear and dissipation rate … … 303 312 ! 304 313 ! Set surface condition on zwall_psi (1 at the bottom) 305 IF( ln_sigpsi ) THEN 306 zcoef = rsc_psi / rsc_psi0 307 DO jj = 2, jpjm1 308 DO ji = fs_2, fs_jpim1 ! vector opt. 309 zwall_psi(ji,jj,1) = zcoef 310 END DO 311 END DO 312 ENDIF 313 314 zwall_psi(:,:,1) = zwall_psi(:,:,2) 315 zwall_psi(:,:,jpk) = 1. 316 ! 314 317 ! Surface boundary condition on tke 315 318 ! --------------------------------- 316 319 ! 317 SELECT CASE ( nn_ tkebc_surf )320 SELECT CASE ( nn_bc_surf ) 318 321 ! 319 322 CASE ( 0 ) ! Dirichlet case 320 ! 321 IF (ln_crban) THEN ! Wave induced mixing case 322 ! ! en(1) = q2(1) = 0.5 * (15.8 * Ccb)^(2/3) * u*^2 323 ! ! balance between the production and the dissipation terms including the wave effect 324 en(:,:,1) = MAX( rsbc_tke1 * ustars2(:,:), rn_emin ) 325 z_elem_a(:,:,1) = en(:,:,1) 326 z_elem_c(:,:,1) = 0._wp 327 z_elem_b(:,:,1) = 1._wp 328 ! 329 ! one level below 330 en(:,:,2) = MAX( rsbc_tke1 * ustars2(:,:) * ( (zhsro(:,:)+fsdepw(:,:,2))/zhsro(:,:) )**ra_sf, rn_emin ) 331 z_elem_a(:,:,2) = 0._wp 332 z_elem_c(:,:,2) = 0._wp 333 z_elem_b(:,:,2) = 1._wp 334 ! 335 ELSE ! No wave induced mixing case 336 ! ! en(1) = u*^2/C0^2 & l(1) = K*zs 337 ! ! balance between the production and the dissipation terms 338 en(:,:,1) = MAX( rc02r * ustars2(:,:), rn_emin ) 339 z_elem_a(:,:,1) = en(:,:,1) 340 z_elem_c(:,:,1) = 0._wp 341 z_elem_b(:,:,1) = 1._wp 342 ! 343 ! one level below 344 en(:,:,2) = MAX( rc02r * ustars2(:,:), rn_emin ) 345 z_elem_a(:,:,2) = 0._wp 346 z_elem_c(:,:,2) = 0._wp 347 z_elem_b(:,:,2) = 1._wp 348 ! 349 ENDIF 350 ! 323 ! First level 324 en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 325 en(:,:,1) = MAX(en(:,:,1), rn_emin) 326 z_elem_a(:,:,1) = en(:,:,1) 327 z_elem_c(:,:,1) = 0._wp 328 z_elem_b(:,:,1) = 1._wp 329 ! 330 ! One level below 331 en(:,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+fsdepw(:,:,2))/zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 332 en(:,:,2) = MAX(en(:,:,2), rn_emin ) 333 z_elem_a(:,:,2) = 0._wp 334 z_elem_c(:,:,2) = 0._wp 335 z_elem_b(:,:,2) = 1._wp 336 ! 337 ! 351 338 CASE ( 1 ) ! Neumann boundary condition on d(e)/dz 352 ! 353 IF (ln_crban) THEN ! Shear free case: d(e)/dz= Fw 354 ! 355 ! Dirichlet conditions at k=1 (Cosmetic) 356 en(:,:,1) = MAX( rsbc_tke1 * ustars2(:,:), rn_emin ) 357 z_elem_a(:,:,1) = en(:,:,1) 358 z_elem_c(:,:,1) = 0._wp 359 z_elem_b(:,:,1) = 1._wp 360 ! at k=2, set de/dz=Fw 361 z_elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 362 z_elem_a(:,:,2) = 0._wp 363 zflxs(:,:) = rsbc_tke3 * ustars2(:,:)**1.5_wp * ( (zhsro(:,:)+fsdept(:,:,1) ) / zhsro(:,:) )**(1.5*ra_sf) 364 en(:,:,2) = en(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 365 ! 366 ELSE ! No wave induced mixing case: d(e)/dz=0. 367 ! 368 ! Dirichlet conditions at k=1 (Cosmetic) 369 en(:,:,1) = MAX( rc02r * ustars2(:,:), rn_emin ) 370 z_elem_a(:,:,1) = en(:,:,1) 371 z_elem_c(:,:,1) = 0._wp 372 z_elem_b(:,:,1) = 1._wp 373 ! at k=2 set de/dz=0.: 374 z_elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 375 z_elem_a(:,:,2) = 0._wp 376 ! 377 ENDIF 378 ! 339 ! 340 ! Dirichlet conditions at k=1 341 en(:,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 342 en(:,:,1) = MAX(en(:,:,1), rn_emin) 343 z_elem_a(:,:,1) = en(:,:,1) 344 z_elem_c(:,:,1) = 0._wp 345 z_elem_b(:,:,1) = 1._wp 346 ! 347 ! at k=2, set de/dz=Fw 348 !cbr 349 z_elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 350 z_elem_a(:,:,2) = 0._wp 351 zkar(:,:) = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*fsdept(:,:,1)/zhsro(:,:)) )) 352 zflxs(:,:) = rsbc_tke2 * ustars2(:,:)**1.5_wp * zkar(:,:) * ((zhsro(:,:)+fsdept(:,:,1))/zhsro(:,:) )**(1.5_wp*ra_sf) 353 354 en(:,:,2) = en(:,:,2) + zflxs(:,:)/fse3w(:,:,2) 355 ! 356 ! 379 357 END SELECT 380 358 … … 382 360 ! -------------------------------- 383 361 ! 384 SELECT CASE ( nn_ tkebc_bot )362 SELECT CASE ( nn_bc_bot ) 385 363 ! 386 364 CASE ( 0 ) ! Dirichlet … … 457 435 ! ! set the minimum value of tke 458 436 en(:,:,:) = MAX( en(:,:,:), rn_emin ) 459 437 460 438 !!----------------------------------------!! 461 439 !! Solve prognostic equation for psi !! … … 560 538 ! --------------------------------- 561 539 ! 562 SELECT CASE ( nn_ psibc_surf )540 SELECT CASE ( nn_bc_surf ) 563 541 ! 564 542 CASE ( 0 ) ! Dirichlet boundary conditions 565 ! 566 IF( ln_crban ) THEN ! Wave induced mixing case 567 ! ! en(1) = q2(1) = 0.5 * (15.8 * Ccb)^(2/3) * u*^2 568 ! ! balance between the production and the dissipation terms including the wave effect 569 zdep(:,:) = rl_sf * zhsro(:,:) 570 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 571 z_elem_a(:,:,1) = psi(:,:,1) 572 z_elem_c(:,:,1) = 0._wp 573 z_elem_b(:,:,1) = 1._wp 574 ! 575 ! one level below 576 zex1 = (rmm*ra_sf+rnn) 577 zex2 = (rmm*ra_sf) 578 zdep(:,:) = ( (zhsro(:,:) + fsdepw(:,:,2))**zex1 ) / zhsro(:,:)**zex2 579 psi (:,:,2) = rsbc_psi1 * ustars2(:,:)**rmm * zdep(:,:) * tmask(:,:,1) 580 z_elem_a(:,:,2) = 0._wp 581 z_elem_c(:,:,2) = 0._wp 582 z_elem_b(:,:,2) = 1._wp 583 ! 584 ELSE ! No wave induced mixing case 585 ! ! en(1) = u*^2/C0^2 & l(1) = K*zs 586 ! ! balance between the production and the dissipation terms 587 ! 588 zdep(:,:) = vkarmn * zhsro(:,:) 589 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 590 z_elem_a(:,:,1) = psi(:,:,1) 591 z_elem_c(:,:,1) = 0._wp 592 z_elem_b(:,:,1) = 1._wp 593 ! 594 ! one level below 595 zdep(:,:) = vkarmn * ( zhsro(:,:) + fsdepw(:,:,2) ) 596 psi (:,:,2) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 597 z_elem_a(:,:,2) = 0._wp 598 z_elem_c(:,:,2) = 0._wp 599 z_elem_b(:,:,2) = 1. 600 ! 601 ENDIF 602 ! 543 ! 544 ! Surface value 545 zdep(:,:) = zhsro(:,:) * rl_sf ! Cosmetic 546 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 547 z_elem_a(:,:,1) = psi(:,:,1) 548 z_elem_c(:,:,1) = 0._wp 549 z_elem_b(:,:,1) = 1._wp 550 ! 551 ! One level below 552 zkar(:,:) = (rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*fsdepw(:,:,2)/zhsro(:,:) ))) 553 zdep(:,:) = (zhsro(:,:) + fsdepw(:,:,2)) * zkar(:,:) 554 psi (:,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 555 z_elem_a(:,:,2) = 0._wp 556 z_elem_c(:,:,2) = 0._wp 557 z_elem_b(:,:,2) = 1._wp 558 ! 559 ! 603 560 CASE ( 1 ) ! Neumann boundary condition on d(psi)/dz 604 ! 605 IF( ln_crban ) THEN ! Wave induced mixing case 606 ! 607 zdep(:,:) = rl_sf * zhsro(:,:) 608 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 609 z_elem_a(:,:,1) = psi(:,:,1) 610 z_elem_c(:,:,1) = 0._wp 611 z_elem_b(:,:,1) = 1._wp 612 ! 613 ! Neumann condition at k=2 614 z_elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 615 z_elem_a(:,:,2) = 0._wp 616 ! 617 ! Set psi vertical flux at the surface: 618 zdep(:,:) = (zhsro(:,:) + fsdept(:,:,1))**(rmm*ra_sf+rnn-1._wp) / zhsro(:,:)**(rmm*ra_sf) 619 zflxs(:,:) = rsbc_psi3 * ( zwall_psi(:,:,1)*avm(:,:,1) + zwall_psi(:,:,2)*avm(:,:,2) ) & 620 & * en(:,:,1)**rmm * zdep 621 psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 622 ! 623 ELSE ! No wave induced mixing 624 ! 625 zdep(:,:) = vkarmn * zhsro(:,:) 626 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 627 z_elem_a(:,:,1) = psi(:,:,1) 628 z_elem_c(:,:,1) = 0._wp 629 z_elem_b(:,:,1) = 1._wp 630 ! 631 ! Neumann condition at k=2 632 z_elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 633 z_elem_a(ji,jj,2) = 0._wp 634 ! 635 ! Set psi vertical flux at the surface: 636 zdep(:,:) = zhsro(:,:) + fsdept(:,:,1) 637 zflxs(:,:) = rsbc_psi2 * ( avm(:,:,1) + avm(:,:,2) ) * en(:,:,1)**rmm * zdep**(rnn-1._wp) 638 psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 639 ! 640 ENDIF 641 ! 561 ! 562 ! Surface value: Dirichlet 563 zdep(:,:) = zhsro(:,:) * rl_sf 564 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 565 z_elem_a(:,:,1) = psi(:,:,1) 566 z_elem_c(:,:,1) = 0._wp 567 z_elem_b(:,:,1) = 1._wp 568 ! 569 ! Neumann condition at k=2 570 z_elem_b(:,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 571 z_elem_a(:,:,2) = 0._wp 572 ! 573 ! Set psi vertical flux at the surface: 574 zkar(:,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*fsdept(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 575 zdep(:,:) = ((zhsro(:,:) + fsdept(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 576 zflxs(:,:) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 577 zdep(:,:) = rsbc_psi1 * (zwall_psi(:,:,1)*avm(:,:,1)+zwall_psi(:,:,2)*avm(:,:,2)) * & 578 & ustars2(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + fsdept(:,:,1))**(rnn-1.) 579 zflxs(:,:) = zdep(:,:) * zflxs(:,:) 580 psi(:,:,2) = psi(:,:,2) + zflxs(:,:) / fse3w(:,:,2) 581 582 ! 583 ! 642 584 END SELECT 643 585 … … 645 587 ! -------------------------------- 646 588 ! 647 SELECT CASE ( nn_psibc_bot ) 589 SELECT CASE ( nn_bc_bot ) 590 ! 648 591 ! 649 592 CASE ( 0 ) ! Dirichlet 650 ! ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * hbro593 ! ! en(ibot) = u*^2 / Co2 and mxln(ibot) = vkarmn * rn_bfrz0 651 594 ! ! Balance between the production and the dissipation terms 652 595 !CDIR NOVERRCHK … … 656 599 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 657 600 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 658 zdep(ji,jj) = vkarmn * hbro601 zdep(ji,jj) = vkarmn * rn_bfrz0 659 602 psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 660 603 z_elem_a(ji,jj,ibot) = 0._wp … … 663 606 ! 664 607 ! Just above last level, Dirichlet condition again (GOTM like) 665 zdep(ji,jj) = vkarmn * ( hbro+ fse3t(ji,jj,ibotm1) )608 zdep(ji,jj) = vkarmn * ( rn_bfrz0 + fse3t(ji,jj,ibotm1) ) 666 609 psi (ji,jj,ibotm1) = rc0**rpp * en(ji,jj,ibot )**rmm * zdep(ji,jj)**rnn 667 610 z_elem_a(ji,jj,ibotm1) = 0._wp … … 681 624 ! 682 625 ! Bottom level Dirichlet condition: 683 zdep(ji,jj) = vkarmn * hbro626 zdep(ji,jj) = vkarmn * rn_bfrz0 684 627 psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 685 628 ! … … 693 636 ! 694 637 ! Set psi vertical flux at the bottom: 695 zdep(ji,jj) = hbro+ 0.5_wp*fse3t(ji,jj,ibotm1)638 zdep(ji,jj) = rn_bfrz0 + 0.5_wp*fse3t(ji,jj,ibotm1) 696 639 zflxb = rsbc_psi2 * ( avm(ji,jj,ibot) + avm(ji,jj,ibotm1) ) & 697 640 & * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) … … 736 679 DO jj = 2, jpjm1 737 680 DO ji = fs_2, fs_jpim1 ! vector opt. 738 eps(ji,jj,jk) = rc03 * en(ji,jj,jk) * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / psi(ji,jj,jk)681 eps(ji,jj,jk) = rc03 * en(ji,jj,jk) * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / MAX( psi(ji,jj,jk), rn_epsmin) 739 682 END DO 740 683 END DO … … 783 726 ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 784 727 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 785 mxln(ji,jj,jk) = MIN( rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk))728 IF (ln_length_lim) mxln(ji,jj,jk) = MIN( rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), mxln(ji,jj,jk) ) 786 729 END DO 787 730 END DO … … 847 790 ! Boundary conditions on stability functions for momentum (Neumann): 848 791 ! Lines below are useless if GOTM style Dirichlet conditions are used 849 zcoef = rcm_sf / SQRT( 2._wp ) 792 793 avmv(:,:,1) = avmv(:,:,2) 794 850 795 DO jj = 2, jpjm1 851 796 DO ji = fs_2, fs_jpim1 ! vector opt. 852 avmv(ji,jj,1) = zcoef 853 END DO 854 END DO 855 zcoef = rc0 / SQRT( 2._wp ) 856 DO jj = 2, jpjm1 857 DO ji = fs_2, fs_jpim1 ! vector opt. 858 avmv(ji,jj,mbkt(ji,jj)+1) = zcoef 797 avmv(ji,jj,mbkt(ji,jj)+1) = avmv(ji,jj,mbkt(ji,jj)) 859 798 END DO 860 799 END DO … … 900 839 avmv_k(:,:,:) = avmv(:,:,:) 901 840 ! 902 CALL wrk_dealloc( jpi,jpj, zdep, z flxs, zhsro )841 CALL wrk_dealloc( jpi,jpj, zdep, zkar, zflxs, zhsro ) 903 842 CALL wrk_dealloc( jpi,jpj,jpk, eb, mxlb, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi ) 904 843 ! … … 932 871 !! 933 872 NAMELIST/namzdf_gls/rn_emin, rn_epsmin, ln_length_lim, & 934 & rn_clim_galp, ln_crban, ln_sigpsi, & 935 & rn_crban, rn_charn, & 936 & nn_tkebc_surf, nn_tkebc_bot, & 937 & nn_psibc_surf, nn_psibc_bot, & 873 & rn_clim_galp, ln_sigpsi, rn_hsro, & 874 & rn_crban, rn_charn, rn_frac_hs, & 875 & nn_bc_surf, nn_bc_bot, nn_z0_met, & 938 876 & nn_stab_func, nn_clos 939 877 !!---------------------------------------------------------- … … 955 893 WRITE(numout,*) '~~~~~~~~~~~~' 956 894 WRITE(numout,*) ' Namelist namzdf_gls : set gls mixing parameters' 957 WRITE(numout,*) ' minimum value of en rn_emin = ', rn_emin 958 WRITE(numout,*) ' minimum value of eps rn_epsmin = ', rn_epsmin 959 WRITE(numout,*) ' Limit dissipation rate under stable stratif. ln_length_lim = ', ln_length_lim 960 WRITE(numout,*) ' Galperin limit (Standard: 0.53, Holt: 0.26) rn_clim_galp = ', rn_clim_galp 961 WRITE(numout,*) ' TKE Surface boundary condition nn_tkebc_surf = ', nn_tkebc_surf 962 WRITE(numout,*) ' TKE Bottom boundary condition nn_tkebc_bot = ', nn_tkebc_bot 963 WRITE(numout,*) ' PSI Surface boundary condition nn_psibc_surf = ', nn_psibc_surf 964 WRITE(numout,*) ' PSI Bottom boundary condition nn_psibc_bot = ', nn_psibc_bot 965 WRITE(numout,*) ' Craig and Banner scheme ln_crban = ', ln_crban 966 WRITE(numout,*) ' Modify psi Schmidt number (wb case) ln_sigpsi = ', ln_sigpsi 895 WRITE(numout,*) ' minimum value of en rn_emin = ', rn_emin 896 WRITE(numout,*) ' minimum value of eps rn_epsmin = ', rn_epsmin 897 WRITE(numout,*) ' Limit dissipation rate under stable stratif. ln_length_lim = ', ln_length_lim 898 WRITE(numout,*) ' Galperin limit (Standard: 0.53, Holt: 0.26) rn_clim_galp = ', rn_clim_galp 899 WRITE(numout,*) ' TKE Surface boundary condition nn_bc_surf = ', nn_bc_surf 900 WRITE(numout,*) ' TKE Bottom boundary condition nn_bc_bot = ', nn_bc_bot 901 WRITE(numout,*) ' Modify psi Schmidt number (wb case) ln_sigpsi = ', ln_sigpsi 967 902 WRITE(numout,*) ' Craig and Banner coefficient rn_crban = ', rn_crban 968 903 WRITE(numout,*) ' Charnock coefficient rn_charn = ', rn_charn 904 WRITE(numout,*) ' Surface roughness formula nn_z0_met = ', nn_z0_met 905 WRITE(numout,*) ' Wave height frac. (used if nn_z0_met=2) rn_frac_hs = ', rn_frac_hs 969 906 WRITE(numout,*) ' Stability functions nn_stab_func = ', nn_stab_func 970 907 WRITE(numout,*) ' Type of closure nn_clos = ', nn_clos 971 WRITE(numout,*) ' Hard coded parameters' 972 WRITE(numout,*) ' Surface roughness (m) hsro = ', hsro 973 WRITE(numout,*) ' Bottom roughness (m) hbro = ', hbro 908 WRITE(numout,*) ' Surface roughness (m) rn_hsro = ', rn_hsro 909 WRITE(numout,*) ' Bottom roughness (m) (nambfr namelist) rn_bfrz0 = ', rn_bfrz0 974 910 ENDIF 975 911 … … 978 914 979 915 ! !* Check of some namelist values 980 IF( nn_tkebc_surf < 0 .OR. nn_tkebc_surf > 1 ) CALL ctl_stop( 'bad flag: nn_tkebc_surf is 0 or 1' ) 981 IF( nn_psibc_surf < 0 .OR. nn_psibc_surf > 1 ) CALL ctl_stop( 'bad flag: nn_psibc_surf is 0 or 1' ) 982 IF( nn_tkebc_bot < 0 .OR. nn_tkebc_bot > 1 ) CALL ctl_stop( 'bad flag: nn_tkebc_bot is 0 or 1' ) 983 IF( nn_psibc_bot < 0 .OR. nn_psibc_bot > 1 ) CALL ctl_stop( 'bad flag: nn_psibc_bot is 0 or 1' ) 916 IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'bad flag: nn_bc_surf is 0 or 1' ) 917 IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'bad flag: nn_bc_surf is 0 or 1' ) 918 IF( nn_z0_met < 0 .OR. nn_z0_met > 2 ) CALL ctl_stop( 'bad flag: nn_z0_met is 0, 1 or 2' ) 984 919 IF( nn_stab_func < 0 .OR. nn_stab_func > 3 ) CALL ctl_stop( 'bad flag: nn_stab_func is 0, 1, 2 and 3' ) 985 920 IF( nn_clos < 0 .OR. nn_clos > 3 ) CALL ctl_stop( 'bad flag: nn_clos is 0, 1, 2 or 3' ) … … 1001 936 SELECT CASE ( nn_stab_func ) 1002 937 CASE( 0, 1 ) ; rpsi3m = 2.53_wp ! G88 or KC stability functions 1003 CASE( 2 ) ; rpsi3m = 2. 38_wp ! Canuto A stability functions938 CASE( 2 ) ; rpsi3m = 2.62_wp ! Canuto A stability functions 1004 939 CASE( 3 ) ; rpsi3m = 2.38 ! Canuto B stability functions (caution : constant not identified) 1005 940 END SELECT … … 1012 947 rnn = -1._wp 1013 948 rsc_tke = 1._wp 1014 rsc_psi = 1. 3_wp ! Schmidt number for psi949 rsc_psi = 1.2_wp ! Schmidt number for psi 1015 950 rpsi1 = 1.44_wp 1016 951 rpsi3p = 1._wp … … 1140 1075 ! ! See Eq. (13) of Carniel et al, OM, 30, 225-239, 2009 1141 1076 ! ! or Eq. (17) of Burchard, JPO, 31, 3133-3145, 2001 1142 IF( ln_sigpsi .AND. ln_crban ) THEN 1143 zcr = SQRT( 1.5_wp*rsc_tke ) * rcm_sf / vkarmn 1144 rsc_psi0 = vkarmn*vkarmn / ( rpsi2 * rcm_sf*rcm_sf ) & 1145 & * ( rnn*rnn - 4._wp/3._wp * zcr*rnn*rmm - 1._wp/3._wp * zcr*rnn & 1146 & + 2._wp/9._wp * rmm * zcr*zcr + 4._wp/9._wp * zcr*zcr * rmm*rmm ) 1077 IF( ln_sigpsi ) THEN 1078 ra_sf = -1.5 ! Set kinetic energy slope, then deduce rsc_psi and rl_sf 1079 ! Verification: retrieve Burchard (2001) results by uncomenting the line below: 1080 ! Note that the results depend on the value of rn_cm_sf which is constant (=rc0) in his work 1081 ! ra_sf = -SQRT(2./3.*rc0**3./rn_cm_sf*rn_sc_tke)/vkarmn 1082 rsc_psi0 = rsc_tke/(24.*rpsi2)*(-1.+(4.*rnn + ra_sf*(1.+4.*rmm))**2./(ra_sf**2.)) 1147 1083 ELSE 1148 1084 rsc_psi0 = rsc_psi … … 1151 1087 ! !* Shear free turbulence parameters 1152 1088 ! 1153 ra_sf = -4._wp * rnn * SQRT( rsc_tke ) / ( (1._wp+4._wp*rmm) * SQRT( rsc_tke ) & 1154 & - SQRT(rsc_tke + 24._wp*rsc_psi0*rpsi2 ) ) 1155 rl_sf = rc0 * SQRT( rc0 / rcm_sf ) & 1156 & * SQRT( ( (1._wp + 4._wp*rmm + 8._wp*rmm*rmm) * rsc_tke & 1157 & + 12._wp * rsc_psi0 * rpsi2 & 1158 & - (1._wp + 4._wp*rmm) * SQRT( rsc_tke*(rsc_tke+ 24._wp*rsc_psi0*rpsi2) ) ) & 1159 & / ( 12._wp*rnn*rnn ) ) 1089 ra_sf = -4._wp*rnn*SQRT(rsc_tke) / ( (1._wp+4._wp*rmm)*SQRT(rsc_tke) & 1090 & - SQRT(rsc_tke + 24._wp*rsc_psi0*rpsi2 ) ) 1091 1092 IF ( rn_crban==0._wp ) THEN 1093 rl_sf = vkarmn 1094 ELSE 1095 rl_sf = rc0 * SQRT(rc0/rcm_sf) * SQRT( ( (1._wp + 4._wp*rmm + 8._wp*rmm**2_wp)*rsc_tke & 1096 & + 12._wp * rsc_psi0*rpsi2 - (1._wp + 4._wp*rmm) & 1097 & *SQRT(rsc_tke*(rsc_tke & 1098 & + 24._wp*rsc_psi0*rpsi2)) ) & 1099 & /(12._wp*rnn**2.) & 1100 & ) 1101 ENDIF 1160 1102 1161 1103 ! … … 1187 1129 rc03 = rc02 * rc0 1188 1130 rc04 = rc03 * rc0 1189 rc03_sqrt2_galp = rc03 / SQRT(2._wp) / rn_clim_galp 1190 rsbc_mb = 0.5_wp * (15.8_wp*rn_crban)**(2._wp/3._wp) ! Surf. bound. cond. from Mellor and Blumberg 1191 rsbc_std = 3.75_wp ! Surf. bound. cond. standard (prod=diss) 1192 rsbc_tke1 = (-rsc_tke*rn_crban/(rcm_sf*ra_sf*rl_sf))**(2._wp/3._wp) ! k_eps = 53. Dirichlet + Wave breaking 1193 rsbc_tke2 = 0.5_wp / rau0 1194 rsbc_tke3 = rdt * rn_crban ! Neumann + Wave breaking 1195 rsbc_zs = rn_charn / grav ! Charnock formula 1196 rsbc_psi1 = rc0**rpp * rsbc_tke1**rmm * rl_sf**rnn ! Dirichlet + Wave breaking 1197 rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 1198 rsbc_psi3 = -0.5_wp * rdt * rc0**rpp * rl_sf**rnn / rsc_psi * (rnn + rmm*ra_sf) ! Neumann + Wave breaking 1199 rfact_tke = -0.5_wp / rsc_tke * rdt ! Cst used for the Diffusion term of tke 1200 rfact_psi = -0.5_wp / rsc_psi * rdt ! Cst used for the Diffusion term of tke 1131 rsbc_tke1 = -3._wp/2._wp*rn_crban*ra_sf*rl_sf ! Dirichlet + Wave breaking 1132 rsbc_tke2 = rdt * rn_crban / rl_sf ! Neumann + Wave breaking 1133 zcr = MAX(rsmall, rsbc_tke1**(1./(-ra_sf*3._wp/2._wp))-1._wp ) 1134 rtrans = 0.2_wp / zcr ! Ad. inverse transition length between log and wave layer 1135 rsbc_zs1 = rn_charn/grav ! Charnock formula for surface roughness 1136 rsbc_zs2 = rn_frac_hs / 0.85_wp / grav * 665._wp ! Rascle formula for surface roughness 1137 rsbc_psi1 = -0.5_wp * rdt * rc0**(rpp-2._wp*rmm) / rsc_psi 1138 rsbc_psi2 = -0.5_wp * rdt * rc0**rpp * rnn * vkarmn**rnn / rsc_psi ! Neumann + NO Wave breaking 1139 1140 rfact_tke = -0.5_wp / rsc_tke * rdt ! Cst used for the Diffusion term of tke 1141 rfact_psi = -0.5_wp / rsc_psi * rdt ! Cst used for the Diffusion term of tke 1201 1142 1202 1143 ! !* Wall proximity function … … 1257 1198 IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and mxln computed by iterative loop' 1258 1199 en (:,:,:) = rn_emin 1259 mxln(:,:,:) = 0.001 1200 mxln(:,:,:) = 0.05 1201 avt_k (:,:,:) = avt (:,:,:) 1202 avm_k (:,:,:) = avm (:,:,:) 1203 avmu_k(:,:,:) = avmu(:,:,:) 1204 avmv_k(:,:,:) = avmv(:,:,:) 1260 1205 DO jit = nit000 + 1, nit000 + 10 ; CALL zdf_gls( jit ) ; END DO 1261 1206 ENDIF … … 1263 1208 IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and mxln by background values' 1264 1209 en (:,:,:) = rn_emin 1265 mxln(:,:,:) = 0.0 011210 mxln(:,:,:) = 0.05 1266 1211 ENDIF 1267 1212 ! … … 1269 1214 ! ! ------------------- 1270 1215 IF(lwp) WRITE(numout,*) '---- gls-rst ----' 1271 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 1216 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 1272 1217 CALL iom_rstput( kt, nitrst, numrow, 'avt' , avt_k ) 1273 1218 CALL iom_rstput( kt, nitrst, numrow, 'avm' , avm_k ) 1274 CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 1219 CALL iom_rstput( kt, nitrst, numrow, 'avmu' , avmu_k ) 1275 1220 CALL iom_rstput( kt, nitrst, numrow, 'avmv' , avmv_k ) 1276 1221 CALL iom_rstput( kt, nitrst, numrow, 'mxln' , mxln ) -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfini.F90
r4624 r5837 117 117 IF( ioptio == 0 .OR. ioptio > 1 .AND. .NOT. lk_esopa ) & 118 118 & CALL ctl_stop( ' one and only one vertical diffusion option has to be defined ' ) 119 IF( ( lk_zdfric .OR. lk_zdfgls .OR. lk_zdfkpp ) .AND. ln_isfcav ) & 120 & CALL ctl_stop( ' only zdfcst and zdftke were tested with ice shelves cavities ' ) 119 121 ! 120 122 ! ! ... Convection 121 123 IF(lwp) WRITE(numout,*) 122 124 IF(lwp) WRITE(numout,*) ' convection :' 125 ! 126 #if defined key_top 127 IF( ln_zdfnpc ) CALL ctl_stop( ' zdf_init: npc scheme is not working with key_top' ) 128 #endif 129 ! 123 130 ioptio = 0 124 131 IF( ln_zdfnpc ) THEN -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfkpp.F90
r4624 r5837 26 26 USE phycst ! physical constants 27 27 USE eosbn2 ! equation of state 28 USE zdfddm ! double diffusion mixing 28 USE zdfddm ! double diffusion mixing (avs array) 29 USE lib_mpp ! MPP library 30 USE trd_oce ! ocean trends definition 31 USE trdtra ! tracers trends 32 ! 29 33 USE in_out_manager ! I/O manager 30 USE lib_mpp ! MPP library31 USE wrk_nemo ! work arrays32 34 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 33 35 USE prtctl ! Print control 34 USE trdmod_oce ! ocean trends definition 35 USE trdtra ! tracers trends 36 USE wrk_nemo ! work arrays 36 37 USE timing ! Timing 37 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 38 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 38 39 39 40 IMPLICIT NONE … … 246 247 REAL(wp) :: zdelta, zdelta2, zdzup, zdzdn, zdzh, zvath, zgat1, zdat1, zkm1m, zkm1t 247 248 #if defined key_zdfddm 248 REAL(wp) :: zrrau, zds, zavdds, zavddt,zinr ! double diffusion mixing 249 REAL(wp), POINTER, DIMENSION(:,:) :: zdifs 249 REAL(wp) :: zrw, zkm1s ! local scalars 250 REAL(wp) :: zrrau, zdt, zds, zavdds, zavddt, zinr ! double diffusion mixing 251 REAL(wp), POINTER, DIMENSION(:,:) :: zdifs 250 252 REAL(wp), POINTER, DIMENSION(:) :: za2s, za3s, zkmps 251 REAL(wp) :: zkm1s252 253 REAL(wp), POINTER, DIMENSION(:,:) :: zblcs 253 254 REAL(wp), POINTER, DIMENSION(:,:,:) :: zdiffus … … 274 275 #endif 275 276 276 zviscos(:,:,:) = 0. 277 zblcm (:,: ) = 0. 278 zdiffut(:,:,:) = 0. 279 zblct (:,: ) = 0. 277 zviscos(:,:,:) = 0._wp 278 zblcm (:,: ) = 0._wp 279 zdiffut(:,:,:) = 0._wp 280 zblct (:,: ) = 0._wp 280 281 #if defined key_zdfddm 281 zdiffus(:,:,:) = 0. 282 zblcs (:,: ) = 0. 283 #endif 284 ghats(:,:,:) = 0. 285 286 zBo (:,:) = 0. 287 zBosol(:,:) = 0. 288 zustar(:,:) = 0. 289 290 282 zdiffus(:,:,:) = 0._wp 283 zblcs (:,: ) = 0._wp 284 #endif 285 ghats (:,:,:) = 0._wp 286 zBo (:,: ) = 0._wp 287 zBosol (:,: ) = 0._wp 288 zustar (:,: ) = 0._wp 289 ! 291 290 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 292 291 ! I. Interior diffusivity and viscosity at w points ( T interfaces) … … 332 331 avt (ji,jj,jk) = avt (ji,jj,jk) + rn_difri * zfri 333 332 ENDIF 333 ! 334 334 #if defined key_zdfddm 335 avs (ji,jj,jk) = avt (ji,jj,jk)335 ! 336 336 ! Double diffusion mixing ; NOT IN ROUTINE ZDFDDM.F90 337 ! ------------------------------------------------------------------ 338 ! only retains positive value of rrau 339 zrrau = MAX( rrau(ji,jj,jk), epsln ) 340 zds = tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) 341 IF( zrrau > 1. .AND. zds > 0.) THEN 342 ! 343 ! Salt fingering case. 344 !--------------------- 345 ! Compute interior diffusivity for double diffusive mixing of 346 ! salinity. Upper bound "zrrau" by "Rrho0"; (Rrho0=1.9, difcoefnuf=0.001). 347 ! After that set interior diffusivity for double diffusive mixing 348 ! of temperature 337 ! ------------------------- 338 avs (ji,jj,jk) = avt (ji,jj,jk) 339 340 ! R=zrau = (alpha / beta) (dk[t] / dk[s]) 341 zrw = ( fsdepw(ji,jj,jk ) - fsdept(ji,jj,jk) ) & 342 & / ( fsdept(ji,jj,jk-1) - fsdept(ji,jj,jk) ) 343 ! 344 zaw = ( rab_n(ji,jj,jk,jp_tem) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_tem) * zrw ) * tmask(ji,jj,jk) 345 zbw = ( rab_n(ji,jj,jk,jp_sal) * (1. - zrw) + rab_n(ji,jj,jk-1,jp_sal) * zrw ) * tmask(ji,jj,jk) 346 ! 347 zdt = zaw * ( tsn(ji,jj,jk-1,jp_tem) - tsn(ji,jj,jk,jp_tem) ) 348 zds = zbw * ( tsn(ji,jj,jk-1,jp_sal) - tsn(ji,jj,jk,jp_sal) ) 349 IF( ABS( zds) <= 1.e-20_wp ) zds = 1.e-20_wp 350 zrrau = MAX( epsln , zdt / zds ) ! only retains positive value of zrau 351 ! 352 IF( zrrau > 1. .AND. zds > 0.) THEN ! Salt fingering case. 353 ! !--------------------- 354 ! Compute interior diffusivity for double diffusive mixing of salinity. 355 ! Upper bound "zrrau" by "Rrho0"; (Rrho0=1.9, difcoefnuf=0.001). 356 ! After that set interior diffusivity for double diffusive mixing of temperature 349 357 zavdds = MIN( zrrau, Rrho0 ) 350 358 zavdds = ( zavdds - 1.0 ) / ( Rrho0 - 1.0 ) … … 353 361 zavdds = difssf * zavdds 354 362 zavddt = 0.7 * zavdds 355 ELSEIF( zrrau < 1. .AND. zrrau > 0. .AND. zds < 0.) THEN356 363 ! 357 ! Diffusive convection case. 358 !--------------------------- 359 ! Compute interior diffusivity for double diffusive mixing of 360 ! temperature (Marmorino and Caldwell, 1976); 364 ELSEIF( zrrau < 1. .AND. zrrau > 0. .AND. zds < 0.) THEN ! Diffusive convection case. 365 ! !--------------------------- 366 ! Compute interior diffusivity for double diffusive mixing of temperature (Marmorino and Caldwell, 1976); 361 367 ! Compute interior diffusivity for double diffusive mixing of salinity 362 368 zinr = 1. / zrrau 363 369 zavddt = 0.909 * EXP( 4.6 * EXP( -0.54* ( zinr - 1. ) ) ) 364 370 zavddt = difsdc * zavddt 365 IF( zrrau < 0.5) THEN 366 zavdds = zavddt * 0.15 * zrrau 367 ELSE 368 zavdds = zavddt * (1.85 * zrrau - 0.85 ) 371 IF( zrrau < 0.5) THEN ; zavdds = zavddt * 0.15 * zrrau 372 ELSE ; zavdds = zavddt * (1.85 * zrrau - 0.85 ) 369 373 ENDIF 370 374 ELSE … … 385 389 !--------------------------------------------------------------------- 386 390 DO jj = 2, jpjm1 387 DO ji = fs_2, fs_jpim1 388 IF( nn_eos < 1) THEN 389 zt = tsn(ji,jj,1,jp_tem) 390 zs = tsn(ji,jj,1,jp_sal) - 35.0 391 zh = fsdept(ji,jj,1) 392 ! potential volumic mass 393 zrhos = rhop(ji,jj,1) 394 zalbet = ( ( ( - 0.255019e-07 * zt + 0.298357e-05 ) * zt & ! ratio alpha/beta 395 & - 0.203814e-03 ) * zt & 396 & + 0.170907e-01 ) * zt & 397 & + 0.665157e-01 & 398 & + ( - 0.678662e-05 * zs & 399 & - 0.846960e-04 * zt + 0.378110e-02 ) * zs & 400 & + ( ( - 0.302285e-13 * zh & 401 & - 0.251520e-11 * zs & 402 & + 0.512857e-12 * zt * zt ) * zh & 403 & - 0.164759e-06 * zs & 404 & +( 0.791325e-08 * zt - 0.933746e-06 ) * zt & 405 & + 0.380374e-04 ) * zh 406 407 zbeta = ( ( -0.415613e-09 * zt + 0.555579e-07 ) * zt & ! beta 408 & - 0.301985e-05 ) * zt & 409 & + 0.785567e-03 & 410 & + ( 0.515032e-08 * zs & 411 & + 0.788212e-08 * zt - 0.356603e-06 ) * zs & 412 & +( ( 0.121551e-17 * zh & 413 & - 0.602281e-15 * zs & 414 & - 0.175379e-14 * zt + 0.176621e-12 ) * zh & 415 & + 0.408195e-10 * zs & 416 & + ( - 0.213127e-11 * zt + 0.192867e-09 ) * zt & 417 & - 0.121555e-07 ) * zh 418 419 zthermal = zbeta * zalbet / ( rcp * zrhos + epsln ) 420 zhalin = zbeta * tsn(ji,jj,1,jp_sal) * rcs 421 ELSE 422 zrhos = rhop(ji,jj,1) + rau0 * ( 1. - tmask(ji,jj,1) ) 423 zthermal = rn_alpha / ( rcp * zrhos + epsln ) 424 zhalin = rn_beta * tsn(ji,jj,1,jp_sal) * rcs 425 zbeta = rn_beta 426 ENDIF 391 DO ji = fs_2, fs_jpim1 392 zrhos = rau0 * ( 1._wp + rhd(ji,jj,1) ) * tmask(ji,jj,1) 393 zthermal = rab_n(ji,jj,1,jp_tem) / ( rcp * zrhos + epsln ) 394 zbeta = rab_n(ji,jj,1,jp_sal) 395 zhalin = zbeta * tsn(ji,jj,1,jp_sal) * rcs 396 ! 427 397 ! Radiative surface buoyancy force 428 398 zBosol(ji,jj) = grav * zthermal * qsr(ji,jj) … … 435 405 ws0(ji,jj) = - ( ( emp(ji,jj)-rnf(ji,jj) ) * tsn(ji,jj,1,jp_sal) & 436 406 & + sfx(ji,jj) ) * rcs * tmask(ji,jj,1) 437 END DO438 END DO407 END DO 408 END DO 439 409 440 410 zflageos = 0.5 + SIGN( 0.5, nn_eos - 1. ) … … 447 417 ! Friction velocity (zustar), at T-point : LMD94 eq. 2 448 418 zustar(ji,jj) = SQRT( taum(ji,jj) / ( zrhos + epsln ) ) 449 END DO450 END DO419 END DO 420 END DO 451 421 452 422 !CDIR NOVERRCHK … … 1270 1240 ztrds(:,:,:) = tsa(:,:,:,jp_sal) - ztrds(:,:,:) 1271 1241 !!bug gm jpttdzdf ==> jpttkpp 1272 CALL trd_tra( kt, 'TRA', jp_tem, jptra_ trd_zdf, ztrdt )1273 CALL trd_tra( kt, 'TRA', jp_sal, jptra_ trd_zdf, ztrds )1242 CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdf, ztrdt ) 1243 CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdf, ztrds ) 1274 1244 DEALLOCATE( ztrdt ) ; DEALLOCATE( ztrds ) 1275 1245 ENDIF … … 1340 1310 IF( l_trdtrc ) THEN ! save the non-local tracer flux trends for diagnostic 1341 1311 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 1342 CALL trd_tra( kt, 'TRC', jn, jptra_ trd_zdf, ztrtrd(:,:,:) )1312 CALL trd_tra( kt, 'TRC', jn, jptra_zdf, ztrtrd(:,:,:) ) 1343 1313 ENDIF 1344 1314 ! … … 1375 1345 !!---------------------------------------------------------------------- 1376 1346 INTEGER :: ji, jj, jk ! dummy loop indices 1347 INTEGER :: ios ! local integer 1377 1348 #if ! defined key_kppcustom 1378 1349 INTEGER :: jm ! dummy loop indices … … 1382 1353 REAL(wp) :: zustar, zucube, zustvk, zeta, zehat ! tempory scalars 1383 1354 #endif 1384 INTEGER :: ios ! Local integer output status for namelist read1385 1355 REAL(wp) :: zhbf ! tempory scalars 1386 1356 LOGICAL :: ll_kppcustom ! 1st ocean level taken as surface layer -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfmxl.F90
r4245 r5837 6 6 !! History : 1.0 ! 2003-08 (G. Madec) original code 7 7 !! 3.2 ! 2009-07 (S. Masson, G. Madec) IOM + merge of DO-loop 8 !! 3.7 ! 2012-03 (G. Madec) make public the density criteria for trdmxl 9 !! - ! 2014-02 (F. Roquet) mixed layer depth calculated using N2 instead of rhop 8 10 !!---------------------------------------------------------------------- 9 11 !! zdf_mxl : Compute the turbocline and mixed layer depths. … … 14 16 USE in_out_manager ! I/O manager 15 17 USE prtctl ! Print control 18 USE phycst ! physical constants 16 19 USE iom ! I/O library 17 20 USE lib_mpp ! MPP library … … 25 28 PUBLIC zdf_mxl ! called by step.F90 26 29 27 REAL(wp), PUBLIC :: rho_c = 0.01_wp ! density criterion for mixed layer depth28 REAL(wp), PUBLIC :: avt_c = 5.e-4_wp ! Kz criterion for the turbocline depth29 30 30 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: nmln !: number of level in the mixed layer (used by TOP) 31 31 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmld !: mixing layer depth (turbocline) [m] 32 32 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmlp !: mixed layer depth (rho=rho0+zdcrit) [m] 33 33 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hmlpt !: mixed layer depth at t-points [m] 34 35 REAL(wp), PUBLIC :: rho_c = 0.01_wp !: density criterion for mixed layer depth 36 REAL(wp) :: avt_c = 5.e-4_wp ! Kz criterion for the turbocline depth 34 37 35 38 !! * Substitutions … … 70 73 !! eddy diffusivity coefficient (resulting from the vertical physics 71 74 !! alone, not the isopycnal part, see trazdf.F) fall below a given 72 !! value defined locally (avt_c here taken equal to 5 cm/s2 )75 !! value defined locally (avt_c here taken equal to 5 cm/s2 by default) 73 76 !! 74 77 !! ** Action : nmln, hmld, hmlp, hmlpt 75 78 !!---------------------------------------------------------------------- 76 79 INTEGER, INTENT(in) :: kt ! ocean time-step index 77 !! 78 INTEGER :: ji, jj, jk ! dummy loop indices 79 INTEGER :: iikn, iiki ! temporary integer within a do loop 80 INTEGER, POINTER, DIMENSION(:,:) :: imld ! temporary workspace 80 ! 81 INTEGER :: ji, jj, jk ! dummy loop indices 82 INTEGER :: iikn, iiki, ikt, imkt ! local integer 83 REAL(wp) :: zN2_c ! local scalar 84 INTEGER, POINTER, DIMENSION(:,:) :: imld ! 2D workspace 81 85 !!---------------------------------------------------------------------- 82 86 ! … … 94 98 95 99 ! w-level of the mixing and mixed layers 96 nmln(:,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point 97 imld(:,:) = mbkt(:,:) + 1 98 DO jk = jpkm1, nlb10, -1 ! from the bottom to nlb10 100 nmln(:,:) = nlb10 ! Initialization to the number of w ocean point 101 hmlp(:,:) = 0._wp ! here hmlp used as a dummy variable, integrating vertically N^2 102 zN2_c = grav * rho_c * r1_rau0 ! convert density criteria into N^2 criteria 103 DO jk = nlb10, jpkm1 104 DO jj = 1, jpj ! Mixed layer level: w-level 105 DO ji = 1, jpi 106 ikt = mbkt(ji,jj) 107 hmlp(ji,jj) = hmlp(ji,jj) + MAX( rn2b(ji,jj,jk) , 0._wp ) * fse3w(ji,jj,jk) 108 IF( hmlp(ji,jj) < zN2_c ) nmln(ji,jj) = MIN( jk , ikt ) + 1 ! Mixed layer level 109 END DO 110 END DO 111 END DO 112 ! 113 ! w-level of the turbocline 114 imld(:,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point 115 DO jk = jpkm1, nlb10, -1 ! from the bottom to nlb10 99 116 DO jj = 1, jpj 100 117 DO ji = 1, jpi 101 IF( rhop(ji,jj,jk) > rhop(ji,jj,nla10) + rho_c ) nmln(ji,jj) = jk ! Mixed layer102 IF( avt (ji,jj,jk) < avt_c ) imld(ji,jj) = jk! Turbocline118 imkt = mikt(ji,jj) 119 IF( avt (ji,jj,jk) < avt_c ) imld(ji,jj) = MAX( imkt, jk ) ! Turbocline 103 120 END DO 104 121 END DO … … 109 126 iiki = imld(ji,jj) 110 127 iikn = nmln(ji,jj) 111 hmld (ji,jj) = fsdepw(ji,jj,iiki ) * tmask(ji,jj,1) ! Turbocline depth 112 hmlp (ji,jj) = fsdepw(ji,jj,iikn ) * tmask(ji,jj,1) ! Mixed layer depth 113 hmlpt(ji,jj) = fsdept(ji,jj,iikn-1) ! depth of the last T-point inside the mixed layer 128 imkt = mikt(ji,jj) 129 hmld (ji,jj) = ( fsdepw(ji,jj,iiki ) - fsdepw(ji,jj,imkt ) ) * ssmask(ji,jj) ! Turbocline depth 130 hmlp (ji,jj) = ( fsdepw(ji,jj,iikn ) - fsdepw(ji,jj,MAX( imkt,nla10 ) ) ) * ssmask(ji,jj) ! Mixed layer depth 131 hmlpt(ji,jj) = ( fsdept(ji,jj,iikn-1) - fsdepw(ji,jj,imkt ) ) * ssmask(ji,jj) ! depth of the last T-point inside the mixed layer 114 132 END DO 115 133 END DO -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90
r4624 r5837 26 26 !! ! + cleaning of the parameters + bugs correction 27 27 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 28 !! 3.6 ! 2014-11 (P. Mathiot) add ice shelf capability 28 29 !!---------------------------------------------------------------------- 29 30 #if defined key_zdftke || defined key_esopa … … 236 237 zfact3 = 0.5_wp * rn_ediss 237 238 ! 239 ! 238 240 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 239 241 ! ! Surface boundary condition on tke 240 242 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 243 IF ( ln_isfcav ) THEN 244 DO jj = 2, jpjm1 ! en(mikt(ji,jj)) = rn_emin 245 DO ji = fs_2, fs_jpim1 ! vector opt. 246 en(ji,jj,mikt(ji,jj))=rn_emin * tmask(ji,jj,1) 247 END DO 248 END DO 249 END IF 241 250 DO jj = 2, jpjm1 ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 242 251 DO ji = fs_2, fs_jpim1 ! vector opt. … … 291 300 END DO 292 301 ! ! finite LC depth 293 # if defined key_vectopt_loop294 DO jj = 1, 1295 DO ji = 1, jpij ! vector opt. (forced unrolling)296 # else297 302 DO jj = 1, jpj 298 303 DO ji = 1, jpi 299 # endif300 304 zhlc(ji,jj) = fsdepw(ji,jj,imlc(ji,jj)) 301 305 END DO … … 313 317 zwlc = zind * rn_lc * zus * SIN( rpi * fsdepw(ji,jj,jk) / zhlc(ji,jj) ) 314 318 ! ! TKE Langmuir circulation source term 315 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) * tmask(ji,jj,jk)319 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) * wmask(ji,jj,jk) * tmask(ji,jj,1) 316 320 END DO 317 321 END DO … … 332 336 avmu(ji,jj,jk) = avmu(ji,jj,jk) * ( un(ji,jj,jk-1) - un(ji,jj,jk) ) & 333 337 & * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) ) & 334 & / ( fse3uw_n(ji,jj,jk)&335 & * fse3uw_b(ji,jj,jk))338 & / ( fse3uw_n(ji,jj,jk) & 339 & * fse3uw_b(ji,jj,jk) ) 336 340 avmv(ji,jj,jk) = avmv(ji,jj,jk) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) ) & 337 341 & * ( vb(ji,jj,jk-1) - vb(ji,jj,jk) ) & … … 360 364 ! ! right hand side in en 361 365 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zesh2 - avt(ji,jj,jk) * rn2(ji,jj,jk) & 362 & + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk) ) * tmask(ji,jj,jk) 366 & + zfact3 * dissl(ji,jj,jk) * en (ji,jj,jk) ) & 367 & * wmask(ji,jj,jk) 363 368 END DO 364 369 END DO … … 372 377 END DO 373 378 END DO 374 DO jj = 2, jpjm1 ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 375 DO ji = fs_2, fs_jpim1 ! vector opt. 379 ! 380 ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 381 DO jj = 2, jpjm1 382 DO ji = fs_2, fs_jpim1 ! vector opt. 376 383 zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1) ! Surface boudary conditions on tke 377 384 END DO … … 384 391 END DO 385 392 END DO 386 DO jj = 2, jpjm1 ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 387 DO ji = fs_2, fs_jpim1 ! vector opt. 393 ! 394 ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 395 DO jj = 2, jpjm1 396 DO ji = fs_2, fs_jpim1 ! vector opt. 388 397 en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 389 398 END DO … … 399 408 DO jj = 2, jpjm1 400 409 DO ji = fs_2, fs_jpim1 ! vector opt. 401 en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * tmask(ji,jj,jk)410 en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 402 411 END DO 403 412 END DO … … 412 421 DO ji = fs_2, fs_jpim1 ! vector opt. 413 422 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) & 414 & * ( 1._wp - fr_i(ji,jj) ) * tmask(ji,jj,jk)423 & * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 415 424 END DO 416 425 END DO … … 421 430 jk = nmln(ji,jj) 422 431 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) & 423 & * ( 1._wp - fr_i(ji,jj) ) * tmask(ji,jj,jk)432 & * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 424 433 END DO 425 434 END DO … … 433 442 ztx2 = utau(ji-1,jj ) + utau(ji,jj) 434 443 zty2 = vtau(ji ,jj-1) + vtau(ji,jj) 435 ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) ! module of the mean stress444 ztau = 0.5_wp * SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1) ! module of the mean stress 436 445 zdif = taum(ji,jj) - ztau ! mean of modulus - modulus of the mean 437 446 zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add ) ! apply some modifications... 438 447 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -fsdepw(ji,jj,jk) / htau(ji,jj) ) & 439 & * ( 1._wp - fr_i(ji,jj) ) * tmask(ji,jj,jk)448 & * ( 1._wp - fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 440 449 END DO 441 450 END DO … … 505 514 ! !* Buoyancy length scale: l=sqrt(2*e/n**2) 506 515 ! 516 ! initialisation of interior minimum value (avoid a 2d loop with mikt) 517 zmxlm(:,:,:) = rmxl_min 518 zmxld(:,:,:) = rmxl_min 519 ! 507 520 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 508 zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 509 zmxlm(:,:,1) = MAX( rn_mxl0, zraug * taum(:,:) ) 510 ELSE ! surface set to the minimum value 521 DO jj = 2, jpjm1 522 DO ji = fs_2, fs_jpim1 523 zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 524 zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 525 END DO 526 END DO 527 ELSE 511 528 zmxlm(:,:,1) = rn_mxl0 512 529 ENDIF 513 zmxlm(:,:,jpk) = rmxl_min ! last level set to the interior minium value514 530 ! 515 531 !CDIR NOVERRCHK … … 520 536 DO ji = fs_2, fs_jpim1 ! vector opt. 521 537 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 522 zmxlm(ji,jj,jk) = MAX( rmxl_min, SQRT( 2._wp * en(ji,jj,jk) / zrn2 ) 538 zmxlm(ji,jj,jk) = MAX( rmxl_min, SQRT( 2._wp * en(ji,jj,jk) / zrn2 ) ) 523 539 END DO 524 540 END DO … … 527 543 ! !* Physical limits for the mixing length 528 544 ! 529 zmxld(:,:, 1 ) = zmxlm(:,:,1) ! surface set to the zmxlm value545 zmxld(:,:,1 ) = zmxlm(:,:,1) ! surface set to the minimum value 530 546 zmxld(:,:,jpk) = rmxl_min ! last level set to the minimum value 531 547 ! 532 548 SELECT CASE ( nn_mxl ) 533 549 ! 550 ! where wmask = 0 set zmxlm == fse3w 534 551 CASE ( 0 ) ! bounded by the distance to surface and bottom 535 552 DO jk = 2, jpkm1 536 553 DO jj = 2, jpjm1 537 554 DO ji = fs_2, fs_jpim1 ! vector opt. 538 zemxl = MIN( fsdepw(ji,jj,jk) , zmxlm(ji,jj,jk), &555 zemxl = MIN( fsdepw(ji,jj,jk) - fsdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk), & 539 556 & fsdepw(ji,jj,mbkt(ji,jj)+1) - fsdepw(ji,jj,jk) ) 540 zmxlm(ji,jj,jk) = zemxl 541 zmxld(ji,jj,jk) = zemxl 557 ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 558 zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),fse3w(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 559 zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN(zmxlm(ji,jj,jk),fse3w(ji,jj,jk)) * (1 - wmask(ji,jj,jk)) 542 560 END DO 543 561 END DO … … 620 638 zsqen = SQRT( en(ji,jj,jk) ) 621 639 zav = rn_ediff * zmxlm(ji,jj,jk) * zsqen 622 avm (ji,jj,jk) = MAX( zav, avmb(jk) ) * tmask(ji,jj,jk)623 avt (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk)640 avm (ji,jj,jk) = MAX( zav, avmb(jk) ) * wmask(ji,jj,jk) 641 avt (ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 624 642 dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 625 643 END DO … … 628 646 CALL lbc_lnk( avm, 'W', 1. ) ! Lateral boundary conditions (sign unchanged) 629 647 ! 630 DO jk = 2, jpkm1 !* vertical eddy viscosity at u- andv-points648 DO jk = 2, jpkm1 !* vertical eddy viscosity at wu- and wv-points 631 649 DO jj = 2, jpjm1 632 650 DO ji = fs_2, fs_jpim1 ! vector opt. 633 avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj ,jk) ) * umask(ji,jj,jk)634 avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji ,jj+1,jk) ) * vmask(ji,jj,jk)651 avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj ,jk) ) * wumask(ji,jj,jk) 652 avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji ,jj+1,jk) ) * wvmask(ji,jj,jk) 635 653 END DO 636 654 END DO … … 653 671 !!gm and even better with the use of the "true" ri_crit=0.22222... (this change the results!) 654 672 !!gm zpdlr = MAX( 0.1_wp, ri_crit / MAX( ri_crit , zri ) ) 655 avt(ji,jj,jk) = MAX( zpdlr * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk)673 avt(ji,jj,jk) = MAX( zpdlr * avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 656 674 # if defined key_c1d 657 e_pdl(ji,jj,jk) = zpdlr * tmask(ji,jj,jk)! c1d configuration : save masked Prandlt number658 e_ric(ji,jj,jk) = zri * tmask(ji,jj,jk)! c1d config. : save Ri675 e_pdl(ji,jj,jk) = zpdlr * wmask(ji,jj,jk) ! c1d configuration : save masked Prandlt number 676 e_ric(ji,jj,jk) = zri * wmask(ji,jj,jk) ! c1d config. : save Ri 659 677 # endif 660 678 END DO … … 740 758 ! 741 759 ! !* Check of some namelist values 742 IF( nn_mxl < 0 .OR. nn_mxl > 3 ) CALL ctl_stop( 'bad flag: nn_mxl is 0, 1 or 2 ' ) 743 IF( nn_pdl < 0 .OR. nn_pdl > 1 ) CALL ctl_stop( 'bad flag: nn_pdl is 0 or 1 ' ) 744 IF( nn_htau < 0 .OR. nn_htau > 1 ) CALL ctl_stop( 'bad flag: nn_htau is 0, 1 or 2 ' ) 745 #if ! key_coupled 746 IF( nn_etau == 3 ) CALL ctl_stop( 'nn_etau == 3 : HF taum only known in coupled mode' ) 747 #endif 760 IF( nn_mxl < 0 .OR. nn_mxl > 3 ) CALL ctl_stop( 'bad flag: nn_mxl is 0, 1 or 2 ' ) 761 IF( nn_pdl < 0 .OR. nn_pdl > 1 ) CALL ctl_stop( 'bad flag: nn_pdl is 0 or 1 ' ) 762 IF( nn_htau < 0 .OR. nn_htau > 1 ) CALL ctl_stop( 'bad flag: nn_htau is 0, 1 or 2 ' ) 763 IF( nn_etau == 3 .AND. .NOT. ln_cpl ) CALL ctl_stop( 'nn_etau == 3 : HF taum only known in coupled mode' ) 748 764 749 765 IF( ln_mxl0 ) THEN … … 765 781 ! !* set vertical eddy coef. to the background value 766 782 DO jk = 1, jpk 767 avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)768 avm (:,:,jk) = avmb(jk) * tmask(:,:,jk)769 avmu(:,:,jk) = avmb(jk) * umask(:,:,jk)770 avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk)783 avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 784 avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 785 avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 786 avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 771 787 END DO 772 788 dissl(:,:,:) = 1.e-12_wp … … 819 835 en (:,:,:) = rn_emin * tmask(:,:,:) 820 836 CALL tke_avn ! recompute avt, avm, avmu, avmv and dissl (approximation) 837 ! 838 avt_k (:,:,:) = avt (:,:,:) 839 avm_k (:,:,:) = avm (:,:,:) 840 avmu_k(:,:,:) = avmu(:,:,:) 841 avmv_k(:,:,:) = avmv(:,:,:) 842 ! 821 843 DO jit = nit000 + 1, nit000 + 10 ; CALL zdf_tke( jit ) ; END DO 822 844 ENDIF … … 824 846 en(:,:,:) = rn_emin * tmask(:,:,:) 825 847 DO jk = 1, jpk ! set the Kz to the background value 826 avt (:,:,jk) = avtb(jk) * tmask(:,:,jk)827 avm (:,:,jk) = avmb(jk) * tmask(:,:,jk)828 avmu(:,:,jk) = avmb(jk) * umask(:,:,jk)829 avmv(:,:,jk) = avmb(jk) * vmask(:,:,jk)848 avt (:,:,jk) = avtb(jk) * wmask (:,:,jk) 849 avm (:,:,jk) = avmb(jk) * wmask (:,:,jk) 850 avmu(:,:,jk) = avmb(jk) * wumask(:,:,jk) 851 avmv(:,:,jk) = avmb(jk) * wvmask(:,:,jk) 830 852 END DO 831 853 ENDIF -
branches/2014/dev_r4650_UKMO14.4_OBS_GENERAL_VINTERP/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftmx.F90
r4624 r5837 126 126 zkz(:,:) = 0.e0 !* Associated potential energy consummed over the whole water column 127 127 DO jk = 2, jpkm1 128 zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zav_tide(:,:,jk) * tmask(:,:,jk)128 zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zav_tide(:,:,jk) * wmask(:,:,jk) 129 129 END DO 130 130 … … 135 135 END DO 136 136 137 DO jk = 2, jpkm1 !* Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zav_tide bound by 300 cm2/s 138 zav_tide(:,:,jk) = zav_tide(:,:,jk) * MIN( zkz(:,:), 30./6. ) !kz max = 300 cm2/s 137 DO jk = 2, jpkm1 !* Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zav_tide bound by 300 cm2/s 138 DO jj = 1, jpj !* Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz to recover en_tmx 139 DO ji = 1, jpi 140 zav_tide(ji,jj,jk) = zav_tide(ji,jj,jk) * MIN( zkz(ji,jj), 30./6. ) * wmask(ji,jj,jk) !kz max = 300 cm2/s 141 END DO 142 END DO 139 143 END DO 140 144 … … 163 167 ! ! ----------------------- ! 164 168 DO jk = 2, jpkm1 !* update momentum & tracer diffusivity with tidal mixing 165 avt(:,:,jk) = avt(:,:,jk) + zav_tide(:,:,jk) 166 avm(:,:,jk) = avm(:,:,jk) + zav_tide(:,:,jk) 169 DO jj = 1, jpj !* Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz to recover en_tmx 170 DO ji = 1, jpi 171 avt(ji,jj,jk) = avt(ji,jj,jk) + zav_tide(ji,jj,jk) * wmask(ji,jj,jk) 172 avm(ji,jj,jk) = avm(ji,jj,jk) + zav_tide(ji,jj,jk) * wmask(ji,jj,jk) 173 END DO 174 END DO 175 END DO 176 177 DO jk = 2, jpkm1 !* update momentum & tracer diffusivity with tidal mixing 167 178 DO jj = 2, jpjm1 168 179 DO ji = fs_2, fs_jpim1 ! vector opt. 169 avmu(ji,jj,jk) = avmu(ji,jj,jk) + 0.5 * ( zav_tide(ji,jj,jk) + zav_tide(ji+1,jj ,jk) ) * umask(ji,jj,jk)170 avmv(ji,jj,jk) = avmv(ji,jj,jk) + 0.5 * ( zav_tide(ji,jj,jk) + zav_tide(ji ,jj+1,jk) ) * vmask(ji,jj,jk)180 avmu(ji,jj,jk) = avmu(ji,jj,jk) + 0.5 * ( zav_tide(ji,jj,jk) + zav_tide(ji+1,jj ,jk) ) * wumask(ji,jj,jk) 181 avmv(ji,jj,jk) = avmv(ji,jj,jk) + 0.5 * ( zav_tide(ji,jj,jk) + zav_tide(ji ,jj+1,jk) ) * wvmask(ji,jj,jk) 171 182 END DO 172 183 END DO … … 237 248 zsum2(:,:) = 0.e0 238 249 DO jk= 2, jpk 239 zsum1(:,:) = zsum1(:,:) + zempba_3d_1(:,:,jk) * fse3w(:,:,jk) 240 zsum2(:,:) = zsum2(:,:) + zempba_3d_2(:,:,jk) * fse3w(:,:,jk) 250 zsum1(:,:) = zsum1(:,:) + zempba_3d_1(:,:,jk) * fse3w(:,:,jk) * tmask(:,:,jk) * tmask(:,:,jk-1) 251 zsum2(:,:) = zsum2(:,:) + zempba_3d_2(:,:,jk) * fse3w(:,:,jk) * tmask(:,:,jk) * tmask(:,:,jk-1) 241 252 END DO 242 253 DO jj = 1, jpj … … 274 285 zkz(:,:) = 0.e0 ! Associated potential energy consummed over the whole water column 275 286 DO jk = 2, jpkm1 276 zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zavt_itf(:,:,jk) * tmask(:,:,jk) 287 zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zavt_itf(:,:,jk) * tmask(:,:,jk) * tmask(:,:,jk-1) 277 288 END DO 278 289 … … 284 295 285 296 DO jk = 2, jpkm1 ! Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zavt_itf bound by 300 cm2/s 286 zavt_itf(:,:,jk) = zavt_itf(:,:,jk) * MIN( zkz(:,:), 120./10. ) ! kz max = 120 cm2/s297 zavt_itf(:,:,jk) = zavt_itf(:,:,jk) * MIN( zkz(:,:), 120./10. ) * tmask(:,:,jk) * tmask(:,:,jk-1) ! kz max = 120 cm2/s 287 298 END DO 288 299 … … 414 425 ! only the energy available for mixing is taken into account, 415 426 ! (mixing efficiency tidal dissipation efficiency) 416 en_tmx(:,:) = - rn_tfe * rn_me * ( zem2(:,:) * 1.25 + zek1(:,:) ) * tmask(:,:,1) 417 427 en_tmx(:,:) = - rn_tfe * rn_me * ( zem2(:,:) * 1.25 + zek1(:,:) ) * ssmask(:,:) 428 429 !============ 430 !TG: Bug for VVL? Should this section be moved out of _init and be updated at every timestep? 418 431 ! Vertical structure (az_tmx) 419 432 DO jj = 1, jpj ! part independent of the level 420 433 DO ji = 1, jpi 421 zhdep(ji,jj) = fsdepw(ji,jj,mbkt(ji,jj)+1) ! depth of the ocean434 zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) ! depth of the ocean 422 435 zfact(ji,jj) = rau0 * rn_htmx * ( 1. - EXP( -zhdep(ji,jj) / rn_htmx ) ) 423 436 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = en_tmx(ji,jj) / zfact(ji,jj) … … 427 440 DO jj = 1, jpj 428 441 DO ji = 1, jpi 429 az_tmx(ji,jj,jk) = zfact(ji,jj) * EXP( -( zhdep(ji,jj)-fsdepw(ji,jj,jk) ) / rn_htmx ) * tmask(ji,jj,jk) 430 END DO 431 END DO 432 END DO 442 az_tmx(ji,jj,jk) = zfact(ji,jj) * EXP( -( zhdep(ji,jj)-gdepw_0(ji,jj,jk) ) / rn_htmx ) * tmask(ji,jj,jk) 443 END DO 444 END DO 445 END DO 446 !=========== 433 447 434 448 IF( nprint == 1 .AND. lwp ) THEN … … 446 460 DO jj = 1, jpj 447 461 DO ji = 1, jpi 448 ztpc = ztpc + fse3w(ji,jj,jk) * e1t(ji,jj) * e2t(ji,jj) * zpc(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)462 ztpc = ztpc + fse3w(ji,jj,jk) * e1t(ji,jj) * e2t(ji,jj) * zpc(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj) 449 463 END DO 450 464 END DO … … 460 474 zkz(:,:) = 0.e0 461 475 DO jk = 2, jpkm1 462 DO jj = 1, jpj463 DO ji = 1, jpi464 zkz(ji,jj) = zkz(ji,jj) + fse3w(ji,jj,jk) * MAX( 0.e0, rn2(ji,jj,jk) ) * rau0 * zav_tide(ji,jj,jk)* tmask(ji,jj,jk)465 END DO466 END DO476 DO jj = 1, jpj 477 DO ji = 1, jpi 478 zkz(ji,jj) = zkz(ji,jj) + fse3w(ji,jj,jk) * MAX(0.e0, rn2(ji,jj,jk)) * rau0 * zav_tide(ji,jj,jk) * wmask(ji,jj,jk) 479 END DO 480 END DO 467 481 END DO 468 482 ! Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz … … 485 499 486 500 DO jk = 2, jpkm1 487 zav_tide(:,:,jk) = zav_tide(:,:,jk) * MIN( zkz(:,:), 30./6. ) !kz max = 300 cm2/s 501 DO jj = 1, jpj 502 DO ji = 1, jpi 503 zav_tide(ji,jj,jk) = zav_tide(ji,jj,jk) * MIN( zkz(ji,jj), 30./6. ) * wmask(ji,jj,jk) !kz max = 300 cm2/s 504 END DO 505 END DO 488 506 END DO 489 507 ztpc = 0.e0 … … 492 510 DO jj = 1, jpj 493 511 DO ji = 1, jpi 494 ztpc = ztpc + fse3w(ji,jj,jk) * e1t(ji,jj) * e2t(ji,jj) * zpc(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)512 ztpc = ztpc + fse3w(ji,jj,jk) * e1t(ji,jj) * e2t(ji,jj) * zpc(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj) 495 513 END DO 496 514 END DO … … 501 519 DO jk = 1, jpk 502 520 ze_z = SUM( e1t(:,:) * e2t(:,:) * zav_tide(:,:,jk) * tmask_i(:,:) ) & 503 & / MAX( 1.e-20, SUM( e1t(:,:) * e2t(:,:) * tmask (:,:,jk) * tmask_i(:,:) ) )521 & / MAX( 1.e-20, SUM( e1t(:,:) * e2t(:,:) * wmask (:,:,jk) * tmask_i(:,:) ) ) 504 522 ztpc = 1.E50 505 523 DO jj = 1, jpj … … 522 540 END DO 523 541 ze_z = SUM( e1t(:,:) * e2t(:,:) * zkz(:,:) * tmask_i(:,:) ) & 524 & / MAX( 1.e-20, SUM( e1t(:,:) * e2t(:,:) * tmask (:,:,jk) * tmask_i(:,:) ) )542 & / MAX( 1.e-20, SUM( e1t(:,:) * e2t(:,:) * wmask (:,:,jk) * tmask_i(:,:) ) ) 525 543 WRITE(numout,*) ' jk= ', jk,' ', ze_z * 1.e4,' cm2/s' 526 544 END DO … … 528 546 zkz(:,:) = az_tmx(:,:,jk) /rn_n2min 529 547 ze_z = SUM( e1t(:,:) * e2t(:,:) * zkz(:,:) * tmask_i(:,:) ) & 530 & / MAX( 1.e-20, SUM( e1t(:,:) * e2t(:,:) * tmask (:,:,jk) * tmask_i(:,:) ) )548 & / MAX( 1.e-20, SUM( e1t(:,:) * e2t(:,:) * wmask (:,:,jk) * tmask_i(:,:) ) ) 531 549 WRITE(numout,*) 532 550 WRITE(numout,*) ' N2 min - jk= ', jk,' ', ze_z * 1.e4,' cm2/s min= ',MINVAL(zkz)*1.e4, &
Note: See TracChangeset
for help on using the changeset viewer.