- Timestamp:
- 2012-11-27T15:42:24+01:00 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_MERGE_2012/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r3651 r3680 12 12 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 13 13 !! 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 14 16 !!---------------------------------------------------------------------- 15 17 #if defined key_bdy … … 85 87 INTEGER, ALLOCATABLE, DIMENSION(:,:,:) :: nbrdta ! Discrete distance from rim points 86 88 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 87 93 !! 88 94 NAMELIST/nambdy/ nb_bdy, ln_coords_file, cn_coords_file, & … … 673 679 in = mjg(1) + nlcj - jpjzoom - 1 ! if monotasking and no zoom, in=jpjm1 674 680 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 675 735 DO ib_bdy = 1, nb_bdy 676 736 DO igrd = 1, jpbgrd … … 716 776 ! ----------------------------------------------------------------- 717 777 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 718 787 DO igrd = 1, jpbgrd 719 788 icount = 0 … … 734 803 idx_bdy(ib_bdy)%nbi(icount,igrd) = nbidta(ib,igrd,ib_bdy)- mig(1)+jpizoom 735 804 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 736 818 idx_bdy(ib_bdy)%nbr(icount,igrd) = nbrdta(ib,igrd,ib_bdy) 737 819 idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib 738 820 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 739 934 ENDDO 740 935 ENDDO 741 936 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 742 972 743 973 ! Compute rim weights for FRS scheme
Note: See TracChangeset
for help on using the changeset viewer.