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 3593 for branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY – NEMO

Ignore:
Timestamp:
2012-11-19T12:48:28+01:00 (12 years ago)
Author:
vichi
Message:

Add in branch 2012/dev_CMCC_2012 changes from dev_r3365_CMCC1_BDYOBCopt & dev_r3379_CMCC6_topbfm, see ticket 1002

Location:
branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90

    r3294 r3593  
    55   !!====================================================================== 
    66   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite 
     7   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    78   !!---------------------------------------------------------------------- 
    89#if defined key_bdy  
     
    5152            CYCLE 
    5253         CASE(jp_frs) 
    53             CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 
     54            CALL bdy_dyn2d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
    5455         CASE(jp_flather) 
    55             CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 
     56            CALL bdy_dyn2d_fla( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
    5657         CASE DEFAULT 
    5758            CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) 
     
    6162   END SUBROUTINE bdy_dyn2d 
    6263 
    63    SUBROUTINE bdy_dyn2d_frs( idx, dta ) 
     64   SUBROUTINE bdy_dyn2d_frs( idx, dta, ib_bdy ) 
    6465      !!---------------------------------------------------------------------- 
    6566      !!                  ***  SUBROUTINE bdy_dyn2d_frs  *** 
     
    7475      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    7576      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     77      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    7678      !! 
    7779      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    9799         pv2d(ii,ij) = ( pv2d(ii,ij) + zwgt * ( dta%v2d(jb) - pv2d(ii,ij) ) ) * vmask(ii,ij,1) 
    98100      END DO  
    99       CALL lbc_lnk( pu2d, 'U', -1. )  
    100       CALL lbc_lnk( pv2d, 'V', -1. )   ! Boundary points should be updated 
     101      CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )  
     102      CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy)   ! Boundary points should be updated 
    101103      ! 
    102104      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_frs') 
     
    106108 
    107109 
    108    SUBROUTINE bdy_dyn2d_fla( idx, dta ) 
     110   SUBROUTINE bdy_dyn2d_fla( idx, dta, ib_bdy ) 
    109111      !!---------------------------------------------------------------------- 
    110112      !!                 ***  SUBROUTINE bdy_dyn2d_fla  *** 
     
    127129      TYPE(OBC_INDEX),              INTENT(in) ::   idx  ! OBC indices 
    128130      TYPE(OBC_DATA),               INTENT(in) ::   dta  ! OBC external data 
     131      INTEGER,                      INTENT(in) ::   ib_bdy  ! BDY set index 
    129132 
    130133      INTEGER  ::   jb, igrd                         ! dummy loop indices 
     
    177180         pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 
    178181      END DO 
    179       CALL lbc_lnk( pu2d, 'U', -1. )   ! Boundary points should be updated 
    180       CALL lbc_lnk( pv2d, 'V', -1. )   ! 
     182      CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
     183      CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy )   ! 
    181184      ! 
    182185      IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_fla') 
  • branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90

    r3294 r3593  
    55   !!====================================================================== 
    66   !! History :  3.4  !  2011     (D. Storkey) new module as part of BDY rewrite  
     7   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    78   !!---------------------------------------------------------------------- 
    89#if defined key_bdy  
     
    5455            CYCLE 
    5556         CASE(jp_frs) 
    56             CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
     57            CALL bdy_dyn3d_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    5758         CASE DEFAULT 
    5859            CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 
     
    6263   END SUBROUTINE bdy_dyn3d 
    6364 
    64    SUBROUTINE bdy_dyn3d_frs( idx, dta, kt ) 
     65   SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) 
    6566      !!---------------------------------------------------------------------- 
    6667      !!                  ***  SUBROUTINE bdy_dyn3d_frs  *** 
     
    7677      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    7778      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     79      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    7880      !! 
    7981      INTEGER  ::   jb, jk         ! dummy loop indices 
     
    103105         END DO 
    104106      END DO  
    105       CALL lbc_lnk( ua, 'U', -1. )   ;   CALL lbc_lnk( va, 'V', -1. )   ! Boundary points should be updated 
     107      CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy )   ;   CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy )   ! Boundary points should be updated 
    106108      ! 
    107109      IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
  • branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim2.F90

    r3347 r3593  
    66   !!  History :  3.3  !  2010-09 (D. Storkey)  Original code 
    77   !!             3.4  !  2011    (D. Storkey) rewrite in preparation for OBC-BDY merge 
     8   !!             3.5  !  2012    (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    89   !!---------------------------------------------------------------------- 
    910#if defined   key_bdy   &&   defined key_lim2 
     
    5354            CYCLE 
    5455         CASE(jp_frs) 
    55             CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy) ) 
     56            CALL bdy_ice_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy ) 
    5657         CASE DEFAULT 
    5758            CALL ctl_stop( 'bdy_ice_lim_2 : unrecognised option for open boundaries for ice fields' ) 
     
    6162   END SUBROUTINE bdy_ice_lim_2 
    6263 
    63    SUBROUTINE bdy_ice_frs( idx, dta ) 
     64   SUBROUTINE bdy_ice_frs( idx, dta, ib_bdy ) 
    6465      !!------------------------------------------------------------------------------ 
    6566      !!                 ***  SUBROUTINE bdy_ice_frs  *** 
     
    7374      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    7475      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     76      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    7577      !! 
    7678      INTEGER  ::   jb, jk, jgrd   ! dummy loop indices 
     
    9496         END DO 
    9597      END DO  
    96       CALL lbc_lnk( frld, 'T', 1. )                                         ! lateral boundary conditions 
    97       CALL lbc_lnk( hicif, 'T', 1. )   ;   CALL lbc_lnk( hsnif, 'T', 1. ) 
     98      CALL lbc_bdy_lnk( frld, 'T', 1., ib_bdy )                                         ! lateral boundary conditions 
     99      CALL lbc_bdy_lnk( hicif, 'T', 1., ib_bdy )   ;   CALL lbc_bdy_lnk( hsnif, 'T', 1., ib_bdy ) 
    98100      !       
    99101      IF( nn_timing == 1 ) CALL timing_stop('bdy_ice_frs') 
  • branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r3424 r3593  
    1111   !!            3.3  !  2010-09  (D.Storkey) add ice boundary conditions 
    1212   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
     13   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Updates for the  
     14   !!                             optimization of BDY communications 
    1315   !!---------------------------------------------------------------------- 
    1416#if defined key_bdy 
     
    7678      CHARACTER(LEN=80),DIMENSION(jpbgrd)  ::   clfile 
    7779      CHARACTER(LEN=1),DIMENSION(jpbgrd)   ::   cgrid 
     80      INTEGER :: com_east, com_west, com_south, com_north          ! Flags for boundaries sending 
     81      INTEGER :: com_east_b, com_west_b, com_south_b, com_north_b  ! Flags for boundaries receiving 
     82      INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4)                ! Arrays for neighbours coordinates 
     83 
    7884      !! 
    7985      NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file,             & 
     
    543549      in = mjg(1) + nlcj-1 - 1   ! if monotasking and no zoom, in=jpjm1 
    544550 
     551      ALLOCATE( nbondi_bdy(nb_bdy)) 
     552      ALLOCATE( nbondj_bdy(nb_bdy)) 
     553      nbondi_bdy(:)=2 
     554      nbondj_bdy(:)=2 
     555      ALLOCATE( nbondi_bdy_b(nb_bdy)) 
     556      ALLOCATE( nbondj_bdy_b(nb_bdy)) 
     557      nbondi_bdy_b(:)=2 
     558      nbondj_bdy_b(:)=2 
     559 
     560      ! Work out dimensions of boundary data on each neighbour process 
     561      IF(nbondi .eq. 0) THEN 
     562         iw_b(1) = jpizoom + nimppt(nowe+1) 
     563         ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 
     564         is_b(1) = jpjzoom + njmppt(nowe+1) 
     565         in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 
     566 
     567         iw_b(2) = jpizoom + nimppt(noea+1) 
     568         ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 
     569         is_b(2) = jpjzoom + njmppt(noea+1) 
     570         in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 
     571      ELSEIF(nbondi .eq. 1) THEN 
     572         iw_b(1) = jpizoom + nimppt(nowe+1) 
     573         ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 
     574         is_b(1) = jpjzoom + njmppt(nowe+1) 
     575         in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 
     576      ELSEIF(nbondi .eq. -1) THEN 
     577         iw_b(2) = jpizoom + nimppt(noea+1) 
     578         ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 
     579         is_b(2) = jpjzoom + njmppt(noea+1) 
     580         in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 
     581      ENDIF 
     582 
     583      IF(nbondj .eq. 0) THEN 
     584         iw_b(3) = jpizoom + nimppt(noso+1) 
     585         ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 
     586         is_b(3) = jpjzoom + njmppt(noso+1) 
     587         in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 
     588 
     589         iw_b(4) = jpizoom + nimppt(nono+1) 
     590         ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 
     591         is_b(4) = jpjzoom + njmppt(nono+1) 
     592         in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 
     593      ELSEIF(nbondj .eq. 1) THEN 
     594         iw_b(3) = jpizoom + nimppt(noso+1) 
     595         ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 
     596         is_b(3) = jpjzoom + njmppt(noso+1) 
     597         in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 
     598      ELSEIF(nbondj .eq. -1) THEN 
     599         iw_b(4) = jpizoom + nimppt(nono+1) 
     600         ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 
     601         is_b(4) = jpjzoom + njmppt(nono+1) 
     602         in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 
     603      ENDIF 
     604 
    545605      DO ib_bdy = 1, nb_bdy 
    546606         DO igrd = 1, jpbgrd 
     
    585645         ! ----------------------------------------------------------------- 
    586646 
     647         com_east = 0 
     648         com_west = 0 
     649         com_south = 0 
     650         com_north = 0 
     651 
     652         com_east_b = 0 
     653         com_west_b = 0 
     654         com_south_b = 0 
     655         com_north_b = 0 
    587656         DO igrd = 1, jpbgrd 
    588657            icount  = 0 
     
    598667                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- mig(1)+1 
    599668                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- mjg(1)+1 
     669                     ! check if point has to be sent 
     670                     ii = idx_bdy(ib_bdy)%nbi(icount,igrd) 
     671                     ij = idx_bdy(ib_bdy)%nbj(icount,igrd) 
     672                     if((com_east .ne. 1) .and. (ii .eq. (nlci-1)) .and. (nbondi .le. 0)) then 
     673                        com_east = 1 
     674                     elseif((com_west .ne. 1) .and. (ii .eq. 2) .and. (nbondi .ge. 0) .and. (nbondi .ne. 2)) then 
     675                        com_west = 1 
     676                     endif  
     677                     if((com_south .ne. 1) .and. (ij .eq. 2) .and. (nbondj .ge. 0) .and. (nbondj .ne. 2)) then 
     678                        com_south = 1 
     679                     elseif((com_north .ne. 1) .and. (ij .eq. (nlcj-1)) .and. (nbondj .le. 0)) then 
     680                        com_north = 1 
     681                     endif  
    600682                     idx_bdy(ib_bdy)%nbr(icount,igrd)   = nbrdta(ib,igrd,ib_bdy) 
    601683                     idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 
    602684                  ENDIF 
     685                  ! check if point has to be received from a neighbour 
     686                  IF(nbondi .eq. 0) THEN 
     687                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND.   & 
     688                       & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND.   & 
     689                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     690                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 
     691                       if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then 
     692                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 
     693                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     694                            com_south = 1 
     695                          elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     696                            com_north = 1 
     697                          endif 
     698                          com_west_b = 1 
     699                       endif  
     700                     ENDIF 
     701                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND.   & 
     702                       & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND.   & 
     703                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     704                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 
     705                       if((com_east_b .ne. 1) .and. (ii .eq. 2)) then 
     706                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 
     707                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     708                            com_south = 1 
     709                          elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     710                            com_north = 1 
     711                          endif 
     712                          com_east_b = 1 
     713                       endif  
     714                     ENDIF 
     715                  ELSEIF(nbondi .eq. 1) THEN 
     716                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND.   & 
     717                       & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND.   & 
     718                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     719                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 
     720                       if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then 
     721                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 
     722                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     723                            com_south = 1 
     724                          elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     725                            com_north = 1 
     726                          endif 
     727                          com_west_b = 1 
     728                       endif  
     729                     ENDIF 
     730                  ELSEIF(nbondi .eq. -1) THEN 
     731                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND.   & 
     732                       & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND.   & 
     733                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     734                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 
     735                       if((com_east_b .ne. 1) .and. (ii .eq. 2)) then 
     736                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 
     737                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     738                            com_south = 1 
     739                          elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     740                            com_north = 1 
     741                          endif 
     742                          com_east_b = 1 
     743                       endif  
     744                     ENDIF 
     745                  ENDIF 
     746                  IF(nbondj .eq. 0) THEN 
     747                     IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1 .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. & 
     748                       & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     749                       com_north_b = 1  
     750                     ENDIF 
     751                     IF(com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1 .OR. nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. & 
     752                       & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     753                       com_south_b = 1  
     754                     ENDIF 
     755                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND.   & 
     756                       & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND.   & 
     757                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     758                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 
     759                       if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then 
     760                          com_south_b = 1 
     761                       endif  
     762                     ENDIF 
     763                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND.   & 
     764                       & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND.   & 
     765                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     766                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 
     767                       if((com_north_b .ne. 1) .and. (ij .eq. 2)) then 
     768                          com_north_b = 1 
     769                       endif  
     770                     ENDIF 
     771                  ELSEIF(nbondj .eq. 1) THEN 
     772                     IF(com_south_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(3)-1 .OR. nbidta(ib,igrd,ib_bdy) == ie_b(3)+1) .AND. & 
     773                       & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     774                       com_south_b = 1  
     775                     ENDIF 
     776                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND.   & 
     777                       & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND.   & 
     778                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     779                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 
     780                       if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then 
     781                          com_south_b = 1 
     782                       endif  
     783                     ENDIF 
     784                  ELSEIF(nbondj .eq. -1) THEN 
     785                     IF(com_north_b .ne. 1 .AND. (nbidta(ib,igrd,ib_bdy) == iw_b(4)-1 .OR. nbidta(ib,igrd,ib_bdy) == ie_b(4)+1) .AND. & 
     786                       & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     787                       com_north_b = 1  
     788                     ENDIF 
     789                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND.   & 
     790                       & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND.   & 
     791                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     792                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 
     793                       if((com_north_b .ne. 1) .and. (ij .eq. 2)) then 
     794                          com_north_b = 1 
     795                       endif  
     796                     ENDIF 
     797                  ENDIF 
    603798               ENDDO 
    604799            ENDDO 
    605800         ENDDO  
     801         ! definition of the i- and j- direction local boundaries arrays 
     802         ! used for sending the boudaries 
     803         IF((com_east .eq. 1) .and. (com_west .eq. 1)) THEN 
     804            nbondi_bdy(ib_bdy) = 0 
     805         ELSEIF ((com_east .eq. 1) .and. (com_west .eq. 0)) THEN 
     806            nbondi_bdy(ib_bdy) = -1 
     807         ELSEIF ((com_east .eq. 0) .and. (com_west .eq. 1)) THEN 
     808            nbondi_bdy(ib_bdy) = 1 
     809         ENDIF 
     810 
     811         IF((com_north .eq. 1) .and. (com_south .eq. 1)) THEN 
     812            nbondj_bdy(ib_bdy) = 0 
     813         ELSEIF ((com_north .eq. 1) .and. (com_south .eq. 0)) THEN 
     814            nbondj_bdy(ib_bdy) = -1 
     815         ELSEIF ((com_north .eq. 0) .and. (com_south .eq. 1)) THEN 
     816            nbondj_bdy(ib_bdy) = 1 
     817         ENDIF 
     818 
     819         ! definition of the i- and j- direction local boundaries arrays 
     820         ! used for receiving the boudaries 
     821         IF((com_east_b .eq. 1) .and. (com_west_b .eq. 1)) THEN 
     822            nbondi_bdy_b(ib_bdy) = 0 
     823         ELSEIF ((com_east_b .eq. 1) .and. (com_west_b .eq. 0)) THEN 
     824            nbondi_bdy_b(ib_bdy) = -1 
     825         ELSEIF ((com_east_b .eq. 0) .and. (com_west_b .eq. 1)) THEN 
     826            nbondi_bdy_b(ib_bdy) = 1 
     827         ENDIF 
     828 
     829         IF((com_north_b .eq. 1) .and. (com_south_b .eq. 1)) THEN 
     830            nbondj_bdy_b(ib_bdy) = 0 
     831         ELSEIF ((com_north_b .eq. 1) .and. (com_south_b .eq. 0)) THEN 
     832            nbondj_bdy_b(ib_bdy) = -1 
     833         ELSEIF ((com_north_b .eq. 0) .and. (com_south_b .eq. 1)) THEN 
     834            nbondj_bdy_b(ib_bdy) = 1 
     835         ENDIF 
    606836 
    607837         ! Compute rim weights for FRS scheme 
  • branches/2012/dev_CMCC_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdytra.F90

    r3294 r3593  
    77   !!            3.0  !  2008-04  (NEMO team)  add in the reference version 
    88   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
     9   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Optimization of BDY communications 
    910   !!---------------------------------------------------------------------- 
    1011#if defined key_bdy 
     
    5253            CYCLE 
    5354         CASE(jp_frs) 
    54             CALL bdy_tra_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt ) 
     55            CALL bdy_tra_frs( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 
    5556         CASE DEFAULT 
    5657            CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 
     
    6061   END SUBROUTINE bdy_tra 
    6162 
    62    SUBROUTINE bdy_tra_frs( idx, dta, kt ) 
     63   SUBROUTINE bdy_tra_frs( idx, dta, kt, ib_bdy ) 
    6364      !!---------------------------------------------------------------------- 
    6465      !!                 ***  SUBROUTINE bdy_tra_frs  *** 
     
    7172      TYPE(OBC_INDEX), INTENT(in) ::   idx  ! OBC indices 
    7273      TYPE(OBC_DATA),  INTENT(in) ::   dta  ! OBC external data 
     74      INTEGER,         INTENT(in) ::   ib_bdy  ! BDY set index 
    7375      !!  
    7476      REAL(wp) ::   zwgt           ! boundary weight 
     
    8991         END DO 
    9092      END DO  
    91       ! 
    92       CALL lbc_lnk( tsa(:,:,:,jp_tem), 'T', 1. )   ; CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1. )    ! Boundary points should be updated 
     93      CALL lbc_bdy_lnk( tsa(:,:,:,jp_tem), 'T', 1., ib_bdy )   ; CALL lbc_bdy_lnk( tsa(:,:,:,jp_sal), 'T', 1., ib_bdy )    ! Boundary points should be updated 
    9394      ! 
    9495      IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 
Note: See TracChangeset for help on using the changeset viewer.