Changeset 1175
- Timestamp:
- 2008-09-11T18:26:34+02:00 (16 years ago)
- Location:
- trunk/NEMO/TOP_SRC/TRP
- Files:
-
- 25 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/TOP_SRC/TRP/trcadv_cen2.F90
r1152 r1175 16 16 USE trcbbl ! advective passive tracers in the BBL 17 17 USE prtctl_trc 18 USE trdmld_trc 19 USE trdmld_trc_oce ! ocean variables trends 18 20 19 21 IMPLICIT NONE … … 71 73 !! * Add this trend now to the general trend of tracer tra: 72 74 !! tra = tra + ztra 73 !! * trend diagnostic ('key_tr c_diatrd'): the trend is saved75 !! * trend diagnostic ('key_trdmld_trc'): the trend is saved 74 76 !! for diagnostics. The trends saved is expressed as 75 77 !! Uh.gradh(T) … … 88 90 !! Add this trend now to the general trend of tracer tra : 89 91 !! tra = tra + ztra 90 !! Trend diagnostic ('key_tr c_diatrd'): the trend is saved for92 !! Trend diagnostic ('key_trdmld_trc'): the trend is saved for 91 93 !! diagnostics. The trends saved is expressed as : 92 94 !! save trend = w.gradz(T) = ztra - trn divn. 93 95 !! 94 96 !! ** Action : - update tra with the now advective tracer trends 95 !! - save the trends in trtrd ('key_tr c_diatrd')97 !! - save the trends in trtrd ('key_trdmld_trc') 96 98 !! 97 99 !! History : … … 132 134 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 133 135 zind ! temporary workspace arrays 134 #if defined key_trc_diatrd 136 135 137 REAL(wp) :: & 136 138 ztai, ztaj, & ! temporary scalars 137 139 zfui1, zfvj1 ! " " 138 #endif 140 141 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 139 142 #if defined key_lim3 || defined key_lim2 140 143 REAL(wp) :: & … … 155 158 zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 156 159 ENDIF 160 161 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 157 162 158 163 #if defined key_trcbbl_adv … … 249 254 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 250 255 251 #if defined key_trc_diatrd 256 #if defined key_trc_diatrd 252 257 ! recompute the trends in i- and j-direction as Uh gradh(T) 253 # if ! defined key_zco258 # if defined key_s_coord || defined key_partial_steps 254 259 zfui = 0.5 * e2u(ji ,jj) * fse3u(ji, jj,jk) * zun(ji, jj,jk) 255 260 zfui1= 0.5 * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk) … … 270 275 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = ztaj 271 276 #endif 277 272 278 END DO 273 279 END DO … … 275 281 END DO ! End of slab 276 282 ! ! =============== 277 ENDDO 283 284 ! 3. Save the horizontal advective trends for diagnostics 285 ! ------------------------------------------------------- 286 !CDIR BEGIN COLLAPSE 287 TRDTRC_XY : IF( l_trdtrc )THEN 288 289 ! 3.1) Passive tracer ZONAL advection trends 290 ztrtrd(:,:,:) = 0.e0 291 292 DO jk = 1, jpkm1 293 DO jj = 2, jpjm1 294 DO ji = fs_2, fs_jpim1 295 ! recompute the trends in i-direction as Uh gradh(T) 296 # if ! defined key_zco 297 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 298 zfui = 0.5 * e2u(ji ,jj) * fse3u(ji, jj,jk) * zun(ji, jj,jk) 299 zfui1= 0.5 * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk) 300 # else 301 zbtr = zbtr2(ji,jj) 302 zfui = 0.5 * e2u(ji ,jj) * zun(ji, jj,jk) 303 zfui1= 0.5 * e2u(ji-1,jj) * zun(ji-1,jj,jk) 304 # endif 305 ztai = - zbtr * ( zfui * ( trn(ji+1,jj ,jk,jn) - trn(ji, jj,jk,jn) ) & 306 & + zfui1 * ( trn(ji, jj, jk,jn) - trn(ji-1,jj,jk,jn) ) ) 307 308 ! save i- and j- advective trends computed as Uh gradh(T) 309 ztrtrd(ji,jj,jk) = ztai 310 END DO 311 END DO 312 END DO 313 314 IF( luttrd(jn) ) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_xad, kt) ! handle the trend 315 316 ! 3.2) Passive tracer MERIDIONAL advection trends 317 ztrtrd(:,:,:) = 0.e0 318 319 DO jk = 1, jpkm1 320 DO jj = 2, jpjm1 321 DO ji = fs_2, fs_jpim1 322 ! recompute the trends in j-direction as Uh gradh(T) 323 # if ! defined key_zco 324 zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk) 325 zfvj = 0.5 * e1v(ji,jj ) * fse3v(ji,jj ,jk) * zvn(ji,jj ,jk) 326 zfvj1= 0.5 * e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk) 327 # else 328 zbtr = zbtr2(ji,jj) 329 zfvj = 0.5 * e1v(ji,jj ) * zvn(ji,jj ,jk) 330 zfvj1= 0.5 * e1v(ji,jj-1) * zvn(ji,jj-1,jk) 331 # endif 332 ztaj = - zbtr * ( zfvj * ( trn(ji ,jj+1,jk,jn) - trn(ji,jj ,jk,jn) ) & 333 & + zfvj1 * ( trn(ji ,jj ,jk,jn) - trn(ji,jj-1,jk,jn) ) ) 334 335 ! save i- and j- advective trends computed as Uh gradh(T) 336 ztrtrd(ji,jj,jk) = ztaj 337 END DO 338 END DO 339 END DO 340 341 IF( luttrd(jn) ) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_yad, kt) ! handle the trend 342 343 ENDIF TRDTRC_XY 344 !CDIR END 345 ! ! =========== 346 END DO ! tracer loop 347 ! ! =========== 278 348 279 349 IF(ln_ctl) THEN ! print mean trends (used for debugging) … … 333 403 ! add it to the general tracer trends 334 404 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 335 #if defined key_trc_diatrd 405 #if defined key_trc_diatrd 336 406 ! save the vertical advective trends computed as w gradz(T) 337 407 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = ztra - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 338 408 #endif 409 339 410 END DO 340 411 END DO 341 412 END DO 342 413 343 END DO 414 ! 3. Save the vertical advective trends for diagnostic 415 ! ---------------------------------------------------- 416 417 !CDIR BEGIN COLLAPSE 418 TRDTRC_Z : IF( l_trdtrc )THEN 419 ztrtrd(:,:,:) = 0.e0 420 421 ! Compute T/S vertical advection trends 422 DO jk = 1, jpkm1 423 DO jj = 2, jpjm1 424 DO ji = fs_2, fs_jpim1 425 ze3tr = 1. / fse3t(ji,jj,jk) 426 ! vertical advective trends 427 ztra = - ze3tr * ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) 428 ! save the vertical advective trends computed as w gradz(T) 429 ztrtrd(ji,jj,jk) = ztra - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 430 END DO 431 END DO 432 END DO 433 434 IF( luttrd(jn) ) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_zad, kt) ! handle the trend 435 436 ENDIF TRDTRC_Z 437 !CDIR END 438 ! ! =========== 439 END DO ! tracer loop 440 ! ! =========== 441 442 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 344 443 345 444 IF(ln_ctl) THEN ! print mean trends (used for debugging) -
trunk/NEMO/TOP_SRC/TRP/trcadv_muscl.F90
r1152 r1175 18 18 USE lib_mpp 19 19 USE prtctl_trc ! Print control for debbuging 20 USE trdmld_trc 21 USE trdmld_trc_oce ! ocean variables trends 20 22 21 23 IMPLICIT NONE … … 29 31 !!---------------------------------------------------------------------- 30 32 !! TOP 1.0 , LOCEAN-IPSL (2005) 31 !! $ Id$33 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcadv_muscl.F90,v 1.13 2007/10/12 09:26:30 opalod Exp $ 32 34 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 33 35 !!---------------------------------------------------------------------- … … 46 48 !! 47 49 !! ** Action : - update tra with the now advective tracer trends 48 !! - save trends in trtrd ('key_trc_diatrd')50 !! - save trends ('key_trdmld_trc') 49 51 !! 50 52 !! References : … … 78 80 REAL(wp) :: z0u, z0v, z0w 79 81 REAL(wp) :: zzt1, zzt2, zalpha, z2dtt 80 #if defined key_trc_diatrd 81 REAL(wp) :: ztai, ztaj 82 REAL(wp) :: zfui, zfvj 83 #endif 82 REAL(wp) :: ztai, ztaj, zfui, zfvj 83 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 84 84 CHARACTER (len=22) :: charout 85 85 !!---------------------------------------------------------------------- … … 92 92 ENDIF 93 93 94 94 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 95 95 96 96 #if defined key_trcbbl_adv … … 105 105 106 106 DO jn = 1, jptra 107 #if defined key_trc_diatrd 108 DO jk = 1,jpk 109 DO jj = 1,jpj 110 DO ji = 1,jpi 111 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = 0. 112 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = 0. 113 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = 0. 114 END DO 115 END DO 116 END DO 117 #endif 107 118 108 ! I. Horizontal advective fluxes 119 109 ! ------------------------------ … … 224 214 #if defined key_trc_diatrd 225 215 ! recompute the trends in i- and j-direction as Uh gradh(T) 226 # if ! defined key_zco216 # if defined key_s_coord || defined key_partial_steps 227 217 zfui = e2u(ji ,jj) * fse3u(ji, jj,jk) * un(ji, jj,jk) & 228 218 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * un(ji-1,jj,jk) … … 241 231 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = ztaj 242 232 #endif 243 END DO 244 END DO 245 END DO 233 234 END DO 235 END DO 236 END DO 237 238 ! 3. Save the horizontal advective trends for diagnostics 239 ! ------------------------------------------------------- 240 !CDIR BEGIN COLLAPSE 241 TRDTRC_XY : IF( l_trdtrc ) THEN 242 243 ! 3.1) Passive tracer ZONAL advection trends 244 DO jk = 1, jpkm1 245 DO jj = 2, jpjm1 246 DO ji = fs_2, fs_jpim1 ! vector opt. 247 #if ! defined key_zco 248 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 249 zfui = e2u(ji ,jj) * fse3u(ji, jj,jk) * zun(ji, jj,jk) & 250 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk) 251 #else 252 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 253 zfui = e2u(ji ,jj) * zun(ji, jj,jk) - e2u(ji-1,jj) * zun(ji-1,jj,jk) 254 #endif 255 ! recompute the trends in i- direction as Uh gradh(T) 256 ztrtrd(ji,jj,jk) = - zbtr*( zt1(ji,jj,jk) - zt1(ji-1,jj,jk) - trn(ji,jj,jk,jn)*zfui ) 257 END DO 258 END DO 259 END DO 260 261 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_xad, kt ) 262 263 ! 3.2) Passive tracer MERIDIONAL advection trends 264 DO jk = 1, jpkm1 265 DO jj = 2, jpjm1 266 DO ji = fs_2, fs_jpim1 ! vector opt. 267 ! recompute the trends in i- and j-direction as Uh gradh(T) 268 #if ! defined key_zco 269 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 270 zfvj = e1v(ji,jj ) * fse3v(ji,jj ,jk) * zvn(ji,jj ,jk) & 271 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk) 272 #else 273 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 274 zfvj = e1v(ji,jj ) * zvn(ji,jj ,jk) - e1v(ji,jj-1) * zvn(ji,jj-1,jk) 275 #endif 276 ztrtrd(ji,jj,jk) = - zbtr*( zt2(ji,jj,jk) - zt2(ji,jj-1,jk) - trn(ji,jj,jk,jn)*zfvj ) 277 END DO 278 END DO 279 END DO 280 281 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_yad, kt ) 282 283 ENDIF TRDTRC_XY 284 !CDIR END 285 246 286 ENDDO 247 287 … … 328 368 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = ztra - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 329 369 #endif 330 END DO 331 END DO 332 END DO 333 370 371 END DO 372 END DO 373 END DO 374 375 ! 3. Save the vertical advective trends for diagnostic 376 ! ---------------------------------------------------- 377 !CDIR BEGIN COLLAPSE 378 TRDTRC_Z : IF( l_trdtrc )THEN 379 380 ! Compute T/S vertical advection trends 381 DO jk = 1, jpkm1 382 DO jj = 2, jpjm1 383 DO ji = fs_2, fs_jpim1 ! vector opt. 384 zbtr = 1. / fse3t(ji,jj,jk) 385 ! horizontal advective trends 386 ztra = - zbtr * ( zt1(ji,jj,jk) - zt1(ji,jj,jk+1) ) 387 ! save the vertical advective trends computed as w gradz(T) 388 ztrtrd(ji,jj,jk) = ztra - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 389 END DO 390 END DO 391 END DO 392 393 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_zad, kt) 394 395 END IF TRDTRC_Z 396 !CDIR END 334 397 END DO 335 398 -
trunk/NEMO/TOP_SRC/TRP/trcadv_muscl2.F90
r1152 r1175 17 17 USE trcbbl ! advective passive tracers in the BBL 18 18 USE prtctl_trc ! Print control for debbuging 19 USE trdmld_trc 20 USE trdmld_trc_oce ! ocean variables trends 19 21 20 22 IMPLICIT NONE … … 50 52 !! 51 53 !! ** Action : - update tra with the now advective tracer trends 52 !! - save trends in trtrd ('key_trc_diatrd')54 !! - save trends ('key_trdmld_trc') 53 55 !! 54 56 !! References : … … 81 83 REAL(wp) :: zzt1, zzt2, zalpha 82 84 83 #if defined key_trc_diatrd84 85 REAL(wp) :: ztai, ztaj 85 86 REAL(wp) :: zfui, zfvj 86 #endif 87 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 87 88 CHARACTER (len=22) :: charout 88 89 !!---------------------------------------------------------------------- … … 95 96 ENDIF 96 97 98 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 99 97 100 #if defined key_trcbbl_adv 98 101 ! Advective bottom boundary layer … … 262 265 #if defined key_trc_diatrd 263 266 ! recompute the trends in i- and j-direction as Uh gradh(T) 264 # if ! defined key_zco267 # if defined key_s_coord || defined key_partial_steps 265 268 zfui = e2u(ji ,jj) * fse3u(ji, jj,jk) * un(ji, jj,jk) & 266 269 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * un(ji-1,jj,jk) … … 280 283 281 284 #endif 282 END DO 283 END DO 284 END DO 285 ENDDO 285 286 END DO 287 END DO 288 END DO 289 290 ! 3. Save the horizontal advective trends for diagnostics 291 ! ------------------------------------------------------- 292 293 TRDTRC_XY : IF( l_trdtrc ) THEN 294 295 !CDIRR COLLAPSE 296 ! 3.1) Passive tracer ZONAL advection trends 297 DO jk = 1, jpkm1 298 DO jj = 2, jpjm1 299 DO ji = fs_2, fs_jpim1 ! vector opt. 300 #if ! defined key_zco 301 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 302 zfui = e2u(ji ,jj) * fse3u(ji, jj,jk) * un(ji, jj,jk) & 303 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * un(ji-1,jj,jk) 304 #else 305 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 306 zfui = e2u(ji ,jj) * un(ji, jj,jk) & 307 & - e2u(ji-1,jj) * un(ji-1,jj,jk) 308 #endif 309 ! recompute the trends in i- direction as Uh gradh(T) 310 ztrtrd(ji,jj,jk) = - zbtr*( zt1(ji,jj,jk) - zt1(ji-1,jj,jk) - trn(ji,jj,jk,jn)*zfui ) 311 END DO 312 END DO 313 END DO 314 315 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_xad, kt ) 316 317 ! 3.2) Passive tracer MERIDIONAL advection trends 318 DO jk = 1, jpkm1 319 DO jj = 2, jpjm1 320 DO ji = fs_2, fs_jpim1 ! vector opt. 321 ! recompute the trends in i- and j-direction as Uh gradh(T) 322 #if ! defined key_zco 323 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 324 zfvj = e1v(ji,jj ) * fse3v(ji,jj ,jk) * vn(ji,jj ,jk) & 325 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * vn(ji,jj-1,jk) 326 #else 327 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) ) 328 zfvj = e1v(ji,jj ) * vn(ji,jj ,jk) & 329 & - e1v(ji,jj-1) * vn(ji,jj-1,jk) 330 #endif 331 ztrtrd(ji,jj,jk) = - zbtr*( zt2(ji,jj,jk) - zt2(ji,jj-1,jk) - trn(ji,jj,jk,jn)*zfvj ) 332 END DO 333 END DO 334 END DO 335 336 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_yad, kt ) 337 338 ENDIF TRDTRC_XY 339 340 ! !============= 341 END DO ! tracer loop 342 ! !============= 286 343 287 344 IF(ln_ctl) THEN ! print mean trends (used for debugging) … … 382 439 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = ztra - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 383 440 #endif 384 END DO 385 END DO 386 END DO 387 388 END DO 441 442 END DO 443 END DO 444 END DO 445 446 447 ! 3. Save the vertical advective trends for diagnostic 448 ! ---------------------------------------------------- 449 450 TRDTRC_Z : IF( l_trdtrc )THEN 451 452 ! Compute T/S vertical advection trends 453 DO jk = 1, jpkm1 454 DO jj = 2, jpjm1 455 DO ji = fs_2, fs_jpim1 ! vector opt. 456 zbtr = 1. / fse3t(ji,jj,jk) 457 ! horizontal advective trends 458 ztra = - zbtr * ( zt1(ji,jj,jk) - zt1(ji,jj,jk+1) ) 459 ! save the vertical advective trends computed as w gradz(T) 460 ztrtrd(ji,jj,jk) = ztra - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 461 END DO 462 END DO 463 END DO 464 465 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_zad, kt) 466 467 END IF TRDTRC_Z 468 469 ! !============= 470 END DO ! tracer loop 471 ! !============= 472 389 473 390 474 IF(ln_ctl) THEN ! print mean trends (used for debugging) … … 394 478 ENDIF 395 479 480 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 481 396 482 END SUBROUTINE trc_adv_muscl2 397 483 -
trunk/NEMO/TOP_SRC/TRP/trcadv_smolar.F90
r1152 r1175 1 1 MODULE trcadv_smolar 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcadv_smolar *** 4 4 !! Ocean passive tracers: horizontal & vertical advective trend 5 !!============================================================================== 5 !!====================================================================== 6 !! History : ! 87-06 (pa-dl) Original 7 !! ! 91-11 (G. Madec) 8 !! ! 94-08 (A. Czaja) 9 !! ! 95-09 (M. Levy) passive tracers 10 !! ! 98-03 (M.A. Foujols) lateral boundary conditions 11 !! ! 99-02 (M.A. Foujols) lbc in conjonction with ORCA 12 !! ! 00-05 (MA Foujols) add lbc for tracer trends 13 !! ! 00-10 (MA Foujols and E.Kestenare) INCLUDE instead of routine 14 !! ! 01-05 (E.Kestenare) fix bug in trtrd indexes 15 !! ! 02-05 (M-A Filiberti, and M.Levy) correction in trtrd computation 16 !! 9.0 ! 03-04 (C. Ethe) F90: Free form and module 17 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 18 !!---------------------------------------------------------------------- 6 19 #if defined key_top 7 !!----------------------------------------------------------------------8 !! 'key_top' TOP models9 20 !!---------------------------------------------------------------------- 10 21 !! trc_adv_smolar : update the passive tracer trend with the horizontal … … 13 24 !!---------------------------------------------------------------------- 14 25 USE oce_trc ! ocean dynamics and active tracers variables 15 USE tr p_trc ! ocean passive tracers variables26 USE trc ! ocean passive tracers variables 16 27 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 17 28 USE trcbbl ! advective passive tracers in the BBL 18 USE trctrp_lec ! passive tracers transport19 29 USE prtctl_trc ! Print control for debbuging 30 USE trctrp_lec 31 USE trdmld_trc 32 USE trdmld_trc_oce 20 33 21 34 IMPLICIT NONE 22 35 PRIVATE 23 36 24 PUBLIC trc_adv_smolar 25 26 REAL(wp), DIMENSION(jpk) :: rdttrc 37 PUBLIC trc_adv_smolar ! routine called by trcstp.F90 38 39 REAL(wp), DIMENSION(jpk) :: rdttrc ! vertical profile of tracer time-step 27 40 28 41 !! * Substitutions … … 30 43 !!---------------------------------------------------------------------- 31 44 !! TOP 1.0 , LOCEAN-IPSL (2005) 32 !! $ Id$33 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt45 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcadv_smolar.F90,v 1.11 2006/04/10 15:38:54 opalod Exp $ 46 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 34 47 !!---------------------------------------------------------------------- 35 48 CONTAINS … … 40 53 !! 41 54 !! ** Purpose : Compute the now trend due to total advection of passi- 42 !! ve tracer using a Smolarkiewicz FCT (Flux Corrected Transport )43 !! scheme and add it to the general tracer trend.55 !! ve tracer using a Smolarkiewicz FCT (Flux Corrected 56 !! Transport) scheme and add it to the general tracer trend. 44 57 !! 45 !! ** Method :Computation of not exactly the advection but the46 !! transport term, i.e. div(u*tra).47 !! Computes the now horizontal and vertical advection with48 !! the complete 3d method.58 !! ** Method : Computation of not exactly the advection but the 59 !! transport term, i.e. div(u*tra). 60 !! Computes the now horizontal and vertical advection with 61 !! the complete 3d method. 49 62 !! 50 !! note: - sc is an empirical factor to be used with care51 !! - this advection scheme needs an euler-forward time scheme63 !! Note : - sc is an empirical factor to be used with care 64 !! - this advection scheme needs an euler-forward time scheme 52 65 !! 53 66 !! ** Action : - update tra with the now advective tracer trends 54 !! - save trends in trtrd ('key_trc_diatrd')67 !! - save trends ('key_trdmld_trc') 55 68 !! 56 !! References : 57 !! Piotr K. Smolarkiewicz, 1983, 58 !! "A simple positive definit advection 59 !! scheme with small IMPLICIT diffusion" 60 !! Monthly Weather Review, pp 479-486 61 !! 62 !! History : 63 !! ! 87-06 (pa-dl) Original 64 !! ! 91-11 (G. Madec) 65 !! ! 94-08 (A. Czaja) 66 !! ! 95-09 (M. Levy) passive tracers 67 !! ! 98-03 (M.A. Foujols) lateral boundary conditions 68 !! ! 99-02 (M.A. Foujols) lbc in conjonction with ORCA 69 !! ! 00-05 (MA Foujols) add lbc for tracer trends 70 !! ! 00-10 (MA Foujols and E.Kestenare) INCLUDE instead of routine 71 !! ! 01-05 (E.Kestenare) fix bug in trtrd indexes 72 !! ! 02-05 (M-A Filiberti, and M.Levy) correction in trtrd computation 73 !! 9.0 ! 03-04 (C. Ethe) F90: Free form and module 69 !! References : Smolarkiewicz, 1983, Mon. Wea. Rev. p. 479-486 74 70 !!---------------------------------------------------------------------- 75 !! * modules used76 71 #if defined key_trcbbl_adv 77 72 USE oce_trc , zun => ua, & ! use ua as workspace … … 80 75 #else 81 76 USE oce_trc , zun => un, & ! When no bbl, zun == un 82 zvn => vn, & ! zvn == vn 83 zwn => wn ! zwn == wn 84 #endif 85 !! * Arguments 86 INTEGER, INTENT( in ) :: kt ! ocean time-step 87 88 !! * Local declarations 89 INTEGER :: ji, jj, jk,jt, jn ! dummy loop indices 90 91 REAL(wp), DIMENSION (jpi,jpj,jpk) :: & 92 zti, ztj, & 93 zaa, zbb, zcc, & 94 zx , zy , zz , & 95 zkx, zky, zkz, & 96 zbuf 97 98 #if defined key_trc_diatrd 77 & zvn => vn, & ! zvn == vn 78 & zwn => wn ! zwn == wn 79 #endif 80 INTEGER, INTENT( in ) :: kt ! ocean time-step 81 INTEGER :: ji, jj, jk,jt, jn ! dummy loop indices 82 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zti, ztj 83 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zaa, zbb, zcc 84 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zx , zy , zz 85 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zkx, zky, zkz 86 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zbuf 99 87 REAL(wp) :: zgm, zgz 100 #endif101 102 88 REAL(wp) :: zbtr, ztra 103 89 REAL(wp) :: zfp_ui, zfp_vj, zfm_ui, zfm_vj, zfp_w, zfm_w 104 90 CHARACTER (len=22) :: charout 91 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: ztrtrd 105 92 !!---------------------------------------------------------------------- 106 107 93 108 94 IF( kt == nittrc000 .AND. lwp ) THEN … … 112 98 rdttrc(:) = rdttra(:) * FLOAT(ndttrc) 113 99 ENDIF 114 115 100 101 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk,3) ) 102 116 103 #if defined key_trcbbl_adv 117 104 ! Advective bottom boundary layer … … 119 106 zun(:,:,:) = un (:,:,:) - u_trc_bbl(:,:,:) 120 107 zvn(:,:,:) = vn (:,:,:) - v_trc_bbl(:,:,:) 121 zwn(:,:,:) = wn (:,:,:) + w_trc_bbl( :,:,:) 122 #endif 123 124 ! tracer loop parallelized (macrotasking) 125 ! ======================================= 126 127 DO jn = 1, jptra 128 108 zwn(:,:,:) = wn (:,:,:) + w_trc_bbl(:,:,:) 109 #endif 110 111 ! ! =========== 112 DO jn = 1, jptra ! tracer loop 113 ! ! =========== 129 114 ! 1. tracer flux in the 3 directions 130 115 ! ---------------------------------- 131 116 132 ! 1.1 mass flux at u v and t-points and initialization 133 134 DO jk = 1,jpk 135 136 DO jj = 1,jpj 137 DO ji = 1,jpi 138 zaa(ji,jj,jk) = e2u(ji,jj)*fse3u(ji,jj,jk) * zun(ji,jj,jk) 139 zbb(ji,jj,jk) = e1v(ji,jj)*fse3v(ji,jj,jk) * zvn(ji,jj,jk) 140 zcc(ji,jj,jk) = e1t(ji,jj)*e2t(ji,jj) * zwn(ji,jj,jk) 141 zbuf(ji,jj,jk) = 0. 142 ztj(ji,jj,jk) = 0. 143 zx(ji,jj,jk) = 0. 144 zy(ji,jj,jk) = 0. 145 zz(ji,jj,jk) = 0. 146 zti(ji,jj,jk) = trn(ji,jj,jk,jn) 117 !--1.1 Horizontal advection 118 !CDIRR COLLAPSE 119 IF( l_trdtrc ) ztrtrd(:,:,:,:) = 0.e0 ! trends 120 121 DO jk = 1, jpk ! Horizontal slab 122 123 ! ... Initialisations 124 zbuf(:,:,jk) = 0.e0 ; ztj(:,:,jk) = 0.e0 125 zx (:,:,jk) = 0.e0 ; zy (:,:,jk) = 0.e0 126 zz (:,:,jk) = 0.e0 127 128 !CDIRR COLLAPSE 129 IF( l_trdtrc ) ztrtrd(:,:,:,:) = 0.e0 ! trends 130 131 ! ... Horizontal mass flux at u v and t-points 132 zaa(:,:,jk) = e2u(:,:) * fse3u(:,:,jk) * zun(:,:,jk) 133 zbb(:,:,jk) = e1v(:,:) * fse3v(:,:,jk) * zvn(:,:,jk) 134 zcc(:,:,jk) = e1t(:,:) * e2t(:,:) * zwn(:,:,jk) 135 zti(:,:,jk) = trn(:,:,jk,jn) 136 147 137 #if defined key_trc_diatrd 148 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = 0. 149 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = 0. 150 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = 0. 151 #endif 152 END DO 153 END DO 154 155 ! 1.2 calcul of intermediate field with an upstream advection scheme 156 ! and mass fluxes calculated above 157 158 ! calcul of tracer flux in the i and j direction 159 160 DO jj=1,jpj 161 zkx( 1,jj,jk)=0. 162 zkx(jpi,jj,jk)=0. 163 END DO 164 165 DO ji=1,jpi 166 zky(ji, 1,jk)=0. 167 zky(ji,jpj,jk)=0. 168 END DO 169 170 DO jj = 2,jpjm1 171 DO ji = 2,jpim1 172 zfp_ui = 0.5 * ( zaa(ji,jj,jk) + ABS( zaa(ji,jj,jk) ) ) 173 zfp_vj = 0.5 * ( zbb(ji,jj,jk) + ABS( zbb(ji,jj,jk) ) ) 174 zfm_ui = 0.5 * ( zaa(ji,jj,jk) - ABS( zaa(ji,jj,jk) ) ) 175 zfm_vj = 0.5 * ( zbb(ji,jj,jk) - ABS( zbb(ji,jj,jk) ) ) 176 zkx(ji,jj,jk) = zfp_ui * zti(ji,jj,jk) + zfm_ui * zti(ji+1,jj ,jk) 177 zky(ji,jj,jk) = zfp_vj * zti(ji,jj,jk) + zfm_vj * zti(ji ,jj+1,jk) 178 END DO 179 END DO 180 181 END DO 182 183 ! II. Vertical advection 184 ! ---------------------- 185 186 ! Surface value 187 IF( lk_dynspg_rl ) THEN ! rigid lid : flux set to zero 138 IF (luttrd(jn)) trtrd(:,:,jk,ikeep(jn),1) = 0. 139 IF (luttrd(jn)) trtrd(:,:,jk,ikeep(jn),2) = 0. 140 IF (luttrd(jn)) trtrd(:,:,jk,ikeep(jn),3) = 0. 141 #endif 142 143 ! ... Horizontal tracer flux in the i and j direction 144 zkx( 1, :,jk) = 0.e0 ; zky( :, 1,jk) = 0.e0 145 zkx(jpi, :,jk) = 0.e0 ; zky( :,jpj,jk) = 0.e0 146 147 DO jj = 2, jpjm1 148 DO ji = fs_2, fs_jpim1 ! Vector opt. 149 150 ! Upstream advection scheme using mass fluxes calculated above 151 zfp_ui = 0.5 * ( zaa(ji,jj,jk) + ABS( zaa(ji,jj,jk) ) ) 152 zfp_vj = 0.5 * ( zbb(ji,jj,jk) + ABS( zbb(ji,jj,jk) ) ) 153 zfm_ui = 0.5 * ( zaa(ji,jj,jk) - ABS( zaa(ji,jj,jk) ) ) 154 zfm_vj = 0.5 * ( zbb(ji,jj,jk) - ABS( zbb(ji,jj,jk) ) ) 155 156 ! Tracer fluxes 157 zkx(ji,jj,jk) = zfp_ui * zti(ji,jj,jk) + zfm_ui * zti(ji+1,jj ,jk) 158 zky(ji,jj,jk) = zfp_vj * zti(ji,jj,jk) + zfm_vj * zti(ji ,jj+1,jk) 159 END DO 160 END DO 161 162 END DO ! Horizontal slab 163 164 ! ... Lateral boundary conditions on zk[xy] 165 CALL lbc_lnk( zkx, 'U', -1. ) 166 CALL lbc_lnk( zky, 'V', -1. ) 167 168 !--1.2 Vertical advection 169 IF( lk_dynspg_rl ) THEN ! surface value for rigid lid : flux set to zero 188 170 zkz(:,:, 1 ) = 0.e0 189 ELSE ! free surface171 ELSE ! surface value for free surface 190 172 zkz(:,:, 1 ) = zwn(:,:,1) * trn(:,:,1,jn) * tmask(ji,jj,1) 191 173 ENDIF 192 193 DO jk = 2,jpk 194 DO jj = 1,jpj 195 DO ji = 1,jpi 196 zfp_w = 0.5 * ( zcc(ji,jj,jk) + ABS( zcc(ji,jj,jk) ) ) 197 zfm_w = 0.5 * ( zcc(ji,jj,jk) - ABS( zcc(ji,jj,jk) ) ) 198 zkz(ji,jj,jk) = zfp_w * zti(ji,jj,jk) + zfm_w * zti(ji,jj,jk-1) 199 END DO 200 END DO 201 END DO 202 203 ! ... Lateral boundary conditions on zk[xy] 204 CALL lbc_lnk( zkx, 'U', -1. ) 205 CALL lbc_lnk( zky, 'V', -1. ) 206 207 208 ! 2. calcul of after field using an upstream advection scheme 209 ! ----------------------------------------------------------- 210 211 DO jk = 1,jpkm1 212 DO jj = 2,jpjm1 213 DO ji = 2,jpim1 214 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk)) 215 ztj(ji,jj,jk) = -zbtr* & 216 & ( zkx(ji,jj,jk) - zkx(ji - 1,jj,jk) & 217 & + zky(ji,jj,jk) - zky(ji,jj - 1,jk) & 218 & + zkz(ji,jj,jk) - zkz(ji,jj,jk + 1) ) 174 175 DO jk = 2, jpk ! Vector opt. ??? 176 DO jj = 1, jpj 177 DO ji = 1, jpi 178 zfp_w = 0.5 * ( zcc(ji,jj,jk) + ABS( zcc(ji,jj,jk) ) ) 179 zfm_w = 0.5 * ( zcc(ji,jj,jk) - ABS( zcc(ji,jj,jk) ) ) 180 zkz(ji,jj,jk) = zfp_w * zti(ji,jj,jk) + zfm_w * zti(ji,jj,jk-1) 181 END DO 182 END DO 183 END DO 184 185 ! 2. Compute after field using an upstream advection scheme 186 ! --------------------------------------------------------- 187 188 DO jk = 1, jpkm1 189 DO jj = 2, jpjm1 190 DO ji = fs_2, fs_jpim1 ! Vector opt. 191 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk)) 192 ztj(ji,jj,jk) = - zbtr * & 193 & ( zkx(ji,jj,jk) - zkx(ji-1,jj ,jk ) & 194 & + zky(ji,jj,jk) - zky(ji ,jj-1,jk ) & 195 & + zkz(ji,jj,jk) - zkz(ji ,jj ,jk+1) ) 219 196 #if defined key_trc_diatrd 220 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) - & 221 & zbtr*( zkx(ji,jj,jk) - zkx(ji - 1,jj,jk) ) 222 223 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) - & 224 & zbtr*( zky(ji,jj,jk) - zky(ji,jj - 1,jk) ) 225 226 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) - & 227 & zbtr*( zkz(ji,jj,jk) - zkz(ji,jj,jk + 1) ) 228 #endif 229 END DO 230 END DO 231 END DO 232 233 ! 2.1 start of antidiffusive correction loop 234 235 DO jt = 1,ncortrc 236 237 ! 2.2 calcul of intermediary field zti 238 239 DO jk = 1,jpkm1 240 DO jj = 2,jpjm1 241 DO ji = 2,jpim1 242 zti(ji,jj,jk) = zti(ji,jj,jk)+rdttrc(jk)*ztj(ji,jj,jk) 243 zbuf(ji,jj,jk) = zbuf(ji,jj,jk) + ztj(ji,jj,jk) 244 END DO 245 END DO 246 END DO 247 248 ! ... Lateral boundary conditions on zti 249 CALL lbc_lnk( zti, 'T', 1. ) 250 251 252 ! 2.3 calcul of the antidiffusive flux 253 254 DO jk = 1,jpkm1 255 DO jj = 2,jpjm1 256 DO ji = 2,jpim1 257 zx(ji,jj,jk) = ( abs(zaa(ji,jj,jk)) - rdttrc(jk) & 258 & *zaa(ji,jj,jk)**2/ & 259 & (e1u(ji,jj)*e2u(ji,jj)*fse3u(ji,jj,jk) ) ) & 260 & *(zti(ji + 1,jj,jk) - zti( ji ,jj,jk)) & 261 & /(zti( ji ,jj,jk) + zti(ji + 1,jj,jk) + rtrn) & 262 & * rsc 263 264 zy(ji,jj,jk) = ( abs(zbb(ji,jj,jk)) - rdttrc(jk) & 265 & *zbb(ji,jj,jk)**2/ & 266 & (e1v(ji,jj)*e2v(ji,jj)*fse3v(ji,jj,jk) ) ) & 267 & *(zti(ji,jj + 1,jk) - zti(ji, jj ,jk)) & 268 & /(zti(ji, jj ,jk) + zti(ji,jj + 1,jk) + rtrn) & 269 & * rsc 270 END DO 271 END DO 272 END DO 273 274 DO jk = 2,jpkm1 275 DO jj = 2,jpjm1 276 DO ji = 2,jpim1 277 zz(ji,jj,jk) = ( abs(zcc(ji,jj,jk)) - rdttrc(jk)*zcc(ji,jj,jk)**2 & 278 & /( e1t(ji,jj)*e2t(ji,jj)*fse3w(ji,jj,jk) ) ) & 279 & *( zti(ji,jj,jk) - zti(ji,jj,jk - 1) )/ & 280 & ( zti(ji,jj,jk) + zti(ji,jj,jk - 1) + rtrn )* rsc*( -1.) 281 END DO 282 END DO 283 END DO 284 285 ! 2.4 cross terms 286 287 IF (crosster) THEN 288 DO jk = 2,jpkm1 289 DO jj = 2,jpjm1 290 DO ji = 2,jpim1 291 zx(ji,jj,jk) = zx(ji,jj,jk) & 292 & - 0.5*rdttrc(jk)*rsc*zaa(ji,jj,jk)*0.25* & 293 & ( (zbb(ji ,jj - 1,jk ) + zbb(ji + 1,jj - 1 & 294 & ,jk ) + zbb(ji + 1,jj ,jk ) + zbb(ji ,jj & 295 & ,jk))* (zti(ji ,jj + 1,jk ) + zti(ji + 1,jj + & 296 & 1,jk ) - zti(ji + 1,jj - 1,jk ) - zti(ji ,jj & 297 & - 1,jk ))/ (zti(ji ,jj + 1,jk ) + zti(ji + 1 & 298 & ,jj + 1,jk ) + zti(ji + 1,jj - 1,jk ) + zti(ji & 299 & ,jj - 1,jk ) + rtrn) + (zcc(ji ,jj ,jk ) + & 300 & zcc(ji + 1,jj ,jk ) + zcc(ji ,jj ,jk + 1) + & 301 & zcc(ji + 1,jj ,jk + 1))* (zti(ji ,jj ,jk - 1) & 302 & + zti(ji + 1,jj ,jk - 1) - zti(ji ,jj ,jk + 1 & 303 & )- zti(ji + 1,jj ,jk + 1))/ (zti(ji ,jj ,jk - & 304 & 1) + zti(ji + 1,jj ,jk - 1) + zti(ji ,jj ,jk & 305 & +1) + zti(ji + 1,jj ,jk + 1) + rtrn))/(e1u(ji & 306 & ,jj)*e2u(ji,jj)*fse3u(ji,jj,jk))*vmask(ji ,jj - & 307 & 1,jk )*vmask(ji + 1,jj - 1,jk )*vmask(ji + 1 & 308 & ,jj,jk)*vmask(ji ,jj ,jk )*tmask(ji ,jj ,jk & 309 & )*tmask(ji + 1,jj ,jk )*tmask(ji ,jj ,jk + 1 & 310 & )*tmask(ji + 1,jj ,jk + 1) 311 312 zy(ji,jj,jk) = zy(ji,jj,jk) & 313 & - 0.5*rdttrc(jk)*rsc*zbb(ji,jj,jk)*0.25* & 314 & ( (zaa(ji - 1,jj ,jk ) + zaa(ji - 1,jj + 1 & 315 & ,jk ) + zaa(ji ,jj ,jk ) + zaa(ji ,jj + 1 & 316 & ,jk))* (zti(ji + 1,jj + 1,jk ) + zti(ji + 1,jj & 317 & ,jk ) - zti(ji - 1,jj + 1,jk ) - zti(ji - 1,jj & 318 & ,jk ))/ (zti(ji + 1,jj + 1,jk ) + zti(ji + 1 & 319 & ,jj ,jk ) + zti(ji - 1,jj + 1,jk ) + zti(ji & 320 & - 1,jj ,jk ) + rtrn) + (zcc(ji ,jj ,jk ) & 321 & + zcc(ji ,jj ,jk + 1) + zcc(ji ,jj + 1,jk ) & 322 & + zcc(ji ,jj + 1,jk + 1))* (zti(ji ,jj ,jk - & 323 & 1) + zti(ji ,jj + 1,jk - 1) - zti(ji ,jj ,jk & 324 & +1) - zti(ji ,jj + 1,jk + 1))/ (zti(ji ,jj & 325 & ,jk- 1) + zti(ji ,jj + 1,jk - 1) + zti(ji ,jj & 326 & ,jk+ 1) + zti(ji ,jj + 1,jk + 1) + rtrn)) & 327 & /(e1v(ji,jj)*e2v(ji,jj)*fse3v(ji,jj,jk)) & 328 & *umask(ji - 1,jj,jk )*umask(ji - 1,jj + 1,jk ) & 329 & *umask(ji ,jj,jk )*umask(ji ,jj + 1,jk ) & 330 & *tmask(ji ,jj,jk)*tmask(ji ,jj ,jk + 1) & 331 & *tmask(ji ,jj + 1,jk)*tmask(ji ,jj + 1,jk + 1) 332 333 zz(ji,jj,jk) = zz(ji,jj,jk) & 334 & - 0.5*rdttrc(jk)*rsc*zcc(ji,jj,jk)*0.25* & 335 & ( (zaa(ji - 1,jj ,jk ) + zaa(ji ,jj ,jk & 336 & ) + zaa(ji ,jj ,jk - 1) + zaa(ji - 1,jj ,jk - & 337 & 1))*(zti(ji + 1,jj ,jk - 1) + zti(ji + 1,jj & 338 & ,jk ) - zti(ji - 1,jj ,jk ) - zti(ji - 1,jj & 339 & ,jk - 1))/(zti(ji + 1,jj ,jk - 1) + zti(ji + 1 & 340 & ,jj,jk ) + zti(ji - 1,jj ,jk ) + zti(ji - 1 & 341 & ,jj,jk - 1) + rtrn) + (zbb(ji ,jj - 1,jk ) & 342 & + zbb(ji ,jj ,jk ) + zbb(ji ,jj ,jk - 1) & 343 & + zbb(ji ,jj - 1,jk - 1))*(zti(ji ,jj + 1,jk - & 344 & 1) + zti(ji ,jj + 1,jk ) - zti(ji ,jj - 1,jk & 345 & ) - zti(ji ,jj - 1,jk - 1))/(zti(ji ,jj + 1,jk & 346 & - 1) + zti(ji ,jj + 1,jk ) + zti(ji ,jj - 1 & 347 & ,jk ) + zti(ji ,jj - 1,jk - 1) + rtrn)) & 348 & /(e1t(ji,jj)*e2t(ji,jj)*fse3w(ji,jj,jk)) & 349 & *umask(ji - 1,jj,jk )*umask(ji ,jj ,jk ) & 350 & *umask(ji ,jj,jk- 1)*umask(ji - 1,jj ,jk - 1) & 351 & *vmask(ji ,jj- 1,jk)*vmask(ji ,jj ,jk ) & 352 & *vmask(ji ,jj ,jk-1)*vmask(ji ,jj - 1,jk - 1) 353 END DO 354 END DO 355 END DO 356 357 DO jj = 2,jpjm1 358 DO ji = 2,jpim1 359 zx(ji,jj,1) = zx(ji,jj,1) & 360 & - 0.5*rdttrc(jk)*rsc*zaa(ji,jj,1)*0.25* & 361 & ( (zbb(ji ,jj - 1,1 ) + zbb(ji + 1,jj - 1,1 ) & 362 & + zbb(ji + 1,jj ,1 ) + zbb(ji ,jj ,1 )) & 363 & *(zti(ji ,jj + 1,1 ) + zti(ji + 1,jj + 1,1 ) & 364 & - zti(ji + 1,jj - 1,1 ) - zti(ji ,jj - 1,1 )) & 365 & /(zti(ji ,jj + 1,1 ) + zti(ji + 1,jj + 1,1 ) & 366 & + zti(ji + 1,jj - 1,1 ) + zti(ji ,jj - 1,1 ) + & 367 & rtrn))/(e1u(ji,jj)*e2u(ji,jj)*fse3u(ji,jj,1)) & 368 & *vmask(ji ,jj - 1,1 )*vmask(ji + 1,jj - 1,1 ) & 369 & *vmask(ji + 1,jj ,1 )*vmask(ji ,jj ,1 ) 370 371 zy(ji,jj,1) = zy(ji,jj,1) & 372 & - 0.5*rdttrc(jk)*rsc*zbb(ji,jj,1)*0.25* & 373 & ( (zaa(ji-1 ,jj ,1 ) + zaa(ji - 1,jj + 1,1 ) & 374 & + zaa(ji ,jj ,1 ) + zaa(ji ,jj + 1 ,1 )) & 375 & *(zti(ji + 1,jj + 1,1 ) + zti(ji + 1,jj ,1 ) & 376 & - zti(ji - 1,jj + 1,1 ) - zti(ji - 1,jj ,1 )) & 377 & /(zti(ji + 1,jj + 1,1 ) + zti(ji + 1,jj ,1 ) & 378 & + zti(ji - 1,jj + 1,1 ) + zti(ji - 1,jj ,1 ) + & 379 & rtrn))/(e1v(ji,jj)*e2v(ji,jj)*fse3v(ji,jj,1)) & 380 & *umask(ji - 1,jj,1 )*umask(ji - 1,jj + 1,1 ) & 381 & *umask(ji ,jj,1 )*umask(ji ,jj + 1 ,1 ) 382 383 END DO 384 END DO 385 ENDIF 386 387 ! ... Lateral boundary conditions on z[xyz] 388 CALL lbc_lnk( zx, 'U', -1. ) 389 CALL lbc_lnk( zy, 'V', -1. ) 390 CALL lbc_lnk( zz, 'W', 1. ) 391 392 ! 2.4 reinitialization 393 394 DO jk = 1,jpk 395 DO jj = 1,jpj 396 DO ji = 1,jpi 397 zaa(ji,jj,jk) = zx(ji,jj,jk) 398 zbb(ji,jj,jk) = zy(ji,jj,jk) 399 zcc(ji,jj,jk) = zz(ji,jj,jk) 400 END DO 401 END DO 402 END DO 403 404 ! 2.5 calcul of the final field: 405 ! advection by antidiffusive mass fluxes and an upstream scheme 406 407 DO jk = 1,jpk 408 DO jj = 2,jpjm1 409 DO ji = 2,jpim1 410 zfp_ui = 0.5 * ( zaa(ji,jj,jk) + ABS( zaa(ji,jj,jk) ) ) 411 zfp_vj = 0.5 * ( zbb(ji,jj,jk) + ABS( zbb(ji,jj,jk) ) ) 412 zfm_ui = 0.5 * ( zaa(ji,jj,jk) - ABS( zaa(ji,jj,jk) ) ) 413 zfm_vj = 0.5 * ( zbb(ji,jj,jk) - ABS( zbb(ji,jj,jk) ) ) 414 zkx(ji,jj,jk) = zfp_ui * zti(ji,jj,jk) + zfm_ui * zti(ji+1,jj ,jk) 415 zky(ji,jj,jk) = zfp_vj * zti(ji,jj,jk) + zfm_vj * zti(ji ,jj+1,jk) 416 END DO 417 END DO 418 END DO 419 420 DO jk = 2,jpk 421 DO jj = 1,jpj 422 DO ji = 1,jpi 423 zfp_w = 0.5 * ( zcc(ji,jj,jk) + ABS( zcc(ji,jj,jk) ) ) 424 zfm_w = 0.5 * ( zcc(ji,jj,jk) - ABS( zcc(ji,jj,jk) ) ) 425 zkz(ji,jj,jk) = zfp_w * zti(ji,jj,jk) + zfm_w * zti(ji,jj,jk-1) 426 END DO 427 END DO 428 END DO 429 430 431 ! ... Lateral boundary conditions on zk[xy] 432 CALL lbc_lnk( zkx, 'U', -1. ) 433 CALL lbc_lnk( zky, 'V', -1. ) 434 435 436 ! 2.6. calcul of after field using an upstream advection scheme 437 438 DO jk = 1,jpkm1 439 DO jj = 2,jpjm1 440 DO ji = 2,jpim1 441 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk)) 442 ztj(ji,jj,jk) = -zbtr* & 443 & ( zkx(ji,jj,jk) - zkx(ji - 1,jj,jk) & 444 & + zky(ji,jj,jk) - zky(ji,jj - 1,jk) & 445 & + zkz(ji,jj,jk) - zkz(ji,jj,jk + 1) ) 197 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) - & 198 & zbtr*( zkx(ji,jj,jk) - zkx(ji-1,jj,jk) ) 199 200 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) - & 201 & zbtr*( zky(ji,jj,jk) - zky(ji,jj-1,jk) ) 202 203 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) - & 204 & zbtr*( zkz(ji,jj,jk) - zkz(ji,jj,jk+1) ) 205 #endif 206 207 END DO 208 END DO 209 END DO 210 211 ! 3. Diagnose passive tracer trends (part 1/3) 212 ! -------------------------------------------- 213 214 IF( l_trdtrc ) THEN 215 DO jk = 1, jpkm1 216 DO jj = 2, jpjm1 217 DO ji = fs_2, fs_jpim1 ! Vector opt. 218 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk)) 219 ztrtrd(ji,jj,jk,1) = ztrtrd(ji,jj,jk,1) - zbtr*( zkx(ji,jj,jk) - zkx(ji-1,jj ,jk ) ) 220 ztrtrd(ji,jj,jk,2) = ztrtrd(ji,jj,jk,2) - zbtr*( zky(ji,jj,jk) - zky(ji ,jj-1,jk ) ) 221 ztrtrd(ji,jj,jk,3) = ztrtrd(ji,jj,jk,3) - zbtr*( zkz(ji,jj,jk) - zkz(ji ,jj ,jk+1) ) 222 END DO 223 END DO 224 END DO 225 ENDIF 226 227 ! 4. Antidiffusive correction loop 228 ! -------------------------------- 229 ! ! ----------------------------- 230 DO jt = 1, ncortrc ! antidiffusive correction loop 231 ! ! ----------------------------- 232 233 !--4.1 Compute intermediate field zti 234 DO jk = 1, jpkm1 235 zti (:,:,jk) = zti (:,:,jk) + rdttrc(jk) * ztj(:,:,jk) 236 END DO 237 zbuf(:,:,:) = zbuf(:,:,:) + ztj(:,:,:) 238 239 CALL lbc_lnk( zti, 'T', 1. ) ! lateral boundary 240 241 !--4.2 Compute the antidiffusive fluxes 242 DO jk = 1, jpkm1 243 DO jj = 2, jpjm1 244 DO ji = fs_2, fs_jpim1 ! Vector opt. 245 zx(ji,jj,jk) = ( abs(zaa(ji,jj,jk)) - rdttrc(jk) & 246 & *zaa(ji,jj,jk)**2/ & 247 & (e1u(ji,jj)*e2u(ji,jj)*fse3u(ji,jj,jk) ) ) & 248 & *(zti(ji + 1,jj,jk) - zti( ji ,jj,jk)) & 249 & /(zti( ji ,jj,jk) + zti(ji + 1,jj,jk) + rtrn) & 250 & * rsc 251 252 zy(ji,jj,jk) = ( abs(zbb(ji,jj,jk)) - rdttrc(jk) & 253 & *zbb(ji,jj,jk)**2/ & 254 & (e1v(ji,jj)*e2v(ji,jj)*fse3v(ji,jj,jk) ) ) & 255 & *(zti(ji,jj + 1,jk) - zti(ji, jj ,jk)) & 256 & /(zti(ji, jj ,jk) + zti(ji,jj + 1,jk) + rtrn) & 257 & * rsc 258 END DO 259 END DO 260 END DO 261 262 DO jk = 2, jpkm1 263 DO jj = 2, jpjm1 264 DO ji = fs_2, fs_jpim1 ! Vector opt. 265 zz(ji,jj,jk) = ( abs(zcc(ji,jj,jk)) - rdttrc(jk)*zcc(ji,jj,jk)**2 & 266 & /( e1t(ji,jj)*e2t(ji,jj)*fse3w(ji,jj,jk) ) ) & 267 & *( zti(ji,jj,jk) - zti(ji,jj,jk - 1) )/ & 268 & ( zti(ji,jj,jk) + zti(ji,jj,jk - 1) + rtrn )* rsc*( -1.) 269 END DO 270 END DO 271 END DO 272 273 !--4.3 Cross terms 274 CROSSTERMS: IF( crosster ) THEN 275 ! 276 DO jk = 2, jpkm1 277 DO jj = 2, jpjm1 278 DO ji = fs_2, fs_jpim1 ! Vector opt. 279 zx(ji,jj,jk) = zx(ji,jj,jk) & 280 & - 0.5*rdttrc(jk)*rsc*zaa(ji,jj,jk)*0.25* & 281 & ( (zbb(ji ,jj - 1,jk ) + zbb(ji + 1,jj - 1 & 282 & ,jk ) + zbb(ji + 1,jj ,jk ) + zbb(ji ,jj & 283 & ,jk))* (zti(ji ,jj + 1,jk ) + zti(ji + 1,jj + & 284 & 1,jk ) - zti(ji + 1,jj - 1,jk ) - zti(ji ,jj & 285 & - 1,jk ))/ (zti(ji ,jj + 1,jk ) + zti(ji + 1 & 286 & ,jj + 1,jk ) + zti(ji + 1,jj - 1,jk ) + zti(ji & 287 & ,jj - 1,jk ) + rtrn) + (zcc(ji ,jj ,jk ) + & 288 & zcc(ji + 1,jj ,jk ) + zcc(ji ,jj ,jk + 1) + & 289 & zcc(ji + 1,jj ,jk + 1))* (zti(ji ,jj ,jk - 1) & 290 & + zti(ji + 1,jj ,jk - 1) - zti(ji ,jj ,jk + 1 & 291 & )- zti(ji + 1,jj ,jk + 1))/ (zti(ji ,jj ,jk - & 292 & 1) + zti(ji + 1,jj ,jk - 1) + zti(ji ,jj ,jk & 293 & +1) + zti(ji + 1,jj ,jk + 1) + rtrn))/(e1u(ji & 294 & ,jj)*e2u(ji,jj)*fse3u(ji,jj,jk))*vmask(ji ,jj - & 295 & 1,jk )*vmask(ji + 1,jj - 1,jk )*vmask(ji + 1 & 296 & ,jj,jk)*vmask(ji ,jj ,jk )*tmask(ji ,jj ,jk & 297 & )*tmask(ji + 1,jj ,jk )*tmask(ji ,jj ,jk + 1 & 298 & )*tmask(ji + 1,jj ,jk + 1) 299 zy(ji,jj,jk) = zy(ji,jj,jk) & 300 & - 0.5*rdttrc(jk)*rsc*zbb(ji,jj,jk)*0.25* & 301 & ( (zaa(ji - 1,jj ,jk ) + zaa(ji - 1,jj + 1 & 302 & ,jk ) + zaa(ji ,jj ,jk ) + zaa(ji ,jj + 1 & 303 & ,jk))* (zti(ji + 1,jj + 1,jk ) + zti(ji + 1,jj & 304 & ,jk ) - zti(ji - 1,jj + 1,jk ) - zti(ji - 1,jj & 305 & ,jk ))/ (zti(ji + 1,jj + 1,jk ) + zti(ji + 1 & 306 & ,jj ,jk ) + zti(ji - 1,jj + 1,jk ) + zti(ji & 307 & - 1,jj ,jk ) + rtrn) + (zcc(ji ,jj ,jk ) & 308 & + zcc(ji ,jj ,jk + 1) + zcc(ji ,jj + 1,jk ) & 309 & + zcc(ji ,jj + 1,jk + 1))* (zti(ji ,jj ,jk - & 310 & 1) + zti(ji ,jj + 1,jk - 1) - zti(ji ,jj ,jk & 311 & +1) - zti(ji ,jj + 1,jk + 1))/ (zti(ji ,jj & 312 & ,jk- 1) + zti(ji ,jj + 1,jk - 1) + zti(ji ,jj & 313 & ,jk+ 1) + zti(ji ,jj + 1,jk + 1) + rtrn)) & 314 & /(e1v(ji,jj)*e2v(ji,jj)*fse3v(ji,jj,jk)) & 315 & *umask(ji - 1,jj,jk )*umask(ji - 1,jj + 1,jk ) & 316 & *umask(ji ,jj,jk )*umask(ji ,jj + 1,jk ) & 317 & *tmask(ji ,jj,jk)*tmask(ji ,jj ,jk + 1) & 318 & *tmask(ji ,jj + 1,jk)*tmask(ji ,jj + 1,jk + 1) 319 zz(ji,jj,jk) = zz(ji,jj,jk) & 320 & - 0.5*rdttrc(jk)*rsc*zcc(ji,jj,jk)*0.25* & 321 & ( (zaa(ji - 1,jj ,jk ) + zaa(ji ,jj ,jk & 322 & ) + zaa(ji ,jj ,jk - 1) + zaa(ji - 1,jj ,jk - & 323 & 1))*(zti(ji + 1,jj ,jk - 1) + zti(ji + 1,jj & 324 & ,jk ) - zti(ji - 1,jj ,jk ) - zti(ji - 1,jj & 325 & ,jk - 1))/(zti(ji + 1,jj ,jk - 1) + zti(ji + 1 & 326 & ,jj,jk ) + zti(ji - 1,jj ,jk ) + zti(ji - 1 & 327 & ,jj,jk - 1) + rtrn) + (zbb(ji ,jj - 1,jk ) & 328 & + zbb(ji ,jj ,jk ) + zbb(ji ,jj ,jk - 1) & 329 & + zbb(ji ,jj - 1,jk - 1))*(zti(ji ,jj + 1,jk - & 330 & 1) + zti(ji ,jj + 1,jk ) - zti(ji ,jj - 1,jk & 331 & ) - zti(ji ,jj - 1,jk - 1))/(zti(ji ,jj + 1,jk & 332 & - 1) + zti(ji ,jj + 1,jk ) + zti(ji ,jj - 1 & 333 & ,jk ) + zti(ji ,jj - 1,jk - 1) + rtrn)) & 334 & /(e1t(ji,jj)*e2t(ji,jj)*fse3w(ji,jj,jk)) & 335 & *umask(ji - 1,jj,jk )*umask(ji ,jj ,jk ) & 336 & *umask(ji ,jj,jk- 1)*umask(ji - 1,jj ,jk - 1) & 337 & *vmask(ji ,jj- 1,jk)*vmask(ji ,jj ,jk ) & 338 & *vmask(ji ,jj ,jk-1)*vmask(ji ,jj - 1,jk - 1) 339 END DO 340 END DO 341 END DO 342 343 DO jj = 2,jpjm1 344 DO ji = fs_2, fs_jpim1 ! Vector opt. 345 zx(ji,jj,1) = zx(ji,jj,1) & 346 & - 0.5*rdttrc(jk)*rsc*zaa(ji,jj,1)*0.25* & 347 & ( (zbb(ji ,jj - 1,1 ) + zbb(ji + 1,jj - 1,1 ) & 348 & + zbb(ji + 1,jj ,1 ) + zbb(ji ,jj ,1 )) & 349 & *(zti(ji ,jj + 1,1 ) + zti(ji + 1,jj + 1,1 ) & 350 & - zti(ji + 1,jj - 1,1 ) - zti(ji ,jj - 1,1 )) & 351 & /(zti(ji ,jj + 1,1 ) + zti(ji + 1,jj + 1,1 ) & 352 & + zti(ji + 1,jj - 1,1 ) + zti(ji ,jj - 1,1 ) + & 353 & rtrn))/(e1u(ji,jj)*e2u(ji,jj)*fse3u(ji,jj,1)) & 354 & *vmask(ji ,jj - 1,1 )*vmask(ji + 1,jj - 1,1 ) & 355 & *vmask(ji + 1,jj ,1 )*vmask(ji ,jj ,1 ) 356 zy(ji,jj,1) = zy(ji,jj,1) & 357 & - 0.5*rdttrc(jk)*rsc*zbb(ji,jj,1)*0.25* & 358 & ( (zaa(ji-1 ,jj ,1 ) + zaa(ji - 1,jj + 1,1 ) & 359 & + zaa(ji ,jj ,1 ) + zaa(ji ,jj + 1 ,1 )) & 360 & *(zti(ji + 1,jj + 1,1 ) + zti(ji + 1,jj ,1 ) & 361 & - zti(ji - 1,jj + 1,1 ) - zti(ji - 1,jj ,1 )) & 362 & /(zti(ji + 1,jj + 1,1 ) + zti(ji + 1,jj ,1 ) & 363 & + zti(ji - 1,jj + 1,1 ) + zti(ji - 1,jj ,1 ) + & 364 & rtrn))/(e1v(ji,jj)*e2v(ji,jj)*fse3v(ji,jj,1)) & 365 & *umask(ji - 1,jj,1 )*umask(ji - 1,jj + 1,1 ) & 366 & *umask(ji ,jj,1 )*umask(ji ,jj + 1 ,1 ) 367 END DO 368 END DO 369 ! 370 ENDIF CROSSTERMS 371 372 ! ... Lateral boundary conditions on z[xyz] 373 CALL lbc_lnk( zx, 'U', -1. ) ; CALL lbc_lnk( zy, 'V', -1. ) 374 CALL lbc_lnk( zz, 'W', 1. ) 375 376 !--4.4 Reinitialization 377 zaa(:,:,:) = zx(:,:,:) 378 zbb(:,:,:) = zy(:,:,:) 379 zcc(:,:,:) = zz(:,:,:) 380 381 ! 5. Advection by antidiffusive mass fluxes & upstream scheme 382 ! ----------------------------------------------------------- 383 384 ! ... Horizontal 385 DO jk = 1, jpk 386 DO jj = 2, jpjm1 387 DO ji = fs_2, fs_jpim1 ! Vector opt. 388 zfp_ui = 0.5 * ( zaa(ji,jj,jk) + ABS( zaa(ji,jj,jk) ) ) 389 zfp_vj = 0.5 * ( zbb(ji,jj,jk) + ABS( zbb(ji,jj,jk) ) ) 390 zfm_ui = 0.5 * ( zaa(ji,jj,jk) - ABS( zaa(ji,jj,jk) ) ) 391 zfm_vj = 0.5 * ( zbb(ji,jj,jk) - ABS( zbb(ji,jj,jk) ) ) 392 zkx(ji,jj,jk) = zfp_ui * zti(ji,jj,jk) + zfm_ui * zti(ji+1,jj ,jk) 393 zky(ji,jj,jk) = zfp_vj * zti(ji,jj,jk) + zfm_vj * zti(ji ,jj+1,jk) 394 END DO 395 END DO 396 END DO 397 398 ! ... Lateral boundary conditions on zk[xy] 399 CALL lbc_lnk( zkx, 'U', -1. ) 400 CALL lbc_lnk( zky, 'V', -1. ) 401 402 ! ... Vertical 403 DO jk = 2, jpk 404 DO jj = 1, jpj 405 DO ji = fs_2, fs_jpim1 ! Vector opt. 406 zfp_w = 0.5 * ( zcc(ji,jj,jk) + ABS( zcc(ji,jj,jk) ) ) 407 zfm_w = 0.5 * ( zcc(ji,jj,jk) - ABS( zcc(ji,jj,jk) ) ) 408 zkz(ji,jj,jk) = zfp_w * zti(ji,jj,jk) + zfm_w * zti(ji,jj,jk-1) 409 END DO 410 END DO 411 END DO 412 413 ! ... Compute ztj 414 DO jk = 1,jpkm1 415 DO jj = 2,jpjm1 416 DO ji = fs_2, fs_jpim1 ! Vector opt. 417 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk)) 418 ztj(ji,jj,jk) = - zbtr * & 419 & ( zkx(ji,jj,jk) - zkx(ji-1,jj ,jk ) & 420 & + zky(ji,jj,jk) - zky(ji ,jj-1,jk ) & 421 & + zkz(ji,jj,jk) - zkz(ji ,jj ,jk+1) ) 446 422 #if defined key_trc_diatrd 447 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) - & 448 & zbtr*( zkx(ji,jj,jk) - zkx(ji - 1,jj,jk) ) 449 450 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) - & 451 & zbtr*( zky(ji,jj,jk) - zky(ji,jj - 1,jk) ) 452 453 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) - & 454 & zbtr*( zkz(ji,jj,jk) - zkz(ji,jj,jk + 1) ) 455 #endif 456 END DO 457 END DO 458 END DO 459 460 ! 2.6 END of antidiffusive correction loop 461 462 END DO 463 464 ! 3. trend due to horizontal and vertical advection of tracer jn 465 ! -------------------------------------------------------------- 466 467 DO jk = 1,jpk 468 DO jj = 2,jpjm1 469 DO ji = 2,jpim1 470 ztra = ( zbuf(ji,jj,jk) + ztj(ji,jj,jk) ) * tmask(ji,jj,jk) 471 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 472 END DO 473 END DO 474 END DO 475 476 ! 4.0 convert the transport trend into advection trend 477 ! ---------------------------------------------------- 423 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) - & 424 & zbtr*( zkx(ji,jj,jk) - zkx(ji - 1,jj,jk) ) 425 426 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) - & 427 & zbtr*( zky(ji,jj,jk) - zky(ji,jj - 1,jk) ) 428 429 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) - & 430 & zbtr*( zkz(ji,jj,jk) - zkz(ji,jj,jk + 1) ) 431 #endif 432 433 END DO 434 END DO 435 END DO 436 437 ! 6. Diagnose passive tracer trends (part 2/3) 438 ! -------------------------------------------- 439 IF( l_trdtrc ) THEN 440 DO jk = 1, jpkm1 441 DO jj = 2, jpjm1 442 DO ji = fs_2, fs_jpim1 ! Vector opt. 443 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk)) 444 ztrtrd(ji,jj,jk,1) = ztrtrd(ji,jj,jk,1) - zbtr*( zkx(ji,jj,jk) - zkx(ji - 1,jj,jk) ) 445 ztrtrd(ji,jj,jk,2) = ztrtrd(ji,jj,jk,2) - zbtr*( zky(ji,jj,jk) - zky(ji,jj - 1,jk) ) 446 ztrtrd(ji,jj,jk,3) = ztrtrd(ji,jj,jk,3) - zbtr*( zkz(ji,jj,jk) - zkz(ji,jj,jk + 1) ) 447 END DO 448 END DO 449 END DO 450 ENDIF 451 ! ! ------------------------------------ 452 END DO ! End of antidiffusive correction loop 453 ! ! ------------------------------------ 454 455 ! 7. Trend due to horizontal and vertical advection of tracer jn 456 ! -------------------------------------------------------------- 457 458 DO jk = 1, jpk 459 DO jj = 2, jpjm1 460 DO ji = fs_2, fs_jpim1 ! Vector opt. 461 ztra = ( zbuf(ji,jj,jk) + ztj(ji,jj,jk) ) * tmask(ji,jj,jk) 462 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 463 END DO 464 END DO 465 END DO 466 467 468 ! 8. Convert the transport trend into advection trend (part 3/3) 469 ! -------------------------------------------------------------- 470 471 IF( l_trdtrc ) THEN 472 ! ... Update the trends array 473 DO jk = 1, jpk 474 DO jj = 2, jpjm1 475 DO ji = fs_2, fs_jpim1 476 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 477 zgm = zbtr * trn(ji,jj,jk,jn) * & 478 & ( zun(ji ,jj,jk) * e2u(ji ,jj) * fse3u(ji ,jj,jk) & 479 & - zun(ji-1,jj,jk) * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) ) 480 481 zgz = zbtr * trn(ji,jj,jk,jn) * & 482 & ( zvn(ji,jj ,jk) * e1v(ji,jj ) * fse3v(ji,jj ,jk) & 483 & - zvn(ji,jj-1,jk) * e1v(ji,jj-1) * fse3v(ji,jj-1,jk) ) 484 485 ztrtrd(ji,jj,jk,1) = ztrtrd(ji,jj,jk,1) + zgm 486 ztrtrd(ji,jj,jk,2) = ztrtrd(ji,jj,jk,2) + zgz 487 ztrtrd(ji,jj,jk,3) = ztrtrd(ji,jj,jk,3) - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 488 END DO 489 END DO 490 END DO 491 492 ! ... Lateral boundary conditions on trtrd: 493 CALL lbc_lnk( ztrtrd(:,:,:,1), 'T', 1. ) 494 CALL lbc_lnk( ztrtrd(:,:,:,2), 'T', 1. ) 495 CALL lbc_lnk( ztrtrd(:,:,:,3), 'T', 1. ) 496 497 ! ... Miscellaneous trends diagnostics 498 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd(:,:,:,1), jn, jptrc_trd_xad, kt ) 499 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd(:,:,:,2), jn, jptrc_trd_yad, kt ) 500 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd(:,:,:,3), jn, jptrc_trd_zad, kt ) 501 ENDIF 502 503 ! Convert the transport trend into advection trend 504 ! --------------------------------------------------- 478 505 479 506 #if defined key_trc_diatrd 480 507 DO jk = 1,jpk 481 508 DO jj = 2,jpjm1 482 DO ji = 2,jpim1483 zbtr = 1./(e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk))484 zgm = zbtr * trn(ji,jj,jk,jn) * &485 & ( zun(ji ,jj,jk) * e2u(ji ,jj) * fse3u(ji ,jj,jk) &486 & -zun(ji-1,jj,jk) * e2u(ji-1,jj) * fse3u(ji-1,jj,jk))487 488 zgz = zbtr * trn(ji,jj,jk,jn) * &489 & ( zvn(ji,jj ,jk) * e1v(ji,jj ) * fse3v(ji,jj ,jk) &490 & -zvn(ji,jj-1,jk) * e1v(ji,jj-1) * fse3v(ji,jj-1,jk))491 492 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) + zgm493 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) + zgz494 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) &495 &- trn(ji,jj,jk,jn) * hdivn(ji,jj,jk)496 END DO509 DO ji = fs_2, fs_jpim1 ! Vector opt. 510 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 511 zgm = zbtr * trn(ji,jj,jk,jn) * & 512 & ( zun(ji ,jj,jk) * e2u(ji ,jj) * fse3u(ji ,jj,jk) & 513 & - zun(ji-1,jj,jk) * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) ) 514 515 zgz = zbtr * trn(ji,jj,jk,jn) * & 516 & ( zvn(ji,jj ,jk) * e1v(ji,jj ) * fse3v(ji,jj ,jk) & 517 & - zvn(ji,jj-1,jk) * e1v(ji,jj-1) * fse3v(ji,jj-1,jk) ) 518 519 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) + zgm 520 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) + zgz 521 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) & 522 & - trn(ji,jj,jk,jn) * hdivn(ji,jj,jk) 523 END DO 497 524 END DO 498 END DO 499 500 ! Lateral boundary conditions on trtrd: 501 502 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),1), 'T', 1. ) 503 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),2), 'T', 1. ) 504 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),3), 'T', 1. ) 505 #endif 506 525 END DO 526 527 ! Lateral boundary conditions on trtrd 528 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),1), 'T', 1. ) 529 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),2), 'T', 1. ) 530 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),3), 'T', 1. ) 531 #endif 532 533 534 ! ! ================== 535 END DO ! END of tracer loop 536 ! ! ================== 537 538 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 507 539 508 ! END of tracer loop 509 ! ================== 510 ENDDO 511 512 IF(ln_ctl) THEN ! print mean trends (used for debugging) 513 WRITE(charout, FMT="('smolar - adv')") 514 CALL prt_ctl_trc_info(charout) 515 CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd') 516 ENDIF 517 540 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 541 WRITE(charout, FMT="('smolar - adv')") 542 CALL prt_ctl_trc_info(charout) 543 CALL prt_ctl_trc(tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd') 544 ENDIF 545 518 546 END SUBROUTINE trc_adv_smolar 519 547 -
trunk/NEMO/TOP_SRC/TRP/trcadv_tvd.F90
r1152 r1175 1 1 MODULE trcadv_tvd 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcadv_tvd *** 4 4 !! Ocean passive tracers: horizontal & vertical advective trend 5 !!============================================================================== 5 !!====================================================================== 6 !! History : ! 95-12 (L. Mortier) Original code 7 !! ! 00-01 (H. Loukos) adapted to ORCA 8 !! ! 00-10 (MA Foujols E.Kestenare) include file not routine 9 !! ! 00-12 (E. Kestenare M. Levy) fix bug in trtrd indexes 10 !! ! 01-07 (E. Durand G. Madec) adaptation to ORCA config 11 !! 9.0 ! 02-06 (C. Ethe, G. Madec) F90: Free form and module 12 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 13 !!---------------------------------------------------------------------- 6 14 #if defined key_top 7 !!----------------------------------------------------------------------8 !! 'key_top' TOP models9 15 !!---------------------------------------------------------------------- 10 16 !! trc_adv_tvd : update the passive tracer trend with the horizontal … … 14 20 !!---------------------------------------------------------------------- 15 21 USE oce_trc ! ocean dynamics and active tracers variables 16 USE tr p_trc ! ocean passive tracers variables22 USE trc ! ocean passive tracers variables 17 23 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 18 24 USE trcbbl ! advective passive tracers in the BBL 19 25 USE prtctl_trc ! Print control for debbuging 26 USE trdmld_trc 27 USE trdmld_trc_oce 20 28 21 29 IMPLICIT NONE 22 30 PRIVATE 23 31 24 !! * Accessibility25 32 PUBLIC trc_adv_tvd ! routine called by trcstp.F90 26 33 … … 29 36 !!---------------------------------------------------------------------- 30 37 !! TOP 1.0 , LOCEAN-IPSL (2005) 31 !! $ Id$32 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt38 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcadv_tvd.F90,v 1.12 2006/04/10 15:38:54 opalod Exp $ 39 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 33 40 !!---------------------------------------------------------------------- 34 41 … … 47 54 !! 48 55 !! ** Action : - update tra with the now advective tracer trends 49 !! - save the trends in trtrd ('key_trc_diatrd) 50 !! 51 !! History : 52 !! ! 95-12 (L. Mortier) Original code 53 !! ! 00-01 (H. Loukos) adapted to ORCA 54 !! ! 00-10 (MA Foujols E.Kestenare) include file not routine 55 !! ! 00-12 (E. Kestenare M. Levy) fix bug in trtrd indexes 56 !! ! 01-07 (E. Durand G. Madec) adaptation to ORCA config 57 !! 9.0 ! 02-06 (C. Ethe, G. Madec) F90: Free form and module 56 !! - save the trends ('key_trdmld_trc) 58 57 !!---------------------------------------------------------------------- 59 !! * Modules used60 58 #if defined key_trcbbl_adv 61 59 USE oce_trc , zun => ua, & ! use ua as workspace 62 &zvn => va ! use va as workspace60 & zvn => va ! use va as workspace 63 61 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwn 64 62 #else 65 63 USE oce_trc , zun => un, & ! When no bbl, zun == un 66 67 64 & zvn => vn, & ! zvn == vn 65 & zwn => wn ! zwn == wn 68 66 #endif 69 !! * Arguments 70 INTEGER, INTENT( in ) :: kt ! ocean time-step 71 72 !! * Local declarations 73 INTEGER :: ji, jj, jk,jn ! dummy loop indices 74 75 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 76 zti, ztu, ztv, ztw ! temporary workspace 77 78 REAL(wp) :: & 79 z2dtt, zbtr, zeu, zev, zew, z2, & ! temporary scalar 80 zfp_ui, zfp_vj, zfp_wk, & ! " " 81 zfm_ui, zfm_vj, zfm_wk ! " " 82 83 #if defined key_trc_diatrd 84 REAL(wp) :: & 85 zgm, zgz 86 #endif 87 67 INTEGER, INTENT( in ) :: kt ! ocean time-step 68 INTEGER :: ji, jj, jk, jn ! dummy loop indices 69 !! 70 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv 71 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zti, ztw 72 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd ! trends 73 !! 74 REAL(wp) :: z_hdivn_x, z_hdivn_y ! temporary scalars 75 REAL(wp) :: z2dtt, zbtr, zeu, zev, zew, z2 76 REAL(wp) :: zfp_ui, zfp_vj, zfp_wk 77 REAL(wp) :: zfm_ui, zfm_vj, zfm_wk 78 REAL(wp) :: zgm, zgz 88 79 CHARACTER (len=22) :: charout 89 80 !!---------------------------------------------------------------------- … … 96 87 WRITE(numout,*) '~~~~~~~~~~~' 97 88 ENDIF 89 90 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 98 91 99 92 IF( neuler == 0 .AND. kt == nittrc000 ) THEN … … 111 104 #endif 112 105 113 DO jn = 1, jptra 106 ! ! =========== 107 DO jn = 1, jptra ! tracer loop 108 ! ! =========== 109 110 ! ============================================================ 111 ! I. Intermediate advective trends 112 ! ============================================================ 114 113 115 114 ! 1. Bottom value : flux set to zero 116 ! --------------- 117 ztu(:,:,jpk) = 0.e0 118 ztv(:,:,jpk) = 0.e0 119 ztw(:,:,jpk) = 0.e0 120 zti(:,:,jpk) = 0.e0 121 122 123 ! 2. upstream advection with initial mass fluxes & intermediate update 115 ! ---------------------------------- 116 ztu(:,:,jpk) = 0.e0 ; ztv(:,:,jpk) = 0.e0 117 ztw(:,:,jpk) = 0.e0 ; zti(:,:,jpk) = 0.e0 118 119 120 ! 2. Upstream advection with initial mass fluxes & intermediate update 124 121 ! -------------------------------------------------------------------- 125 ! upstream tracer flux in the i and j direction 122 123 ! ... Upstream tracer flux in the i and j direction 126 124 DO jk = 1, jpkm1 127 125 DO jj = 1, jpjm1 128 126 DO ji = 1, fs_jpim1 ! vector opt. 127 !??? CD DO ji = fs_2, fs_jpim1 ! Vector opt. 129 128 zeu = 0.5 * e2u(ji,jj) * fse3u(ji,jj,jk) * zun(ji,jj,jk) 130 129 zev = 0.5 * e1v(ji,jj) * fse3v(ji,jj,jk) * zvn(ji,jj,jk) 131 ! upstream scheme 132 zfp_ui = zeu + ABS( zeu ) 130 zfp_ui = zeu + ABS( zeu ) ! upstream scheme 133 131 zfm_ui = zeu - ABS( zeu ) 134 132 zfp_vj = zev + ABS( zev ) … … 140 138 END DO 141 139 142 ! upstream tracer flux in the k direction140 ! ... Upstream tracer flux in the k direction 143 141 ! Surface value 144 142 IF( lk_dynspg_rl ) THEN ! rigid lid : flux set to zero … … 156 154 DO jk = 2, jpkm1 157 155 DO jj = 1, jpj 158 DO ji = 1, jpi 156 DO ji = 1, jpi ! CD ??? Vector opt. 159 157 zew = 0.5 * e1t(ji,jj) * e2t(ji,jj) * zwn(ji,jj,jk) 160 158 zfp_wk = zew + ABS( zew ) … … 165 163 END DO 166 164 167 ! total advective trend165 ! ... Total intermediate advective trend (flux divergence) 168 166 DO jk = 1, jpkm1 169 167 DO jj = 2, jpjm1 … … 173 171 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk ) & 174 172 & + ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) * zbtr 175 176 173 #if defined key_trc_diatrd 177 174 IF ( luttrd(jn) ) & 178 175 trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) - & 179 & zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) 176 & zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) 180 177 IF ( luttrd(jn) ) & 181 178 trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) - & 182 & zbtr * ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 179 & zbtr * ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 183 180 IF ( luttrd(jn) ) & 184 181 trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) - & … … 188 185 END DO 189 186 END DO 190 191 192 ! update and guess with monotonic sheme 187 188 ! 3. Save the intermediate i / j / k advective trends for diagnostics 189 ! ------------------------------------------------------------------- 190 191 !CDIR BEGIN COLLAPSE 192 IF( l_trdtrc ) THEN 193 194 ! 3.1) Passive tracer ZONAL advection trends 195 ztrtrd(:,:,:) = 0.e0 196 197 DO jk = 1, jpkm1 198 DO jj = 2, jpjm1 199 DO ji = fs_2, fs_jpim1 ! vector opt. 200 201 !-- Compute zonal divergence by splitting hdivn (see divcur.F90) 202 ! N.B. This computation is not valid along OBCs (if any) 203 zbtr = 1./ ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 204 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * un(ji ,jj,jk) & 205 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * un(ji-1,jj,jk) ) * zbtr 206 207 !-- Compute zonal advection trends 208 ztrtrd(ji,jj,jk) = - ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zbtr & 209 & + trb(ji,jj,jk,jn) * z_hdivn_x 210 END DO 211 END DO 212 END DO 213 214 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_xad, kt) ! save the trends 215 216 ! 3.2) Passive tracer MERIDIONAL advection trends 217 ztrtrd(:,:,:) = 0.e0 218 219 DO jk = 1, jpkm1 220 DO jj = 2, jpjm1 221 DO ji = fs_2, fs_jpim1 ! vector opt. 222 223 !-- Compute merid. divergence by splitting hdivn (see divcur.F90) 224 ! N.B. This computation is not valid along OBCs (if any) 225 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 226 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * vn(ji,jj ,jk) & 227 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * vn(ji,jj-1,jk) ) * zbtr 228 229 !-- Compute merid. advection trends 230 ztrtrd(ji,jj,jk) = - ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zbtr & 231 & + trb(ji,jj,jk,jn) * z_hdivn_y 232 END DO 233 END DO 234 END DO 235 236 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_yad, kt) ! save the trends 237 238 ! 3.3) Passive tracer VERTICAL advection trends 239 ztrtrd(:,:,:) = 0.e0 240 DO jk = 1, jpkm1 241 DO jj = 2, jpjm1 242 DO ji = fs_2, fs_jpim1 ! Vector opt. 243 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 244 ztrtrd(ji,jj,jk) = - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) * zbtr & 245 & - trb(ji,jj,jk,jn) * hdivn(ji,jj,jk) 246 END DO 247 END DO 248 END DO 249 250 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_zad, kt) ! save the trends 251 252 ENDIF 253 !CDIR END 254 255 ! 4. Update and guess with monotonic sheme 256 ! ---------------------------------------- 193 257 DO jk = 1, jpkm1 194 258 z2dtt = z2 * rdttra(jk) * FLOAT(ndttrc) … … 201 265 END DO 202 266 203 ! Lateral boundary conditions on zti, zsi (unchanged sign) 267 ! 5. Lateral boundary conditions on zti, zsi (unchanged sign) 268 ! ----------------------------------------------------------- 204 269 CALL lbc_lnk( zti, 'T', 1. ) 205 270 206 ! 3. antidiffusive flux : high order minus low order 271 272 ! ============================================================ 273 ! II. Corrected advective trends 274 ! ============================================================ 275 276 ! 1. Antidiffusive flux : high order minus low order 207 277 ! -------------------------------------------------- 208 ! antidiffusive flux on i and j278 ! Antidiffusive flux on i and j 209 279 DO jk = 1, jpkm1 210 280 DO jj = 1, jpjm1 … … 218 288 END DO 219 289 220 ! antidiffusive flux on k 221 ! Surface value 222 ztw(:,:,1) = 0. 223 224 ! Interior value 225 DO jk = 2, jpkm1 290 ! Antidiffusive flux on k 291 ztw(:,:,1) = 0.e0 ! surface value 292 DO jk = 2, jpkm1 ! interior value 226 293 DO jj = 1, jpj 227 294 DO ji = 1, jpi … … 237 304 CALL lbc_lnk( ztw, 'W', 1. ) 238 305 239 ! 4. monotonicity algorithm306 ! 2. Monotonicity algorithm 240 307 ! ------------------------- 241 308 CALL nonosc( trb(:,:,:,jn), ztu, ztv, ztw, zti, z2 ) 242 309 243 310 244 ! 5. final trend with corrected fluxes311 ! 3. Final trend with corrected fluxes 245 312 ! ------------------------------------ 246 313 DO jk = 1, jpkm1 … … 248 315 DO ji = fs_2, fs_jpim1 ! vector opt. 249 316 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 317 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) & 318 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk ) & 319 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk ) & 320 & + ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) * zbtr 250 321 #if defined key_trc_diatrd 251 322 IF ( luttrd(jn) ) & 252 323 trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) - & 253 & zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) 324 & zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) 254 325 IF ( luttrd(jn) ) & 255 326 trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) - & 256 & zbtr * ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 327 & zbtr * ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) 257 328 IF ( luttrd(jn) ) & 258 329 trtrd(ji,jj,jk,ikeep(jn),3) = trtrd(ji,jj,jk,ikeep(jn),3) - & 259 330 & zbtr * ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) 260 331 #endif 261 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) & 262 & - ( ztu(ji,jj,jk) - ztu(ji-1,jj ,jk ) & 263 & + ztv(ji,jj,jk) - ztv(ji ,jj-1,jk ) & 264 & + ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) * zbtr 265 END DO 266 END DO 267 END DO 268 ! 6.0 convert the transport trend into advection trend 269 ! ---------------------------------------------------- 270 332 333 END DO 334 END DO 335 END DO 336 271 337 #if defined key_trc_diatrd 272 338 DO jk = 1,jpk … … 277 343 & ( zun(ji ,jj,jk) * e2u(ji ,jj) * fse3u(ji ,jj,jk) & 278 344 & - zun(ji-1,jj,jk) * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) ) 279 345 280 346 zgz = zbtr * trn(ji,jj,jk,jn) * & 281 347 & ( zvn(ji,jj ,jk) * e1v(ji,jj ) * fse3v(ji,jj ,jk) & 282 348 & - zvn(ji,jj-1,jk) * e1v(ji,jj-1) * fse3v(ji,jj-1,jk) ) 283 349 284 350 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),1) = trtrd(ji,jj,jk,ikeep(jn),1) + zgm 285 351 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),2) = trtrd(ji,jj,jk,ikeep(jn),2) + zgz … … 289 355 END DO 290 356 END DO 291 357 292 358 ! Lateral boundary conditions on trtrd: 293 359 294 360 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),1), 'T', 1. ) 295 361 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),2), 'T', 1. ) … … 297 363 #endif 298 364 365 ! 4. Save the advective trends for diagnostics 366 ! -------------------------------------------- 367 ! Warning : mass fluxes should probably be converted into advection 368 ! terms in the computations below ??? 369 370 !CDIR BEGIN COLLAPSE 371 IF( l_trdtrc ) THEN 372 373 ! 4.1) Passive tracer ZONAL advection trends 374 ztrtrd(:,:,:) = 0.e0 375 DO jk = 1, jpkm1 376 DO jj = 2, jpjm1 377 DO ji = fs_2, fs_jpim1 ! vector opt. 378 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 379 ztrtrd(ji,jj,jk) = - ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zbtr 380 END DO 381 END DO 382 END DO 383 384 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_xad, kt) ! <<< ADD TO PREVIOUSLY COMPUTED 385 386 ! 4.2) Passive tracer MERIDIONAL advection trends 387 ztrtrd(:,:,:) = 0.e0 388 DO jk = 1, jpkm1 389 DO jj = 2, jpjm1 390 DO ji = fs_2, fs_jpim1 ! vector opt. 391 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 392 ztrtrd(ji,jj,jk) = - ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) ) * zbtr 393 END DO 394 END DO 395 END DO 396 397 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_yad, kt) ! <<< ADD TO PREVIOUSLY COMPUTED 398 399 ! 4.3) Passive tracer VERTICAL advection trends 400 ztrtrd(:,:,:) = 0.e0 401 DO jk = 1, jpkm1 402 DO jj = 2, jpjm1 403 DO ji = fs_2, fs_jpim1 ! vector opt. 404 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 405 ztrtrd(ji,jj,jk) = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr 406 END DO 407 END DO 408 END DO 409 410 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_zad, kt) ! <<< ADD TO PREVIOUSLY COMPUTED 411 412 ENDIF 413 !CDIR END 414 415 299 416 END DO 417 418 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 300 419 301 420 IF(ln_ctl) THEN ! print mean trends (used for debugging) … … 325 444 !! ! 00-02 (H. Loukos) rewritting for opa8 326 445 !! ! 00-10 (M.A Foujols, E. Kestenare) lateral b.c. 446 !! ! 01-03 (E. Kestenare) add key_passivetrc 327 447 !! ! 01-07 (E. Durand G. Madec) adapted for T & S 328 448 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module … … 342 462 INTEGER :: ikm1 343 463 REAL(wp), DIMENSION (jpi,jpj,jpk) :: zbetup, zbetdo 344 REAL(wp) :: zpos, zneg, zbt, za, zb, zc, zbig, z 2dtt464 REAL(wp) :: zpos, zneg, zbt, za, zb, zc, zbig, zrtrn, z2dtt 345 465 !!---------------------------------------------------------------------- 346 466 347 467 zbig = 1.e+40 468 zrtrn = 1.e-15 348 469 zbetup(:,:,:) = 0.e0 ; zbetdo(:,:,:) = 0.e0 349 470 … … 409 530 ! up & down beta terms 410 531 zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) / z2dtt 411 zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+ rtrn) * zbt412 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+ rtrn) * zbt532 zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+zrtrn) * zbt 533 zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+zrtrn) * zbt 413 534 END DO 414 535 END DO -
trunk/NEMO/TOP_SRC/TRP/trcbbc.F90
r1152 r1175 4 4 !! Ocean passive tracers: bottom boundary condition 5 5 !!====================================================================== 6 #if defined key_top && defined key_trcbbc 7 !!---------------------------------------------------------------------- 8 !! 'key_top' and 'key_trcbbc' TOP model and geothermal heat flux 6 !! History : 8.1 ! 99-10 (G. Madec) original code 7 !! 8.5 ! 02-08 (G. Madec) free form + modules 8 !! ! 02-11 (A. Bozec) trc_bbc_init 9 !! 9.0 ! 04-03 (C. Ethe) adpated for passive tracers 10 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 11 !!---------------------------------------------------------------------- 12 #if defined key_top && defined key_trcbbc 13 !!---------------------------------------------------------------------- 14 !! 'key_trcbbc' geothermal heat flux 9 15 !!---------------------------------------------------------------------- 10 16 !! trc_bbc : update the tracer trend at ocean bottom 11 17 !! trc_bbc_init : initialization of geothermal heat flux trend 12 18 !!---------------------------------------------------------------------- 13 !! * Modules used14 19 USE oce_trc ! ocean dynamics and active tracers variables 15 USE tr p_trc ! ocean passive tracers variables20 USE trc ! ocean passive tracers variables 16 21 USE prtctl_trc ! Print control for debbuging 17 22 USE trdmld_trc 23 USE trdmld_trc_oce 24 18 25 IMPLICIT NONE 19 26 PRIVATE 20 27 21 !! * Accessibility22 28 PUBLIC trc_bbc ! routine called by trcstp.F90 23 29 24 !! to be transfert in the namelist ???!30 !! >>>>>>>>>>>>>>>>>>>>>>>>> MOVE TO NAMELIST >>>>>>>>>>>>>>>>>>>>>>>>>> 25 31 LOGICAL, PUBLIC, PARAMETER :: lk_trcbbc = .TRUE. !: bbc flag 26 27 !! * Module variables 28 INTEGER :: & !!! ** bbc namelist (nambbc) ** 29 ngeo_trc_flux = 1 ! Geothermal flux (0:no flux, 1:constant flux, 30 ! ! 2:read in file ) 31 REAL(wp) :: & !!! ** bbc namlist ** 32 ngeo_trc_flux_const = 86.4e-3 ! Constant value of geothermal heat flux 33 34 INTEGER, DIMENSION(jpi,jpj) :: & 35 nbotlevt ! ocean bottom level index at T-pt 36 REAL(wp), DIMENSION(jpi,jpj) :: & 37 qgh_trd ! geothermal heating trend 38 32 33 INTEGER :: ngeo_trc_flux = 1 !!! ** bbc namelist (nambbc) ** 34 ! ! Geothermal flux (0:no flux, 1:constant flux, 35 ! ! 2:read in file ) 36 REAL(wp) :: ngeo_trc_flux_const = 86.4e-3 !!! ** bbc namlist ** 37 ! ! Constant value of geothermal heat flux 38 39 INTEGER, DIMENSION(jpi,jpj) :: nbotlevt ! ocean bottom level index at T-pt 40 REAL(wp), DIMENSION(jpi,jpj) :: qgh_trd ! geothermal heating trend 41 !! <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 42 39 43 !! * Substitutions 40 44 # include "top_substitute.h90" 41 45 !!---------------------------------------------------------------------- 42 46 !! TOP 1.0 , LOCEAN-IPSL (2005) 43 !! $ Id$44 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt47 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcbbc.F90,v 1.11 2006/09/12 11:10:13 opalod Exp $ 48 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 45 49 !!---------------------------------------------------------------------- 46 50 … … 68 72 !! References : 69 73 !! Stein, C. A., and S. Stein, 1992, Nature, 359, 123-129. 70 !! 71 !! History : 72 !! 8.1 ! 99-10 (G. Madec) original code 73 !! 8.5 ! 02-08 (G. Madec) free form + modules 74 !! 9.0 ! 04-03 (C. Ethe) adpated for passive tracers 75 !!---------------------------------------------------------------------- 76 !! * Arguments 77 INTEGER, INTENT( in ) :: kt ! ocean time-step index 78 79 !! * Local declarations 74 !!---------------------------------------------------------------------- 75 INTEGER, INTENT( in ) :: kt ! ocean time-step index 76 80 77 #if defined key_vectopt_loop && ! defined key_mpp_omp 81 INTEGER :: ji, jn ! dummy loop indices82 #else 83 INTEGER :: ji, jj, jn ! dummy loop indices84 #endif 85 REAL(wp) :: ztra ! temporary scalar78 INTEGER :: ji, jn ! dummy loop indices 79 #else 80 INTEGER :: ji, jj, jn ! dummy loop indices 81 #endif 82 REAL(wp) :: ztra ! temporary scalar 86 83 CHARACTER (len=22) :: charout 84 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd ! trends 87 85 !!---------------------------------------------------------------------- 88 86 89 87 ! 0. Initialization 88 ! ----------------- 89 90 90 IF( kt == nittrc000 ) CALL trc_bbc_init 91 91 92 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 93 94 92 95 ! 1. Add the geothermal heat flux trend on temperature 96 ! ---------------------------------------------------- 93 97 94 98 SELECT CASE ( ngeo_trc_flux ) … … 96 100 CASE ( 1:2 ) ! geothermal heat flux 97 101 98 DO jn = 1, jptra 102 ! ! =========== 103 DO jn = 1, jptra ! tracer loop 104 ! ! =========== 105 !CDIR COLLAPSE 106 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 107 108 99 109 #if defined key_vectopt_loop && ! defined key_mpp_omp 100 110 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) … … 108 118 END DO 109 119 #endif 110 END DO 111 112 IF(ln_ctl) THEN ! print mean trends (used for debugging) 120 121 IF( l_trdtrc ) THEN 122 !CDIR COLLAPSE 123 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 124 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_bbc, kt) 125 END IF 126 127 ! ! =========== 128 END DO ! tracer loop 129 ! ! =========== 130 131 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 132 133 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 113 134 WRITE(charout, FMT="('bbc')") 114 135 CALL prt_ctl_trc_info(charout) … … 128 149 !! bottom ocean level 129 150 !! 130 !! ** Method : Read the namt rabbc namelist and check the parameters.151 !! ** Method : Read the namtopbbc namelist and check the parameters. 131 152 !! called at the first time step (nittrc000) 132 153 !! 133 !! ** Input : - Namlist namt rcbbc154 !! ** Input : - Namlist namtopbbc 134 155 !! - NetCDF file : passivetrc_geothermal_heating.nc 135 156 !! ( if necessary ) … … 137 158 !! ** Action : - compute the heat geothermal trend qgh_trd 138 159 !! - compute the bottom ocean level nbotlevt 139 !! 140 !! history : 141 !! 8.5 ! 02-11 (A. Bozec) original code 142 !!---------------------------------------------------------------------- 143 !! * Modules used 160 !!---------------------------------------------------------------------- 144 161 USE iom 145 162 146 !! * local declarations147 163 CHARACTER (len=32) :: clname 148 164 INTEGER :: ji, jj ! dummy loop indices 149 165 INTEGER :: inum = 11 ! temporary logical unit 150 166 151 NAMELIST/namt rcbbc/ngeo_trc_flux, ngeo_trc_flux_const167 NAMELIST/namtopbbc/ngeo_trc_flux, ngeo_trc_flux_const 152 168 !!---------------------------------------------------------------------- 153 169 154 170 ! Read Namelist nambbc : bottom momentum boundary condition 155 REWIND ( numna mtra)156 READ ( numna mtra, namtrcbbc )171 REWIND ( numnat ) 172 READ ( numnat, namtopbbc ) 157 173 158 174 ! Control print -
trunk/NEMO/TOP_SRC/TRP/trcbbl.F90
r1152 r1175 1 1 MODULE trcbbl 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcbbl *** 4 4 !! Ocean passive tracers physics : advective and/or diffusive bottom boundary 5 5 !! layer scheme 6 !!============================================================================== 7 #if defined key_top && ( defined key_trcbbl_dif || defined key_trcbbl_adv ) && ! defined key_c1d 8 !!---------------------------------------------------------------------- 9 !!---------------------------------------------------------------------- 10 !! 'key_top' and TOP models 11 !! 'key_trcbbl_dif' or diffusive bottom boundary layer 12 !! 'key_trcbbl_adv' advective bottom boundary layer 6 !!====================================================================== 7 !! History : 8.0 ! 96-06 (L. Mortier) Original code 8 !! 8.0 ! 97-11 (G. Madec) Optimization 9 !! 8.5 ! 02-08 (G. Madec) free form + modules 10 !! 9.0 ! 04-03 (C. Ethe) Adaptation for passive tracers 11 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 12 !!---------------------------------------------------------------------- 13 #if defined key_top && ( defined key_trcbbl_dif || defined key_trcbbl_adv ) && ! defined key_cfg_1d 14 !!---------------------------------------------------------------------- 15 !! 'key_trcbbl_dif' or diffusive bottom boundary layer 16 !! 'key_trcbbl_adv' advective bottom boundary layer 13 17 !!---------------------------------------------------------------------- 14 18 !! trc_bbl_dif : update the passive tracer trends due to the bottom … … 17 21 !! boundary layer (advective and/or diffusive) 18 22 !!---------------------------------------------------------------------- 19 !! * Modules used20 23 USE oce_trc ! ocean dynamics and active tracers variables 21 USE tr p_trc ! ocean passive tracers variables22 USE trctrp_lec ! passive tracers transport24 USE trc ! ocean passive tracers variables 25 USE trctrp_lec ! passive tracers transport 23 26 USE prtctl_trc ! Print control for debbuging 24 27 USE eosbn2 25 28 USE lbclnk 29 USE trdmld_trc 30 USE trdmld_trc_oce 26 31 27 32 IMPLICIT NONE 28 33 PRIVATE 29 34 30 !! * Routine accessibility31 35 PUBLIC trc_bbl_dif ! routine called by step.F90 32 36 PUBLIC trc_bbl_adv ! routine called by step.F90 33 37 34 !! * Shared module variables35 38 # if defined key_trcbbl_dif 36 LOGICAL, PUBLIC, PARAMETER :: & !: 37 lk_trcbbl_dif = .TRUE. !: advective bottom boundary layer flag 38 39 LOGICAL, PUBLIC, PARAMETER :: lk_trcbbl_dif = .TRUE. !: diffusive bottom boundary layer flag 39 40 # else 40 LOGICAL, PUBLIC, PARAMETER :: & !: 41 lk_trcbbl_dif = .FALSE. !: advective bottom boundary layer flag 41 LOGICAL, PUBLIC, PARAMETER :: lk_trcbbl_dif = .FALSE. !: diffusive bottom boundary layer flag 42 42 # endif 43 43 44 44 # if defined key_trcbbl_adv 45 LOGICAL, PUBLIC, PARAMETER :: & !: 46 lk_trcbbl_adv = .TRUE. !: advective bottom boundary layer flag 47 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: & !: 48 u_trc_bbl, v_trc_bbl, & !: velocity involved in exhanges in the advective BBL 49 w_trc_bbl !: vertical increment of velocity due to advective BBL 50 ! ! only affect tracer vertical advection 45 LOGICAL, PUBLIC, PARAMETER :: lk_trcbbl_adv = .TRUE. !: advective bottom boundary layer flag 46 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: u_trc_bbl !: veloc. involved in the advective BBL 47 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: v_trc_bbl !: veloc. involved in the advective BBL 48 REAL(wp), PUBLIC, DIMENSION(jpi,jpj,jpk) :: w_trc_bbl !: vertic. increment of veloc. due to adv. BBL 49 ! ! only affect tracer vertical advection 51 50 # else 52 LOGICAL, PUBLIC, PARAMETER :: & !: 53 lk_trcbbl_adv = .FALSE. !: advective bottom boundary layer flag 51 LOGICAL, PUBLIC, PARAMETER :: lk_trcbbl_adv = .FALSE. !: advective bottom boundary layer flag 54 52 # endif 55 53 56 !! * Module variables 57 INTEGER, DIMENSION(jpi,jpj) :: & !: 58 mbkt, mbku, mbkv ! ??? 59 54 INTEGER, DIMENSION(jpi,jpj) :: mbkt, mbku, mbkv 60 55 61 56 !! * Substitutions … … 63 58 !!---------------------------------------------------------------------- 64 59 !! TOP 1.0 , LOCEAN-IPSL (2005) 65 !! $ Id$66 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt60 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcbbl.F90,v 1.12 2006/09/12 11:10:13 opalod Exp $ 61 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 67 62 !!---------------------------------------------------------------------- 68 63 … … 104 99 !! References : 105 100 !! Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591. 101 !!---------------------------------------------------------------------- 102 USE oce_trc, ONLY : ztrtrd => ua ! use ua as 3D workspace 106 103 !! 107 !! History : 108 !! 8.0 ! 96-06 (L. Mortier) Original code 109 !! 8.0 ! 97-11 (G. Madec) Optimization 110 !! 8.5 ! 02-08 (G. Madec) free form + modules 111 !! 9.0 ! 04-03 (C. Ethe) Adaptation for passive tracers 112 !!---------------------------------------------------------------------- 113 !! * Arguments 114 INTEGER, INTENT( in ) :: kt ! ocean time-step 115 116 !! * Local declarations 117 INTEGER :: ji, jj,jn ! dummy loop indices 118 INTEGER :: ik 119 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers 120 INTEGER :: iku1, iku2, ikv1,ikv2 ! temporary intergers 121 REAL(wp) :: ze3u, ze3v ! temporary scalars 122 INTEGER :: iku, ikv 123 REAL(wp) :: & 124 zsign, zt, zs, zh, zalbet, & ! temporary scalars 125 zgdrho, zbtr, ztra 126 REAL(wp), DIMENSION(jpi,jpj) :: & 127 zki, zkj, zkx, zky, & ! temporary workspace arrays 128 ztnb, zsnb, zdep, & 129 ztrb, zahu, zahv 104 INTEGER, INTENT( in ) :: kt ! ocean time-step 105 INTEGER :: ji, jj, jn ! dummy loop indices 106 INTEGER :: ik, iku, ikv 107 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers 108 INTEGER :: iku1, iku2, ikv1, ikv2 ! temporary intergers 109 REAL(wp) :: ze3u, ze3v ! temporary scalars 110 REAL(wp) :: zsign, zt, zs, zh, zalbet 111 REAL(wp) :: zgdrho, zbtr, ztra 112 REAL(wp), DIMENSION(jpi,jpj) :: zki, zkj, zkx, zky ! temporary workspace arrays 113 REAL(wp), DIMENSION(jpi,jpj) :: ztnb, zsnb, zdep 114 REAL(wp), DIMENSION(jpi,jpj) :: ztrb, zahu, zahv 115 130 116 CHARACTER (len=22) :: charout 131 REAL(wp) :: & 132 fsalbt, pft, pfs, pfh ! statement function 117 REAL(wp) :: fsalbt, pft, pfs, pfh ! statement function 133 118 !!---------------------------------------------------------------------- 134 119 ! ratio alpha/beta … … 214 199 # endif 215 200 END DO 216 ENDIF 217 218 !! 219 !! OFFLINE VERSION OF DIFFUSIVE BBL 220 !! 201 ENDIF 202 221 203 #if defined key_off_tra 222 204 !!===================================================================== 205 !! I. OFFLINE VERSION OF DIFFUSIVE BBL 206 !!===================================================================== 207 208 ! 1. Criteria of additional bottom diffusivity : grad(rho).grad(h) < 0 209 ! -------------------------------------------------------------------- 210 211 ! Only used in the online version of diffusive BBL (see below) 212 223 213 ! 2. Additional second order diffusive trends 224 214 ! ------------------------------------------- 225 226 DO jn = 1, jptra 227 ! first derivative (gradient) 228 215 ! ! =========== 216 DO jn = 1, jptra ! tracer loop 217 ! ! =========== 218 219 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) 220 221 ! first derivative (gradient) 229 222 # if defined key_vectopt_loop && ! defined key_mpp_omp 230 223 jj = 1 … … 254 247 # endif 255 248 END DO 256 !! 257 !! ONLINE VERSION OF DIFFUSIVE BBL 258 !! 249 259 250 #else 260 ! 1. Criteria of additional bottom diffusivity: grad(rho).grad(h)<0 261 ! -------------------------------------------- 251 !!===================================================================== 252 !! II. ONLINE VERSION OF DIFFUSIVE BBL 253 !!===================================================================== 254 255 ! 1. Criteria of additional bottom diffusivity : grad(rho).grad(h) < 0 256 ! -------------------------------------------------------------------- 262 257 ! Sign of the local density gradient along the i- and j-slopes 263 258 ! multiplied by the slope of the ocean bottom 264 265 266 CASE ( 0 )! Jackett and McDougall (1994) formulation267 259 SELECT CASE ( neos ) 260 261 CASE ( 0 ) ! Jackett and McDougall (1994) formulation 262 268 263 # if defined key_vectopt_loop && ! defined key_mpp_omp 269 264 jj = 1 … … 313 308 # endif 314 309 END DO 315 316 CASE ( 1 )! Linear formulation function of temperature only310 311 CASE ( 1 ) ! Linear formulation function of temperature only 317 312 318 313 # if defined key_vectopt_loop && ! defined key_mpp_omp … … 351 346 END DO 352 347 353 CASE ( 2 ) ! Linear formulation function of temperature and salinity348 CASE ( 2 ) ! Linear formulation function of temperature and salinity 354 349 355 350 DO jj = 1, jpjm1 … … 375 370 END DO 376 371 377 378 372 CASE DEFAULT 379 373 … … 385 379 ! 2. Additional second order diffusive trends 386 380 ! ------------------------------------------- 387 388 DO jn = 1, jptra 381 ! ! =========== 382 DO jn = 1, jptra ! tracer loop 383 ! ! =========== 384 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) 385 389 386 ! first derivative (gradient) 390 391 387 # if defined key_vectopt_loop && ! defined key_mpp_omp 392 388 jj = 1 … … 416 412 END DO 417 413 #endif 414 415 !!===================================================================== 416 !! III. COMMON CODE FOR OFFLINE/ONLINE VERSIONS OF DIFFUSIVE BBL 417 !!===================================================================== 418 418 419 419 IF( cp_cfg == "orca" ) THEN 420 420 421 421 SELECT CASE ( jp_cfg ) 422 ! 422 ! ! ======================= 423 423 CASE ( 2 ) ! ORCA_R2 configuration 424 424 ! ! ======================= … … 466 466 END DO 467 467 468 END DO 469 470 IF(ln_ctl) THEN ! print mean trends (used for debugging) 468 ! save the trends for diagnostic 469 IF( l_trdtrc ) THEN 470 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 471 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_bbl, kt ) 472 END IF 473 ! ! =========== 474 END DO ! tracer loop 475 ! ! =========== 476 477 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 471 478 WRITE(charout, FMT="('bbl - dif')") 472 479 CALL prt_ctl_trc_info(charout) … … 496 503 !! 497 504 !! ** Purpose : Initialization for the bottom boundary layer scheme. 498 !! 499 !! 500 !! History : 501 !! 8.5 ! 02-08 (G. Madec) Original code 502 !!---------------------------------------------------------------------- 503 !! * Local declarations 504 INTEGER :: ji, jj ! dummy loop indices 505 506 REAL(wp), DIMENSION(jpi,jpj) :: zmbk 507 505 !!---------------------------------------------------------------------- 506 INTEGER :: ji, jj 507 REAL(wp), DIMENSION(jpi,jpj) :: zmbk 508 508 !!---------------------------------------------------------------------- 509 509 -
trunk/NEMO/TOP_SRC/TRP/trcdmp.F90
r1152 r1175 4 4 !! Ocean physics: internal restoring trend on passive tracers 5 5 !!====================================================================== 6 #if defined key_top && defined key_trcdmp 6 !! History : 7.0 ! (G. Madec) Original code 7 !! ! 96-01 (G. Madec) 8 !! ! 97-05 (H. Loukos) adapted for passive tracers 9 !! 8.5 ! 02-08 (G. Madec ) free form + modules 10 !! 9.0 ! 04-03 (C. Ethe) free form + modules 11 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 7 12 !!---------------------------------------------------------------------- 8 !! 'key_top' TOP models 9 !! 'key_trcdmp' internal damping 13 #if defined key_top && defined key_trcdmp 14 !!---------------------------------------------------------------------- 15 !! key_trcdmp internal damping 10 16 !!---------------------------------------------------------------------- 11 17 !! trc_dmp : update the tracer trend with the internal damping … … 16 22 !!---------------------------------------------------------------------- 17 23 USE oce_trc ! ocean dynamics and tracers variables 18 USE tr p_trc ! ocean passive tracers variables24 USE trc ! ocean passive tracers variables 19 25 USE trctrp_lec ! passive tracers transport 20 26 USE trcdta 21 27 USE prtctl_trc ! Print control for debbuging 28 USE trdmld_trc 29 USE trdmld_trc_oce 22 30 23 31 IMPLICIT NONE 24 32 PRIVATE 25 33 26 !! * Routine accessibility 27 PUBLIC trc_dmp ! routine called by step.F90 28 29 !! * Shared module variables 30 LOGICAL , PUBLIC, PARAMETER :: lk_trcdmp = .TRUE. !: internal damping flag 31 32 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: & 33 restotr ! restoring coeff. on tracers (s-1) 34 PUBLIC trc_dmp ! routine called by step.F90 35 36 LOGICAL , PUBLIC, PARAMETER :: lk_trcdmp = .TRUE. !: internal damping flag 37 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: restotr ! restoring coeff. on tracers (s-1) 34 38 35 39 !! * Substitutions … … 37 41 !!---------------------------------------------------------------------- 38 42 !! TOP 1.0 , LOCEAN-IPSL (2005) 39 !! $ Id$40 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt43 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcdmp.F90,v 1.11 2006/09/01 14:03:49 opalod Exp $ 44 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 41 45 !!---------------------------------------------------------------------- 42 46 … … 60 64 !! ** Action : - update the tracer trends tra with the newtonian 61 65 !! damping trends. 62 !! - save the trends in trtrd ('key_trc_diatrd') 63 !! 64 !! History : 65 !! 7.0 ! (G. Madec) Original code 66 !! ! 96-01 (G. Madec) 67 !! ! 97-05 (H. Loukos) adapted for passive tracers 68 !! 8.5 ! 02-08 (G. Madec ) free form + modules 69 !! 9.0 ! 04-03 (C. Ethe) free form + modules 70 !!---------------------------------------------------------------------- 71 !! * Arguments 66 !! - save the trends ('key_trdmld_trc') 67 !!---------------------------------------------------------------------- 68 USE oce, ONLY : ztrtrd => ua ! use ua as 3D workspace 69 !! 72 70 INTEGER, INTENT( in ) :: kt ! ocean time-step index 73 74 !! * Local declarations 75 INTEGER :: ji, jj, jk, jn ! dummy loop indices 76 REAL(wp) :: ztest, ztra, zdt ! temporary scalars 71 INTEGER :: ji, jj, jk, jn ! dummy loop indices 72 REAL(wp) :: ztest, ztra !!!, zdt ! temporary scalars 77 73 CHARACTER (len=22) :: charout 78 74 !!---------------------------------------------------------------------- … … 82 78 IF( kt == nittrc000 ) CALL trc_dmp_init 83 79 80 84 81 ! 1. Newtonian damping trends on tracer fields 85 82 ! -------------------------------------------- … … 89 86 90 87 ! Initialize the input fields for newtonian damping 91 CALL trc_dta( kt ) 92 93 DO jn = 1, jptra 88 CALL dta_trc( kt ) 89 90 ! ! =========== 91 DO jn = 1, jptra ! tracer loop 92 ! ! =========== 93 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 94 94 95 95 IF( lutini(jn) ) THEN … … 106 106 !! trn(ji,jj,jk,jn) = trn(ji,jj,jk,jn) + ztra * zdt 107 107 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztra 108 # if defined key_trc_diatrd109 ! save the trends for diagnostics110 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),jpdiatrc-1) = ztra111 # endif112 108 END DO 113 109 END DO … … 129 125 # if defined key_trc_diatrd 130 126 ! save the trends for diagnostics 131 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),jpdiatrc -1) = ztra127 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),jpdiatrc) = ztra 132 128 # endif 129 133 130 END DO 134 131 END DO … … 149 146 # if defined key_trc_diatrd 150 147 ! save the trends for diagnostics 151 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),jpdiatrc -1) = ztra148 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),jpdiatrc) = ztra 152 149 # endif 150 153 151 END DO 154 152 END DO … … 159 157 ENDIF 160 158 161 END DO 162 163 IF(ln_ctl) THEN ! print mean trends (used for debugging) 159 IF( l_trdtrc ) THEN 160 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 161 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_dmp, kt ) ! trends diags. 162 END IF 163 ! ! =========== 164 END DO ! tracer loop 165 ! ! =========== 166 167 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 164 168 WRITE(charout, FMT="('dmp')") 165 CALL prt_ctl_trc_info( charout)166 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')169 CALL prt_ctl_trc_info( charout ) 170 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd' ) 167 171 ENDIF 168 172 … … 180 184 !! ** Method : read the nammbf namelist and check the parameters 181 185 !! called by trc_dmp at the first timestep (nit000) 182 !!183 !! History :184 !! 8.5 ! 02-08 (G. Madec) Original code185 186 !!---------------------------------------------------------------------- 186 187 … … 194 195 195 196 CASE DEFAULT 196 WRITE(ctmp1,*) ' bad flag value for ndmp = ', ndmp197 WRITE(ctmp1,*) ' bad flag value for ndmptr = ', ndmptr 197 198 CALL ctl_stop(ctmp1) 198 199 … … 212 213 213 214 CASE DEFAULT 214 WRITE(ctmp1,*) ' bad flag value for nmldmp = ', nmldmp215 WRITE(ctmp1,*) ' bad flag value for nmldmptr = ', nmldmptr 215 216 CALL ctl_stop(ctmp1) 216 217 217 218 218 END SELECT 219 219 220 221 ! 3. Damping coefficients initialization 222 ! -------------------------------------- 223 224 IF( lzoom ) THEN 225 CALL trccof_zoom 226 ELSE 227 CALL trccof 228 ENDIF 220 ! Damping coefficients initialization 221 ! ----------------------------------- 222 IF( lzoom ) THEN 223 CALL trccof_zoom 224 ELSE 225 CALL trccof 226 ENDIF 229 227 230 228 END SUBROUTINE trc_dmp_init … … 357 355 icot ! logical unit for file distance to the coast 358 356 359 CHARACTER (len=32) :: clname, clname2,clname3357 CHARACTER (len=32) :: clname3 360 358 REAL(wp) :: & 361 359 zdate0, zinfl, zlon, & ! temporary scalars -
trunk/NEMO/TOP_SRC/TRP/trcldf_bilap.F90
r1152 r1175 1 1 MODULE trcldf_bilap 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcldf_bilap *** 4 !! TOP : horizontal component of the lateral tracer mixing trend 5 !!============================================================================== 4 !! Ocean passive tracers: horiz. component of the lateral tracer mixing trend 5 !!====================================================================== 6 !! History : ! 91-11 (G. Madec) Original code 7 !! ! 93-03 (M. Guyon) symetrical conditions 8 !! ! 95-11 (G. Madec) suppress volumetric scale factors 9 !! ! 96-01 (G. Madec) statement function for e3 10 !! ! 96-01 (M. Imbard) mpp exchange 11 !! ! 97-07 (G. Madec) optimization, and ahtt 12 !! ! 00-05 (MA Foujols) add lbc for tracer trends 13 !! ! 00-10 (MA Foujols E. Kestenare) use passive tracer coefficient 14 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 15 !! 9.0 ! 04-03 (C. Ethe ) F90: Free form and module 16 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 17 !!---------------------------------------------------------------------- 6 18 #if defined key_top 7 !!----------------------------------------------------------------------8 !! 'key_top' TOP models9 19 !!---------------------------------------------------------------------- 10 20 !! trc_ldf_bilap : update the tracer trend with the horizontal diffusion 11 21 !! using a iso-level biharmonic operator 12 22 !!---------------------------------------------------------------------- 13 !! * Modules used14 23 USE oce_trc ! ocean dynamics and active tracers variables 15 USE trp_trc 24 USE trp_trc ! ocean passive tracers variables 16 25 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 17 26 USE prtctl_trc ! Print control for debbuging 27 USE trdmld_trc 28 USE trdmld_trc_oce 18 29 19 30 IMPLICIT NONE 20 31 PRIVATE 21 32 22 !! * Routine accessibility23 33 PUBLIC trc_ldf_bilap ! routine called by step.F90 24 34 … … 27 37 !!---------------------------------------------------------------------- 28 38 !! TOP 1.0 , LOCEAN-IPSL (2005) 29 !! $ Id$39 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcldf_bilap.F90,v 1.10 2006/09/12 11:10:14 opalod Exp $ 30 40 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 31 41 !!---------------------------------------------------------------------- … … 70 80 !! ** Action : - Update tra arrays with the before iso-level 71 81 !! biharmonic mixing trend. 72 !! - Save the trends in trtrd ('key_trc_diatrd') 73 !! 74 !! History : 75 !! ! 91-11 (G. Madec) Original code 76 !! ! 93-03 (M. Guyon) symetrical conditions 77 !! ! 95-11 (G. Madec) suppress volumetric scale factors 78 !! ! 96-01 (G. Madec) statement function for e3 79 !! ! 96-01 (M. Imbard) mpp exchange 80 !! ! 97-07 (G. Madec) optimization, and ahtt 81 !! ! 00-05 (MA Foujols) add lbc for tracer trends 82 !! ! 00-10 (MA Foujols E. Kestenare) use passive tracer coefficient 83 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 84 !! 9.0 ! 04-03 (C. Ethe ) F90: Free form and module 82 !! - Save the trends ('key_trdmld_trc') 85 83 !!---------------------------------------------------------------------- 86 !! * Arguments 87 INTEGER, INTENT( in ) :: kt ! ocean time-step index 88 89 !! * Local declarations 90 INTEGER :: ji, jj, jk, jn ! dummy loop indices 91 INTEGER :: iku, ikv ! temporary integers 92 93 REAL(wp) :: ztra ! temporary scalars 94 95 REAL(wp), DIMENSION(jpi,jpj) :: & 96 zeeu, zeev, zbtr, zlt ! workspace 97 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 98 ztu, ztv ! workspace 84 USE oce_trc, ztrtrd => ua ! use ua as workspace 85 !! 86 INTEGER, INTENT( in ) :: kt ! ocean time-step index 87 INTEGER :: ji, jj, jk, jn ! dummy loop indices 88 INTEGER :: iku, ikv ! temporary integers 89 REAL(wp) :: ztra ! temporary scalars 90 REAL(wp), DIMENSION(jpi,jpj) :: zeeu, zeev, zbtr, zlt ! workspace 91 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztu, ztv ! workspace 99 92 CHARACTER (len=22) :: charout 100 93 !!---------------------------------------------------------------------- … … 105 98 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~' 106 99 ENDIF 107 ! 108 109 DO jn = 1, jptra 100 ! ! =========== 101 DO jn = 1, jptra ! tracer loop 102 ! ! =========== 103 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 104 110 105 ! =============== 111 106 DO jk = 1, jpkm1 ! Horizontal slab … … 199 194 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),5) = ( ztv(ji,jj,jk) - ztv(ji-1,jj,jk) ) * zbtr(ji,jj) 200 195 #endif 196 201 197 END DO 202 198 END DO … … 206 202 #if defined key_trc_diatrd 207 203 ! Lateral boundary conditions on the laplacian zlt (unchanged sgn) 208 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),5), 'T', 1. ) 209 #endif 210 END DO 211 212 IF(ln_ctl) THEN ! print mean trends (used for debugging) 204 IF (luttrd(jn)) CALL lbc_lnk( trtrd(:,:,:,ikeep(jn),5), 'T', 1. ) 205 #endif 206 207 IF( l_trdtrc ) THEN 208 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 209 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_ldf, kt ) ! trends diags 210 END IF 211 ! ! =========== 212 END DO ! tracer loop 213 ! ! =========== 214 215 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 213 216 WRITE(charout, FMT="('ldf - bilap')") 214 CALL prt_ctl_trc_info( charout)215 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')217 CALL prt_ctl_trc_info( charout ) 218 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd' ) 216 219 ENDIF 217 220 -
trunk/NEMO/TOP_SRC/TRP/trcldf_bilapg.F90
r1152 r1175 1 1 MODULE trcldf_bilapg 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcldf_bilapg *** 4 4 !! Ocean passive tracers: horizontal component of the lateral tracer mixing trend 5 !!============================================================================== 6 #if defined key_top && defined key_ldfslp 7 !!---------------------------------------------------------------------- 8 !! 'key_top' and TOP models 5 !!====================================================================== 6 !! History : 8.0 ! 97-07 (G. Madec) Original code 7 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 8 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers 9 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 10 !!---------------------------------------------------------------------- 11 #if key_top && defined key_ldfslp 12 !!---------------------------------------------------------------------- 9 13 !! 'key_ldfslp' rotation of the lateral mixing tensor 10 14 !!---------------------------------------------------------------------- … … 13 17 !! ldfght : ??? 14 18 !!---------------------------------------------------------------------- 15 !! * Modules used16 19 USE oce_trc ! ocean dynamics and tracers variables 17 USE tr p_trc ! ocean passive tracers variables20 USE trc ! ocean passive tracers variables 18 21 USE lbclnk ! ocean lateral boundary condition (or mpp link) 19 22 USE prtctl_trc ! Print control for debbuging 23 USE trp_trc 24 USE trdmld_trc 25 USE trdmld_trc_oce 20 26 21 27 IMPLICIT NONE 22 28 PRIVATE 23 29 24 !! * Routine accessibility25 30 PUBLIC trc_ldf_bilapg ! routine called by step.F90 26 31 … … 29 34 !!---------------------------------------------------------------------- 30 35 !! TOP 1.0 , LOCEAN-IPSL (2005) 31 !! $ Id$32 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt36 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcldf_bilapg.F90,v 1.9 2006/04/10 15:38:54 opalod Exp $ 37 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 33 38 !!---------------------------------------------------------------------- 34 39 … … 57 62 !! ** Action : - Update tra arrays with the before geopotential 58 63 !! biharmonic mixing trend. 59 !! - Save the trends in trtrd ('key_trc_diatrd') 60 !! 61 !! History : 62 !! 8.0 ! 97-07 (G. Madec) Original code 63 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 64 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers 65 !!---------------------------------------------------------------------- 66 !! * Arguments 67 INTEGER, INTENT( in ) :: kt ! ocean time-step index 68 69 !! * Local declarations 70 INTEGER :: ji, jj, jk,jn ! dummy loop indices 71 REAL(wp) :: ztra ! workspace 72 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: & 73 wk1, wk2 ! work array used for rotated biharmonic 74 ! operator on tracers and/or momentum 75 CHARACTER (len=22) :: charout 64 !!---------------------------------------------------------------------- 65 INTEGER, INTENT( in ) :: kt ! ocean time-step index 66 INTEGER :: ji, jj, jk, jn ! dummy loop indices 67 REAL(wp) :: ztra ! workspace 68 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: wk1, wk2 ! work array used for rotated biharmonic 69 ! ! operator on tracers and/or momentum 70 CHARACTER (len=22) :: charout 76 71 !!---------------------------------------------------------------------- 77 72 … … 99 94 100 95 CALL ldfght ( wk1, wk2, 2 ) 101 102 103 DO jn = 1, jptra 96 ! ! =========== 97 DO jn = 1, jptra ! tracer loop 98 ! ! =========== 99 104 100 ! 3. Update the tracer trends (j-slab : 2, jpj-1) 105 101 ! --------------------------- … … 120 116 END DO ! End of slab 121 117 ! ! =============== 122 123 END DO 124 125 IF(ln_ctl) THEN ! print mean trends (used for debugging) 118 IF( l_trdtrc .AND. luttrd(jn) ) CALL trd_mod_trc( wk2(:,:,:,jn), jn, jptrc_trd_ldf, kt ) 119 120 ! ! =========== 121 END DO ! tracer loop 122 ! ! =========== 123 124 125 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 126 126 WRITE(charout, FMT="('ldf - bilapg')") 127 CALL prt_ctl_trc_info( charout)128 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')127 CALL prt_ctl_trc_info( charout ) 128 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd' ) 129 129 ENDIF 130 130 … … 171 171 !! * Action : 172 172 !! 'key_trdtra' defined: the trend is saved for diagnostics. 173 !! 174 !! History : 175 !! 8.0 ! 97-07 (G. Madec) Original code 176 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 177 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers 178 !!---------------------------------------------------------------------- 179 !! * Arguments 173 !!---------------------------------------------------------------------- 180 174 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra), INTENT( in ) :: & 181 175 pt ! tracer fields before for 1st call … … 189 183 ! ! =2 no multiplication 190 184 191 !! * Local declarations192 185 INTEGER :: ji, jj, jk,jn ! dummy loop indices 193 186 REAL(wp) :: & … … 204 197 zftw, & ! workspace 205 198 zdit, zdjt, zdj1t 206 207 !!---------------------------------------------------------------------- 208 199 !!---------------------------------------------------------------------- 209 200 210 201 DO jn = 1, jptra -
trunk/NEMO/TOP_SRC/TRP/trcldf_iso.F90
r1152 r1175 2 2 !!============================================================================== 3 3 !! *** MODULE trcldf_iso *** 4 !!====================================================================== 4 5 !! Ocean passive tracers: horizontal component of the lateral tracer mixing trend 5 !!============================================================================== 6 #if defined key_top && defined key_ldfslp 7 !!---------------------------------------------------------------------- 8 !! 'key_top' and TOP models 6 !! History : 7 !! ! 94-08 (G. Madec, M. Imbard) 8 !! ! 97-05 (G. Madec) split into traldf and trazdf 9 !! ! 98-03 (L. Bopp, MA Foujols) passive tracer generalisation 10 !! ! 00-10 (MA Foujols E Kestenare) USE passive tracer coefficient 11 !! 8.5 ! 02-08 (G. Madec) Free form, F90 12 !! 9.0 ! 04-03 (C. Ethe) Free form, F90 13 !! ! 06-08 (C. Deltel) Diagnose ML trends for passive tracers 14 !!---------------------------------------------------------------------- 15 #if key_top && defined key_ldfslp 16 !!---------------------------------------------------------------------- 9 17 !! 'key_ldfslp' rotation of the lateral mixing tensor 10 18 !!---------------------------------------------------------------------- … … 13 21 !! laplacian operator in s-coordinate 14 22 !!---------------------------------------------------------------------- 15 !! * Modules used16 23 USE oce_trc ! ocean dynamics and tracers variables 17 USE trp_trc 24 USE trp_trc ! ocean passive tracers variables 18 25 USE prtctl_trc ! Print control for debbuging 26 USE trdmld_trc 27 USE trdmld_trc_oce 19 28 20 29 IMPLICIT NONE 21 30 PRIVATE 22 31 23 !! * Routine accessibility24 32 PUBLIC trc_ldf_iso ! routine called by step.F90 25 33 … … 28 36 !!---------------------------------------------------------------------- 29 37 !! TOP 1.0 , LOCEAN-IPSL (2005) 30 !! $ Id$31 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt38 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcldf_iso.F90,v 1.9 2006/04/10 15:38:54 opalod Exp $ 39 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 32 40 !!---------------------------------------------------------------------- 33 41 … … 62 70 !! ** Action : - Update tra arrays with the before isopycnal or 63 71 !! geopotential s-coord harmonic mixing trend. 64 !! - Save the trends in trtrd ('key_trc_diatrd') 65 !! 66 !! History : 67 !! ! 94-08 (G. Madec, M. Imbard) 68 !! ! 97-05 (G. Madec) split into traldf and trazdf 69 !! ! 98-03 (L. Bopp, MA Foujols) passive tracer generalisation 70 !! ! 00-10 (MA Foujols E Kestenare) USE passive tracer coefficient 71 !! 8.5 ! 02-08 (G. Madec) Free form, F90 72 !! 9.0 ! 04-03 (C. Ethe) Free form, F90 72 !! - Save the trends ('key_trdmld_trc') 73 73 !!---------------------------------------------------------------------- 74 !! * Modules used75 74 USE oce_trc , zftu => ua, & ! use ua as workspace 76 75 & zfsu => va ! use va as workspace 77 78 !! * Arguments 79 INTEGER, INTENT( in ) :: kt ! ocean time-step index 80 81 !! * Local declarations 82 INTEGER :: ji, jj, jk,jn ! dummy loop indices 83 REAL(wp) :: & 84 zabe1, zabe2, zcof1, zcof2, & ! temporary scalars 85 zmsku, zmskv, zbtr, & 76 !! 77 INTEGER, INTENT( in ) :: kt ! ocean time-step index 78 !! 79 INTEGER :: ji, jj, jk, jn ! dummy loop indices 80 REAL(wp) :: zabe1, zabe2, zcof1, zcof2 ! temporary scalars 81 REAL(wp) :: zmsku, zmskv, zbtr, ztra 86 82 #if defined key_trcldf_eiv 87 zcg1, zcg2, zuwk, zvwk, & 88 zuwk1, zvwk1, & 89 #endif 90 ztra 91 92 REAL(wp), DIMENSION(jpi,jpj) :: & 93 zdkt, zdk1t ! workspace 94 83 REAL(wp) :: zcg1, zcg2, zuwk, zvwk, zuwk1, zvwk1 84 REAL(wp) :: z_hdivn_x, z_hdivn_y 85 #endif 86 REAL(wp), DIMENSION(jpi,jpj) :: zdkt, zdk1t ! workspace 95 87 #if defined key_trcldf_eiv 96 REAL(wp), DIMENSION(jpi,jpj) :: & 97 zftug, zftvg 98 99 #if defined key_trc_diatrd 100 REAL(wp) :: & 101 ztagu, ztagv 102 #endif 103 104 #endif 105 106 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 107 zftv ! workspace 88 REAL(wp), DIMENSION(jpi,jpj) :: zftug, zftvg 89 #endif 90 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zftv ! workspace 108 91 CHARACTER (len=22) :: charout 92 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd ! trends arrays 93 # if defined key_trcldf_eiv 94 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd_xei 95 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd_yei 96 #endif 109 97 !!---------------------------------------------------------------------- 110 98 … … 119 107 ENDIF 120 108 121 122 DO jn = 1, jptra 109 IF( l_trdtrc ) THEN 110 ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 111 # if defined key_trcldf_eiv 112 ALLOCATE( ztrtrd_xei(jpi,jpj,jpk) ) 113 ALLOCATE( ztrtrd_yei(jpi,jpj,jpk) ) 114 # endif 115 ENDIF 116 117 ! ! =========== 118 DO jn = 1, jptra ! tracer loop 119 ! ! =========== 120 121 !CDIR COLLAPSE 122 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) 123 123 124 124 ! ! =============== … … 194 194 # endif 195 195 196 ! II.4Second derivative (divergence) and add to the general trend197 ! -------------------------------------------------------------- --196 ! 3. Second derivative (divergence) and add to the general trend 197 ! -------------------------------------------------------------- 198 198 199 199 DO jj = 2 , jpjm1 … … 201 201 zbtr= 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 202 202 ztra = zbtr * ( zftu(ji,jj,jk) - zftu(ji-1,jj ,jk) & 203 &+ zftv(ji,jj,jk) - zftv(ji ,jj-1,jk) )203 & + zftv(ji,jj,jk) - zftv(ji ,jj-1,jk) ) 204 204 tra (ji,jj,jk,jn) = tra (ji,jj,jk,jn) + ztra 205 205 #if defined key_trc_diatrd … … 207 207 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),5) = ( zftv(ji,jj,jk) - zftv(ji,jj-1,jk ) ) * zbtr 208 208 #endif 209 209 210 END DO 210 211 END DO 211 212 #if defined key_trc_diatrd213 # if defined key_trcldf_eiv214 DO jj = 2 , jpjm1215 DO ji = fs_2, fs_jpim1 ! vector opt.216 zbtr= 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) )217 ztagu = ( zftug(ji,jj) - zftug(ji-1,jj ) ) * zbtr218 ztagv = ( zftvg(ji,jj) - zftvg(ji ,jj-1) ) * zbtr219 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),4) = trtrd(ji,jj,jk,ikeep(jn),4) - ztagu220 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),5) = trtrd(ji,jj,jk,ikeep(jn),5) - ztagv221 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),7) = ztagu222 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),8) = ztagv223 END DO224 END DO225 # endif226 #endif227 228 212 ! ! =============== 229 213 END DO ! End of slab 230 214 ! ! =============== 231 215 232 END DO 233 234 IF(ln_ctl) THEN ! print mean trends (used for debugging) 216 ! 4. Save the trends for diagnostic 217 ! --------------------------------- 218 219 IF( l_trdtrc ) THEN 220 # if defined key_trcldf_eiv 221 222 ! 4.1) Compute the eiv ZONAL & MERIDIONAL advective trends 223 ! =============== 224 DO jk = 1, jpkm1 ! Horizontal slab 225 ! =============== 226 DO jj = 1, jpjm1 227 DO ji = 1, fs_jpim1 ! vector opt. 228 zuwk = ( wslpi(ji,jj,jk ) + wslpi(ji+1,jj,jk ) ) * fsaeitru(ji,jj,jk ) * umask(ji,jj,jk ) 229 zuwk1= ( wslpi(ji,jj,jk+1) + wslpi(ji+1,jj,jk+1) ) * fsaeitru(ji,jj,jk+1) * umask(ji,jj,jk+1) 230 zvwk = ( wslpj(ji,jj,jk ) + wslpj(ji,jj+1,jk ) ) * fsaeitrv(ji,jj,jk ) * vmask(ji,jj,jk ) 231 zvwk1= ( wslpj(ji,jj,jk+1) + wslpj(ji,jj+1,jk+1) ) * fsaeitrv(ji,jj,jk+1) * vmask(ji,jj,jk+1) 232 233 zcg1= -0.25 * e2u(ji,jj) * umask(ji,jj,jk) * ( zuwk-zuwk1 ) 234 zcg2= -0.25 * e1v(ji,jj) * vmask(ji,jj,jk) * ( zvwk-zvwk1 ) 235 236 zftug(ji,jj) = zcg1 * ( trb(ji+1,jj,jk,jn) + trb(ji,jj,jk,jn) ) 237 zftvg(ji,jj) = zcg2 * ( trb(ji,jj+1,jk,jn) + trb(ji,jj,jk,jn) ) 238 END DO 239 END DO 240 241 !CDIRR COLLAPSE 242 DO jj = 2 , jpjm1 243 DO ji = fs_2, fs_jpim1 ! vector opt. 244 zbtr= 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 245 246 !-- Compute zonal & meridional divergences of the eiv field : 247 ! d_x[u_trc_eiv] = 1/(e1t*e2t*e3t) ( di[e2u*e3u u_trc_eiv] ) 248 ! d_y[v_trc_eiv] = 1/(e1t*e2t*e3t) ( dj[e1v*e3v v_trc_eiv] ) 249 ! N.B. This is only possible if key_diaeiv is switched on. 250 # if defined key_diaeiv 251 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * u_trc_eiv(ji ,jj ,jk) & 252 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * u_trc_eiv(ji-1,jj ,jk) ) * zbtr 253 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * v_trc_eiv(ji, jj ,jk) & 254 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * v_trc_eiv(ji ,jj-1,jk) ) * zbtr 255 # else 256 z_hdivn_x = 0.e0 ; z_hdivn_y = 0.e0 257 # endif 258 !-- Compute the zonal advective trends associated with eiv 259 ztrtrd_xei(ji,jj,jk) = zbtr * ( zftug(ji,jj) - zftug(ji-1,jj ) ) & 260 & - trn(ji,jj,jk,jn) * z_hdivn_x 261 262 !-- Compute the merid. advective trends associated with eiv 263 ztrtrd_yei(ji,jj,jk) = zbtr * ( zftvg(ji,jj) - zftvg(ji ,jj-1) ) & 264 & - trn(ji,jj,jk,jn) * z_hdivn_y 265 END DO 266 END DO 267 ! =============== 268 END DO ! End of slab 269 ! =============== 270 ! 4.2) Deduce the trend 271 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) - ztrtrd_xei(:,:,:) - ztrtrd_yei(:,:,:) 272 # else 273 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 274 # endif 275 276 ! 4.3) save the trends for diagnostic 277 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd , jn, jptrc_trd_ldf, kt ) 278 # if defined key_trcldf_eiv 279 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd_xei, jn, jptrc_trd_xei, kt ) 280 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd_yei, jn, jptrc_trd_yei, kt ) 281 # endif 282 ENDIF 283 ! ! =========== 284 END DO ! tracer loop 285 ! ! =========== 286 287 IF( l_trdtrc ) THEN 288 DEALLOCATE( ztrtrd ) 289 # if defined key_trcldf_eiv 290 DEALLOCATE( ztrtrd_xei ) 291 DEALLOCATE( ztrtrd_yei ) 292 # endif 293 ENDIF 294 295 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 235 296 WRITE(charout, FMT="('ldf - iso')") 236 297 CALL prt_ctl_trc_info(charout) -
trunk/NEMO/TOP_SRC/TRP/trcldf_iso_zps.F90
r1152 r1175 1 1 MODULE trcldf_iso_zps 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcldf_iso_zps *** 4 4 !! Ocean passive tracers: horizontal component of the lateral tracer mixing trend 5 !!============================================================================== 6 #if defined key_top && defined key_ldfslp 7 !!---------------------------------------------------------------------- 8 !! 'key_top' and TOP models 5 !!====================================================================== 6 !! History : ! 94-08 (G. Madec, M. Imbard) 7 !! ! 97-05 (G. Madec) split into traldf and trazdf 8 !! 8.5 ! 02-08 (G. Madec) Free form, F90 9 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers 10 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 11 !!---------------------------------------------------------------------- 12 #if key_top && defined key_ldfslp 13 !!---------------------------------------------------------------------- 9 14 !! 'key_ldfslp' slope of the lateral diffusive direction 10 15 !!---------------------------------------------------------------------- … … 12 17 !! component of a iso-neutral laplacian operator 13 18 !!---------------------------------------------------------------------- 14 !! * Modules used15 19 USE oce_trc ! ocean dynamics and active tracers variables 16 20 USE trp_trc ! ocean passive tracers variables 17 21 USE prtctl_trc ! Print control for debbuging 22 USE trdmld_trc 23 USE trdmld_trc_oce 18 24 19 25 IMPLICIT NONE 20 26 PRIVATE 21 27 22 !! * Accessibility23 28 PUBLIC trc_ldf_iso_zps ! routine called by step.F90 24 29 … … 27 32 !!---------------------------------------------------------------------- 28 33 !! TOP 1.0 , LOCEAN-IPSL (2005) 29 !! $ Id$30 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt34 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcldf_iso_zps.F90,v 1.10 2006/09/12 11:10:14 opalod Exp $ 35 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 31 36 !!---------------------------------------------------------------------- 32 37 … … 66 71 !! Update tra arrays with the before along level biharmonic 67 72 !! mixing trend. 68 !! Save in trtrd arrays the trends if 'key_trc_diatrd' defined 69 !! 70 !! History : 71 !! ! 94-08 (G. Madec, M. Imbard) 72 !! ! 97-05 (G. Madec) split into traldf and trazdf 73 !! 8.5 ! 02-08 (G. Madec) Free form, F90 74 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers 73 !! Save the trends if 'key_trdmld_trc' defined 75 74 !!---------------------------------------------------------------------- 76 !! * Modules used77 75 USE oce_trc , zftu => ua, & ! use ua as workspace 78 76 & zfsu => va ! use va as workspace 79 80 !! * Arguments 77 !! 81 78 INTEGER, INTENT( in ) :: kt ! ocean time-step index 82 83 !! * Local declarations84 79 INTEGER :: ji, jj, jk,jn ! dummy loop indices 85 80 INTEGER :: iku, ikv ! temporary integer 86 81 REAL(wp) :: & 87 82 zabe1, zabe2, zcof1, zcof2, & ! temporary scalars 88 zmsku, zmskv, zbtr, ztra 83 zmsku, zmskv, zbtr, ztra, & 84 ztagu, ztagv 89 85 90 86 REAL(wp), DIMENSION(jpi,jpj) :: & … … 96 92 #if defined key_trcldf_eiv 97 93 REAL(wp), DIMENSION(jpi,jpj) :: & 98 zftug, zftvg ! temporary workspace99 94 zftug, zftvg ! temporary workspace 95 REAL(wp) :: z_hdivn_x, z_hdivn_y 100 96 REAL(wp) :: & 101 97 zuwk, zvwk, & 102 98 zuwk1, zvwk1, & 103 99 zcg1,zcg2 104 105 #if defined key_trc_diatrd106 REAL(wp) :: &107 ztagu, ztagv108 #endif109 110 100 #endif 111 101 CHARACTER (len=22) :: charout 102 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 103 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd_xei 104 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd_yei 112 105 !!---------------------------------------------------------------------- 113 106 … … 122 115 ENDIF 123 116 124 DO jn = 1, jptra 125 126 #if defined key_trcldf_eiv && key_trc_diatrd 127 ztagu = 0.e0 128 ztagv = 0.e0 129 #endif 117 IF( l_trdtrc ) THEN 118 ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 119 # if defined key_trcldf_eiv 120 ALLOCATE( ztrtrd_xei(jpi,jpj,jpk) ) 121 ALLOCATE( ztrtrd_yei(jpi,jpj,jpk) ) 122 # endif 123 ENDIF 124 125 ! ! =========== 126 DO jn = 1, jptra ! tracer loop 127 ! ! =========== 128 !CDIR COLLAPSE 129 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 130 131 ztagu = 0.e0 ; ztagv = 0.e0 130 132 131 133 ! Horizontal passive tracer gradient … … 164 166 ENDIF 165 167 166 167 168 ! 2. Horizontal fluxes 168 169 ! -------------------- … … 174 175 175 176 zmsku = 1. / MAX( tmask(ji+1,jj,jk ) + tmask(ji,jj,jk+1) & 176 + tmask(ji+1,jj,jk+1) + tmask(ji,jj,jk ), 1. )177 & + tmask(ji+1,jj,jk+1) + tmask(ji,jj,jk ), 1. ) 177 178 178 179 zmskv = 1. / MAX( tmask(ji,jj+1,jk ) + tmask(ji,jj,jk+1) & 179 + tmask(ji,jj+1,jk+1) + tmask(ji,jj,jk ), 1. )180 & + tmask(ji,jj+1,jk+1) + tmask(ji,jj,jk ), 1. ) 180 181 181 182 zcof1 = -fsahtru(ji,jj,jk) * e2u(ji,jj) * uslp(ji,jj,jk) * zmsku … … 183 184 184 185 zftu(ji,jj,jk) = umask(ji,jj,jk) * ( zabe1 * zgtbu(ji,jj,jk) & 185 &+ zcof1 * ( zdkt (ji+1,jj) + zdk1t(ji,jj) &186 &+ zdk1t(ji+1,jj) + zdkt (ji,jj) ) )186 & + zcof1 * ( zdkt (ji+1,jj) + zdk1t(ji,jj) & 187 & + zdk1t(ji+1,jj) + zdkt (ji,jj) ) ) 187 188 zftv(ji,jj,jk) = vmask(ji,jj,jk) * ( zabe2 * zgtbv(ji,jj,jk) & 188 &+ zcof2 * ( zdkt (ji,jj+1) + zdk1t(ji,jj) &189 &+ zdk1t(ji,jj+1) + zdkt (ji,jj) ) )189 & + zcof2 * ( zdkt (ji,jj+1) + zdk1t(ji,jj) & 190 & + zdk1t(ji,jj+1) + zdkt (ji,jj) ) ) 190 191 END DO 191 192 END DO 192 193 193 194 # if defined key_trcldf_eiv 194 ! ---------------------------------------! 195 ! Eddy induced vertical advective fluxes ! 196 ! ---------------------------------------! 195 196 ! ... Eddy induced horizontal advective fluxes 197 197 DO jj = 1, jpjm1 198 198 DO ji = 1, fs_jpim1 ! vector opt. … … 219 219 # endif 220 220 221 ! II.4Second derivative (divergence) and add to the general trend222 ! -------------------------------------------------------------- --221 ! 3. Second derivative (divergence) and add to the general trend 222 ! -------------------------------------------------------------- 223 223 224 224 DO jj = 2 , jpjm1 … … 242 242 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),4) = trtrd(ji,jj,jk,ikeep(jn),4) - ztagu 243 243 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),5) = trtrd(ji,jj,jk,ikeep(jn),5) - ztagv 244 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),7) = ztagu 245 IF (luttrd(jn)) trtrd (ji,jj,jk,ikeep(jn),8) = ztagv 246 END DO 247 END DO 248 # endif 249 #endif 244 END DO 245 END DO 246 # endif 247 #endif 248 250 249 ! ! =============== 251 250 END DO ! End of slab 252 251 ! ! =============== 253 END DO 254 255 IF(ln_ctl) THEN ! print mean trends (used for debugging) 252 253 ! 4. Save the horizontal diffusive and advective (eiv) trends for diagnostics 254 ! --------------------------------------------------------------------------- 255 !CDIR BEGIN COLLAPSE 256 IF( l_trdtrc ) THEN 257 258 ! 4.1) Compute the eiv ZONAL & MERIDIONAL advective trends 259 260 # if defined key_trcldf_eiv 261 ! ! =============== 262 DO jk = 1, jpkm1 ! Horizontal slab 263 ! ! =============== 264 265 DO jj = 1, jpjm1 266 DO ji = 1, fs_jpim1 ! vector opt. 267 zuwk = ( wslpi(ji,jj,jk ) + wslpi(ji+1,jj ,jk ) ) * fsaeitru(ji,jj,jk ) * umask(ji,jj,jk ) 268 zuwk1= ( wslpi(ji,jj,jk+1) + wslpi(ji+1,jj ,jk+1) ) * fsaeitru(ji,jj,jk+1) * umask(ji,jj,jk+1) 269 zvwk = ( wslpj(ji,jj,jk ) + wslpj(ji ,jj+1,jk ) ) * fsaeitrv(ji,jj,jk ) * vmask(ji,jj,jk ) 270 zvwk1= ( wslpj(ji,jj,jk+1) + wslpj(ji ,jj+1,jk+1) ) * fsaeitrv(ji,jj,jk+1) * vmask(ji,jj,jk+1) 271 272 zcg1= -0.25 * e2u(ji,jj) * umask(ji,jj,jk) * ( zuwk-zuwk1 ) 273 zcg2= -0.25 * e1v(ji,jj) * vmask(ji,jj,jk) * ( zvwk-zvwk1 ) 274 275 zftug(ji,jj) = zcg1 * ( trb(ji+1,jj,jk,jn) + trb(ji,jj,jk,jn) ) 276 zftvg(ji,jj) = zcg2 * ( trb(ji,jj+1,jk,jn) + trb(ji,jj,jk,jn) ) 277 END DO 278 END DO 279 280 DO jj = 2 , jpjm1 281 DO ji = fs_2, fs_jpim1 ! vector opt. 282 283 zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 284 285 !-- Compute zonal & meridional divergences of the eiv field : 286 ! d_x[u_trc_eiv] = 1/(e1t*e2t*e3t) ( di[e2u*e3u u_trc_eiv] ) 287 ! d_y[v_trc_eiv] = 1/(e1t*e2t*e3t) ( dj[e1v*e3v v_trc_eiv] ) 288 ! N.B. This is only possible if key_diaeiv is switched on. 289 # if defined key_diaeiv 290 z_hdivn_x = ( e2u(ji ,jj) * fse3u(ji ,jj,jk) * u_trc_eiv(ji ,jj ,jk) & 291 & - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * u_trc_eiv(ji-1,jj ,jk) ) * zbtr 292 z_hdivn_y = ( e1v(ji, jj) * fse3v(ji,jj ,jk) * v_trc_eiv(ji, jj ,jk) & 293 & - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * v_trc_eiv(ji ,jj-1,jk) ) * zbtr 294 # else 295 z_hdivn_x = 0.e0 ; z_hdivn_y = 0.e0 296 # endif 297 !-- Compute the zonal advective trends associated with eiv 298 ztrtrd_xei(ji,jj,jk) = zbtr * ( zftug(ji,jj) - zftug(ji-1,jj ) ) & 299 & - trn(ji,jj,jk,jn) * z_hdivn_x 300 301 !-- Compute the merid. advective trends associated with eiv 302 ztrtrd_yei(ji,jj,jk) = zbtr * ( zftvg(ji,jj) - zftvg(ji ,jj-1) ) & 303 & - trn(ji,jj,jk,jn) * z_hdivn_y 304 305 END DO 306 END DO 307 ! ! =============== 308 END DO ! End of slab 309 ! ! =============== 310 # else 311 ztrtrd_xei(:,:,:) = 0.e0 312 ztrtrd_yei(:,:,:) = 0.e0 313 # endif 314 ! 4.2) Substract the eddy induced velocity 315 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) - ztrtrd_xei(:,:,:) - ztrtrd_yei(:,:,:) 316 317 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd , jn, jptrc_trd_ldf, kt ) 318 # if defined key_trcldf_eiv 319 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd_xei, jn, jptrc_trd_xei, kt ) 320 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd_yei, jn, jptrc_trd_yei, kt ) 321 # endif 322 323 ENDIF 324 !CDIR END 325 ! ! =========== 326 END DO ! tracer loop 327 ! ! =========== 328 329 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 256 330 WRITE(charout, FMT="('ldf - iso/zps')") 257 CALL prt_ctl_trc_info( charout)258 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')331 CALL prt_ctl_trc_info( charout ) 332 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd' ) 259 333 ENDIF 260 334 -
trunk/NEMO/TOP_SRC/TRP/trcldf_lap.F90
r1152 r1175 1 1 MODULE trcldf_lap 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trcldf_lap *** 4 4 !! Ocean passive tracers: horizontal component of the lateral tracer mixing trend 5 !!============================================================================== 5 !!====================================================================== 6 !! History : 1.0 ! 87-06 (P. Andrich, D. L Hostis) Original code 7 !! ! 91-11 (G. Madec) 8 !! ! 95-02 (M. Levy) passive tracers 9 !! ! 95-11 (G. Madec) suppress volumetric scale factors 10 !! ! 96-01 (G. Madec) statement function for e3 11 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 12 !! 9.0 ! 04-03 (C. Ethe) passive tracer 13 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 14 !!---------------------------------------------------------------------- 6 15 #if defined key_top 7 !!----------------------------------------------------------------------8 !! 'key_top' TOP models9 16 !!---------------------------------------------------------------------- 10 17 !! trc_ldf_lap : update the tracer trend with the horizontal diffusion … … 14 21 USE trp_trc ! ocean passive tracers variables 15 22 USE prtctl_trc ! Print control for debbuging 23 USE trdmld_trc 24 USE trdmld_trc_oce 16 25 17 26 IMPLICIT NONE … … 25 34 !!---------------------------------------------------------------------- 26 35 !! TOP 1.0 , LOCEAN-IPSL (2005) 27 !! $ Id$28 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt36 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcldf_lap.F90,v 1.10 2006/09/12 11:10:14 opalod Exp $ 37 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 29 38 !!---------------------------------------------------------------------- 30 39 … … 53 62 !! ** Action : - Update tra arrays with the before iso-level 54 63 !! harmonic mixing trend. 55 !! - Save the trends in trtrd ('key_trc_diatrd') 56 !! 57 !! History : 58 !! 1.0 ! 87-06 (P. Andrich, D. L Hostis) Original code 59 !! ! 91-11 (G. Madec) 60 !! ! 95-02 (M. Levy) passive tracers 61 !! ! 95-11 (G. Madec) suppress volumetric scale factors 62 !! ! 96-01 (G. Madec) statement function for e3 63 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 64 !! 9.0 ! 04-03 (C. Ethe) passive tracer 64 !! - Save the trends ('key_trdmld_trc') 65 65 !!---------------------------------------------------------------------- 66 66 USE oce_trc , ztu => ua, & ! use ua as workspace 67 67 & ztv => va ! use va as workspace 68 68 69 !! * Arguments70 69 INTEGER, INTENT( in ) :: kt ! ocean time-step index 71 70 72 71 !! * Local save 73 72 REAL(wp), DIMENSION(jpi,jpj), SAVE :: & 74 73 ze1ur, ze2vr, zbtr2 ! scale factor coefficients 75 74 76 !! * Local declarations 77 INTEGER :: ji, jj, jk,jn ! dummy loop indices 75 INTEGER :: ji, jj, jk, jn ! dummy loop indices 78 76 REAL(wp) :: & 79 zabe1, zabe2, zbtr ! temporary scalars77 zabe1, zabe2, zbtr ! temporary scalars 80 78 81 79 REAL(wp) :: & 82 ztra, ztrax, ztray ! workspace80 ztra, ztrax, ztray ! workspace 83 81 CHARACTER (len=22) :: charout 82 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 84 83 !!---------------------------------------------------------------------- 85 84 … … 92 91 zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) ) 93 92 ENDIF 94 95 DO jn = 1, jptra 93 94 IF( l_trdtrc ) THEN 95 ! STOP 'trcldf_lap: this was never validated, please comment this line to proceed...' 96 ENDIF 97 98 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 99 100 ! ! =========== 101 DO jn = 1, jptra ! tracer loop 102 ! ! =========== 103 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) 96 104 97 105 ! ! ============= … … 99 107 ! ! ============= 100 108 ! 1. First derivative (gradient) 101 ! ------------------- 109 ! ------------------------------ 102 110 DO jj = 1, jpjm1 103 111 DO ji = 1, fs_jpim1 ! vector opt. … … 116 124 117 125 ! 2. Second derivative (divergence) 118 ! -------------------- 126 ! --------------------------------- 119 127 DO jj = 2, jpjm1 120 128 DO ji = fs_2, fs_jpim1 ! vector opt. … … 130 138 ! add it to the general tracer trends 131 139 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztrax + ztray 132 133 140 #if defined key_trc_diatrd 134 141 ! save the horizontal diffusive trends … … 136 143 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),5) = ztray 137 144 #endif 145 138 146 END DO 139 147 END DO … … 141 149 END DO ! End of slab 142 150 ! ! ============= 151 IF( l_trdtrc ) THEN 152 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 153 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_ldf, kt ) ! trends diags 154 END IF 155 ! ! =========== 156 END DO ! tracer loop 157 ! ! =========== 143 158 144 END DO159 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 145 160 146 IF(ln_ctl) THEN! print mean trends (used for debugging)161 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 147 162 WRITE(charout, FMT="('ldf - lap')") 148 CALL prt_ctl_trc_info( charout)149 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')163 CALL prt_ctl_trc_info( charout ) 164 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 150 165 ENDIF 151 166 -
trunk/NEMO/TOP_SRC/TRP/trcnxt.F90
r1152 r1175 4 4 !! Ocean passive tracers: time stepping on passives tracers 5 5 !!====================================================================== 6 !!====================================================================== 7 !! History : 7.0 ! 91-11 (G. Madec) Original code 8 !! ! 93-03 (M. Guyon) symetrical conditions 9 !! ! 95-02 (M. Levy) passive tracers 10 !! ! 96-02 (G. Madec & M. Imbard) opa release 8.0 11 !! 8.0 ! 96-04 (A. Weaver) Euler forward step 12 !! 8.2 ! 99-02 (G. Madec, N. Grima) semi-implicit pressure grad. 13 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 14 !! ! 02-11 (C. Talandier, A-M Treguier) Open boundaries 15 !! 9.0 ! 04-03 (C. Ethe) passive tracers 16 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 17 !!---------------------------------------------------------------------- 6 18 #if defined key_top 7 19 !!---------------------------------------------------------------------- … … 16 28 USE trctrp_lec ! pasive tracers transport 17 29 USE prtctl_trc ! Print control for debbuging 30 USE trdmld_trc 31 USE trdmld_trc_oce 18 32 USE agrif_top_update 19 33 USE agrif_top_interp … … 55 69 !! 56 70 !! ** Action : - update trb, trn 57 !!58 !! History :59 !! 7.0 ! 91-11 (G. Madec) Original code60 !! ! 93-03 (M. Guyon) symetrical conditions61 !! ! 95-02 (M. Levy) passive tracers62 !! ! 96-02 (G. Madec & M. Imbard) opa release 8.063 !! 8.0 ! 96-04 (A. Weaver) Euler forward step64 !! 8.2 ! 99-02 (G. Madec, N. Grima) semi-implicit pressure grad.65 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module66 !! ! 02-11 (C. Talandier, A-M Treguier) Open boundaries67 !! 9.0 ! 04-03 (C. Ethe) passive tracers68 71 !!---------------------------------------------------------------------- 69 72 !! * Arguments 73 USE oce_trc, ONLY : ztrtrd => ua ! use ua as a 3D workspace 70 74 INTEGER, INTENT( in ) :: kt ! ocean time-step index 71 75 !! * Local declarations … … 130 134 END DO 131 135 END DO 136 IF( l_trdtrc ) ztrtrd(:,:,:) = 0.e0 ! no trend 132 137 ELSE 138 IF( l_trdtrc ) THEN ! Asselin trend 139 DO jj = 1, jpj 140 DO ji = 1, jpi 141 ztrtrd(ji,jj,jk) = atfp * ( trb(ji,jj,jk,jn) - 2*trn(ji,jj,jk,jn) + tra(ji,jj,jk,jn) ) 142 END DO 143 END DO 144 ENDIF 145 133 146 DO jj = 1, jpj 134 147 DO ji = 1, jpi … … 139 152 END DO 140 153 ENDIF 141 142 ELSE143 ! case of smolar scheme or muscl 154 ELSE ! >> EULER-FORWARD schemes (SMOLAR, MUSCL) 155 IF( l_trdtrc ) ztrtrd(:,:,:) = 0.e0 ! no trend 156 144 157 DO jj = 1, jpj 145 158 DO ji = 1, jpi … … 154 167 END DO ! End of slab 155 168 ! ! =============== 156 END DO 169 170 IF( l_trdtrc ) THEN ! trends 171 DO jk = 1, jpk 172 zfact = 2. * rdttra(jk) * FLOAT(ndttrc) 173 ztrtrd(:,:,jk) = ztrtrd(:,:,jk) / zfact ! n.b. ztrtrd=0 in Euler-forward case 174 END DO 175 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_atf, kt ) 176 ENDIF 177 ! ! =========== 178 END DO ! tracer loop 179 ! ! =========== 157 180 158 181 IF(ln_ctl) THEN ! print mean trends (used for debugging) -
trunk/NEMO/TOP_SRC/TRP/trcrad.F90
r1146 r1175 14 14 !!---------------------------------------------------------------------- 15 15 USE oce_trc ! ocean dynamics and tracers variables 16 USE trp_trc ! ocean passive tracers variables 16 USE trp_trc ! ocean passive tracers variables 17 USE trctrp_lec , ONLY : ln_trcadv_tvd, ln_trcadv_cen2 18 USE trdmld_trc 19 USE trdmld_trc_oce 17 20 USE lib_mpp 18 21 USE prtctl_trc ! Print control for debbuging … … 58 61 ENDIF 59 62 60 IF( lk_cfc ) CALL trc_rad_sms( trb, trn, jp_cfc0, jp_cfc1 ) ! CFC model61 IF( lk_lobster ) CALL trc_rad_sms( trb, trn, jp_lob0, jp_lob1, cpreserv='Y' ) ! LOBSTER model62 IF( lk_pisces ) CALL trc_rad_sms( trb, trn, jp_pcs0, jp_pcs1, cpreserv='Y' ) ! PISCES model63 IF( lk_my_trc ) CALL trc_rad_sms( trb, trn, jp_myt0, jp_myt1 ) ! MY_TRC model63 IF( lk_cfc ) CALL trc_rad_sms( kt, trb, trn, jp_cfc0, jp_cfc1 ) ! CFC model 64 IF( lk_lobster ) CALL trc_rad_sms( kt, trb, trn, jp_lob0, jp_lob1, cpreserv='Y' ) ! LOBSTER model 65 IF( lk_pisces ) CALL trc_rad_sms( kt, trb, trn, jp_pcs0, jp_pcs1, cpreserv='Y' ) ! PISCES model 66 IF( lk_my_trc ) CALL trc_rad_sms( kt, trb, trn, jp_myt0, jp_myt1 ) ! MY_TRC model 64 67 65 68 … … 73 76 END SUBROUTINE trc_rad 74 77 75 SUBROUTINE trc_rad_sms( ptrb, ptrn, jp_sms0, jp_sms1, cpreserv )78 SUBROUTINE trc_rad_sms( kt, ptrb, ptrn, jp_sms0, jp_sms1, cpreserv ) 76 79 !!----------------------------------------------------------------------------- 77 80 !! *** ROUTINE trc_rad_sms *** … … 90 93 !!-------------------------------------------------------------------------------- 91 94 !! Arguments 95 INTEGER, INTENT( in ) :: kt ! ocean time-step index 92 96 INTEGER , INTENT( in ) :: & 93 97 jp_sms0, & !: First index of the passive tracer model … … 104 108 REAL(wp) :: zvolk, ztrcorb, ztrmasb ! temporary scalars 105 109 REAL(wp) :: zcoef, ztrcorn, ztrmasn ! " " 106 107 !!---------------------------------------------------------------------- 108 110 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrdb ! workspace arrays 111 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrdn ! workspace arrays 112 LOGICAL :: lldebug = .FALSE. 113 114 !!---------------------------------------------------------------------- 115 116 IF( l_trdtrc ) THEN 117 ! 118 ALLOCATE( ztrtrdb(jpi,jpj,jpk) ) 119 ALLOCATE( ztrtrdn(jpi,jpj,jpk) ) 120 ! 121 ENDIF 109 122 110 123 IF( PRESENT( cpreserv ) ) THEN ! total tracer concentration is preserved 111 124 112 125 DO jn = jp_sms0, jp_sms1 113 114 ztrcorb = 0.e0 115 ztrmasb = 0.e0 116 ztrcorn = 0.e0 117 ztrmasn = 0.e0 126 ! ! =========== 127 ztrcorb = 0.e0 ; ztrmasb = 0.e0 128 ztrcorn = 0.e0 ; ztrmasn = 0.e0 129 130 !CDIR COLLAPSE 131 IF( l_trdtrc ) THEN 132 ztrtrdb(:,:,:) = ptrb(:,:,:,jn) ! save input trb for trend computation 133 ztrtrdn(:,:,:) = ptrn(:,:,:,jn) ! save input trn for trend computation 134 ENDIF 135 118 136 119 137 DO jk = 1, jpkm1 … … 159 177 ENDIF 160 178 ! 179 IF( l_trdtrc ) THEN 180 ! 181 ztrtrdb(:,:,:) = ( ptrb(:,:,:,jn) - ztrtrdb(:,:,:) ) / (2.*rdt) 182 ztrtrdn(:,:,:) = ( ptrn(:,:,:,jn) - ztrtrdn(:,:,:) ) / (2.*rdt) 183 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrdb, jn, jptrc_trd_radb, kt ) ! Asselin-like trend handling 184 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrdn, jn, jptrc_trd_radn, kt ) ! standard trend handling 185 ! 186 ENDIF 187 161 188 END DO 162 189 ! … … 176 203 177 204 ENDIF 205 206 IF( l_trdtrc ) DEALLOCATE( ztrtrdb, ztrtrdn ) 178 207 179 208 END SUBROUTINE trc_rad_sms -
trunk/NEMO/TOP_SRC/TRP/trcsbc.F90
r1152 r1175 3 3 !! *** MODULE trcsbc *** 4 4 !! Ocean passive tracers: surface boundary condition 5 !!====================================================================== 6 !! History : 8.2 ! 98-10 (G. Madec, G. Roullet, M. Imbard) Original code 7 !! 8.2 ! 01-02 (D. Ludicone) sea ice and free surface 8 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module 9 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers 10 !! ! 06-08 (C. Deltel) Diagnose ML trends for passive tracers 5 11 !!============================================================================== 6 12 #if defined key_top … … 14 20 USE trp_trc ! ocean passive tracers variables 15 21 USE prtctl_trc ! Print control for debbuging 16 22 USE trdmld_trc 23 USE trdmld_trc_oce 17 24 18 25 IMPLICIT NONE … … 52 59 !! with the tracer surface boundary condition 53 60 !! 54 !! History :55 !! 8.2 ! 98-10 (G. Madec, G. Roullet, M. Imbard) Original code56 !! 8.2 ! 01-02 (D. Ludicone) sea ice and free surface57 !! 8.5 ! 02-06 (G. Madec) F90: Free form and module58 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers59 61 !!---------------------------------------------------------------------- 60 62 !! * Arguments … … 64 66 INTEGER :: ji, jj, jn ! dummy loop indices 65 67 REAL(wp) :: ztra, zsrau, zse3t ! temporary scalars 68 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 66 69 CHARACTER (len=22) :: charout 67 70 !!---------------------------------------------------------------------- … … 73 76 ENDIF 74 77 78 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 79 75 80 ! 0. initialization 76 81 zsrau = 1. / rauw 77 82 IF( .NOT. ln_sco ) zse3t = 1. / fse3t(1,1,1) 78 #if defined key_trc_diatrd79 DO jn = 1, jptra80 IF (luttrd(jn)) trtrd(:,:,:,ikeep(jn),jpdiatrc) = 0.081 END DO82 #endif83 83 84 84 DO jn = 1, jptra 85 85 ! 1. Concentration dillution effect on tra 86 !CDIR COLLAPSE 87 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 88 86 89 DO jj = 2, jpj 87 90 DO ji = fs_2, fs_jpim1 ! vector opt. … … 92 95 ! add the trend to the general tracer trend 93 96 tra(ji,jj,1,jn) = tra(ji,jj,1,jn) + ztra 94 #if defined key_trc_diatrd95 IF (luttrd(jn)) trtrd(ji,jj,1,ikeep(jn),jpdiatrc) = trtrd(ji,jj,1,jn,jpdiatrc) + ztra96 #endif97 97 END DO 98 98 END DO 99 99 100 END DO 100 IF( l_trdtrc ) THEN 101 !CDIR COLLAPSE 102 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 103 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_sbc, kt) 104 END IF 105 106 ! ! =========== 107 END DO ! tracer loop 108 ! ! =========== 109 110 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 111 101 112 102 113 IF(ln_ctl) THEN ! print mean trends (used for debugging) -
trunk/NEMO/TOP_SRC/TRP/trcstp.F90
r1152 r1175 16 16 USE trcdia 17 17 USE trcrst 18 USE trdmld_trc_oce 19 USE trdmld_trc 20 USE trdmld_trc_rst 18 21 19 22 IMPLICIT NONE … … 56 59 ENDIF 57 60 58 CALL trc_rst_opn( kt ) ! Open tracer restart file61 CALL trc_rst_opn( kt ) ! Open tracer restart file 59 62 60 CALL trc_sms( kt ) ! tracers: sink and source63 CALL trd_mld_trc_rst_opn( kt ) ! Open restart file for trends 61 64 62 CALL trc_trp( kt ) ! transport of passive tracers65 CALL trc_sms( kt ) ! tracers: sink and source 63 66 64 IF( lrst_trc ) CALL trc_rst_wri( kt ) ! write tracer restart file67 CALL trc_trp( kt ) ! transport of passive tracers 65 68 66 CALL trc_dia( kt, kindic ) ! diagnostics69 IF( lrst_trc ) CALL trc_rst_wri( kt ) ! write tracer restart file 67 70 71 CALL trc_dia( kt, kindic ) ! diagnostics 72 73 IF( lk_trdmld_trc ) CALL trd_mld_trc( kt ) ! trends: Mixed-layer 68 74 69 75 END SUBROUTINE trc_stp -
trunk/NEMO/TOP_SRC/TRP/trczdf_exp.F90
r1152 r1175 4 4 !! Ocean passive tracers: vertical component of the tracer mixing trend using 5 5 !! an explicit time-stepping (time spllitting scheme) 6 !!============================================================================== 6 !!====================================================================== 7 !! History : 6.0 ! 90-10 (B. Blanke) Original code 8 !! 7.0 ! 91-11 (G. Madec) 9 !! ! 92-06 (M. Imbard) correction on tracer trend loops 10 !! ! 96-01 (G. Madec) statement function for e3 11 !! ! 97-05 (G. Madec) vertical component of isopycnal 12 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 13 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 14 !! ! 00-05 (MA Foujols) add lbc for tracer trends 15 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 16 !! ! avt multiple correction 17 !! ! 00-08 (G. Madec) double diffusive mixing 18 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 19 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 20 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 21 !!---------------------------------------------------------------------- 7 22 #if defined key_top 8 23 !!---------------------------------------------------------------------- … … 17 32 USE trctrp_lec ! passive tracers transport 18 33 USE prtctl_trc ! Print control for debbuging 34 USE trdmld_trc 35 USE trdmld_trc_oce 19 36 20 37 IMPLICIT NONE … … 56 73 !! 57 74 !! ** Action : - Update tra with the before vertical diffusion trend 58 !! - Save the trends in trtrd ('key_trc_diatrd')75 !! - Save the trends ('key_trdmld_trc') 59 76 !! 60 !! History :61 !! 6.0 ! 90-10 (B. Blanke) Original code62 !! 7.0 ! 91-11 (G. Madec)63 !! ! 92-06 (M. Imbard) correction on tracer trend loops64 !! ! 96-01 (G. Madec) statement function for e365 !! ! 97-05 (G. Madec) vertical component of isopycnal66 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord67 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation68 !! ! 00-05 (MA Foujols) add lbc for tracer trends69 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress70 !! ! avt multiple correction71 !! ! 00-08 (G. Madec) double diffusive mixing72 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module73 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers74 77 !!--------------------------------------------------------------------- 78 USE oce_trc, ONLY : ztrtrd => ua ! use ua as 3D workspace 75 79 !! * Arguments 76 80 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 93 97 ENDIF 94 98 99 IF( l_trdtrc ) THEN 100 STOP 'trczdf_exp: this was never validated, please comment this line to proceed...' 101 ENDIF 102 95 103 ! 0. Local constant initialization 96 104 ! -------------------------------- … … 110 118 111 119 DO jn = 1, jptra 112 120 ! 121 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 113 122 ! ! =============== 114 123 DO jj = 2, jpjm1 ! Vertical slab … … 163 172 END DO ! End of slab 164 173 ! ! =============== 165 END DO 174 IF( l_trdtrc ) THEN 175 ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:) 176 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_zdf, kt ) 177 END IF 178 179 ! ! =========== 180 END DO ! tracer loop 181 ! ! =========== 166 182 167 183 IF(ln_ctl) THEN ! print mean trends (used for debugging) -
trunk/NEMO/TOP_SRC/TRP/trczdf_imp.F90
r1152 r1175 4 4 !! Ocean passive tracers: vertical component of the tracer mixing trend 5 5 !!============================================================================== 6 !! History : 6.0 ! 90-10 (B. Blanke) Original code 7 !! 7.0 ! 91-11 (G. Madec) 8 !! ! 92-06 (M. Imbard) correction on tracer trend loops 9 !! ! 96-01 (G. Madec) statement function for e3 10 !! ! 97-05 (G. Madec) vertical component of isopycnal 11 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 12 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 13 !! ! 00-05 (MA Foujols) add lbc for tracer trends 14 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 15 !! ! avt multiple correction 16 !! ! 00-08 (G. Madec) double diffusive mixing 17 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 18 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 19 !! ! 07-02 (C. Deltel) Diagnose ML trends for passive tracers 20 !!---------------------------------------------------------------------- 6 21 #if defined key_top 7 22 !!---------------------------------------------------------------------- … … 16 31 USE trctrp_lec ! passive tracers transport 17 32 USE prtctl_trc 33 USE trdmld_trc 34 USE trdmld_trc_oce 18 35 19 36 IMPLICIT NONE … … 55 72 !! 56 73 !! ** Action : - Update tra with the before vertical diffusion trend 57 !! - save the trends in trtrd ('key_trc_diatrd') 58 !! 59 !! History : 60 !! 6.0 ! 90-10 (B. Blanke) Original code 61 !! 7.0 ! 91-11 (G. Madec) 62 !! ! 92-06 (M. Imbard) correction on tracer trend loops 63 !! ! 96-01 (G. Madec) statement function for e3 64 !! ! 97-05 (G. Madec) vertical component of isopycnal 65 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 66 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 67 !! ! 00-05 (MA Foujols) add lbc for tracer trends 68 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 69 !! ! avt multiple correction 70 !! ! 00-08 (G. Madec) double diffusive mixing 71 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 72 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 74 !! - save the trends 75 !! 73 76 !!--------------------------------------------------------------------- 77 USE oce_trc, ONLY : ztrtrd => ua ! use ua as 3D workspace 78 !! 74 79 !! * Arguments 75 80 INTEGER, INTENT( in ) :: kt ! ocean time-step index … … 81 86 zwx, zwy, zwt ! ??? 82 87 REAL(wp) :: ztra ! temporary scalars 83 84 88 REAL(wp), DIMENSION(jpi,jpj,jpk,jptra) :: & 85 89 ztrd … … 105 109 rdttrc(:) = rdttra(:) * FLOAT(ndttrc) 106 110 ENDIF 107 108 DO jn = 1 , jptra 111 ! ! =========== 112 DO jn = 1, jptra ! tracer loop 113 ! ! =========== 114 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! ??? validation needed 109 115 110 116 ! Initialisation … … 208 214 END DO 209 215 210 211 216 #if defined key_trc_diatrd 212 217 ! Compute and save the vertical diffusive of tracers trends … … 230 235 END DO 231 236 # endif 232 #endif 237 #endif 238 233 239 ! Save the masked passive tracer after in tra 234 240 ! (c a u t i o n: tracer not its trend, Leap-frog scheme done … … 241 247 END DO 242 248 END DO 249 250 IF( l_trdtrc ) THEN ! trends 251 DO jk = 1, jpkm1 252 ztrtrd(:,:,jk) = ( ( tra(:,:,jk,jn) - trb(:,:,jk,jn) ) / rdttrc(jk) ) - ztrtrd(:,:,jk) 253 END DO 254 IF (luttrd(jn)) CALL trd_mod_trc(ztrtrd, jn, jptrc_trd_zdf, kt) 255 END IF 243 256 244 257 IF(ln_ctl) THEN ! print mean trends (used for debugging) … … 253 266 ENDIF 254 267 255 END DO 268 ! ! =========== 269 END DO ! tracer loop 270 ! ! =========== 256 271 257 272 IF(ln_ctl) THEN ! print mean trends (used for debugging) -
trunk/NEMO/TOP_SRC/TRP/trczdf_iso.F90
r1152 r1175 4 4 !! Ocean passive tracers: vertical component of the tracer mixing trend 5 5 !!============================================================================== 6 !! History : 7.0 ! 91-11 (G. Madec) Original code 7 !! ! 92-06 (M. Imbard) correction on tracer trend loops 8 !! ! 96-01 (G. Madec) statement function for e3 9 !! ! 97-05 (G. Madec) vertical component of isopycnal 10 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 11 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 12 !! ! 00-05 (MA Foujols) add lbc for tracer trends 13 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 14 !! ! avt multiple correction 15 !! ! 00-08 (G. Madec) double diffusive mixing 16 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 17 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 18 !!---------------------------------------------------------------------- 6 19 #if defined key_top && ( defined key_ldfslp || defined key_esopa ) 7 20 !!---------------------------------------------------------------------- … … 18 31 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 19 32 USE trctrp_lec ! passive tracers transport 33 USE trdmld_trc 34 USE trdmld_trc_oce 20 35 USE prtctl_trc ! Print control for debbuging 21 36 … … 94 109 !! (avs = zavs if lk_trc_zdfddm=T ) 95 110 !! 96 !! 'key_tr c_diatrd' defined: trend saved for futher diagnostics.111 !! 'key_trdmld_trc' defined: trend saved for futher diagnostics. 97 112 !! 98 113 !! macro-tasked on vertical slab (jj-loop) … … 100 115 !! ** Action : 101 116 !! Update tra arrays with the before vertical diffusion trend 102 !! Save in trtrd arrays the trends if 'key_trc_diatrd' defined 103 !! 104 !! History : 105 !! 7.0 ! 91-11 (G. Madec) Original code 106 !! ! 92-06 (M. Imbard) correction on tracer trend loops 107 !! ! 96-01 (G. Madec) statement function for e3 108 !! ! 97-05 (G. Madec) vertical component of isopycnal 109 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 110 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 111 !! ! 00-05 (MA Foujols) add lbc for tracer trends 112 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 113 !! ! avt multiple correction 114 !! ! 00-08 (G. Madec) double diffusive mixing 115 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 116 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 117 !! Save in trtrd arrays the trends if 'key_trdmld_trc' defined 117 118 !!--------------------------------------------------------------------- 118 119 !! * Modules used 119 USE oce_trc , & 120 zavs => va 120 USE oce_trc , ONLY : zavs => va, ztrtrd => ua 121 121 122 122 !! * Arguments … … 147 147 zcoeg3, & 148 148 zuwk, zvwk, & 149 zuwki, zvwki 149 zuwki, zvwki, z_hdivn_z 150 150 #endif 151 151 CHARACTER (len=22) :: charout 152 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrtrd_tmp 152 153 !!--------------------------------------------------------------------- 153 154 … … 160 161 #endif 161 162 ENDIF 163 162 164 163 165 ! 0.0 Local constant initialization … … 183 185 184 186 DO jn = 1, jptra 187 188 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 185 189 186 190 ztavg = 0.e0 … … 338 342 ztav = ( ztfw(ji,jk) - ztfw(ji,jk+1) ) * zbtr 339 343 tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztav 340 341 344 #if defined key_trc_diatrd 342 345 # if defined key_trcldf_eiv … … 344 347 ! WARNING trtrd(ji,jj,jk,6) used for vertical gent velocity trend 345 348 ! not for damping !!! 346 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn), 9) = ztavg349 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),6) = ztavg 347 350 # endif 348 351 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),6) = ztav - ztavg 349 352 #endif 353 350 354 END DO 351 355 END DO … … 353 357 END DO ! End of slab 354 358 ! ! =============== 359 ! II. Save the trends for diagnostics 360 ! =================================== 361 IF( l_trdtrc ) THEN 362 # if defined key_trcldf_eiv 363 364 ! II.1) Compute the eiv VERTICAL trend 365 DO jj = 2, jpjm1 366 DO jk = 1, jpkm1 367 DO ji = 2, jpim1 368 369 !-- Compute the eiv vertical divergence : 1/e3t ( dk[w_eiv] ) 370 ! N.B. This is only possible if key_diaeiv is switched on. 371 ! Else, the vertical eiv is not diagnosed, 372 ! so we can only store the flux form trend d_z ( T * w_eiv ) 373 ! instead of w_eiv * d_z( T ). Then, ONLY THE SUM of zonal, 374 ! meridional, and vertical trends are valid. 375 # if defined key_diaeiv 376 z_hdivn_z = ( 1./e3t(jk) ) * ( w_trc_eiv(ji,jj,jk) - w_trc_eiv(ji,jj,jk+1) ) 377 # else 378 z_hdivn_z = 0.e0 379 # endif 380 !-- Compute the vertical advective trend associated with eiv 381 zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 382 ztrtrd_tmp(ji,jj,jk) = ( ztfwg(ji,jk) - ztfwg(ji,jk+1) ) * zbtr & 383 & - trn(ji,jj,jk,jn) * z_hdivn_z 384 END DO 385 END DO 386 END DO 387 388 ! II.2) Save the vertical eiv trend 389 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd_tmp, jn, jptrc_trd_zei, kt ) 390 391 # endif 392 393 !-- Remove vert. eiv from the current up-to-date trend 394 ! N.B. ztrtrd_tmp is recycled for this purpose 395 ztrtrd_tmp(:,:,:) = ( tra(:,:,:,jn) - ztrtrd(:,:,:) ) - ztrtrd_tmp(:,:,:) 396 397 ! Save the new trends 398 ztrtrd(:,:,:) = tra(:,:,:,jn) 399 END IF 400 355 401 356 402 END DO … … 420 466 # endif 421 467 #endif 468 ! Compute and save the vertical diffusive of tracers trends 422 469 ! Save the masked passive tracer after in tra 423 470 ! (c a u t i o n: tracer not its trend, Leap-frog scheme done … … 431 478 END DO ! End of slab 432 479 ! ! =============== 480 481 ! IV. Save the trends for diagnostics 482 ! =================================== 483 IF( l_trdtrc ) THEN 484 ! deduce the full vertical diff. trend (except for vertical eiv advection) 485 #if defined key_trc_ldfiso 486 DO jk = 1, jpkm1 487 ztrtrd(:,:,jk) = ( (tra(:,:,jk,jn) - trb(:,:,jk,jn))/rdttrc(jk) ) - ztrtrd(:,:,jk) + ztrtrd_tmp(:,:,jk) 488 END DO 489 #else 490 DO jk = 1, jpkm1 491 ztrtrd(:,:,jk) = ( (tra(:,:,jk,jn) - trb(:,:,jk,jn))/rdttrc(jk) ) - ztrtrd(:,:,jk) 492 END DO 493 #endif 494 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_zdf, kt ) 495 496 END IF 433 497 434 498 END DO -
trunk/NEMO/TOP_SRC/TRP/trczdf_iso_vopt.F90
r1152 r1175 1 1 MODULE trczdf_iso_vopt 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE trczdf_iso_vopt *** 4 4 !! Ocean passive tracers: vertical component of the tracer mixing trend 5 !!============================================================================== 6 #if defined key_top && ( defined key_ldfslp || defined key_esopa ) 7 !!---------------------------------------------------------------------- 8 !! 'key_top' and TOP models 5 !!====================================================================== 6 !! History : 6.0 ! 90-10 (B. Blanke) Original code 7 !! 7.0 ! 91-11 (G. Madec) 8 !! ! 92-06 (M. Imbard) correction on tracer trend loops 9 !! ! 96-01 (G. Madec) statement function for e3 10 !! ! 97-05 (G. Madec) vertical component of isopycnal 11 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 12 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 13 !! ! 00-05 (MA Foujols) add lbc for tracer trends 14 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 15 !! ! avt multiple correction 16 !! ! 00-08 (G. Madec) double diffusive mixing 17 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 18 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 19 !! ! 06-08 (C. Deltel) Diagnose ML trends for passive tracer 20 !!---------------------------------------------------------------------- 21 #if defined key_top && ( defined key_ldfslp || defined key_esopa ) 22 !!---------------------------------------------------------------------- 9 23 !! 'key_ldfslp' rotation of the lateral mixing tensor 10 24 !!---------------------------------------------------------------------- … … 16 30 !! trc_zdf_zdf : 17 31 !!---------------------------------------------------------------------- 18 !! * Modules used 19 USE oce_trc ! ocean dynamics and tracers variables 20 USE trp_trc ! ocean passive tracers variables 21 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 USE trctrp_lec ! passive tracers transport 23 USE prtctl_trc ! Print control for debbuging 32 USE oce_trc ! ocean dynamics and tracers variables 33 USE trp_trc ! ocean passive tracers variables 34 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 35 USE trctrp_lec 36 USE prtctl_trc ! Print control for debbuging 37 USE trdmld_trc 38 USE trdmld_trc_oce 24 39 25 40 IMPLICIT NONE 26 41 PRIVATE 27 42 28 !! * Routine accessibility29 43 PUBLIC trc_zdf_iso_vopt ! routine called by step.F90 30 44 31 !! * Module variables 32 REAL(wp), DIMENSION(jpk) :: & 33 rdttrc ! vertical profile of 2 x time-step 45 REAL(wp), DIMENSION(jpk) :: rdttrc ! vertical profile of 2 x time-step 46 REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: ztrcavg ! workspace arrays 34 47 35 48 !! * Substitutions … … 37 50 !!---------------------------------------------------------------------- 38 51 !! TOP 1.0 , LOCEAN-IPSL (2005) 39 !! $ Id$40 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt52 !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trczdf_iso_vopt.F90,v 1.11 2007/02/21 12:55:33 opalod Exp $ 53 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 41 54 !!---------------------------------------------------------------------- 42 55 … … 50 63 !! ** Method : 51 64 !! ** Action : 52 !!53 !! History :54 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module55 !! 9.0 ! 04-03 (C. Ethe) adapted for passive tracers56 65 !!--------------------------------------------------------------------- 57 !! * Arguments58 66 INTEGER, INTENT( in ) :: kt ! ocean time-step index 59 67 CHARACTER (len=22) :: charout … … 69 77 ENDIF 70 78 79 IF( l_trdtrc ) THEN 80 ALLOCATE( ztrcavg(jpi,jpj,jpk,jptra) ) 81 !CDIR COLLAPSE 82 ztrcavg(:,:,:,:) = 0.e0 ! initialisation step 83 ENDIF 71 84 72 85 ! I. vertical extra-diagonal part of the rotated tensor 73 86 ! ----------------------------------------------------- 74 87 75 CALL trc_zdf_iso 76 77 IF( ln_ctl) THEN! print mean trends (used for debugging)88 CALL trc_zdf_iso( kt ) 89 90 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 78 91 WRITE(charout, FMT="('zdf - 1')") 79 CALL prt_ctl_trc_info( charout)80 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')92 CALL prt_ctl_trc_info( charout ) 93 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 81 94 ENDIF 82 95 … … 86 99 CALL trc_zdf_zdf( kt ) 87 100 88 IF( ln_ctl) THEN! print mean trends (used for debugging)101 IF( ln_ctl ) THEN ! print mean trends (used for debugging) 89 102 WRITE(charout, FMT="('zdf - 2')") 90 CALL prt_ctl_trc_info( charout)91 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm,clinfo2='trd')103 CALL prt_ctl_trc_info( charout ) 104 CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' ) 92 105 ENDIF 106 107 IF( l_trdtrc ) DEALLOCATE( ztrcavg ) 93 108 94 109 END SUBROUTINE trc_zdf_iso_vopt … … 135 150 !! 136 151 !! ** Action : - Update tra with before vertical diffusion trend 137 !! - Save the trend in trtrd ('key_trc_diatrd') 138 !! 139 !! History : 140 !! 6.0 ! 90-10 (B. Blanke) Original code 141 !! 7.0 ! 91-11 (G. Madec) 142 !! ! 92-06 (M. Imbard) correction on tracer trend loops 143 !! ! 96-01 (G. Madec) statement function for e3 144 !! ! 97-05 (G. Madec) vertical component of isopycnal 145 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 146 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 147 !! ! 00-05 (MA Foujols) add lbc for tracer trends 148 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 149 !! ! avt multiple correction 150 !! ! 00-08 (G. Madec) double diffusive mixing 151 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 152 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 152 !! - Save the trend in trtrd ('key_trdmld_trc') 153 153 !!--------------------------------------------------------------------- 154 !! * Modules used155 154 USE oce_trc, ONLY : zwd => ua, & ! ua, va used as 156 155 zws => va ! workspace 157 !! * Arguments158 156 INTEGER, INTENT( in ) :: kt ! ocean time-step index 159 160 !! * Local declarations 161 INTEGER :: ji, jj, jk,jn ! dummy loop indices 162 REAL(wp) :: & 163 zavi, zrhs ! temporary scalars 157 INTEGER :: ji, jj, jk, jn ! dummy loop indices 158 REAL(wp) :: zavi, zrhs ! temporary scalars 164 159 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 165 160 zwi, zwt, zavsi ! temporary workspace arrays 166 REAL(wp) :: ztra !temporary scalars161 REAL(wp) :: ztra ! temporary scalars 167 162 # if defined key_trc_diatrd 168 163 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztrd 169 164 # endif 165 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 170 166 !!--------------------------------------------------------------------- 171 167 … … 185 181 ENDIF 186 182 187 DO jn = 1, jptra 183 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 184 185 ! ! =========== 186 DO jn = 1, jptra ! tracer loop 187 ! ! =========== 188 188 189 zwd( 1 ,:,:)=0.e0 ; zwd(jpi,:,:)=0.e0 190 zws( 1 ,:,:)=0.e0 ; zws(jpi,:,:)=0.e0 191 zwi( 1 ,:,:)=0.e0 ; zwi(jpi,:,:)=0.e0 192 193 zwt( 1 ,:,:)=0.e0 ; zwt(jpi,:,:)=0.e0 194 zwt( :,:,1)=0.e0 ; zwt(:,:,jpk)= 0.e0 195 zavsi( 1 ,:,:)=0.e0 ; zavsi(jpi,:,:)=0.e0 196 zavsi( :,:,1)=0.e0 ; zavsi(:,:,jpk)=0.e0 189 !CDIR COLLAPSE 190 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 191 192 zwd ( 1, :, : ) = 0.e0 ; zwd ( jpi, :, : ) = 0.e0 193 zws ( 1, :, : ) = 0.e0 ; zws ( jpi, :, : ) = 0.e0 194 zwi ( 1, :, : ) = 0.e0 ; zwi ( jpi, :, : ) = 0.e0 195 zwt ( 1, :, : ) = 0.e0 ; zwt ( jpi, :, : ) = 0.e0 196 zwt ( :, :, 1 ) = 0.e0 ; zwt ( :, :, jpk ) = 0.e0 197 zavsi( 1, :, : ) = 0.e0 ; zavsi( jpi, :, : ) = 0.e0 198 zavsi( :, :, 1 ) = 0.e0 ; zavsi( :, :, jpk ) = 0.e0 197 199 198 200 # if defined key_trc_diatrd … … 224 226 225 227 226 ! II. 2Vertical diffusion on tracer227 ! --------------------------- ========228 ! II.1 Vertical diffusion on tracer 229 ! --------------------------------- 228 230 229 231 ! Rebuild the Matrix as avt /= avs … … 313 315 #if defined key_trc_diatrd 314 316 ! Compute and save the vertical diffusive passive tracer trends 315 # if defined key_trcldf_iso 317 # if defined key_trcldf_iso 316 318 DO jk = 1, jpkm1 317 319 DO jj = 2, jpjm1 … … 334 336 #endif 335 337 336 END DO 338 339 ! III. Save vertical trend assoc. with the vertical physics for diagnostics 340 ! ========================================================================= 341 IF( l_trdtrc ) THEN 342 343 ! III.1) Deduce the full vertical diff. trend (except for vertical eiv advection) 344 ! N.B. tavg & savg contain the contribution from the extra diagonal part 345 ! of the rotated tensor (from trc_zdf_iso). 346 IF( ln_trcldf_iso ) THEN 347 !CDIR COLLAPSE 348 DO jk = 1, jpkm1 349 ztrtrd(:,:,jk) = ( (tra(:,:,jk,jn) - trb(:,:,jk,jn))/rdttrc(jk) ) - ztrtrd(:,:,jk) & 350 & + ztrcavg(:,:,jk,jn) 351 END DO 352 ELSE 353 !CDIR COLLAPSE 354 DO jk = 1, jpkm1 355 ztrtrd(:,:,jk) = ( (tra(:,:,jk,jn) - trb(:,:,jk,jn))/rdttrc(jk) ) - ztrtrd(:,:,jk) 356 END DO 357 ENDIF 358 359 ! III.2) save the trends for diagnostic 360 ! N.B. However the purely vertical diffusion "K_z" (included here) will be deduced 361 ! and removed from this trend before storage. It is stored separately, so as to 362 ! clearly distinguish both contributions (see trd_mld) 363 IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_zdf, kt ) 364 365 END IF 366 ! ! =========== 367 END DO ! tracer loop 368 ! ! =========== 369 370 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 337 371 338 372 END SUBROUTINE trc_zdf_zdf 339 373 340 374 341 SUBROUTINE trc_zdf_iso 375 SUBROUTINE trc_zdf_iso( kt ) 342 376 !!---------------------------------------------------------------------- 343 377 !! *** ROUTINE trc_zdf_iso *** … … 376 410 !! ** Action : 377 411 !! Update tra arrays with the before vertical diffusion trend 378 !! Save in trtrd arrays the trends if 'key_trc_diatrd' defined 379 !! 380 !! History : 381 !! 6.0 ! 90-10 (B. Blanke) Original code 382 !! 7.0 ! 91-11 (G. Madec) 383 !! ! 92-06 (M. Imbard) correction on tracer trend loops 384 !! ! 96-01 (G. Madec) statement function for e3 385 !! ! 97-05 (G. Madec) vertical component of isopycnal 386 !! ! 97-07 (G. Madec) geopotential diffusion in s-coord 387 !! ! 98-03 (L. Bopp MA Foujols) passive tracer generalisation 388 !! ! 00-05 (MA Foujols) add lbc for tracer trends 389 !! ! 00-06 (O Aumont) correct isopycnal scheme suppress 390 !! ! avt multiple correction 391 !! ! 00-08 (G. Madec) double diffusive mixing 392 !! 8.5 ! 02-08 (G. Madec) F90: Free form and module 393 !! 9.0 ! 04-03 (C. Ethe ) adapted for passive tracers 412 !! Save in trtrd arrays the trends if 'key_trdmld_trc' defined 394 413 !!--------------------------------------------------------------------- 395 !! * Modules used396 414 USE oce_trc, ONLY : zwx => ua, & ! use ua, va as 397 415 zwy => va ! workspace arrays 398 416 399 !! * Local declarations 400 INTEGER :: ji, jj, jk,jn ! dummy loop indices 401 INTEGER :: iku, ikv 402 REAL(wp) :: & 403 ztavg, & ! temporary scalars 404 zcoef0, zcoef3, & ! " " 405 zcoef4, & ! " " 406 zbtr, zmku, zmkv, & ! " " 407 #if defined key_trcldf_eiv 408 zcoeg3, & ! " " 409 zuwki, zvwki, & ! " " 410 zuwk, zvwk, & ! " " 417 INTEGER, INTENT( in ) :: kt ! ocean time-step index 418 INTEGER :: ji, jj, jk, jn ! dummy loop indices 419 INTEGER :: iku, ikv 420 REAL(wp) :: ztavg ! temporary scalars 421 REAL(wp) :: zcoef0, zcoef3 ! " " 422 REAL(wp) :: zcoef4 ! " " 423 REAL(wp) :: zbtr, zmku, zmkv ! " " 424 #if defined key_trcldf_eiv 425 REAL(wp) :: zcoeg3, z_hdivn_z ! " " 426 REAL(wp) :: zuwki, zvwki ! " " 427 REAL(wp) :: zuwk, zvwk ! " " 411 428 #endif 412 ztav 413 REAL(wp), DIMENSION(jpi,jpj,jpk) :: & 414 zwz, zwt, ztfw ! temporary workspace arrays 429 REAL(wp) :: ztav 430 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwz ! temporary workspace arrays 431 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwt 432 REAL(wp), DIMENSION(jpi,jpj,jpk) :: ztfw 433 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrtrd 415 434 !!--------------------------------------------------------------------- 416 435 417 DO jn = 1, jptra 436 437 IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) ) 438 439 ! ! =========== 440 DO jn = 1, jptra ! tracer loop 441 ! ! =========== 418 442 419 443 ! 0. Local constant initialization 420 444 ! -------------------------------- 445 zwx (1,:,:) = 0.e0 ; zwx (jpi,:,:) = 0.e0 446 zwy (1,:,:) = 0.e0 ; zwy (jpi,:,:) = 0.e0 447 zwz (1,:,:) = 0.e0 ; zwz (jpi,:,:) = 0.e0 448 zwt (1,:,:) = 0.e0 ; zwt (jpi,:,:) = 0.e0 449 ztfw(1,:,:) = 0.e0 ; ztfw(jpi,:,:) = 0.e0 450 451 !CDIRR COLLAPSE 452 IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn) ! save trends 453 421 454 ztavg = 0.e0 422 423 zwx( 1 ,:,:)=0.e0 ; zwx(jpi,:,:)=0.e0424 zwy( 1 ,:,:)=0.e0 ; zwy(jpi,:,:)=0.e0425 zwz( 1 ,:,:)=0.e0 ; zwz(jpi,:,:)=0.e0426 zwt( 1 ,:,:)=0.e0 ; zwt(jpi,:,:)=0.e0427 ztfw( 1 ,:,:)=0.e0 ; ztfw(jpi,:,:)=0.e0428 455 429 456 ! I. Vertical trends associated with lateral mixing 430 457 ! ------------------------------------------------- 431 458 ! (excluding the vertical flux proportional to dk[t] ) 432 433 459 434 460 ! I.1 horizontal tracer gradient … … 460 486 ENDIF 461 487 462 463 488 ! I.2 Vertical fluxes 464 489 ! ------------------- … … 536 561 #endif 537 562 538 ! I. 5Divergence of vertical fluxes added to the general tracer trend563 ! I.3 Divergence of vertical fluxes added to the general tracer trend 539 564 ! ------------------------------------------------------------------- 540 565 … … 549 574 ztavg = ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * zbtr 550 575 ! WARNING trtrd(ji,jj,jk,7) used for vertical gent velocity trend not for damping !!! 551 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn), 9) = ztavg576 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),7) = ztavg 552 577 # endif 553 578 IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),6) = ztav - ztavg 554 579 #endif 555 END DO 556 END DO 557 END DO 558 559 END DO 580 581 END DO 582 END DO 583 END DO 584 585 ! II. Save the trends for diagnostics 586 ! ----------------------------------- 587 IF( l_trdtrc ) THEN 588 #if defined key_trcldf_eiv 589 590 ! II.1) Compute the eiv VERTICAL trend 591 !CDIRR COLLAPSE 592 DO jk = 1, jpkm1 593 DO jj = 2, jpjm1 594 DO ji = fs_2, fs_jpim1 ! vector opt. 595 596 !-- Compute the eiv vertical divergence : 1/e3t ( dk[w_eiv] ) 597 ! N.B. This is only possible if key_diaeiv is switched on. 598 ! Else, the vertical eiv is not diagnosed, 599 ! so we can only store the flux form trend d_z ( T * w_eiv ) 600 ! instead of w_eiv * d_z( T ). Then, ONLY THE SUM of zonal, 601 ! meridional, and vertical trends are valid. 602 # if defined key_diaeiv 603 z_hdivn_z = ( 1./e3t(jk) ) * ( w_trc_eiv(ji,jj,jk) - w_trc_eiv(ji,jj,jk+1) ) 604 # else 605 z_hdivn_z = 0.e0 606 # endif 607 zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) ) 608 ztrcavg(ji,jj,jk,jn) = ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * zbtr & 609 & - trn(ji,jj,jk,jn) * z_hdivn_z 610 END DO 611 END DO 612 END DO 613 614 ! II.2) save the trends for diagnostic 615 ! N.B. The other part of the computed trend is stored below for later 616 ! output (see trc_zdf_zdf) 617 IF (luttrd(jn)) CALL trd_mod_trc( ztrcavg(:,:,:,jn), jn, jptrc_trd_zei, kt ) 618 619 #endif 620 !-- Retain only the vertical diff. trends due to the extra diagonal 621 ! part of the rotated tensor (i.e. remove vert. eiv from the trend) 622 ! N.B. ztrcavg is recycled for this purpose 623 ztrcavg(:,:,:,jn) = tra(:,:,:,jn) - ztrtrd(:,:,:) - ztrcavg(:,:,:,jn) 624 625 END IF 626 627 ! ! =========== 628 END DO ! tracer loop 629 ! ! =========== 630 631 IF( l_trdtrc ) DEALLOCATE( ztrtrd ) 560 632 561 633 END SUBROUTINE trc_zdf_iso -
trunk/NEMO/TOP_SRC/TRP/trdmld_trc.F90
r1174 r1175 36 36 PRIVATE 37 37 38 INTERFACE trd_mod_trc 39 MODULE PROCEDURE trd_mod_trc_trp, trd_mod_trc_bio 40 END INTERFACE 41 38 42 PUBLIC trd_mod_trc ! routine called by step.F90 39 43 PUBLIC trd_mld_trc 44 PUBLIC trd_mld_bio 40 45 PUBLIC trd_mld_trc_init 41 46 … … 46 51 INTEGER :: ndimtrd1 47 52 INTEGER, SAVE :: ionce, icount 53 #if defined key_lobster 54 INTEGER :: nidtrdbio, nh_tb 55 INTEGER, SAVE :: ioncebio, icountbio 56 INTEGER, SAVE :: nmoymltrdbio 57 #endif 48 58 LOGICAL :: llwarn = .TRUE. ! this should always be .TRUE. 49 59 LOGICAL :: lldebug = .TRUE. … … 59 69 CONTAINS 60 70 61 SUBROUTINE trd_mod_trc ( ptrtrd, kjn, ktrd, kt )71 SUBROUTINE trd_mod_trc_trp( ptrtrd, kjn, ktrd, kt ) 62 72 !!---------------------------------------------------------------------- 63 73 !! *** ROUTINE trd_mod_trc *** … … 102 112 CASE ( jptrc_trd_dmp ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_dmp , '3D', kjn ) 103 113 CASE ( jptrc_trd_sbc ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_sbc , '2D', kjn ) 104 #if defined key_lobster105 CASE ( jptrc_trd_sms_sed ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_sms_sed, '3D', kjn )106 CASE ( jptrc_trd_sms_bio ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_sms_bio, '3D', kjn )107 CASE ( jptrc_trd_sms_exp ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_sms_exp, '3D', kjn )108 #else109 114 CASE ( jptrc_trd_sms ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_sms , '3D', kjn ) 110 #endif111 115 CASE ( jptrc_trd_bbc ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_bbc , '3D', kjn ) 112 116 CASE ( jptrc_trd_radb ) ; CALL trd_mld_trc_zint( ptrtrd, jpmld_trc_radb , '3D', kjn ) … … 116 120 117 121 118 END SUBROUTINE trd_mod_trc 122 END SUBROUTINE trd_mod_trc_trp 123 124 SUBROUTINE trd_mod_trc_bio( ptrbio, ktrd, kt ) 125 !!---------------------------------------------------------------------- 126 !! *** ROUTINE trd_mod_bio *** 127 !!---------------------------------------------------------------------- 128 129 INTEGER, INTENT( in ) :: kt ! time step 130 INTEGER, INTENT( in ) :: ktrd ! bio trend index 131 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) :: ptrbio ! Bio trend 132 !!---------------------------------------------------------------------- 133 134 CALL trd_mld_bio_zint( ptrbio, ktrd ) ! Verticaly integrated biological trends 135 136 END SUBROUTINE trd_mod_trc_bio 137 119 138 120 139 SUBROUTINE trd_mld_trc_zint( ptrc_trdmld, ktrd, ctype, kjn ) … … 230 249 END SUBROUTINE trd_mld_trc_zint 231 250 251 SUBROUTINE trd_mld_bio_zint( ptrc_trdmld, ktrd ) 252 !!---------------------------------------------------------------------- 253 !! *** ROUTINE trd_mld_bio_zint *** 254 !! 255 !! ** Purpose : Compute the vertical average of the 3D fields given as arguments 256 !! to the subroutine. This vertical average is performed from ocean 257 !! surface down to a chosen control surface. 258 !! 259 !! ** Method/usage : 260 !! The control surface can be either a mixed layer depth (time varying) 261 !! or a fixed surface (jk level or bowl). 262 !! Choose control surface with nctls in namelist NAMTRD : 263 !! nctls_trc = 0 : use mixed layer with density criterion 264 !! nctls_trc = 1 : read index from file 'ctlsurf_idx' 265 !! nctls_trc > 1 : use fixed level surface jk = nctls_trc 266 !! Note: in the remainder of the routine, the volume between the 267 !! surface and the control surface is called "mixed-layer" 268 !!---------------------------------------------------------------------- 269 INTEGER, INTENT( in ) :: ktrd ! bio trend index 270 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) :: ptrc_trdmld ! passive trc trend 271 #if defined key_lobster 272 !! local variables 273 INTEGER :: ji, jj, jk, isum 274 REAL(wp), DIMENSION(jpi,jpj) :: zvlmsk 275 !!---------------------------------------------------------------------- 276 277 ! I. Definition of control surface and integration weights 278 ! -------------------------------------------------------- 279 ! ==> only once per time step <== 280 281 IF( icountbio == 1 ) THEN 282 ! 283 tmltrd_bio(:,:,:) = 0.e0 ! <<< reset trend arrays to zero 284 ! ... Set nmld(ji,jj) = index of first T point below control surf. or outside mixed-layer 285 SELECT CASE ( nctls_trc ) ! choice of the control surface 286 CASE ( -2 ) ; STOP 'trdmld_trc : not ready ' ! -> isopycnal surface (see ???) 287 CASE ( -1 ) ; nmld_trc(:,:) = neln(:,:) ! -> euphotic layer with light criterion 288 CASE ( 0 ) ; nmld_trc(:,:) = nmln(:,:) ! -> ML with density criterion (see zdfmxl) 289 CASE ( 1 ) ; nmld_trc(:,:) = nbol_trc(:,:) ! -> read index from file 290 CASE ( 2: ) ; nctls_trc = MIN( nctls_trc, jpktrd_trc - 1 ) 291 nmld_trc(:,:) = nctls_trc + 1 ! -> model level 292 END SELECT 293 294 ! ... Compute ndextrd1 and ndimtrd1 only once 295 IF( ioncebio == 1 ) THEN 296 ! 297 ! Check of validity : nmld_trc(ji,jj) <= jpktrd_trc 298 isum = 0 299 zvlmsk(:,:) = 0.e0 300 301 IF( jpktrd_trc < jpk ) THEN 302 DO jj = 1, jpj 303 DO ji = 1, jpi 304 IF( nmld_trc(ji,jj) <= jpktrd_trc ) THEN 305 zvlmsk(ji,jj) = tmask(ji,jj,1) 306 ELSE 307 isum = isum + 1 308 zvlmsk(ji,jj) = 0. 309 END IF 310 END DO 311 END DO 312 END IF 313 314 ! Index of ocean points (2D only) 315 IF( isum > 0 ) THEN 316 WRITE(numout,*)' tmltrd_trc : Number of invalid points nmld_trc > jpktrd', isum 317 CALL wheneq( jpi*jpj, zvlmsk(:,:) , 1, 1., ndextrd1, ndimtrd1 ) 318 ELSE 319 CALL wheneq( jpi*jpj, tmask(:,:,1), 1, 1., ndextrd1, ndimtrd1 ) 320 END IF 321 322 ioncebio = 0 ! no more pass here 323 ! 324 END IF ! ( ioncebio == 1 ) 325 326 ! ... Weights for vertical averaging 327 wkx_trc(:,:,:) = 0.e0 328 DO jk = 1, jpktrd_trc ! initialize wkx_trc with vertical scale factor in mixed-layer 329 DO jj = 1,jpj 330 DO ji = 1,jpi 331 IF( jk - nmld_trc(ji,jj) < 0. ) wkx_trc(ji,jj,jk) = fse3t(ji,jj,jk) * tmask(ji,jj,jk) 332 END DO 333 END DO 334 END DO 335 336 rmld_trc(:,:) = 0. 337 DO jk = 1, jpktrd_trc ! compute mixed-layer depth : rmld_trc 338 rmld_trc(:,:) = rmld_trc(:,:) + wkx_trc(:,:,jk) 339 END DO 340 341 DO jk = 1, jpktrd_trc ! compute integration weights 342 wkx_trc(:,:,jk) = wkx_trc(:,:,jk) / MAX( 1., rmld_trc(:,:) ) 343 END DO 344 345 icountbio = 0 ! <<< flag = off : control surface & integr. weights 346 ! ! computed only once per time step 347 END IF ! ( icountbio == 1 ) 348 349 ! II. Vertical integration of trends in the mixed-layer 350 ! ----------------------------------------------------- 351 352 353 DO jk = 1, jpktrd_trc 354 tmltrd_bio(:,:,ktrd) = tmltrd_bio(:,:,ktrd) + ptrc_trdmld(:,:,jk) * wkx_trc(:,:,jk) 355 END DO 356 357 #endif 358 359 END SUBROUTINE trd_mld_bio_zint 360 232 361 233 362 SUBROUTINE trd_mld_trc( kt ) … … 823 952 END SUBROUTINE trd_mld_trc 824 953 954 SUBROUTINE trd_mld_bio( kt ) 955 !!---------------------------------------------------------------------- 956 !! *** ROUTINE trd_mld *** 957 !! 958 !! ** Purpose : Compute and cumulate the mixed layer biological trends over an analysis 959 !! period, and write NetCDF (or dimg) outputs. 960 !! 961 !! ** Method/usage : 962 !! The stored trends can be chosen twofold (according to the ln_trdmld_trc_instant 963 !! logical namelist variable) : 964 !! 1) to explain the difference between initial and final 965 !! mixed-layer T & S (where initial and final relate to the 966 !! current analysis window, defined by ntrd in the namelist) 967 !! 2) to explain the difference between the current and previous 968 !! TIME-AVERAGED mixed-layer T & S (where time-averaging is 969 !! performed over each analysis window). 970 !! 971 !! ** Consistency check : 972 !! If the control surface is fixed ( nctls > 1 ), the residual term (dh/dt 973 !! entrainment) should be zero, at machine accuracy. Note that in the case 974 !! of time-averaged mixed-layer fields, this residual WILL NOT BE ZERO 975 !! over the first two analysis windows (except if restart). 976 !! N.B. For ORCA2_LIM, use e.g. ntrd=5, ucf=1., nctls=8 977 !! for checking residuals. 978 !! On a NEC-SX5 computer, this typically leads to: 979 !! O(1.e-20) temp. residuals (tml_res) when ln_trdmld_trc_instant=.false. 980 !! O(1.e-21) temp. residuals (tml_res) when ln_trdmld_trc_instant=.true. 981 !! 982 !! ** Action : 983 !! At each time step, mixed-layer averaged trends are stored in the 984 !! tmltrd(:,:,jpmld_xxx) array (see trdmld_oce.F90 for definitions of jpmld_xxx). 985 !! This array is known when trd_mld is called, at the end of the stp subroutine, 986 !! except for the purely vertical K_z diffusion term, which is embedded in the 987 !! lateral diffusion trend. 988 !! 989 !! In I), this K_z term is diagnosed and stored, thus its contribution is removed 990 !! from the lateral diffusion trend. 991 !! In II), the instantaneous mixed-layer T & S are computed, and misc. cumulative 992 !! arrays are updated. 993 !! In III), called only once per analysis window, we compute the total trends, 994 !! along with the residuals and the Asselin correction terms. 995 !! In IV), the appropriate trends are written in the trends NetCDF file. 996 !! 997 !! References : 998 !! - Vialard & al. 999 !! - See NEMO documentation (in preparation) 1000 !!---------------------------------------------------------------------- 1001 INTEGER, INTENT( in ) :: kt ! ocean time-step index 1002 #if defined key_lobster 1003 INTEGER :: jl, it 1004 LOGICAL :: llwarn = .TRUE., lldebug = .TRUE. 1005 REAL(wp), DIMENSION(jpi,jpj,jpdiabio) :: ztmltrdbio2 ! only needed for mean diagnostics 1006 REAL(wp) :: zfn, zfn2 1007 #if defined key_dimgout 1008 INTEGER :: iyear,imon,iday 1009 CHARACTER(LEN=80) :: cltext, clmode 1010 #endif 1011 !!---------------------------------------------------------------------- 1012 ! ... Warnings 1013 IF( llwarn ) THEN 1014 IF( ( nittrc000 /= nit000 ) & 1015 .OR.( ndttrc /= 1 ) ) THEN 1016 1017 WRITE(numout,*) 'Be careful, trends diags never validated' 1018 STOP 'Uncomment this line to proceed' 1019 END IF 1020 END IF 1021 1022 ! ====================================================================== 1023 ! II. Cumulate the trends over the analysis window 1024 ! ====================================================================== 1025 1026 ztmltrdbio2(:,:,:) = 0.e0 ! <<< reset arrays to zero 1027 1028 ! II.3 Initialize mixed-layer "before" arrays for the 1rst analysis window 1029 ! ------------------------------------------------------------------------ 1030 IF( kt == 2 ) THEN ! i.e. ( .NOT. ln_rstart ).AND.( kt == nit000 + 1) 1031 ! 1032 tmltrd_csum_ub_bio (:,:,:) = 0.e0 1033 ! 1034 END IF 1035 1036 ! II.4 Cumulated trends over the analysis period 1037 ! ---------------------------------------------- 1038 ! 1039 ! [ 1rst analysis window ] [ 2nd analysis window ] 1040 ! 1041 ! 1042 ! o---[--o-----o-----o-----o--]-[--o-----o-----o-----o-----o--]---o-----o--> time steps 1043 ! ntrd 2*ntrd etc. 1044 ! 1 2 3 4 =5 e.g. =10 1045 ! 1046 IF( ( kt >= 2 ).OR.( lrsttr ) ) THEN 1047 ! 1048 nmoymltrdbio = nmoymltrdbio + 1 1049 1050 ! ... Trends associated with the time mean of the ML passive tracers 1051 tmltrd_sum_bio (:,:,:) = tmltrd_sum_bio (:,:,:) + tmltrd_bio (:,:,:) 1052 tmltrd_csum_ln_bio(:,:,:) = tmltrd_csum_ln_bio(:,:,:) + tmltrd_sum_bio(:,:,:) 1053 ! 1054 END IF 1055 1056 ! ====================================================================== 1057 ! III. Prepare fields for output (get here ONCE PER ANALYSIS PERIOD) 1058 ! ====================================================================== 1059 1060 ! Convert to appropriate physical units 1061 tmltrd_bio(:,:,:) = tmltrd_bio(:,:,:) * ucf_trc 1062 1063 MODULO_NTRD : IF( MOD( kt, ntrd_trc ) == 0 ) THEN ! nitend MUST be multiple of ntrd 1064 ! 1065 zfn = float(nmoymltrdbio) ; zfn2 = zfn * zfn 1066 1067 ! III.1 Prepare fields for output ("instantaneous" diagnostics) 1068 ! ------------------------------------------------------------- 1069 1070 #if defined key_diainstant 1071 STOP 'tmltrd_bio : key_diainstant was never checked within trdmld. Comment this to proceed.' 1072 #endif 1073 ! III.2 Prepare fields for output ("mean" diagnostics) 1074 ! ---------------------------------------------------- 1075 1076 ztmltrdbio2(:,:,:) = tmltrd_csum_ub_bio(:,:,:) + tmltrd_csum_ln_bio(:,:,:) 1077 1078 !-- Lateral boundary conditions 1079 #if ! defined key_gyre 1080 ! ES_B27_CD_WARN : lbc inutile GYRE, cf. + haut 1081 DO jn = 1, jpdiabio 1082 CALL lbc_lnk( ztmltrdbio2(:,:,jn), 'T', 1. ) 1083 ENDDO 1084 #endif 1085 IF( lldebug ) THEN 1086 ! 1087 WRITE(numout,*) 'trd_mld_bio : write trends in the Mixed Layer for debugging process:' 1088 WRITE(numout,*) '~~~~~~~~~~~ ' 1089 WRITE(numout,*) 'TRC kt = ', kt, 'nmoymltrdbio = ', nmoymltrdbio 1090 WRITE(numout,*) 1091 1092 DO jl = 1, jpdiabio 1093 IF( ln_trdmld_trc_instant ) THEN 1094 WRITE(numout,97) 'TRC jl =', jl, ' bio TREND INDEX = ', jl, & 1095 & ' SUM tmltrd_bio : ', SUM2D(tmltrd_bio(:,:,jl)) 1096 ELSE 1097 WRITE(numout,97) 'TRC jl =', jl, ' bio TREND INDEX = ', jl, & 1098 & ' SUM ztmltrdbio2 : ', SUM2D(ztmltrdbio2(:,:,jl)) 1099 endif 1100 END DO 1101 1102 97 FORMAT(a10, i3, 2x, a30, i3, a20, 2x, g20.10) 1103 98 FORMAT(a10, i3, 2x, a30, 2x, g20.10) 1104 99 FORMAT('TRC jj =', i3,' : ', 10(g10.3,2x)) 1105 WRITE(numout,*) 1106 ! 1107 ENDIF 1108 1109 ! III.3 Time evolution array swap 1110 ! ------------------------------- 1111 1112 ! For passive tracer mean diagnostics 1113 tmltrd_csum_ub_bio (:,:,:) = zfn * tmltrd_sum_bio(:,:,:) - tmltrd_csum_ln_bio(:,:,:) 1114 1115 ! III.4 Convert to appropriate physical units 1116 ! ------------------------------------------- 1117 ztmltrdbio2 (:,:,:) = ztmltrdbio2 (:,:,:) * ucf_trc/zfn2 1118 1119 END IF MODULO_NTRD 1120 1121 ! ====================================================================== 1122 ! IV. Write trends in the NetCDF file 1123 ! ====================================================================== 1124 1125 ! IV.1 Code for dimg mpp output 1126 ! ----------------------------- 1127 1128 # if defined key_dimgout 1129 STOP 'Not implemented' 1130 # else 1131 1132 ! IV.2 Code for IOIPSL/NetCDF output 1133 ! ---------------------------------- 1134 1135 IF( lwp .AND. MOD( kt , ntrd_trc ) == 0 ) THEN 1136 WRITE(numout,*) ' ' 1137 WRITE(numout,*) 'trd_mld_bio : write ML bio trends in the NetCDF file :' 1138 WRITE(numout,*) '~~~~~~~~~~~ ' 1139 WRITE(numout,*) ' ', TRIM(clhstnam), ' at kt = ', kt 1140 WRITE(numout,*) ' N.B. nmoymltrdbio = ', nmoymltrdbio 1141 WRITE(numout,*) ' ' 1142 END IF 1143 1144 1145 ! define time axis 1146 it = kt - nit000 + 1 1147 1148 1149 ! 2. Start writing data 1150 ! --------------------- 1151 1152 NETCDF_OUTPUT : IF( ln_trdmld_trc_instant ) THEN ! <<< write the trends for passive tracer instant. diags 1153 ! 1154 DO jl = 1, jpdiabio 1155 CALL histwrite( nidtrdbio,TRIM("ML_"//ctrd_bio(jl,2)) , & 1156 & it, tmltrd_bio(:,:,jl), ndimtrd1, ndextrd1 ) 1157 END DO 1158 1159 1160 IF( kt == nitend ) CALL histclo( nidtrdbio ) 1161 1162 ELSE ! <<< write the trends for passive tracer mean diagnostics 1163 1164 DO jl = 1, jpdiabio 1165 CALL histwrite( nidtrdbio, TRIM("ML_"//ctrd_bio(jl,2)) , & 1166 & it, ztmltrdbio2(:,:,jl), ndimtrd1, ndextrd1 ) 1167 END DO 1168 1169 IF( kt == nitend ) CALL histclo( nidtrdbio ) 1170 ! 1171 END IF NETCDF_OUTPUT 1172 1173 ! Compute the control surface (for next time step) : flag = on 1174 icountbio = 1 1175 1176 1177 # endif /* key_dimgout */ 1178 1179 IF( MOD( kt, ntrd_trc ) == 0 ) THEN 1180 ! 1181 ! III.5 Reset cumulative arrays to zero 1182 ! ------------------------------------- 1183 nmoymltrdbio = 0 1184 tmltrd_csum_ln_bio (:,:,:) = 0.e0 1185 tmltrd_sum_bio (:,:,:) = 0.e0 1186 END IF 1187 1188 ! ====================================================================== 1189 ! Write restart file 1190 ! ====================================================================== 1191 1192 ! restart write is done in trd_mld_trc_write which is called by trd_mld_bio (Marina) 1193 ! 1194 #endif 1195 END SUBROUTINE trd_mld_bio 825 1196 826 1197 REAL FUNCTION sum2d( ztab ) … … 966 1337 tmltrd_csum_ln_trc (:,:,:,:) = 0.e0 ; rmld_sum_trc (:,:) = 0.e0 967 1338 1339 #if defined key_lobster 1340 nmoymltrdbio = 0 1341 tmltrd_sum_bio (:,:,:) = 0.e0 ; tmltrd_csum_ln_bio (:,:,:) = 0.e0 1342 #endif 1343 968 1344 IF( lrsttr .AND. ln_trdmld_trc_restart ) THEN 969 1345 CALL trd_mld_trc_rst_read … … 974 1350 tml_sumb_trc (:,:,:) = 0.e0 ; tmltrd_csum_ub_trc (:,:,:,:) = 0.e0 ! mean 975 1351 tmltrd_atf_sumb_trc(:,:,:) = 0.e0 ; tmltrd_rad_sumb_trc(:,:,:) = 0.e0 976 ENDIF 1352 #if defined key_lobster 1353 tmltrd_csum_ub_bio (:,:,:) = 0.e0 1354 #endif 1355 1356 ENDIF 977 1357 978 1358 ilseq = 1 ; icount = 1 ; ionce = 1 ! open specifier 1359 1360 #if defined key_lobster 1361 icountbio = 1 ; ioncebio = 1 ! open specifier 1362 #endif 979 1363 980 1364 ! I.3 Read control surface from file ctlsurf_idx … … 1054 1438 ctrd_trc(jpmld_trc_dmp ,1) = " Tracer damping" ; ctrd_trc(jpmld_trc_dmp ,2) = "_dmp" 1055 1439 ctrd_trc(jpmld_trc_sbc ,1) = " Surface boundary cond." ; ctrd_trc(jpmld_trc_sbc ,2) = "_sbc" 1056 #if defined key_lobster1057 ctrd_trc(jpmld_trc_sms_sed,1) = " Sources minus sinks : sed" ; ctrd_trc(jpmld_trc_sms_sed,2) = "_sms_sed"1058 ctrd_trc(jpmld_trc_sms_bio,1) = " Sources minus sinks : bio" ; ctrd_trc(jpmld_trc_sms_bio,2) = "_sms_bio"1059 ctrd_trc(jpmld_trc_sms_exp,1) = " Sources minus sinks : exp" ; ctrd_trc(jpmld_trc_sms_exp,2) = "_sms_exp"1060 #else1061 1440 ctrd_trc(jpmld_trc_sms, 1) = " Sources minus sinks" ; ctrd_trc(jpmld_trc_sms ,2) = "_sms" 1062 #endif1063 1441 ctrd_trc(jpmld_trc_radb ,1) = " Correct negative concentrations" ; ctrd_trc(jpmld_trc_radb ,2) = "_radb" 1064 1442 ctrd_trc(jpmld_trc_radn ,1) = " Correct negative concentrations" ; ctrd_trc(jpmld_trc_radn ,2) = "_radn" … … 1081 1459 END DO 1082 1460 1461 #if defined key_lobster 1462 1463 ctrd_bio(1,:) = "NO3PHY" 1464 ctrd_bio(2,:) = "NH4PHY" 1465 ctrd_bio(3,:) = "PHYNH4" 1466 ctrd_bio(4,:) = "PHYDOM" 1467 ctrd_bio(5,:) = "PHYZOO" 1468 ctrd_bio(6,:) = "PHYDET" 1469 ctrd_bio(7,:) = "DETZOO" 1470 ctrd_bio(8,:) = "DETSED" 1471 ctrd_bio(9,:) = "ZOODET" 1472 ctrd_bio(10,:) = "ZOOBOD" 1473 ctrd_bio(11,:) = "ZOONH4" 1474 ctrd_bio(12,:) = "ZOODOM" 1475 ctrd_bio(13,:) = "NH4NO3" 1476 ctrd_bio(14,:) = "DOMNH4" 1477 ctrd_bio(15,:) = "DETNH4" 1478 ctrd_bio(16,:) = "DETDOM" 1479 ctrd_bio(17,:) = "SEDNO3" 1480 1481 1482 !-- Create a NetCDF file and enter the define mode 1483 CALL dia_nam( clhstnam, ntrd_trc, 'trdbio' ) 1484 CALL histbeg( clhstnam, jpi, glamt, jpj, gphit, & 1485 & 1, jpi, 1, jpj, 0, zjulian, rdt, nh_tb, nidtrdbio, domain_id=nidom ) 1486 1487 #endif 1488 1083 1489 !-- Define physical units 1084 1490 IF( ucf_trc == 1. ) THEN … … 1094 1500 STOP 'Error : jpltrd_trc /= jpmld_trc_atf .OR. jpltrd_trc - 1 /= jpmld_trc_radb' ! see below 1095 1501 ENDIF 1096 #if defined key_lobster1097 IF( lldebug ) THEN1098 DO jn = 1, jptra1099 WRITE(numout, *) 'TRC jpdet=', jpdet, ' jpnh4=', jpnh41100 WRITE(numout, *) 'TRC short title ctrcnm jn=", jn, " : ', ctrcnm(jn)1101 WRITE(numout, *) 'TRC trim(ctrcnm(jn))//"_tot" = ', trim(ctrcnm(jn))//"ml_tot" ! tml_tot -> detml_tot1102 END DO1103 CALL flush(numout)1104 ENDIF1105 #else1106 !! Error : this is not ready (PISCES)1107 #endif1108 1502 1109 1503 DO jn = 1, jptra … … 1135 1529 END DO 1136 1530 1531 #if defined key_lobster 1532 DO jl = 1, jpdiabio 1533 CALL histdef(nidtrdbio, TRIM("ML_"//ctrd_bio(jl,2)), TRIM(clmxl//" ML_"//ctrd_bio(jl,1)) , & 1534 & cltrcu, jpi, jpj, nh_tb, 1 , 1, 1 , -99 , 32, clop, zsto, zout ) ! IOIPSL: time mean 1535 END DO ! if zsto=rdt above 1536 #endif 1537 1137 1538 !-- Leave IOIPSL/NetCDF define mode 1138 1539 DO jn = 1, jptra 1139 1540 IF( luttrd(jn) ) CALL histend( nidtrd(jn) ) 1140 1541 END DO 1542 1543 #if defined key_lobster 1544 !-- Leave IOIPSL/NetCDF define mode 1545 CALL histend( nidtrdbio ) 1546 1547 IF(lwp) WRITE(numout,*) 1548 IF(lwp) WRITE(numout,*) 'End of NetCDF Initialization for ML bio trends' 1549 #endif 1141 1550 1142 1551 #endif /* key_dimgout */ -
trunk/NEMO/TOP_SRC/TRP/trdmld_trc_oce.F90
r1174 r1175 41 41 INTEGER, PARAMETER :: jptrc_trd_dmp = 11 !: damping 42 42 INTEGER, PARAMETER :: jptrc_trd_sbc = 12 !: surface boundary condition 43 #if defined key_lobster44 INTEGER, PARAMETER :: jptrc_trd_sms_sed = 13 !: sources m. sinks : sedimentation45 INTEGER, PARAMETER :: jptrc_trd_sms_bio = 14 !: sources m. sinks : bio46 INTEGER, PARAMETER :: jptrc_trd_sms_exp = 15 !: sources m. sinks : bio47 INTEGER, PARAMETER :: jptrc_trd_radn = 16 !: corr. trn<0 in trcrad48 INTEGER, PARAMETER :: jptrc_trd_radb = 17 !: corr. trb<0 in trcrad (like atf)49 INTEGER, PARAMETER :: jptrc_trd_atf = 18 !: Asselin correction50 #else51 43 INTEGER, PARAMETER :: jptrc_trd_sms = 13 !: sources m. sinks 52 44 INTEGER, PARAMETER :: jptrc_trd_radn = 14 !: corr. trn<0 in trcrad 53 45 INTEGER, PARAMETER :: jptrc_trd_radb = 15 !: corr. trb<0 in trcrad (like atf) 54 46 INTEGER, PARAMETER :: jptrc_trd_atf = 16 !: Asselin correction 55 #endif56 47 57 48 #if defined key_trdmld_trc … … 76 67 jpmld_trc_dmp = 11, & !: internal restoring trend 77 68 jpmld_trc_sbc = 12, & !: forcing 78 #if defined key_lobster79 jpmld_trc_sms_sed = 13, & !: sources minus sinks trend80 jpmld_trc_sms_bio = 14, & !: sources minus sinks trend81 jpmld_trc_sms_exp = 15, & !: sources minus sinks trend82 ! jpmld_trc_xxx = xx, & !: add here any additional trend (** AND UPDATE JPLTRD_TRC BELOW **)83 jpmld_trc_radn = 16, & !: corr. trn<0 in trcrad84 jpmld_trc_radb = 17, & !: corr. trn<0 in trcrad (like atf) (** MUST BE BEFORE THE LAST ONE **)85 jpmld_trc_atf = 18 !: asselin trend (** MUST BE THE LAST ONE **)86 #else87 69 jpmld_trc_sms = 13, & !: sources minus sinks trend 88 70 ! jpmld_trc_xxx = xx, & !: add here any additional trend (** AND UPDATE JPLTRD_TRC BELOW **) … … 90 72 jpmld_trc_radb = 15, & !: corr. trb<0 in trcrad (like atf) (** MUST BE BEFORE THE LAST ONE **) 91 73 jpmld_trc_atf = 16 !: asselin trend (** MUST BE THE LAST ONE**) 92 #endif93 74 94 75 !! Trends diagnostics parameters 95 76 !!--------------------------------------------------------------------- 96 77 INTEGER, PARAMETER :: & 97 #if defined key_lobster98 jpltrd_trc = 18, & !: number of mixed-layer trends arrays99 #else100 78 jpltrd_trc = 16, & !: number of mixed-layer trends arrays 101 #endif102 79 jpktrd_trc = jpk !: max level for mixed-layer trends diag. 103 80 … … 151 128 #endif 152 129 130 #if defined key_lobster 131 CHARACTER(LEN=80) :: clname_bio, ctrd_bio(jpdiabio,2) 132 REAL(wp), DIMENSION(jpi,jpj,jpdiabio) :: & 133 tmltrd_bio, & !: \ biological contributions to the total trend , 134 !: / cumulated over the current analysis window 135 tmltrd_sum_bio, & !: sum of these trends over the analysis period 136 tmltrd_csum_ln_bio, & !: now cumulated sum of trends over the "lower triangle" 137 tmltrd_csum_ub_bio !: before (prev. analysis period) cumulated sum over the 138 !: upper triangle 139 #endif 153 140 154 141 #else -
trunk/NEMO/TOP_SRC/TRP/trdmld_trc_rst.F90
r1174 r1175 67 67 ! 68 68 CHARACTER (len=35) :: charout 69 INTEGER :: jk, jn ! loop indice69 INTEGER :: jl, jk, jn ! loop indice 70 70 !!-------------------------------------------------------------------------------- 71 71 … … 120 120 END DO ! tracer loop 121 121 ! ! =========== 122 #if defined key_lobster 123 DO jl = 1, jp_lobster_trd 124 CALL iom_rstput( kt, nitrst, nummldw_trc, 'tmltrd_csum_ub_bio'//ctrd_bio(jl,2), tmltrd_csum_ub_bio(:,:,jl) ) 125 ENDDO 126 #endif 127 122 128 ENDIF 123 129 … … 139 145 ! 140 146 CHARACTER (len=35) :: charout 141 INTEGER :: jk, jn! loop indice147 INTEGER :: jk, jn, jl ! loop indice 142 148 !!----------------------------------------------------------------------------- 143 149 … … 189 195 END DO ! tracer loop 190 196 ! ! =========== 197 198 #if defined key_lobster 199 DO jl = 1, jp_lobster_trd 200 CALL iom_get( inum, jpdom_local, 'tmltrd_csum_ub_bio'//ctrd_bio(jl,2), tmltrd_csum_ub_bio(:,:,jl) ) 201 ENDDO 202 #endif 191 203 192 204 CALL iom_close( inum ) -
trunk/NEMO/TOP_SRC/TRP/trp_trc.F90
r1146 r1175 51 51 52 52 # if defined key_trc_diatrd 53 53 54 54 !! non conservative trends (biological, ...) 55 55 !! -------------------------------------------------- 56 LOGICAL, PUBLIC, DIMENSION (jptra) :: luttrd !: large trends diagnostic to write or not (namelist)57 58 56 !! Advection-diffusion trends 59 57 REAL(wp), PUBLIC, DIMENSION(:,:,:,:,:), ALLOCATABLE :: trtrd !: trends of the tracer equations 60 58 61 59 INTEGER, PUBLIC, DIMENSION(jptra) :: ikeep ! indice of tracer for which dyn trends are stored 62 INTEGER, PUBLIC :: nkeep ! number of tracers for which dyn trends are stored 60 INTEGER, PUBLIC :: nkeep ! number of tracers for which dyn trends are stored 63 61 ! ! (used to allocate trtrd buffer) 64 62 65 !! netcdf files and index common66 !! --------------------------------------------------67 63 INTEGER , PUBLIC :: nwritetrd !: frequency of additional arrays outputs(namelist) 68 69 # endif 70 64 # endif 71 65 #else 72 66 !!----------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.