New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 14834 for NEMO/trunk/src/OCE/TRA/traldf_triad.F90 – NEMO

Ignore:
Timestamp:
2021-05-11T11:24:44+02:00 (3 years ago)
Author:
hadcv
Message:

#2600: Merge in dev_r14273_HPC-02_Daley_Tiling

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/TRA/traldf_triad.F90

    r14820 r14834  
    1313   USE oce            ! ocean dynamics and active tracers 
    1414   USE dom_oce        ! ocean space and time domain 
    15    ! TEMP: [tiling] This change not necessary if XIOS has subdomain support 
    16    USE domtile 
    1715   USE domutl, ONLY : is_tile 
    1816   USE phycst         ! physical constants 
     
    109107      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend 
    110108      ! 
    111       INTEGER  ::  ji, jj, jk, jn, kp   ! dummy loop indices 
     109      INTEGER  ::  ji, jj, jk, jn, kp, iij   ! dummy loop indices 
    112110      REAL(wp) ::  zcoef0, ze3w_2, zsign          !   -      - 
    113111      ! 
     
    115113      REAL(wp) ::   ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt, zdyt_jp1, ze3wr_jp1, zdzt_jp1, zah_slp1, zah_slp_jp1, zaei_slp_jp1 
    116114      REAL(wp) ::   zah_slp, zaei_slp, zdxt_ip1, ze3wr_ip1, zdzt_ip1, zah_slp_ip1, zaei_slp_ip1, zaei_slp1 
    117       REAL(wp), DIMENSION(A2D(nn_hls),0:1)     ::   zdkt3d                         ! vertical tracer gradient at 2 levels 
    118       REAL(wp), DIMENSION(A2D(nn_hls)        ) ::   z2d                            ! 2D workspace 
    119       REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk) ::   zdit, zdjt, zftu, zftv, ztfw   ! 3D     - 
    120       ! TEMP: [tiling] This can be A2D(nn_hls) if XIOS has subdomain support 
    121       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpsi_uw, zpsi_vw 
     115      REAL(wp), DIMENSION(A2D(nn_hls),0:1) ::   zdkt3d                                           ! vertical tracer gradient at 2 levels 
     116      REAL(wp), DIMENSION(A2D(nn_hls)    ) ::   z2d                                              ! 2D workspace 
     117      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw   ! 3D     - 
    122118      !!---------------------------------------------------------------------- 
    123119      ! 
    124       IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     120      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
    125121         IF( kpass == 1 .AND. kt == kit000 )  THEN 
    126122            IF(lwp) WRITE(numout,*) 
     
    138134      ENDIF 
    139135      ! 
     136      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 
     137      IF( nldf_tra == np_blp_it .AND. kpass == 1 ) THEN ; iij = nn_hls 
     138      ELSE                                              ; iij = 1 
     139      ENDIF 
     140 
     141      ! 
    140142      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0) 
    141143      ELSE                    ;   zsign = -1._wp 
     
    148150      IF( kpass == 1 ) THEN         !==  first pass only  and whatever the tracer is  ==! 
    149151         ! 
    150          DO_3D( 0, 0, 0, 0, 1, jpk ) 
     152         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    151153            akz     (ji,jj,jk) = 0._wp 
    152154            ah_wslp2(ji,jj,jk) = 0._wp 
     
    154156         ! 
    155157         DO kp = 0, 1                            ! i-k triads 
    156             DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     158            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
    157159               ze3wr = 1._wp / e3w(ji,jj,jk+kp,Kmm) 
    158160               zbu   = e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm) 
     
    177179         ! 
    178180         DO kp = 0, 1                            ! j-k triads 
    179             DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
     181            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
    180182               ze3wr = 1.0_wp / e3w(ji,jj,jk+kp,Kmm) 
    181183               zbv   = e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm) 
     
    203205            ! 
    204206            IF( ln_traldf_blp ) THEN                ! bilaplacian operator 
    205                DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     207               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    206208                  akz(ji,jj,jk) = 16._wp           & 
    207209                     &   * ah_wslp2   (ji,jj,jk)   & 
     
    211213               END_3D 
    212214            ELSEIF( ln_traldf_lap ) THEN              ! laplacian operator 
    213                DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     215               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    214216                  ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    215217                  zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  ) 
     
    219221           ! 
    220222         ELSE                                    ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 
    221             DO_3D( 0, 0, 0, 0, 1, jpk ) 
     223            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    222224               akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 
    223225            END_3D 
    224226         ENDIF 
    225227         ! 
    226          ! TEMP: [tiling] These changes not necessary if XIOS has subdomain support 
    227          IF( ntile == 0 .OR. ntile == nijtile )  THEN                ! Do only for the full domain 
    228             IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 
    229                IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) 
    230  
    231                   zpsi_uw(:,:,:) = 0._wp 
    232                   zpsi_vw(:,:,:) = 0._wp 
    233  
    234                   DO kp = 0, 1 
    235                      DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    236                         ! round brackets added to fix the order of floating point operations 
    237                         ! needed to ensure halo 1 - halo 2 compatibility [ NOT TESTED ] 
    238                         zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp)                                     & 
    239                            & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp)        &  
    240                            &   + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp)      & 
    241                            &   )                                                                        ! bracket for halo 1 - halo 2 compatibility 
    242                         zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp)                                     & 
    243                            & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp)        & 
    244                            &   + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp)      & 
    245                            &   )                                                                        ! bracket for halo 1 - halo 2 compatibility 
    246                      END_3D 
    247                   END DO 
    248                CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 
    249  
    250                IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = nijtile ) 
    251             ENDIF 
     228         IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 
     229            zpsi_uw(:,:,:) = 0._wp 
     230            zpsi_vw(:,:,:) = 0._wp 
     231 
     232            DO kp = 0, 1 
     233               DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
     234                  ! round brackets added to fix the order of floating point operations 
     235                  ! needed to ensure halo 1 - halo 2 compatibility 
     236                  zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp)                                     & 
     237                     & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp)        & 
     238                     &   + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp)      & 
     239                     &   )                                                                        ! bracket for halo 1 - halo 2 compatibility 
     240                  zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp)                                     & 
     241                     & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp)        & 
     242                     &   + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp)      & 
     243                     &   )                                                                        ! bracket for halo 1 - halo 2 compatibility 
     244               END_3D 
     245            END DO 
     246            CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 
    252247         ENDIF 
    253248         ! 
     
    262257         zftu(:,:,:) = 0._wp 
    263258         zftv(:,:,:) = 0._wp 
    264          ! 
    265          DO_3D( 1, 0, 1, 0, 1, jpkm1 )    !==  before lateral T & S gradients at T-level jk  ==! 
     259         zdit(:,:,:) = 0._wp 
     260         zdjt(:,:,:) = 0._wp 
     261         ! 
     262         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 )    !==  before lateral T & S gradients at T-level jk  ==! 
    266263            zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
    267264            zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 
    268265         END_3D 
    269266         IF( ln_zps .AND. l_grad_zps ) THEN    ! partial steps: correction at top/bottom ocean level 
    270             DO_2D( 1, 0, 1, 0 )                    ! bottom level 
     267            DO_2D( iij, iij-1, iij, iij-1 )                    ! bottom level 
    271268               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 
    272269               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 
    273270            END_2D 
    274271            IF( ln_isfcav ) THEN                   ! top level (ocean cavities only) 
    275                DO_2D( 1, 0, 1, 0 ) 
     272               DO_2D( iij, iij-1, iij, iij-1 ) 
    276273                  IF( miku(ji,jj)  > 1 )   zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 
    277274                  IF( mikv(ji,jj)  > 1 )   zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) 
     
    286283         DO jk = 1, jpkm1 
    287284            !                    !==  Vertical tracer gradient at level jk and jk+1 
    288             DO_2D( 1, 1, 1, 1 ) 
     285            DO_2D( iij, iij, iij, iij ) 
    289286               zdkt3d(ji,jj,1) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * tmask(ji,jj,jk+1) 
    290287            END_2D 
     
    293290            IF( jk == 1 ) THEN   ;   zdkt3d(:,:,0) = zdkt3d(:,:,1) 
    294291            ELSE 
    295                DO_2D( 1, 1, 1, 1 ) 
     292               DO_2D( iij, iij, iij, iij ) 
    296293                  zdkt3d(ji,jj,0) = ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
    297294               END_2D 
     
    305302            IF( ln_botmix_triad ) THEN 
    306303               DO kp = 0, 1              !==  Horizontal & vertical fluxes 
    307                   DO_2D( 1, 0, 1, 0 ) 
     304                  DO_2D( iij, iij-1, iij, iij-1 ) 
    308305                     ze1ur = r1_e1u(ji,jj) 
    309306                     zdxt  = zdit(ji,jj,jk) * ze1ur 
     
    317314                     zbu_ip1 = 0.25_wp * e1e2u(ji+1,jj) * e3u(ji+1,jj,jk,Kmm) 
    318315                     ! ln_botmix_triad is .T. don't mask zah for bottom half cells    !!gm ?????   ahu is masked.... 
    319                      zah = pahu(ji,jj,jk)  
    320                      zah_ip1 = pahu(ji+1,jj,jk)  
     316                     zah = pahu(ji,jj,jk) 
     317                     zah_ip1 = pahu(ji+1,jj,jk) 
    321318                     zah_slp  = zah * triadi(ji,jj,jk,1,kp) 
    322319                     zah_slp_ip1  = zah_ip1 * triadi(ji+1,jj,jk,1,kp) 
     
    333330                                         &      + ( zah * zdxt + zah_slp1 * zdzt_ip1 - zaei_slp1 * zdzt_ip1 ) * zbu * ze1ur  & 
    334331                                         &      )                                                                            ! bracket for halo 1 - halo 2 compatibility 
    335                      ztfw(ji+1,jj,jk+kp) =  ztfw(ji+1,jj,jk+kp)                                                              &  
     332                     ztfw(ji+1,jj,jk+kp) =  ztfw(ji+1,jj,jk+kp)                                                              & 
    336333                                         &    - ( (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1              & 
    337                                          &      + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1                           &  
    338                                          &      )                                                                            ! bracket for halo 1 - halo 2 compatibility 
    339                      END_2D 
    340                   END DO 
     334                                         &      + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1                           & 
     335                                         &      )                                                                            ! bracket for halo 1 - halo 2 compatibility 
     336                  END_2D 
     337               END DO 
    341338               ! 
    342339               DO kp = 0, 1 
    343                   DO_2D( 1, 0, 1, 0 ) 
     340                  DO_2D( iij, iij-1, iij, iij-1 ) 
    344341                     ze2vr = r1_e2v(ji,jj) 
    345342                     zdyt  = zdjt(ji,jj,jk) * ze2vr 
     
    353350                     ! ln_botmix_triad is .T. don't mask zah for bottom half cells    !!gm ?????   ahu is masked.... 
    354351                     zah = pahv(ji,jj,jk)          ! pahv(ji,jj+jp,jk)  ???? 
    355                      zah_jp1 = pahv(ji,jj+1,jk)  
     352                     zah_jp1 = pahv(ji,jj+1,jk) 
    356353                     zah_slp = zah * triadj(ji,jj,jk,1,kp) 
    357354                     zah_slp1 = zah * triadj(ji,jj+1,jk,0,kp) 
    358355                     zah_slp_jp1 = zah_jp1 * triadj(ji,jj+1,jk,1,kp) 
    359356                     IF( ln_ldfeiv )   THEN 
    360                         zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp)   
    361                         zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp)   
     357                        zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 
     358                        zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 
    362359                        zaei_slp1 = aeiv(ji,jj,jk) * triadj_g(ji,jj+1,jk,0,kp) 
    363360                     ENDIF 
     
    377374            ELSE 
    378375               ! 
    379                DO kp = 0, 1 
    380                   DO_2D( 1, 0, 1, 0 ) 
     376               DO kp = 0, 1               !==  Horizontal & vertical fluxes 
     377                  DO_2D( iij, iij-1, iij, iij-1 ) 
    381378                     ze1ur = r1_e1u(ji,jj) 
    382379                     zdxt  = zdit(ji,jj,jk) * ze1ur 
     
    391388                     ! ln_botmix_triad is .F. mask zah for bottom half cells 
    392389                     zah = pahu(ji,jj,jk) * umask(ji,jj,jk+kp)         ! pahu(ji+ip,jj,jk)   ===>>  ???? 
    393                      zah_ip1 = pahu(ji+1,jj,jk) * umask(ji+1,jj,jk+kp)  
     390                     zah_ip1 = pahu(ji+1,jj,jk) * umask(ji+1,jj,jk+kp) 
    394391                     zah_slp  = zah * triadi(ji,jj,jk,1,kp) 
    395392                     zah_slp_ip1  = zah_ip1 * triadi(ji+1,jj,jk,1,kp) 
    396393                     zah_slp1  = zah * triadi(ji+1,jj,jk,0,kp) 
    397394                     IF( ln_ldfeiv )   THEN 
    398                         zaei_slp = aeiu(ji,jj,jk) * triadi_g(ji,jj,jk,1,kp)  
     395                        zaei_slp = aeiu(ji,jj,jk) * triadi_g(ji,jj,jk,1,kp) 
    399396                        zaei_slp_ip1 = aeiu(ji+1,jj,jk) * triadi_g(ji+1,jj,jk,1,kp) 
    400397                        zaei_slp1 = aeiu(ji,jj,jk) * triadi_g(ji+1,jj,jk,0,kp) 
     
    406403                                         &      + ( zah * zdxt + zah_slp1 * zdzt_ip1 - zaei_slp1 * zdzt_ip1 ) * zbu * ze1ur  & 
    407404                                         &      )                                                                            ! bracket for halo 1 - halo 2 compatibility 
    408                      ztfw(ji+1,jj,jk+kp) =  ztfw(ji+1,jj,jk+kp)                                                              &  
     405                     ztfw(ji+1,jj,jk+kp) =  ztfw(ji+1,jj,jk+kp)                                                              & 
    409406                                         &    - ( (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1              & 
    410407                                         &      + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1                           & 
     
    414411               ! 
    415412               DO kp = 0, 1 
    416                   DO_2D( 1, 0, 1, 0 ) 
     413                  DO_2D( iij, iij-1, iij, iij-1 ) 
    417414                     ze2vr = r1_e2v(ji,jj) 
    418415                     zdyt  = zdjt(ji,jj,jk) * ze2vr 
     
    431428                     zah_slp_jp1 = zah_jp1 * triadj(ji,jj+1,jk,1,kp) 
    432429                     IF( ln_ldfeiv )   THEN 
    433                         zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp)  
     430                        zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 
    434431                        zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 
    435432                        zaei_slp1 = aeiv(ji,jj,jk) * triadj_g(ji,jj+1,jk,0,kp) 
     
    449446            ENDIF 
    450447            !                             !==  horizontal divergence and add to the general trend  ==! 
    451             DO_2D( 0, 0, 0, 0 ) 
     448            DO_2D( iij-1, iij-1, iij-1, iij-1 ) 
    452449               ! round brackets added to fix the order of floating point operations 
    453450               ! needed to ensure halo 1 - halo 2 compatibility 
     
    464461         !                                !==  add the vertical 33 flux  ==! 
    465462         IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz 
    466             DO_3D( 0, 0, 1, 0, 2, jpkm1 ) 
     463            DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
    467464               ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)   & 
    468465                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )             & 
     
    472469            SELECT CASE( kpass ) 
    473470            CASE(  1  )                            ! 1st pass : eddy coef = ah_wslp2 
    474                DO_3D( 0, 0, 1, 0, 2, jpkm1 ) 
     471               DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
    475472                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)             & 
    476473                     &                            * ah_wslp2(ji,jj,jk) * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 
    477474               END_3D 
    478475            CASE(  2  )                            ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt  and pt2 gradients, resp. 
    479                DO_3D( 0, 0, 1, 0, 2, jpkm1 ) 
     476               DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    480477                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)                      & 
    481478                     &                            * (  ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) )   & 
     
    485482         ENDIF 
    486483         ! 
    487          DO_3D( 0, 0, 0, 0, 1, jpkm1 )      !==  Divergence of vertical fluxes added to pta  ==! 
     484         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 )      !==  Divergence of vertical fluxes added to pta  ==! 
    488485            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)    & 
    489486            &                                  + zsign * (  ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk)  )   & 
Note: See TracChangeset for help on using the changeset viewer.