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 11380 for NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_DYN_optimization/src/OCE/BDY/bdyini.F90 – NEMO

Ignore:
Timestamp:
2019-07-31T15:56:02+02:00 (5 years ago)
Author:
girrmann
Message:

dev_r10984_HPC-13 : adding extra halos in dyn_spg_ts is now possible, only works with a single halo when used with tide or bdy, see #2308

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_DYN_optimization/src/OCE/BDY/bdyini.F90

    r11356 r11380  
    3737 
    3838   INTEGER, PARAMETER ::   jp_nseg = 100   !  
     39   INTEGER  ::   ihl                                    ! number of halos to be communicated 
    3940   ! Straight open boundary segment parameters: 
    4041   INTEGER  ::   nbdysege, nbdysegw, nbdysegn, nbdysegs  
     
    7071         &             ln_vol, nn_volctl, nn_rimwidth 
    7172         ! 
    72       INTEGER  ::   ios                 ! Local integer output status for namelist read 
     73      INTEGER  ::   ios                     ! Local integer output status for namelist read 
     74      INTEGER  :: idbi, idbj, idei, idej    ! start/end of the subdomain for extended and regular bdy treatment 
    7375      !!---------------------------------------------------------------------- 
    7476 
     
    105107 
    106108      IF( nb_bdy == 0 ) ln_bdy = .FALSE. 
    107        
     109 
     110      IF( nn_hlts > 1 .AND. MOD(nn_hlts,2)==0 ) THEN 
     111         WRITE(ctmp1,*) 'Number of added halos for time splitting nn_hlts set to   ',nn_hlts   & 
     112              &        ,'   in namelist, is here set to   ', nn_hlts-1 ,'   must be odd' 
     113         CALL ctl_warn( ctmp1 ) 
     114         nn_hlts = nn_hlts - 1 
     115      END IF 
     116      ! 
     117      IF( nn_hlts > 1 .AND. ln_tide ) THEN 
     118         WRITE(ctmp1,*) 'Number of added halos for time splitting nn_hlts set to   ',nn_hlts   & 
     119              &        ,'   in namelist, is here set to 1 for compatibility with tide treatment' 
     120         CALL ctl_warn( ctmp1 ) 
     121         nn_hlts = 1 
     122      END IF 
     123      ! 
     124      IF( nn_hlts > 1 .AND. ln_bdy ) THEN 
     125         WRITE(ctmp1,*) 'Number of added halos for time splitting nn_hlts set to   ',nn_hlts   & 
     126              &        ,'   in namelist, is here set to 1 for compatibility with boundary treatment' 
     127         CALL ctl_warn( ctmp1 ) 
     128         nn_hlts = 1 
     129      END IF 
    108130      ! ----------------------------------------- 
    109131      ! unstructured open boundaries use control 
     
    115137         ! 
    116138         ! Open boundaries definition (arrays and masks) 
    117          CALL bdy_def 
     139         ! extended : interior domain + global halo + halo extension for time-splitting 
     140         idbi = 1   - nn_hlts   ;   idbj = 1   - nn_hlts 
     141         idei = jpi + nn_hlts   ;   idej = jpj + nn_hlts 
     142         idx_bdy      => idx_bdy_xtd 
     143         dta_bdy      => dta_bdy_xtd 
     144         lsend_bdy    => lsend_bdy_xtd(:,:,:,:) 
     145         lrecv_bdy    => lrecv_bdy_xtd(:,:,:,:) 
     146         lsend_bdyint => lsend_bdyint_xtd(:,:,:,:) 
     147         lrecv_bdyint => lrecv_bdyint_xtd(:,:,:,:) 
     148         lsend_bdyext => lsend_bdyext_xtd(:,:,:,:) 
     149         lrecv_bdyext => lrecv_bdyext_xtd(:,:,:,:) 
     150         CALL bdy_def( idbi, idbj, idei, idej, .true. ) 
     151         CALL swap_bdyptr 
     152         ! regular : interior domain + global halo 
     153         idbi = 1      ;   idbj = 1          ;   idei = jpi      ;   idej = jpj 
     154         idx_bdy      => idx_bdy_reg 
     155         dta_bdy      => dta_bdy_reg 
     156         lsend_bdy    => lsend_bdy_reg(:,:,:,:) 
     157         lrecv_bdy    => lrecv_bdy_reg(:,:,:,:) 
     158         lsend_bdyint => lsend_bdyint_reg(:,:,:,:) 
     159         lrecv_bdyint => lrecv_bdyint_reg(:,:,:,:) 
     160         lsend_bdyext => lsend_bdyext_reg(:,:,:,:) 
     161         lrecv_bdyext => lrecv_bdyext_reg(:,:,:,:) 
     162         CALL bdy_def( idbi, idbj, idei, idej ) 
     163         ! current bdy treated is regular 
     164         ! 
    118165         IF( ln_meshmask )   CALL bdy_meshwri() 
    119166         ! 
     
    134181 
    135182 
    136    SUBROUTINE bdy_def 
     183   SUBROUTINE bdy_def( idbi, idbj, idei, idej, ldxtd ) 
    137184      !!---------------------------------------------------------------------- 
    138185      !!                 ***  ROUTINE bdy_init  *** 
     
    144191      !! 
    145192      !! ** Input   :  bdy_init.nc, input file for unstructured open boundaries 
    146       !!----------------------------------------------------------------------       
     193      !!----------------------------------------------------------------------     
     194      INTEGER          , INTENT(in)  :: idbi, idbj, idei, idej   ! start/end of the subdomain for extended and regular bdy treatment 
     195      LOGICAL, OPTIONAL, INTENT(in)  :: ldxtd                    ! indicate if extended domain is treated (for time splitting) 
    147196      INTEGER  ::   ib_bdy, ii, ij, igrd, ib, ir, iseg     ! dummy loop indices 
    148197      INTEGER  ::   icount, icountr, icountr0, ibr_max     ! local integers 
    149       INTEGER  ::   ilen1                                  !   -       - 
    150198      INTEGER  ::   iwe, ies, iso, ino, inum, id_dummy     !   -       - 
    151       INTEGER  ::   jpbdta                                 !   -       - 
     199      INTEGER  ::   jpbdta, ilen1                          !   -       - 
    152200      INTEGER  ::   ib_bdy1, ib_bdy2, ib1, ib2             !   -       - 
    153201      INTEGER  ::   ii1, ii2, ii3, ij1, ij2, ij3           !   -       - 
    154202      INTEGER  ::   iibe, ijbe, iibi, ijbi                 !   -       - 
     203      INTEGER  ::   iint1, iout1, iint2, iout2             !   -       - 
    155204      INTEGER  ::   flagu, flagv                           ! short cuts 
    156205      INTEGER  ::   nbdyind, nbdybeg, nbdyend 
     206      INTEGER  ::   ihl                                    ! total number of halos ( with added halos for time splitting) 
    157207      INTEGER              , DIMENSION(4)             ::   kdimsz 
    158208      INTEGER              , DIMENSION(jpbgrd,jp_bdy) ::   nblendta          ! Length of index arrays  
     
    162212      REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zz_read                 ! work space for 2D global boundary data 
    163213      REAL(wp), POINTER    , DIMENSION(:,:)     ::   zmask                   ! pointer to 2D mask fields 
    164       REAL(wp)             , DIMENSION(jpi,jpj) ::   zfmask   ! temporary fmask array excluding coastal boundary condition (shlat) 
    165       REAL(wp)             , DIMENSION(jpi,jpj) ::   ztmask, zumask, zvmask  ! temporary u/v mask array 
     214      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zfmask   ! temporary fmask array excluding coastal boundary condition (shlat) 
     215      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   ztmask, zumask, zvmask  ! temporary u/v mask array 
     216      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zbdytmask, zbdyumask, zbdyvmask  ! temporary u/v mask array 
    166217      !!---------------------------------------------------------------------- 
    167218      ! 
    168219      cgrid = (/'t','u','v'/) 
    169220 
     221      ihl = nn_hls 
     222      IF( PRESENT(ldxtd) ) THEN   ;   IF( ldxtd )   ihl = nn_hls + nn_hlts   ;   ENDIF 
     223 
     224      ALLOCATE( zfmask(idbi:idei,idbj:idej), ztmask(idbi:idei,idbj:idej) & 
     225           &  , zumask(idbi:idei,idbj:idej), zvmask(idbi:idei,idbj:idej) ) 
     226 
     227      ALLOCATE( zbdytmask(idbi:idei,idbj:idej), zbdyumask(idbi:idei,idbj:idej), zbdyvmask(idbi:idei,idbj:idej) ) 
    170228      ! ----------------------------------------- 
    171229      ! Check and write out namelist parameters 
     
    488546      !------------------------------------------------------ 
    489547      ! 
    490       iwe = mig(1) 
    491       ies = mig(jpi) 
    492       iso = mjg(1)  
    493       ino = mjg(jpj)  
     548      iwe = idbi + nimpp - 1 
     549      ies = idei + nimpp - 1 
     550      iso = idbj + njmpp - 1 
     551      ino = idej + njmpp - 1 
    494552      ! 
    495553      DO ib_bdy = 1, nb_bdy 
     
    551609                     ! 
    552610                     icount = icount  + 1 
    553                      idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- mig(1)+1   ! global to local indexes 
    554                      idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- mjg(1)+1   ! global to local indexes 
     611                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- (1+nimpp-1)+1   ! global to local indexes 
     612                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- (1+njmpp-1)+1   ! global to local indexes 
    555613                     idx_bdy(ib_bdy)%nbr(icount,igrd)   = nbrdta(ib,igrd,ib_bdy) 
    556614                     idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 
     
    579637               ! check if point has to be sent     to   a neighbour 
    580638               ! W neighbour and on the inner left  side 
    581                IF( ii == 2    .and. (nbondi == 0 .or. nbondi ==  1) )   lsend_bdy(ib_bdy,igrd,1,ir) = .true. 
     639               IF( ii == idbi + 1 .and. (nbondi == 0 .or. nbondi ==  1) )   lsend_bdy(ib_bdy,igrd,1,ir) = .true. 
    582640               ! E neighbour and on the inner right side 
    583                IF( ii == jpi-1 .and. (nbondi == 0 .or. nbondi == -1) )   lsend_bdy(ib_bdy,igrd,2,ir) = .true. 
     641               IF( ii == idei - 1 .and. (nbondi == 0 .or. nbondi == -1) )   lsend_bdy(ib_bdy,igrd,2,ir) = .true. 
    584642               ! S neighbour and on the inner down side 
    585                IF( ij == 2    .and. (nbondj == 0 .or. nbondj ==  1) )   lsend_bdy(ib_bdy,igrd,3,ir) = .true. 
     643               IF( ij == idbj + 1 .and. (nbondj == 0 .or. nbondj ==  1) )   lsend_bdy(ib_bdy,igrd,3,ir) = .true. 
    586644               ! N neighbour and on the inner up   side 
    587                IF( ij == jpj-1 .and. (nbondj == 0 .or. nbondj == -1) )   lsend_bdy(ib_bdy,igrd,4,ir) = .true. 
     645               IF( ij == idej - 1 .and. (nbondj == 0 .or. nbondj == -1) )   lsend_bdy(ib_bdy,igrd,4,ir) = .true. 
    588646               ! 
    589647               ! check if point has to be received from a neighbour 
    590648               ! W neighbour and on the outter left  side 
    591                IF( ii == 1    .and. (nbondi == 0 .or. nbondi ==  1) )   lrecv_bdy(ib_bdy,igrd,1,ir) = .true. 
     649               IF( ii == idbi .and. (nbondi == 0 .or. nbondi ==  1) )   lrecv_bdy(ib_bdy,igrd,1,ir) = .true. 
    592650               ! E neighbour and on the outter right side 
    593                IF( ii == jpi  .and. (nbondi == 0 .or. nbondi == -1) )   lrecv_bdy(ib_bdy,igrd,2,ir) = .true. 
     651               IF( ii == idei .and. (nbondi == 0 .or. nbondi == -1) )   lrecv_bdy(ib_bdy,igrd,2,ir) = .true. 
    594652               ! S neighbour and on the outter down side 
    595                IF( ij == 1    .and. (nbondj == 0 .or. nbondj ==  1) )   lrecv_bdy(ib_bdy,igrd,3,ir) = .true. 
     653               IF( ij == idbj .and. (nbondj == 0 .or. nbondj ==  1) )   lrecv_bdy(ib_bdy,igrd,3,ir) = .true. 
    596654               ! N neighbour and on the outter up   side 
    597                IF( ij == jpj  .and. (nbondj == 0 .or. nbondj == -1) )   lrecv_bdy(ib_bdy,igrd,4,ir) = .true. 
     655               IF( ij == idej .and. (nbondj == 0 .or. nbondj == -1) )   lrecv_bdy(ib_bdy,igrd,4,ir) = .true. 
    598656               ! 
    599657            END DO 
     
    633691      ! ------------------------------------------ 
    634692 
    635       ztmask(:,:) = tmask(:,:,1)   ;   zumask(:,:) = umask(:,:,1)   ;   zvmask(:,:) = vmask(:,:,1) 
     693      ztmask(1:jpi,1:jpj) = tmask(1:jpi,1:jpj,1) 
     694      zumask(1:jpi,1:jpj) = umask(1:jpi,1:jpj,1) 
     695      zvmask(1:jpi,1:jpj) = vmask(1:jpi,1:jpj,1) 
    636696      ! For the flagu/flagv calculation below we require a version of fmask without 
    637697      ! the land boundary condition (shlat) included: 
    638       DO ij = 1, jpjm1 
    639          DO ii = 1, jpim1 
     698      DO ij = 1, idej - 1 
     699         DO ii = 1, idei - 1 
    640700            zfmask(ii,ij) =  ztmask(ii,ij  ) * ztmask(ii+1,ij  )   & 
    641701               &           * ztmask(ii,ij+1) * ztmask(ii+1,ij+1) 
    642702         END DO 
    643703      END DO 
    644       CALL lbc_lnk( 'bdyini', zfmask, 'F', 1. ) 
     704      CALL lbc_lnk( 'bdyini', zfmask, 'F', 1., khlcom = ihl ) 
    645705 
    646706      ! Read global 2D mask at T-points: bdytmask 
     
    648708      ! bdytmask = 1  on the computational domain AND on open boundaries 
    649709      !          = 0  elsewhere    
    650  
    651       bdytmask(:,:) = ssmask(:,:) 
     710      zbdytmask(1:jpi,1:jpj) = ssmask(1:jpi,1:jpj) 
    652711 
    653712      ! Derive mask on U and V grid from mask on T grid 
    654       DO ij = 1, jpjm1 
    655          DO ii = 1, jpim1 
    656             bdyumask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii+1,ij  ) 
    657             bdyvmask(ii,ij) = bdytmask(ii,ij) * bdytmask(ii  ,ij+1)   
     713      DO ij = 1, idej - 1 
     714         DO ii = 1, idei - 1 
     715            zbdyumask(ii,ij) = zbdytmask(ii,ij) * zbdytmask(ii+1,ij  ) 
     716            zbdyvmask(ii,ij) = zbdytmask(ii,ij) * zbdytmask(ii  ,ij+1)   
    658717         END DO 
    659718      END DO 
    660       CALL lbc_lnk_multi( 'bdyini', bdyumask, 'U', 1., bdyvmask, 'V', 1. )   ! Lateral boundary cond. 
     719      CALL lbc_lnk_multi( 'bdyini', zbdytmask, 'T', 1., zbdyumask, 'U', 1., zbdyvmask, 'V', 1., khlcom = ihl )   ! Lateral boundary cond. 
    661720 
    662721      ! bdy masks are now set to zero on rim 0 points: 
    663722      DO ib_bdy = 1, nb_bdy 
    664723         DO ib = 1, idx_bdy(ib_bdy)%nblenrim0(1)   ! extent of rim 0 
    665             bdytmask(idx_bdy(ib_bdy)%nbi(ib,1), idx_bdy(ib_bdy)%nbj(ib,1)) = 0._wp 
     724            zbdytmask(idx_bdy(ib_bdy)%nbi(ib,1), idx_bdy(ib_bdy)%nbj(ib,1)) = 0._wp 
    666725         END DO 
    667726         DO ib = 1, idx_bdy(ib_bdy)%nblenrim0(2)   ! extent of rim 0 
    668             bdyumask(idx_bdy(ib_bdy)%nbi(ib,2), idx_bdy(ib_bdy)%nbj(ib,2)) = 0._wp 
     727            zbdyumask(idx_bdy(ib_bdy)%nbi(ib,2), idx_bdy(ib_bdy)%nbj(ib,2)) = 0._wp 
    669728         END DO 
    670729         DO ib = 1, idx_bdy(ib_bdy)%nblenrim0(3)   ! extent of rim 0 
    671             bdyvmask(idx_bdy(ib_bdy)%nbi(ib,3), idx_bdy(ib_bdy)%nbj(ib,3)) = 0._wp 
     730            zbdyvmask(idx_bdy(ib_bdy)%nbi(ib,3), idx_bdy(ib_bdy)%nbj(ib,3)) = 0._wp 
    672731         END DO 
    673732      END DO 
    674  
    675       CALL bdy_rim_treat( zumask, zvmask, zfmask, .true. )   ! compute flagu, flagv, ntreat on rim 0 
     733      ! compute flagu, flagv, ntreat on rim 0 
     734      CALL bdy_rim_treat( zumask, zvmask, zfmask, zbdytmask, zbdyumask, zbdyvmask, .true., idbi, idei, idbj, idej, ldxtd ) 
    676735 
    677736      ! ------------------------------------ 
     
    699758         END DO 
    700759      END DO 
    701       CALL lbc_lnk( 'bdyini', zfmask, 'F', 1. ) 
     760      CALL lbc_lnk( 'bdyini', zfmask, 'F', 1., khlcom = ihl ) 
    702761 
    703762      ! bdy masks are now set to zero on rim1 points: 
    704763      DO ib_bdy = 1, nb_bdy 
    705764         DO ib = idx_bdy(ib_bdy)%nblenrim0(1) + 1,  idx_bdy(ib_bdy)%nblenrim(1)   ! extent of rim 1 
    706             bdytmask(idx_bdy(ib_bdy)%nbi(ib,1), idx_bdy(ib_bdy)%nbj(ib,1)) = 0._wp 
     765            zbdytmask(idx_bdy(ib_bdy)%nbi(ib,1), idx_bdy(ib_bdy)%nbj(ib,1)) = 0._wp 
    707766         END DO 
    708767         DO ib = idx_bdy(ib_bdy)%nblenrim0(2) + 1,  idx_bdy(ib_bdy)%nblenrim(2)   ! extent of rim 1 
    709             bdyumask(idx_bdy(ib_bdy)%nbi(ib,2), idx_bdy(ib_bdy)%nbj(ib,2)) = 0._wp 
     768            zbdyumask(idx_bdy(ib_bdy)%nbi(ib,2), idx_bdy(ib_bdy)%nbj(ib,2)) = 0._wp 
    710769         END DO 
    711770         DO ib = idx_bdy(ib_bdy)%nblenrim0(3) + 1,  idx_bdy(ib_bdy)%nblenrim(3)   ! extent of rim 1 
    712             bdyvmask(idx_bdy(ib_bdy)%nbi(ib,3), idx_bdy(ib_bdy)%nbj(ib,3)) = 0._wp 
     771            zbdyvmask(idx_bdy(ib_bdy)%nbi(ib,3), idx_bdy(ib_bdy)%nbj(ib,3)) = 0._wp 
    713772         END DO 
    714773      END DO 
    715  
    716       CALL bdy_rim_treat( zumask, zvmask, zfmask, .false. )   ! compute flagu, flagv, ntreat on rim 1 
     774      ! compute flagu, flagv, ntreat on rim 1 
     775      CALL bdy_rim_treat( zumask, zvmask, zfmask, zbdytmask, zbdyumask, zbdyvmask, .false., idbi, idei, idbj, idej, ldxtd ) 
    717776      ! 
    718777      ! Check which boundaries might need communication 
     
    743802               !      <--    (o exterior)     -->   
    744803               ! (1)  o|x         OR    (2)   x|o 
    745                !       |___                 ___|  
    746                IF( iibi == 0     .OR. ii1 == 0     .OR. ii2 == 0     .OR. ii3 == 0     )   lrecv_bdyint(ib_bdy,igrd,1,ir) = .true. 
    747                IF( iibi == jpi+1 .OR. ii1 == jpi+1 .OR. ii2 == jpi+1 .OR. ii3 == jpi+1 )   lrecv_bdyint(ib_bdy,igrd,2,ir) = .true.   
    748                IF( iibe == 0                                                           )   lrecv_bdyext(ib_bdy,igrd,1,ir) = .true. 
    749                IF( iibe == jpi+1                                                       )   lrecv_bdyext(ib_bdy,igrd,2,ir) = .true.   
     804               !       |___                 ___| 
     805               iout1 = idbi-1   ;   iout2 = idei+1 
     806               IF( iibi == iout1 .OR. ii1 == iout1 .OR. ii2 == iout1 .OR. ii3 == iout1 )  lrecv_bdyint(ib_bdy,igrd,1,ir)=.true. 
     807               IF( iibi == iout2 .OR. ii1 == iout2 .OR. ii2 == iout2 .OR. ii3 == iout2 )  lrecv_bdyint(ib_bdy,igrd,2,ir)=.true. 
     808               IF( iibe == iout1                                                       )  lrecv_bdyext(ib_bdy,igrd,1,ir)=.true. 
     809               IF( iibe == iout2                                                       )  lrecv_bdyext(ib_bdy,igrd,2,ir)=.true.  
    750810               ! Check if neighbour has its rim parallel to its mpi subdomain border and located next to its halo 
    751811               ! :¨¨¨¨¨|¨¨-->    |                                             |    <--¨¨|¨¨¨¨¨:  
    752812               ! :     |  x:o    |    neighbour limited by ... would need o    |    o:x  |     : 
    753813               ! :.....|_._:_____|   (1) W neighbour         E neighbour (2)   |_____:_._|.....: 
    754                IF( ii == 2     .AND. ( nbondi ==  1 .OR. nbondi == 0 ) .AND. & 
    755                   & ( iibi == 3     .OR. ii1 == 3     .OR. ii2 == 3     .OR. ii3 == 3    ) )   lsend_bdyint(ib_bdy,igrd,1,ir)=.true. 
    756                IF( ii == jpi-1 .AND. ( nbondi == -1 .OR. nbondi == 0 ) .AND. & 
    757                   & ( iibi == jpi-2 .OR. ii1 == jpi-2 .OR. ii2 == jpi-2 .OR. ii3 == jpi-2) )   lsend_bdyint(ib_bdy,igrd,2,ir)=.true. 
    758                IF( ii == 2     .AND. ( nbondi ==  1 .OR. nbondi == 0 ) .AND. iibe == 3     )   lsend_bdyext(ib_bdy,igrd,1,ir)=.true. 
    759                IF( ii == jpi-1 .AND. ( nbondi == -1 .OR. nbondi == 0 ) .AND. iibe == jpi-2 )   lsend_bdyext(ib_bdy,igrd,2,ir)=.true. 
     814               iout1 = idbi+2*ihl   ;   iint1 = iout1-1   ;   iout2 = idei-2*ihl   ;   iint2 = iout2+1 
     815               IF( ii == iint1 .AND. (nbondi== 1 .OR. nbondi==0) .AND. & 
     816                 & (iibi == iout1 .OR. ii1 == iout1 .OR. ii2 == iout1 .OR. ii3 == iout1) )  lsend_bdyint(ib_bdy,igrd,1,ir)=.true. 
     817               IF( ii == iint2 .AND. (nbondi==-1 .OR. nbondi==0) .AND. & 
     818                 & (iibi == iout2 .OR. ii1 == iout2 .OR. ii2 == iout2 .OR. ii3 == iout2) )  lsend_bdyint(ib_bdy,igrd,2,ir)=.true. 
     819               IF( ii == iint1 .AND. (nbondi== 1 .OR. nbondi==0) .AND. iibe == iout1     )  lsend_bdyext(ib_bdy,igrd,1,ir)=.true. 
     820               IF( ii == iint2 .AND. (nbondi==-1 .OR. nbondi==0) .AND. iibe == iout2     )  lsend_bdyext(ib_bdy,igrd,2,ir)=.true. 
    760821               ! 
    761822               ! search neighbour in the north/south direction    
     
    764825               !  |   |___x___|   OR    |  |   x   | 
    765826               !  v       o           (4)  |       | 
    766                IF( ijbi == 0     .OR. ij1 == 0     .OR. ij2 == 0     .OR. ij3 == 0     )   lrecv_bdyint(ib_bdy,igrd,3,ir) = .true. 
    767                IF( ijbi == jpj+1 .OR. ij1 == jpj+1 .OR. ij2 == jpj+1 .OR. ij3 == jpj+1 )   lrecv_bdyint(ib_bdy,igrd,4,ir) = .true. 
    768                IF( ijbe == 0                                                           )   lrecv_bdyext(ib_bdy,igrd,3,ir) = .true. 
    769                IF( ijbe == jpj+1                                                       )   lrecv_bdyext(ib_bdy,igrd,4,ir) = .true. 
     827               iout1 = idbj-1   ;   iout2 = idej+1 
     828               IF( ijbi == iout1 .OR. ij1 == iout1 .OR. ij2 == iout1 .OR. ij3 == iout1 )  lrecv_bdyint(ib_bdy,igrd,3,ir)=.true. 
     829               IF( ijbi == iout2 .OR. ij1 == iout2 .OR. ij2 == iout2 .OR. ij3 == iout2 )  lrecv_bdyint(ib_bdy,igrd,4,ir)=.true. 
     830               IF( ijbe == iout1                                                       )  lrecv_bdyext(ib_bdy,igrd,3,ir)=.true. 
     831               IF( ijbe == iout2                                                       )  lrecv_bdyext(ib_bdy,igrd,4,ir)=.true. 
    770832               ! Check if neighbour has its rim parallel to its mpi subdomain     _________  border and next to its halo 
    771833               !   ^  |    o    |                                                :         :  
    772834               !   |  |¨¨¨¨x¨¨¨¨|   neighbour limited by ... would need o     |  |....x....| 
    773835               !      :_________:  (3) S neighbour          N neighbour (4)   v  |    o    |    
    774                IF( ij == 2     .AND. ( nbondj ==  1 .OR. nbondj == 0 ) .AND. & 
    775                   & ( ijbi == 3     .OR. ij1 == 3     .OR. ij2 == 3     .OR. ij3 == 3    ) )   lsend_bdyint(ib_bdy,igrd,3,ir)=.true. 
    776                IF( ij == jpj-1 .AND. ( nbondj == -1 .OR. nbondj == 0 ) .AND. & 
    777                   & ( ijbi == jpj-2 .OR. ij1 == jpj-2 .OR. ij2 == jpj-2 .OR. ij3 == jpj-2) )   lsend_bdyint(ib_bdy,igrd,4,ir)=.true. 
    778                IF( ij == 2     .AND. ( nbondj ==  1 .OR. nbondj == 0 ) .AND. ijbe == 3     )   lsend_bdyext(ib_bdy,igrd,3,ir)=.true. 
    779                IF( ij == jpj-1 .AND. ( nbondj == -1 .OR. nbondj == 0 ) .AND. ijbe == jpj-2 )   lsend_bdyext(ib_bdy,igrd,4,ir)=.true. 
     836               iout1 = idbj+2*ihl   ;   iint1 = iout1-1   ;   iout2 = idej-2*ihl   ;   iint2 = iout2+1 
     837               IF( ij == iint1 .AND. (nbondj== 1 .OR. nbondj==0) .AND. & 
     838                 & (ijbi == iout1 .OR. ij1 == iout1 .OR. ij2 == iout1 .OR. ij3 == iout1) )  lsend_bdyint(ib_bdy,igrd,3,ir)=.true. 
     839               IF( ij == iint2 .AND. (nbondj==-1 .OR. nbondj==0) .AND. & 
     840                 & (ijbi == iout2 .OR. ij1 == iout2 .OR. ij2 == iout2 .OR. ij3 == iout2) )  lsend_bdyint(ib_bdy,igrd,4,ir)=.true. 
     841               IF( ij == iint1 .AND. (nbondj== 1 .OR. nbondj==0) .AND. ijbe == iout1     )  lsend_bdyext(ib_bdy,igrd,3,ir)=.true. 
     842               IF( ij == iint2 .AND. (nbondj==-1 .OR. nbondj==0) .AND. ijbe == iout2     )  lsend_bdyext(ib_bdy,igrd,4,ir)=.true. 
    780843            END DO 
    781844         END DO 
     
    799862      END DO 
    800863      ! 
    801       DEALLOCATE( nbidta, nbjdta, nbrdta ) 
     864      ! initialize bdyXmask for global use 
     865      bdytmask(1:jpi,1:jpj) = zbdytmask(1:jpi,1:jpj) 
     866      bdyumask(1:jpi,1:jpj) = zbdyumask(1:jpi,1:jpj) 
     867      bdyvmask(1:jpi,1:jpj) = zbdyvmask(1:jpi,1:jpj) 
     868      ! 
     869      DEALLOCATE( nbidta, nbjdta, nbrdta, zfmask, ztmask, zumask, zvmask, zbdytmask, zbdyumask, zbdyvmask ) 
    802870      ! 
    803871   END SUBROUTINE bdy_def 
    804872 
    805873 
    806    SUBROUTINE bdy_rim_treat( pumask, pvmask, pfmask, lrim0 ) 
     874   SUBROUTINE bdy_rim_treat( pumask, pvmask, pfmask, pbdytmask, pbdyumask, pbdyvmask, lrim0, idbi, idei, idbj, idej, ldxtd ) 
    807875      !!---------------------------------------------------------------------- 
    808876      !!                 ***  ROUTINE bdy_rim_treat  *** 
     
    821889      !!                - and look at the ocean neighbours to compute ntreat 
    822890      !!---------------------------------------------------------------------- 
    823       REAL(wp), TARGET, DIMENSION(jpi,jpj), INTENT (in   ) :: pfmask   ! temporary fmask excluding coastal boundary condition (shlat) 
    824       REAL(wp), TARGET, DIMENSION(jpi,jpj), INTENT (in   ) :: pumask, pvmask   ! temporary t/u/v mask array 
    825       LOGICAL                             , INTENT (in   ) :: lrim0    ! .true. -> rim 0   .false. -> rim 1 
     891      REAL(wp), TARGET, DIMENSION(idbi:idei,idbj:idej), INTENT(in   ) :: pfmask   ! temporary fmask excluding coastal boundary condition (shlat) 
     892      REAL(wp), TARGET, DIMENSION(idbi:idei,idbj:idej), INTENT(in   ) :: pumask, pvmask   ! temporary t/u/v mask array 
     893      REAL(wp), TARGET, DIMENSION(idbi:idei,idbj:idej), INTENT(in   ) :: pbdytmask, pbdyumask, pbdyvmask    
     894      LOGICAL                             , INTENT(in   ) :: lrim0    ! .true. -> rim 0   .false. -> rim 1 
     895      INTEGER                             , INTENT(in   ) :: idbi, idbj, idei, idej    ! start/end of the subdomain  
     896                                                                                   ! for extended and regular bdy treatment 
     897      LOGICAL, OPTIONAL                   , INTENT(in   ) :: ldxtd    ! number of halos added to nn_hls for time splitting 
     898      ! 
    826899      INTEGER  ::   ib_bdy, ii, ij, igrd, ib, icount       ! dummy loop indices 
    827       INTEGER  ::   i_offset, j_offset, inn                ! local integer 
     900      INTEGER  ::   i_offset, j_offset, inn, ihl           ! local integer 
    828901      INTEGER  ::   ibeg, iend                             ! local integer 
    829902      LOGICAL  ::   llnon, llson, llean, llwen             ! local logicals indicating the presence of a ocean neighbour 
     
    831904      REAL(wp) ::   zefl, zwfl, znfl, zsfl                 ! local scalars 
    832905      CHARACTER(LEN=1), DIMENSION(jpbgrd)     ::   cgrid 
    833       REAL(wp)        , DIMENSION(jpi,jpj)    ::   ztmp 
     906      REAL(wp)        , DIMENSION(idbi:idei,idbj:idej)    ::   ztmp 
    834907      !!---------------------------------------------------------------------- 
    835908 
    836909      cgrid = (/'t','u','v'/) 
     910      ihl = nn_hls 
     911      IF( PRESENT(ldxtd) ) THEN   ;   IF( ldxtd )   ihl = nn_hls + nn_hlts   ;   ENDIF 
    837912 
    838913      DO ib_bdy = 1, nb_bdy       ! Indices and directions of rim velocity components 
     
    844919         DO igrd = 1, jpbgrd  
    845920            SELECT CASE( igrd ) 
    846                CASE( 1 )   ;   zmask => pumask     ;   i_offset = 0 
    847                CASE( 2 )   ;   zmask => bdytmask   ;   i_offset = 1 
    848                CASE( 3 )   ;   zmask => pfmask     ;   i_offset = 0 
     921               CASE( 1 )   ;   zmask => pumask      ;   i_offset = 0 
     922               CASE( 2 )   ;   zmask => pbdytmask   ;   i_offset = 1 
     923               CASE( 3 )   ;   zmask => pfmask      ;   i_offset = 0 
    849924            END SELECT  
    850925            icount = 0 
     
    858933               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    859934               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    860                IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE 
     935               IF( ii == idbi .OR. ii == idei .OR. ij == idbj .OR. ij == idej )  CYCLE 
    861936               zwfl = zmask(ii+i_offset-1,ij) 
    862937               zefl = zmask(ii+i_offset  ,ij) 
     
    873948                  ' are not boundary points (flagu calculation). Check nbi, nbj, indices for boundary set ',ib_bdy 
    874949               CALL ctl_stop( ctmp1 ) 
    875             ENDIF  
     950            ENDIF 
    876951            SELECT CASE( igrd ) 
    877                CASE( 1 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. )  
    878                CASE( 2 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'U', 1. )  
    879                CASE( 3 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'V', 1. )  
    880             END SELECT  
     952               CASE( 1 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'T', 1., khlcom = ihl )  
     953               CASE( 2 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'U', 1., khlcom = ihl )  
     954               CASE( 3 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'V', 1., khlcom = ihl ) 
     955            END SELECT 
    881956            DO ib = ibeg, iend 
    882957               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    892967         DO igrd = 1, jpbgrd  
    893968            SELECT CASE( igrd ) 
    894                CASE( 1 )   ;   zmask => pvmask     ;   j_offset = 0 
    895                CASE( 2 )   ;   zmask => pfmask     ;   j_offset = 0 
    896                CASE( 3 )   ;   zmask => bdytmask   ;   j_offset = 1 
     969               CASE( 1 )   ;   zmask => pvmask      ;   j_offset = 0 
     970               CASE( 2 )   ;   zmask => pfmask      ;   j_offset = 0 
     971               CASE( 3 )   ;   zmask => pbdytmask   ;   j_offset = 1 
    897972            END SELECT  
    898973            icount = 0 
     
    906981               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    907982               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    908                IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )  CYCLE 
     983               IF( ii == idbi .OR. ii == idei .OR. ij == idbj .OR. ij == idej )  CYCLE 
    909984               zsfl = zmask(ii,ij+j_offset-1) 
    910985               znfl = zmask(ii,ij+j_offset  ) 
     
    923998            ENDIF 
    924999            SELECT CASE( igrd ) 
    925                CASE( 1 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. )  
    926                CASE( 2 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'U', 1. )  
    927                CASE( 3 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'V', 1. )  
    928             END SELECT  
     1000               CASE( 1 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'T', 1., khlcom = ihl )  
     1001               CASE( 2 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'U', 1., khlcom = ihl )  
     1002               CASE( 3 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'V', 1., khlcom = ihl )  
     1003            END SELECT 
    9291004            DO ib = ibeg, iend 
    9301005               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    9391014         DO igrd = 1, jpbgrd 
    9401015            SELECT CASE( igrd ) 
    941                CASE( 1 )   ;   zmask => bdytmask  
    942                CASE( 2 )   ;   zmask => bdyumask  
    943                CASE( 3 )   ;   zmask => bdyvmask  
     1016               CASE( 1 )   ;   zmask => pbdytmask  
     1017               CASE( 2 )   ;   zmask => pbdyumask  
     1018               CASE( 3 )   ;   zmask => pbdyvmask  
    9441019            END SELECT 
    9451020            ztmp(:,:) = -999._wp 
     
    9521027               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
    9531028               ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 
    954                IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj )   CYCLE 
     1029               IF( ii == idbi .OR. ii == idei .OR. ij == idbj .OR. ij == idej )  CYCLE 
    9551030               llnon = zmask(ii  ,ij+1) == 1.   
    9561031               llson = zmask(ii  ,ij-1) == 1.  
     
    10111086            END DO 
    10121087            SELECT CASE( igrd ) 
    1013                CASE( 1 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. )  
    1014                CASE( 2 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'U', 1. )  
    1015                CASE( 3 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'V', 1. )  
    1016             END SELECT  
     1088               CASE( 1 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'T', 1., khlcom = ihl )  
     1089               CASE( 2 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'U', 1., khlcom = ihl )  
     1090               CASE( 3 )   ;   CALL lbc_lnk( 'bdyini', ztmp, 'V', 1., khlcom = ihl )  
     1091            END SELECT 
    10171092            DO ib = ibeg, iend 
    10181093               ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 
     
    10401115      INTEGER, INTENT(  out)      ::   ii1, ij1, ii2, ij2, ii3, ij3 
    10411116      !!---------------------------------------------------------------------- 
    1042       SELECT CASE( itreat )   ! points that will be used by bdy routines, -1 will be discarded 
     1117      SELECT CASE( itreat )   ! points that will be used by bdy routines, -99 will be discarded 
    10431118         !               !               !     _____     !     _____      
    10441119         !  1 |   o      !  2  o   |     !  3 | x        !  4     x |     
    10451120         !    |_x_ _     !    _ _x_|     !    |   o      !      o   | 
    1046       CASE( 1 )    ;   ii1 = ii+1   ;   ij1 = ij+1   ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
    1047       CASE( 2 )    ;   ii1 = ii-1   ;   ij1 = ij+1   ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
    1048       CASE( 3 )    ;   ii1 = ii+1   ;   ij1 = ij-1   ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
    1049       CASE( 4 )    ;   ii1 = ii-1   ;   ij1 = ij-1   ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
     1121      CASE( 1 )    ;   ii1 = ii+1   ;   ij1 = ij+1   ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
     1122      CASE( 2 )    ;   ii1 = ii-1   ;   ij1 = ij+1   ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
     1123      CASE( 3 )    ;   ii1 = ii+1   ;   ij1 = ij-1   ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
     1124      CASE( 4 )    ;   ii1 = ii-1   ;   ij1 = ij-1   ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
    10501125         !    |          !         |     !      o        !    ______                   ! or incomplete corner 
    10511126         ! 5  | x o      ! 6   o x |     ! 7  __x__      ! 8    x                      !  7  ____ o 
    10521127         !    |          !         |     !               !      o                      !         |x___ 
    1053       CASE( 5 )    ;   ii1 = ii+1   ;   ij1 = ij     ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
    1054       CASE( 6 )    ;   ii1 = ii-1   ;   ij1 = ij     ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
    1055       CASE( 7 )    ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
    1056       CASE( 8 )    ;   ii1 = ii     ;   ij1 = ij-1   ;   ii2 = -1     ;   ij2 = -1     ;   ii3 = -1     ;   ij3 = -1 
     1128      CASE( 5 )    ;   ii1 = ii+1   ;   ij1 = ij     ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
     1129      CASE( 6 )    ;   ii1 = ii-1   ;   ij1 = ij     ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
     1130      CASE( 7 )    ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
     1131      CASE( 8 )    ;   ii1 = ii     ;   ij1 = ij-1   ;   ii2 = -99    ;   ij2 = -99    ;   ii3 = -99    ;   ij3 = -99 
    10571132         !        o      !        o      !    _____|     !       |_____   
    10581133         !  9 ____x o    ! 10   o x___   ! 11     x o    ! 12   o x       
    10591134         !         |     !       |       !        o      !        o       
    1060       CASE( 9  )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = -1     ;   ij3 = -1  
    1061       CASE( 10 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = -1     ;   ij3 = -1 
    1062       CASE( 11 )   ;   ii1 = ii     ;   ij1 = ij-1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = -1     ;   ij3 = -1 
    1063       CASE( 12 )   ;   ii1 = ii     ;   ij1 = ij-1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = -1     ;   ij3 = -1 
     1135      CASE( 9  )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = -99    ;   ij3 = -99 
     1136      CASE( 10 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = -99    ;   ij3 = -99 
     1137      CASE( 11 )   ;   ii1 = ii     ;   ij1 = ij-1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = -99    ;   ij3 = -99 
     1138      CASE( 12 )   ;   ii1 = ii     ;   ij1 = ij-1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = -99    ;   ij3 = -99 
    10641139         !    |_  o      !        o  _|  !     ¨¨|_|¨¨   !       o          
    10651140         ! 13  _| x o    !  14  o x |_   !  15  o x o    ! 16  o x o        
    10661141         !    |   o      !        o   |  !        o      !    __|¨|__  
    1067       CASE( 13 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = ii     ;   ij3 = ij-1    
    1068       CASE( 14 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = ii     ;   ij3 = ij-1  
     1142      CASE( 13 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii+1   ;   ij2 = ij     ;   ii3 = ii     ;   ij3 = ij-1  
     1143      CASE( 14 )   ;   ii1 = ii     ;   ij1 = ij+1   ;   ii2 = ii-1   ;   ij2 = ij     ;   ii3 = ii     ;   ij3 = ij-1 
    10691144      CASE( 15 )   ;   ii1 = ii-1   ;   ij1 = ij     ;   ii2 = ii     ;   ij2 = ij-1   ;   ii3 = ii+1   ;   ij3 = ij    
    10701145      CASE( 16 )   ;   ii1 = ii-1   ;   ij1 = ij     ;   ii2 = ii     ;   ij2 = ij+1   ;   ii3 = ii+1   ;   ij3 = ij 
Note: See TracChangeset for help on using the changeset viewer.