- Timestamp:
- 2020-11-09T16:48:35+01:00 (3 years ago)
- Location:
- NEMO/branches/2020/test_12905_xios_restart
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/test_12905_xios_restart
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEADext/AGRIF5 ^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 8 9 9 # SETTE 10 ^/utils/CI/ r12931_sette_ticket2462@HEADsette10 ^/utils/CI/sette@13559 sette
-
- Property svn:externals
-
NEMO/branches/2020/test_12905_xios_restart/src/OCE/ZDF/zdftke.F90
r12969 r13751 28 28 !! 3.6 ! 2014-11 (P. Mathiot) add ice shelf capability 29 29 !! 4.0 ! 2017-04 (G. Madec) remove CPP ddm key & avm at t-point only 30 !! - ! 2017-05 (G. Madec) add top/bottom friction as boundary condition (ln_drg)30 !! - ! 2017-05 (G. Madec) add top/bottom friction as boundary condition 31 31 !!---------------------------------------------------------------------- 32 32 … … 45 45 USE zdfdrg ! vertical physics: top/bottom drag coef. 46 46 USE zdfmxl ! vertical physics: mixed layer 47 #if defined key_si3 48 USE ice, ONLY: hm_i, h_i 49 #endif 50 #if defined key_cice 51 USE sbc_ice, ONLY: h_i 52 #endif 47 53 ! 48 54 USE in_out_manager ! I/O manager … … 62 68 ! !!** Namelist namzdf_tke ** 63 69 LOGICAL :: ln_mxl0 ! mixing length scale surface value as function of wind stress or not 70 INTEGER :: nn_mxlice ! type of scaling under sea-ice (=0/1/2/3) 71 REAL(wp) :: rn_mxlice ! ice thickness value when scaling under sea-ice 64 72 INTEGER :: nn_mxl ! type of mixing length (=0/1/2/3) 65 73 REAL(wp) :: rn_mxl0 ! surface min value of mixing length (kappa*z_o=0.4*0.1 m) [m] … … 71 79 REAL(wp) :: rn_emin0 ! surface minimum value of tke [m2/s2] 72 80 REAL(wp) :: rn_bshear ! background shear (>0) currently a numerical threshold (do not change it) 73 LOGICAL :: ln_drg ! top/bottom friction forcing flag74 81 INTEGER :: nn_etau ! type of depth penetration of surface tke (=0/1/2/3) 75 82 INTEGER :: nn_htau ! type of tke profile of penetration (=0/1) 76 83 REAL(wp) :: rn_efr ! fraction of TKE surface value which penetrates in the ocean 77 REAL(wp) :: rn_eice ! =0 ON below sea-ice, =4 OFF when ice fraction > 1/478 84 LOGICAL :: ln_lc ! Langmuir cells (LC) as a source term of TKE or not 79 85 REAL(wp) :: rn_lc ! coef to compute vertical velocity of Langmuir cells 86 INTEGER :: nn_eice ! attenutaion of langmuir & surface wave breaking under ice (=0/1/2/3) 80 87 81 88 REAL(wp) :: ri_cri ! critic Richardson number (deduced from rn_ediff and rn_ediss values) … … 90 97 !! * Substitutions 91 98 # include "do_loop_substitute.h90" 99 # include "domzgr_substitute.h90" 92 100 !!---------------------------------------------------------------------- 93 101 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 191 199 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm, p_avt ! vertical eddy viscosity & diffusivity (w-points) 192 200 ! 193 INTEGER :: ji, jj, jk ! dummy loop arguments201 INTEGER :: ji, jj, jk ! dummy loop arguments 194 202 REAL(wp) :: zetop, zebot, zmsku, zmskv ! local scalars 195 203 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 196 204 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 197 REAL(wp) :: zbbrau, z ri! local scalars198 REAL(wp) :: zfact1, zfact2, zfact3 ! - 199 REAL(wp) :: ztx2 , zty2 , zcof ! - 200 REAL(wp) :: ztau , zdif ! - 201 REAL(wp) :: zus , zwlc , zind ! - 202 REAL(wp) :: zzd_up, zzd_lw ! - 205 REAL(wp) :: zbbrau, zbbirau, zri ! local scalars 206 REAL(wp) :: zfact1, zfact2, zfact3 ! - - 207 REAL(wp) :: ztx2 , zty2 , zcof ! - - 208 REAL(wp) :: ztau , zdif ! - - 209 REAL(wp) :: zus , zwlc , zind ! - - 210 REAL(wp) :: zzd_up, zzd_lw ! - - 203 211 INTEGER , DIMENSION(jpi,jpj) :: imlc 204 REAL(wp), DIMENSION(jpi,jpj) :: z hlc, zfr_i212 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra, zhlc, zus3 205 213 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpelc, zdiag, zd_up, zd_lw 206 214 !!-------------------------------------------------------------------- 207 215 ! 208 zbbrau = rn_ebb / rho0 ! Local constant initialisation 209 zfact1 = -.5_wp * rn_Dt 210 zfact2 = 1.5_wp * rn_Dt * rn_ediss 211 zfact3 = 0.5_wp * rn_ediss 216 zbbrau = rn_ebb / rho0 ! Local constant initialisation 217 zbbirau = 3.75_wp / rho0 218 zfact1 = -.5_wp * rn_Dt 219 zfact2 = 1.5_wp * rn_Dt * rn_ediss 220 zfact3 = 0.5_wp * rn_ediss 221 ! 222 ! ice fraction considered for attenuation of langmuir & wave breaking 223 SELECT CASE ( nn_eice ) 224 CASE( 0 ) ; zice_fra(:,:) = 0._wp 225 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(:,:) * 10._wp ) 226 CASE( 2 ) ; zice_fra(:,:) = fr_i(:,:) 227 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(:,:) , 1._wp ) 228 END SELECT 212 229 ! 213 230 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 214 231 ! ! Surface/top/bottom boundary condition on tke 215 232 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 216 ! 217 DO_2D_00_00 233 ! 234 DO_2D( 0, 0, 0, 0 ) ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 235 !! clem: this should be the right formulation but it makes the model unstable unless drags are calculated implicitly 236 !! one way around would be to increase zbbirau 237 !! en(ji,jj,1) = MAX( rn_emin0, ( ( 1._wp - fr_i(ji,jj) ) * zbbrau + & 238 !! & fr_i(ji,jj) * zbbirau ) * taum(ji,jj) ) * tmask(ji,jj,1) 218 239 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 219 240 END_2D … … 227 248 ! Note that stress averaged is done using an wet-only calculation of u and v at t-point like in zdfsh2 228 249 ! 229 IF( ln_drg ) THEN!== friction used as top/bottom boundary condition on TKE230 ! 231 DO_2D _00_00250 IF( .NOT.ln_drg_OFF ) THEN !== friction used as top/bottom boundary condition on TKE 251 ! 252 DO_2D( 0, 0, 0, 0 ) ! bottom friction 232 253 zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 233 254 zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) … … 237 258 en(ji,jj,mbkt(ji,jj)+1) = MAX( zebot, rn_emin ) * ssmask(ji,jj) 238 259 END_2D 239 IF( ln_isfcav ) THEN ! top friction240 DO_2D _00_00260 IF( ln_isfcav ) THEN 261 DO_2D( 0, 0, 0, 0 ) ! top friction 241 262 zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 242 263 zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) … … 259 280 zpelc(:,:,1) = MAX( rn2b(:,:,1), 0._wp ) * gdepw(:,:,1,Kmm) * e3w(:,:,1,Kmm) 260 281 DO jk = 2, jpk 261 zpelc(:,:,jk) = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw(:,:,jk,Kmm) * e3w(:,:,jk,Kmm) 282 zpelc(:,:,jk) = zpelc(:,:,jk-1) + & 283 & MAX( rn2b(:,:,jk), 0._wp ) * gdepw(:,:,jk,Kmm) * e3w(:,:,jk,Kmm) 262 284 END DO 263 285 ! !* finite Langmuir Circulation depth 264 286 zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) 265 287 imlc(:,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point (=2 over land) 266 DO_3DS _11_11( jpkm1, 2, -1 )267 zus = zcof * taum(ji,jj)288 DO_3DS( 1, 1, 1, 1, jpkm1, 2, -1 ) ! Last w-level at which zpelc>=0.5*us*us 289 zus = zcof * taum(ji,jj) ! with us=0.016*wind(starting from jpk-1) 268 290 IF( zpelc(ji,jj,jk) > zus ) imlc(ji,jj) = jk 269 291 END_3D 270 292 ! ! finite LC depth 271 DO_2D _11_11293 DO_2D( 1, 1, 1, 1 ) 272 294 zhlc(ji,jj) = gdepw(ji,jj,imlc(ji,jj),Kmm) 273 295 END_2D 274 296 zcof = 0.016 / SQRT( zrhoa * zcdrag ) 275 DO_2D _00_00297 DO_2D( 0, 0, 0, 0 ) 276 298 zus = zcof * SQRT( taum(ji,jj) ) ! Stokes drift 277 zfr_i(ji,jj) = ( 1._wp - 4._wp * fr_i(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 278 IF (zfr_i(ji,jj) < 0. ) zfr_i(ji,jj) = 0. 299 zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 279 300 END_2D 280 DO_3D_00_00( 2, jpkm1 ) 281 IF ( zfr_i(ji,jj) /= 0. ) THEN 282 ! vertical velocity due to LC 301 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) !* TKE Langmuir circulation source term added to en 302 IF ( zus3(ji,jj) /= 0._wp ) THEN 283 303 IF ( gdepw(ji,jj,jk,Kmm) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN 284 304 ! ! vertical velocity due to LC 285 zwlc = rn_lc * SIN( rpi * gdepw(ji,jj,jk,Kmm) / zhlc(ji,jj) ) ! warning: optimization: zus^3 is in zfr_i305 zwlc = rn_lc * SIN( rpi * gdepw(ji,jj,jk,Kmm) / zhlc(ji,jj) ) 286 306 ! ! TKE Langmuir circulation source term 287 en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * z fr_i(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj)307 en(ji,jj,jk) = en(ji,jj,jk) + rn_Dt * zus3(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 288 308 ENDIF 289 309 ENDIF … … 299 319 ! ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 300 320 ! 301 IF( nn_pdl == 1 ) THEN !* Prandtl number = F( Ri )302 DO_3D _00_00(2, jpkm1 )321 IF( nn_pdl == 1 ) THEN !* Prandtl number = F( Ri ) 322 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 303 323 ! ! local Richardson number 304 zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 324 IF (rn2b(ji,jj,jk) <= 0.0_wp) then 325 zri = 0.0_wp 326 ELSE 327 zri = rn2b(ji,jj,jk) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 328 ENDIF 305 329 ! ! inverse of Prandtl number 306 330 apdlr(ji,jj,jk) = MAX( 0.1_wp, ri_cri / MAX( ri_cri , zri ) ) … … 308 332 ENDIF 309 333 ! 310 DO_3D _00_00( 2, jpkm1 )334 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) !* Matrix and right hand side in en 311 335 zcof = zfact1 * tmask(ji,jj,jk) 312 336 ! ! A minimum of 2.e-5 m2/s is imposed on TKE vertical … … 328 352 END_3D 329 353 ! !* Matrix inversion from level 2 (tke prescribed at level 1) 330 DO_3D _00_00( 3, jpkm1 )354 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 331 355 zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 332 356 END_3D 333 DO_2D _00_00357 DO_2D( 0, 0, 0, 0 ) ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 334 358 zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1) ! Surface boudary conditions on tke 335 359 END_2D 336 DO_3D _00_00(3, jpkm1 )360 DO_3D( 0, 0, 0, 0, 3, jpkm1 ) 337 361 zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1) 338 362 END_3D 339 DO_2D _00_00363 DO_2D( 0, 0, 0, 0 ) ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 340 364 en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 341 365 END_2D 342 DO_3DS _00_00(jpk-2, 2, -1 )366 DO_3DS( 0, 0, 0, 0, jpk-2, 2, -1 ) 343 367 en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 344 368 END_3D 345 DO_3D _00_00( 2, jpkm1 )369 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! set the minimum value of tke 346 370 en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 347 371 END_3D … … 352 376 !!gm BUG : in the exp remove the depth of ssh !!! 353 377 !!gm i.e. use gde3w in argument (gdepw(:,:,:,Kmm)) 354 355 378 ! 379 ! penetration is partly switched off below sea-ice if nn_eice/=0 380 ! 356 381 IF( nn_etau == 1 ) THEN !* penetration below the mixed layer (rn_efr fraction) 357 DO_3D _00_00( 2, jpkm1 )382 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 358 383 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) ) & 359 & * MAX( 0.,1._wp - rn_eice *fr_i(ji,jj) )* wmask(ji,jj,jk) * tmask(ji,jj,1)384 & * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 360 385 END_3D 361 386 ELSEIF( nn_etau == 2 ) THEN !* act only at the base of the mixed layer (jk=nmln) (rn_efr fraction) 362 DO_2D _00_00387 DO_2D( 0, 0, 0, 0 ) 363 388 jk = nmln(ji,jj) 364 389 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) ) & 365 & * MAX( 0.,1._wp - rn_eice *fr_i(ji,jj) )* wmask(ji,jj,jk) * tmask(ji,jj,1)390 & * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 366 391 END_2D 367 392 ELSEIF( nn_etau == 3 ) THEN !* penetration belox the mixed layer (HF variability) 368 DO_3D _00_00(2, jpkm1 )393 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 369 394 ztx2 = utau(ji-1,jj ) + utau(ji,jj) 370 395 zty2 = vtau(ji ,jj-1) + vtau(ji,jj) … … 373 398 zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add ) ! apply some modifications... 374 399 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) ) & 375 & * MAX( 0.,1._wp - rn_eice *fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1)400 & * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 376 401 END_3D 377 402 ENDIF … … 422 447 REAL(wp) :: zrn2, zraug, zcoef, zav ! local scalars 423 448 REAL(wp) :: zdku, zdkv, zsqen ! - - 424 REAL(wp) :: zemxl, zemlm, zemlp ! - -449 REAL(wp) :: zemxl, zemlm, zemlp, zmaxice ! - - 425 450 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxlm, zmxld ! 3D workspace 426 451 !!-------------------------------------------------------------------- … … 435 460 zmxlm(:,:,:) = rmxl_min 436 461 zmxld(:,:,:) = rmxl_min 437 ! 438 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 462 ! 463 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rho0*g) 464 ! 439 465 zraug = vkarmn * 2.e5_wp / ( rho0 * grav ) 440 DO_2D_00_00 441 zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 466 #if ! defined key_si3 && ! defined key_cice 467 DO_2D( 0, 0, 0, 0 ) ! No sea-ice 468 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 442 469 END_2D 443 ELSE 470 #else 471 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 472 ! 473 CASE( 0 ) ! No scaling under sea-ice 474 DO_2D( 0, 0, 0, 0 ) 475 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 476 END_2D 477 ! 478 CASE( 1 ) ! scaling with constant sea-ice thickness 479 DO_2D( 0, 0, 0, 0 ) 480 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 481 & fr_i(ji,jj) * rn_mxlice ) * tmask(ji,jj,1) 482 END_2D 483 ! 484 CASE( 2 ) ! scaling with mean sea-ice thickness 485 DO_2D( 0, 0, 0, 0 ) 486 #if defined key_si3 487 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 488 & fr_i(ji,jj) * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 489 #elif defined key_cice 490 zmaxice = MAXVAL( h_i(ji,jj,:) ) 491 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 492 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 493 #endif 494 END_2D 495 ! 496 CASE( 3 ) ! scaling with max sea-ice thickness 497 DO_2D( 0, 0, 0, 0 ) 498 zmaxice = MAXVAL( h_i(ji,jj,:) ) 499 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 500 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 501 END_2D 502 ! 503 END SELECT 504 #endif 505 ! 506 DO_2D( 0, 0, 0, 0 ) 507 zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 508 END_2D 509 ! 510 ELSE 444 511 zmxlm(:,:,1) = rn_mxl0 445 512 ENDIF 446 ! 447 DO_3D_00_00( 2, jpkm1 ) 513 514 ! 515 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 448 516 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 449 517 zmxlm(ji,jj,jk) = MAX( rmxl_min, SQRT( 2._wp * en(ji,jj,jk) / zrn2 ) ) … … 460 528 ! where wmask = 0 set zmxlm == e3w(:,:,:,Kmm) 461 529 CASE ( 0 ) ! bounded by the distance to surface and bottom 462 DO_3D _00_00(2, jpkm1 )530 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 463 531 zemxl = MIN( gdepw(ji,jj,jk,Kmm) - gdepw(ji,jj,mikt(ji,jj),Kmm), zmxlm(ji,jj,jk), & 464 532 & gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) - gdepw(ji,jj,jk,Kmm) ) 465 533 ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 466 zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 467 zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 534 zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) & 535 & + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 536 zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) & 537 & + MIN( zmxlm(ji,jj,jk) , e3w(ji,jj,jk,Kmm) ) * (1 - wmask(ji,jj,jk)) 468 538 END_3D 469 539 ! 470 540 CASE ( 1 ) ! bounded by the vertical scale factor 471 DO_3D _00_00(2, jpkm1 )541 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 472 542 zemxl = MIN( e3w(ji,jj,jk,Kmm), zmxlm(ji,jj,jk) ) 473 543 zmxlm(ji,jj,jk) = zemxl … … 476 546 ! 477 547 CASE ( 2 ) ! |dk[xml]| bounded by e3t : 478 DO_3D_00_00( 2, jpkm1 ) 479 zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 480 END_3D 481 DO_3DS_00_00( jpkm1, 2, -1 ) 548 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! from the surface to the bottom : 549 zmxlm(ji,jj,jk) = & 550 & MIN( zmxlm(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 551 END_3D 552 DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 ) ! from the bottom to the surface : 482 553 zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) ) 483 554 zmxlm(ji,jj,jk) = zemxl … … 486 557 ! 487 558 CASE ( 3 ) ! lup and ldown, |dk[xml]| bounded by e3t : 488 DO_3D_00_00( 2, jpkm1 ) 489 zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 490 END_3D 491 DO_3DS_00_00( jpkm1, 2, -1 ) 492 zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) ) 493 END_3D 494 DO_3D_00_00( 2, jpkm1 ) 559 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! from the surface to the bottom : lup 560 zmxld(ji,jj,jk) = & 561 & MIN( zmxld(ji,jj,jk-1) + e3t(ji,jj,jk-1,Kmm), zmxlm(ji,jj,jk) ) 562 END_3D 563 DO_3DS( 0, 0, 0, 0, jpkm1, 2, -1 ) ! from the bottom to the surface : ldown 564 zmxlm(ji,jj,jk) = & 565 & MIN( zmxlm(ji,jj,jk+1) + e3t(ji,jj,jk+1,Kmm), zmxlm(ji,jj,jk) ) 566 END_3D 567 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 495 568 zemlm = MIN ( zmxld(ji,jj,jk), zmxlm(ji,jj,jk) ) 496 569 zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) ) … … 504 577 ! ! Vertical eddy viscosity and diffusivity (avm and avt) 505 578 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 506 DO_3D _00_00( 1, jpkm1 )579 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !* vertical eddy viscosity & diffivity at w-points 507 580 zsqen = SQRT( en(ji,jj,jk) ) 508 581 zav = rn_ediff * zmxlm(ji,jj,jk) * zsqen … … 513 586 ! 514 587 ! 515 IF( nn_pdl == 1 ) THEN !* Prandtl number case: update avt516 DO_3D _00_00(2, jpkm1 )588 IF( nn_pdl == 1 ) THEN !* Prandtl number case: update avt 589 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 517 590 p_avt(ji,jj,jk) = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 518 591 END_3D … … 547 620 INTEGER :: ios 548 621 !! 549 NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin , & 550 & rn_emin0, rn_bshear, nn_mxl , ln_mxl0 , & 551 & rn_mxl0 , nn_pdl , ln_drg , ln_lc , rn_lc, & 552 & nn_etau , nn_htau , rn_efr , rn_eice 622 NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin , & 623 & rn_emin0, rn_bshear, nn_mxl , ln_mxl0 , & 624 & rn_mxl0 , nn_mxlice, rn_mxlice, & 625 & nn_pdl , ln_lc , rn_lc , & 626 & nn_etau , nn_htau , rn_efr , nn_eice 553 627 !!---------------------------------------------------------------------- 554 628 ! … … 577 651 WRITE(numout,*) ' surface mixing length = F(stress) or not ln_mxl0 = ', ln_mxl0 578 652 WRITE(numout,*) ' surface mixing length minimum value rn_mxl0 = ', rn_mxl0 579 WRITE(numout,*) ' top/bottom friction forcing flag ln_drg = ', ln_drg 653 IF( ln_mxl0 ) THEN 654 WRITE(numout,*) ' type of scaling under sea-ice nn_mxlice = ', nn_mxlice 655 IF( nn_mxlice == 1 ) & 656 WRITE(numout,*) ' ice thickness when scaling under sea-ice rn_mxlice = ', rn_mxlice 657 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 658 CASE( 0 ) ; WRITE(numout,*) ' ==>>> No scaling under sea-ice' 659 CASE( 1 ) ; WRITE(numout,*) ' ==>>> scaling with constant sea-ice thickness' 660 CASE( 2 ) ; WRITE(numout,*) ' ==>>> scaling with mean sea-ice thickness' 661 CASE( 3 ) ; WRITE(numout,*) ' ==>>> scaling with max sea-ice thickness' 662 CASE DEFAULT 663 CALL ctl_stop( 'zdf_tke_init: wrong value for nn_mxlice, should be 0,1,2,3 or 4') 664 END SELECT 665 ENDIF 580 666 WRITE(numout,*) ' Langmuir cells parametrization ln_lc = ', ln_lc 581 667 WRITE(numout,*) ' coef to compute vertical velocity of LC rn_lc = ', rn_lc … … 583 669 WRITE(numout,*) ' type of tke penetration profile nn_htau = ', nn_htau 584 670 WRITE(numout,*) ' fraction of TKE that penetrates rn_efr = ', rn_efr 585 WRITE(numout,*) ' below sea-ice: =0 ON rn_eice = ', rn_eice 586 WRITE(numout,*) ' =4 OFF when ice fraction > 1/4 ' 587 IF( ln_drg ) THEN 588 WRITE(numout,*) 589 WRITE(numout,*) ' Namelist namdrg_top/_bot: used values:' 590 WRITE(numout,*) ' top ocean cavity roughness (m) rn_z0(_top)= ', r_z0_top 591 WRITE(numout,*) ' Bottom seafloor roughness (m) rn_z0(_bot)= ', r_z0_bot 592 ENDIF 671 WRITE(numout,*) ' langmuir & surface wave breaking under ice nn_eice = ', nn_eice 672 SELECT CASE( nn_eice ) 673 CASE( 0 ) ; WRITE(numout,*) ' ==>>> no impact of ice cover on langmuir & surface wave breaking' 674 CASE( 1 ) ; WRITE(numout,*) ' ==>>> weigthed by 1-TANH( fr_i(:,:) * 10 )' 675 CASE( 2 ) ; WRITE(numout,*) ' ==>>> weighted by 1-fr_i(:,:)' 676 CASE( 3 ) ; WRITE(numout,*) ' ==>>> weighted by 1-MIN( 1, 4 * fr_i(:,:) )' 677 CASE DEFAULT 678 CALL ctl_stop( 'zdf_tke_init: wrong value for nn_eice, should be 0,1,2, or 3') 679 END SELECT 593 680 WRITE(numout,*) 594 681 WRITE(numout,*) ' ==>>> critical Richardson nb with your parameters ri_cri = ', ri_cri … … 666 753 ! 667 754 IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN ! fields exist 668 CALL iom_get( numror, jpdom_auto glo, 'en' , en , ldxios = lroxios )669 CALL iom_get( numror, jpdom_auto glo, 'avt_k', avt_k, ldxios = lroxios )670 CALL iom_get( numror, jpdom_auto glo, 'avm_k', avm_k, ldxios = lroxios )671 CALL iom_get( numror, jpdom_auto glo, 'dissl', dissl, ldxios = lroxios )755 CALL iom_get( numror, jpdom_auto, 'en' , en , ldxios = lroxios ) 756 CALL iom_get( numror, jpdom_auto, 'avt_k', avt_k, ldxios = lroxios ) 757 CALL iom_get( numror, jpdom_auto, 'avm_k', avm_k, ldxios = lroxios ) 758 CALL iom_get( numror, jpdom_auto, 'dissl', dissl, ldxios = lroxios ) 672 759 ELSE ! start TKE from rest 673 760 IF(lwp) WRITE(numout,*)
Note: See TracChangeset
for help on using the changeset viewer.