Changeset 10802 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_qck.F90
- Timestamp:
- 2019-03-26T09:50:57+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/TRA/traadv_qck.F90
r10425 r10802 47 47 CONTAINS 48 48 49 SUBROUTINE tra_adv_qck ( kt, kit000, cdtype, p2dt, pun, pvn, pwn, &50 & ptb, ptn, pta, kjpt )49 SUBROUTINE tra_adv_qck ( kt, kit000, ktlev, cdtype, p2dt, pu, pv, pwn, & 50 & pt_lev1, pt_lev2, pt_rhs, kjpt ) 51 51 !!---------------------------------------------------------------------- 52 52 !! *** ROUTINE tra_adv_qck *** … … 72 72 !! dt = 2*rdtra and the scalar values are tb and sb 73 73 !! 74 !! On the vertical, the simple centered scheme used pt n74 !! On the vertical, the simple centered scheme used pt_lev2 75 75 !! 76 76 !! The fluxes are bounded by the ULTIMATE limiter to … … 78 78 !! prevent the appearance of spurious numerical oscillations 79 79 !! 80 !! ** Action : - update pt awith the now advective tracer trends80 !! ** Action : - update pt_rhs with the now advective tracer trends 81 81 !! - send trends to trdtra module for further diagnostcs (l_trdtra=T) 82 82 !! - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T) … … 86 86 INTEGER , INTENT(in ) :: kt ! ocean time-step index 87 87 INTEGER , INTENT(in ) :: kit000 ! first time step index 88 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms 88 89 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 89 90 INTEGER , INTENT(in ) :: kjpt ! number of tracers 90 91 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 91 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu n, pvn, pwn ! 3 ocean velocity components92 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt b, ptn! before and now tracer fields93 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt a! tracer trend92 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu, pv, pwn ! 3 ocean velocity components 93 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt_lev1, pt_lev2 ! before and now tracer fields 94 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 94 95 !!---------------------------------------------------------------------- 95 96 ! … … 108 109 ! 109 110 ! ! horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 110 CALL tra_adv_qck_i( kt, cdtype, p2dt, pun, ptb, ptn, pta, kjpt )111 CALL tra_adv_qck_j( kt, cdtype, p2dt, pvn, ptb, ptn, pta, kjpt )111 CALL tra_adv_qck_i( kt, ktlev, cdtype, p2dt, pu, pt_lev1, pt_lev2, pt_rhs, kjpt ) 112 CALL tra_adv_qck_j( kt, ktlev, cdtype, p2dt, pv, pt_lev1, pt_lev2, pt_rhs, kjpt ) 112 113 113 114 ! ! vertical fluxes are computed with the 2nd order centered scheme 114 CALL tra_adv_cen2_k( kt, cdtype, pwn, ptn, pta, kjpt )115 CALL tra_adv_cen2_k( kt, ktlev, cdtype, pwn, pt_lev2, pt_rhs, kjpt ) 115 116 ! 116 117 END SUBROUTINE tra_adv_qck 117 118 118 119 119 SUBROUTINE tra_adv_qck_i( kt, cdtype, p2dt, pun, &120 & pt b, ptn, pta, kjpt )120 SUBROUTINE tra_adv_qck_i( kt, ktlev, cdtype, p2dt, pu, & 121 & pt_lev1, pt_lev2, pt_rhs, kjpt ) 121 122 !!---------------------------------------------------------------------- 122 123 !! 123 124 !!---------------------------------------------------------------------- 124 125 INTEGER , INTENT(in ) :: kt ! ocean time-step index 126 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms 125 127 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 126 128 INTEGER , INTENT(in ) :: kjpt ! number of tracers 127 129 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 128 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu n! i-velocity components129 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt b, ptn! before and now tracer fields130 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt a! tracer trend130 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pu ! i-velocity components 131 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt_lev1, pt_lev2 ! before and now tracer fields 132 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 131 133 !! 132 134 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 145 147 DO jj = 2, jpjm1 146 148 DO ji = fs_2, fs_jpim1 ! vector opt. 147 zfc(ji,jj,jk) = pt b(ji-1,jj,jk,jn) ! Upstream in the x-direction for the tracer148 zfd(ji,jj,jk) = pt b(ji+1,jj,jk,jn) ! Downstream in the x-direction for the tracer149 zfc(ji,jj,jk) = pt_lev1(ji-1,jj,jk,jn) ! Upstream in the x-direction for the tracer 150 zfd(ji,jj,jk) = pt_lev1(ji+1,jj,jk,jn) ! Downstream in the x-direction for the tracer 149 151 END DO 150 152 END DO … … 158 160 DO jj = 2, jpjm1 159 161 DO ji = fs_2, fs_jpim1 ! vector opt. 160 zdir = 0.5 + SIGN( 0.5, pu n(ji,jj,jk) ) ! if pun> 0 : zdir = 1 otherwise zdir = 0162 zdir = 0.5 + SIGN( 0.5, pu(ji,jj,jk) ) ! if pu > 0 : zdir = 1 otherwise zdir = 0 161 163 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji+1,jj,jk) ! FU in the x-direction for T 162 164 END DO … … 167 169 DO jj = 2, jpjm1 168 170 DO ji = fs_2, fs_jpim1 ! vector opt. 169 zdir = 0.5 + SIGN( 0.5, pu n(ji,jj,jk) ) ! if pun> 0 : zdir = 1 otherwise zdir = 0170 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u _n(ji,jj,jk)171 zwx(ji,jj,jk) = ABS( pu n(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction)172 zfc(ji,jj,jk) = zdir * pt b(ji ,jj,jk,jn) + ( 1. - zdir ) * ptb(ji+1,jj,jk,jn) ! FC in the x-direction for T173 zfd(ji,jj,jk) = zdir * pt b(ji+1,jj,jk,jn) + ( 1. - zdir ) * ptb(ji ,jj,jk,jn) ! FD in the x-direction for T171 zdir = 0.5 + SIGN( 0.5, pu(ji,jj,jk) ) ! if pu > 0 : zdir = 1 otherwise zdir = 0 172 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u(ji,jj,jk,ktlev) 173 zwx(ji,jj,jk) = ABS( pu(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) 174 zfc(ji,jj,jk) = zdir * pt_lev1(ji ,jj,jk,jn) + ( 1. - zdir ) * pt_lev1(ji+1,jj,jk,jn) ! FC in the x-direction for T 175 zfd(ji,jj,jk) = zdir * pt_lev1(ji+1,jj,jk,jn) + ( 1. - zdir ) * pt_lev1(ji ,jj,jk,jn) ! FD in the x-direction for T 174 176 END DO 175 177 END DO … … 197 199 DO jj = 2, jpjm1 198 200 DO ji = fs_2, fs_jpim1 ! vector opt. 199 zdir = 0.5 + SIGN( 0.5, pu n(ji,jj,jk) ) ! if pun> 0 : zdir = 1 otherwise zdir = 0201 zdir = 0.5 + SIGN( 0.5, pu(ji,jj,jk) ) ! if pu > 0 : zdir = 1 otherwise zdir = 0 200 202 !--- If the second ustream point is a land point 201 203 !--- the flux is computed by the 1st order UPWIND scheme 202 204 zmsk = zdir * zfu(ji,jj,jk) + ( 1. - zdir ) * zfu(ji+1,jj,jk) 203 205 zwx(ji,jj,jk) = zmsk * zwx(ji,jj,jk) + ( 1. - zmsk ) * zfc(ji,jj,jk) 204 zwx(ji,jj,jk) = zwx(ji,jj,jk) * pu n(ji,jj,jk)206 zwx(ji,jj,jk) = zwx(ji,jj,jk) * pu(ji,jj,jk) 205 207 END DO 206 208 END DO … … 213 215 DO jj = 2, jpjm1 214 216 DO ji = fs_2, fs_jpim1 ! vector opt. 215 zbtr = r1_e1e2t(ji,jj) / e3t _n(ji,jj,jk)217 zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,ktlev) 216 218 ! horizontal advective trends 217 219 ztra = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) ) 218 220 !--- add it to the general tracer trends 219 pt a(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra221 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ztra 220 222 END DO 221 223 END DO 222 224 END DO 223 225 ! ! trend diagnostics 224 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pu n, ptn(:,:,:,jn) )226 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pu, pt_lev2(:,:,:,jn) ) 225 227 ! 226 228 END DO … … 229 231 230 232 231 SUBROUTINE tra_adv_qck_j( kt, cdtype, p2dt, pvn, &232 & pt b, ptn, pta, kjpt )233 SUBROUTINE tra_adv_qck_j( kt, ktlev, cdtype, p2dt, pv, & 234 & pt_lev1, pt_lev2, pt_rhs, kjpt ) 233 235 !!---------------------------------------------------------------------- 234 236 !! 235 237 !!---------------------------------------------------------------------- 236 238 INTEGER , INTENT(in ) :: kt ! ocean time-step index 239 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms 237 240 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 238 241 INTEGER , INTENT(in ) :: kjpt ! number of tracers 239 242 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 240 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pv n! j-velocity components241 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt b, ptn! before and now tracer fields242 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt a! tracer trend243 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pv ! j-velocity components 244 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt_lev1, pt_lev2 ! before and now tracer fields 245 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 243 246 !! 244 247 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 259 262 DO ji = fs_2, fs_jpim1 ! vector opt. 260 263 ! Upstream in the x-direction for the tracer 261 zfc(ji,jj,jk) = pt b(ji,jj-1,jk,jn)264 zfc(ji,jj,jk) = pt_lev1(ji,jj-1,jk,jn) 262 265 ! Downstream in the x-direction for the tracer 263 zfd(ji,jj,jk) = pt b(ji,jj+1,jk,jn)266 zfd(ji,jj,jk) = pt_lev1(ji,jj+1,jk,jn) 264 267 END DO 265 268 END DO … … 275 278 DO jj = 2, jpjm1 276 279 DO ji = fs_2, fs_jpim1 ! vector opt. 277 zdir = 0.5 + SIGN( 0.5, pv n(ji,jj,jk) ) ! if pun> 0 : zdir = 1 otherwise zdir = 0280 zdir = 0.5 + SIGN( 0.5, pv(ji,jj,jk) ) ! if pu > 0 : zdir = 1 otherwise zdir = 0 278 281 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji,jj+1,jk) ! FU in the x-direction for T 279 282 END DO … … 284 287 DO jj = 2, jpjm1 285 288 DO ji = fs_2, fs_jpim1 ! vector opt. 286 zdir = 0.5 + SIGN( 0.5, pv n(ji,jj,jk) ) ! if pun> 0 : zdir = 1 otherwise zdir = 0287 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v _n(ji,jj,jk)288 zwy(ji,jj,jk) = ABS( pv n(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction)289 zfc(ji,jj,jk) = zdir * pt b(ji,jj ,jk,jn) + ( 1. - zdir ) * ptb(ji,jj+1,jk,jn) ! FC in the x-direction for T290 zfd(ji,jj,jk) = zdir * pt b(ji,jj+1,jk,jn) + ( 1. - zdir ) * ptb(ji,jj ,jk,jn) ! FD in the x-direction for T289 zdir = 0.5 + SIGN( 0.5, pv(ji,jj,jk) ) ! if pu > 0 : zdir = 1 otherwise zdir = 0 290 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v(ji,jj,jk,ktlev) 291 zwy(ji,jj,jk) = ABS( pv(ji,jj,jk) ) * p2dt / zdx ! (0<zc_cfl<1 : Courant number on x-direction) 292 zfc(ji,jj,jk) = zdir * pt_lev1(ji,jj ,jk,jn) + ( 1. - zdir ) * pt_lev1(ji,jj+1,jk,jn) ! FC in the x-direction for T 293 zfd(ji,jj,jk) = zdir * pt_lev1(ji,jj+1,jk,jn) + ( 1. - zdir ) * pt_lev1(ji,jj ,jk,jn) ! FD in the x-direction for T 291 294 END DO 292 295 END DO … … 314 317 DO jj = 2, jpjm1 315 318 DO ji = fs_2, fs_jpim1 ! vector opt. 316 zdir = 0.5 + SIGN( 0.5, pv n(ji,jj,jk) ) ! if pun> 0 : zdir = 1 otherwise zdir = 0319 zdir = 0.5 + SIGN( 0.5, pv(ji,jj,jk) ) ! if pu > 0 : zdir = 1 otherwise zdir = 0 317 320 !--- If the second ustream point is a land point 318 321 !--- the flux is computed by the 1st order UPWIND scheme 319 322 zmsk = zdir * zfu(ji,jj,jk) + ( 1. - zdir ) * zfu(ji,jj+1,jk) 320 323 zwy(ji,jj,jk) = zmsk * zwy(ji,jj,jk) + ( 1. - zmsk ) * zfc(ji,jj,jk) 321 zwy(ji,jj,jk) = zwy(ji,jj,jk) * pv n(ji,jj,jk)324 zwy(ji,jj,jk) = zwy(ji,jj,jk) * pv(ji,jj,jk) 322 325 END DO 323 326 END DO … … 330 333 DO jj = 2, jpjm1 331 334 DO ji = fs_2, fs_jpim1 ! vector opt. 332 zbtr = r1_e1e2t(ji,jj) / e3t _n(ji,jj,jk)335 zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,ktlev) 333 336 ! horizontal advective trends 334 337 ztra = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) ) 335 338 !--- add it to the general tracer trends 336 pt a(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra339 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + ztra 337 340 END DO 338 341 END DO 339 342 END DO 340 343 ! ! trend diagnostics 341 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pv n, ptn(:,:,:,jn) )344 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pv, pt_lev2(:,:,:,jn) ) 342 345 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 343 346 IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) … … 348 351 349 352 350 SUBROUTINE tra_adv_cen2_k( kt, cdtype, pwn, &351 & pt n, pta, kjpt )353 SUBROUTINE tra_adv_cen2_k( kt, ktlev, cdtype, pwn, & 354 & pt_lev2, pt_rhs, kjpt ) 352 355 !!---------------------------------------------------------------------- 353 356 !! 354 357 !!---------------------------------------------------------------------- 355 358 INTEGER , INTENT(in ) :: kt ! ocean time-step index 359 INTEGER , INTENT(in ) :: ktlev ! time level index for source terms 356 360 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 357 361 INTEGER , INTENT(in ) :: kjpt ! number of tracers 358 362 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pwn ! vertical velocity 359 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt n! before and now tracer fields360 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt a! tracer trend363 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pt_lev2 ! before and now tracer fields 364 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pt_rhs ! tracer trend 361 365 ! 362 366 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 374 378 DO jj = 2, jpjm1 375 379 DO ji = fs_2, fs_jpim1 ! vector opt. 376 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( pt n(ji,jj,jk-1,jn) + ptn(ji,jj,jk,jn) ) * wmask(ji,jj,jk)380 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( pt_lev2(ji,jj,jk-1,jn) + pt_lev2(ji,jj,jk,jn) ) * wmask(ji,jj,jk) 377 381 END DO 378 382 END DO … … 382 386 DO jj = 1, jpj 383 387 DO ji = 1, jpi 384 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * pt n(ji,jj,mikt(ji,jj),jn) ! linear free surface388 zwz(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * pt_lev2(ji,jj,mikt(ji,jj),jn) ! linear free surface 385 389 END DO 386 390 END DO 387 391 ELSE ! no ocean cavities (only ocean surface) 388 zwz(:,:,1) = pwn(:,:,1) * pt n(:,:,1,jn)392 zwz(:,:,1) = pwn(:,:,1) * pt_lev2(:,:,1,jn) 389 393 ENDIF 390 394 ENDIF … … 393 397 DO jj = 2, jpjm1 394 398 DO ji = fs_2, fs_jpim1 ! vector opt. 395 pt a(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) &396 & * r1_e1e2t(ji,jj) / e3t _n(ji,jj,jk)399 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) & 400 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,ktlev) 397 401 END DO 398 402 END DO 399 403 END DO 400 404 ! ! Send trends for diagnostic 401 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pwn, pt n(:,:,:,jn) )405 IF( l_trd ) CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pwn, pt_lev2(:,:,:,jn) ) 402 406 ! 403 407 END DO
Note: See TracChangeset
for help on using the changeset viewer.