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 14631 for NEMO – NEMO

Changeset 14631 for NEMO


Ignore:
Timestamp:
2021-03-23T17:55:26+01:00 (3 years ago)
Author:
hadcv
Message:

#2600: Update TRA tiling after [14576] merge (includes tra_ldf_triad changes missing from [14607])

Location:
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynspg_ts.F90

    r14574 r14631  
    730730      IF (ln_bt_fw) THEN 
    731731         IF( .NOT.( kt == nit000 .AND. l_1st_euler ) ) THEN 
    732             DO_2D( 1, 1, 1, 1 ) 
     732            DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
    733733               zun_save = un_adv(ji,jj) 
    734734               zvn_save = vn_adv(ji,jj) 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/LDF/ldfslp.F90

    r14576 r14631  
    558558      CALL lbc_lnk( 'ldfslp', wslp2, 'W', 1.0_wp )      ! lateral boundary confition on wslp2 only   ==>>> gm : necessary ? to be checked 
    559559      ! 
    560       ! [comm_cleanup] - this comm have to be deleted !!!!! 
    561       IF (nn_hls.eq.2) THEN 
    562          CALL lbc_lnk( 'ldfslp', triadi(:,:,:,:,0), 'U', 1.0_wp, triadi(:,:,:,:,1), 'U', 1.0_wp ) 
    563          CALL lbc_lnk( 'ldfslp', triadj(:,:,:,:,0), 'V', 1.0_wp, triadj(:,:,:,:,1), 'V', 1.0_wp ) 
    564          CALL lbc_lnk( 'ldfslp', triadi_g(:,:,:,:,0), 'U', 1.0_wp, triadi_g(:,:,:,:,1), 'U', 1.0_wp ) 
    565          CALL lbc_lnk( 'ldfslp', triadj_g(:,:,:,:,0), 'V', 1.0_wp, triadj_g(:,:,:,:,1), 'V', 1.0_wp ) 
    566       END IF 
    567  
    568560      IF( ln_timing )   CALL timing_stop('ldf_slp_triad') 
    569561      ! 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/LDF/ldftra.F90

    r14576 r14631  
    734734      INTEGER                     , INTENT(in   ) ::   Kmm, Krhs ! ocean time level indices 
    735735      CHARACTER(len=3)            , INTENT(in   ) ::   cdtype    ! =TRA or TRC (tracer indicator) 
    736       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   pu        ! in : 3 ocean transport components   [m3/s] 
    737       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   pv        ! out: 3 ocean transport components   [m3/s] 
    738       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   pw        ! increased by the eiv                [m3/s] 
     736      ! TEMP: [tiling] Can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
     737      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu        ! in : 3 ocean transport components   [m3/s] 
     738      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv        ! out: 3 ocean transport components   [m3/s] 
     739      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw        ! increased by the eiv                [m3/s] 
    739740      !! 
    740741      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
     
    765766      ! 
    766767      ! [comm_cleanup] ! DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    767       DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 
     768      DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 
    768769         pu(ji,jj,jk) = pu(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) ) 
    769770         pv(ji,jj,jk) = pv(ji,jj,jk) - ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) ) 
    770771      END_3D 
    771772      ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    772       DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
     773      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
    773774         pw(ji,jj,jk) = pw(ji,jj,jk) + (  zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj  ,jk)   & 
    774             &                             + zpsi_vw(ji,jj,jk) - zpsi_vw(ji  ,jj-1,jk) ) 
     775            &                           + zpsi_vw(ji,jj,jk) - zpsi_vw(ji  ,jj-1,jk) ) 
    775776      END_3D 
    776777      ! 
     
    791792      !! 
    792793      !!---------------------------------------------------------------------- 
    793       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   psi_uw, psi_vw   ! streamfunction   [m3/s] 
    794       INTEGER                     , INTENT(in   ) ::   Kmm   ! ocean time level indices 
     794      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in) ::   psi_uw, psi_vw   ! streamfunction   [m3/s] 
     795      INTEGER                             , INTENT(in) ::   Kmm              ! ocean time level indices 
    795796      ! 
    796797      INTEGER  ::   ji, jj, jk    ! dummy loop indices 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv.F90

    r14576 r14631  
    9393      ! 
    9494      INTEGER ::   ji, jj, jk   ! dummy loop index 
    95       ! TEMP: [tiling] This change not necessary and can be A2D(nn_hls) if using XIOS (subdomain support) 
     95      ! TEMP: [tiling] This change not necessary and can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    9696      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zuu, zvv, zww   ! 3D workspace 
    9797      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 
    98       ! TEMP: [tiling] This change not necessary after extra haloes development 
     98      ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    9999      LOGICAL :: lskip 
    100100      !!---------------------------------------------------------------------- 
     
    104104      lskip = .FALSE. 
    105105 
    106       ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support) 
     106      ! TEMP: [tiling] These changes not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    107107      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
    108108         ALLOCATE( zuu(jpi,jpj,jpk), zvv(jpi,jpj,jpk), zww(jpi,jpj,jpk) ) 
    109109      ENDIF 
    110110 
    111       ! TEMP: [tiling] These changes not necessary after extra haloes development (lbc_lnk removed from tra_adv_*) and if XIOS has subdomain support (ldf_eiv_dia) 
    112       IF( nadv /= np_CEN .OR. (nadv == np_CEN .AND. nn_cen_h == 4) .OR. ln_ldfeiv_dia )  THEN 
     111      ! TEMP: [tiling] These changes not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
     112      IF( nadv == np_FCT .OR. (nn_hls == 1 .AND. (nadv /= np_CEN .OR. (nadv == np_CEN .AND. nn_cen_h == 4))) )  THEN 
    113113         IF( ln_tile ) THEN 
    114114            IF( ntile == 1 ) THEN 
     
    121121      IF( .NOT. lskip ) THEN 
    122122         !                                         !==  effective transport  ==! 
     123         ! TODO: [tiling] NOT TESTED- requires waves 
    123124         IF( ln_wave .AND. ln_sdw )  THEN 
    124             DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     125            DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    125126               zuu(ji,jj,jk) = e2u  (ji,jj) * e3u(ji,jj,jk,Kmm) * ( uu(ji,jj,jk,Kmm) + usd(ji,jj,jk) ) 
    126127               zvv(ji,jj,jk) = e1v  (ji,jj) * e3v(ji,jj,jk,Kmm) * ( vv(ji,jj,jk,Kmm) + vsd(ji,jj,jk) ) 
     
    128129            END_3D 
    129130         ELSE 
    130             DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     131            DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    131132               zuu(ji,jj,jk) = e2u  (ji,jj) * e3u(ji,jj,jk,Kmm) * uu(ji,jj,jk,Kmm)               ! eulerian transport only 
    132133               zvv(ji,jj,jk) = e1v  (ji,jj) * e3v(ji,jj,jk,Kmm) * vv(ji,jj,jk,Kmm) 
     
    135136         ENDIF 
    136137         ! 
     138         ! TODO: [tiling] NOT TESTED- requires ztilde 
    137139         IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN                                ! add z-tilde and/or vvl corrections 
    138             DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     140            DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
    139141               zuu(ji,jj,jk) = zuu(ji,jj,jk) + un_td(ji,jj,jk) 
    140142               zvv(ji,jj,jk) = zvv(ji,jj,jk) + vn_td(ji,jj,jk) 
     
    142144         ENDIF 
    143145         ! 
    144          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     146         DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 
    145147            zuu(ji,jj,jpk) = 0._wp                                                      ! no transport trough the bottom 
    146148            zvv(ji,jj,jpk) = 0._wp 
     
    148150         END_2D 
    149151         ! 
    150          ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support) 
    151152         IF( ln_ldfeiv .AND. .NOT. ln_traldf_triad )   & 
    152             &              CALL ldf_eiv_trp( kt, nit000, zuu(A2D(nn_hls),:), zvv(A2D(nn_hls),:), zww(A2D(nn_hls),:), & 
    153             &                                'TRA', Kmm, Krhs )   ! add the eiv transport (if necessary) 
    154          ! 
    155          IF( ln_mle    )   CALL tra_mle_trp( kt, nit000, zuu(A2D(nn_hls),:), zvv(A2D(nn_hls),:), zww(A2D(nn_hls),:), & 
    156             &                                'TRA', Kmm       )   ! add the mle transport (if necessary) 
    157          ! 
    158          ! TEMP: [tiling] This change not necessary if using XIOS (subdomain support) 
     153            &              CALL ldf_eiv_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm, Krhs )   ! add the eiv transport (if necessary) 
     154         ! 
     155         IF( ln_mle    )   CALL tra_mle_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm       )   ! add the mle transport (if necessary) 
     156         ! 
     157         ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    159158         IF( .NOT. l_istiled .OR. ntile == nijtile )  THEN                ! Do only on the last tile 
    160159            CALL iom_put( "uocetr_eff", zuu )                                        ! output effective transport 
     
    163162         ENDIF 
    164163         ! 
    165    !!gm ??? 
    166          ! TEMP: [tiling] This change not necessary if using XIOS (subdomain support) 
     164!!gm ??? 
     165         ! TEMP: [tiling] This copy-in not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    167166         CALL dia_ptr( kt, Kmm, zvv(A2D(nn_hls),:) )                                    ! diagnose the effective MSF 
    168    !!gm ??? 
     167!!gm ??? 
    169168         ! 
    170169 
     
    230229         ENDIF 
    231230 
    232          ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_adv_*) and if XIOS has subdomain support (ldf_eiv_dia) 
     231         ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    233232         IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE., cstr='traadv' ) 
    234233      ENDIF 
     
    237236         &                                  tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
    238237 
    239       ! TEMP: [tiling] This change not necessary if using XIOS (subdomain support) 
     238      ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    240239      IF( .NOT. l_istiled .OR. ntile == nijtile )  THEN                ! Do only for the full domain 
    241240         DEALLOCATE( zuu, zvv, zww ) 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_cen.F90

    r14574 r14631  
    7171      INTEGER                                  , INTENT(in   ) ::   kn_cen_h        ! =2/4 (2nd or 4th order scheme) 
    7272      INTEGER                                  , INTENT(in   ) ::   kn_cen_v        ! =2/4 (2nd or 4th order scheme) 
    73       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     73      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    7474      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components 
    7575      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_fct.F90

    r14574 r14631  
    8181      INTEGER                                  , INTENT(in   ) ::   kn_fct_v        ! order of the FCT scheme (=2 or 4) 
    8282      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step 
    83       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     83      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    8484      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components 
    8585      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation 
     
    136136      ! If adaptive vertical advection, check if it is needed on this PE at this time 
    137137      IF( ln_zad_Aimp ) THEN 
    138          IF( MAXVAL( ABS( wi(A2D(nn_hls),:) ) ) > 0._wp ) ll_zAimp = .TRUE. 
     138         IF( MAXVAL( ABS( wi(A2D(1),:) ) ) > 0._wp ) ll_zAimp = .TRUE. 
    139139      END IF 
    140140      ! If active adaptive vertical advection, build tridiagonal matrix 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_mus.F90

    r14574 r14631  
    8181      LOGICAL                                  , INTENT(in   ) ::   ld_msc_ups      ! use upstream scheme within muscl 
    8282      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step 
    83       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     83      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    8484      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components 
    8585      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_qck.F90

    r14574 r14631  
    9191      INTEGER                                  , INTENT(in   ) ::   kjpt            ! number of tracers 
    9292      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step 
    93       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     93      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    9494      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components 
    9595      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation 
     
    129129      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers 
    130130      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step 
    131       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     131      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    132132      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU        ! i-velocity components 
    133133      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation 
     
    149149            zfd(ji,jj,jk) = pt(ji+1,jj,jk,jn,Kbb)        ! Downstream in the x-direction for the tracer 
    150150         END_3D 
    151          IF (nn_hls.EQ.1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp )   ! Lateral boundary conditions 
     151         IF (nn_hls.EQ.1) CALL lbc_lnk( 'traadv_qck', zfd(:,:,:), 'T', 1.0_wp )   ! Lateral boundary conditions 
    152152 
    153153         ! 
     
    214214      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers 
    215215      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step 
    216       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     216      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    217217      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pV        ! j-velocity components 
    218218      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation 
     
    229229         zfd(:,:,:) = 0.0     ;   zwy(:,:,:) = 0.0 
    230230         ! 
    231          DO jk = 1, jpkm1 
    232             ! 
    233             !--- Computation of the ustream and downstream value of the tracer and the mask 
    234             DO_2D( 0, 0, nn_hls-1, nn_hls-1 ) 
    235                ! Upstream in the x-direction for the tracer 
    236                zfc(ji,jj,jk) = pt(ji,jj-1,jk,jn,Kbb) 
    237                ! Downstream in the x-direction for the tracer 
    238                zfd(ji,jj,jk) = pt(ji,jj+1,jk,jn,Kbb) 
    239             END_2D 
    240          END DO 
     231         !--- Computation of the ustream and downstream value of the tracer and the mask 
     232         DO_3D( 0, 0, nn_hls-1, nn_hls-1, 1, jpkm1 ) 
     233            ! Upstream in the x-direction for the tracer 
     234            zfc(ji,jj,jk) = pt(ji,jj-1,jk,jn,Kbb) 
     235            ! Downstream in the x-direction for the tracer 
     236            zfd(ji,jj,jk) = pt(ji,jj+1,jk,jn,Kbb) 
     237         END_3D 
     238 
    241239         IF (nn_hls.EQ.1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp )   ! Lateral boundary conditions 
    242240 
     241         ! Correct zfd on northfold after lbc_lnk; see #2640 
     242         IF( nn_hls == 1 .AND. l_IdoNFold .AND. ntej == Nje0 ) THEN 
     243            DO jk = 1, jpkm1 
     244               WHERE( tmask_i(ntsi:ntei,ntej:jpj) == 0._wp ) zfd(ntsi:ntei,ntej:jpj,jk) = zfc(ntsi:ntei,ntej:jpj,jk) 
     245            END DO 
     246         ENDIF 
    243247         ! 
    244248         ! Horizontal advective fluxes 
     
    306310      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator) 
    307311      INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers 
    308       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     312      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    309313      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pW      ! vertical velocity 
    310314      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation 
     
    365369      !---------------------------------------------------------------------- 
    366370      ! 
    367       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 ) 
     371      DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    368372         zc     = puc(ji,jj,jk)                         ! Courant number 
    369373         zcurv  = pfd(ji,jj,jk) + pfu(ji,jj,jk) - 2. * pfc(ji,jj,jk) 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_ubs.F90

    r14574 r14631  
    9292      INTEGER                                  , INTENT(in   ) ::   kn_ubs_v        ! number of tracers 
    9393      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step 
    94       ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support) 
     94      ! TEMP: [tiling] This can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
    9595      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components 
    9696      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf.F90

    r14576 r14631  
    1717   USE oce            ! ocean dynamics and tracers 
    1818   USE dom_oce        ! ocean space and time domain 
    19    ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*) 
     19   ! TEMP: [tiling] This change not necessary after lbc_lnks removed from tra_ldf_blp and zps_hde* 
    2020   USE domtile 
    2121   USE phycst         ! physical constants 
     
    5858      !! 
    5959      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds 
    60       ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*) 
     60      ! TEMP: [tiling] This change not necessary after lbc_lnks removed from tra_ldf_blp and zps_hde* 
    6161      LOGICAL :: lskip 
    6262      !!---------------------------------------------------------------------- 
     
    7272      ENDIF 
    7373 
    74       ! TEMP: [tiling] These changes not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*) 
    75       IF( nldf_tra == np_blp .OR. nldf_tra == np_blp_i .OR. nldf_tra == np_blp_it )  THEN 
     74      ! TEMP: [tiling] These changes not necessary after lbc_lnks removed from tra_ldf_blp and zps_hde* 
     75      IF( nn_hls == 1 .AND. (nldf_tra == np_blp .OR. nldf_tra == np_blp_i .OR. nldf_tra == np_blp_it) )  THEN 
    7676         IF( ln_tile ) THEN 
    7777            IF( ntile == 1 ) THEN 
     
    105105         ENDIF 
    106106 
    107          ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*) 
     107         ! TEMP: [tiling] This change not necessary after lbc_lnks removed from tra_ldf_blp and zps_hde* 
    108108         IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE., cstr='traldf' ) 
    109109      ENDIF 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf_iso.F90

    r14576 r14631  
    132132      INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices 
    133133      INTEGER  ::  ikt 
    134       INTEGER  ::  ierr             ! local integer 
     134      ! NOTE: [halo1-halo2] 
     135      INTEGER  ::  ierr, iij        ! local integer 
    135136      REAL(wp) ::  zmsku, zahu_w, zabe1, zcof1, zcoef3   ! local scalars 
    136137      REAL(wp) ::  zmskv, zahv_w, zabe2, zcof2, zcoef4   !   -      - 
     
    148149         ! 
    149150         ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpk ) 
    150          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )  
     151         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    151152            akz     (ji,jj,jk) = 0._wp 
    152153            ah_wslp2(ji,jj,jk) = 0._wp 
     
    162163      ENDIF 
    163164      ! 
     165      ! NOTE: [halo1-halo2] 
     166      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 
     167      IF( nldf_tra == np_blp_i .AND. kpass == 1 ) THEN ; iij = nn_hls 
     168      ELSE                                             ; iij = 1 
     169      ENDIF 
     170 
    164171      ! 
    165172      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0) 
     
    174181         ! 
    175182         ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    176          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     183         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    177184            ! 
    178185            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          & 
     
    181188               &                           + vmask(ji,jj-1,jk-1) + vmask(ji,jj  ,jk) , 1._wp  ) 
    182189               ! 
    183             zahu_w = (   pahu(ji  ,jj,jk-1) + pahu(ji-1,jj,jk)    & 
    184                &       + pahu(ji-1,jj,jk-1) + pahu(ji  ,jj,jk)  ) * zmsku 
    185             zahv_w = (   pahv(ji,jj  ,jk-1) + pahv(ji,jj-1,jk)    & 
    186                &       + pahv(ji,jj-1,jk-1) + pahv(ji,jj  ,jk)  ) * zmskv 
     190            ! NOTE: [halo1-halo2] 
     191            ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
     192            zahu_w = (   (pahu(ji  ,jj,jk-1) + pahu(ji-1,jj,jk))    & 
     193               &       + (pahu(ji-1,jj,jk-1) + pahu(ji  ,jj,jk))  ) * zmsku 
     194            zahv_w = (   (pahv(ji,jj  ,jk-1) + pahv(ji,jj-1,jk))    & 
     195               &       + (pahv(ji,jj-1,jk-1) + pahv(ji,jj  ,jk))  ) * zmskv 
    187196               ! 
    188197            ah_wslp2(ji,jj,jk) = zahu_w * wslpi(ji,jj,jk) * wslpi(ji,jj,jk)   & 
     
    192201         IF( ln_traldf_msc ) THEN                ! stabilizing vertical diffusivity coefficient 
    193202            ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    194             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
    195                akz(ji,jj,jk) = 0.25_wp * (                                                                     & 
    196                   &              ( pahu(ji  ,jj,jk) + pahu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )   & 
    197                   &            + ( pahu(ji-1,jj,jk) + pahu(ji-1,jj,jk-1) ) / ( e1u(ji-1,jj) * e1u(ji-1,jj) )   & 
    198                   &            + ( pahv(ji,jj  ,jk) + pahv(ji,jj  ,jk-1) ) / ( e2v(ji,jj  ) * e2v(ji,jj  ) )   & 
    199                   &            + ( pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) )   ) 
     203            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
     204               ! NOTE: [halo1-halo2] 
     205               ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
     206               akz(ji,jj,jk) = 0.25_wp * (                                                                       & 
     207                  &              (( pahu(ji  ,jj,jk) + pahu(ji  ,jj,jk-1) ) / ( e1u(ji  ,jj) * e1u(ji  ,jj) )    & 
     208                  &            + (  pahu(ji-1,jj,jk) + pahu(ji-1,jj,jk-1) ) / ( e1u(ji-1,jj) * e1u(ji-1,jj) ))   & 
     209                  &            + (( pahv(ji,jj  ,jk) + pahv(ji,jj  ,jk-1) ) / ( e2v(ji,jj  ) * e2v(ji,jj  ) )    & 
     210                  &            + (  pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) ))   ) 
    200211            END_3D 
    201212            ! 
    202213            IF( ln_traldf_blp ) THEN                ! bilaplacian operator 
    203214               ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    204                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     215               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    205216                  akz(ji,jj,jk) = 16._wp   & 
    206217                     &   * ah_wslp2   (ji,jj,jk)   & 
     
    211222            ELSEIF( ln_traldf_lap ) THEN              ! laplacian operator 
    212223               ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    213                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     224               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    214225                  ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    215226                  zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  ) 
     
    220231         ELSE                                    ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 
    221232            ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpk ) 
    222             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )  
     233            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    223234               akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 
    224235            END_3D 
     
    233244         !!   I - masked horizontal derivative 
    234245         !!---------------------------------------------------------------------- 
    235 !!gm : bug.... why (x,:,:)?   (1,jpj,:) and (jpi,1,:) should be sufficient.... 
    236          zdit (ntsi-nn_hls,:,:) = 0._wp     ;     zdit (ntei+nn_hls,:,:) = 0._wp 
    237          zdjt (ntsi-nn_hls,:,:) = 0._wp     ;     zdjt (ntei+nn_hls,:,:) = 0._wp 
    238          !!end 
     246         zdit(:,:,:) = 0._wp 
     247         zdjt(:,:,:) = 0._wp 
    239248 
    240249         ! Horizontal tracer gradient 
    241250         ! [comm_cleanup] ! DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    242          DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )  
     251         ! NOTE: [halo1-halo2] 
     252         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) 
    243253            zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
    244254            zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 
     
    246256         IF( ln_zps ) THEN      ! botton and surface ocean correction of the horizontal gradient 
    247257            ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 )           ! bottom correction (partial bottom cell) 
    248                DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )            ! bottom correction (partial bottom cell) 
     258            ! NOTE: [halo1-halo2] 
     259            DO_2D( iij, iij-1, iij, iij-1 )            ! bottom correction (partial bottom cell) 
    249260               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 
    250261               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 
     
    252263            IF( ln_isfcav ) THEN      ! first wet level beneath a cavity 
    253264               ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 ) 
    254                DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     265               ! NOTE: [halo1-halo2] 
     266               DO_2D( iij, iij-1, iij, iij-1 ) 
    255267                  IF( miku(ji,jj) > 1 )   zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 
    256268                  IF( mikv(ji,jj) > 1 )   zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) 
     
    266278            ! 
    267279            ! [comm_cleanup] ! DO_2D( 1, 1, 1, 1 ) 
    268             DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 
     280            ! NOTE: [halo1-halo2] 
     281            DO_2D( iij, iij, iij, iij ) 
    269282               !                             !== Vertical tracer gradient 
    270283               zdk1t(ji,jj) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * wmask(ji,jj,jk+1)     ! level jk+1 
     
    276289            ! 
    277290            ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 )           !==  Horizontal fluxes 
    278             DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )           !==  Horizontal fluxes 
     291            ! NOTE: [halo1-halo2] 
     292            DO_2D( iij, iij-1, iij, iij-1 )           !==  Horizontal fluxes 
    279293               zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) 
    280294               zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) 
     
    289303               zcof2 = - pahv(ji,jj,jk) * e1v(ji,jj) * vslp(ji,jj,jk) * zmskv 
    290304               ! 
    291                zftu(ji,jj,jk ) = (  zabe1 * zdit(ji,jj,jk)   & 
    292                   &               + zcof1 * (  zdkt (ji+1,jj) + zdk1t(ji,jj)      & 
    293                   &                          + zdk1t(ji+1,jj) + zdkt (ji,jj)  )  ) * umask(ji,jj,jk) 
    294                zftv(ji,jj,jk) = (  zabe2 * zdjt(ji,jj,jk)   & 
    295                   &               + zcof2 * (  zdkt (ji,jj+1) + zdk1t(ji,jj)      & 
    296                   &                          + zdk1t(ji,jj+1) + zdkt (ji,jj)  )  ) * vmask(ji,jj,jk) 
     305               ! NOTE: [halo1-halo2] 
     306               ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
     307               zftu(ji,jj,jk) = (  zabe1 * zdit(ji,jj,jk)                          & 
     308                  &              + zcof1 * (  (zdkt (ji+1,jj) + zdk1t(ji,jj))      & 
     309                  &                         + (zdk1t(ji+1,jj) + zdkt (ji,jj))  )  ) * umask(ji,jj,jk) 
     310               zftv(ji,jj,jk) = (  zabe2 * zdjt(ji,jj,jk)                          & 
     311                  &              + zcof2 * (  (zdkt (ji,jj+1) + zdk1t(ji,jj))      & 
     312                  &                         + (zdk1t(ji,jj+1) + zdkt (ji,jj))  )  ) * vmask(ji,jj,jk) 
    297313            END_2D 
    298314            ! 
    299315            ! [comm_cleanup] ! DO_2D( 0, 0, 0, 0 )           !== horizontal divergence and add to pta 
    300             DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )           !== horizontal divergence and add to pta 
     316            ! NOTE: [halo1-halo2] 
     317            DO_2D( iij-1, iij-1, iij-1, iij-1 )           !== horizontal divergence and add to pta 
     318               ! NOTE: [halo1-halo2] 
     319               ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
    301320               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)    & 
    302                   &       + zsign * (  zftu(ji,jj,jk) - zftu(ji-1,jj,jk) + zftv(ji,jj,jk) - zftv(ji,jj-1,jk)  )  & 
    303                   &                                              * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
     321                  &       + zsign * (  (zftu(ji,jj,jk) - zftu(ji-1,jj,jk)) + & 
     322                  &                    (zftv(ji,jj,jk) - zftv(ji,jj-1,jk))  ) * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 
    304323            END_2D 
    305324         END DO                                        !   End of slab 
     
    315334 
    316335         ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 )    ! interior (2=<jk=<jpk-1) 
    317          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )    ! interior (2=<jk=<jpk-1) 
     336         ! NOTE: [halo1-halo2] 
     337         DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 )    ! interior (2=<jk=<jpk-1) 
    318338            ! 
    319339            zmsku = wmask(ji,jj,jk) / MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)          & 
     
    330350            zcoef4 = - zahv_w * e1t(ji,jj) * zmskv * wslpj (ji,jj,jk) 
    331351            ! 
    332             ztfw(ji,jj,jk) = zcoef3 * (   zdit(ji  ,jj  ,jk-1) + zdit(ji-1,jj  ,jk)      & 
    333                &                        + zdit(ji-1,jj  ,jk-1) + zdit(ji  ,jj  ,jk)  )   & 
    334                &           + zcoef4 * (   zdjt(ji  ,jj  ,jk-1) + zdjt(ji  ,jj-1,jk)      & 
    335                &                        + zdjt(ji  ,jj-1,jk-1) + zdjt(ji  ,jj  ,jk)  ) 
     352            ! NOTE: [halo1-halo2] 
     353            ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
     354            ztfw(ji,jj,jk) = zcoef3 * (   (zdit(ji  ,jj  ,jk-1) + zdit(ji-1,jj  ,jk))      & 
     355               &                        + (zdit(ji-1,jj  ,jk-1) + zdit(ji  ,jj  ,jk))  )   & 
     356               &           + zcoef4 * (   (zdjt(ji  ,jj  ,jk-1) + zdjt(ji  ,jj-1,jk))      & 
     357               &                        + (zdjt(ji  ,jj-1,jk-1) + zdjt(ji  ,jj  ,jk))  ) 
    336358         END_3D 
    337359         !                                !==  add the vertical 33 flux  ==! 
    338360         IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz 
    339361            ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    340             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     362            ! NOTE: [halo1-halo2] 
     363            DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
    341364               ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)   & 
    342365                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )               & 
     
    348371            CASE(  1  )                            ! 1st pass : eddy coef = ah_wslp2 
    349372               ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    350                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     373               ! NOTE: [halo1-halo2] 
     374               DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
    351375                  ztfw(ji,jj,jk) =   & 
    352376                     &  ztfw(ji,jj,jk) + ah_wslp2(ji,jj,jk) * e1e2t(ji,jj)   & 
     
    354378               END_3D 
    355379            CASE(  2  )                         ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt  and pt2 gradients, resp. 
    356                ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    357                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     380               ! NOTE: [halo1-halo2] 
     381               DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    358382                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)                  & 
    359383                     &                            * (  ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) )   & 
     
    364388         ! 
    365389         ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpkm1 )    !==  Divergence of vertical fluxes added to pta  ==! 
    366          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )    !==  Divergence of vertical fluxes added to pta  ==!  
     390         ! NOTE: [halo1-halo2] 
     391         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 )    !==  Divergence of vertical fluxes added to pta  ==! 
    367392            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * (  ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1)  ) * r1_e1e2t(ji,jj)   & 
    368393               &                                             / e3t(ji,jj,jk,Kmm) 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf_lap_blp.F90

    r14576 r14631  
    103103      ! 
    104104      INTEGER  ::   ji, jj, jk, jn      ! dummy loop indices 
     105      ! NOTE: [halo1-halo2] 
     106      INTEGER  ::   iij 
    105107      REAL(wp) ::   zsign               ! local scalars 
    106108      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   ztu, ztv, zaheeu, zaheev 
     
    121123      ENDIF 
    122124      ! 
     125      ! NOTE: [halo1-halo2] 
     126      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 
     127      IF( nldf_tra == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls 
     128      ELSE                                           ; iij = 1 
     129      ENDIF 
     130 
    123131      !                                !==  Initialization of metric arrays used for all tracers  ==! 
    124132      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0) 
     
    126134      ENDIF 
    127135 
    128       DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )            !== First derivative (gradient)  ==! 
     136      ! NOTE: [halo1-halo2] 
     137      DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 )            !== First derivative (gradient)  ==! 
    129138         zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm)   !!gm   * umask(ji,jj,jk) pah masked! 
    130139         zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm)   !!gm   * vmask(ji,jj,jk) 
     
    135144         !                          ! =========== ! 
    136145         ! 
    137          DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )            !== First derivative (gradient)  ==! 
     146         ! NOTE: [halo1-halo2] 
     147         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 )            !== First derivative (gradient)  ==! 
    138148            ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) 
    139149            ztv(ji,jj,jk) = zaheev(ji,jj,jk) * ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) 
    140150         END_3D 
    141151         IF( ln_zps ) THEN                             ! set gradient at bottom/top ocean level 
    142             DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )                              ! bottom 
     152            ! NOTE: [halo1-halo2] 
     153            DO_2D( iij, iij-1, iij, iij-1 )                              ! bottom 
    143154               ztu(ji,jj,mbku(ji,jj)) = zaheeu(ji,jj,mbku(ji,jj)) * pgu(ji,jj,jn) 
    144155               ztv(ji,jj,mbkv(ji,jj)) = zaheev(ji,jj,mbkv(ji,jj)) * pgv(ji,jj,jn) 
    145156            END_2D 
    146157            IF( ln_isfcav ) THEN                             ! top in ocean cavities only 
    147                DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
     158               ! NOTE: [halo1-halo2] 
     159               DO_2D( iij, iij-1, iij, iij-1 ) 
    148160                  IF( miku(ji,jj) > 1 )   ztu(ji,jj,miku(ji,jj)) = zaheeu(ji,jj,miku(ji,jj)) * pgui(ji,jj,jn) 
    149161                  IF( mikv(ji,jj) > 1 )   ztv(ji,jj,mikv(ji,jj)) = zaheev(ji,jj,mikv(ji,jj)) * pgvi(ji,jj,jn) 
     
    152164         ENDIF 
    153165         ! 
    154          DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )        !== Second derivative (divergence) added to the general tracer trends  ==! 
    155             pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)     & 
    156                &                                      +    ztv(ji,jj,jk) - ztv(ji,jj-1,jk) )   & 
     166         ! NOTE: [halo1-halo2] 
     167         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 )        !== Second derivative (divergence) added to the general tracer trends  ==! 
     168            ! NOTE: [halo1-halo2] 
     169            ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
     170            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + (  (ztu(ji,jj,jk) - ztu(ji-1,jj,jk))     & 
     171               &                                      +    (ztv(ji,jj,jk) - ztv(ji,jj-1,jk)) )   & 
    157172               &                                      / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 
    158173         END_3D 
     
    229244      END SELECT 
    230245      ! 
    231       ! [comm_cleanup]  
     246      ! [comm_cleanup] 
    232247      IF (nn_hls.EQ.1) CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_wp )     ! Lateral boundary conditions (unchanged sign) 
    233248      !                                               ! Partial top/bottom cell: GRADh( zlap ) 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf_triad.F90

    r14576 r14631  
    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 
     
    111109      INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices 
    112110      INTEGER  ::  ip,jp,kp         ! dummy loop indices 
    113       INTEGER  ::  ierr            ! local integer 
     111      ! NOTE: [halo1-halo2] 
     112      INTEGER  ::  ierr, iij        ! local integer 
    114113      REAL(wp) ::  zmsku, zabe1, zcof1, zcoef3    ! local scalars 
    115114      REAL(wp) ::  zmskv, zabe2, zcof2, zcoef4    !   -      - 
     
    119118      REAL(wp) ::   ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt 
    120119      REAL(wp) ::   zah, zah_slp, zaei_slp 
    121       REAL(wp), DIMENSION(A2D(nn_hls),0:1)     ::   zdkt3d                         ! vertical tracer gradient at 2 levels 
    122       REAL(wp), DIMENSION(A2D(nn_hls)        ) ::   z2d                            ! 2D workspace 
    123       REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk) ::   zdit, zdjt, zftu, zftv, ztfw   ! 3D     - 
    124       ! TEMP: [tiling] This can be A2D(nn_hls) if XIOS has subdomain support 
    125       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zpsi_uw, zpsi_vw 
     120      REAL(wp), DIMENSION(A2D(nn_hls),0:1) ::   zdkt3d                                           ! vertical tracer gradient at 2 levels 
     121      REAL(wp), DIMENSION(A2D(nn_hls)    ) ::   z2d                                              ! 2D workspace 
     122      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdit, zdjt, zpsi_uw, zpsi_vw   ! 3D     - 
     123      ! NOTE: [halo1-halo2] 
     124      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) :: zftu, zftv 
     125      REAL(wp), DIMENSION(A2D(nn_hls),jpk,2,2) :: ztfw 
    126126      !!---------------------------------------------------------------------- 
    127127      ! 
     
    142142      ENDIF 
    143143      ! 
     144      ! NOTE: [halo1-halo2] 
     145      ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 
     146      IF( nldf_tra == np_blp_it .AND. kpass == 1 ) THEN ; iij = nn_hls 
     147      ELSE                                              ; iij = 1 
     148      ENDIF 
     149 
     150      ! 
    144151      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0) 
    145152      ELSE                    ;   zsign = -1._wp 
     
    153160         ! 
    154161         ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpk ) 
    155          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )  
     162         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    156163            akz     (ji,jj,jk) = 0._wp 
    157164            ah_wslp2(ji,jj,jk) = 0._wp 
    158165         END_3D 
     166         ! 
     167         ! NOTE: [halo1-halo2] 
     168         zftu(:,:,:,:) = 0._wp 
     169         zftv(:,:,:,:) = 0._wp 
    159170         ! 
    160171         DO ip = 0, 1                            ! i-k triads 
     
    169180                  zslope2 = zslope_skew + ( gdept(ji-ip+1,jj,jk,Kmm) - gdept(ji-ip,jj,jk,Kmm) ) * r1_e1u(ji-ip,jj) * umask(ji-ip,jj,jk+kp) 
    170181                  zslope2 = zslope2 *zslope2 
    171                   ah_wslp2(ji,jj,jk+kp) = ah_wslp2(ji,jj,jk+kp) + zah * zbu * ze3wr * r1_e1e2t(ji,jj) * zslope2 
    172                   akz     (ji,jj,jk+kp) = akz     (ji,jj,jk+kp) + zah * r1_e1u(ji-ip,jj)       & 
    173                      &                                                      * r1_e1u(ji-ip,jj) * umask(ji-ip,jj,jk+kp) 
     182                  ! NOTE: [halo1-halo2] 
     183                  zftu(ji,jj,jk+kp,ip+1) = zftu(ji,jj,jk+kp,ip+1) + & 
     184                     &                     zah * zbu * ze3wr * r1_e1e2t(ji,jj) * zslope2 
     185                  zftv(ji,jj,jk+kp,ip+1) = zftv(ji,jj,jk+kp,ip+1) + & 
     186                     &                     zah * r1_e1u(ji-ip,jj) * r1_e1u(ji-ip,jj) * umask(ji-ip,jj,jk+kp) 
    174187                     ! 
    175188               END_3D 
    176189            END DO 
    177190         END DO 
     191         ! 
     192         ! NOTE: [halo1-halo2] Use DO_3D instead of DO_3D_OVR 
     193         ! ip loop contributions added here to ensure consistent floating point arithmetic for different nn_hls 
     194         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
     195            ah_wslp2(ji,jj,jk) = ah_wslp2(ji,jj,jk) + (zftu(ji,jj,jk,1) + zftu(ji,jj,jk,2)) 
     196            akz     (ji,jj,jk) = akz     (ji,jj,jk) + (zftv(ji,jj,jk,1) + zftv(ji,jj,jk,2)) 
     197         END_3D 
     198         ! 
     199         ! NOTE: [halo1-halo2] 
     200         zftu(:,:,:,:) = 0._wp 
     201         zftv(:,:,:,:) = 0._wp 
    178202         ! 
    179203         DO jp = 0, 1                            ! j-k triads 
     
    189213                  zslope2 = zslope_skew + ( gdept(ji,jj-jp+1,jk,Kmm) - gdept(ji,jj-jp,jk,Kmm) ) * r1_e2v(ji,jj-jp) * vmask(ji,jj-jp,jk+kp) 
    190214                  zslope2 = zslope2 * zslope2 
    191                   ah_wslp2(ji,jj,jk+kp) = ah_wslp2(ji,jj,jk+kp) + zah * zbv * ze3wr * r1_e1e2t(ji,jj) * zslope2 
    192                   akz     (ji,jj,jk+kp) = akz     (ji,jj,jk+kp) + zah * r1_e2v(ji,jj-jp)     & 
    193                      &                                                      * r1_e2v(ji,jj-jp) * vmask(ji,jj-jp,jk+kp) 
     215                  ! NOTE: [halo1-halo2] 
     216                  zftu(ji,jj,jk+kp,jp+1) = zftu(ji,jj,jk+kp,jp+1) + & 
     217                     &                     zah * zbv * ze3wr * r1_e1e2t(ji,jj) * zslope2 
     218                  zftv(ji,jj,jk+kp,jp+1) = zftv(ji,jj,jk+kp,jp+1) + & 
     219                     &                     zah * r1_e2v(ji,jj-jp) * r1_e2v(ji,jj-jp) * vmask(ji,jj-jp,jk+kp) 
    194220                  ! 
    195221               END_3D 
     
    197223         END DO 
    198224         ! 
     225         ! NOTE: [halo1-halo2] Use DO_3D instead of DO_3D_OVR 
     226         ! jp loop contributions added here to ensure consistent floating point arithmetic for different nn_hls 
     227         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
     228            ah_wslp2(ji,jj,jk) = ah_wslp2(ji,jj,jk) + (zftu(ji,jj,jk,1) + zftu(ji,jj,jk,2)) 
     229            akz     (ji,jj,jk) = akz     (ji,jj,jk) + (zftv(ji,jj,jk,1) + zftv(ji,jj,jk,2)) 
     230         END_3D 
     231         ! 
    199232         IF( ln_traldf_msc ) THEN                ! stabilizing vertical diffusivity coefficient 
    200233            ! 
    201234            IF( ln_traldf_blp ) THEN                ! bilaplacian operator 
    202235               ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    203                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     236               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    204237                  akz(ji,jj,jk) = 16._wp           & 
    205238                     &   * ah_wslp2   (ji,jj,jk)   & 
     
    210243            ELSEIF( ln_traldf_lap ) THEN              ! laplacian operator 
    211244               ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
    212                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
     245               DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 
    213246                  ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 
    214247                  zcoef0 = rDt * (  akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2  ) 
     
    219252         ELSE                                    ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 
    220253            ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpk ) 
    221             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )  
     254            DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 
    222255               akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 
    223256            END_3D 
    224257         ENDIF 
    225258         ! 
    226          ! TEMP: [tiling] These changes not necessary if XIOS has subdomain support 
    227          IF( .NOT. l_istiled .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_stop( ldhold=.TRUE., cstr='traldf_triad' ) 
    230  
    231                zpsi_uw(:,:,:) = 0._wp 
    232                zpsi_vw(:,:,:) = 0._wp 
    233  
    234                DO jp = 0, 1 
    235                   DO kp = 0, 1 
    236                      ! [comm_cleanup] ! DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
    237                      DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )  
    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+jp,jj,jk,1-jp,kp) 
    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+jp,jk,1-jp,kp) 
    242                      END_3D 
    243                   END DO 
     259         IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 
     260            zpsi_uw(:,:,:) = 0._wp 
     261            zpsi_vw(:,:,:) = 0._wp 
     262 
     263            DO jp = 0, 1 
     264               DO kp = 0, 1 
     265                  DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 
     266                     zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp) & 
     267                        & + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+jp,jj,jk,1-jp,kp) 
     268                     zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp) & 
     269                        & + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+jp,jk,1-jp,kp) 
     270                  END_3D 
    244271               END DO 
    245                CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 
    246  
    247                IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE., cstr='traldf_triad' ) 
    248             ENDIF 
     272            END DO 
     273            CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 
    249274         ENDIF 
    250275         ! 
     
    256281         ! Zero fluxes for each tracer 
    257282!!gm  this should probably be done outside the jn loop 
    258          ztfw(:,:,:) = 0._wp 
    259          zftu(:,:,:) = 0._wp 
    260          zftv(:,:,:) = 0._wp 
     283         ! NOTE: [halo1-halo2] 
     284         ztfw(:,:,:,:,:) = 0._wp 
     285         zftu(:,:,:,:) = 0._wp 
     286         zftv(:,:,:,:) = 0._wp 
    261287         ! 
    262288         ! [comm_cleanup] ! DO_3D( 1, 0, 1, 0, 1, jpkm1 )    !==  before lateral T & S gradients at T-level jk  ==! 
    263          DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )  
     289         ! NOTE: [halo1-halo2] 
     290         DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) 
    264291            zdit(ji,jj,jk) = ( pt(ji+1,jj  ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 
    265292            zdjt(ji,jj,jk) = ( pt(ji  ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 
     
    267294         IF( ln_zps .AND. l_grad_zps ) THEN    ! partial steps: correction at top/bottom ocean level 
    268295            ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 )                    ! bottom level 
    269             DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     296            ! NOTE: [halo1-halo2] 
     297            DO_2D( iij, iij-1, iij, iij-1 ) 
    270298               zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 
    271299               zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 
     
    273301            IF( ln_isfcav ) THEN                   ! top level (ocean cavities only) 
    274302               ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 ) 
    275                DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     303               ! NOTE: [halo1-halo2] 
     304               DO_2D( iij, iij-1, iij, iij-1 ) 
    276305                  IF( miku(ji,jj)  > 1 )   zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 
    277306                  IF( mikv(ji,jj)  > 1 )   zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) 
     
    287316            !                    !==  Vertical tracer gradient at level jk and jk+1 
    288317            ! [comm_cleanup] ! DO_2D( 1, 1, 1, 1 ) 
    289             DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )  
     318            ! NOTE: [halo1-halo2] 
     319            DO_2D( iij, iij, iij, iij ) 
    290320               zdkt3d(ji,jj,1) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * tmask(ji,jj,jk+1) 
    291321            END_2D 
     
    295325            ELSE 
    296326               ! [comm_cleanup] ! DO_2D( 1, 1, 1, 1 ) 
    297                DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )  
     327               ! NOTE: [halo1-halo2] 
     328               DO_2D( iij, iij, iij, iij ) 
    298329                  zdkt3d(ji,jj,0) = ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 
    299330               END_2D 
     
    306337                  DO kp = 0, 1 
    307338                     ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 ) 
    308                      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     339                     ! NOTE: [halo1-halo2] 
     340                     DO_2D( iij, iij-1, iij, iij-1 ) 
    309341                        ze1ur = r1_e1u(ji,jj) 
    310342                        zdxt  = zdit(ji,jj,jk) * ze1ur 
     
    319351                        zah_slp  = zah * zslope_iso 
    320352                        IF( ln_ldfeiv )   zaei_slp = aeiu(ji,jj,jk) * zslope_skew 
    321                         zftu(ji   ,jj,jk   ) = zftu(ji   ,jj,jk   ) - ( zah * zdxt + (zah_slp - zaei_slp) * zdzt ) * zbu * ze1ur 
    322                         ztfw(ji+ip,jj,jk+kp) = ztfw(ji+ip,jj,jk+kp) - ( zah_slp + zaei_slp) * zdxt                 * zbu * ze3wr 
     353                        ! NOTE: [halo1-halo2] 
     354                        zftu(ji   ,jj,jk,ip+1  ) = zftu(ji   ,jj,jk,ip+1  ) - & 
     355                           &                       ( zah * zdxt + (zah_slp - zaei_slp) * zdzt ) * zbu * ze1ur 
     356                        ztfw(ji,jj,jk+kp,ip+1,1) = ztfw(ji,jj,jk+kp,ip+1,1) - & 
     357                           &                                      (zah_slp + zaei_slp) * zdxt   * zbu * ze3wr 
    323358                     END_2D 
    324359                  END DO 
     
    328363                  DO kp = 0, 1 
    329364                     ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 ) 
    330                      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     365                     ! NOTE: [halo1-halo2] 
     366                     DO_2D( iij, iij-1, iij, iij-1 ) 
    331367                        ze2vr = r1_e2v(ji,jj) 
    332368                        zdyt  = zdjt(ji,jj,jk) * ze2vr 
     
    340376                        zah_slp = zah * zslope_iso 
    341377                        IF( ln_ldfeiv )   zaei_slp = aeiv(ji,jj,jk) * zslope_skew 
    342                         zftv(ji,jj   ,jk   ) = zftv(ji,jj   ,jk   ) - ( zah * zdyt + (zah_slp - zaei_slp) * zdzt ) * zbv * ze2vr 
    343                         ztfw(ji,jj+jp,jk+kp) = ztfw(ji,jj+jp,jk+kp) - ( zah_slp + zaei_slp ) * zdyt                * zbv * ze3wr 
     378                        ! NOTE: [halo1-halo2] 
     379                        zftv(ji,jj   ,jk,jp+1  ) = zftv(ji,jj   ,jk,jp+1  ) - & 
     380                           &                       ( zah * zdyt + (zah_slp - zaei_slp) * zdzt ) * zbv * ze2vr 
     381                        ztfw(ji,jj,jk+kp,jp+1,2) = ztfw(ji,jj,jk+kp,jp+1,2) - & 
     382                           &                                      (zah_slp + zaei_slp) * zdyt   * zbv * ze3wr 
    344383                     END_2D 
    345384                  END DO 
     
    351390                  DO kp = 0, 1 
    352391                     ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 ) 
    353                      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     392                     ! NOTE: [halo1-halo2] 
     393                     DO_2D( iij, iij-1, iij, iij-1 ) 
    354394                        ze1ur = r1_e1u(ji,jj) 
    355395                        zdxt  = zdit(ji,jj,jk) * ze1ur 
     
    364404                        zah_slp  = zah * zslope_iso 
    365405                        IF( ln_ldfeiv )   zaei_slp = aeiu(ji,jj,jk) * zslope_skew        ! aeit(ji+ip,jj,jk)*zslope_skew 
    366                         zftu(ji   ,jj,jk   ) = zftu(ji   ,jj,jk   ) - ( zah * zdxt + (zah_slp - zaei_slp) * zdzt ) * zbu * ze1ur 
    367                         ztfw(ji+ip,jj,jk+kp) = ztfw(ji+ip,jj,jk+kp) - (zah_slp + zaei_slp) * zdxt * zbu * ze3wr 
     406                        ! NOTE: [halo1-halo2] 
     407                        zftu(ji   ,jj,jk,ip+1  ) = zftu(ji   ,jj,jk,ip+1  ) - & 
     408                           &                       ( zah * zdxt + (zah_slp - zaei_slp) * zdzt ) * zbu * ze1ur 
     409                        ztfw(ji,jj,jk+kp,ip+1,1) = ztfw(ji,jj,jk+kp,ip+1,1) - & 
     410                           &                                      (zah_slp + zaei_slp) * zdxt   * zbu * ze3wr 
    368411                     END_2D 
    369412                  END DO 
     
    373416                  DO kp = 0, 1 
    374417                     ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 ) 
    375                      DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )  
     418                     ! NOTE: [halo1-halo2] 
     419                     DO_2D( iij, iij-1, iij, iij-1 ) 
    376420                        ze2vr = r1_e2v(ji,jj) 
    377421                        zdyt  = zdjt(ji,jj,jk) * ze2vr 
     
    385429                        zah_slp = zah * zslope_iso 
    386430                        IF( ln_ldfeiv )   zaei_slp = aeiv(ji,jj,jk) * zslope_skew        ! aeit(ji,jj+jp,jk)*zslope_skew 
    387                         zftv(ji,jj,jk) = zftv(ji,jj,jk) - ( zah * zdyt + (zah_slp - zaei_slp) * zdzt ) * zbv * ze2vr 
    388                         ztfw(ji,jj+jp,jk+kp) = ztfw(ji,jj+jp,jk+kp) - (zah_slp + zaei_slp) * zdyt * zbv * ze3wr 
     431                        ! NOTE: [halo1-halo2] 
     432                        zftv(ji,jj,jk,   jp+1  ) = zftv(ji,jj,jk,   jp+1  ) - & 
     433                           &                       ( zah * zdyt + (zah_slp - zaei_slp) * zdzt ) * zbv * ze2vr 
     434                        ztfw(ji,jj,jk+kp,jp+1,2) = ztfw(ji,jj,jk+kp,jp+1,2) - & 
     435                           &                                      (zah_slp + zaei_slp) * zdyt   * zbv * ze3wr 
    389436                     END_2D 
    390437                  END DO 
    391438               END DO 
    392439            ENDIF 
     440            ! NOTE: [halo1-halo2] 
     441            ! ip and jp loop contributions added here to ensure consistent floating point arithmetic for different nn_hls 
     442            DO_2D( iij, iij-1, iij, iij-1 ) 
     443               zftu(ji,jj,jk,1) = zftu(ji,jj,jk,1) + zftu(ji,jj,jk,2) 
     444               zftv(ji,jj,jk,1) = zftv(ji,jj,jk,1) + zftv(ji,jj,jk,2) 
     445            END_2D 
     446            DO_2D( iij-1, iij-1, iij-1, iij-1 ) 
     447               ztfw(ji,jj,jk,1,1) = (ztfw(ji,jj,jk,1,1) + ztfw(ji-1,jj,jk,2,1)) + & 
     448                  &                 (ztfw(ji,jj,jk,1,2) + ztfw(ji,jj-1,jk,2,2)) 
     449            END_2D 
    393450            !                             !==  horizontal divergence and add to the general trend  ==! 
    394451            ! [comm_cleanup] ! DO_2D( 0, 0, 0, 0 ) 
    395             DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )  
     452            ! NOTE: [halo1-halo2] 
     453            DO_2D( iij-1, iij-1, iij-1, iij-1 ) 
     454               ! NOTE: [halo1-halo2] 
     455               ! Extra brackets required to ensure consistent floating point arithmetic for different nn_hls for bilaplacian 
    396456               pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)    & 
    397                   &                       + zsign * (  zftu(ji-1,jj  ,jk) - zftu(ji,jj,jk)       & 
    398                   &                                           + zftv(ji,jj-1,jk) - zftv(ji,jj,jk)   )   & 
    399                   &                                        / (  e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm)  ) 
     457                  &                       + zsign * (  (zftu(ji-1,jj,jk,1) - zftu(ji,jj,jk,1))       & 
     458                  &                                  + (zftv(ji,jj-1,jk,1) - zftv(ji,jj,jk,1))   )   & 
     459                  &                               / (  e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm)  ) 
    400460            END_2D 
    401461            ! 
     
    405465         IF( ln_traldf_lap ) THEN               ! laplacian case: eddy coef = ah_wslp2 - akz 
    406466            ! [comm_cleanup] ! DO_3D( 0, 0, 1, 0, 2, jpkm1 ) 
    407             DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
    408                ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)   & 
     467            ! NOTE: [halo1-halo2] 
     468            DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
     469               ztfw(ji,jj,jk,1,1) = ztfw(ji,jj,jk,1,1) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)   & 
    409470                  &                            * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) )             & 
    410471                  &                            * (  pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 
     
    414475            CASE(  1  )                            ! 1st pass : eddy coef = ah_wslp2 
    415476               ! [comm_cleanup] ! DO_3D( 0, 0, 1, 0, 2, jpkm1 ) 
    416                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
    417                   ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)             & 
     477               ! NOTE: [halo1-halo2] 
     478               DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 
     479                  ztfw(ji,jj,jk,1,1) = ztfw(ji,jj,jk,1,1) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)             & 
    418480                     &                            * ah_wslp2(ji,jj,jk) * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 
    419481               END_3D 
    420482            CASE(  2  )                            ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt  and pt2 gradients, resp. 
    421                ! [comm_cleanup] ! DO_3D( 0, 0, 1, 0, 2, jpkm1 ) 
    422                DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )  
    423                   ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)                      & 
     483               ! NOTE: [halo1-halo2] 
     484               DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 
     485                  ztfw(ji,jj,jk,1,1) = ztfw(ji,jj,jk,1,1) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk)                      & 
    424486                     &                            * (  ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) )   & 
    425487                     &                               + akz     (ji,jj,jk) * ( pt2(ji,jj,jk-1,jn) - pt2(ji,jj,jk,jn) )   ) 
     
    429491         ! 
    430492         ! [comm_cleanup] ! DO_3D( 0, 0, 0, 0, 1, jpkm1 )      !==  Divergence of vertical fluxes added to pta  ==! 
    431          DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )  
    432             pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn)    & 
    433             &                                  + zsign * (  ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk)  )   & 
     493         ! NOTE: [halo1-halo2] 
     494         DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 ) 
     495            pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * (  ztfw(ji,jj,jk+1,1,1) - ztfw(ji,jj,jk,1,1)  )   & 
    434496               &                                              / ( e1e2t(ji,jj) * e3t(ji,jj,jk,Kmm) ) 
    435497         END_3D 
     
    439501            ! 
    440502            !                          ! "Poleward" diffusive heat or salt transports (T-S case only) 
    441             IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', zftv(:,:,:)  ) 
     503            ! NOTE: [halo1-halo2] 
     504            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', zftv(:,:,:,1)  ) 
    442505            !                          ! Diffusive heat transports 
    443             IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', zftu(:,:,:), zftv(:,:,:) ) 
     506            ! NOTE: [halo1-halo2] 
     507            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', zftu(:,:,:,1), zftv(:,:,:,1) ) 
    444508            ! 
    445509         ENDIF                                                    !== end pass selection  ==! 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/tramle.F90

    r14607 r14631  
    8787      INTEGER                     , INTENT(in   ) ::   Kmm        ! ocean time level index 
    8888      CHARACTER(len=3)            , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator) 
    89       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   pu         ! in : 3 ocean transport components 
    90       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   pv         ! out: same 3  transport components 
    91       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   pw         !   increased by the MLE induced transport 
     89      ! TEMP: [tiling] Can be A2D(nn_hls) after extra haloes development (lbc_lnk calls removed from tra_adv_*) 
     90      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu         ! in : 3 ocean transport components 
     91      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv         ! out: same 3  transport components 
     92      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw         !   increased by the MLE induced transport 
    9293      ! 
    9394      INTEGER  ::   ji, jj, jk          ! dummy loop indices 
     
    268269      DO jk = 1, ikmax 
    269270         ! [comm_cleanup] ! DO_2D( 1, 0, 1, 0 )                      ! CAUTION pu,pv must be defined at row/column i=1 / j=1 
    270          DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
     271         DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
    271272            pu(ji,jj,jk) = pu(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) ) 
    272273            pv(ji,jj,jk) = pv(ji,jj,jk) + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) ) 
    273274         END_2D 
    274275         ! [comm_cleanup] ! DO_2D( 0, 0, 0, 0 ) 
    275          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     276         DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    276277            pw(ji,jj,jk) = pw(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj,jk)   & 
    277278               &                          + zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj-1,jk) ) * wmask(ji,jj,1) 
     
    282283         ! 
    283284         IF (ln_osm_mle.and.ln_zdfosm) THEN 
    284             ! [comm_cleanup] ! DO_2D( 0, 0, 0, 0 ) 
    285             DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     285            DO_2D( 0, 0, 0, 0 ) 
    286286               zLf_NH(ji,jj) = SQRT( rb_c * hmle(ji,jj) ) * r1_ft(ji,jj)      ! Lf = N H / f 
    287287            END_2D 
    288288         ELSE 
    289             ! [comm_cleanup] ! DO_2D( 0, 0, 0, 0 ) 
    290             DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     289            DO_2D( 0, 0, 0, 0 ) 
    291290               zLf_NH(ji,jj) = SQRT( rb_c * zmld(ji,jj) ) * r1_ft(ji,jj)      ! Lf = N H / f 
    292291            END_2D 
     
    386385         r1_ft(:,:) = 1._wp / SQRT(  ff_t(:,:) * ff_t(:,:) + z1_t2  ) 
    387386         ! 
     387         ! Specifically, dbdx_mle, dbdy_mle and mld_prof need to be defined for nn_hls = 2 
     388         IF( nn_hls == 2 .AND. ln_osm_mle .AND. ln_zdfosm ) THEN 
     389            CALL ctl_stop('nn_hls = 2 cannot be used with ln_mle = ln_osm_mle = ln_zdfosm = T (zdfosm not updated for nn_hls = 2)') 
     390         ENDIF 
    388391      ENDIF 
    389392      ! 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/tranpc.F90

    r14537 r14631  
    1717   USE oce            ! ocean dynamics and active tracers 
    1818   USE dom_oce        ! ocean space and time domain 
    19    ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed) 
    20    USE domtile 
    2119   USE phycst         ! physical constants 
    2220   USE zdf_oce        ! ocean vertical physics 
  • NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/zpshde.F90

    r14574 r14631  
    124124      ! 
    125125      IF( ln_timing )   CALL timing_start( 'zps_hde') 
    126       IF (nn_hls.EQ.2) THEN 
    127          CALL lbc_lnk( 'zpshde', pta, 'T', 1.0_wp) 
    128          IF(PRESENT(prd)) CALL lbc_lnk( 'zpshde', prd, 'T', 1.0_wp) 
    129       END IF 
    130126      ! 
    131127      pgtu(:,:,:) = 0._wp   ;   zti (:,:,:) = 0._wp   ;   zhi (:,:) = 0._wp 
     
    134130      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==! 
    135131         ! 
    136          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )              ! Gradient of density at the last level 
     132         ! NOTE: [tiling] increase lower bounds for tra_ldf_blp* calculation 
     133         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )              ! Gradient of density at the last level 
    137134            iku = mbku(ji,jj)   ;   ikum1 = MAX( iku - 1 , 1 )    ! last and before last ocean level at u- & v-points 
    138135            ikv = mbkv(ji,jj)   ;   ikvm1 = MAX( ikv - 1 , 1 )    ! if level first is a p-step, ik.m1=1 
     
    307304      IF( ln_timing )   CALL timing_start( 'zps_hde_isf') 
    308305      ! 
    309       IF (nn_hls.EQ.2) THEN 
    310          CALL lbc_lnk( 'zpshde', pta, 'T', 1.0_wp) 
    311          IF (PRESENT(prd)) CALL lbc_lnk( 'zpshde', prd, 'T', 1.0_wp) 
    312       END IF 
    313  
    314306      pgtu (:,:,:) = 0._wp   ;   pgtv (:,:,:) =0._wp 
    315307      pgtui(:,:,:) = 0._wp   ;   pgtvi(:,:,:) =0._wp 
     
    319311      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==! 
    320312         ! 
    321          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     313         ! NOTE: [tiling] increase lower bounds for tra_ldf_blp* calculation 
     314         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
    322315 
    323316            iku = mbku(ji,jj); ikum1 = MAX( iku - 1 , 1 )    ! last and before last ocean level at u- & v-points 
     
    408401      ! 
    409402      DO jn = 1, kjpt      !==   Interpolation of tracers at the last ocean level   ==!            ! 
    410          DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     403         ! NOTE: [tiling] increase lower bounds for tra_ldf_blp* calculation 
     404         DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 
    411405            iku = miku(ji,jj); ikup1 = miku(ji,jj) + 1 
    412406            ikv = mikv(ji,jj); ikvp1 = mikv(ji,jj) + 1 
Note: See TracChangeset for help on using the changeset viewer.