- Timestamp:
- 2016-07-19T10:38:35+02:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftmx.F90
r5130 r6808 8 8 !! 3.3 ! 2010-10 (C. Ethe, G. Madec) reorganisation of initialisation phase 9 9 !!---------------------------------------------------------------------- 10 #if defined key_zdftmx || defined key_esopa10 #if defined key_zdftmx 11 11 !!---------------------------------------------------------------------- 12 12 !! 'key_zdftmx' Tidal vertical mixing … … 51 51 52 52 !! * Substitutions 53 # include "domzgr_substitute.h90"54 53 # include "vectopt_loop_substitute.h90" 55 54 !!---------------------------------------------------------------------- 56 !! NEMO/OPA 4.0 , NEMO Consortium (2011)55 !! NEMO/OPA 3.7 , NEMO Consortium (2014) 57 56 !! $Id$ 58 57 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 105 104 !! Koch-Larrouy et al. 2007, GRL. 106 105 !!---------------------------------------------------------------------- 107 USE oce, zav_tide => ua ! use ua as workspace108 !!109 106 INTEGER, INTENT(in) :: kt ! ocean time-step 110 ! !107 ! 111 108 INTEGER :: ji, jj, jk ! dummy loop indices 112 109 REAL(wp) :: ztpc ! scalar workspace 113 REAL(wp), POINTER, DIMENSION(:,:) :: zkz 110 REAL(wp), POINTER, DIMENSION(:,:) :: zkz 111 REAL(wp), POINTER, DIMENSION(:,:,:) :: zav_tide 114 112 !!---------------------------------------------------------------------- 115 113 ! 116 114 IF( nn_timing == 1 ) CALL timing_start('zdf_tmx') 117 115 ! 118 CALL wrk_alloc( jpi,jpj, zkz ) 119 116 CALL wrk_alloc( jpi,jpj, zkz ) 117 CALL wrk_alloc( jpi,jpj,jpk, zav_tide ) 118 ! 120 119 ! ! ----------------------- ! 121 120 ! ! Standard tidal mixing ! (compute zav_tide) … … 126 125 zkz(:,:) = 0.e0 !* Associated potential energy consummed over the whole water column 127 126 DO jk = 2, jpkm1 128 zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zav_tide(:,:,jk) * wmask(:,:,jk)127 zkz(:,:) = zkz(:,:) + e3w_n(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zav_tide(:,:,jk) * wmask(:,:,jk) 129 128 END DO 130 129 … … 136 135 137 136 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 137 zav_tide(:,:,jk) = zav_tide(:,:,jk) * MIN( zkz(:,:), 30./6. ) * wmask(:,:,jk) !kz max = 300 cm2/s 143 138 END DO 144 139 145 140 IF( kt == nit000 ) THEN !* check at first time-step: diagnose the energy consumed by zav_tide 146 ztpc = 0. e0141 ztpc = 0._wp 147 142 DO jk= 1, jpk 148 143 DO jj= 1, jpj 149 144 DO ji= 1, jpi 150 ztpc = ztpc + fse3w(ji,jj,jk) * e1t(ji,jj) * e2t(ji,jj)&151 & 145 ztpc = ztpc + e3w_n(ji,jj,jk) * e1e2t(ji,jj) & 146 & * MAX( 0.e0, rn2(ji,jj,jk) ) * zav_tide(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 152 147 END DO 153 148 END DO 154 149 END DO 155 150 ztpc= rau0 / ( rn_tfe * rn_me ) * ztpc 151 IF( lk_mpp ) CALL mpp_sum( ztpc ) 156 152 IF(lwp) WRITE(numout,*) 157 153 IF(lwp) WRITE(numout,*) ' N Total power consumption by av_tide : ztpc = ', ztpc * 1.e-12 ,'TW' … … 167 163 ! ! ----------------------- ! 168 164 DO jk = 2, jpkm1 !* update momentum & tracer diffusivity with tidal mixing 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 165 avt(:,:,jk) = avt(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk) 166 avm(:,:,jk) = avm(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk) 178 167 DO jj = 2, jpjm1 179 168 DO ji = fs_2, fs_jpim1 ! vector opt. … … 190 179 IF(ln_ctl) CALL prt_ctl(tab3d_1=zav_tide , clinfo1=' tmx - av_tide: ', tab3d_2=avt, clinfo2=' avt: ', ovlap=1, kdim=jpk) 191 180 ! 192 CALL wrk_dealloc( jpi,jpj, zkz ) 181 CALL wrk_dealloc( jpi,jpj, zkz ) 182 CALL wrk_dealloc( jpi,jpj,jpk, zav_tide ) 193 183 ! 194 184 IF( nn_timing == 1 ) CALL timing_stop('zdf_tmx') … … 239 229 DO jk = 1, jpkm1 240 230 zdn2dz (:,:,jk) = rn2(:,:,jk) - rn2(:,:,jk+1) ! Vertical profile of dN2/dz 241 !CDIR NOVERRCHK242 231 zempba_3d_1(:,:,jk) = SQRT( MAX( 0.e0, rn2(:,:,jk) ) ) ! - - of N 243 232 zempba_3d_2(:,:,jk) = MAX( 0.e0, rn2(:,:,jk) ) ! - - of N^2 … … 248 237 zsum2(:,:) = 0.e0 249 238 DO jk= 2, jpk 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)239 zsum1(:,:) = zsum1(:,:) + zempba_3d_1(:,:,jk) * e3w_n(:,:,jk) * wmask(:,:,jk) 240 zsum2(:,:) = zsum2(:,:) + zempba_3d_2(:,:,jk) * e3w_n(:,:,jk) * wmask(:,:,jk) 252 241 END DO 253 242 DO jj = 1, jpj … … 266 255 ! 267 256 zempba_3d(ji,jj,jk) = ztpc 268 zsum (ji,jj) = zsum(ji,jj) + ztpc * fse3w(ji,jj,jk)257 zsum (ji,jj) = zsum(ji,jj) + ztpc * e3w_n(ji,jj,jk) 269 258 END DO 270 259 END DO … … 285 274 zkz(:,:) = 0.e0 ! Associated potential energy consummed over the whole water column 286 275 DO jk = 2, jpkm1 287 zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zavt_itf(:,:,jk) * tmask(:,:,jk) * tmask(:,:,jk-1)276 zkz(:,:) = zkz(:,:) + e3w_n(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zavt_itf(:,:,jk) * wmask(:,:,jk) 288 277 END DO 289 278 … … 295 284 296 285 DO jk = 2, jpkm1 ! Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zavt_itf bound by 300 cm2/s 297 zavt_itf(:,:,jk) = zavt_itf(:,:,jk) * MIN( zkz(:,:), 120./10. ) * tmask(:,:,jk) * tmask(:,:,jk-1) ! kz max = 120 cm2/s286 zavt_itf(:,:,jk) = zavt_itf(:,:,jk) * MIN( zkz(:,:), 120./10. ) * wmask(:,:,jk) ! kz max = 120 cm2/s 298 287 END DO 299 288 … … 303 292 DO jj= 1, jpj 304 293 DO ji= 1, jpi 305 ztpc = ztpc + e1 t(ji,jj) * e2t(ji,jj) * fse3w(ji,jj,jk) * MAX( 0.e0, rn2(ji,jj,jk) ) &306 & * zavt_itf(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)294 ztpc = ztpc + e1e2t(ji,jj) * e3w_n(ji,jj,jk) * MAX( 0.e0, rn2(ji,jj,jk) ) & 295 & * zavt_itf(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj) 307 296 END DO 308 297 END DO 309 298 END DO 299 IF( lk_mpp ) CALL mpp_sum( ztpc ) 310 300 ztpc= rau0 * ztpc / ( rn_me * rn_tfe_itf ) 311 301 IF(lwp) WRITE(numout,*) ' N Total power consumption by zavt_itf: ztpc = ', ztpc * 1.e-12 ,'TW' … … 361 351 !! Koch-Larrouy et al. 2007, GRL. 362 352 !!---------------------------------------------------------------------- 363 USE oce , zav_tide => ua ! ua used as workspace364 !!365 353 INTEGER :: ji, jj, jk ! dummy loop indices 366 354 INTEGER :: inum ! local integer 367 355 INTEGER :: ios 368 356 REAL(wp) :: ztpc, ze_z ! local scalars 369 REAL(wp), DIMENSION(:,:) , POINTER :: zem2, zek1 ! read M2 and K1 tidal energy370 REAL(wp), DIMENSION(:,:) , POINTER :: zkz ! total M2, K1 and S2 tidal energy371 REAL(wp), DIMENSION(:,:) , POINTER :: zfact ! used for vertical structure function372 REAL(wp), DIMENSION(:,:) , POINTER :: zhdep ! Ocean depth373 REAL(wp), DIMENSION(:,:,:), POINTER :: zpc 357 REAL(wp), DIMENSION(:,:) , POINTER :: zem2, zek1 ! read M2 and K1 tidal energy 358 REAL(wp), DIMENSION(:,:) , POINTER :: zkz ! total M2, K1 and S2 tidal energy 359 REAL(wp), DIMENSION(:,:) , POINTER :: zfact ! used for vertical structure function 360 REAL(wp), DIMENSION(:,:) , POINTER :: zhdep ! Ocean depth 361 REAL(wp), DIMENSION(:,:,:), POINTER :: zpc, zav_tide ! power consumption 374 362 !! 375 363 NAMELIST/namzdf_tmx/ rn_htmx, rn_n2min, rn_tfe, rn_me, ln_tmx_itf, rn_tfe_itf … … 378 366 IF( nn_timing == 1 ) CALL timing_start('zdf_tmx_init') 379 367 ! 380 CALL wrk_alloc( jpi,jpj, zem2, zek1, zkz, zfact, zhdep )381 CALL wrk_alloc( jpi,jpj,jpk, zpc)382 383 REWIND( numnam_ref ) 368 CALL wrk_alloc( jpi,jpj, zem2, zek1, zkz, zfact, zhdep ) 369 CALL wrk_alloc( jpi,jpj,jpk, zpc, zav_tide ) 370 ! 371 REWIND( numnam_ref ) ! Namelist namzdf_tmx in reference namelist : Tidal Mixing 384 372 READ ( numnam_ref, namzdf_tmx, IOSTAT = ios, ERR = 901) 385 373 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_tmx in reference namelist', lwp ) 386 387 REWIND( numnam_cfg ) 374 ! 375 REWIND( numnam_cfg ) ! Namelist namzdf_tmx in configuration namelist : Tidal Mixing 388 376 READ ( numnam_cfg, namzdf_tmx, IOSTAT = ios, ERR = 902 ) 389 377 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_tmx in configuration namelist', lwp ) 390 378 IF(lwm) WRITE ( numond, namzdf_tmx ) 391 392 IF(lwp) THEN ! Control print379 ! 380 IF(lwp) THEN ! Control print 393 381 WRITE(numout,*) 394 382 WRITE(numout,*) 'zdf_tmx_init : tidal mixing' … … 402 390 WRITE(numout,*) ' ITF tidal dissipation efficiency = ', rn_tfe_itf 403 391 ENDIF 404 405 ! ! allocate tmx arrays 392 ! ! allocate tmx arrays 406 393 IF( zdf_tmx_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_tmx_init : unable to allocate tmx arrays' ) 407 394 408 IF( ln_tmx_itf ) THEN ! read the Indonesian Through Flow mask395 IF( ln_tmx_itf ) THEN ! read the Indonesian Through Flow mask 409 396 CALL iom_open('mask_itf',inum) 410 397 CALL iom_get (inum, jpdom_data, 'tmaskitf',mask_itf,1) ! 411 398 CALL iom_close(inum) 412 399 ENDIF 413 414 ! read M2 tidal energy flux : W/m2 ( zem2 < 0 ) 400 ! ! read M2 tidal energy flux : W/m2 ( zem2 < 0 ) 415 401 CALL iom_open('M2rowdrg',inum) 416 402 CALL iom_get (inum, jpdom_data, 'field',zem2,1) ! 417 403 CALL iom_close(inum) 418 419 ! read K1 tidal energy flux : W/m2 ( zek1 < 0 ) 404 ! ! read K1 tidal energy flux : W/m2 ( zek1 < 0 ) 420 405 CALL iom_open('K1rowdrg',inum) 421 406 CALL iom_get (inum, jpdom_data, 'field',zek1,1) ! 422 407 CALL iom_close(inum) 423 424 ! Total tidal energy ( M2, S2 and K1 with S2=(1/2)^2 * M2 ) 425 ! only the energy available for mixing is taken into account, 426 ! (mixing efficiency tidal dissipation efficiency) 408 ! ! Total tidal energy ( M2, S2 and K1 with S2=(1/2)^2 * M2 ) 409 ! ! only the energy available for mixing is taken into account, 410 ! ! (mixing efficiency tidal dissipation efficiency) 427 411 en_tmx(:,:) = - rn_tfe * rn_me * ( zem2(:,:) * 1.25 + zek1(:,:) ) * ssmask(:,:) 428 412 429 413 !============ 430 414 !TG: Bug for VVL? Should this section be moved out of _init and be updated at every timestep? 431 ! Vertical structure (az_tmx) 432 DO jj = 1, jpj ! part independent of the level 415 !!gm : you are right, but tidal mixing acts in deep ocean (H>500m) where e3 is O(100m) 416 !! the error is thus ~1% which I feel comfortable with, compared to uncertainties in tidal energy dissipation. 417 ! ! Vertical structure (az_tmx) 418 DO jj = 1, jpj ! part independent of the level 433 419 DO ji = 1, jpi 434 420 zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) ! depth of the ocean … … 437 423 END DO 438 424 END DO 439 DO jk= 1, jpk ! complete with the level-dependent part425 DO jk= 1, jpk ! complete with the level-dependent part 440 426 DO jj = 1, jpj 441 427 DO ji = 1, jpi … … 445 431 END DO 446 432 !=========== 447 433 ! 448 434 IF( nprint == 1 .AND. lwp ) THEN 449 435 ! Control print … … 454 440 zav_tide(:,:,jk) = az_tmx(:,:,jk) / MAX( rn_n2min, rn2(:,:,jk) ) 455 441 END DO 456 457 ztpc = 0. e0442 ! 443 ztpc = 0._wp 458 444 zpc(:,:,:) = MAX(rn_n2min,rn2(:,:,:)) * zav_tide(:,:,:) 459 445 DO jk= 2, jpkm1 460 446 DO jj = 1, jpj 461 447 DO ji = 1, jpi 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)448 ztpc = ztpc + e3w_n(ji,jj,jk) * e1e2t(ji,jj) * zpc(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj) 463 449 END DO 464 450 END DO 465 451 END DO 452 IF( lk_mpp ) CALL mpp_sum( ztpc ) 466 453 ztpc= rau0 * 1/(rn_tfe * rn_me) * ztpc 467 454 ! 468 455 WRITE(numout,*) 469 456 WRITE(numout,*) ' Total power consumption of the tidally driven part of Kz : ztpc = ', ztpc * 1.e-12 ,'TW' 470 471 457 ! 472 458 ! control print 2 473 459 zav_tide(:,:,:) = MIN( zav_tide(:,:,:), 60.e-4 ) 474 zkz(:,:) = 0. e0460 zkz(:,:) = 0._wp 475 461 DO jk = 2, jpkm1 476 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 462 zkz(:,:) = zkz(:,:) + e3w_n(:,:,jk) * MAX(0.e0, rn2(:,:,jk)) * rau0 * zav_tide(:,:,jk) * wmask(:,:,jk) 481 463 END DO 482 464 ! Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz … … 497 479 END DO 498 480 WRITE(numout,*) ' Min de zkz ', ztpc, ' Max = ', maxval(zkz(:,:) ) 499 481 ! 500 482 DO jk = 2, jpkm1 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 506 END DO 507 ztpc = 0.e0 483 zav_tide(:,:,jk) = zav_tide(:,:,jk) * MIN( zkz(:,:), 30./6. ) * wmask(:,:,jk) !kz max = 300 cm2/s 484 END DO 485 ztpc = 0._wp 508 486 zpc(:,:,:) = Max(0.e0,rn2(:,:,:)) * zav_tide(:,:,:) 509 487 DO jk= 1, jpk 510 488 DO jj = 1, jpj 511 489 DO ji = 1, jpi 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)490 ztpc = ztpc + e3w_n(ji,jj,jk) * e1e2t(ji,jj) * zpc(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj) 513 491 END DO 514 492 END DO 515 493 END DO 494 IF( lk_mpp ) CALL mpp_sum( ztpc ) 516 495 ztpc= rau0 * 1/(rn_tfe * rn_me) * ztpc 517 496 WRITE(numout,*) ' 2 Total power consumption of the tidally driven part of Kz : ztpc = ', ztpc * 1.e-12 ,'TW' 518 497 !!gm bug mpp in these diagnostics 519 498 DO jk = 1, jpk 520 ze_z = SUM( e1 t(:,:) * e2t(:,:) * zav_tide(:,:,jk)* tmask_i(:,:) ) &521 & / MAX( 1.e-20, SUM( e1 t(:,:) * e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) )522 ztpc = 1. E50499 ze_z = SUM( e1e2t(:,:) * zav_tide(:,:,jk) * tmask_i(:,:) ) & 500 & / MAX( 1.e-20, SUM( e1e2t(:,:) * wmask (:,:,jk) * tmask_i(:,:) ) ) 501 ztpc = 1.e50 523 502 DO jj = 1, jpj 524 503 DO ji = 1, jpi 525 IF( zav_tide(ji,jj,jk) /= 0.e0 ) ztpc = Min( ztpc, zav_tide(ji,jj,jk) )504 IF( zav_tide(ji,jj,jk) /= 0.e0 ) ztpc = MIN( ztpc, zav_tide(ji,jj,jk) ) 526 505 END DO 527 506 END DO … … 530 509 END DO 531 510 532 WRITE(numout,*) ' e_tide : ', SUM( e1 t*e2t*en_tmx ) / ( rn_tfe * rn_me ) * 1.e-12, 'TW'511 WRITE(numout,*) ' e_tide : ', SUM( e1e2t*en_tmx ) / ( rn_tfe * rn_me ) * 1.e-12, 'TW' 533 512 WRITE(numout,*) 534 513 WRITE(numout,*) ' Initial profile of tidal vertical mixing' … … 539 518 END DO 540 519 END DO 541 ze_z = SUM( e1 t(:,:) * e2t(:,:) * zkz(:,:)* tmask_i(:,:) ) &542 & / MAX( 1.e-20, SUM( e1 t(:,:) * e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) )520 ze_z = SUM( e1e2t(:,:) * zkz (:,:) * tmask_i(:,:) ) & 521 & / MAX( 1.e-20, SUM( e1e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) ) 543 522 WRITE(numout,*) ' jk= ', jk,' ', ze_z * 1.e4,' cm2/s' 544 523 END DO 545 524 DO jk = 1, jpk 546 525 zkz(:,:) = az_tmx(:,:,jk) /rn_n2min 547 ze_z = SUM( e1 t(:,:) * e2t(:,:) * zkz(:,:)* tmask_i(:,:) ) &548 & / MAX( 1.e-20, SUM( e1 t(:,:) * e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) )526 ze_z = SUM( e1e2t(:,:) * zkz (:,:) * tmask_i(:,:) ) & 527 & / MAX( 1.e-20, SUM( e1e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) ) 549 528 WRITE(numout,*) 550 529 WRITE(numout,*) ' N2 min - jk= ', jk,' ', ze_z * 1.e4,' cm2/s min= ',MINVAL(zkz)*1.e4, & 551 530 & 'max= ', MAXVAL(zkz)*1.e4, ' cm2/s' 552 531 END DO 532 !!gm end bug mpp 553 533 ! 554 534 ENDIF
Note: See TracChangeset
for help on using the changeset viewer.