- Timestamp:
- 2012-11-26T15:22:04+01:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_LOCEAN_UKMO_CMCC_INGV_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r3424 r3666 11 11 !! 3.3 ! 2010-09 (D.Storkey) add ice boundary conditions 12 12 !! 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 13 15 !!---------------------------------------------------------------------- 14 16 #if defined key_bdy … … 76 78 CHARACTER(LEN=80),DIMENSION(jpbgrd) :: clfile 77 79 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 78 84 !! 79 85 NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file, & … … 543 549 in = mjg(1) + nlcj-1 - 1 ! if monotasking and no zoom, in=jpjm1 544 550 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 545 605 DO ib_bdy = 1, nb_bdy 546 606 DO igrd = 1, jpbgrd … … 585 645 ! ----------------------------------------------------------------- 586 646 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 587 656 DO igrd = 1, jpbgrd 588 657 icount = 0 … … 598 667 idx_bdy(ib_bdy)%nbi(icount,igrd) = nbidta(ib,igrd,ib_bdy)- mig(1)+1 599 668 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 600 682 idx_bdy(ib_bdy)%nbr(icount,igrd) = nbrdta(ib,igrd,ib_bdy) 601 683 idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 602 684 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 603 798 ENDDO 604 799 ENDDO 605 800 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 606 836 607 837 ! Compute rim weights for FRS scheme
Note: See TracChangeset
for help on using the changeset viewer.