- Timestamp:
- 2011-12-11T16:00:26+01:00 (12 years ago)
- Location:
- branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA
- Files:
-
- 2 added
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90
r2715 r3211 61 61 62 62 REAL(wp), PUBLIC :: ralpbet !: alpha / beta ratio 63 64 !! * Control permutation of array indices 65 # include "dom_oce_ftrans.h90" 66 # include "zdfddm_ftrans.h90" 63 67 64 68 !! * Substitutions … … 111 115 USE wrk_nemo, ONLY: zws => wrk_3d_1 ! 3D workspace 112 116 !! 117 118 !FTRANS zws :I :I :z 119 !FTRANS pts :I :I :z :I 120 !FTRANS prd :I :I :z 121 113 122 REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) :: pts ! 1 : potential temperature [Celcius] 114 123 ! ! 2 : salinity [psu] … … 135 144 zws(:,:,:) = SQRT( ABS( pts(:,:,:,jp_sal) ) ) 136 145 ! 146 #if defined key_z_first 147 DO jj = 1, jpj 148 DO ji = 1, jpi 149 DO jk = 1, jpkm1 150 #else 137 151 DO jk = 1, jpkm1 138 152 DO jj = 1, jpj 139 153 DO ji = 1, jpi 154 #endif 140 155 zt = pts (ji,jj,jk,jp_tem) 141 156 zs = pts (ji,jj,jk,jp_sal) … … 178 193 ! 179 194 CASE( 1 ) !== Linear formulation function of temperature only ==! 195 #if defined key_z_first 196 DO jj = 1, jpj 197 DO ji = 1, jpi 198 DO jk = 1, jpkm1 199 prd(ji,jj,jk) = ( 0.0285_wp - rn_alpha * pts(ji,jj,jk,jp_tem) ) * tmask(ji,jj,jk) 200 END DO 201 END DO 202 END DO 203 #else 180 204 DO jk = 1, jpkm1 181 205 prd(:,:,jk) = ( 0.0285_wp - rn_alpha * pts(:,:,jk,jp_tem) ) * tmask(:,:,jk) 182 206 END DO 207 #endif 183 208 ! 184 209 CASE( 2 ) !== Linear formulation function of temperature and salinity ==! 210 #if defined key_z_first 211 DO jj = 1, jpj 212 DO ji = 1, jpi 213 DO jk = 1, jpkm1 214 prd(ji,jj,jk) = ( rn_beta * pts(ji,jj,jk,jp_sal) - rn_alpha * pts(ji,jj,jk,jp_tem) ) * tmask(ji,jj,jk) 215 END DO 216 END DO 217 END DO 218 #else 185 219 DO jk = 1, jpkm1 186 220 prd(:,:,jk) = ( rn_beta * pts(:,:,jk,jp_sal) - rn_alpha * pts(:,:,jk,jp_tem) ) * tmask(:,:,jk) 187 221 END DO 222 #endif 188 223 ! 189 224 END SELECT … … 193 228 IF( wrk_not_released(3, 1) ) CALL ctl_stop('eos_insitu: failed to release workspace array') 194 229 ! 230 231 !! * Reset control of array index permutation 232 !FTRANS CLEAR 233 # include "dom_oce_ftrans.h90" 234 # include "zdfddm_ftrans.h90" 235 195 236 END SUBROUTINE eos_insitu 196 237 … … 245 286 USE wrk_nemo, ONLY: zws => wrk_3d_1 ! 3D workspace 246 287 !! 247 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts ! 1 : potential temperature [Celcius] 248 ! ! 2 : salinity [psu] 249 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT( out) :: prd ! in situ density [-] 250 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT( out) :: prhop ! potential density (surface referenced) 288 289 !FTRANS zws :I :I :z 290 !FTRANS pts :I :I :z :I 291 !FTRANS prd :I :I :z 292 !FTRANS prhop :I :I :z 293 294 !!DCSE NEMO: This style defeats ftrans 295 ! REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts ! 1 : potential temperature [Celcius] 296 ! ! ! 2 : salinity [psu] 297 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT( out) :: prd ! in situ density [-] 298 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT( out) :: prhop ! potential density (surface referenced) 299 REAL(wp), INTENT(in ) :: pts(jpi,jpj,jpk,jpts) ! 1 : potential temperature [Celcius] 300 ! ! 2 : salinity [psu] 301 REAL(wp), INTENT( out) :: prd(jpi,jpj,jpk) ! in situ density [-] 302 REAL(wp), INTENT( out) :: prhop(jpi,jpj,jpk) ! potential density (surface referenced) 251 303 ! 252 304 INTEGER :: ji, jj, jk ! dummy loop indices … … 266 318 zws(:,:,:) = SQRT( ABS( pts(:,:,:,jp_sal) ) ) 267 319 ! 320 #if defined key_z_first 321 DO jj = 1, jpj 322 DO ji = 1, jpi 323 DO jk = 1, jpkm1 324 #else 268 325 DO jk = 1, jpkm1 269 326 DO jj = 1, jpj 270 327 DO ji = 1, jpi 328 #endif 271 329 zt = pts (ji,jj,jk,jp_tem) 272 330 zs = pts (ji,jj,jk,jp_sal) … … 312 370 ! 313 371 CASE( 1 ) !== Linear formulation = F( temperature ) ==! 372 #if defined key_z_first 373 DO jj = 1, jpj 374 DO ji = 1, jpi 375 DO jk = 1, jpkm1 376 prd (ji,jj,jk) = ( 0.0285_wp - rn_alpha * pts(ji,jj,jk,jp_tem) ) * tmask(ji,jj,jk) 377 prhop(ji,jj,jk) = ( 1.e0_wp + prd(ji,jj,jk) ) * rau0 * tmask(ji,jj,jk) 378 END DO 379 END DO 380 END DO 381 #else 314 382 DO jk = 1, jpkm1 315 383 prd (:,:,jk) = ( 0.0285_wp - rn_alpha * pts(:,:,jk,jp_tem) ) * tmask(:,:,jk) 316 384 prhop(:,:,jk) = ( 1.e0_wp + prd (:,:,jk) ) * rau0 * tmask(:,:,jk) 317 385 END DO 386 #endif 318 387 ! 319 388 CASE( 2 ) !== Linear formulation = F( temperature , salinity ) ==! 389 #if defined key_z_first 390 DO jj = 1, jpj 391 DO ji = 1, jpi 392 DO jk = 1, jpkm1 393 prd (ji,jj,jk) = ( rn_beta * pts(ji,jj,jk,jp_sal) - rn_alpha * pts(ji,jj,jk,jp_tem) ) * tmask(ji,jj,jk) 394 prhop(ji,jj,jk) = ( 1.e0_wp + prd(ji,jj,jk) ) * rau0 * tmask(ji,jj,jk) 395 END DO 396 END DO 397 END DO 398 #else 320 399 DO jk = 1, jpkm1 321 400 prd (:,:,jk) = ( rn_beta * pts(:,:,jk,jp_sal) - rn_alpha * pts(:,:,jk,jp_tem) ) * tmask(:,:,jk) 322 401 prhop(:,:,jk) = ( 1.e0_wp + prd (:,:,jk) ) * rau0 * tmask(:,:,jk) 323 402 END DO 403 #endif 324 404 ! 325 405 END SELECT … … 329 409 IF( wrk_not_released(3, 1) ) CALL ctl_stop('eos_insitu_pot: failed to release workspace array') 330 410 ! 411 412 !! * Reset control of array index permutation 413 !FTRANS CLEAR 414 # include "dom_oce_ftrans.h90" 415 # include "zdfddm_ftrans.h90" 416 331 417 END SUBROUTINE eos_insitu_pot 332 418 … … 400 486 DO jj = 1, jpjm1 401 487 DO ji = 1, fs_jpim1 ! vector opt. 488 #if defined key_z_first 489 zmask = tmask_1(ji,jj) ! land/sea bottom mask = surf. mask 490 #else 402 491 zmask = tmask(ji,jj,1) ! land/sea bottom mask = surf. mask 492 #endif 403 493 zt = pts (ji,jj,jp_tem) ! interpolated T 404 494 zs = pts (ji,jj,jp_sal) ! interpolated S … … 442 532 DO jj = 1, jpjm1 443 533 DO ji = 1, fs_jpim1 ! vector opt. 534 #if defined key_z_first 535 prd(ji,jj) = ( 0.0285_wp - rn_alpha * pts(ji,jj,jp_tem) ) * tmask_1(ji,jj) 536 #else 444 537 prd(ji,jj) = ( 0.0285_wp - rn_alpha * pts(ji,jj,jp_tem) ) * tmask(ji,jj,1) 538 #endif 445 539 END DO 446 540 END DO … … 449 543 DO jj = 1, jpjm1 450 544 DO ji = 1, fs_jpim1 ! vector opt. 545 #if defined key_z_first 546 prd(ji,jj) = ( rn_beta * pts(ji,jj,jp_sal) - rn_alpha * pts(ji,jj,jp_tem) ) * tmask_1(ji,jj) 547 #else 451 548 prd(ji,jj) = ( rn_beta * pts(ji,jj,jp_sal) - rn_alpha * pts(ji,jj,jp_tem) ) * tmask(ji,jj,1) 549 #endif 452 550 END DO 453 551 END DO … … 492 590 !! References : McDougall, J. Phys. Oceanogr., 17, 1950-1964, 1987. 493 591 !!---------------------------------------------------------------------- 494 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts ! 1 : potential temperature [Celcius] 495 ! ! 2 : salinity [psu] 496 REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: pn2 ! Brunt-Vaisala frequency [s-1] 592 593 !FTRANS pts :I :I :z :I 594 !FTRANS pn2 :I :I :z 595 596 !!DCSE_NEMO: This style defeats ftrans 597 ! REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts ! 1 : potential temperature [Celcius] 598 ! ! ! 2 : salinity [psu] 599 ! REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: pn2 ! Brunt-Vaisala frequency [s-1] 600 601 REAL(wp), INTENT(in ) :: pts(jpi,jpj,jpk,jpts) ! 1 : potential temperature [Celcius] 602 ! ! 2 : salinity [psu] 603 REAL(wp), INTENT( out) :: pn2(jpi,jpj,jpk) ! Brunt-Vaisala frequency [s-1] 497 604 !! 498 605 INTEGER :: ji, jj, jk ! dummy loop indices … … 509 616 ! 510 617 CASE( 0 ) !== Jackett and McDougall (1994) formulation ==! 618 #if defined key_z_first 619 DO jj = 1, jpj 620 DO ji = 1, jpi 621 DO jk = 2, jpkm1 622 #else 511 623 DO jk = 2, jpkm1 512 624 DO jj = 1, jpj 513 625 DO ji = 1, jpi 626 #endif 514 627 zgde3w = grav / fse3w(ji,jj,jk) 515 628 zt = 0.5 * ( pts(ji,jj,jk,jp_tem) + pts(ji,jj,jk-1,jp_tem) ) ! potential temperature at w-pt … … 556 669 ! 557 670 CASE( 1 ) !== Linear formulation = F( temperature ) ==! 671 #if defined key_z_first 672 DO jj = 1, jpj 673 DO ji = 1, jpi 674 DO jk = 2, jpkm1 675 pn2(ji,jj,jk) = grav * rn_alpha * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) ) & 676 & / fse3w(ji,jj,jk) * tmask(ji,jj,jk) 677 END DO 678 END DO 679 END DO 680 #else 558 681 DO jk = 2, jpkm1 559 682 pn2(:,:,jk) = grav * rn_alpha * ( pts(:,:,jk-1,jp_tem) - pts(:,:,jk,jp_tem) ) / fse3w(:,:,jk) * tmask(:,:,jk) 560 683 END DO 684 #endif 561 685 ! 562 686 CASE( 2 ) !== Linear formulation = F( temperature , salinity ) ==! 687 #if defined key_z_first 688 DO jj = 1, jpj 689 DO ji = 1, jpi 690 DO jk = 2, jpkm1 691 pn2(ji,jj,jk) = grav * ( rn_alpha * ( pts(ji,jj,jk-1,jp_tem) - pts(ji,jj,jk,jp_tem) ) & 692 & - rn_beta * ( pts(ji,jj,jk-1,jp_sal) - pts(ji,jj,jk,jp_sal) ) ) & 693 & / fse3w(ji,jj,jk) * tmask(ji,jj,jk) 694 END DO 695 END DO 696 END DO 697 #else 563 698 DO jk = 2, jpkm1 564 699 pn2(:,:,jk) = grav * ( rn_alpha * ( pts(:,:,jk-1,jp_tem) - pts(:,:,jk,jp_tem) ) & … … 566 701 & / fse3w(:,:,jk) * tmask(:,:,jk) 567 702 END DO 703 #endif 568 704 #if defined key_zdfddm 705 #if defined key_z_first 706 DO jj = 1, jpj ! Rrau = (alpha / beta) (dk[t] / dk[s]) 707 DO ji = 1, jpi 708 DO jk = 2, jpkm1 709 #else 569 710 DO jk = 2, jpkm1 ! Rrau = (alpha / beta) (dk[t] / dk[s]) 570 711 DO jj = 1, jpj 571 712 DO ji = 1, jpi 713 #endif 572 714 zds = ( pts(ji,jj,jk-1,jp_sal) - pts(ji,jj,jk,jp_sal) ) 573 715 IF ( ABS( zds ) <= 1.e-20_wp ) zds = 1.e-20_wp … … 584 726 #endif 585 727 ! 728 729 !! * Reset control of array index permutation 730 !FTRANS CLEAR 731 # include "dom_oce_ftrans.h90" 732 # include "zdfddm_ftrans.h90" 733 586 734 END SUBROUTINE eos_bn2 587 735 … … 609 757 !! ** Action : - palph, pbeta : thermal and haline expansion coeff. at T-point 610 758 !!---------------------------------------------------------------------- 611 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts ! pot. temperature & salinity 612 REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: palph, pbeta ! thermal & haline expansion coeff. 759 760 !FTRANS pts :I :I :z :I 761 !FTRANS palph :I :I :z 762 !FTRANS pbeta :I :I :z 763 !!DCSE_NEMO: This style defeats ftrans 764 ! REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in ) :: pts ! pot. temperature & salinity 765 ! REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: palph, pbeta ! thermal & haline expansion coeff. 766 REAL(wp), INTENT(in ) :: pts(jpi,jpj,jpk,jpts) ! pot. temperature & salinity 767 REAL(wp), INTENT( out) :: palph(jpi,jpj,jpk) ! thermal expansion coeff. 768 REAL(wp), INTENT( out) :: pbeta(jpi,jpj,jpk) ! haline expansion coeff. 613 769 ! 614 770 INTEGER :: ji, jj, jk ! dummy loop indices … … 619 775 ! 620 776 CASE ( 0 ) ! Jackett and McDougall (1994) formulation 777 #if defined key_z_first 778 DO jj = 1, jpj 779 DO ji = 1, jpi 780 DO jk = 1, jpk 781 #else 621 782 DO jk = 1, jpk 622 783 DO jj = 1, jpj 623 784 DO ji = 1, jpi 785 #endif 624 786 zt = pts(ji,jj,jk,jp_tem) ! potential temperature 625 787 zs = pts(ji,jj,jk,jp_sal) - 35._wp ! salinity anomaly (s-35) … … 670 832 END SELECT 671 833 ! 834 835 !! * Reset control of array index permutation 836 !FTRANS CLEAR 837 # include "dom_oce_ftrans.h90" 838 # include "zdfddm_ftrans.h90" 839 672 840 END SUBROUTINE eos_alpbet 673 841 -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90
r2715 r3211 44 44 INTEGER :: nadv ! choice of the type of advection scheme 45 45 46 !! * Control permutation of array indices 47 # include "oce_ftrans.h90" 48 # include "dom_oce_ftrans.h90" 49 # include "ldftra_oce_ftrans.h90" 50 46 51 !! * Substitutions 47 52 # include "domzgr_substitute.h90" … … 64 69 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 65 70 USE wrk_nemo, ONLY: zun => wrk_3d_1 , zvn => wrk_3d_2 , zwn => wrk_3d_3 ! 3D workspace 71 72 !! DCSE_NEMO: need additional directives for renamed module variables 73 !FTRANS zun zvn zwn :I :I :z 74 66 75 ! 67 76 INTEGER, INTENT( in ) :: kt ! ocean time-step index 68 77 ! 69 INTEGER :: j k ! dummy loop index78 INTEGER :: ji, jj, jk ! dummy loop index 70 79 !!---------------------------------------------------------------------- 71 80 ! … … 83 92 ! 84 93 ! !== effective transport ==! 94 #if defined key_z_first 95 DO jj = 1, jpj 96 DO ji = 1, jpi 97 DO jk = 1, jpkm1 98 zun(ji,jj,jk) = e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk) ! eulerian transport only 99 zvn(ji,jj,jk) = e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk) 100 zwn(ji,jj,jk) = e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk) 101 END DO 102 zun(ji,jj,jpk) = 0._wp ! no transport trough the bottom 103 zvn(ji,jj,jpk) = 0._wp ! no transport trough the bottom 104 zwn(ji,jj,jpk) = 0._wp ! no transport trough the bottom 105 END DO 106 END DO 107 #else 85 108 DO jk = 1, jpkm1 86 109 zun(:,:,jk) = e2u(:,:) * fse3u(:,:,jk) * un(:,:,jk) ! eulerian transport only … … 91 114 zvn(:,:,jpk) = 0._wp ! no transport trough the bottom 92 115 zwn(:,:,jpk) = 0._wp ! no transport trough the bottom 116 #endif 93 117 ! 94 118 IF( lk_traldf_eiv .AND. .NOT. ln_traldf_grif ) & -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_cen2.F90
r2715 r3211 43 43 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: upsmsk !: mixed upstream/centered scheme near some straits 44 44 ! ! and in closed seas (orca 2 and 4 configurations) 45 46 !! * Control permutation of array indices 47 # include "oce_ftrans.h90" 48 # include "dom_oce_ftrans.h90" 49 # include "trc_oce_ftrans.h90" 50 # include "zdf_oce_ftrans.h90" 51 45 52 !! * Substitutions 46 53 # include "domzgr_substitute.h90" … … 114 121 USE wrk_nemo, ONLY: zwz => wrk_3d_1 , zind => wrk_3d_2 ! 3D workspace 115 122 USE wrk_nemo, ONLY: ztfreez => wrk_2d_1 ! 2D - 123 !! DCSE_NEMO: need additional directives for renamed module variables 124 !FTRANS zwx zwy zwz zind :I :I :z 116 125 ! 117 126 INTEGER , INTENT(in ) :: kt ! ocean time-step index 118 127 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 119 128 INTEGER , INTENT(in ) :: kjpt ! number of tracers 120 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 121 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 122 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 129 130 !! DCSE_NEMO: This style defeats ftrans 131 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 132 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 133 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 134 135 !FTRANS pun pvn pwn :I :I :z 136 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! ocean velocity component 137 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! ocean velocity component 138 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! ocean velocity component 139 !FTRANS ptb ptn pta :I :I :z : 140 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer field (before) 141 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer field (now) 142 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 123 143 ! 124 144 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 164 184 !!gm not a big deal since cen2 is no more used in global ice-ocean simulations 165 185 ztfreez(:,:) = tfreez( tsn(:,:,1,jp_sal) ) 186 #if defined key_z_first 187 DO jj = 1, jpj 188 DO ji = 1, jpi 189 DO jk = 1, jpk 190 #else 166 191 DO jk = 1, jpk 167 192 DO jj = 1, jpj 168 193 DO ji = 1, jpi 194 #endif 169 195 ! ! below ice covered area (if tn < "freezing"+0.1 ) 170 196 IF( tsn(ji,jj,jk,jp_tem) <= ztfreez(ji,jj) + 0.1 ) THEN ; zice = 1.e0 … … 185 211 ! ==================== 186 212 ! 213 #if defined key_z_first 214 DO jj = 1, jpjm1 215 DO ji = 1, fs_jpim1 216 DO jk = 1, jpkm1 217 #else 187 218 DO jk = 1, jpkm1 188 219 ! ! Second order centered tracer flux at u- and v-points … … 190 221 ! 191 222 DO ji = 1, fs_jpim1 ! vector opt. 223 #endif 192 224 ! upstream indicator 193 225 zcofi = MAX( zind(ji+1,jj,jk), zind(ji,jj,jk) ) … … 221 253 ENDIF 222 254 ! 255 #if defined key_z_first 256 DO jj = 2, jpjm1 257 DO ji = fs_2, fs_jpim1 ! vector opt. 258 DO jk = 2, jpk 259 #else 223 260 DO jk = 2, jpk ! Second order centered tracer flux at w-point 224 261 DO jj = 2, jpjm1 225 262 DO ji = fs_2, fs_jpim1 ! vector opt. 263 #endif 226 264 ! upstream indicator 227 265 zcofk = MAX( zind(ji,jj,jk-1), zind(ji,jj,jk) ) … … 240 278 ! II. Divergence of advective fluxes 241 279 ! ---------------------------------- 280 #if defined key_z_first 281 DO jj = 2, jpjm1 282 DO ji = fs_2, fs_jpim1 ! vector opt. 283 DO jk = 1, jpkm1 284 #else 242 285 DO jk = 1, jpkm1 243 286 DO jj = 2, jpjm1 244 287 DO ji = fs_2, fs_jpim1 ! vector opt. 288 #endif 245 289 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 246 290 ! advective trends … … 278 322 wrk_not_released(3, 1,2) ) CALL ctl_stop('tra_adv_cen2: failed to release workspace arrays') 279 323 ! 324 325 !! * Reset control of array index permutation 326 !FTRANS CLEAR 327 # include "oce_ftrans.h90" 328 # include "dom_oce_ftrans.h90" 329 # include "trc_oce_ftrans.h90" 330 # include "zdf_oce_ftrans.h90" 331 280 332 END SUBROUTINE tra_adv_cen2 281 333 -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_eiv.F90
r2715 r3211 32 32 33 33 PUBLIC tra_adv_eiv ! routine called by step.F90 34 35 !! * Control permutation of array indices 36 # include "oce_ftrans.h90" 37 # include "dom_oce_ftrans.h90" 38 # include "trc_oce_ftrans.h90" 39 # include "ldftra_oce_ftrans.h90" 40 # include "ldfslp_ftrans.h90" 34 41 35 42 !! * Substitutions … … 70 77 INTEGER , INTENT(in ) :: kt ! ocean time-step index 71 78 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 72 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun ! in : 3 ocean velocity components 73 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pvn ! out: 3 ocean velocity components 74 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pwn ! increased by the eiv 79 80 !! DCSE_NEMO: This style defeats ftrans 81 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pun ! in : 3 ocean velocity components 82 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pvn ! out: 3 ocean velocity components 83 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pwn ! increased by the eiv 84 85 !FTRANS pun pvn pwn :I :I :z 86 REAL(wp), INTENT(inout) :: pun(jpi,jpj,jpk) ! in : 3 ocean velocity components 87 REAL(wp), INTENT(inout) :: pvn(jpi,jpj,jpk) ! out: 3 ocean velocity components 88 REAL(wp), INTENT(inout) :: pwn(jpi,jpj,jpk) ! increased by the eiv 75 89 !! 76 90 INTEGER :: ji, jj, jk ! dummy loop indices … … 105 119 zu_eiv(:,:) = 0.e0 ; zv_eiv(:,:) = 0.e0 ; zw_eiv(:,:) = 0.e0 106 120 121 !!DCSE_NEMO: TODO - restucture loop(s) so that loop over levels is innermost 107 122 ! ================= 108 123 DO jk = 1, jpkm1 ! Horizontal slab … … 165 180 zztmp = 0.5 * rau0 * rcp 166 181 z2d(:,:) = 0.e0 182 #if defined key_z_first 183 DO jj = 2, jpjm1 184 DO ji = fs_2, fs_jpim1 ! vector opt. 185 DO jk = 1, jpkm1 186 #else 167 187 DO jk = 1, jpkm1 168 188 DO jj = 2, jpjm1 169 189 DO ji = fs_2, fs_jpim1 ! vector opt. 190 #endif 170 191 z2d(ji,jj) = z2d(ji,jj) + zztmp * u_eiv(ji,jj,jk) & 171 192 & * (tsn(ji,jj,jk,jp_tem)+tsn(ji+1,jj,jk,jp_tem)) * e1u(ji,jj) * fse3u(ji,jj,jk) … … 176 197 CALL iom_put( "ueiv_heattr", z2d ) ! heat transport in i-direction 177 198 z2d(:,:) = 0.e0 199 #if defined key_z_first 200 DO jj = 2, jpjm1 201 DO ji = fs_2, fs_jpim1 ! vector opt. 202 DO jk = 1, jpkm1 203 #else 178 204 DO jk = 1, jpkm1 179 205 DO jj = 2, jpjm1 180 206 DO ji = fs_2, fs_jpim1 ! vector opt. 207 #endif 181 208 z2d(ji,jj) = z2d(ji,jj) + zztmp * v_eiv(ji,jj,jk) & 182 209 & * (tsn(ji,jj,jk,jp_tem)+tsn(ji,jj+1,jk,jp_tem)) * e2v(ji,jj) * fse3v(ji,jj,jk) -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl.F90
r2715 r3211 33 33 34 34 LOGICAL :: l_trd ! flag to compute trends 35 36 !! * Control permutation of array indices 37 # include "oce_ftrans.h90" 38 # include "dom_oce_ftrans.h90" 39 # include "trc_oce_ftrans.h90" 35 40 36 41 !! * Substitutions … … 64 69 USE oce , ONLY: zwx => ua , zwy => va ! (ua,va) used as workspace 65 70 USE wrk_nemo, ONLY: zslpx => wrk_3d_1 , zslpy => wrk_3d_2 ! 3D workspace 71 72 !! DCSE_NEMO: need additional directives for renamed module variables 73 !FTRANS zwx zwy zslpx zslpy :I :I :z 74 66 75 ! 67 76 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 69 78 INTEGER , INTENT(in ) :: kjpt ! number of tracers 70 79 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 71 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 72 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before tracer field 73 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 80 81 !! DCSE_NEMO: This style defeats ftrans 82 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 83 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before tracer field 84 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 85 86 !FTRANS pun pvn pwn :I :I :z 87 !FTRANS ptb :I :I :z : 88 !FTRANS pta :I :I :z : 89 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! ocean velocity component (u) 90 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! ocean velocity component (v) 91 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! ocean velocity component (w) 92 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer fields (before) 93 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 94 74 95 ! 75 96 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 100 121 zwx(:,:,jpk) = 0.e0 ; zwy(:,:,jpk) = 0.e0 ! bottom values 101 122 ! interior values 123 #if defined key_z_first 124 DO jj = 1, jpjm1 125 DO ji = 1, jpim1 126 DO jk = 1, jpkm1 127 #else 102 128 DO jk = 1, jpkm1 103 129 DO jj = 1, jpjm1 104 130 DO ji = 1, fs_jpim1 ! vector opt. 131 #endif 105 132 zwx(ji,jj,jk) = umask(ji,jj,jk) * ( ptb(ji+1,jj,jk,jn) - ptb(ji,jj,jk,jn) ) 106 133 zwy(ji,jj,jk) = vmask(ji,jj,jk) * ( ptb(ji,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) … … 113 140 ! !-- Slopes of tracer 114 141 zslpx(:,:,jpk) = 0.e0 ; zslpy(:,:,jpk) = 0.e0 ! bottom values 142 #if defined key_z_first 143 DO jj = 2, jpj ! interior values 144 DO ji = 2, jpi 145 DO jk = 1, jpkm1 146 #else 115 147 DO jk = 1, jpkm1 ! interior values 116 148 DO jj = 2, jpj 117 149 DO ji = fs_2, jpi ! vector opt. 150 #endif 118 151 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji-1,jj ,jk) ) & 119 152 & * ( 0.25 + SIGN( 0.25, zwx(ji,jj,jk) * zwx(ji-1,jj ,jk) ) ) … … 124 157 END DO 125 158 ! 159 #if defined key_z_first 160 DO jj = 2, jpj ! Slopes limitation 161 DO ji = 2, jpi 162 DO jk = 1, jpkm1 163 #else 126 164 DO jk = 1, jpkm1 ! Slopes limitation 127 165 DO jj = 2, jpj 128 166 DO ji = fs_2, jpi ! vector opt. 167 #endif 129 168 zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji ,jj,jk) ), & 130 169 & 2.*ABS( zwx (ji-1,jj,jk) ), & … … 138 177 139 178 ! !-- MUSCL horizontal advective fluxes 179 #if defined key_z_first 180 DO jj = 2, jpjm1 ! interior values 181 DO ji = 2, jpim1 182 DO jk = 1, jpkm1 183 zdt = p2dt(jk) 184 #else 140 185 DO jk = 1, jpkm1 ! interior values 141 186 zdt = p2dt(jk) 142 187 DO jj = 2, jpjm1 143 188 DO ji = fs_2, fs_jpim1 ! vector opt. 189 #endif 144 190 ! MUSCL fluxes 145 191 z0u = SIGN( 0.5, pun(ji,jj,jk) ) … … 163 209 ! 164 210 ! Tracer flux divergence at t-point added to the general trend 211 #if defined key_z_first 212 DO jj = 2, jpjm1 213 DO ji = 2, jpim1 214 DO jk = 1, jpkm1 215 #else 165 216 DO jk = 1, jpkm1 166 217 DO jj = 2, jpjm1 167 218 DO ji = fs_2, fs_jpim1 ! vector opt. 219 #endif 168 220 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 169 221 ! horizontal advective trends … … 189 241 ! ----------------------------- 190 242 ! !-- first guess of the slopes 243 #if defined key_z_first 244 DO jj = 1, jpj 245 DO ji = 1, jpi 246 zwx(ji,jj,1) = 0.e0 ! surface boundary conditions 247 DO jk = 2, jpkm1 ! interior values 248 zwx(ji,jj,jk) = tmask(ji,jj,jk) * ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) 249 END DO 250 zwx(ji,jj,jpk) = 0.e0 ! bottom boundary conditions 251 END DO 252 END DO 253 #else 191 254 zwx (:,:, 1 ) = 0.e0 ; zwx (:,:,jpk) = 0.e0 ! surface & bottom boundary conditions 192 255 DO jk = 2, jpkm1 ! interior values 193 256 zwx(:,:,jk) = tmask(:,:,jk) * ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) 194 257 END DO 258 #endif 195 259 196 260 ! !-- Slopes of tracer 261 #if defined key_z_first 262 DO jj = 1, jpj 263 DO ji = 1, jpi 264 zslpx(ji,jj,1) = 0.e0 ! surface values 265 DO jk = 2, jpkm1 ! interior value 266 #else 197 267 zslpx(:,:,1) = 0.e0 ! surface values 198 268 DO jk = 2, jpkm1 ! interior value 199 269 DO jj = 1, jpj 200 270 DO ji = 1, jpi 271 #endif 201 272 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji,jj,jk+1) ) & 202 273 & * ( 0.25 + SIGN( 0.25, zwx(ji,jj,jk) * zwx(ji,jj,jk+1) ) ) … … 205 276 END DO 206 277 ! !-- Slopes limitation 278 #if defined key_z_first 279 DO jj = 1, jpj 280 DO ji = 1, jpi 281 DO jk = 2, jpkm1 ! interior values 282 #else 207 283 DO jk = 2, jpkm1 ! interior values 208 284 DO jj = 1, jpj 209 285 DO ji = 1, jpi 286 #endif 210 287 zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji,jj,jk ) ), & 211 288 & 2.*ABS( zwx (ji,jj,jk+1) ), & … … 220 297 ENDIF 221 298 ! 299 #if defined key_z_first 300 DO jj = 2, jpjm1 ! interior values 301 DO ji = 2, jpim1 302 DO jk = 1, jpkm1 303 zdt = p2dt(jk) 304 #else 222 305 DO jk = 1, jpkm1 ! interior values 223 306 zdt = p2dt(jk) 224 307 DO jj = 2, jpjm1 225 308 DO ji = fs_2, fs_jpim1 ! vector opt. 309 #endif 226 310 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3w(ji,jj,jk+1) ) 227 311 z0w = SIGN( 0.5, pwn(ji,jj,jk+1) ) … … 236 320 237 321 ! Compute & add the vertical advective trend 322 #if defined key_z_first 323 DO jj = 2, jpjm1 324 DO ji = 2, jpim1 325 DO jk = 1, jpkm1 326 #else 238 327 DO jk = 1, jpkm1 239 328 DO jj = 2, jpjm1 240 329 DO ji = fs_2, fs_jpim1 ! vector opt. 330 #endif 241 331 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 242 332 ! vertical advective trends -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_muscl2.F90
r2715 r3211 32 32 LOGICAL :: l_trd ! flag to compute trends 33 33 34 !! * Control permutation of array indices 35 # include "oce_ftrans.h90" 36 # include "dom_oce_ftrans.h90" 37 # include "trc_oce_ftrans.h90" 38 34 39 !! * Substitutions 35 40 # include "domzgr_substitute.h90" … … 62 67 USE oce , ONLY: zwx => ua , zwy => va ! (ua,va) used as 3D workspace 63 68 USE wrk_nemo, ONLY: zslpx => wrk_3d_1 , zslpy => wrk_3d_2 ! 3D workspace 69 !! DCSE_NEMO: need additional directives for renamed module variables 70 !FTRANS zwx zwy zslpx zslpy :I :I :z 71 64 72 !! 65 73 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 67 75 INTEGER , INTENT(in ) :: kjpt ! number of tracers 68 76 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 69 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 70 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before & now tracer fields 71 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 77 78 !! DCSE_NEMO: This style defeats ftrans 79 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 80 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before & now tracer fields 81 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 82 83 !FTRANS pun pvn pwn :I :I :z 84 !FTRANS ptb ptn :I :I :z : 85 !FTRANS pta :I :I :z : 86 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! ocean velocity component (u) 87 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! ocean velocity component (v) 88 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! ocean velocity component (w) 89 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer fields (before) 90 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer fields (now) 91 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 92 72 93 !! 73 94 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 98 119 zwx(:,:,jpk) = 0.e0 ; zwy(:,:,jpk) = 0.e0 ! bottom values 99 120 ! interior values 121 #if defined key_z_first 122 DO jj = 1, jpjm1 123 DO ji = 1, jpim1 124 DO jk = 1, jpkm1 125 #else 100 126 DO jk = 1, jpkm1 101 127 DO jj = 1, jpjm1 102 128 DO ji = 1, fs_jpim1 ! vector opt. 129 #endif 103 130 zwx(ji,jj,jk) = umask(ji,jj,jk) * ( ptb(ji+1,jj,jk,jn) - ptb(ji,jj,jk,jn) ) 104 131 zwy(ji,jj,jk) = vmask(ji,jj,jk) * ( ptb(ji,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) … … 111 138 ! !-- Slopes of tracer 112 139 zslpx(:,:,jpk) = 0.e0 ; zslpy(:,:,jpk) = 0.e0 ! bottom values 140 #if defined key_z_first 141 DO jj = 2, jpj ! interior values 142 DO ji = 2, jpi 143 DO jk = 1, jpkm1 144 #else 113 145 DO jk = 1, jpkm1 ! interior values 114 146 DO jj = 2, jpj 115 147 DO ji = fs_2, jpi ! vector opt. 148 #endif 116 149 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji-1,jj ,jk) ) & 117 150 & * ( 0.25 + SIGN( 0.25, zwx(ji,jj,jk) * zwx(ji-1,jj ,jk) ) ) … … 122 155 END DO 123 156 ! 157 #if defined key_z_first 158 DO jj = 2, jpj ! Slopes limitation 159 DO ji = 2, jpi 160 DO jk = 1, jpkm1 161 #else 124 162 DO jk = 1, jpkm1 ! Slopes limitation 125 163 DO jj = 2, jpj 126 164 DO ji = fs_2, jpi ! vector opt. 165 #endif 127 166 zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji ,jj,jk) ), & 128 167 & 2.*ABS( zwx (ji-1,jj,jk) ), & … … 132 171 & 2.*ABS( zwy (ji,jj ,jk) ) ) 133 172 END DO 134 END DO173 END DO 135 174 END DO ! interior values 136 175 137 176 ! !-- MUSCL horizontal advective fluxes 177 #if defined key_z_first 178 DO jj = 2, jpjm1 179 DO ji = 2, jpim1 180 DO jk = 1, jpkm1 ! interior values 181 zdt = p2dt(jk) 182 #else 138 183 DO jk = 1, jpkm1 ! interior values 139 184 zdt = p2dt(jk) 140 185 DO jj = 2, jpjm1 141 186 DO ji = fs_2, fs_jpim1 ! vector opt. 187 #endif 142 188 ! MUSCL fluxes 143 189 z0u = SIGN( 0.5, pun(ji,jj,jk) ) … … 159 205 160 206 !! centered scheme at lateral b.C. if off-shore velocity 207 #if defined key_z_first 208 DO jj = 2, jpjm1 209 DO ji = 2, jpim1 210 DO jk = 1, jpkm1 211 #else 161 212 DO jk = 1, jpkm1 162 213 DO jj = 2, jpjm1 163 214 DO ji = fs_2, fs_jpim1 ! vector opt. 215 #endif 164 216 IF( umask(ji,jj,jk) == 0. ) THEN 165 217 IF( pun(ji+1,jj,jk) > 0. .AND. ji /= jpi ) THEN … … 184 236 185 237 ! Tracer flux divergence at t-point added to the general trend 238 #if defined key_z_first 239 DO jj = 2, jpjm1 240 DO ji = 2, jpim1 241 DO jk = 1, jpkm1 242 #else 186 243 DO jk = 1, jpkm1 187 244 DO jj = 2, jpjm1 188 245 DO ji = fs_2, fs_jpim1 ! vector opt. 246 #endif 189 247 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 190 248 ! horizontal advective trends … … 194 252 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 195 253 END DO 196 END DO254 END DO 197 255 END DO 198 256 ! ! trend diagnostics (contribution of upstream fluxes) … … 211 269 ! ----------------------------- 212 270 ! !-- first guess of the slopes 271 #if defined key_z_first 272 DO jj = 1, jpj 273 DO ji = 1, jpi 274 zwx(ji,jj,1) = 0.e0 ! surface boundary conditions 275 DO jk = 2, jpkm1 ! interior values 276 zwx(ji,jj,jk) = tmask(ji,jj,jk) * ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) 277 END DO 278 zwx(ji,jj,jpk) = 0.e0 ! bottom boundary conditions 279 END DO 280 END DO 281 #else 213 282 zwx (:,:, 1 ) = 0.e0 ; zwx (:,:,jpk) = 0.e0 ! surface & bottom boundary conditions 214 283 DO jk = 2, jpkm1 ! interior values 215 284 zwx(:,:,jk) = tmask(:,:,jk) * ( ptb(:,:,jk-1,jn) - ptb(:,:,jk,jn) ) 216 285 END DO 286 #endif 217 287 218 288 ! !-- Slopes of tracer 289 #if defined key_z_first 290 DO jj = 1, jpj 291 DO ji = 1, jpi 292 zslpx(ji,jj,1) = 0.e0 ! surface values 293 DO jk = 2, jpkm1 ! interior value 294 #else 219 295 zslpx(:,:,1) = 0.e0 ! surface values 220 296 DO jk = 2, jpkm1 ! interior value 221 297 DO jj = 1, jpj 222 298 DO ji = 1, jpi 299 #endif 223 300 zslpx(ji,jj,jk) = ( zwx(ji,jj,jk) + zwx(ji,jj,jk+1) ) & 224 301 & * ( 0.25 + SIGN( 0.25, zwx(ji,jj,jk) * zwx(ji,jj,jk+1) ) ) … … 227 304 END DO 228 305 ! !-- Slopes limitation 306 #if defined key_z_first 307 DO jj = 1, jpj 308 DO ji = 1, jpi 309 DO jk = 2, jpkm1 ! interior values 310 #else 229 311 DO jk = 2, jpkm1 ! interior values 230 312 DO jj = 1, jpj 231 313 DO ji = 1, jpi 314 #endif 232 315 zslpx(ji,jj,jk) = SIGN( 1., zslpx(ji,jj,jk) ) * MIN( ABS( zslpx(ji,jj,jk ) ), & 233 316 & 2.*ABS( zwx (ji,jj,jk+1) ), & … … 242 325 ENDIF 243 326 ! 327 #if defined key_z_first 328 DO jj = 2, jpjm1 ! interior values 329 DO ji = 2, jpim1 330 DO jk = 1, jpkm1 331 zdt = p2dt(jk) 332 #else 244 333 DO jk = 1, jpkm1 ! interior values 245 334 zdt = p2dt(jk) 246 335 DO jj = 2, jpjm1 247 336 DO ji = fs_2, fs_jpim1 ! vector opt. 337 #endif 248 338 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3w(ji,jj,jk+1) ) 249 339 z0w = SIGN( 0.5, pwn(ji,jj,jk+1) ) … … 257 347 END DO 258 348 ! 259 DO jk = 2, jpkm1 ! centered near the bottom 260 DO jj = 2, jpjm1 261 DO ji = fs_2, fs_jpim1 ! vector opt. 349 #if defined key_z_first 350 DO jj = 2, jpjm1 351 DO ji = 2, jpim1 352 DO jk = 2, jpkm1 ! centered near the bottom 353 #else 354 DO jk = 2, jpkm1 ! centered near the bottom 355 DO jj = 2, jpjm1 356 DO ji = fs_2, fs_jpim1 ! vector opt. 357 #endif 262 358 IF( tmask(ji,jj,jk+1) == 0. ) THEN 263 359 IF( pwn(ji,jj,jk) > 0. ) THEN … … 269 365 END DO 270 366 ! 367 #if defined key_z_first 368 DO jj = 2, jpjm1 ! Compute & add the vertical advective trend 369 DO ji = 2, jpim1 370 DO jk = 1, jpkm1 371 #else 271 372 DO jk = 1, jpkm1 ! Compute & add the vertical advective trend 272 373 DO jj = 2, jpjm1 273 374 DO ji = fs_2, fs_jpim1 ! vector opt. 375 #endif 274 376 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 275 377 ! vertical advective trends -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90
r2715 r3211 35 35 REAL(wp) :: r1_6 = 1./ 6. ! 1/6 ratio 36 36 37 !! * Control permutation of array indices 38 # include "oce_ftrans.h90" 39 # include "dom_oce_ftrans.h90" 40 # include "trc_oce_ftrans.h90" 41 37 42 !! * Substitutions 38 43 # include "domzgr_substitute.h90" … … 85 90 INTEGER , INTENT(in ) :: kjpt ! number of tracers 86 91 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 87 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 88 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 89 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 92 93 !! DCSE_NEMO: This style defeats ftrans 94 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 95 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 96 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 97 98 !FTRANS pun pvn pwn :I :I :z 99 !FTRANS ptb ptn :I :I :z : 100 !FTRANS pta :I :I :z : 101 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! ocean velocity component (u) 102 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! ocean velocity component (v) 103 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! ocean velocity component (w) 104 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer fields (before) 105 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer fields (now) 106 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 107 90 108 !!---------------------------------------------------------------------- 91 109 … … 107 125 CALL tra_adv_cen2_k( kt, cdtype, pwn, ptn, pta, kjpt ) 108 126 ! 127 128 !! * Reset control of array index permutation 129 !FTRANS CLEAR 130 # include "oce_ftrans.h90" 131 # include "dom_oce_ftrans.h90" 132 # include "trc_oce_ftrans.h90" 133 109 134 END SUBROUTINE tra_adv_qck 110 135 … … 118 143 USE oce , ONLY: zwx => ua ! ua used as workspace 119 144 USE wrk_nemo, ONLY: zfu => wrk_3d_1 , zfc => wrk_3d_2, zfd => wrk_3d_3 ! 3D workspace 145 146 !! DCSE_NEMO: need additional directives for renamed module variables 147 !FTRANS zwx zfu zfc zfd :I :I :z 148 120 149 ! 121 150 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 123 152 INTEGER , INTENT(in ) :: kjpt ! number of tracers 124 153 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 125 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun ! i-velocity components 126 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 127 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 154 155 !! DCSE_NEMO: This style defeats ftrans 156 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun ! i-velocity components 157 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 158 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 159 160 !FTRANS pun :I :I :z 161 !FTRANS ptb ptn pta :I :I :z : 162 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! i-velocity component 163 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer field (before) 164 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer field (now) 165 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 166 128 167 !! 129 168 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 140 179 zfd(:,:,:) = 0.0 ; zwx(:,:,:) = 0.0 141 180 ! 181 #if defined key_z_first 182 !--- Computation of the upstream and downstream value of the tracer and the mask 183 DO jj = 2, jpjm1 184 DO ji = 2, jpim1 185 DO jk = 1, jpkm1 186 #else 142 187 DO jk = 1, jpkm1 143 188 ! 144 !--- Computation of the u stream and downstream value of the tracer and the mask189 !--- Computation of the upstream and downstream value of the tracer and the mask 145 190 DO jj = 2, jpjm1 146 191 DO ji = fs_2, fs_jpim1 ! vector opt. 192 #endif 147 193 ! Upstream in the x-direction for the tracer 148 194 zfc(ji,jj,jk) = ptb(ji-1,jj,jk,jn) … … 158 204 ! --------------------------- 159 205 ! 206 #if defined key_z_first 207 DO jj = 2, jpjm1 208 DO ji = 2, jpim1 209 DO jk = 1, jpkm1 210 #else 160 211 DO jk = 1, jpkm1 161 212 DO jj = 2, jpjm1 162 213 DO ji = fs_2, fs_jpim1 ! vector opt. 214 #endif 163 215 zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 164 216 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji+1,jj,jk) ! FU in the x-direction for T … … 167 219 END DO 168 220 ! 221 #if defined key_z_first 222 DO jj = 2, jpjm1 223 DO ji = 2, jpim1 224 DO jk = 1, jpkm1 225 zdt = p2dt(jk) 226 #else 169 227 DO jk = 1, jpkm1 170 228 zdt = p2dt(jk) 171 229 DO jj = 2, jpjm1 172 230 DO ji = fs_2, fs_jpim1 ! vector opt. 231 #endif 173 232 zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 174 233 zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * fse3u(ji,jj,jk) … … 187 246 ! 188 247 ! Mask at the T-points in the x-direction (mask=0 or mask=1) 248 #if defined key_z_first 249 DO jj = 2, jpjm1 250 DO ji = 2, jpim1 251 DO jk = 1, jpkm1 252 #else 189 253 DO jk = 1, jpkm1 190 254 DO jj = 2, jpjm1 191 255 DO ji = fs_2, fs_jpim1 ! vector opt. 256 #endif 192 257 zfu(ji,jj,jk) = tmask(ji-1,jj,jk) + tmask(ji,jj,jk) + tmask(ji+1,jj,jk) - 2. 193 258 END DO … … 198 263 ! 199 264 ! Tracer flux on the x-direction 265 #if defined key_z_first 266 DO jj = 2, jpjm1 267 DO ji = 2, jpim1 268 DO jk = 1, jpkm1 269 #else 200 270 DO jk = 1, jpkm1 201 !202 271 DO jj = 2, jpjm1 203 272 DO ji = fs_2, fs_jpim1 ! vector opt. 273 #endif 204 274 zdir = 0.5 + SIGN( 0.5, pun(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 205 275 !--- If the second ustream point is a land point … … 210 280 END DO 211 281 END DO 282 #if defined key_z_first 283 END DO 284 ! Computation of the trend 285 DO jj = 2, jpjm1 286 DO ji = 2, jpim1 287 DO jk = 1, jpkm1 288 #else 212 289 ! 213 290 ! Computation of the trend 214 291 DO jj = 2, jpjm1 215 292 DO ji = fs_2, fs_jpim1 ! vector opt. 293 #endif 216 294 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 217 295 ! horizontal advective trends … … 230 308 IF( wrk_not_released(3, 1,2,3) ) CALL ctl_stop('tra_adv_qck_i: failed to release workspace arrays') 231 309 ! 310 311 !! * Reset control of array index permutation 312 !FTRANS CLEAR 313 # include "oce_ftrans.h90" 314 # include "dom_oce_ftrans.h90" 315 # include "trc_oce_ftrans.h90" 316 232 317 END SUBROUTINE tra_adv_qck_i 233 318 … … 241 326 USE oce , ONLY: zwy => ua ! ua used as workspace 242 327 USE wrk_nemo, ONLY: zfu => wrk_3d_1 , zfc => wrk_3d_2, zfd => wrk_3d_3 ! 3D workspace 328 329 !! DCSE_NEMO: need additional directives for renamed module variables 330 !FTRANS zwy zfu zfc zfd :I :I :z 331 243 332 ! 244 333 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 246 335 INTEGER , INTENT(in ) :: kjpt ! number of tracers 247 336 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 248 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pvn ! j-velocity components 249 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 250 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 337 338 !! DCSE_NEMO: This style defeats ftrans 339 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pvn ! j-velocity components 340 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 341 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 342 343 !FTRANS pvn :I :I :z 344 !FTRANS ptb ptn pta :I :I :z : 345 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! j-velocity component 346 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer field (before) 347 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer field (now) 348 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 349 251 350 !! 252 351 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 264 363 zfd(:,:,:) = 0.0 ; zwy(:,:,:) = 0.0 265 364 ! 365 #if defined key_z_first 366 !--- Computation of the ustream and downstream value of the tracer and the mask 367 DO jj = 2, jpjm1 368 DO ji = 2, jpim1 369 DO jk = 1, jpkm1 370 #else 266 371 DO jk = 1, jpkm1 267 372 ! … … 269 374 DO jj = 2, jpjm1 270 375 DO ji = fs_2, fs_jpim1 ! vector opt. 376 #endif 271 377 ! Upstream in the x-direction for the tracer 272 378 zfc(ji,jj,jk) = ptb(ji,jj-1,jk,jn) … … 283 389 ! --------------------------- 284 390 ! 391 #if defined key_z_first 392 DO jj = 2, jpjm1 393 DO ji = 2, jpim1 394 DO jk = 1, jpkm1 395 #else 285 396 DO jk = 1, jpkm1 286 397 DO jj = 2, jpjm1 287 398 DO ji = fs_2, fs_jpim1 ! vector opt. 399 #endif 288 400 zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 289 401 zfu(ji,jj,jk) = zdir * zfc(ji,jj,jk ) + ( 1. - zdir ) * zfd(ji,jj+1,jk) ! FU in the x-direction for T … … 292 404 END DO 293 405 ! 406 #if defined key_z_first 407 DO jj = 2, jpjm1 408 DO ji = 2, jpim1 409 DO jk = 1, jpkm1 410 zdt = p2dt(jk) 411 #else 294 412 DO jk = 1, jpkm1 295 413 zdt = p2dt(jk) 296 414 DO jj = 2, jpjm1 297 415 DO ji = fs_2, fs_jpim1 ! vector opt. 416 #endif 298 417 zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 299 418 zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * fse3v(ji,jj,jk) … … 313 432 ! 314 433 ! Mask at the T-points in the x-direction (mask=0 or mask=1) 434 #if defined key_z_first 435 DO jj = 2, jpjm1 436 DO ji = 2, jpim1 437 DO jk = 1, jpkm1 438 #else 315 439 DO jk = 1, jpkm1 316 440 DO jj = 2, jpjm1 317 441 DO ji = fs_2, fs_jpim1 ! vector opt. 442 #endif 318 443 zfu(ji,jj,jk) = tmask(ji,jj-1,jk) + tmask(ji,jj,jk) + tmask(ji,jj+1,jk) - 2. 319 444 END DO … … 324 449 ! 325 450 ! Tracer flux on the x-direction 451 #if defined key_z_first 452 DO jj = 2, jpjm1 453 DO ji = 2, jpim1 454 DO jk = 1, jpkm1 455 #else 326 456 DO jk = 1, jpkm1 327 457 ! 328 458 DO jj = 2, jpjm1 329 459 DO ji = fs_2, fs_jpim1 ! vector opt. 460 #endif 330 461 zdir = 0.5 + SIGN( 0.5, pvn(ji,jj,jk) ) ! if pun > 0 : zdir = 1 otherwise zdir = 0 331 462 !--- If the second ustream point is a land point … … 336 467 END DO 337 468 END DO 469 #if defined key_z_first 470 END DO 471 ! Computation of the trend 472 DO jj = 2, jpjm1 473 DO ji = 2, jpim1 474 DO jk = 1, jpkm1 475 #else 338 476 ! 339 477 ! Computation of the trend 340 478 DO jj = 2, jpjm1 341 479 DO ji = fs_2, fs_jpim1 ! vector opt. 480 #endif 342 481 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 343 482 ! horizontal advective trends … … 361 500 IF( wrk_not_released(3, 1,2,3) ) CALL ctl_stop('tra_adv_qck_j: failed to release workspace arrays') 362 501 ! 502 503 !! * Reset control of array index permutation 504 !FTRANS CLEAR 505 # include "oce_ftrans.h90" 506 # include "dom_oce_ftrans.h90" 507 # include "trc_oce_ftrans.h90" 508 363 509 END SUBROUTINE tra_adv_qck_j 364 510 … … 370 516 !!---------------------------------------------------------------------- 371 517 USE oce, ONLY: zwz => ua ! ua used as workspace 518 519 !! DCSE_NEMO: need additional directives for renamed module variables 520 !FTRANS zwz :I :I :z 521 372 522 ! 373 523 INTEGER , INTENT(in ) :: kt ! ocean time-step index 374 524 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 375 525 INTEGER , INTENT(in ) :: kjpt ! number of tracers 376 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pwn ! vertical velocity 377 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptn ! before and now tracer fields 378 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 526 527 !! DCSE_NEMO: This style defeats ftrans 528 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pwn ! vertical velocity 529 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptn ! tracer fields (now) 530 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 531 532 !FTRANS pwn :I :I :z 533 !FTRANS ptn pta :I :I :z : 534 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! vertical velocity 535 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer fields (now) 536 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 537 379 538 ! 380 539 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 393 552 ENDIF 394 553 ! 554 #if defined key_z_first 555 DO jj = 2, jpjm1 556 DO ji = 2, jpim1 557 DO jk = 2, jpkm1 ! Interior point: second order centered tracer flux at w-point 558 #else 395 559 DO jk = 2, jpkm1 ! Interior point: second order centered tracer flux at w-point 396 560 DO jj = 2, jpjm1 397 561 DO ji = fs_2, fs_jpim1 ! vector opt. 562 #endif 398 563 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk-1,jn) + ptn(ji,jj,jk,jn) ) 399 564 END DO … … 401 566 END DO 402 567 ! 568 #if defined key_z_first 569 DO jj = 2, jpjm1 570 DO ji = 2, jpim1 571 DO jk = 1, jpkm1 !== Tracer flux divergence added to the general trend ==! 572 #else 403 573 DO jk = 1, jpkm1 !== Tracer flux divergence added to the general trend ==! 404 574 DO jj = 2, jpjm1 405 575 DO ji = fs_2, fs_jpim1 ! vector opt. 576 #endif 406 577 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 407 578 ! k- vertical advective trends … … 417 588 END DO 418 589 ! 590 591 !! * Reset control of array index permutation 592 !FTRANS CLEAR 593 # include "oce_ftrans.h90" 594 # include "dom_oce_ftrans.h90" 595 # include "trc_oce_ftrans.h90" 596 419 597 END SUBROUTINE tra_adv_cen2_k 420 598 … … 427 605 !! ** Method : 428 606 !!---------------------------------------------------------------------- 429 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfu ! second upwind point 430 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfd ! first douwning point 431 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfc ! the central point (or the first upwind point) 432 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: puc ! input as Courant number ; output as flux 607 608 !! DCSE_NEMO: This style defeats ftrans 609 610 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfu ! second upwind point 611 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfd ! first douwning point 612 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pfc ! the central point (or the first upwind point) 613 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: puc ! input as Courant number ; output as flux 614 615 !FTRANS pfu pfd pfc puc :I :I :z 616 REAL(wp), INTENT(in ) :: pfu(jpi,jpj,jpk) ! second upwind point 617 REAL(wp), INTENT(in ) :: pfd(jpi,jpj,jpk) ! first douwning point 618 REAL(wp), INTENT(in ) :: pfc(jpi,jpj,jpk) ! the central point (or the first upwind point) 619 REAL(wp), INTENT(inout) :: puc(jpi,jpj,jpk) ! input as Courant number ; output as flux 620 433 621 !! 434 622 INTEGER :: ji, jj, jk ! dummy loop indices … … 437 625 !---------------------------------------------------------------------- 438 626 627 #if defined key_z_first 628 DO jj = 1, jpj 629 DO ji = 1, jpi 630 DO jk = 1, jpkm1 631 #else 439 632 DO jk = 1, jpkm1 440 633 DO jj = 1, jpj 441 634 DO ji = 1, jpi 635 #endif 442 636 zc = puc(ji,jj,jk) ! Courant number 443 637 zcurv = pfd(ji,jj,jk) + pfu(ji,jj,jk) - 2. * pfc(ji,jj,jk) -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_tvd.F90
r2715 r3211 40 40 41 41 LOGICAL :: l_trd ! flag to compute trends 42 43 !! * Control permutation of array indices 44 # include "oce_ftrans.h90" 45 # include "dom_oce_ftrans.h90" 46 # include "trc_oce_ftrans.h90" 42 47 43 48 !! * Substitutions … … 69 74 USE oce , ONLY: zwx => ua , zwy => va ! (ua,va) used as workspace 70 75 USE wrk_nemo, ONLY: zwi => wrk_3d_12 , zwz => wrk_3d_13 ! 3D workspace 76 77 !! DCSE_NEMO: need additional directives for renamed module variables 78 !FTRANS zwx zwy zwi zwz :I :I :z 79 71 80 ! 72 81 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 74 83 INTEGER , INTENT(in ) :: kjpt ! number of tracers 75 84 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 76 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 77 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 78 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 85 86 !! DCSE_NEMO: This style defeats ftrans 87 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 88 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 89 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 90 91 !FTRANS pun pvn pwn :I :I :z 92 !FTRANS ptb ptn pta :I :I :z : 93 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! ocean velocity component (u) 94 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! ocean velocity component (v) 95 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! ocean velocity component (w) 96 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! tracer fields (before) 97 REAL(wp), INTENT(in ) :: ptn(jpi,jpj,jpk,kjpt) ! tracer fields (now) 98 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 99 79 100 ! 80 101 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 83 104 REAL(wp) :: zfm_ui, zfm_vj, zfm_wk ! - - 84 105 REAL(wp), DIMENSION (:,:,:), ALLOCATABLE :: ztrdx, ztrdy, ztrdz 106 !FTRANS ztrdx ztrdy ztrdz :I :I :z 107 85 108 !!---------------------------------------------------------------------- 86 109 … … 117 140 ! -------------------------------------------------------------------- 118 141 ! upstream tracer flux in the i and j direction 142 #if defined key_z_first 143 DO jj = 1, jpjm1 144 DO ji = 1, jpim1 145 DO jk = 1, jpkm1 146 #else 119 147 DO jk = 1, jpkm1 120 148 DO jj = 1, jpjm1 121 149 DO ji = 1, fs_jpim1 ! vector opt. 150 #endif 122 151 ! upstream scheme 123 152 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) … … 137 166 ENDIF 138 167 ! Interior value 168 #if defined key_z_first 169 DO jj = 1, jpj 170 DO ji = 1, jpi 171 DO jk = 2, jpkm1 172 #else 139 173 DO jk = 2, jpkm1 140 174 DO jj = 1, jpj 141 175 DO ji = 1, jpi 176 #endif 142 177 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 143 178 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) … … 148 183 149 184 ! total advective trend 185 #if defined key_z_first 186 DO jj = 2, jpjm1 187 DO ji = 2, jpim1 188 DO jk = 1, jpkm1 189 z2dtt = p2dt(jk) 190 #else 150 191 DO jk = 1, jpkm1 151 192 z2dtt = p2dt(jk) 152 193 DO jj = 2, jpjm1 153 194 DO ji = fs_2, fs_jpim1 ! vector opt. 195 #endif 154 196 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 155 197 ! total intermediate advective trends … … 180 222 ! -------------------------------------------------- 181 223 ! antidiffusive flux on i and j 224 #if defined key_z_first 225 DO jj = 1, jpjm1 226 DO ji = 1, jpim1 227 DO jk = 1, jpkm1 228 #else 182 229 DO jk = 1, jpkm1 183 230 DO jj = 1, jpjm1 184 231 DO ji = 1, fs_jpim1 ! vector opt. 232 #endif 185 233 zwx(ji,jj,jk) = 0.5 * pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj,jk,jn) ) - zwx(ji,jj,jk) 186 234 zwy(ji,jj,jk) = 0.5 * pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj+1,jk,jn) ) - zwy(ji,jj,jk) … … 190 238 191 239 ! antidiffusive flux on k 192 zwz(:,:,1) = 0.e0 ! Surface value 240 #if defined key_z_first 241 DO jj = 1, jpj 242 DO ji = 1, jpi 243 zwz(ji,jj,1) = 0.e0 ! Surface value 244 DO jk = 2, jpkm1 245 #else 246 zwz(:,:,1) = 0.e0 ! Surface value 193 247 ! 194 DO jk = 2, jpkm1 ! Interior value248 DO jk = 2, jpkm1 ! Interior value 195 249 DO jj = 1, jpj 196 250 DO ji = 1, jpi 251 #endif 197 252 zwz(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) - zwz(ji,jj,jk) 198 253 END DO … … 209 264 ! 5. final trend with corrected fluxes 210 265 ! ------------------------------------ 266 #if defined key_z_first 267 DO jj = 2, jpjm1 268 DO ji = 2, jpim1 269 DO jk = 1, jpkm1 270 #else 211 271 DO jk = 1, jpkm1 212 272 DO jj = 2, jpjm1 213 273 DO ji = fs_2, fs_jpim1 ! vector opt. 274 #endif 214 275 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 215 276 ! total advective trends … … 247 308 IF( wrk_not_released(3, 12,13) ) CALL ctl_stop('tra_adv_tvd: failed to release workspace arrays') 248 309 ! 310 311 !! * Reset control of array index permutation 312 !FTRANS CLEAR 313 # include "oce_ftrans.h90" 314 # include "dom_oce_ftrans.h90" 315 # include "trc_oce_ftrans.h90" 316 249 317 END SUBROUTINE tra_adv_tvd 250 318 … … 266 334 USE wrk_nemo, ONLY: zbetup => wrk_3d_8 , zbetdo => wrk_3d_9 ! 3D workspace 267 335 USE wrk_nemo, ONLY: zbup => wrk_3d_10 , zbdo => wrk_3d_11 ! - - 336 337 !! DCSE_NEMO: need additional directives for renamed module variables 338 !FTRANS zbetup zbetdo zbup zbdo :I :I :z 339 268 340 ! 269 341 REAL(wp), DIMENSION(jpk) , INTENT(in ) :: p2dt ! vertical profile of tracer time-step 270 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft ! before & after field 271 REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) :: paa, pbb, pcc ! monotonic fluxes in the 3 directions 342 343 !! DCSE_NEMO: This style defeats ftrans 344 ! REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(in ) :: pbef, paft ! before & after field 345 ! REAL(wp), DIMENSION (jpi,jpj,jpk), INTENT(inout) :: paa, pbb, pcc ! monotonic fluxes in the 3 directions 346 347 !FTRANS pbef paft :I :I :z 348 !FTRANS paa pbb pcc :I :I :z 349 REAL(wp), INTENT(in ) :: pbef(jpi,jpj,jpk), paft(jpi,jpj,jpk) ! before & after field 350 REAL(wp), INTENT(inout) :: paa(jpi,jpj,jpk) ! monotonic fluxes in the 1st direction 351 REAL(wp), INTENT(inout) :: pbb(jpi,jpj,jpk) ! monotonic fluxes in the 2nd direction 352 REAL(wp), INTENT(inout) :: pcc(jpi,jpj,jpk) ! monotonic fluxes in the 3rd direction 272 353 ! 273 354 INTEGER :: ji, jj, jk ! dummy loop indices … … 294 375 & paft * tmask + zbig * ( 1.e0 - tmask ) ) 295 376 377 #if defined key_z_first 378 DO jj = 2, jpjm1 379 DO ji = 2, jpim1 380 DO jk = 1, jpkm1 381 ikm1 = MAX(jk-1,1) 382 z2dtt = p2dt(jk) 383 #else 296 384 DO jk = 1, jpkm1 297 385 ikm1 = MAX(jk-1,1) … … 299 387 DO jj = 2, jpjm1 300 388 DO ji = fs_2, fs_jpim1 ! vector opt. 389 #endif 301 390 302 391 ! search maximum in neighbourhood … … 335 424 ! 3. monotonic flux in the i & j direction (paa & pbb) 336 425 ! ---------------------------------------- 426 #if defined key_z_first 427 DO jj = 2, jpjm1 428 DO ji = 2, jpim1 429 DO jk = 1, jpkm1 430 #else 337 431 DO jk = 1, jpkm1 338 432 DO jj = 2, jpjm1 339 433 DO ji = fs_2, fs_jpim1 ! vector opt. 434 #endif 340 435 zau = MIN( 1.e0, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) ) 341 436 zbu = MIN( 1.e0, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) ) -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90
r2715 r3211 29 29 30 30 LOGICAL :: l_trd ! flag to compute trends or not 31 32 !! * Control permutation of array indices 33 # include "oce_ftrans.h90" 34 # include "dom_oce_ftrans.h90" 35 # include "trc_oce_ftrans.h90" 31 36 32 37 !! * Substitutions … … 78 83 USE wrk_nemo, ONLY: zltu => wrk_3d_3 , zltv => wrk_3d_4 ! - - 79 84 USE wrk_nemo, ONLY: zti => wrk_3d_5 , ztw => wrk_3d_6 ! - - 85 86 !! DCSE_NEMO: need additional directives for renamed module variables 87 !FTRANS zwx zwy ztu ztv zltu zltv zti ztw :I :I :z 88 80 89 ! 81 90 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 83 92 INTEGER , INTENT(in ) :: kjpt ! number of tracers 84 93 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 85 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 86 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 87 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 94 95 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pun, pvn, pwn ! 3 ocean velocity components 96 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb, ptn ! before and now tracer fields 97 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 98 99 !FTRANS pun pvn pwn :I :I :z 100 !FTRANS ptb ptn pta :I :I :z : 101 REAL(wp), INTENT(in ) :: pun(jpi,jpj,jpk) ! ocean velocity component (u) 102 REAL(wp), INTENT(in ) :: pvn(jpi,jpj,jpk) ! ocean velocity component (v) 103 REAL(wp), INTENT(in ) :: pwn(jpi,jpj,jpk) ! ocean velocity component (w) 104 !! DCSE_NEMO: Next two arguments made inout to silence the cray compile, 105 !! which rightly complains about the call to nonosc_v (which also has them 106 !! as inout) 107 REAL(wp), INTENT(inout) :: ptb(jpi,jpj,jpk,kjpt) ! tracer fields (before) 108 REAL(wp), INTENT(inout) :: ptn(jpi,jpj,jpk,kjpt) ! tracer fields (now) 109 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 110 88 111 ! 89 112 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 113 136 zltu(:,:,jpk) = 0.e0 ; zltv(:,:,jpk) = 0.e0 114 137 ! 138 #if defined key_z_first 139 DO jj = 1, jpjm1 140 DO ji = 1, jpim1 141 DO jk = 1, jpkm1 142 #else 115 143 DO jk = 1, jpkm1 ! Horizontal slab 116 144 ! … … 118 146 DO jj = 1, jpjm1 ! First derivative (gradient) 119 147 DO ji = 1, fs_jpim1 ! vector opt. 148 #endif 120 149 zeeu = e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) * umask(ji,jj,jk) 121 150 zeev = e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) * vmask(ji,jj,jk) … … 124 153 END DO 125 154 END DO 155 #if defined key_z_first 156 END DO 157 DO jj = 2, jpjm1 ! Second derivative (divergence) 158 DO ji = 2, jpim1 159 DO jk = 1, jpkm1 160 #else 126 161 DO jj = 2, jpjm1 ! Second derivative (divergence) 127 162 DO ji = fs_2, fs_jpim1 ! vector opt. 163 #endif 128 164 zcoef = 1. / ( 6. * fse3t(ji,jj,jk) ) 129 165 zltu(ji,jj,jk) = ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) ) * zcoef … … 137 173 ! 138 174 ! Horizontal advective fluxes 175 #if defined key_z_first 176 DO jj = 1, jpjm1 177 DO ji = 1, jpim1 178 DO jk = 1, jpkm1 179 #else 139 180 DO jk = 1, jpkm1 ! Horizontal slab 140 181 DO jj = 1, jpjm1 141 182 DO ji = 1, fs_jpim1 ! vector opt. 183 #endif 142 184 ! upstream transport 143 185 zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) ) … … 158 200 159 201 ! Horizontal advective trends 202 #if defined key_z_first 203 DO jj = 2, jpjm1 204 DO ji = 2, jpim1 205 DO jk = 1, jpkm1 206 #else 160 207 DO jk = 1, jpkm1 161 208 ! Tracer flux divergence at t-point added to the general trend 162 209 DO jj = 2, jpjm1 163 210 DO ji = fs_2, fs_jpim1 ! vector opt. 211 #endif 164 212 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 165 213 ! horizontal advective … … 203 251 ! ------------------------------------------------------------------- 204 252 ! Interior value 253 #if defined key_z_first 254 DO jj = 1, jpj 255 DO ji = 1, jpi 256 DO jk = 2, jpkm1 257 #else 205 258 DO jk = 2, jpkm1 206 259 DO jj = 1, jpj 207 260 DO ji = 1, jpi 261 #endif 208 262 zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) ) 209 263 zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) ) … … 213 267 END DO 214 268 ! update and guess with monotonic sheme 269 #if defined key_z_first 270 DO jj = 2, jpjm1 271 DO ji = 2, jpim1 272 DO jk = 1, jpkm1 273 z2dtt = p2dt(jk) 274 #else 215 275 DO jk = 1, jpkm1 216 276 z2dtt = p2dt(jk) 217 277 DO jj = 2, jpjm1 218 278 DO ji = fs_2, fs_jpim1 ! vector opt. 279 #endif 219 280 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 220 281 ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * zbtr … … 228 289 229 290 ! antidiffusive flux : high order minus low order 291 #if defined key_z_first 292 DO jj = 1, jpj 293 DO ji = 1, jpi 294 ztw(ji,jj,1) = 0.e0 ! Surface value 295 DO jk = 2, jpkm1 ! Interior value 296 #else 230 297 ztw(:,:,1) = 0.e0 ! Surface value 231 298 DO jk = 2, jpkm1 ! Interior value 232 299 DO jj = 1, jpj 233 300 DO ji = 1, jpi 301 #endif 234 302 ztw(ji,jj,jk) = 0.5 * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) ) - ztw(ji,jj,jk) 235 303 END DO … … 240 308 241 309 ! final trend with corrected fluxes 310 #if defined key_z_first 311 DO jj = 2, jpjm1 312 DO ji = 2, jpim1 313 DO jk = 1, jpkm1 314 #else 242 315 DO jk = 1, jpkm1 243 316 DO jj = 2, jpjm1 244 317 DO ji = fs_2, fs_jpim1 ! vector opt. 318 #endif 245 319 zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 246 320 ! k- vertical advective trends … … 254 328 ! Save the final vertical advective trends 255 329 IF( l_trd ) THEN ! vertical advective trend diagnostics 256 DO jk = 1, jpkm1 ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w]) 330 ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w]) 331 #if defined key_z_first 332 DO jj = 2, jpjm1 333 DO ji = 2, jpim1 334 DO jk = 1, jpkm1 335 #else 336 DO jk = 1, jpkm1 257 337 DO jj = 2, jpjm1 258 338 DO ji = fs_2, fs_jpim1 ! vector opt. 339 #endif 259 340 zbtr = 1.e0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 260 341 z_hdivn = ( pwn(ji,jj,jk) - pwn(ji,jj,jk+1) ) * zbtr … … 270 351 IF( wrk_not_released(3, 1,2,3,4,5,6) ) CALL ctl_stop('tra_adv_ubs: failed to release workspace arrays') 271 352 ! 353 354 !! * Reset control of array index permutation 355 !FTRANS CLEAR 356 # include "oce_ftrans.h90" 357 # include "dom_oce_ftrans.h90" 358 # include "trc_oce_ftrans.h90" 359 272 360 END SUBROUTINE tra_adv_ubs 273 361 … … 288 376 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 289 377 USE wrk_nemo, ONLY: zbetup => wrk_3d_1, zbetdo => wrk_3d_2 ! 3D workspace 378 379 !! DCSE_NEMO: need additional directives for renamed module variables 380 !FTRANS zbetup zbetdo :I :I :z 381 290 382 ! 291 383 REAL(wp), INTENT(in ), DIMENSION(jpk) :: p2dt ! vertical profile of tracer time-step 292 REAL(wp), DIMENSION (jpi,jpj,jpk) :: pbef ! before field 293 REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: paft ! after field 294 REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: pcc ! monotonic flux in the k direction 384 385 !! DCSE_NEMO: This style defeats ftrans 386 ! REAL(wp), DIMENSION (jpi,jpj,jpk) :: pbef ! before field 387 ! REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: paft ! after field 388 ! REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) :: pcc ! monotonic flux in the k direction 389 390 !FTRANS pbef paft pcc :I :I :z 391 REAL(wp), INTENT(inout) :: pbef(jpi,jpj,jpk) ! before field 392 REAL(wp), INTENT(inout) :: paft(jpi,jpj,jpk) ! after field 393 REAL(wp), INTENT(inout) :: pcc(jpi,jpj,jpk) ! monotonic flux in the k direction 295 394 ! 296 395 INTEGER :: ji, jj, jk ! dummy loop indices … … 313 412 paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) - zbig * ( 1.e0 - tmask(:,:,:) ) 314 413 ! search maximum in neighbourhood 414 #if defined key_z_first 415 DO jj = 2, jpjm1 416 DO ji = 2, jpim1 417 DO jk = 1, jpkm1 418 ikm1 = MAX(jk-1,1) 419 #else 315 420 DO jk = 1, jpkm1 316 421 ikm1 = MAX(jk-1,1) 317 422 DO jj = 2, jpjm1 318 423 DO ji = fs_2, fs_jpim1 ! vector opt. 424 #endif 319 425 zbetup(ji,jj,jk) = MAX( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 320 426 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & … … 327 433 paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) + zbig * ( 1.e0 - tmask(:,:,:) ) 328 434 ! search minimum in neighbourhood 435 #if defined key_z_first 436 DO jj = 2, jpjm1 437 DO ji = 2, jpim1 438 DO jk = 1, jpkm1 439 ikm1 = MAX(jk-1,1) 440 #else 329 441 DO jk = 1, jpkm1 330 442 ikm1 = MAX(jk-1,1) 331 443 DO jj = 2, jpjm1 332 444 DO ji = fs_2, fs_jpim1 ! vector opt. 445 #endif 333 446 zbetdo(ji,jj,jk) = MIN( pbef(ji ,jj ,jk ), paft(ji ,jj ,jk ), & 334 447 & pbef(ji ,jj ,ikm1), pbef(ji ,jj ,jk+1), & … … 346 459 ! ------------------------------------------------------ 347 460 461 #if defined key_z_first 462 DO jj = 2, jpjm1 463 DO ji = 2, jpim1 464 DO jk = 1, jpkm1 465 z2dtt = p2dt(jk) 466 #else 348 467 DO jk = 1, jpkm1 349 468 z2dtt = p2dt(jk) 350 469 DO jj = 2, jpjm1 351 470 DO ji = fs_2, fs_jpim1 ! vector opt. 471 #endif 352 472 ! positive & negative part of the flux 353 473 zpos = MAX( 0., pcc(ji ,jj ,jk+1) ) - MIN( 0., pcc(ji ,jj ,jk ) ) … … 362 482 ! monotonic flux in the k direction, i.e. pcc 363 483 ! ------------------------------------------- 484 #if defined key_z_first 485 DO jj = 2, jpjm1 486 DO ji = 2, jpim1 487 DO jk = 2, jpkm1 488 #else 364 489 DO jk = 2, jpkm1 365 490 DO jj = 2, jpjm1 366 491 DO ji = fs_2, fs_jpim1 ! vector opt. 492 #endif 367 493 za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) ) 368 494 zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) ) -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90
r2715 r3211 35 35 36 36 REAL(wp), PUBLIC, DIMENSION(:,:), ALLOCATABLE :: qgh_trd0 ! geothermal heating trend 37 38 !! * Control permutation of array indices 39 # include "oce_ftrans.h90" 40 # include "dom_oce_ftrans.h90" 37 41 38 42 !! * Substitutions … … 71 75 INTEGER :: ji, jj, ik ! dummy loop indices 72 76 REAL(wp) :: zqgh_trd ! geothermal heat flux trend 77 78 !FTRANS ztrdt :I :I :z 73 79 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt 74 80 !!---------------------------------------------------------------------- -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90
r2715 r3211 65 65 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_e1e2t ! inverse of the cell surface at t-point [1/m2] 66 66 67 !! * Control permutation of array indices 68 # include "oce_ftrans.h90" 69 # include "dom_oce_ftrans.h90" 70 67 71 !! * Substitutions 68 72 # include "domzgr_substitute.h90" … … 105 109 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 106 110 !!---------------------------------------------------------------------- 111 112 !FTRANS ztrdt ztrds :I :I :z 107 113 108 114 IF( l_trdtra ) THEN !* Save ta and sa trends … … 146 152 END SUBROUTINE tra_bbl 147 153 154 !! * Reset control of array index permutation 155 !FTRANS CLEAR 156 # include "oce_ftrans.h90" 157 # include "dom_oce_ftrans.h90" 148 158 149 159 SUBROUTINE tra_bbl_dif( ptb, pta, kjpt ) … … 173 183 ! 174 184 INTEGER , INTENT(in ) :: kjpt ! number of tracers 175 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 176 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 185 186 !! DCSE_NEMO: This style defeats ftrans 187 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 188 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 189 !FTRANS ptb pta :I :I :z :I 190 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before tracer fields 191 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 177 192 ! 178 193 INTEGER :: ji, jj, jn ! dummy loop indices … … 220 235 IF( wrk_not_released(2,1) ) CALL ctl_stop('tra_bbl_dif: failed to release workspace array') 221 236 ! 237 222 238 END SUBROUTINE tra_bbl_dif 223 239 240 !! * Reset control of array index permutation 241 !FTRANS CLEAR 242 # include "oce_ftrans.h90" 243 # include "dom_oce_ftrans.h90" 224 244 225 245 SUBROUTINE tra_bbl_adv( ptb, pta, kjpt ) … … 239 259 !!---------------------------------------------------------------------- 240 260 INTEGER , INTENT(in ) :: kjpt ! number of tracers 241 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 242 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 261 262 !! DCSE_NEMO: This style defeats ftrans 263 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 264 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 265 !FTRANS ptb pta :I :I :z :I 266 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before tracer fields 267 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 243 268 ! 244 269 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 310 335 END SUBROUTINE tra_bbl_adv 311 336 337 !! * Reset control of array index permutation 338 !FTRANS CLEAR 339 # include "oce_ftrans.h90" 340 # include "dom_oce_ftrans.h90" 312 341 313 342 SUBROUTINE bbl( kt, cdtype ) … … 608 637 609 638 ! !* masked diffusive flux coefficients 639 #if defined key_z_first 640 ahu_bbl_0(:,:) = rn_ahtbbl * e2u(:,:) * e3u_bbl_0(:,:) / e1u(:,:) * umask_1(:,:) 641 ahv_bbl_0(:,:) = rn_ahtbbl * e1v(:,:) * e3v_bbl_0(:,:) / e2v(:,:) * vmask_1(:,:) 642 #else 610 643 ahu_bbl_0(:,:) = rn_ahtbbl * e2u(:,:) * e3u_bbl_0(:,:) / e1u(:,:) * umask(:,:,1) 611 644 ahv_bbl_0(:,:) = rn_ahtbbl * e1v(:,:) * e3v_bbl_0(:,:) / e2v(:,:) * vmask(:,:,1) 645 #endif 612 646 613 647 -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/tradmp.F90
r2715 r3211 64 64 INTEGER :: nn_file = 2 ! = 1 create a damping.coeff NetCDF file 65 65 66 !! * Control permutation of array indices 67 # include "oce_ftrans.h90" 68 # include "dom_oce_ftrans.h90" 69 # include "zdf_oce_ftrans.h90" 70 # include "dtatem_ftrans.h90" 71 # include "dtasal_ftrans.h90" 72 # include "tradmp_ftrans.h90" 73 66 74 !! * Substitutions 67 75 # include "domzgr_substitute.h90" … … 112 120 ! 113 121 CASE( 0 ) !== newtonian damping throughout the water column ==! 122 #if defined key_z_first 123 DO jj = 2, jpjm1 124 DO ji = 2, jpim1 125 DO jk = 1, jpkm1 126 #else 114 127 DO jk = 1, jpkm1 115 128 DO jj = 2, jpjm1 116 129 DO ji = fs_2, fs_jpim1 ! vector opt. 130 #endif 117 131 zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) ) 118 132 zsa = resto(ji,jj,jk) * ( s_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_sal) ) … … 126 140 ! 127 141 CASE ( 1 ) !== no damping in the turbocline (avt > 5 cm2/s) ==! 142 #if defined key_z_first 143 DO jj = 2, jpjm1 144 DO ji = 2, jpim1 145 DO jk = 1, jpkm1 146 #else 128 147 DO jk = 1, jpkm1 129 148 DO jj = 2, jpjm1 130 149 DO ji = fs_2, fs_jpim1 ! vector opt. 150 #endif 131 151 IF( avt(ji,jj,jk) <= 5.e-4_wp ) THEN 132 152 zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) ) … … 145 165 ! 146 166 CASE ( 2 ) !== no damping in the mixed layer ==! 167 #if defined key_z_first 168 DO jj = 2, jpjm1 169 DO ji = 2, jpim1 170 DO jk = 1, jpkm1 171 #else 147 172 DO jk = 1, jpkm1 148 173 DO jj = 2, jpjm1 149 174 DO ji = fs_2, fs_jpim1 ! vector opt. 175 #endif 150 176 IF( fsdept(ji,jj,jk) >= hmlp (ji,jj) ) THEN 151 177 zta = resto(ji,jj,jk) * ( t_dta(ji,jj,jk) - tsb(ji,jj,jk,jp_tem) ) … … 252 278 !! ** Action : - resto, the damping coeff. for T and S 253 279 !!---------------------------------------------------------------------- 254 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: presto ! restoring coeff. (s-1) 280 281 !! DCSE_NEMO: This style defeats ftrans 282 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: presto ! restoring coeff. (s-1) 283 !FTRANS presto :I :I :z 284 REAL(wp), INTENT(inout) :: presto(jpi,jpj,jpk) ! restoring coeff. (s-1) 255 285 ! 256 286 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 292 322 z1_5d = 1._wp / ( 5._wp * rday ) ! z1_5d : 1 / 5days 293 323 324 #if defined key_z_first 325 DO jj = 1, jpj ! Compute arrays resto ; value for internal damping : 5 days 326 DO ji = 1, jpi 327 DO jk = 2, jpkm1 328 #else 294 329 DO jk = 2, jpkm1 ! Compute arrays resto ; value for internal damping : 5 days 295 330 DO jj = 1, jpj 296 331 DO ji = 1, jpi 332 #endif 297 333 zlat = ABS( gphit(ji,jj) ) 298 334 IF( zlat1 <= zlat .AND. zlat <= zlat2 ) THEN … … 311 347 END SUBROUTINE dtacof_zoom 312 348 349 !! * Reset control of array index permutation 350 !FTRANS CLEAR 351 # include "oce_ftrans.h90" 352 # include "dom_oce_ftrans.h90" 353 # include "zdf_oce_ftrans.h90" 354 # include "dtatem_ftrans.h90" 355 # include "dtasal_ftrans.h90" 356 # include "tradmp_ftrans.h90" 313 357 314 358 SUBROUTINE dtacof( kn_hdmp, pn_surf, pn_bot, pn_dep, & … … 329 373 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 330 374 USE wrk_nemo, ONLY: zhfac => wrk_1d_1, zmrs => wrk_2d_1 , zdct => wrk_3d_1 ! 1D, 2D, 3D workspace 375 376 !! DCSE_NEMO: need additional directives for renamed module variables 377 !FTRANS zdct :I :I :z 378 331 379 !! 332 380 INTEGER , INTENT(in ) :: kn_hdmp ! damping option … … 336 384 INTEGER , INTENT(in ) :: kn_file ! save the damping coef on a file or not 337 385 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 338 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: presto ! restoring coeff. (s-1) 386 387 !! DCSE_NEMO: This style defeats ftrans 388 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: presto ! restoring coeff. (s-1) 389 !FTRANS presto :I :I :z 390 REAL(wp), INTENT(inout) :: presto(jpi,jpj,jpk) ! restoring coeff. (s-1) 391 339 392 ! 340 393 INTEGER :: ji, jj, jk ! dummy loop indices … … 407 460 zsdmp = 1._wp / ( pn_surf * rday ) 408 461 zbdmp = 1._wp / ( pn_bot * rday ) 462 #if defined key_z_first 463 DO jj = 1, jpj 464 DO ji = 1, jpi 465 DO jk = 2, jpkm1 466 #else 409 467 DO jk = 2, jpkm1 410 468 DO jj = 1, jpj 411 469 DO ji = 1, jpi 470 #endif 412 471 zdct(ji,jj,jk) = MIN( zinfl, zdct(ji,jj,jk) ) 413 472 ! ... Decrease the value in the vicinity of the coast … … 518 577 END SELECT 519 578 579 #if defined key_z_first 580 DO jj = 1, jpj 581 DO ji = 1, jpi 582 DO jk = 1, jpkm1 583 presto(ji,jj,jk) = zmrs(ji,jj) * zhfac(jk) + ( 1._wp - zmrs(ji,jj) ) * presto(ji,jj,jk) 584 END DO 585 END DO 586 END DO 587 #else 520 588 DO jk = 1, jpkm1 521 589 presto(:,:,jk) = zmrs(:,:) * zhfac(jk) + ( 1._wp - zmrs(:,:) ) * presto(:,:,jk) 522 590 END DO 591 #endif 523 592 524 593 ! Mask resto array and set to 0 first and last levels … … 550 619 END SUBROUTINE dtacof 551 620 621 !! * Reset control of array index permutation 622 !FTRANS CLEAR 623 # include "oce_ftrans.h90" 624 # include "dom_oce_ftrans.h90" 625 # include "zdf_oce_ftrans.h90" 626 # include "dtatem_ftrans.h90" 627 # include "dtasal_ftrans.h90" 628 # include "tradmp_ftrans.h90" 552 629 553 630 SUBROUTINE cofdis( pdct ) … … 571 648 !! - NetCDF file 'dist.coast.nc' 572 649 !!---------------------------------------------------------------------- 573 USE ioipsl ! IOipsl libra iry650 USE ioipsl ! IOipsl library 574 651 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 575 652 USE wrk_nemo, ONLY: zxt => wrk_2d_1 , zyt => wrk_2d_2 , zzt => wrk_2d_3, zmask => wrk_2d_4 576 653 !! 654 655 !! DCSE_NEMO: This style defeats ftrans 656 ! REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) :: pdct ! distance to the coastline 657 !FTRANS pdct :I :I :z 577 658 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out ) :: pdct ! distance to the coastline 659 578 660 !! 579 661 INTEGER :: ji, jj, jk, jl ! dummy loop indices -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90
r2715 r3211 21 21 USE traldf_bilap ! lateral mixing (tra_ldf_bilap routine) 22 22 USE traldf_iso ! lateral mixing (tra_ldf_iso routine) 23 USE traldf_iso_grif ! lateral mixing (tra_ldf_iso_grif routine) 23 24 !! DCSE_NEMO 25 ! USE traldf_iso_grif ! lateral mixing (tra_ldf_iso_grif routine) 26 USE traldf_iso_grif, ONLY : tra_ldf_iso_grif ! lateral mixing 24 27 USE traldf_lap ! lateral mixing (tra_ldf_lap routine) 25 28 USE trdmod_oce ! ocean space and time domain … … 41 44 ! ! (key_traldf_ano only) 42 45 46 !! * Control permutation of array indices 47 # include "oce_ftrans.h90" 48 # include "dom_oce_ftrans.h90" 49 # include "ldftra_oce_ftrans.h90" 50 # include "ldfslp_ftrans.h90" 51 # include "trc_oce_ftrans.h90" 52 !FTRANS t0_ldf s0_ldf :I :I :z 53 43 54 !! * Substitutions 44 55 # include "domzgr_substitute.h90" … … 59 70 INTEGER, INTENT( in ) :: kt ! ocean time-step index 60 71 !! 72 !FTRANS ztrdt ztrds :I :I :z 61 73 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 62 74 !!---------------------------------------------------------------------- … … 115 127 END SUBROUTINE tra_ldf 116 128 129 !! * Reset control of array index permutation 130 !FTRANS CLEAR 131 # include "oce_ftrans.h90" 132 # include "dom_oce_ftrans.h90" 133 # include "ldftra_oce_ftrans.h90" 134 # include "ldfslp_ftrans.h90" 135 # include "trc_oce_ftrans.h90" 136 !FTRANS t0_ldf s0_ldf :I :I :z 117 137 118 138 SUBROUTINE tra_ldf_init … … 240 260 USE wrk_nemo, ONLY: zt_ref => wrk_3d_1, ztb => wrk_3d_2, zavt => wrk_3d_3 ! 3D workspaces 241 261 USE wrk_nemo, ONLY: zs_ref => wrk_3d_4, zsb => wrk_3d_5 ! 3D workspaces 262 263 !! DCSE_NEMO: need additional directives for renamed module variables 264 !FTRANS zt_ref ztb zavt zs_ref zsb :I :I :z 242 265 ! 243 266 USE zdf_oce ! vertical mixing 244 267 USE trazdf ! vertical mixing: double diffusion 245 268 USE zdfddm ! vertical mixing: double diffusion 246 ! 269 270 # include "zdf_oce_ftrans.h90" 271 # include "zdfddm_ftrans.h90" 272 273 ! 274 #if defined key_z_first 275 INTEGER :: ji, jj, jk ! Dummy loop indices 276 #else 247 277 INTEGER :: jk ! Dummy loop indice 278 #endif 248 279 INTEGER :: ierr ! local integer 249 280 LOGICAL :: llsave ! local logical … … 309 340 s0_ldf(:,:,:) = tsa(:,:,:,jp_sal) 310 341 ELSE 342 #if defined key_z_first 343 DO jj = 1, jpj 344 DO ji = 1, jpi 345 DO jk = 1, jpkm1 346 t0_ldf(ji,jj,jk) = ( tsa(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) / ( z12 *rdttra(jk) ) 347 s0_ldf(ji,jj,jk) = ( tsa(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) / ( z12 *rdttra(jk) ) 348 END DO 349 END DO 350 END DO 351 #else 311 352 DO jk = 1, jpkm1 312 353 t0_ldf(:,:,jk) = ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / ( z12 *rdttra(jk) ) 313 354 s0_ldf(:,:,jk) = ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / ( z12 *rdttra(jk) ) 314 355 END DO 356 #endif 315 357 ENDIF 316 358 tsb(:,:,:,jp_tem) = ztb (:,:,:) -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_bilap.F90
r2715 r3211 34 34 35 35 PUBLIC tra_ldf_bilap ! routine called by step.F90 36 37 !! * Control permutation of array indices 38 # include "oce_ftrans.h90" 39 # include "dom_oce_ftrans.h90" 40 # include "ldftra_oce_ftrans.h90" 41 # include "ldfslp_ftrans.h90" 42 # include "trc_oce_ftrans.h90" 36 43 37 44 !! * Substitutions … … 77 84 USE oce , ONLY: ztu => ua , ztv => va ! (ua,va) used as workspace 78 85 USE wrk_nemo, ONLY: zeeu => wrk_2d_1 , zeev => wrk_2d_2 , zlt => wrk_2d_3 ! 2D workspace 86 87 !! DCSE_NEMO: need additional directives for renamed module variables 88 !FTRANS ztu ztv :I :I :z 89 79 90 !! 80 91 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 82 93 INTEGER , INTENT(in ) :: kjpt ! number of tracers 83 94 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 95 96 !! DCSE_NEMO: This style defeats ftrans 97 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 98 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 99 !FTRANS ptb pta :I :I :z : 100 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before tracer fields 101 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 102 86 103 !! 87 104 INTEGER :: ji, jj, jk, jn ! dummy loop indices -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_bilapg.F90
r2715 r3211 30 30 31 31 PUBLIC tra_ldf_bilapg ! routine called by step.F90 32 33 !! * Control permutation of array indices 34 # include "oce_ftrans.h90" 35 # include "dom_oce_ftrans.h90" 36 # include "ldftra_oce_ftrans.h90" 37 # include "ldfslp_ftrans.h90" 38 # include "trc_oce_ftrans.h90" 32 39 33 40 !! * Substitutions … … 68 75 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 69 76 USE wrk_nemo, ONLY: wk1 => wrk_4d_1 , wk2 => wrk_4d_2 ! 4D workspace 77 !! DCSE_NEMO: need additional directives for renamed module variables 78 !FTRANS wk1 wk2 :I :I :z : 70 79 ! 71 80 INTEGER , INTENT(in ) :: kt ! ocean time-step index 72 81 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 73 82 INTEGER , INTENT(in ) :: kjpt ! number of tracers 74 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 75 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 83 84 !! DCSE_NEMO: This style defeats ftrans 85 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 86 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 87 !FTRANS ptb pta :I :I :z : 88 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before tracer fields 89 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 90 76 91 ! 77 92 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 105 120 ! --------------------------- 106 121 DO jn = 1, kjpt 122 #if defined key_z_first 123 DO jj = 2, jpjm1 124 DO ji = 2, jpim1 125 DO jk = 1, jpkm1 126 #else 107 127 DO jj = 2, jpjm1 108 128 DO jk = 1, jpkm1 109 129 DO ji = 2, jpim1 130 #endif 110 131 ! add it to the general tracer trends 111 132 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + wk2(ji,jj,jk,jn) … … 119 140 END SUBROUTINE tra_ldf_bilapg 120 141 142 !! * Reset control of array index permutation 143 # include "oce_ftrans.h90" 144 # include "dom_oce_ftrans.h90" 145 # include "ldftra_oce_ftrans.h90" 146 # include "ldfslp_ftrans.h90" 147 # include "trc_oce_ftrans.h90" 121 148 122 149 SUBROUTINE ldfght ( kt, cdtype, pt, plt, kjpt, kaht ) … … 163 190 USE wrk_nemo, ONLY: zftw => wrk_xz_1 , zdit => wrk_xz_2 164 191 USE wrk_nemo, ONLY: zdjt => wrk_xz_3 , zdj1t => wrk_xz_4 165 ! 166 INTEGER , INTENT(in ) :: kt ! ocean time-step index 167 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 168 INTEGER , INTENT(in ) :: kjpt !: dimension of 169 REAL(wp) , INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: pt ! tracer fields ( before for 1st call 170 ! ! and laplacian of these fields for 2nd call. 171 REAL(wp) , INTENT(out), DIMENSION(jpi,jpj,jpk,kjpt) :: plt !: partial harmonic operator applied to pt components except 172 ! !: second order vertical derivative term 173 INTEGER , INTENT(in ) :: kaht !: =1 multiply the laplacian by the eddy diffusivity coeff. 174 ! !: =2 no multiplication 192 193 !! DCSE_NEMO: need additional directives for renamed module variables 194 !FTRANS zftv :I :I :z 195 196 ! 197 INTEGER, INTENT(in ) :: kt ! ocean time-step index 198 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 199 INTEGER, INTENT(in ) :: kjpt !: dimension of 200 201 !! DCSE_NEMO: This style defeats ftrans 202 ! REAL(wp), INTENT(in ), DIMENSION(jpi,jpj,jpk,kjpt) :: pt ! tracer fields ( before for 1st call 203 ! ! ! and laplacian of these fields for 2nd call. 204 ! REAL(wp), INTENT(out), DIMENSION(jpi,jpj,jpk,kjpt) :: plt !: partial harmonic operator applied to pt components except 205 ! ! !: second order vertical derivative term 206 207 !FTRANS pt plt :I :I :z : 208 REAL(wp), INTENT(in ) :: pt(jpi,jpj,jpk,kjpt) ! tracer fields ( before for 1st call 209 ! ! and laplacian of these fields for 2nd call. 210 REAL(wp), INTENT(out) :: plt(jpi,jpj,jpk,kjpt) !: partial harmonic operator applied to pt components except 211 ! !: second order vertical derivative term 212 213 INTEGER, INTENT(in ) :: kaht !: =1 multiply the laplacian by the eddy diffusivity coeff. 214 ! !: =2 no multiplication 175 215 !! 176 216 INTEGER :: ji, jj, jk,jn ! dummy loop indices -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90
r2715 r3211 38 38 PUBLIC tra_ldf_iso ! routine called by step.F90 39 39 40 !! * Control permutation of array indices 41 # include "oce_ftrans.h90" 42 # include "dom_oce_ftrans.h90" 43 # include "trc_oce_ftrans.h90" 44 # include "zdf_oce_ftrans.h90" 45 # include "ldftra_oce_ftrans.h90" 46 # include "ldfslp_ftrans.h90" 47 40 48 !! * Substitutions 41 49 # include "domzgr_substitute.h90" … … 92 100 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 93 101 USE oce , ONLY: zftu => ua , zftv => va ! (ua,va) used as workspace 94 USE wrk_nemo, ONLY: zdkt => wrk_2d_1 , zdk1t => wrk_2d_2 , z2d => wrk_2d_3 ! 2D workspace 102 !! DCSE_NEMO: need additional directives for renamed module variables 103 !FTRANS zftu zftv :I :I :z 104 #if defined key_z_first 105 USE wrk_nemo, ONLY: wdkt => wrk_3d_9 , wdk1t => wrk_3d_10 ! 3D workspace 106 !FTRANS wdkt wdk1t :I :I :z 107 #else 108 USE wrk_nemo, ONLY: zdkt => wrk_2d_1 , zdk1t => wrk_2d_2 109 #endif 110 USE wrk_nemo, ONLY: z2d => wrk_2d_3 ! 2D workspace 95 111 USE wrk_nemo, ONLY: zdit => wrk_3d_6 , zdjt => wrk_3d_7 , ztfw => wrk_3d_8 ! 3D workspace 112 !FTRANS zdit zdjt ztfw :I :I :z 113 96 114 ! 97 115 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 99 117 INTEGER , INTENT(in ) :: kjpt ! number of tracers 100 118 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 101 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 102 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 119 120 !! DCSE_NEMO: This style defeats ftrans 121 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 122 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 123 !FTRANS ptb pta :I :I :z : 124 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before and now tracer fields 125 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 126 103 127 REAL(wp) , INTENT(in ) :: pahtb0 ! background diffusion coef 104 128 ! … … 112 136 !!---------------------------------------------------------------------- 113 137 138 #if defined key_z_first 139 IF( wrk_in_use(3, 6,7,8,9,10) .OR. wrk_in_use(2, 3) ) THEN 140 #else 114 141 IF( wrk_in_use(3, 6,7,8) .OR. wrk_in_use(2, 1,2,3) ) THEN 142 #endif 115 143 CALL ctl_stop('tra_ldf_iso : requested workspace array unavailable') ; RETURN 116 144 ENDIF … … 135 163 136 164 ! Horizontal tracer gradient 165 #if defined key_z_first 166 DO jj = 1, jpjm1 167 DO ji = 1, jpim1 168 DO jk = 1, jpkm1 169 #else 137 170 DO jk = 1, jpkm1 138 171 DO jj = 1, jpjm1 139 172 DO ji = 1, fs_jpim1 ! vector opt. 173 #endif 140 174 zdit(ji,jj,jk) = ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) * umask(ji,jj,jk) 141 175 zdjt(ji,jj,jk) = ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) * vmask(ji,jj,jk) … … 155 189 !! II - horizontal trend (full) 156 190 !!---------------------------------------------------------------------- 191 #if defined key_z_first 192 ! 1. Vertical tracer gradient at level jk and jk+1 193 ! ------------------------------------------------ 194 ! surface boundary condition: wdkt(jk=1)=wdkt(jk=2) 195 196 DO jj = 1, jpj 197 DO ji = 1, jpi 198 DO jk = 1, jpkm1 199 wdk1t(ji,jj,jk) = ( ptb(ji,jj,jk,jn) - ptb(ji,jj,jk+1,jn) ) * tmask(ji,jj,jk+1) 200 END DO 201 wdkt(ji,jj,1) = wdk1t(ji,jj,1) 202 DO jk = 2, jpkm1 203 wdkt(ji,jj,jk) = ( ptb(ji,jj,jk-1,jn) - ptb(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 204 END DO 205 END DO 206 END DO 207 208 ! 2. Horizontal fluxes 209 ! -------------------- 210 DO jj = 1 , jpjm1 211 DO ji = 1, jpim1 212 DO jk = 1, jpkm1 213 zabe1 = ( fsahtu(ji,jj,jk) + pahtb0 ) * e2u(ji,jj) * fse3u(ji,jj,jk) / e1u(ji,jj) 214 zabe2 = ( fsahtv(ji,jj,jk) + pahtb0 ) * e1v(ji,jj) * fse3v(ji,jj,jk) / e2v(ji,jj) 215 zmsku = 1. / MAX( tmask(ji+1,jj,jk ) + tmask(ji,jj,jk+1) & 216 & + tmask(ji+1,jj,jk+1) + tmask(ji,jj,jk ), 1. ) 217 zmskv = 1. / MAX( tmask(ji,jj+1,jk ) + tmask(ji,jj,jk+1) & 218 & + tmask(ji,jj+1,jk+1) + tmask(ji,jj,jk ), 1. ) 219 zcof1 = - fsahtu(ji,jj,jk) * e2u(ji,jj) * uslp(ji,jj,jk) * zmsku 220 zcof2 = - fsahtv(ji,jj,jk) * e1v(ji,jj) * vslp(ji,jj,jk) * zmskv 221 zftu(ji,jj,jk ) = ( zabe1 * zdit(ji,jj,jk) & 222 & + zcof1 * ( wdkt (ji+1,jj,jk) + wdk1t(ji,jj,jk) & 223 & + wdk1t(ji+1,jj,jk) + wdkt (ji,jj,jk) ) ) * umask(ji,jj,jk) 224 zftv(ji,jj,jk) = ( zabe2 * zdjt(ji,jj,jk) & 225 & + zcof2 * ( wdkt (ji,jj+1,jk) + wdk1t(ji,jj,jk) & 226 & + wdk1t(ji,jj+1,jk) + wdkt (ji,jj,jk) ) ) * vmask(ji,jj,jk) 227 END DO 228 END DO 229 END DO 230 231 ! II.4 Second derivative (divergence) and add to the general trend 232 ! ---------------------------------------------------------------- 233 DO jj = 2 , jpjm1 234 DO ji = 2, jpim1 235 DO jk = 1, jpkm1 236 zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 237 ztra = zbtr * ( zftu(ji,jj,jk) - zftu(ji-1,jj,jk) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk) ) 238 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ztra 239 END DO 240 END DO 241 END DO 242 #else 157 243 !CDIR PARALLEL DO PRIVATE( zdk1t ) 158 244 ! ! =============== … … 205 291 END DO ! End of slab 206 292 ! ! =============== 293 #endif 207 294 ! 208 295 ! "Poleward" diffusive heat or salt transports (T-S case only) … … 216 303 z2d(:,:) = 0._wp 217 304 zztmp = rau0 * rcp 305 #if defined key_z_first 306 DO jj = 2, jpjm1 307 DO ji = 2, jpim1 308 DO jk = 1, jpkm1 309 #else 218 310 DO jk = 1, jpkm1 219 311 DO jj = 2, jpjm1 220 312 DO ji = fs_2, fs_jpim1 ! vector opt. 313 #endif 221 314 z2d(ji,jj) = z2d(ji,jj) + zftu(ji,jj,jk) 222 315 END DO … … 227 320 CALL iom_put( "udiff_heattr", z2d ) ! heat transport in i-direction 228 321 z2d(:,:) = 0._wp 322 #if defined key_z_first 323 DO jj = 2, jpjm1 324 DO ji = 2, jpim1 325 DO jk = 1, jpkm1 326 #else 229 327 DO jk = 1, jpkm1 230 328 DO jj = 2, jpjm1 231 329 DO ji = fs_2, fs_jpim1 ! vector opt. 330 #endif 232 331 z2d(ji,jj) = z2d(ji,jj) + zftv(ji,jj,jk) 233 332 END DO … … 255 354 256 355 ! interior (2=<jk=<jpk-1) 356 #if defined key_z_first 357 DO jj = 2, jpjm1 358 DO ji = 2, jpim1 359 DO jk = 2, jpkm1 360 #else 257 361 DO jk = 2, jpkm1 258 362 DO jj = 2, jpjm1 259 363 DO ji = fs_2, fs_jpim1 ! vector opt. 364 #endif 260 365 zcoef0 = - fsahtw(ji,jj,jk) * tmask(ji,jj,jk) 261 366 ! … … 279 384 ! I.5 Divergence of vertical fluxes added to the general tracer trend 280 385 ! ------------------------------------------------------------------- 386 #if defined key_z_first 387 DO jj = 2, jpjm1 388 DO ji = 2, jpim1 389 DO jk = 1, jpkm1 390 #else 281 391 DO jk = 1, jpkm1 282 392 DO jj = 2, jpjm1 283 393 DO ji = fs_2, fs_jpim1 ! vector opt. 394 #endif 284 395 zbtr = 1.0 / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) 285 396 ztra = ( ztfw(ji,jj,jk) - ztfw(ji,jj,jk+1) ) * zbtr … … 291 402 END DO 292 403 ! 404 #if defined key_z_first 405 IF( wrk_not_released(3, 6,7,8,9,10) .OR. & 406 wrk_not_released(2, 3) ) CALL ctl_stop('tra_ldf_iso: failed to release workspace arrays') 407 #else 293 408 IF( wrk_not_released(3, 6,7,8) .OR. & 294 409 wrk_not_released(2, 1,2,3) ) CALL ctl_stop('tra_ldf_iso: failed to release workspace arrays') 410 #endif 295 411 ! 296 412 END SUBROUTINE tra_ldf_iso -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso_grif.F90
r2715 r3211 36 36 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zdkt ! atypic workspace 37 37 38 !! * Control permutation of array indices 39 # include "oce_ftrans.h90" 40 # include "dom_oce_ftrans.h90" 41 # include "trc_oce_ftrans.h90" 42 # include "zdf_oce_ftrans.h90" 43 # include "ldftra_oce_ftrans.h90" 44 # include "ldfslp_ftrans.h90" 45 # include "traldf_iso_grif_ftrans.h90" 46 38 47 !! * Substitutions 39 48 # include "domzgr_substitute.h90" … … 93 102 USE wrk_nemo, ONLY: zdit => wrk_3d_6 , zdjt => wrk_3d_7 , ztfw => wrk_3d_8 ! 3D workspace 94 103 USE wrk_nemo, ONLY: z2d => wrk_2d_1 ! 2D workspace 104 105 !! DCSE_NEMO: need additional directives for renamed module variables 106 !FTRANS zftu zftv :I :I :z 107 !FTRANS zdit zdjt ztfw :I :I :z 108 95 109 ! 96 110 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 98 112 INTEGER , INTENT(in ) :: kjpt ! number of tracers 99 113 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 100 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 101 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 114 115 !! DCSE_NEMO: This style defeats ftrans 116 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 117 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 118 119 !FTRANS ptb pta :I :I :z : 120 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before and now tracer fields 121 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 122 102 123 REAL(wp) , INTENT(in ) :: pahtb0 ! background diffusion coef 103 124 ! … … 156 177 DO ip = 0, 1 157 178 DO kp = 0, 1 179 #if defined key_z_first 180 DO jj = 1, jpjm1 181 DO ji = 1, jpim1 182 DO jk = 1, jpkm1 183 #else 158 184 DO jk = 1, jpkm1 159 185 DO jj = 1, jpjm1 160 186 DO ji = 1, fs_jpim1 187 #endif 161 188 ze3wr = 1._wp / fse3w(ji+ip,jj,jk+kp) 162 189 zbu = 0.25_wp * e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) … … 179 206 DO jp = 0, 1 180 207 DO kp = 0, 1 208 #if defined key_z_first 209 DO jj = 1, jpjm1 210 DO ji=1, jpim1 211 DO jk = 1, jpkm1 212 #else 181 213 DO jk = 1, jpkm1 182 214 DO jj = 1, jpjm1 183 215 DO ji=1,fs_jpim1 216 #endif 184 217 ze3wr = 1.0_wp / fse3w(ji,jj+jp,jk+kp) 185 218 zbv = 0.25_wp * e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) … … 208 241 zftv(:,:,:) = 0._wp 209 242 ! 243 #if defined key_z_first 244 !== before lateral T & S gradients at T-level jk ==! 245 DO jj = 1, jpjm1 246 DO ji = 1, jpim1 247 DO jk = 1, jpkm1 248 #else 210 249 DO jk = 1, jpkm1 !== before lateral T & S gradients at T-level jk ==! 211 250 DO jj = 1, jpjm1 212 251 DO ji = 1, fs_jpim1 ! vector opt. 252 #endif 213 253 zdit(ji,jj,jk) = ( ptb(ji+1,jj ,jk,jn) - ptb(ji,jj,jk,jn) ) * umask(ji,jj,jk) 214 254 zdjt(ji,jj,jk) = ( ptb(ji ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) ) * vmask(ji,jj,jk) … … 303 343 END DO 304 344 ! 345 #if defined key_z_first 346 DO jj = 2, jpjm1 !== Divergence of vertical fluxes added to the general tracer trend 347 DO ji = 2, jpim1 348 DO jk = 1, jpkm1 349 #else 305 350 DO jk = 1, jpkm1 !== Divergence of vertical fluxes added to the general tracer trend 306 351 DO jj = 2, jpjm1 307 352 DO ji = fs_2, fs_jpim1 ! vector opt. 353 #endif 308 354 pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) + ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) & 309 355 & / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ) … … 322 368 z2d(:,:) = 0._wp 323 369 zztmp = rau0 * rcp 370 #if defined key_z_first 371 DO jj = 2, jpjm1 372 DO ji = 2, jpim1 373 DO jk = 1, jpkm1 374 #else 324 375 DO jk = 1, jpkm1 325 376 DO jj = 2, jpjm1 326 377 DO ji = fs_2, fs_jpim1 ! vector opt. 378 #endif 327 379 z2d(ji,jj) = z2d(ji,jj) + zftu(ji,jj,jk) 328 380 END DO … … 333 385 CALL iom_put( "udiff_heattr", z2d ) ! heat transport in i-direction 334 386 z2d(:,:) = 0._wp 387 #if defined key_z_first 388 DO jj = 2, jpjm1 389 DO ji = 2, jpim1 390 DO jk = 1, jpkm1 391 #else 335 392 DO jk = 1, jpkm1 336 393 DO jj = 2, jpjm1 337 394 DO ji = fs_2, fs_jpim1 ! vector opt. 395 #endif 338 396 z2d(ji,jj) = z2d(ji,jj) + zftv(ji,jj,jk) 339 397 END DO -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap.F90
r2715 r3211 33 33 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:) :: e1ur, e2vr ! scale factor coefficients 34 34 35 !! * Control permutation of array indices 36 # include "oce_ftrans.h90" 37 # include "dom_oce_ftrans.h90" 38 # include "ldftra_oce_ftrans.h90" 39 # include "trc_oce_ftrans.h90" 40 35 41 !! * Substitutions 36 42 # include "domzgr_substitute.h90" … … 64 70 !!---------------------------------------------------------------------- 65 71 USE oce, ONLY: ztu => ua , ztv => va ! (ua,va) used as workspace 72 73 !! DCSE_NEMO: need additional directives for renamed module variables 74 !FTRANS ztu ztv :I :I :z 75 66 76 ! 67 77 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 69 79 INTEGER , INTENT(in ) :: kjpt ! number of tracers 70 80 REAL(wp), DIMENSION(jpi,jpj ,kjpt), INTENT(in ) :: pgu, pgv ! tracer gradient at pstep levels 71 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 72 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 81 82 !! DCSE_NEMO: This style defeats ftrans 83 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 84 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 85 86 !FTRANS ptb pta :I :I :z : 87 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before and now tracer fields 88 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 73 89 ! 74 90 INTEGER :: ji, jj, jk, jn ! dummy loop indices -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/tranpc.F90
r2715 r3211 29 29 PUBLIC tra_npc ! routine called by step.F90 30 30 31 !! * Control permutation of array indices 32 # include "oce_ftrans.h90" 33 # include "dom_oce_ftrans.h90" 34 # include "zdf_oce_ftrans.h90" 35 31 36 !! * Substitutions 32 37 # include "domzgr_substitute.h90" … … 59 64 USE wrk_nemo, ONLY: ztrdt => wrk_3d_1 , ztrds => wrk_3d_2 , zrhop => wrk_3d_3 60 65 USE wrk_nemo, ONLY: zwx => wrk_xz_1 , zwy => wrk_xz_2 , zwz => wrk_xz_3 66 67 !! DCSE_NEMO: need additional directives for renamed module variables 68 !FTRANS ztrdt ztrds zrhop :I :I :z 69 61 70 ! 62 71 INTEGER, INTENT(in) :: kt ! ocean time-step index … … 93 102 ! Static instability pointer 94 103 ! ---------------------------- 104 #if defined key_z_first 105 DO ji = 1, jpi 106 DO jk = 1, jpkm1 107 #else 95 108 DO jk = 1, jpkm1 96 109 DO ji = 1, jpi 110 #endif 97 111 zwx(ji,jk) = ( zrhop(ji,jj,jk) - zrhop(ji,jj,jk+1) ) * tmask(ji,jj,jk+1) 98 112 END DO -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90
r2715 r3211 58 58 REAL(wp) :: rbcp ! Brown & Campana parameters for semi-implicit hpg 59 59 60 !! * Control permutation of array indices 61 # include "oce_ftrans.h90" 62 # include "dom_oce_ftrans.h90" 63 # include "sbc_oce_ftrans.h90" 64 # include "zdf_oce_ftrans.h90" 65 # include "domvvl_ftrans.h90" 66 # include "obc_oce_ftrans.h90" 67 60 68 !! * Substitutions 61 69 # include "domzgr_substitute.h90" … … 93 101 INTEGER, INTENT(in) :: kt ! ocean time-step index 94 102 !! 95 INTEGER :: jk, jn ! dummy loop indices 96 REAL(wp) :: zfact ! local scalars 103 INTEGER :: ji, jj, jk, jn ! dummy loop indices 104 REAL(wp) :: zfact ! local scalar 105 106 !FTRANS ztrdt ztrds :I :I :z 97 107 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 98 108 !!---------------------------------------------------------------------- … … 142 152 IF( neuler == 0 .AND. kt == nit000 ) THEN ! Euler time-stepping at first time-step (only swap) 143 153 DO jn = 1, jpts 154 #if defined key_z_first 155 DO jj = 1, jpj 156 DO ji = 1, jpi 157 DO jk = 1, jpkm1 158 tsn(ji,jj,jk,jn) = tsa(ji,jj,jk,jn) 159 END DO 160 END DO 161 END DO 162 #else 144 163 DO jk = 1, jpkm1 145 164 tsn(:,:,jk,jn) = tsa(:,:,jk,jn) 146 165 END DO 166 #endif 147 167 END DO 148 168 ELSE ! Leap-Frog + Asselin filter time stepping … … 162 182 ! trends computation 163 183 IF( l_trdtra ) THEN ! trend of the Asselin filter (tb filtered - tb)/dt 184 #if defined key_z_first 185 DO jj = 1, jpj 186 DO ji = 1, jpi 187 DO jk = 1, jpkm1 188 zfact = 1.e0 / r2dtra(jk) 189 ztrdt(ji,jj,jk) = ( tsb(ji,jj,jk,jp_tem) - ztrdt(ji,jj,jk) ) * zfact 190 ztrds(ji,jj,jk) = ( tsb(ji,jj,jk,jp_sal) - ztrds(ji,jj,jk) ) * zfact 191 END DO 192 END DO 193 END DO 194 #else 164 195 DO jk = 1, jpkm1 165 196 zfact = 1.e0 / r2dtra(jk) … … 167 198 ztrds(:,:,jk) = ( tsb(:,:,jk,jp_sal) - ztrds(:,:,jk) ) * zfact 168 199 END DO 200 #endif 169 201 CALL trd_tra( kt, 'TRA', jp_tem, jptra_trd_atf, ztrdt ) 170 202 CALL trd_tra( kt, 'TRA', jp_sal, jptra_trd_atf, ztrds ) … … 178 210 END SUBROUTINE tra_nxt 179 211 212 !! * Reset control of array index permutation 213 !FTRANS CLEAR 214 # include "oce_ftrans.h90" 215 # include "dom_oce_ftrans.h90" 216 # include "sbc_oce_ftrans.h90" 217 # include "zdf_oce_ftrans.h90" 218 # include "domvvl_ftrans.h90" 219 # include "obc_oce_ftrans.h90" 180 220 181 221 SUBROUTINE tra_nxt_fix( kt, cdtype, ptb, ptn, pta, kjpt ) … … 205 245 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 206 246 INTEGER , INTENT(in ) :: kjpt ! number of tracers 207 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 208 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 209 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 247 248 !! DCSE_NEMO: This style defeats ftrans 249 ! REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 250 ! REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 251 ! REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 252 253 !FTRANS ptb ptn pta :I :I :z : 254 REAL(wp) , INTENT(inout) :: ptb(jpi,jpj,jpk,kjpt) ! before tracer fields 255 REAL(wp) , INTENT(inout) :: ptn(jpi,jpj,jpk,kjpt) ! now tracer fields 256 REAL(wp) , INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 210 257 ! 211 258 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 226 273 DO jn = 1, kjpt 227 274 ! 275 #if defined key_z_first 276 DO jj = 1, jpj 277 DO ji = 1, jpi 278 DO jk = 1, jpkm1 279 #else 228 280 DO jk = 1, jpkm1 229 281 DO jj = 1, jpj 230 282 DO ji = 1, jpi 283 #endif 231 284 ztn = ptn(ji,jj,jk,jn) 232 285 ztd = pta(ji,jj,jk,jn) - 2. * ztn + ptb(ji,jj,jk,jn) ! time laplacian on tracers … … 244 297 END SUBROUTINE tra_nxt_fix 245 298 299 !! * Reset control of array index permutation 300 !FTRANS CLEAR 301 # include "oce_ftrans.h90" 302 # include "dom_oce_ftrans.h90" 303 # include "sbc_oce_ftrans.h90" 304 # include "zdf_oce_ftrans.h90" 305 # include "domvvl_ftrans.h90" 306 # include "obc_oce_ftrans.h90" 246 307 247 308 SUBROUTINE tra_nxt_vvl( kt, cdtype, ptb, ptn, pta, kjpt ) … … 272 333 CHARACTER(len=3), INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 273 334 INTEGER , INTENT(in ) :: kjpt ! number of tracers 274 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 275 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 276 REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 335 336 !! DCSE_NEMO: This style defeats ftrans 337 ! REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptb ! before tracer fields 338 ! REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: ptn ! now tracer fields 339 ! REAL(wp) , INTENT(inout), DIMENSION(jpi,jpj,jpk,kjpt) :: pta ! tracer trend 340 341 !FTRANS ptb ptn pta :I :I :z : 342 REAL(wp) , INTENT(inout) :: ptb(jpi,jpj,jpk,kjpt) ! before tracer fields 343 REAL(wp) , INTENT(inout) :: ptn(jpi,jpj,jpk,kjpt) ! now tracer fields 344 REAL(wp) , INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 345 277 346 !! 278 347 LOGICAL :: ll_tra, ll_tra_hpg, ll_traqsr ! local logical … … 299 368 ! 300 369 DO jn = 1, kjpt 370 #if defined key_z_first 371 DO jj = 1, jpj 372 DO ji = 1, jpi 373 DO jk = 1, jpkm1 374 !! DCSE_NEMO: could try promoting these scalars to vectors 375 zfact1 = atfp * rdttra(jk) 376 zfact2 = zfact1 / rau0 377 #else 301 378 DO jk = 1, jpkm1 302 379 zfact1 = atfp * rdttra(jk) … … 304 381 DO jj = 1, jpj 305 382 DO ji = 1, jpi 383 #endif 306 384 ze3t_b = fse3t_b(ji,jj,jk) 307 385 ze3t_n = fse3t_n(ji,jj,jk) -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90
r2715 r3211 53 53 REAL(wp), DIMENSION(3,61) :: rkrgb !: tabulated attenuation coefficients for RGB absorption 54 54 55 !! * Control permutation of array indices 56 # include "oce_ftrans.h90" 57 # include "dom_oce_ftrans.h90" 58 # include "sbc_oce_ftrans.h90" 59 # include "trc_oce_ftrans.h90" 60 55 61 !! * Substitutions 56 62 # include "domzgr_substitute.h90" … … 94 100 USE wrk_nemo, ONLY: ze0 => wrk_3d_1 , ze1 => wrk_3d_2 , ze2 => wrk_3d_3 95 101 USE wrk_nemo, ONLY: ze3 => wrk_3d_4 , zea => wrk_3d_5 102 103 !! DCSE_NEMO: need additional directives for renamed module variables 104 !FTRANS ze0 ze1 ze2 ze3 zea :I :I :z 96 105 ! 97 106 INTEGER, INTENT(in) :: kt ! ocean time-step … … 102 111 REAL(wp) :: zc0, zc1, zc2, zc3 ! - - 103 112 REAL(wp) :: zz0, zz1, z1_e3t ! - - 113 114 !FTRANS ztrdt :I :I :z 104 115 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt 105 116 !!---------------------------------------------------------------------- … … 144 155 IF( lk_qsr_bio .AND. ln_qsr_bio ) THEN ! bio-model fluxes : all vertical coordinates ! 145 156 ! ! ============================================== ! 157 #if defined key_z_first 158 DO jj = 1, jpj 159 DO ji = 1, jpi 160 DO jk = 1, jpkm1 161 qsr_hc(:,:,jk) = ro0cpr * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 162 END DO 163 END DO 164 END DO 165 #else 146 166 DO jk = 1, jpkm1 147 167 qsr_hc(:,:,jk) = ro0cpr * ( etot3(:,:,jk) - etot3(:,:,jk+1) ) 148 168 END DO 169 #endif 149 170 ! Add to the general trend 171 #if defined key_z_first 172 DO jj = 2, jpjm1 173 DO ji = 2, jpim1 174 DO jk = 1, jpkm1 175 #else 150 176 DO jk = 1, jpkm1 151 177 DO jj = 2, jpjm1 152 178 DO ji = fs_2, fs_jpim1 ! vector opt. 179 #endif 153 180 z1_e3t = zfact / fse3t(ji,jj,jk) 154 181 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) * z1_e3t … … 198 225 zea(:,:,1) = qsr(:,:) 199 226 ! 227 #if defined key_z_first 228 DO jj = 1, jpj 229 DO ji = 1, jpi 230 DO jk = 2, nksr+1 231 #else 200 232 DO jk = 2, nksr+1 201 233 !CDIR NOVERRCHK … … 203 235 !CDIR NOVERRCHK 204 236 DO ji = 1, jpi 237 #endif 205 238 zc0 = ze0(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * xsi0r ) 206 239 zc1 = ze1(ji,jj,jk-1) * EXP( - fse3t(ji,jj,jk-1) * zekb(ji,jj) ) … … 216 249 END DO 217 250 ! 251 #if defined key_z_first 252 DO jj = 1, jpj 253 DO ji = 1, jpi 254 DO jk = 1, nksr ! compute and add qsr trend to ta 255 qsr_hc(ji,jj,jk) = ro0cpr * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) ) 256 END DO 257 END DO 258 END DO 259 #else 218 260 DO jk = 1, nksr ! compute and add qsr trend to ta 219 261 qsr_hc(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) 220 262 END DO 263 #endif 221 264 zea(:,:,nksr+1:jpk) = 0.e0 ! below 400m set to zero 222 265 CALL iom_put( 'qsr3d', zea ) ! Shortwave Radiation 3D distribution 223 266 ! 224 267 ELSE !* Constant Chlorophyll 268 #if defined key_z_first 269 DO jj = 1, jpj 270 DO ji = 1, jpi 271 DO jk = 1, nksr 272 qsr_hc(ji,jj,jk) = etot3(ji,jj,jk) * qsr(ji,jj) 273 END DO 274 END DO 275 END DO 276 #else 225 277 DO jk = 1, nksr 226 278 qsr_hc(:,:,jk) = etot3(:,:,jk) * qsr(:,:) 227 279 END DO 280 #endif 228 281 ENDIF 229 282 … … 236 289 zz0 = rn_abs * ro0cpr 237 290 zz1 = ( 1. - rn_abs ) * ro0cpr 291 #if defined key_z_first 292 DO jj = 2, jpjm1 293 DO ji = 2, jpim1 294 DO jk = 1, nksr ! solar heat absorbed at T-point in the top 400m 295 #else 238 296 DO jk = 1, nksr ! solar heat absorbed at T-point in the top 400m 239 297 DO jj = 2, jpjm1 240 298 DO ji = 2, jpim1 299 #endif 241 300 zc0 = zz0 * EXP( -fsdepw(ji,jj,jk )*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk )*xsi1r ) 242 301 zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) … … 246 305 END DO 247 306 ELSE !* constant volume: coef. computed one for all 307 #if defined key_z_first 308 DO jj = 2, jpjm1 309 DO ji = 2, jpim1 310 DO jk = 1, nksr 311 #else 248 312 DO jk = 1, nksr 249 313 DO jj = 2, jpjm1 250 314 DO ji = fs_2, fs_jpim1 ! vector opt. 315 #endif 251 316 qsr_hc(ji,jj,jk) = etot3(ji,jj,jk) * qsr(ji,jj) 252 317 END DO … … 259 324 ! 260 325 ! Add to the general trend 326 #if defined key_z_first 327 DO jj = 2, jpjm1 328 DO ji = 2, jpim1 329 DO jk = 1, nksr 330 #else 261 331 DO jk = 1, nksr 262 332 DO jj = 2, jpjm1 263 333 DO ji = fs_2, fs_jpim1 ! vector opt. 334 #endif 264 335 z1_e3t = zfact / fse3t(ji,jj,jk) 265 336 tsa(ji,jj,jk,jp_tem) = tsa(ji,jj,jk,jp_tem) + ( qsr_hc_b(ji,jj,jk) + qsr_hc(ji,jj,jk) ) * z1_e3t … … 293 364 END SUBROUTINE tra_qsr 294 365 366 !! * Reset control of array index permutation 367 !FTRANS CLEAR 368 # include "oce_ftrans.h90" 369 # include "dom_oce_ftrans.h90" 370 # include "sbc_oce_ftrans.h90" 371 # include "trc_oce_ftrans.h90" 295 372 296 373 SUBROUTINE tra_qsr_init … … 315 392 USE wrk_nemo, ONLY: ze0 => wrk_3d_1 , ze1 => wrk_3d_2 , ze2 => wrk_3d_3 316 393 USE wrk_nemo, ONLY: ze3 => wrk_3d_4 , zea => wrk_3d_5 394 395 !! DCSE_NEMO: Need additional directives for renamed module variables 396 !FTRANS ze0 ze1 ze2 ze3 zea :I :I :z 397 317 398 ! 318 399 INTEGER :: ji, jj, jk ! dummy loop indices … … 433 514 ! 434 515 zcoef = ( 1. - rn_abs ) / 3.e0 ! equi-partition in R-G-B 516 517 #if defined key_z_first 518 DO jj = 1, jpj 519 DO ji = 1, jpi 520 ze0(ji,jj,1) = rn_abs 521 ze1(ji,jj,1) = zcoef 522 ze2(ji,jj,1) = zcoef 523 ze3(ji,jj,1) = zcoef 524 zea(ji,jj,1) = tmask(ji,jj,1) ! = ( ze0+ze1+z2+ze3 ) * tmask 525 DO jk = 2, nksr+1 526 #else 435 527 ze0(:,:,1) = rn_abs 436 528 ze1(:,:,1) = zcoef … … 438 530 ze3(:,:,1) = zcoef 439 531 zea(:,:,1) = tmask(:,:,1) ! = ( ze0+ze1+z2+ze3 ) * tmask 440 441 532 DO jk = 2, nksr+1 442 533 !CDIR NOVERRCHK … … 444 535 !CDIR NOVERRCHK 445 536 DO ji = 1, jpi 537 #endif 446 538 zc0 = ze0(ji,jj,jk-1) * EXP( - fse3t_0(ji,jj,jk-1) * xsi0r ) 447 539 zc1 = ze1(ji,jj,jk-1) * EXP( - fse3t_0(ji,jj,jk-1) * zekb(ji,jj) ) … … 457 549 END DO 458 550 ! 551 #if defined key_z_first 552 DO jj = 1, jpj 553 DO ji = 1, jpi 554 DO jk = 1, nksr 555 etot3(ji,jj,jk) = ro0cpr * ( zea(ji,jj,jk) - zea(ji,jj,jk+1) ) 556 END DO 557 END DO 558 END DO 559 #else 459 560 DO jk = 1, nksr 460 561 etot3(:,:,jk) = ro0cpr * ( zea(:,:,jk) - zea(:,:,jk+1) ) 461 562 END DO 563 #endif 462 564 etot3(:,:,nksr+1:jpk) = 0.e0 ! below 400m set to zero 463 565 ENDIF … … 481 583 zz0 = rn_abs * ro0cpr 482 584 zz1 = ( 1. - rn_abs ) * ro0cpr 585 #if defined key_z_first 586 DO jj = 1, jpj !* solar heat absorbed at T-point computed once for all 587 DO ji = 1, jpi 588 DO jk = 1, nksr ! top 400 meters 589 zc0 = zz0 * EXP( -fsdepw(ji,jj,jk )*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk )*xsi1r ) 590 zc1 = zz0 * EXP( -fsdepw(ji,jj,jk+1)*xsi0r ) + zz1 * EXP( -fsdepw(ji,jj,jk+1)*xsi1r ) 591 etot3(ji,jj,jk) = ( zc0 * tmask(ji,jj,jk) - zc1 * tmask(ji,jj,jk+1) ) 592 END DO 593 DO jk = nksr+1, jpk 594 etot3(ji,jj,jk) = 0.e0 ! below 400m set to zero 595 END DO 596 END DO 597 END DO 598 #else 483 599 DO jk = 1, nksr !* solar heat absorbed at T-point computed once for all 484 600 DO jj = 1, jpj ! top 400 meters … … 491 607 END DO 492 608 etot3(:,:,nksr+1:jpk) = 0.e0 ! below 400m set to zero 609 #endif 493 610 ! 494 611 ENDIF -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/trasbc.F90
r2715 r3211 33 33 34 34 PUBLIC tra_sbc ! routine called by step.F90 35 36 !! * Control permutation of array indices 37 # include "oce_ftrans.h90" 38 # include "sbc_oce_ftrans.h90" 39 # include "dom_oce_ftrans.h90" 35 40 36 41 !! * Substitutions … … 108 113 INTEGER :: ji, jj, jk, jn ! dummy loop indices 109 114 REAL(wp) :: zfact, z1_e3t, zsrau, zdep 115 116 !FTRANS ztrdt ztrds :I :I :z 110 117 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 111 118 !!---------------------------------------------------------------------- -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/traswp.F90
r2715 r3211 12 12 PUBLIC tra_swap ! routine called by step.F90 13 13 PUBLIC tra_unswap ! routine called by step.F90 14 15 !! * Control permutation of array indices 16 # include "oce_ftrans.h90" 14 17 15 18 !!---------------------------------------------------------------------- -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90
r2715 r3211 40 40 INTEGER :: nzdf = 0 ! type vertical diffusion algorithm used (defined from ln_zdf... namlist logicals) 41 41 42 !! * Control permutation of array indices 43 # include "oce_ftrans.h90" 44 # include "dom_oce_ftrans.h90" 45 # include "domvvl_ftrans.h90" 46 # include "zdf_oce_ftrans.h90" 47 # include "sbc_oce_ftrans.h90" 48 # include "ldftra_oce_ftrans.h90" 49 42 50 !! * Substitutions 43 51 # include "domzgr_substitute.h90" … … 59 67 INTEGER, INTENT( in ) :: kt ! ocean time-step index 60 68 !! 61 INTEGER :: jk ! Dummy loop indices 69 INTEGER :: ji, jj, jk ! Dummy loop indices 70 !FTRANS ztrdt ztrds :I :I :z 62 71 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds ! 3D workspace 63 72 !!--------------------------------------------------------------------- … … 88 97 89 98 IF( l_trdtra ) THEN ! save the vertical diffusive trends for further diagnostics 99 #if defined key_z_first 100 DO jj = 1, jpj 101 DO ji = 1, jpi 102 DO jk = 1, jpkm1 103 ztrdt(ji,jj,jk) = ( ( tsa(ji,jj,jk,jp_tem) - tsb(ji,jj,jk,jp_tem) ) / r2dtra(jk) ) - ztrdt(ji,jj,jk) 104 ztrds(ji,jj,jk) = ( ( tsa(ji,jj,jk,jp_sal) - tsb(ji,jj,jk,jp_sal) ) / r2dtra(jk) ) - ztrds(ji,jj,jk) 105 END DO 106 END DO 107 END DO 108 #else 90 109 DO jk = 1, jpkm1 91 110 ztrdt(:,:,jk) = ( ( tsa(:,:,jk,jp_tem) - tsb(:,:,jk,jp_tem) ) / r2dtra(jk) ) - ztrdt(:,:,jk) 92 111 ztrds(:,:,jk) = ( ( tsa(:,:,jk,jp_sal) - tsb(:,:,jk,jp_sal) ) / r2dtra(jk) ) - ztrds(:,:,jk) 93 112 END DO 113 #endif 94 114 CALL trd_tra( kt, 'TRA', jp_tem, jptra_trd_zdf, ztrdt ) 95 115 CALL trd_tra( kt, 'TRA', jp_sal, jptra_trd_zdf, ztrds ) … … 119 139 USE zdfgls 120 140 USE zdfkpp 141 # include "zdftke_ftrans.h90" 121 142 !!---------------------------------------------------------------------- 122 143 -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf_exp.F90
r2715 r3211 36 36 37 37 PUBLIC tra_zdf_exp ! routine called by step.F90 38 39 !! * Control permutation of array indices 40 # include "oce_ftrans.h90" 41 # include "dom_oce_ftrans.h90" 42 # include "domvvl_ftrans.h90" 43 # include "zdf_oce_ftrans.h90" 44 # include "zdfddm_ftrans.h90" 45 # include "trc_oce_ftrans.h90" 38 46 39 47 !! * Substitutions … … 75 83 USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released 76 84 USE wrk_nemo, ONLY: zwx => wrk_3d_6, zwy => wrk_3d_7 ! 3D workspace 85 86 !! DCSE_NEMO: need additional directives for renamed module variables 87 !FTRANS zwx zwy :I :I :z 77 88 ! 78 89 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 81 92 INTEGER , INTENT(in ) :: kn_zdfexp ! number of sub-time step 82 93 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 83 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 94 95 !! DCSE_NEMO: This style defeats ftrans 96 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 97 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 98 99 !FTRANS ptb pta :I :I :z : 100 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before and now tracer fields 101 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 85 102 ! 86 103 INTEGER :: ji, jj, jk, jn, jl ! dummy loop indices … … 116 133 DO jl = 1, kn_zdfexp 117 134 ! ! first vertical derivative 135 #if defined key_z_first 136 DO jj = 2, jpjm1 137 DO ji = 2, jpim1 ! vector opt. 138 DO jk = 2, jpk 139 #else 118 140 DO jk = 2, jpk 119 141 DO jj = 2, jpjm1 120 142 DO ji = fs_2, fs_jpim1 ! vector opt. 143 #endif 121 144 zave3r = 1.e0 / fse3w_n(ji,jj,jk) 122 145 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN ! temperature : use of avt … … 129 152 END DO 130 153 ! 154 #if defined key_z_first 155 ! second vertical derivative ==> tracer at kt+l*2*rdt/nn_zdfexp 156 DO jj = 2, jpjm1 157 DO ji = 2, jpim1 158 DO jk = 1, jpkm1 159 #else 131 160 DO jk = 1, jpkm1 ! second vertical derivative ==> tracer at kt+l*2*rdt/nn_zdfexp 132 161 DO jj = 2, jpjm1 133 162 DO ji = fs_2, fs_jpim1 ! vector opt. 163 #endif 134 164 ze3tr = zlavmr / fse3t_n(ji,jj,jk) 135 165 zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt(jk) * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) * ze3tr … … 143 173 ! ------------------------------ 144 174 IF( lk_vvl ) THEN ! variable level thickness : leap-frog on tracer*e3t 175 #if defined key_z_first 176 DO jj = 2, jpjm1 177 DO ji = 2, jpim1 178 DO jk = 1, jpkm1 179 #else 145 180 DO jk = 1, jpkm1 146 181 DO jj = 2, jpjm1 147 182 DO ji = fs_2, fs_jpim1 ! vector opt. 183 #endif 148 184 ze3tb = fse3t_b(ji,jj,jk) / fse3t(ji,jj,jk) ! before e3t 149 185 ztra = zwx(ji,jj,jk) - ptb(ji,jj,jk,jn) + p2dt(jk) * pta(ji,jj,jk,jn) ! total trends * 2*rdt … … 153 189 END DO 154 190 ELSE ! fixed level thickness : leap-frog on tracers 191 #if defined key_z_first 192 DO jj = 2, jpjm1 193 DO ji = 2, jpim1 194 DO jk = 1, jpkm1 195 #else 155 196 DO jk = 1, jpkm1 156 197 DO jj = 2, jpjm1 157 198 DO ji = fs_2, fs_jpim1 ! vector opt. 199 #endif 158 200 pta(ji,jj,jk,jn) = ( zwx(ji,jj,jk) + p2dt(jk) * pta(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 159 201 END DO -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf_imp.F90
r2715 r3211 42 42 43 43 REAL(wp) :: r_vvl ! variable volume indicator, =1 if lk_vvl=T, =0 otherwise 44 45 !! * Control permutation of array indices 46 # include "oce_ftrans.h90" 47 # include "dom_oce_ftrans.h90" 48 # include "zdf_oce_ftrans.h90" 49 # include "trc_oce_ftrans.h90" 50 # include "domvvl_ftrans.h90" 51 # include "ldftra_oce_ftrans.h90" 52 # include "ldfslp_ftrans.h90" 53 # include "zdfddm_ftrans.h90" 54 # include "traldf_iso_grif_ftrans.h90" 44 55 45 56 !! * Substitutions … … 77 88 USE oce , ONLY: zwd => ua , zws => va ! (ua,va) used as 3D workspace 78 89 USE wrk_nemo, ONLY: zwi => wrk_3d_6 , zwt => wrk_3d_7 ! 3D workspace 90 91 !! DCSE_NEMO: Need additional directives for renamed module variables 92 !FTRANS zwd zws :I :I :z 93 !FTRANS zwi zwt :I :I :z 79 94 ! 80 95 INTEGER , INTENT(in ) :: kt ! ocean time-step index … … 82 97 INTEGER , INTENT(in ) :: kjpt ! number of tracers 83 98 REAL(wp), DIMENSION( jpk ), INTENT(in ) :: p2dt ! vertical profile of tracer time-step 84 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 99 100 !! DCSE_NEMO: This style defeats ftrans 101 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: ptb ! before and now tracer fields 102 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) :: pta ! tracer trend 103 104 !FTRANS ptb pta :I :I :z : 105 REAL(wp), INTENT(in ) :: ptb(jpi,jpj,jpk,kjpt) ! before and now tracer fields 106 REAL(wp), INTENT(inout) :: pta(jpi,jpj,jpk,kjpt) ! tracer trend 86 107 ! 87 108 INTEGER :: ji, jj, jk, jn ! dummy loop indices … … 115 136 ! 116 137 ! vertical mixing coef.: avt for temperature, avs for salinity and passive tracers 138 #if defined key_z_first 139 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN 140 DO jj = 1, jpj 141 DO ji = 1, jpi 142 zwt(ji,jj,1) = 0._wp 143 DO jk = 2, jpk 144 zwt(ji,jj,jk) = avt (ji,jj,jk) 145 END DO 146 END DO 147 END DO 148 ELSE 149 DO jj = 1, jpj 150 DO ji = 1, jpi 151 zwt(ji,jj,1) = 0._wp 152 DO jk = 2, jpk 153 zwt(ji,jj,jk) = fsavs(ji,jj,jk) 154 END DO 155 END DO 156 END DO 157 ENDIF 158 #else 117 159 IF( cdtype == 'TRA' .AND. jn == jp_tem ) THEN ; zwt(:,:,2:jpk) = avt (:,:,2:jpk) 118 160 ELSE ; zwt(:,:,2:jpk) = fsavs(:,:,2:jpk) 119 161 ENDIF 120 162 zwt(:,:,1) = 0._wp 163 #endif 121 164 ! 122 165 #if defined key_ldfslp 123 166 ! isoneutral diffusion: add the contribution 124 167 IF( ln_traldf_grif ) THEN ! Griffies isoneutral diff 168 #if defined key_z_first 169 DO jj = 2, jpjm1 170 DO ji = 2, jpim1 171 DO jk = 2, jpkm1 172 #else 125 173 DO jk = 2, jpkm1 126 174 DO jj = 2, jpjm1 127 175 DO ji = fs_2, fs_jpim1 ! vector opt. 176 #endif 128 177 zwt(ji,jj,jk) = zwt(ji,jj,jk) + ah_wslp2(ji,jj,jk) 129 178 END DO … … 131 180 END DO 132 181 ELSE IF( l_traldf_rot ) THEN ! standard isoneutral diff 182 #if defined key_z_first 183 DO jj = 2, jpjm1 184 DO ji = 2, jpim1 185 DO jk = 2, jpkm1 186 #else 133 187 DO jk = 2, jpkm1 134 188 DO jj = 2, jpjm1 135 189 DO ji = fs_2, fs_jpim1 ! vector opt. 190 #endif 136 191 zwt(ji,jj,jk) = zwt(ji,jj,jk) + fsahtw(ji,jj,jk) & 137 192 & * ( wslpi(ji,jj,jk) * wslpi(ji,jj,jk) & … … 143 198 #endif 144 199 ! Diagonal, lower (i), upper (s) (including the bottom boundary condition since avt is masked) 200 #if defined key_z_first 201 DO jj = 2, jpjm1 202 DO ji = 2, jpim1 203 DO jk = 1, jpkm1 204 ze3ta = ( 1. - r_vvl ) + r_vvl * fse3t_a(ji,jj,jk) ! after scale factor at T-point 205 ze3tn = r_vvl + ( 1. - r_vvl ) * fse3t_n(ji,jj,jk) ! now scale factor at T-point 206 zwi(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk ) / ( ze3tn * fse3w(ji,jj,jk ) ) 207 zws(ji,jj,jk) = - p2dt(jk) * zwt(ji,jj,jk+1) / ( ze3tn * fse3w(ji,jj,jk+1) ) 208 zwd(ji,jj,jk) = ze3ta - zwi(ji,jj,jk) - zws(ji,jj,jk) 209 END DO 210 #else 145 211 DO jk = 1, jpkm1 146 212 DO jj = 2, jpjm1 … … 154 220 END DO 155 221 END DO 222 #endif 156 223 ! 157 224 !! Matrix inversion from the first level … … 176 243 ! first recurrence: Tk = Dk - Ik Sk-1 / Tk-1 (increasing k) 177 244 ! done once for all passive tracers (so included in the IF instruction) 245 #if defined key_z_first 246 zwt(ji,jj,1) = zwd(ji,jj,1) 247 DO jk = 2, jpkm1 248 zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwt(ji,jj,jk-1) 249 END DO 250 END DO 251 END DO 252 #else 178 253 DO jj = 2, jpjm1 179 254 DO ji = fs_2, fs_jpim1 … … 188 263 END DO 189 264 END DO 265 #endif 190 266 ! 191 267 END IF 192 268 ! 193 269 ! second recurrence: Zk = Yk - Ik / Tk-1 Zk-1 270 #if defined key_z_first 271 DO jj = 2, jpjm1 272 DO ji = 2, jpim1 273 ze3tb = ( 1. - r_vvl ) + r_vvl * fse3t_b(ji,jj,1) 274 ze3tn = ( 1. - r_vvl ) + r_vvl * fse3t(ji,jj,1) 275 pta(ji,jj,1,jn) = ze3tb * ptb(ji,jj,1,jn) + p2dt(1) * ze3tn * pta(ji,jj,1,jn) 276 DO jk = 2, jpkm1 277 ze3tb = ( 1. - r_vvl ) + r_vvl * fse3t_b(ji,jj,jk) 278 ze3tn = ( 1. - r_vvl ) + r_vvl * fse3t (ji,jj,jk) 279 zrhs = ze3tb * ptb(ji,jj,jk,jn) + p2dt(jk) * ze3tn * pta(ji,jj,jk,jn) ! zrhs=right hand side 280 pta(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * pta(ji,jj,jk-1,jn) 281 END DO 282 #else 194 283 DO jj = 2, jpjm1 195 284 DO ji = fs_2, fs_jpim1 … … 209 298 END DO 210 299 END DO 300 #endif 211 301 212 302 ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk (result is the after tracer) 303 #if defined key_z_first 304 pta(ji,jj,jpkm1,jn) = pta(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1) 305 DO jk = jpk-2, 1, -1 306 pta(ji,jj,jk,jn) = ( pta(ji,jj,jk,jn) - zws(ji,jj,jk) * pta(ji,jj,jk+1,jn) ) & 307 & / zwt(ji,jj,jk) * tmask(ji,jj,jk) 308 END DO 309 END DO 310 END DO 311 #else 213 312 DO jj = 2, jpjm1 214 313 DO ji = fs_2, fs_jpim1 … … 224 323 END DO 225 324 END DO 325 #endif 226 326 ! ! ================= ! 227 327 END DO ! end tracer loop ! -
branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/TRA/zpshde.F90
r2715 r3211 26 26 27 27 PUBLIC zps_hde ! routine called by step.F90 28 29 !! * Control permutation of array indices 30 # include "oce_ftrans.h90" 31 # include "dom_oce_ftrans.h90" 28 32 29 33 !! * Substitutions … … 87 91 INTEGER , INTENT(in ) :: kt ! ocean time-step index 88 92 INTEGER , INTENT(in ) :: kjpt ! number of tracers 89 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pta ! 4D tracers fields 93 94 !! DCSE_NEMO: This style defeats ftrans 95 ! REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in ) :: pta ! 4D tracers fields 96 !FTRANS pta :I :I :z : 97 REAL(wp), INTENT(in ) :: pta(jpi,jpj,jpk,kjpt) ! 4D tracers fields 98 90 99 REAL(wp), DIMENSION(jpi,jpj, kjpt), INTENT( out) :: pgtu, pgtv ! hor. grad. of ptra at u- & v-pts 91 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ), OPTIONAL :: prd ! 3D density anomaly fields 100 101 ! REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ), OPTIONAL :: prd ! 3D density anomaly fields 102 !FTRANS prd :I :I :z 103 REAL(wp), INTENT(in ), OPTIONAL :: prd(jpi,jpj,jpk) ! 3D density anomaly fields 104 92 105 REAL(wp), DIMENSION(jpi,jpj ), INTENT( out), OPTIONAL :: pgru, pgrv ! hor. grad. of prd at u- & v-pts 93 106 ! … … 126 139 zti(ji,jj,jn) = pta(ji+1,jj,iku,jn) + zmaxu * ( pta(ji+1,jj,ikum1,jn) - pta(ji+1,jj,iku,jn) ) 127 140 ! gradient of tracers 141 #if defined key_z_first 142 pgtu(ji,jj,jn) = umask_1(ji,jj) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) ) 143 #else 128 144 pgtu(ji,jj,jn) = umask(ji,jj,1) * ( zti(ji,jj,jn) - pta(ji,jj,iku,jn) ) 145 #endif 129 146 ELSE ! case 2 130 147 zmaxu = -ze3wu / fse3w(ji,jj,iku) … … 132 149 zti(ji,jj,jn) = pta(ji,jj,iku,jn) + zmaxu * ( pta(ji,jj,ikum1,jn) - pta(ji,jj,iku,jn) ) 133 150 ! gradient of tracers 151 #if defined key_z_first 152 pgtu(ji,jj,jn) = umask_1(ji,jj) * ( pta(ji+1,jj,iku,jn) - zti(ji,jj,jn) ) 153 #else 134 154 pgtu(ji,jj,jn) = umask(ji,jj,1) * ( pta(ji+1,jj,iku,jn) - zti(ji,jj,jn) ) 155 #endif 135 156 ENDIF 136 157 ! … … 141 162 ztj(ji,jj,jn) = pta(ji,jj+1,ikv,jn) + zmaxv * ( pta(ji,jj+1,ikvm1,jn) - pta(ji,jj+1,ikv,jn) ) 142 163 ! gradient of tracers 164 #if defined key_z_first 165 pgtv(ji,jj,jn) = vmask_1(ji,jj) * ( ztj(ji,jj,jn) - pta(ji,jj,ikv,jn) ) 166 #else 143 167 pgtv(ji,jj,jn) = vmask(ji,jj,1) * ( ztj(ji,jj,jn) - pta(ji,jj,ikv,jn) ) 168 #endif 144 169 ELSE ! case 2 145 170 zmaxv = -ze3wv / fse3w(ji,jj,ikv) … … 147 172 ztj(ji,jj,jn) = pta(ji,jj,ikv,jn) + zmaxv * ( pta(ji,jj,ikvm1,jn) - pta(ji,jj,ikv,jn) ) 148 173 ! gradient of tracers 174 #if defined key_z_first 175 pgtv(ji,jj,jn) = vmask_1(ji,jj) * ( pta(ji,jj+1,ikv,jn) - ztj(ji,jj,jn) ) 176 #else 149 177 pgtv(ji,jj,jn) = vmask(ji,jj,1) * ( pta(ji,jj+1,ikv,jn) - ztj(ji,jj,jn) ) 178 #endif 150 179 ENDIF 151 180 # if ! defined key_vectopt_loop
Note: See TracChangeset
for help on using the changeset viewer.