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 15574 for NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DYN/dynvor.F90 – NEMO

Ignore:
Timestamp:
2021-12-03T20:32:50+01:00 (3 years ago)
Author:
techene
Message:

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

Location:
NEMO/branches/2021/dev_r14318_RK3_stage1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1

    • Property svn:externals
      •  

        old new  
        99 
        1010# SETTE 
        11 ^/utils/CI/sette@14244        sette 
         11^/utils/CI/sette@HEAD        sette 
         12 
  • NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DYN/dynvor.F90

    r14547 r15574  
    321321      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    322322      REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars 
    323       REAL(wp), DIMENSION(jpi,jpj)     ::   zwx, zwy, zwt   ! 2D workspace 
    324       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwz      ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined 
    325       !!---------------------------------------------------------------------- 
    326       ! 
    327       IF( kt == nit000 ) THEN 
    328          IF(lwp) WRITE(numout,*) 
    329          IF(lwp) WRITE(numout,*) 'dyn:vor_enT : vorticity term: t-point energy conserving scheme' 
    330          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     323      REAL(wp), DIMENSION(A2D(nn_hls))        ::   zwx, zwy, zwt   ! 2D workspace 
     324      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwz             ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined 
     325      !!---------------------------------------------------------------------- 
     326      ! 
     327      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     328         IF( kt == nit000 ) THEN 
     329            IF(lwp) WRITE(numout,*) 
     330            IF(lwp) WRITE(numout,*) 'dyn:vor_enT : vorticity term: t-point energy conserving scheme' 
     331            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     332         ENDIF 
    331333      ENDIF 
    332334      ! 
     
    335337      ! 
    336338      CASE ( np_RVO , np_CRV )                  !* relative vorticity at f-point is used 
    337          ALLOCATE( zwz(jpi,jpj,jpk) ) 
     339         ALLOCATE( zwz(A2D(nn_hls),jpk) ) 
    338340         DO jk = 1, jpkm1                                ! Horizontal slab 
    339             DO_2D( 1, 0, 1, 0 ) 
     341            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    340342               zwz(ji,jj,jk) = (  e2v(ji+1,jj) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
    341343                  &             - e1u(ji,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj) 
    342344            END_2D 
    343345            IF( ln_dynvor_msk ) THEN                     ! mask relative vorticity 
    344                DO_2D( 1, 0, 1, 0 ) 
     346               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    345347                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    346348               END_2D 
    347349            ENDIF 
    348350         END DO 
    349          CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
     351         IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    350352         ! 
    351353      END SELECT 
     
    358360         ! 
    359361         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    360             zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t(:,:,jk,Kmm) 
     362            DO_2D( 0, 1, 0, 1 ) 
     363               zwt(ji,jj) = ff_t(ji,jj) * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 
     364            END_2D 
    361365         CASE ( np_RVO )                           !* relative vorticity 
    362366            DO_2D( 0, 1, 0, 1 ) 
     
    437441      INTEGER  ::   ji, jj, jk           ! dummy loop indices 
    438442      REAL(wp) ::   zx1, zy1, zx2, zy2, ze3f, zmsk   ! local scalars 
    439       REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz   ! 2D workspace 
    440       !!---------------------------------------------------------------------- 
    441       ! 
    442       IF( kt == nit000 ) THEN 
    443          IF(lwp) WRITE(numout,*) 
    444          IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 
    445          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     443      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zwx, zwy, zwz   ! 2D workspace 
     444      !!---------------------------------------------------------------------- 
     445      ! 
     446      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     447         IF( kt == nit000 ) THEN 
     448            IF(lwp) WRITE(numout,*) 
     449            IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 
     450            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     451         ENDIF 
    446452      ENDIF 
    447453      ! 
     
    452458         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    453459         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    454             zwz(:,:) = ff_f(:,:) 
     460            DO_2D( 1, 0, 1, 0 ) 
     461               zwz(ji,jj) = ff_f(ji,jj) 
     462            END_2D 
    455463         CASE ( np_RVO )                           !* relative vorticity 
    456464            DO_2D( 1, 0, 1, 0 ) 
     
    518526#endif 
    519527         !                                   !==  horizontal fluxes  ==! 
    520          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    521          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     528         DO_2D( 1, 1, 1, 1 ) 
     529            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     530            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     531         END_2D 
    522532         ! 
    523533         !                                   !==  compute and add the vorticity term trend  =! 
     
    564574      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    565575      REAL(wp) ::   zuav, zvau, ze3f, zmsk   ! local scalars 
    566       REAL(wp), DIMENSION(jpi,jpj) ::   zwx, zwy, zwz, zww   ! 2D workspace 
    567       !!---------------------------------------------------------------------- 
    568       ! 
    569       IF( kt == nit000 ) THEN 
    570          IF(lwp) WRITE(numout,*) 
    571          IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme' 
    572          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     576      REAL(wp), DIMENSION(A2D(nn_hls)) ::   zwx, zwy, zwz   ! 2D workspace 
     577      !!---------------------------------------------------------------------- 
     578      ! 
     579      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     580         IF( kt == nit000 ) THEN 
     581            IF(lwp) WRITE(numout,*) 
     582            IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme' 
     583            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     584         ENDIF 
    573585      ENDIF 
    574586      !                                                ! =============== 
     
    578590         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    579591         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    580             zwz(:,:) = ff_f(:,:) 
     592            DO_2D( 1, 0, 1, 0 ) 
     593               zwz(ji,jj) = ff_f(ji,jj) 
     594            END_2D 
    581595         CASE ( np_RVO )                           !* relative vorticity 
    582596            DO_2D( 1, 0, 1, 0 ) 
     
    645659#endif 
    646660         !                                   !==  horizontal fluxes  ==! 
    647          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    648          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     661         DO_2D( 1, 1, 1, 1 ) 
     662            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     663            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     664         END_2D 
    649665         ! 
    650666         !                                   !==  compute and add the vorticity term trend  =! 
     
    690706      REAL(wp) ::   zua, zva     ! local scalars 
    691707      REAL(wp) ::   zmsk, ze3f   ! local scalars 
    692       REAL(wp), DIMENSION(jpi,jpj)       ::   zwx , zwy , z1_e3f 
    693       REAL(wp), DIMENSION(jpi,jpj)       ::   ztnw, ztne, ztsw, ztse 
    694       REAL(wp), DIMENSION(jpi,jpj,jpkm1) ::   zwz   ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 
    695       !!---------------------------------------------------------------------- 
    696       ! 
    697       IF( kt == nit000 ) THEN 
    698          IF(lwp) WRITE(numout,*) 
    699          IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
    700          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     708      REAL(wp), DIMENSION(A2D(nn_hls))       ::   z1_e3f 
     709#if defined key_loop_fusion 
     710      REAL(wp) ::   ztne, ztnw, ztnw_ip1, ztse, ztse_jp1, ztsw_jp1, ztsw_ip1 
     711      REAL(wp) ::   zwx, zwx_im1, zwx_jp1, zwx_im1_jp1 
     712      REAL(wp) ::   zwy, zwy_ip1, zwy_jm1, zwy_ip1_jm1 
     713#else 
     714      REAL(wp), DIMENSION(A2D(nn_hls))       ::   zwx , zwy 
     715      REAL(wp), DIMENSION(A2D(nn_hls))       ::   ztnw, ztne, ztsw, ztse 
     716#endif 
     717      REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) ::   zwz   ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 
     718      !!---------------------------------------------------------------------- 
     719      ! 
     720      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     721         IF( kt == nit000 ) THEN 
     722            IF(lwp) WRITE(numout,*) 
     723            IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 
     724            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     725         ENDIF 
    701726      ENDIF 
    702727      ! 
     
    706731         ! 
    707732#if defined key_qco   ||   defined key_linssh 
    708          DO_2D( 1, 0, 1, 0 )                 ! == reciprocal of e3 at F-point (key_qco) 
     733         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )                 ! == reciprocal of e3 at F-point (key_qco) 
    709734            z1_e3f(ji,jj) = 1._wp / e3f_vor(ji,jj,jk) 
    710735         END_2D 
     
    712737         SELECT CASE( nn_e3f_typ )           ! == reciprocal of e3 at F-point 
    713738         CASE ( 0 )                                   ! original formulation  (masked averaging of e3t divided by 4) 
    714             DO_2D( 1, 0, 1, 0 ) 
    715                ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
    716                   &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
    717                   &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
    718                   &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  ) 
     739            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     740               ! round brackets added to fix the order of floating point operations 
     741               ! needed to ensure halo 1 - halo 2 compatibility 
     742               ze3f = (  (e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)    & 
     743                  &    +  e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk))   & 
     744                  &    + (e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)    & 
     745                  &    +  e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk))  ) 
    719746               IF( ze3f /= 0._wp ) THEN   ;   z1_e3f(ji,jj) = 4._wp / ze3f 
    720747               ELSE                       ;   z1_e3f(ji,jj) = 0._wp 
     
    722749            END_2D 
    723750         CASE ( 1 )                                   ! new formulation  (masked averaging of e3t divided by the sum of mask) 
    724             DO_2D( 1, 0, 1, 0 ) 
    725                ze3f = (  e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)   & 
    726                   &    + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)   & 
    727                   &    + e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)   & 
    728                   &    + e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk)  ) 
     751            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     752               ! round brackets added to fix the order of floating point operations 
     753               ! needed to ensure halo 1 - halo 2 compatibility 
     754               ze3f = (  (e3t(ji  ,jj+1,jk,Kmm)*tmask(ji  ,jj+1,jk)    & 
     755                  &    +  e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk))   & 
     756                  &    + (e3t(ji  ,jj  ,jk,Kmm)*tmask(ji  ,jj  ,jk)    & 
     757                  &    +  e3t(ji+1,jj  ,jk,Kmm)*tmask(ji+1,jj  ,jk))  ) 
    729758               zmsk = (                    tmask(ji,jj+1,jk) +                     tmask(ji+1,jj+1,jk)   & 
    730759                  &                      + tmask(ji,jj  ,jk) +                     tmask(ji+1,jj  ,jk)  ) 
     
    739768         ! 
    740769         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    741             DO_2D( 1, 0, 1, 0 ) 
     770            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    742771               zwz(ji,jj,jk) = ff_f(ji,jj) * z1_e3f(ji,jj) 
    743772            END_2D 
    744773         CASE ( np_RVO )                           !* relative vorticity 
    745             DO_2D( 1, 0, 1, 0 ) 
     774            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    746775               zwz(ji,jj,jk) = ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)  & 
    747776                  &            - e1u(ji  ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) * r1_e1e2f(ji,jj)*z1_e3f(ji,jj) 
    748777            END_2D 
    749778            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    750                DO_2D( 1, 0, 1, 0 ) 
     779               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    751780                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    752781               END_2D 
    753782            ENDIF 
    754783         CASE ( np_MET )                           !* metric term 
    755             DO_2D( 1, 0, 1, 0 ) 
     784            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    756785               zwz(ji,jj,jk) = (   ( pv(ji+1,jj,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    757786                  &              - ( pu(ji,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    758787            END_2D 
    759788         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    760             DO_2D( 1, 0, 1, 0 ) 
    761                zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      & 
    762                   &                              - e1u(ji  ,jj+1) * pu(ji,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  )   & 
    763                   &                           * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     789            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     790            ! round brackets added to fix the order of floating point operations 
     791            ! needed to ensure halo 1 - halo 2 compatibility 
     792               zwz(ji,jj,jk) = (  ff_f(ji,jj) + ( ( e2v(ji+1,jj  ) * pv(ji+1,jj,jk) - e2v(ji,jj) * pv(ji,jj,jk)      & 
     793                  &                               )                                                                  & ! bracket for halo 1 - halo 2 compatibility 
     794                  &                             - ( e1u(ji  ,jj+1) * pu(ji,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)      & 
     795                  &                               )                                                                  & ! bracket for halo 1 - halo 2 compatibility 
     796                  &                             ) * r1_e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
    764797            END_2D 
    765798            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    766                DO_2D( 1, 0, 1, 0 ) 
     799               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    767800                  zwz(ji,jj,jk) = ( zwz(ji,jj,jk) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj) 
    768801               END_2D 
    769802            ENDIF 
    770803         CASE ( np_CME )                           !* Coriolis + metric 
    771             DO_2D( 1, 0, 1, 0 ) 
     804            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    772805               zwz(ji,jj,jk) = (   ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    773806                  &                            - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj)   ) * z1_e3f(ji,jj) 
     
    780813      !                                                ! =============== 
    781814      ! 
    782       CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    783       ! 
    784       !                                                ! =============== 
    785       DO jk = 1, jpkm1                                 ! Horizontal slab 
    786          !                                             ! =============== 
    787          ! 
     815      IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
     816      ! 
     817      !                                                ! =============== 
     818      !                                                ! Horizontal slab 
     819      !                                                ! =============== 
     820#if defined key_loop_fusion 
     821      DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 
    788822         !                                   !==  horizontal fluxes  ==! 
    789          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    790          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     823         zwx         = e2u(ji  ,jj  ) * e3u(ji  ,jj  ,jk,Kmm) * pu(ji  ,jj  ,jk) 
     824         zwx_im1     = e2u(ji-1,jj  ) * e3u(ji-1,jj  ,jk,Kmm) * pu(ji-1,jj  ,jk) 
     825         zwx_jp1     = e2u(ji  ,jj+1) * e3u(ji  ,jj+1,jk,Kmm) * pu(ji  ,jj+1,jk) 
     826         zwx_im1_jp1 = e2u(ji-1,jj+1) * e3u(ji-1,jj+1,jk,Kmm) * pu(ji-1,jj+1,jk) 
     827         zwy         = e1v(ji  ,jj  ) * e3v(ji  ,jj  ,jk,Kmm) * pv(ji  ,jj  ,jk) 
     828         zwy_ip1     = e1v(ji+1,jj  ) * e3v(ji+1,jj  ,jk,Kmm) * pv(ji+1,jj  ,jk) 
     829         zwy_jm1     = e1v(ji  ,jj-1) * e3v(ji  ,jj-1,jk,Kmm) * pv(ji  ,jj-1,jk) 
     830         zwy_ip1_jm1 = e1v(ji+1,jj-1) * e3v(ji+1,jj-1,jk,Kmm) * pv(ji+1,jj-1,jk) 
     831         !                                   !==  compute and add the vorticity term trend  =! 
     832         ztne     = zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) 
     833         ztnw     = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj  ,jk) + zwz(ji  ,jj  ,jk) 
     834         ztnw_ip1 = zwz(ji  ,jj-1,jk) + zwz(ji  ,jj  ,jk) + zwz(ji+1,jj  ,jk) 
     835         ztse     = zwz(ji  ,jj  ,jk) + zwz(ji  ,jj-1,jk) + zwz(ji-1,jj-1,jk) 
     836         ztse_jp1 = zwz(ji  ,jj+1,jk) + zwz(ji  ,jj  ,jk) + zwz(ji-1,jj  ,jk) 
     837         ztsw_jp1 = zwz(ji  ,jj  ,jk) + zwz(ji-1,jj  ,jk) + zwz(ji-1,jj+1,jk) 
     838         ztsw_ip1 = zwz(ji+1,jj-1,jk) + zwz(ji  ,jj-1,jk) + zwz(ji  ,jj  ,jk) 
     839         ! 
     840         zua = + r1_12 * r1_e1u(ji,jj) * (  ztne * zwy + ztnw_ip1 * zwy_ip1   & 
     841            &                             + ztse * zwy_jm1 + ztsw_ip1 * zwy_ip1_jm1 ) 
     842         zva = - r1_12 * r1_e2v(ji,jj) * (  ztsw_jp1 * zwx_im1_jp1 + ztse_jp1 * zwx_jp1   & 
     843            &                             + ztnw * zwx_im1 + ztne * zwx ) 
     844         pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 
     845         pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 
     846      END_3D 
     847#else 
     848      DO jk = 1, jpkm1 
     849         ! 
     850         !                                   !==  horizontal fluxes  ==! 
     851         DO_2D( 1, 1, 1, 1 ) 
     852            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     853            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     854         END_2D 
    791855         ! 
    792856         !                                   !==  compute and add the vorticity term trend  =! 
     
    806870            pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 
    807871         END_2D 
    808          !                                             ! =============== 
    809       END DO                                           !   End of slab 
     872      END DO 
     873#endif 
     874         !                                             ! =============== 
     875         !                                             !   End of slab 
    810876      !                                                ! =============== 
    811877   END SUBROUTINE vor_een 
     
    839905      REAL(wp) ::   zua, zva       ! local scalars 
    840906      REAL(wp) ::   zmsk, z1_e3t   ! local scalars 
    841       REAL(wp), DIMENSION(jpi,jpj)       ::   zwx , zwy 
    842       REAL(wp), DIMENSION(jpi,jpj)       ::   ztnw, ztne, ztsw, ztse 
    843       REAL(wp), DIMENSION(jpi,jpj,jpkm1) ::   zwz   ! 3D workspace, avoid lbc_lnk on jpk that is not defined 
    844       !!---------------------------------------------------------------------- 
    845       ! 
    846       IF( kt == nit000 ) THEN 
    847          IF(lwp) WRITE(numout,*) 
    848          IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 
    849          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     907      REAL(wp), DIMENSION(A2D(nn_hls))       ::   zwx , zwy 
     908      REAL(wp), DIMENSION(A2D(nn_hls))       ::   ztnw, ztne, ztsw, ztse 
     909      REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) ::   zwz   ! 3D workspace, avoid lbc_lnk on jpk that is not defined 
     910      !!---------------------------------------------------------------------- 
     911      ! 
     912      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile 
     913         IF( kt == nit000 ) THEN 
     914            IF(lwp) WRITE(numout,*) 
     915            IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 
     916            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
     917         ENDIF 
    850918      ENDIF 
    851919      ! 
     
    857925         SELECT CASE( kvor )                 !==  vorticity considered  ==! 
    858926         CASE ( np_COR )                           !* Coriolis (planetary vorticity) 
    859             DO_2D( 1, 0, 1, 0 ) 
     927            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    860928               zwz(ji,jj,jk) = ff_f(ji,jj) 
    861929            END_2D 
    862930         CASE ( np_RVO )                           !* relative vorticity 
    863             DO_2D( 1, 0, 1, 0 ) 
    864                zwz(ji,jj,jk) = (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    & 
    865                   &             - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) & 
     931            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     932               ! round brackets added to fix the order of floating point operations 
     933               ! needed to ensure halo 1 - halo 2 compatibility 
     934               zwz(ji,jj,jk) = (  (e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk))    & 
     935                  &             - (e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk))  ) & 
    866936                  &          * r1_e1e2f(ji,jj) 
    867937            END_2D 
    868938            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    869                DO_2D( 1, 0, 1, 0 ) 
     939               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    870940                  zwz(ji,jj,jk) = zwz(ji,jj,jk) * fmask(ji,jj,jk) 
    871941               END_2D 
    872942            ENDIF 
    873943         CASE ( np_MET )                           !* metric term 
    874             DO_2D( 1, 0, 1, 0 ) 
     944            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    875945               zwz(ji,jj,jk) = ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    876946                  &          - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
    877947            END_2D 
    878948         CASE ( np_CRV )                           !* Coriolis + relative vorticity 
    879             DO_2D( 1, 0, 1, 0 ) 
    880                zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk)    & 
    881                   &                              - e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk)  ) & 
    882                   &                         * r1_e1e2f(ji,jj)    ) 
     949            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
     950               ! round brackets added to fix the order of floating point operations 
     951               ! needed to ensure halo 1 - halo 2 compatibility 
     952               zwz(ji,jj,jk) = (  ff_f(ji,jj) + (  (e2v(ji+1,jj  ) * pv(ji+1,jj  ,jk) - e2v(ji,jj) * pv(ji,jj,jk))    & 
     953                  &                              - (e1u(ji  ,jj+1) * pu(ji  ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk))  ) & 
     954                  &                           * r1_e1e2f(ji,jj)    ) 
    883955            END_2D 
    884956            IF( ln_dynvor_msk ) THEN                     ! mask the relative vorticity 
    885                DO_2D( 1, 0, 1, 0 ) 
     957               DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    886958                  zwz(ji,jj,jk) = ( zwz(ji,jj,jk) - ff_f(ji,jj) ) * fmask(ji,jj,jk) + ff_f(ji,jj) 
    887959               END_2D 
    888960            ENDIF 
    889961         CASE ( np_CME )                           !* Coriolis + metric 
    890             DO_2D( 1, 0, 1, 0 ) 
     962            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 
    891963               zwz(ji,jj,jk) = ff_f(ji,jj) + ( pv(ji+1,jj  ,jk) + pv(ji,jj,jk) ) * di_e2v_2e1e2f(ji,jj)   & 
    892964                  &                        - ( pu(ji  ,jj+1,jk) + pu(ji,jj,jk) ) * dj_e1u_2e1e2f(ji,jj) 
     
    900972      !                                                ! =============== 
    901973      ! 
    902       CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
     974      IF (nn_hls==1) CALL lbc_lnk( 'dynvor', zwz, 'F', 1.0_wp ) 
    903975      ! 
    904976      !                                                ! =============== 
     
    907979         ! 
    908980         !                                   !==  horizontal fluxes  ==! 
    909          zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 
    910          zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 
     981         DO_2D( 1, 1, 1, 1 ) 
     982            zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 
     983            zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 
     984         END_2D 
    911985         ! 
    912986         !                                   !==  compute and add the vorticity term trend  =! 
     
    10211095               dj_e1v_2(ji,jj) = ( e1v(ji,jj) - e1v(ji  ,jj-1) ) * 0.5_wp 
    10221096            END_2D 
    1023             CALL lbc_lnk_multi( 'dynvor', di_e2u_2, 'T', -1.0_wp , dj_e1v_2, 'T', -1.0_wp )   ! Lateral boundary conditions 
     1097            CALL lbc_lnk( 'dynvor', di_e2u_2, 'T', -1.0_wp , dj_e1v_2, 'T', -1.0_wp )   ! Lateral boundary conditions 
    10241098            ! 
    10251099         CASE DEFAULT                        !* F-point metric term :   pre-compute di(e2u)/(2*e1e2f) and dj(e1v)/(2*e1e2f) 
     
    10291103               dj_e1u_2e1e2f(ji,jj) = ( e1u(ji  ,jj+1) - e1u(ji,jj) )  * 0.5 * r1_e1e2f(ji,jj) 
    10301104            END_2D 
    1031             CALL lbc_lnk_multi( 'dynvor', di_e2v_2e1e2f, 'F', -1.0_wp , dj_e1u_2e1e2f, 'F', -1.0_wp )   ! Lateral boundary conditions 
     1105            CALL lbc_lnk( 'dynvor', di_e2v_2e1e2f, 'F', -1.0_wp , dj_e1u_2e1e2f, 'F', -1.0_wp )   ! Lateral boundary conditions 
    10321106         END SELECT 
    10331107         ! 
Note: See TracChangeset for help on using the changeset viewer.