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 3680 for branches/2012/dev_MERGE_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90 – NEMO

Ignore:
Timestamp:
2012-11-27T15:42:24+01:00 (12 years ago)
Author:
rblod
Message:

First commit of the final branch for 2012 (future nemo_3_5), see ticket #1028

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_MERGE_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90

    r3651 r3680  
    1212   !!            3.4  !  2011     (D. Storkey) rewrite in preparation for OBC-BDY merge 
    1313   !!            3.4  !  2012     (J. Chanut) straight open boundary case update 
     14   !!            3.5  !  2012     (S. Mocavero, I. Epicoco) Updates for the  
     15   !!                             optimization of BDY communications 
    1416   !!---------------------------------------------------------------------- 
    1517#if defined key_bdy 
     
    8587      INTEGER, ALLOCATABLE, DIMENSION(:,:,:)  ::   nbrdta           ! Discrete distance from rim points 
    8688      CHARACTER(LEN=1),DIMENSION(jpbgrd)      ::   cgrid 
     89      INTEGER :: com_east, com_west, com_south, com_north          ! Flags for boundaries sending 
     90      INTEGER :: com_east_b, com_west_b, com_south_b, com_north_b  ! Flags for boundaries receiving 
     91      INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4)                ! Arrays for neighbours coordinates 
     92 
    8793      !! 
    8894      NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file,             & 
     
    673679      in = mjg(1) + nlcj - jpjzoom - 1  ! if monotasking and no zoom, in=jpjm1 
    674680 
     681      ALLOCATE( nbondi_bdy(nb_bdy)) 
     682      ALLOCATE( nbondj_bdy(nb_bdy)) 
     683      nbondi_bdy(:)=2 
     684      nbondj_bdy(:)=2 
     685      ALLOCATE( nbondi_bdy_b(nb_bdy)) 
     686      ALLOCATE( nbondj_bdy_b(nb_bdy)) 
     687      nbondi_bdy_b(:)=2 
     688      nbondj_bdy_b(:)=2 
     689 
     690      ! Work out dimensions of boundary data on each neighbour process 
     691      IF(nbondi .eq. 0) THEN 
     692         iw_b(1) = jpizoom + nimppt(nowe+1) 
     693         ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 
     694         is_b(1) = jpjzoom + njmppt(nowe+1) 
     695         in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 
     696 
     697         iw_b(2) = jpizoom + nimppt(noea+1) 
     698         ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 
     699         is_b(2) = jpjzoom + njmppt(noea+1) 
     700         in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 
     701      ELSEIF(nbondi .eq. 1) THEN 
     702         iw_b(1) = jpizoom + nimppt(nowe+1) 
     703         ie_b(1) = jpizoom + nimppt(nowe+1)+nlcit(nowe+1)-3 
     704         is_b(1) = jpjzoom + njmppt(nowe+1) 
     705         in_b(1) = jpjzoom + njmppt(nowe+1)+nlcjt(nowe+1)-3 
     706      ELSEIF(nbondi .eq. -1) THEN 
     707         iw_b(2) = jpizoom + nimppt(noea+1) 
     708         ie_b(2) = jpizoom + nimppt(noea+1)+nlcit(noea+1)-3 
     709         is_b(2) = jpjzoom + njmppt(noea+1) 
     710         in_b(2) = jpjzoom + njmppt(noea+1)+nlcjt(noea+1)-3 
     711      ENDIF 
     712 
     713      IF(nbondj .eq. 0) THEN 
     714         iw_b(3) = jpizoom + nimppt(noso+1) 
     715         ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 
     716         is_b(3) = jpjzoom + njmppt(noso+1) 
     717         in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 
     718 
     719         iw_b(4) = jpizoom + nimppt(nono+1) 
     720         ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 
     721         is_b(4) = jpjzoom + njmppt(nono+1) 
     722         in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 
     723      ELSEIF(nbondj .eq. 1) THEN 
     724         iw_b(3) = jpizoom + nimppt(noso+1) 
     725         ie_b(3) = jpizoom + nimppt(noso+1)+nlcit(noso+1)-3 
     726         is_b(3) = jpjzoom + njmppt(noso+1) 
     727         in_b(3) = jpjzoom + njmppt(noso+1)+nlcjt(noso+1)-3 
     728      ELSEIF(nbondj .eq. -1) THEN 
     729         iw_b(4) = jpizoom + nimppt(nono+1) 
     730         ie_b(4) = jpizoom + nimppt(nono+1)+nlcit(nono+1)-3 
     731         is_b(4) = jpjzoom + njmppt(nono+1) 
     732         in_b(4) = jpjzoom + njmppt(nono+1)+nlcjt(nono+1)-3 
     733      ENDIF 
     734 
    675735      DO ib_bdy = 1, nb_bdy 
    676736         DO igrd = 1, jpbgrd 
     
    716776         ! ----------------------------------------------------------------- 
    717777 
     778         com_east = 0 
     779         com_west = 0 
     780         com_south = 0 
     781         com_north = 0 
     782 
     783         com_east_b = 0 
     784         com_west_b = 0 
     785         com_south_b = 0 
     786         com_north_b = 0 
    718787         DO igrd = 1, jpbgrd 
    719788            icount  = 0 
     
    734803                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy)- mig(1)+jpizoom 
    735804                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy)- mjg(1)+jpjzoom 
     805                     ! check if point has to be sent 
     806                     ii = idx_bdy(ib_bdy)%nbi(icount,igrd) 
     807                     ij = idx_bdy(ib_bdy)%nbj(icount,igrd) 
     808                     if((com_east .ne. 1) .and. (ii .eq. (nlci-1)) .and. (nbondi .le. 0)) then 
     809                        com_east = 1 
     810                     elseif((com_west .ne. 1) .and. (ii .eq. 2) .and. (nbondi .ge. 0) .and. (nbondi .ne. 2)) then 
     811                        com_west = 1 
     812                     endif  
     813                     if((com_south .ne. 1) .and. (ij .eq. 2) .and. (nbondj .ge. 0) .and. (nbondj .ne. 2)) then 
     814                        com_south = 1 
     815                     elseif((com_north .ne. 1) .and. (ij .eq. (nlcj-1)) .and. (nbondj .le. 0)) then 
     816                        com_north = 1 
     817                     endif  
    736818                     idx_bdy(ib_bdy)%nbr(icount,igrd)   = nbrdta(ib,igrd,ib_bdy) 
    737819                     idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 
    738820                  ENDIF 
     821                  ! check if point has to be received from a neighbour 
     822                  IF(nbondi .eq. 0) THEN 
     823                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND.   & 
     824                       & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND.   & 
     825                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     826                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 
     827                       if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then 
     828                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 
     829                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     830                            com_south = 1 
     831                          elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     832                            com_north = 1 
     833                          endif 
     834                          com_west_b = 1 
     835                       endif  
     836                     ENDIF 
     837                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND.   & 
     838                       & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND.   & 
     839                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     840                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 
     841                       if((com_east_b .ne. 1) .and. (ii .eq. 2)) then 
     842                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 
     843                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     844                            com_south = 1 
     845                          elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     846                            com_north = 1 
     847                          endif 
     848                          com_east_b = 1 
     849                       endif  
     850                     ENDIF 
     851                  ELSEIF(nbondi .eq. 1) THEN 
     852                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(1) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(1) .AND.   & 
     853                       & nbjdta(ib,igrd,ib_bdy) >= is_b(1) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(1) .AND.   & 
     854                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     855                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(1)+2 
     856                       if((com_west_b .ne. 1) .and. (ii .eq. (nlcit(nowe+1)-1))) then 
     857                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(1)+2 
     858                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     859                            com_south = 1 
     860                          elseif((ij .eq. nlcjt(nowe+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     861                            com_north = 1 
     862                          endif 
     863                          com_west_b = 1 
     864                       endif  
     865                     ENDIF 
     866                  ELSEIF(nbondi .eq. -1) THEN 
     867                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(2) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(2) .AND.   & 
     868                       & nbjdta(ib,igrd,ib_bdy) >= is_b(2) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(2) .AND.   & 
     869                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     870                       ii = nbidta(ib,igrd,ib_bdy)- iw_b(2)+2 
     871                       if((com_east_b .ne. 1) .and. (ii .eq. 2)) then 
     872                          ij = nbjdta(ib,igrd,ib_bdy) - is_b(2)+2 
     873                          if((ij .eq. 2) .and. (nbondj .eq. 0 .or. nbondj .eq. 1)) then 
     874                            com_south = 1 
     875                          elseif((ij .eq. nlcjt(noea+1)-1) .and. (nbondj .eq. 0 .or. nbondj .eq. -1)) then 
     876                            com_north = 1 
     877                          endif 
     878                          com_east_b = 1 
     879                       endif  
     880                     ENDIF 
     881                  ENDIF 
     882                  IF(nbondj .eq. 0) THEN 
     883                     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. & 
     884                       & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     885                       com_north_b = 1  
     886                     ENDIF 
     887                     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. & 
     888                       & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     889                       com_south_b = 1  
     890                     ENDIF 
     891                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND.   & 
     892                       & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND.   & 
     893                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     894                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 
     895                       if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then 
     896                          com_south_b = 1 
     897                       endif  
     898                     ENDIF 
     899                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND.   & 
     900                       & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND.   & 
     901                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     902                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 
     903                       if((com_north_b .ne. 1) .and. (ij .eq. 2)) then 
     904                          com_north_b = 1 
     905                       endif  
     906                     ENDIF 
     907                  ELSEIF(nbondj .eq. 1) THEN 
     908                     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. & 
     909                       & nbjdta(ib,igrd,ib_bdy) == in_b(3) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     910                       com_south_b = 1  
     911                     ENDIF 
     912                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(3) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(3) .AND.   & 
     913                       & nbjdta(ib,igrd,ib_bdy) >= is_b(3) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(3) .AND.   & 
     914                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     915                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(3)+2 
     916                       if((com_south_b .ne. 1) .and. (ij .eq. (nlcjt(noso+1)-1))) then 
     917                          com_south_b = 1 
     918                       endif  
     919                     ENDIF 
     920                  ELSEIF(nbondj .eq. -1) THEN 
     921                     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. & 
     922                       & nbjdta(ib,igrd,ib_bdy) == is_b(4) .AND. nbrdta(ib,igrd,ib_bdy) == ir) THEN 
     923                       com_north_b = 1  
     924                     ENDIF 
     925                     IF( nbidta(ib,igrd,ib_bdy) >= iw_b(4) .AND. nbidta(ib,igrd,ib_bdy) <= ie_b(4) .AND.   & 
     926                       & nbjdta(ib,igrd,ib_bdy) >= is_b(4) .AND. nbjdta(ib,igrd,ib_bdy) <= in_b(4) .AND.   & 
     927                       & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN 
     928                       ij = nbjdta(ib,igrd,ib_bdy)- is_b(4)+2 
     929                       if((com_north_b .ne. 1) .and. (ij .eq. 2)) then 
     930                          com_north_b = 1 
     931                       endif  
     932                     ENDIF 
     933                  ENDIF 
    739934               ENDDO 
    740935            ENDDO 
    741936         ENDDO  
     937         ! definition of the i- and j- direction local boundaries arrays 
     938         ! used for sending the boudaries 
     939         IF((com_east .eq. 1) .and. (com_west .eq. 1)) THEN 
     940            nbondi_bdy(ib_bdy) = 0 
     941         ELSEIF ((com_east .eq. 1) .and. (com_west .eq. 0)) THEN 
     942            nbondi_bdy(ib_bdy) = -1 
     943         ELSEIF ((com_east .eq. 0) .and. (com_west .eq. 1)) THEN 
     944            nbondi_bdy(ib_bdy) = 1 
     945         ENDIF 
     946 
     947         IF((com_north .eq. 1) .and. (com_south .eq. 1)) THEN 
     948            nbondj_bdy(ib_bdy) = 0 
     949         ELSEIF ((com_north .eq. 1) .and. (com_south .eq. 0)) THEN 
     950            nbondj_bdy(ib_bdy) = -1 
     951         ELSEIF ((com_north .eq. 0) .and. (com_south .eq. 1)) THEN 
     952            nbondj_bdy(ib_bdy) = 1 
     953         ENDIF 
     954 
     955         ! definition of the i- and j- direction local boundaries arrays 
     956         ! used for receiving the boudaries 
     957         IF((com_east_b .eq. 1) .and. (com_west_b .eq. 1)) THEN 
     958            nbondi_bdy_b(ib_bdy) = 0 
     959         ELSEIF ((com_east_b .eq. 1) .and. (com_west_b .eq. 0)) THEN 
     960            nbondi_bdy_b(ib_bdy) = -1 
     961         ELSEIF ((com_east_b .eq. 0) .and. (com_west_b .eq. 1)) THEN 
     962            nbondi_bdy_b(ib_bdy) = 1 
     963         ENDIF 
     964 
     965         IF((com_north_b .eq. 1) .and. (com_south_b .eq. 1)) THEN 
     966            nbondj_bdy_b(ib_bdy) = 0 
     967         ELSEIF ((com_north_b .eq. 1) .and. (com_south_b .eq. 0)) THEN 
     968            nbondj_bdy_b(ib_bdy) = -1 
     969         ELSEIF ((com_north_b .eq. 0) .and. (com_south_b .eq. 1)) THEN 
     970            nbondj_bdy_b(ib_bdy) = 1 
     971         ENDIF 
    742972 
    743973         ! Compute rim weights for FRS scheme 
Note: See TracChangeset for help on using the changeset viewer.