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 15440 for NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/OCE/BDY/bdyini.F90 – NEMO

Ignore:
Timestamp:
2021-10-23T12:18:24+02:00 (3 years ago)
Author:
cetlod
Message:

dev_PISCO : merge with trunk@15439

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14383_PISCES_NEWDEV_PISCO/src/OCE/BDY/bdyini.F90

    r15349 r15440  
    146146      INTEGER  ::   ib_bdy, ii, ij, igrd, ib, ir, iseg     ! dummy loop indices 
    147147      INTEGER  ::   icount, icountr, icountr0, ibr_max     ! local integers 
    148       INTEGER  ::   ilen1                                  !   -       - 
     148      INTEGER  ::   ilen1                           !   -       - 
     149      INTEGER  ::   iiRst, iiRnd, iiSst, iiSnd, iiSstdiag, iiSnddiag, iiSstsono, iiSndsono 
     150      INTEGER  ::   ijRst, ijRnd, ijSst, ijSnd, ijSstdiag, ijSnddiag, ijSstsono, ijSndsono 
     151      INTEGER  ::   iiout, ijout, iioutdir, ijoutdir, icnt 
     152      INTEGER  ::   iRnei, iRdiag, iRsono 
     153      INTEGER  ::   iSnei, iSdiag, iSsono                  !   -       - 
    149154      INTEGER  ::   iwe, ies, iso, ino, inum, id_dummy     !   -       - 
    150155      INTEGER  ::   jpbdta                                 !   -       - 
     
    163168      REAL(wp)             , DIMENSION(jpi,jpj) ::   zfmask   ! temporary fmask array excluding coastal boundary condition (shlat) 
    164169      REAL(wp)             , DIMENSION(jpi,jpj) ::   ztmask, zumask, zvmask  ! temporary u/v mask array 
     170      REAL(wp)             , DIMENSION(jpi,jpj) ::   zzbdy 
    165171      !!---------------------------------------------------------------------- 
    166172      ! 
     
    562568      ! Initialize array indicating communications in bdy 
    563569      ! ------------------------------------------------- 
    564       ALLOCATE( lsend_bdy(nb_bdy,jpbgrd,4,0:1), lrecv_bdy(nb_bdy,jpbgrd,4,0:1) ) 
    565       lsend_bdy(:,:,:,:) = .false. 
    566       lrecv_bdy(:,:,:,:) = .false.  
     570      ALLOCATE( lsend_bdyolr(nb_bdy,jpbgrd,8,0:1), lrecv_bdyolr(nb_bdy,jpbgrd,8,0:1) ) 
     571      lsend_bdyolr(:,:,:,:) = .false. 
     572      lrecv_bdyolr(:,:,:,:) = .false.  
    567573 
    568574      DO ib_bdy = 1, nb_bdy 
     
    576582               ! 
    577583               ! check if point has to be sent     to   a neighbour 
    578                ! W neighbour and on the inner left  side 
    579                IF( ii >= Nis0 .AND. ii < Nis0 + nn_hls .AND. mpiSnei(nn_hls,jpwe) > -1 )   lsend_bdy(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    580                ! E neighbour and on the inner right side 
    581                IF( ii <= Nie0 .AND. ii > Nie0 - nn_hls .AND. mpiSnei(nn_hls,jpea) > -1 )   lsend_bdy(ib_bdy,igrd,jpea,ir) = .TRUE. 
    582                ! S neighbour and on the inner down side 
    583                IF( ij >= Njs0 .AND. ij < Njs0 + nn_hls .AND. mpiSnei(nn_hls,jpso) > -1 )   lsend_bdy(ib_bdy,igrd,jpso,ir) = .TRUE. 
    584                ! N neighbour and on the inner up   side 
    585                IF( ij <= Nje0 .AND. ij > Nje0 - nn_hls .AND. mpiSnei(nn_hls,jpno) > -1 )   lsend_bdy(ib_bdy,igrd,jpno,ir) = .TRUE. 
     584               IF( ii >= Nis0 .AND. ii < Nis0 + nn_hls .AND. ij >= Njs0 .AND. ij <= Nje0         ) THEN   ! we inner side 
     585                  IF( mpiSnei(nn_hls,jpwe) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpwe,ir) = .TRUE. 
     586               ENDIF 
     587               IF( ii <= Nie0 .AND. ii > Nie0 - nn_hls .AND. ij >= Njs0 .AND. ij <= Nje0         ) THEN   ! ea inner side 
     588                  IF( mpiSnei(nn_hls,jpea) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpea,ir) = .TRUE. 
     589               ENDIF 
     590               IF( ii >= Nis0 .AND. ii <= Nie0         .AND. ij >= Njs0 .AND. ij < Njs0 + nn_hls ) THEN   ! so inner side 
     591                  IF( mpiSnei(nn_hls,jpso) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpso,ir) = .TRUE. 
     592               ENDIF 
     593               IF( ii  < Nis0                          .AND. ij >= Njs0 .AND. ij < Njs0 + nn_hls ) THEN   ! so side we-halo 
     594                  IF( mpiSnei(nn_hls,jpso) > -1 .AND. nn_comm == 1 )   lsend_bdyolr(ib_bdy,igrd,jpso,ir) = .TRUE. 
     595               ENDIF 
     596               IF( ii  > Nie0                          .AND. ij >= Njs0 .AND. ij < Njs0 + nn_hls ) THEN   ! so side ea-halo  
     597                  IF( mpiSnei(nn_hls,jpso) > -1 .AND. nn_comm == 1 )   lsend_bdyolr(ib_bdy,igrd,jpso,ir) = .TRUE. 
     598               ENDIF 
     599               IF( ii >= Nis0 .AND. ii <= Nie0         .AND. ij <= Nje0 .AND. ij > Nje0 - nn_hls ) THEN   ! no inner side 
     600                  IF( mpiSnei(nn_hls,jpno) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpno,ir) = .TRUE. 
     601               ENDIF 
     602               IF( ii  < Nis0                          .AND. ij <= Nje0 .AND. ij > Nje0 - nn_hls ) THEN   ! no side we-halo 
     603                  IF( mpiSnei(nn_hls,jpno) > -1 .AND. nn_comm == 1 )   lsend_bdyolr(ib_bdy,igrd,jpno,ir) = .TRUE. 
     604               ENDIF 
     605               IF( ii  > Nie0                          .AND. ij <= Nje0 .AND. ij > Nje0 - nn_hls ) THEN   ! no side ea-halo 
     606                  IF( mpiSnei(nn_hls,jpno) > -1 .AND. nn_comm == 1 )   lsend_bdyolr(ib_bdy,igrd,jpno,ir) = .TRUE. 
     607               ENDIF 
     608               IF( ii >= Nis0 .AND. ii < Nis0 + nn_hls .AND. ij >= Njs0 .AND. ij < Njs0 + nn_hls ) THEN   ! sw inner corner 
     609                  IF( mpiSnei(nn_hls,jpsw) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpsw,ir) = .TRUE. 
     610               ENDIF 
     611               IF( ii <= Nie0 .AND. ii > Nie0 - nn_hls .AND. ij >= Njs0 .AND. ij < Njs0 + nn_hls ) THEN   ! se inner corner 
     612                  IF( mpiSnei(nn_hls,jpse) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpse,ir) = .TRUE. 
     613               ENDIF 
     614               IF( ii >= Nis0 .AND. ii < Nis0 + nn_hls .AND. ij <= Nje0 .AND. ij > Nje0 - nn_hls ) THEN   ! nw inner corner 
     615                  IF( mpiSnei(nn_hls,jpnw) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpnw,ir) = .TRUE. 
     616               ENDIF 
     617               IF( ii <= Nie0 .AND. ii > Nie0 - nn_hls .AND. ij <= Nje0 .AND. ij > Nje0 - nn_hls ) THEN   ! ne inner corner 
     618                  IF( mpiSnei(nn_hls,jpne) > -1                    )   lsend_bdyolr(ib_bdy,igrd,jpne,ir) = .TRUE. 
     619               ENDIF 
    586620               ! 
    587621               ! check if point has to be received from a neighbour 
    588                ! W neighbour and on the outter left  side 
    589                IF( ii  < Nis0                          .AND. mpiRnei(nn_hls,jpwe) > -1 )   lrecv_bdy(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    590                ! E neighbour and on the outter right side 
    591                IF( ii  > Nie0                          .AND. mpiRnei(nn_hls,jpea) > -1 )   lrecv_bdy(ib_bdy,igrd,jpea,ir) = .TRUE. 
    592                ! S neighbour and on the outter down side 
    593                IF( ij  < Njs0                          .AND. mpiRnei(nn_hls,jpso) > -1 )   lrecv_bdy(ib_bdy,igrd,jpso,ir) = .TRUE. 
    594                ! N neighbour and on the outter up   side 
    595                IF( ij  > Nje0                          .AND. mpiRnei(nn_hls,jpno) > -1 )   lrecv_bdy(ib_bdy,igrd,jpno,ir) = .TRUE. 
     622               IF( ii  < Nis0                  .AND. ij >= Njs0 .AND. ij <= Nje0 ) THEN   ! we side 
     623                  IF( mpiRnei(nn_hls,jpwe) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpwe,ir) = .TRUE. 
     624               ENDIF 
     625               IF( ii  > Nie0                  .AND. ij >= Njs0 .AND. ij <= Nje0 ) THEN   ! ea side 
     626                  IF( mpiRnei(nn_hls,jpea) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpea,ir) = .TRUE. 
     627               ENDIF 
     628               IF( ii >= Nis0 .AND. ii <= Nie0 .AND. ij  < Njs0                  ) THEN   ! so side 
     629                  IF( mpiRnei(nn_hls,jpso) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpso,ir) = .TRUE. 
     630               ENDIF 
     631               IF( ii >= Nis0 .AND. ii <= Nie0 .AND. ij  > Nje0                  ) THEN   ! no side 
     632                  IF( mpiRnei(nn_hls,jpno) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpno,ir) = .TRUE. 
     633               ENDIF 
     634               IF( ii  < Nis0                  .AND. ij  < Njs0                  ) THEN   ! sw corner 
     635                  IF( mpiRnei(nn_hls,jpsw) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpsw,ir) = .TRUE. 
     636                  IF( mpiRnei(nn_hls,jpso) > -1 .AND. nn_comm == 1 )   lrecv_bdyolr(ib_bdy,igrd,jpso,ir) = .TRUE. 
     637               ENDIF 
     638               IF( ii  > Nie0                  .AND. ij  < Njs0                  ) THEN   ! se corner 
     639                  IF( mpiRnei(nn_hls,jpse) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpse,ir) = .TRUE. 
     640                  IF( mpiRnei(nn_hls,jpso) > -1 .AND. nn_comm == 1 )   lrecv_bdyolr(ib_bdy,igrd,jpso,ir) = .TRUE. 
     641               ENDIF 
     642               IF( ii  < Nis0                  .AND. ij  > Nje0                  ) THEN   ! nw corner 
     643                  IF( mpiRnei(nn_hls,jpnw) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpnw,ir) = .TRUE. 
     644                  IF( mpiRnei(nn_hls,jpno) > -1 .AND. nn_comm == 1 )   lrecv_bdyolr(ib_bdy,igrd,jpno,ir) = .TRUE. 
     645               ENDIF 
     646               IF( ii  > Nie0                  .AND. ij  > Nje0                  ) THEN   ! ne corner 
     647                  IF( mpiRnei(nn_hls,jpne) > -1                    )   lrecv_bdyolr(ib_bdy,igrd,jpne,ir) = .TRUE. 
     648                  IF( mpiRnei(nn_hls,jpno) > -1 .AND. nn_comm == 1 )   lrecv_bdyolr(ib_bdy,igrd,jpno,ir) = .TRUE. 
     649               ENDIF 
    596650               ! 
    597651            END DO 
    598          END DO  ! igrd 
    599  
     652         END DO   !   igrd 
     653          
     654         ! Comment out for debug 
     655!!$         DO ir = 0,1 
     656!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'T', 1._wp, kfillmode = jpfillnothing,   & 
     657!!$               &                              lsend = lsend_bdyolr(ib_bdy,1,:,ir), lrecv = lrecv_bdyolr(ib_bdy,1,:,ir) ) 
     658!!$            IF(lwp) WRITE(numout,*) ' seb bdy debug olr T', ir ; CALL FLUSH(numout) 
     659!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'U', 1._wp, kfillmode = jpfillnothing,   & 
     660!!$               &                              lsend = lsend_bdyolr(ib_bdy,2,:,ir), lrecv = lrecv_bdyolr(ib_bdy,2,:,ir) ) 
     661!!$            IF(lwp) WRITE(numout,*) ' seb bdy debug olr U', ir ; CALL FLUSH(numout) 
     662!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'V', 1._wp, kfillmode = jpfillnothing,   & 
     663!!$               &                              lsend = lsend_bdyolr(ib_bdy,3,:,ir), lrecv = lrecv_bdyolr(ib_bdy,3,:,ir) )     
     664!!$            IF(lwp) WRITE(numout,*) ' seb bdy debug olr V', ir ; CALL FLUSH(numout) 
     665!!$         END DO 
     666          
    600667         ! Compute rim weights for FRS scheme 
    601668         ! ---------------------------------- 
     
    709776      ! 
    710777      ! Check which boundaries might need communication 
    711       ALLOCATE( lsend_bdyint(nb_bdy,jpbgrd,4,0:1), lrecv_bdyint(nb_bdy,jpbgrd,4,0:1) ) 
     778      ALLOCATE( lsend_bdyint(nb_bdy,jpbgrd,8,0:1), lrecv_bdyint(nb_bdy,jpbgrd,8,0:1) ) 
    712779      lsend_bdyint(:,:,:,:) = .false. 
    713780      lrecv_bdyint(:,:,:,:) = .false.  
    714       ALLOCATE( lsend_bdyext(nb_bdy,jpbgrd,4,0:1), lrecv_bdyext(nb_bdy,jpbgrd,4,0:1) ) 
     781      ALLOCATE( lsend_bdyext(nb_bdy,jpbgrd,8,0:1), lrecv_bdyext(nb_bdy,jpbgrd,8,0:1) ) 
    715782      lsend_bdyext(:,:,:,:) = .false. 
    716783      lrecv_bdyext(:,:,:,:) = .false. 
    717784      ! 
    718       DO igrd = 1, jpbgrd 
    719          DO ib_bdy = 1, nb_bdy 
     785      DO ib_bdy = 1, nb_bdy 
     786         DO igrd = 1, jpbgrd 
    720787            DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 
    721788               IF( idx_bdy(ib_bdy)%ntreat(ib,igrd) == -1 ) CYCLE 
     
    731798               CALL find_neib( ii, ij, idx_bdy(ib_bdy)%ntreat(ib,igrd), ii1, ij1, ii2, ij2, ii3, ij3 )   ! free ocean neighbours 
    732799               ! 
    733                ! search neighbour in the  west/east  direction 
     800               !  take care of the 4 sides 
    734801               ! 
    735                ! Rim is on the halo and computed ocean is towards exterior of mpi domain : 
    736                !      <--    (o exterior)     -->   
    737                ! (1)  o|x         OR    (2)   x|o 
    738                !       |___                 ___| 
    739                ! ==> cannot compute the point x -> need to receive it 
    740                IF( iibi==0     .OR. ii1==0     .OR. ii2==0     .OR. ii3==0     )   lrecv_bdyint(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    741                IF( iibe==0                                                     )   lrecv_bdyext(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    742                IF( iibi==jpi+1 .OR. ii1==jpi+1 .OR. ii2==jpi+1 .OR. ii3==jpi+1 )   lrecv_bdyint(ib_bdy,igrd,jpea,ir) = .TRUE.   
    743                IF( iibe==jpi+1                                                 )   lrecv_bdyext(ib_bdy,igrd,jpea,ir) = .TRUE.   
    744                ! Check if neighbour has its rim parallel to its mpi subdomain border and located next to its halo. 
    745                ! :¨¨¨¨¨|¨¨-->    |                                             |    <--¨¨|¨¨¨¨¨:  
    746                ! :     |  x:o    |    neighbour limited by ... would need o    |    o:x  |     : 
    747                ! :.....|_._:_____|   (1) W neighbour         E neighbour (2)   |_____:_._|.....: 
    748                ! ==> the neighbour cannot compute the point x -> need to send it 
    749                IF( ii ==     2*nn_hls   .AND. mpiSnei(nn_hls,jpwe) > -1 ) THEN   ! 2*nn_hls      -> ji=jpi of western neighbour 
    750                   IF( iibi==ii+1 .OR. ii1==ii+1 .OR. ii2==ii+1 .OR. ii3==ii+1 )   lsend_bdyint(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    751                   IF( iibe==ii+1                                              )   lsend_bdyext(ib_bdy,igrd,jpwe,ir) = .TRUE. 
    752                ENDIF 
    753                IF( ii == jpi-2*nn_hls+1 .AND. mpiSnei(nn_hls,jpea) > -1 ) THEN   ! jpi-2*nn_hls+1-> ji=1   of eastern neighbour 
    754                   IF( iibi==ii-1 .OR. ii1==ii-1 .OR. ii2==ii-1 .OR. ii3==ii-1 )   lsend_bdyint(ib_bdy,igrd,jpea,ir) = .TRUE. 
    755                   IF( iibe==ii-1                                              )   lsend_bdyext(ib_bdy,igrd,jpea,ir) = .TRUE. 
    756                ENDIF 
     802               DO icnt = 1, 4 
     803                  SELECT CASE( icnt ) 
     804                     !                                           ... _____ 
     805                  CASE( 1 )   ! x: rim on rcvwe/sndea-side         o|  : 
     806                     !          o: potential neighbour(s)          o|x : 
     807                     !             outside of the MPI domain     ..o|__:__ 
     808                     iRnei    = jpwe             ;   iSnei    = jpea 
     809                     iiRst    = 1                ;   ijRst    = Njs0            ! Rcv we-side starting point, excluding sw-corner 
     810                     iiRnd    = nn_hls           ;   ijRnd    = Nje0            ! Rcv we-side   ending point, excluding nw-corner 
     811                     iiSst    = Nie0-nn_hls+1    ;   ijSst    = Njs0            ! Snd ea-side starting point, excluding se-corner 
     812                     iiSnd    = Nie0             ;   ijSnd    = Nje0            ! Snd ea-side   ending point, excluding ne-corner 
     813                     iioutdir = -1               ;   ijoutdir = -999            ! outside MPI domain: westward 
     814                     !                                           ______.... 
     815                  CASE( 2 )   ! x: rim on rcvea/sndwe-side          :  |o 
     816                     !          o: potential neighbour(s)           : x|o 
     817                     !             outside of the MPI domain     ___:__|o.. 
     818                     iRnei    = jpea             ;   iSnei    = jpwe 
     819                     iiRst    = Nie0+1           ;   ijRst    =  Njs0            ! Rcv ea-side starting point, excluding se-corner 
     820                     iiRnd    = jpi              ;   ijRnd    =  Nje0            ! Rcv ea-side   ending point, excluding ne-corner 
     821                     iiSst    = Nis0             ;   ijSst    =  Njs0            ! Snd we-side starting point, excluding sw-corner 
     822                     iiSnd    = Nis0+nn_hls-1    ;   ijSnd    =  Nje0            ! Snd we-side   ending point, excluding nw-corner 
     823                     iioutdir = 1                ;   ijoutdir = -999             ! outside MPI domain: eastward 
     824                     ! 
     825                  CASE( 3 )   ! x: rim on rcvso/sndno-side       |       | 
     826                     !          o: potential neighbour(s)        |¨¨¨¨¨¨¨| 
     827                     !             outside of the MPI domain     |___x___| 
     828                     !                                           : o o o : 
     829                     !                                           :       : 
     830                     iRnei    = jpso             ;   iSnei    = jpno 
     831                     iiRst    = Nis0             ;   ijRst    = 1                ! Rcv so-side starting point, excluding sw-corner 
     832                     iiRnd    = Nie0             ;   ijRnd    = nn_hls           ! Rcv so-side   ending point, excluding se-corner 
     833                     iiSst    = Nis0             ;   ijSst    = Nje0-nn_hls+1    ! Snd no-side starting point, excluding nw-corner 
     834                     iiSnd    = Nie0             ;   ijSnd    = Nje0             ! Snd no-side   ending point, excluding ne-corner 
     835                     iioutdir = -999             ;   ijoutdir = -1               ! outside MPI domain: southward 
     836                     !                                           :       : 
     837                  CASE( 4 )   ! x: rim on rcvno/sndso-side       :_o_o_o_: 
     838                     !          o: potential neighbour(s)        |   x   | 
     839                     !             outside of the MPI domain     |       | 
     840                     !                                           |¨¨¨¨¨¨¨| 
     841                     iRnei    = jpno             ;   iSnei    = jpso 
     842                     iiRst    = Nis0             ;   ijRst    = Nje0+1           ! Rcv no-side starting point, excluding nw-corner 
     843                     iiRnd    = Nie0             ;   ijRnd    = jpj              ! Rcv no-side   ending point, excluding ne-corner 
     844                     iiSst    = Nis0             ;   ijSst    = Njs0             ! Snd so-side starting point, excluding sw-corner 
     845                     iiSnd    = Nie0             ;   ijSnd    = Njs0+nn_hls-1    ! Snd so-side   ending point, excluding se-corner 
     846                     iioutdir = -999             ;   ijoutdir = 1                ! outside MPI domain: northward 
     847                  END SELECT 
     848                  ! 
     849                  IF( ii >= iiRst .AND. ii <= iiRnd .AND. ij >= ijRst .AND. ij <= ijRnd ) THEN   ! rim point in recv side 
     850                     iiout = ii+iioutdir ; ijout = ij+ijoutdir        ! in which direction do we go outside of the MPI domain? 
     851                     ! take care of neighbourg(s) in the interior of the computational domain 
     852                     IF(  iibi==iiout .OR. ii1==iiout .OR. ii2==iiout .OR. ii3==iiout .OR.   &   ! Neib outside of the MPI domain 
     853                        & ijbi==ijout .OR. ij1==ijout .OR. ij2==ijout .OR. ij3==ijout ) THEN     ! -> I cannot compute it -> recv it 
     854                        IF( mpiRnei(nn_hls,iRnei) > -1 )   lrecv_bdyint(ib_bdy,igrd,iRnei,ir) = .TRUE. 
     855                     ENDIF 
     856                     ! take care of neighbourg in the exterior of the computational domain 
     857                     IF(  iibe==iiout .OR. ijbe==ijout ) THEN   ! Neib outside of the MPI domain -> I cannot compute it -> recv it 
     858                        IF( mpiRnei(nn_hls,iRnei) > -1 )   lrecv_bdyext(ib_bdy,igrd,iRnei,ir) = .TRUE. 
     859                     ENDIF 
     860                  ENDIF 
     861                   
     862                  IF( ii >= iiSst .AND. ii <= iiSnd .AND. ij >= ijSst .AND. ij <= ijSnd ) THEN   ! rim point in send side 
     863                     iiout = ii+iioutdir ; ijout = ij+ijoutdir        ! in which direction do we go outside of the nei MPI domain? 
     864                     ! take care of neighbourg(s) in the interior of the computational domain 
     865                     IF(  iibi==iiout .OR. ii1==iiout .OR. ii2==iiout .OR. ii3==iiout .OR.   &   ! Neib outside of nei MPI domain 
     866                        & ijbi==ijout .OR. ij1==ijout .OR. ij2==ijout .OR. ij3==ijout ) THEN     ! -> nei cannot compute it 
     867                        IF( mpiSnei(nn_hls,iSnei) > -1 )   lsend_bdyint(ib_bdy,igrd,iSnei,ir) = .TRUE.   ! -> send to nei 
     868                     ENDIF 
     869                     ! take care of neighbourg in the exterior of the computational domain 
     870                     IF( iibe == iiout .OR. ijbe == ijout ) THEN   ! Neib outside of the nei MPI domain -> nei cannot compute it 
     871                        IF( mpiSnei(nn_hls,iSnei) > -1 )   lsend_bdyext(ib_bdy,igrd,iSnei,ir) = .TRUE.   ! -> send to nei 
     872                     ENDIF 
     873                  END IF 
     874 
     875               END DO   ! 4 sides 
    757876               ! 
    758                ! search neighbour in the north/south direction    
     877               ! specific treatment for the corners 
    759878               ! 
    760                ! Rim is on the halo and computed ocean is towards exterior of mpi domain 
    761                ! ==> cannot compute the point x -> need to receive it 
    762                !(3)   |       |         ^   ___o___      
    763                !  |   |___x___|   OR    |  |   x   | 
    764                !  v       o           (4)  |       | 
    765                IF( ijbi==0     .OR. ij1==0     .OR. ij2==0     .OR. ij3==0     )   lrecv_bdyint(ib_bdy,igrd,jpso,ir) = .TRUE. 
    766                IF( ijbe==0                                                     )   lrecv_bdyext(ib_bdy,igrd,jpso,ir) = .TRUE. 
    767                IF( ijbi==jpj+1 .OR. ij1==jpj+1 .OR. ij2==jpj+1 .OR. ij3==jpj+1 )   lrecv_bdyint(ib_bdy,igrd,jpno,ir) = .TRUE. 
    768                IF( ijbe==jpj+1                                                 )   lrecv_bdyext(ib_bdy,igrd,jpno,ir) = .TRUE. 
    769                ! Check if neighbour has its rim parallel to its mpi subdomain     _________  border and next to its halo 
    770                !   ^  |    o    |                                                :         :  
    771                !   |  |¨¨¨¨x¨¨¨¨|   neighbour limited by ... would need o     |  |....x....| 
    772                !      :_________:  (3) S neighbour          N neighbour (4)   v  |    o    |    
    773                ! ==> the neighbour cannot compute the point x -> need to send it 
    774                IF( ij ==     2*nn_hls   .AND. mpiSnei(nn_hls,jpso) > -1 ) THEN   ! 2*nn_hls      -> jj=jpj of southern neighbour  
    775                   IF( ijbi==ij+1 .OR. ij1==ij+1 .OR. ij2==ij+1 .OR. ij3==ij+1 )   lsend_bdyint(ib_bdy,igrd,jpso,ir) = .TRUE. 
    776                   IF( ijbe==ij+1                                              )   lsend_bdyext(ib_bdy,igrd,jpso,ir) = .TRUE. 
    777                ENDIF 
    778                IF( ij == jpj-2*nn_hls+1 .AND. mpiSnei(nn_hls,jpno) > -1 ) THEN   ! jpj-2*nn_hls+1-> jj=1   of northern neighbour 
    779                   IF( ijbi==ij-1 .OR. ij1==ij-1 .OR. ij2==ij-1 .OR. ij3==ij-1 )   lsend_bdyint(ib_bdy,igrd,jpno,ir) = .TRUE. 
    780                   IF( ijbe==ij-1                                              )   lsend_bdyext(ib_bdy,igrd,jpno,ir) = .TRUE. 
    781                ENDIF 
    782             END DO 
    783          END DO 
    784       END DO 
     879               DO icnt = 1, 4 
     880                  SELECT CASE( icnt ) 
     881                     !                                       ...|.... 
     882                  CASE( 1 )   ! x: rim on sw-corner            o|   : 
     883                     !          o: potential neighbour(s)      o|x__:__ 
     884                     !             outside of the MPI domain   o o o: 
     885                     !                                              : 
     886                     iRdiag    = jpsw            ;   iRsono    = jpso            ! Recv: for sw or so 
     887                     iSdiag    = jpne            ;   iSsono    = jpno            ! Send: to ne or no 
     888                     iiRst     = 1               ;   ijRst     = 1               ! Rcv sw-corner starting point 
     889                     iiRnd     = nn_hls          ;   ijRnd     = nn_hls          ! Rcv sw-corner   ending point 
     890                     iiSstdiag = Nie0-nn_hls+1   ;   ijSstdiag = Nje0-nn_hls+1   ! send to sw-corner of ne neighbourg 
     891                     iiSnddiag = Nie0            ;   ijSnddiag = Nje0            ! send to sw-corner of ne neighbourg 
     892                     iiSstsono = 1               ;   ijSstsono = Nje0-nn_hls+1   ! send to sw-corner of no neighbourg 
     893                     iiSndsono = nn_hls          ;   ijSndsono = Nje0            ! send to sw-corner of no neighbourg 
     894                     iioutdir  = -1              ;   ijoutdir  = -1              ! outside MPI domain: westward or southward 
     895                     !                                          ....|... 
     896                  CASE( 2 )   ! x: rim on se-corner             :   |o 
     897                     !          o: potential neighbour(s)     __:__x|o 
     898                     !             outside of the MPI domain    :o o o 
     899                     !                                          :     
     900                     iRdiag    = jpse            ;   iRsono    = jpso            ! Recv: for se or so 
     901                     iSdiag    = jpnw            ;   iSsono    = jpno            ! Send: to nw or no 
     902                     iiRst     = Nie0+1          ;   ijRst     = 1               ! Rcv se-corner starting point 
     903                     iiRnd     = jpi             ;   ijRnd     = nn_hls          ! Rcv se-corner   ending point 
     904                     iiSstdiag = Nis0            ;   ijSstdiag = Nje0-nn_hls+1   ! send to se-corner of nw neighbourg 
     905                     iiSnddiag = Nis0+nn_hls-1   ;   ijSnddiag = Nje0            ! send to se-corner of nw neighbourg 
     906                     iiSstsono = Nie0+1          ;   ijSstsono = Nje0-nn_hls+1   ! send to se-corner of no neighbourg 
     907                     iiSndsono = jpi             ;   ijSndsono = Nje0            ! send to se-corner of no neighbourg 
     908                     iioutdir  = 1               ;   ijoutdir  = -1              ! outside MPI domain: eastward or southward 
     909                     !                                              :        
     910                     !                                         o o_o:___ 
     911                  CASE( 3 )   ! x: rim on nw-corner            o|x  : 
     912                     !          o: potential neighbour(s)    ..o|...: 
     913                     !             outside of the MPI domain    | 
     914                     iRdiag    = jpnw            ;   iRsono    = jpno            ! Recv: for nw or no 
     915                     iSdiag    = jpse            ;   iSsono    = jpso            ! Send: to se or so 
     916                     iiRst     = 1               ;   ijRst     = Nje0+1          ! Rcv nw-corner starting point 
     917                     iiRnd     = nn_hls          ;   ijRnd     = jpj             ! Rcv nw-corner   ending point 
     918                     iiSstdiag = Nie0-nn_hls+1   ;   ijSstdiag = Njs0            ! send to nw-corner of se neighbourg 
     919                     iiSnddiag = Nie0            ;   ijSnddiag = Njs0+nn_hls-1   ! send to nw-corner of se neighbourg 
     920                     iiSstsono = 1               ;   ijSstsono = Njs0            ! send to nw-corner of so neighbourg 
     921                     iiSndsono = nn_hls          ;   ijSndsono = Njs0+nn_hls-1   ! send to nw-corner of so neighbourg 
     922                     iioutdir  = -1              ;   ijoutdir  =  1              ! outside MPI domain: westward or northward 
     923                     !                                          :        
     924                     !                                       ___:o_o o 
     925                  CASE( 4 )   ! x: rim on ne-corner             :  x|o 
     926                     !          o: potential neighbour(s)       :...|o... 
     927                     !             outside of the MPI domain        | 
     928                     iRdiag    = jpne            ;   iRsono    = jpno            ! Recv: for ne or no 
     929                     iSdiag    = jpsw            ;   iSsono    = jpso            ! Send: to sw or so 
     930                     iiRst     = Nie0+1          ;   ijRst     = Nje0+1          ! Rcv ne-corner starting point 
     931                     iiRnd     = jpi             ;   ijRnd     = jpj             ! Rcv ne-corner   ending point 
     932                     iiSstdiag = Nis0            ;   ijSstdiag = Njs0            ! send to ne-corner of sw neighbourg 
     933                     iiSnddiag = Nis0+nn_hls-1   ;   ijSnddiag = Njs0+nn_hls-1   ! send to ne-corner of sw neighbourg 
     934                     iiSstsono = Nie0+1          ;   ijSstsono = Njs0            ! send to ne-corner of so neighbourg 
     935                     iiSndsono = jpi             ;   ijSndsono = Njs0+nn_hls-1   ! send to ne-corner of so neighbourg 
     936                     iioutdir  = 1               ;   ijoutdir  = 1               ! outside MPI domain: eastward or southward 
     937                  END SELECT 
     938                  ! 
     939                  ! Check if we need to receive data for this rim point 
     940                  IF( ii >= iiRst .AND. ii <= iiRnd .AND. ij >= ijRst .AND. ij <= ijRnd ) THEN   ! rim point on the corner 
     941                     iiout = ii+iioutdir ; ijout = ij+ijoutdir        ! in which direction do we go outside of the MPI domain? 
     942                     ! take care of neighbourg(s) in the interior of the computational domain 
     943                     IF(  iibi==iiout .OR. ii1==iiout .OR. ii2==iiout .OR. ii3==iiout .OR.   &   ! Neib outside of the MPI domain 
     944                        & ijbi==ijout .OR. ij1==ijout .OR. ij2==ijout .OR. ij3==ijout ) THEN     ! -> I cannot compute it -> recv it 
     945                        IF( mpiRnei(nn_hls,iRdiag) > -1                    )   lrecv_bdyint(ib_bdy,igrd,iRdiag,ir) = .TRUE.   ! Receive directly from diagonal neighbourg 
     946                        IF( mpiRnei(nn_hls,iRsono) > -1 .AND. nn_comm == 1 )   lrecv_bdyint(ib_bdy,igrd,iRsono,ir) = .TRUE.   ! Receive through the South/North neighbourg 
     947                     ENDIF 
     948                     ! take care of neighbourg in the exterior of the computational domain 
     949                     IF(  iibe==iiout .OR. ijbe==ijout ) THEN   ! Neib outside of the MPI domain -> I cannot compute it -> recv it 
     950                        IF( mpiRnei(nn_hls,iRdiag) > -1                    )   lrecv_bdyext(ib_bdy,igrd,iRdiag,ir) = .TRUE.   ! Receive directly from diagonal neighbourg 
     951                        IF( mpiRnei(nn_hls,iRsono) > -1 .AND. nn_comm == 1 )   lrecv_bdyext(ib_bdy,igrd,iRsono,ir) = .TRUE.   ! Receive through the South/North neighbourg 
     952                     ENDIF 
     953                  ENDIF 
     954                  ! 
     955                  ! Check if this rim point corresponds to the corner of one neighbourg. if yes, do we need to send data? 
     956                  ! Direct send to diag: Is this rim point the corner point of a diag neighbour with which we communicate? 
     957                  IF( ii >= iiSstdiag .AND. ii <= iiSnddiag .AND. ij >= ijSstdiag .AND. ij <= ijSnddiag   & 
     958                     &                .AND. mpiSnei(nn_hls,iSdiag) > -1 ) THEN 
     959                     iiout = ii+iioutdir ; ijout = ij+ijoutdir        ! in which direction do we go outside of the nei MPI domain? 
     960                     ! take care of neighbourg(s) in the interior of the computational domain 
     961                     IF(  iibi==iiout .OR. ii1==iiout .OR. ii2==iiout .OR. ii3==iiout .OR.   &   ! Neib outside of diag nei MPI  
     962                        & ijbi==ijout .OR. ij1==ijout .OR. ij2==ijout .OR. ij3==ijout )      &   ! domain -> nei cannot compute it 
     963                        &    lsend_bdyint(ib_bdy,igrd,iSdiag,ir) = .TRUE.                        ! send rim point data to diag nei 
     964                     ! take care of neighbourg in the exterior of the computational domain 
     965                     IF(  iibe==iiout .OR. ijbe==ijout )   &                                  
     966                        &    lsend_bdyext(ib_bdy,igrd,iSdiag,ir) = .TRUE. 
     967                  ENDIF 
     968                  ! Indirect send to diag (through so/no): rim point is the corner point of a so/no nei with which we communicate 
     969                  IF( ii >= iiSstsono .AND. ii <= iiSndsono .AND. ij >= ijSstsono .AND. ij <= ijSndsono   & 
     970                     &                .AND. mpiSnei(nn_hls,iSsono) > -1 .AND. nn_comm == 1 ) THEN 
     971                     iiout = ii+iioutdir ; ijout = ij+ijoutdir        ! in which direction do we go outside of the nei MPI domain? 
     972                     ! take care of neighbourg(s) in the interior of the computational domain 
     973                     IF(  iibi==iiout .OR. ii1==iiout .OR. ii2==iiout .OR. ii3==iiout .OR.   &   ! Neib outside of so/no nei MPI 
     974                        & ijbi==ijout .OR. ij1==ijout .OR. ij2==ijout .OR. ij3==ijout )      &   ! domain -> nei cannot compute it 
     975                        &    lsend_bdyint(ib_bdy,igrd,iSsono,ir) = .TRUE.                        ! send rim point data to so/no nei 
     976                     ! take care of neighbourg in the exterior of the computational domain 
     977                     IF(  iibe==iiout .OR. ijbe==ijout )   & 
     978                        &    lsend_bdyext(ib_bdy,igrd,iSsono,ir) = .TRUE. 
     979                  ENDIF 
     980                  ! 
     981               END DO   ! 4 corners 
     982            END DO   ! ib 
     983         END DO   ! igrd 
     984 
     985         ! Comment out for debug 
     986!!$         DO ir = 0,1 
     987!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'T', 1._wp, kfillmode = jpfillnothing,   & 
     988!!$               &                              lsend = lsend_bdyint(ib_bdy,1,:,ir), lrecv = lrecv_bdyint(ib_bdy,1,:,ir) ) 
     989!!$            IF(lwp) WRITE(numout,*) ' bdy debug int T', ir ; CALL FLUSH(numout) 
     990!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'U', 1._wp, kfillmode = jpfillnothing,   & 
     991!!$               &                              lsend = lsend_bdyint(ib_bdy,2,:,ir), lrecv = lrecv_bdyint(ib_bdy,2,:,ir) ) 
     992!!$            IF(lwp) WRITE(numout,*) ' bdy debug int U', ir ; CALL FLUSH(numout) 
     993!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'V', 1._wp, kfillmode = jpfillnothing,   & 
     994!!$               &                              lsend = lsend_bdyint(ib_bdy,3,:,ir), lrecv = lrecv_bdyint(ib_bdy,3,:,ir) )     
     995!!$            IF(lwp) WRITE(numout,*) ' bdy debug int V', ir ; CALL FLUSH(numout) 
     996!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'T', 1._wp, kfillmode = jpfillnothing,   & 
     997!!$               &                              lsend = lsend_bdyext(ib_bdy,1,:,ir), lrecv = lrecv_bdyext(ib_bdy,1,:,ir) ) 
     998!!$            IF(lwp) WRITE(numout,*) ' bdy debug ext T', ir ; CALL FLUSH(numout) 
     999!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'U', 1._wp, kfillmode = jpfillnothing,   & 
     1000!!$               &                              lsend = lsend_bdyext(ib_bdy,2,:,ir), lrecv = lrecv_bdyext(ib_bdy,2,:,ir) ) 
     1001!!$            IF(lwp) WRITE(numout,*) ' bdy debug ext U', ir ; CALL FLUSH(numout) 
     1002!!$            zzbdy(:,:) = narea ; CALL lbc_lnk('bdy debug', zzbdy, 'V', 1._wp, kfillmode = jpfillnothing,   & 
     1003!!$               &                              lsend = lsend_bdyext(ib_bdy,3,:,ir), lrecv = lrecv_bdyext(ib_bdy,3,:,ir) )     
     1004!!$            IF(lwp) WRITE(numout,*) ' bdy debug ext V', ir ; CALL FLUSH(numout) 
     1005!!$         END DO 
     1006          
     1007      END DO   ! ib_bdy 
    7851008 
    7861009      DO ib_bdy = 1,nb_bdy 
Note: See TracChangeset for help on using the changeset viewer.