Changeset 14834 for NEMO/trunk/src/OCE/TRA/traldf_triad.F90
- Timestamp:
- 2021-05-11T11:24:44+02:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/TRA/traldf_triad.F90
r14820 r14834 13 13 USE oce ! ocean dynamics and active tracers 14 14 USE dom_oce ! ocean space and time domain 15 ! TEMP: [tiling] This change not necessary if XIOS has subdomain support16 USE domtile17 15 USE domutl, ONLY : is_tile 18 16 USE phycst ! physical constants … … 109 107 REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) :: pt_rhs ! tracer trend 110 108 ! 111 INTEGER :: ji, jj, jk, jn, kp ! dummy loop indices109 INTEGER :: ji, jj, jk, jn, kp, iij ! dummy loop indices 112 110 REAL(wp) :: zcoef0, ze3w_2, zsign ! - - 113 111 ! … … 115 113 REAL(wp) :: ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt, zdyt_jp1, ze3wr_jp1, zdzt_jp1, zah_slp1, zah_slp_jp1, zaei_slp_jp1 116 114 REAL(wp) :: zah_slp, zaei_slp, zdxt_ip1, ze3wr_ip1, zdzt_ip1, zah_slp_ip1, zaei_slp_ip1, zaei_slp1 117 REAL(wp), DIMENSION(A2D(nn_hls),0:1) :: zdkt3d ! vertical tracer gradient at 2 levels 118 REAL(wp), DIMENSION(A2D(nn_hls) ) :: z2d ! 2D workspace 119 REAL(wp), DIMENSION(A2D(nn_hls) ,jpk) :: zdit, zdjt, zftu, zftv, ztfw ! 3D - 120 ! TEMP: [tiling] This can be A2D(nn_hls) if XIOS has subdomain support 121 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpsi_uw, zpsi_vw 115 REAL(wp), DIMENSION(A2D(nn_hls),0:1) :: zdkt3d ! vertical tracer gradient at 2 levels 116 REAL(wp), DIMENSION(A2D(nn_hls) ) :: z2d ! 2D workspace 117 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw ! 3D - 122 118 !!---------------------------------------------------------------------- 123 119 ! 124 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile120 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 125 121 IF( kpass == 1 .AND. kt == kit000 ) THEN 126 122 IF(lwp) WRITE(numout,*) … … 138 134 ENDIF 139 135 ! 136 ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 137 IF( nldf_tra == np_blp_it .AND. kpass == 1 ) THEN ; iij = nn_hls 138 ELSE ; iij = 1 139 ENDIF 140 141 ! 140 142 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign (eddy diffusivity >0) 141 143 ELSE ; zsign = -1._wp … … 148 150 IF( kpass == 1 ) THEN !== first pass only and whatever the tracer is ==! 149 151 ! 150 DO_3D ( 0, 0, 0, 0, 1, jpk )152 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 151 153 akz (ji,jj,jk) = 0._wp 152 154 ah_wslp2(ji,jj,jk) = 0._wp … … 154 156 ! 155 157 DO kp = 0, 1 ! i-k triads 156 DO_3D ( 0, 0, 0, 0, 1, jpkm1 )158 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 157 159 ze3wr = 1._wp / e3w(ji,jj,jk+kp,Kmm) 158 160 zbu = e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm) … … 177 179 ! 178 180 DO kp = 0, 1 ! j-k triads 179 DO_3D ( 0, 0, 0, 0, 1, jpkm1 )181 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 180 182 ze3wr = 1.0_wp / e3w(ji,jj,jk+kp,Kmm) 181 183 zbv = e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm) … … 203 205 ! 204 206 IF( ln_traldf_blp ) THEN ! bilaplacian operator 205 DO_3D ( 0, 0, 0, 0, 2, jpkm1 )207 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 206 208 akz(ji,jj,jk) = 16._wp & 207 209 & * ah_wslp2 (ji,jj,jk) & … … 211 213 END_3D 212 214 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator 213 DO_3D ( 0, 0, 0, 0, 2, jpkm1 )215 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 214 216 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 215 217 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) … … 219 221 ! 220 222 ELSE ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 221 DO_3D ( 0, 0, 0, 0, 1, jpk )223 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 222 224 akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 223 225 END_3D 224 226 ENDIF 225 227 ! 226 ! TEMP: [tiling] These changes not necessary if XIOS has subdomain support 227 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only for the full domain 228 IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 229 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) 230 231 zpsi_uw(:,:,:) = 0._wp 232 zpsi_vw(:,:,:) = 0._wp 233 234 DO kp = 0, 1 235 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 236 ! round brackets added to fix the order of floating point operations 237 ! needed to ensure halo 1 - halo 2 compatibility [ NOT TESTED ] 238 zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp) & 239 & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp) & 240 & + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp) & 241 & ) ! bracket for halo 1 - halo 2 compatibility 242 zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp) & 243 & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp) & 244 & + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp) & 245 & ) ! bracket for halo 1 - halo 2 compatibility 246 END_3D 247 END DO 248 CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 249 250 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = nijtile ) 251 ENDIF 228 IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 229 zpsi_uw(:,:,:) = 0._wp 230 zpsi_vw(:,:,:) = 0._wp 231 232 DO kp = 0, 1 233 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 234 ! round brackets added to fix the order of floating point operations 235 ! needed to ensure halo 1 - halo 2 compatibility 236 zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp) & 237 & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp) & 238 & + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp) & 239 & ) ! bracket for halo 1 - halo 2 compatibility 240 zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp) & 241 & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp) & 242 & + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp) & 243 & ) ! bracket for halo 1 - halo 2 compatibility 244 END_3D 245 END DO 246 CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 252 247 ENDIF 253 248 ! … … 262 257 zftu(:,:,:) = 0._wp 263 258 zftv(:,:,:) = 0._wp 264 ! 265 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) !== before lateral T & S gradients at T-level jk ==! 259 zdit(:,:,:) = 0._wp 260 zdjt(:,:,:) = 0._wp 261 ! 262 DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) !== before lateral T & S gradients at T-level jk ==! 266 263 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 267 264 zdjt(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 268 265 END_3D 269 266 IF( ln_zps .AND. l_grad_zps ) THEN ! partial steps: correction at top/bottom ocean level 270 DO_2D( 1, 0, 1, 0) ! bottom level267 DO_2D( iij, iij-1, iij, iij-1 ) ! bottom level 271 268 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 272 269 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 273 270 END_2D 274 271 IF( ln_isfcav ) THEN ! top level (ocean cavities only) 275 DO_2D( 1, 0, 1, 0)272 DO_2D( iij, iij-1, iij, iij-1 ) 276 273 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 277 274 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) … … 286 283 DO jk = 1, jpkm1 287 284 ! !== Vertical tracer gradient at level jk and jk+1 288 DO_2D( 1, 1, 1, 1)285 DO_2D( iij, iij, iij, iij ) 289 286 zdkt3d(ji,jj,1) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * tmask(ji,jj,jk+1) 290 287 END_2D … … 293 290 IF( jk == 1 ) THEN ; zdkt3d(:,:,0) = zdkt3d(:,:,1) 294 291 ELSE 295 DO_2D( 1, 1, 1, 1)292 DO_2D( iij, iij, iij, iij ) 296 293 zdkt3d(ji,jj,0) = ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 297 294 END_2D … … 305 302 IF( ln_botmix_triad ) THEN 306 303 DO kp = 0, 1 !== Horizontal & vertical fluxes 307 DO_2D( 1, 0, 1, 0)304 DO_2D( iij, iij-1, iij, iij-1 ) 308 305 ze1ur = r1_e1u(ji,jj) 309 306 zdxt = zdit(ji,jj,jk) * ze1ur … … 317 314 zbu_ip1 = 0.25_wp * e1e2u(ji+1,jj) * e3u(ji+1,jj,jk,Kmm) 318 315 ! ln_botmix_triad is .T. don't mask zah for bottom half cells !!gm ????? ahu is masked.... 319 zah = pahu(ji,jj,jk) 320 zah_ip1 = pahu(ji+1,jj,jk) 316 zah = pahu(ji,jj,jk) 317 zah_ip1 = pahu(ji+1,jj,jk) 321 318 zah_slp = zah * triadi(ji,jj,jk,1,kp) 322 319 zah_slp_ip1 = zah_ip1 * triadi(ji+1,jj,jk,1,kp) … … 333 330 & + ( zah * zdxt + zah_slp1 * zdzt_ip1 - zaei_slp1 * zdzt_ip1 ) * zbu * ze1ur & 334 331 & ) ! bracket for halo 1 - halo 2 compatibility 335 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 332 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 336 333 & - ( (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1 & 337 & + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1 & 338 & ) ! bracket for halo 1 - halo 2 compatibility 339 340 334 & + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1 & 335 & ) ! bracket for halo 1 - halo 2 compatibility 336 END_2D 337 END DO 341 338 ! 342 339 DO kp = 0, 1 343 DO_2D( 1, 0, 1, 0)340 DO_2D( iij, iij-1, iij, iij-1 ) 344 341 ze2vr = r1_e2v(ji,jj) 345 342 zdyt = zdjt(ji,jj,jk) * ze2vr … … 353 350 ! ln_botmix_triad is .T. don't mask zah for bottom half cells !!gm ????? ahu is masked.... 354 351 zah = pahv(ji,jj,jk) ! pahv(ji,jj+jp,jk) ???? 355 zah_jp1 = pahv(ji,jj+1,jk) 352 zah_jp1 = pahv(ji,jj+1,jk) 356 353 zah_slp = zah * triadj(ji,jj,jk,1,kp) 357 354 zah_slp1 = zah * triadj(ji,jj+1,jk,0,kp) 358 355 zah_slp_jp1 = zah_jp1 * triadj(ji,jj+1,jk,1,kp) 359 356 IF( ln_ldfeiv ) THEN 360 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 361 zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 357 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 358 zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 362 359 zaei_slp1 = aeiv(ji,jj,jk) * triadj_g(ji,jj+1,jk,0,kp) 363 360 ENDIF … … 377 374 ELSE 378 375 ! 379 DO kp = 0, 1 380 DO_2D( 1, 0, 1, 0)376 DO kp = 0, 1 !== Horizontal & vertical fluxes 377 DO_2D( iij, iij-1, iij, iij-1 ) 381 378 ze1ur = r1_e1u(ji,jj) 382 379 zdxt = zdit(ji,jj,jk) * ze1ur … … 391 388 ! ln_botmix_triad is .F. mask zah for bottom half cells 392 389 zah = pahu(ji,jj,jk) * umask(ji,jj,jk+kp) ! pahu(ji+ip,jj,jk) ===>> ???? 393 zah_ip1 = pahu(ji+1,jj,jk) * umask(ji+1,jj,jk+kp) 390 zah_ip1 = pahu(ji+1,jj,jk) * umask(ji+1,jj,jk+kp) 394 391 zah_slp = zah * triadi(ji,jj,jk,1,kp) 395 392 zah_slp_ip1 = zah_ip1 * triadi(ji+1,jj,jk,1,kp) 396 393 zah_slp1 = zah * triadi(ji+1,jj,jk,0,kp) 397 394 IF( ln_ldfeiv ) THEN 398 zaei_slp = aeiu(ji,jj,jk) * triadi_g(ji,jj,jk,1,kp) 395 zaei_slp = aeiu(ji,jj,jk) * triadi_g(ji,jj,jk,1,kp) 399 396 zaei_slp_ip1 = aeiu(ji+1,jj,jk) * triadi_g(ji+1,jj,jk,1,kp) 400 397 zaei_slp1 = aeiu(ji,jj,jk) * triadi_g(ji+1,jj,jk,0,kp) … … 406 403 & + ( zah * zdxt + zah_slp1 * zdzt_ip1 - zaei_slp1 * zdzt_ip1 ) * zbu * ze1ur & 407 404 & ) ! bracket for halo 1 - halo 2 compatibility 408 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 405 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 409 406 & - ( (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1 & 410 407 & + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1 & … … 414 411 ! 415 412 DO kp = 0, 1 416 DO_2D( 1, 0, 1, 0)413 DO_2D( iij, iij-1, iij, iij-1 ) 417 414 ze2vr = r1_e2v(ji,jj) 418 415 zdyt = zdjt(ji,jj,jk) * ze2vr … … 431 428 zah_slp_jp1 = zah_jp1 * triadj(ji,jj+1,jk,1,kp) 432 429 IF( ln_ldfeiv ) THEN 433 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 430 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 434 431 zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 435 432 zaei_slp1 = aeiv(ji,jj,jk) * triadj_g(ji,jj+1,jk,0,kp) … … 449 446 ENDIF 450 447 ! !== horizontal divergence and add to the general trend ==! 451 DO_2D( 0, 0, 0, 0)448 DO_2D( iij-1, iij-1, iij-1, iij-1 ) 452 449 ! round brackets added to fix the order of floating point operations 453 450 ! needed to ensure halo 1 - halo 2 compatibility … … 464 461 ! !== add the vertical 33 flux ==! 465 462 IF( ln_traldf_lap ) THEN ! laplacian case: eddy coef = ah_wslp2 - akz 466 DO_3D( 0, 0, 1, 0, 2, jpkm1 )463 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 467 464 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 468 465 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & … … 472 469 SELECT CASE( kpass ) 473 470 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 474 DO_3D( 0, 0, 1, 0, 2, jpkm1 )471 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 475 472 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 476 473 & * ah_wslp2(ji,jj,jk) * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 477 474 END_3D 478 475 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt2 gradients, resp. 479 DO_3D( 0, 0, 1, 0, 2, jpkm1 )476 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 480 477 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 481 478 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) ) & … … 485 482 ENDIF 486 483 ! 487 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==!484 DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==! 488 485 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 489 486 & + zsign * ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) &
Note: See TracChangeset
for help on using the changeset viewer.