Changeset 3592
- Timestamp:
- 2012-11-19T12:39:00+01:00 (12 years ago)
- Location:
- branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM
- Files:
-
- 4 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn2d.F90
r3294 r3592 5 5 !!====================================================================== 6 6 !! 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 7 8 !!---------------------------------------------------------------------- 8 9 #if defined key_bdy … … 51 52 CYCLE 52 53 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 ) 54 55 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 ) 56 57 CASE DEFAULT 57 58 CALL ctl_stop( 'bdy_dyn2d : unrecognised option for open boundaries for barotropic variables' ) … … 61 62 END SUBROUTINE bdy_dyn2d 62 63 63 SUBROUTINE bdy_dyn2d_frs( idx, dta )64 SUBROUTINE bdy_dyn2d_frs( idx, dta, ib_bdy ) 64 65 !!---------------------------------------------------------------------- 65 66 !! *** SUBROUTINE bdy_dyn2d_frs *** … … 74 75 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 75 76 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 77 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 76 78 !! 77 79 INTEGER :: jb, jk ! dummy loop indices … … 97 99 pv2d(ii,ij) = ( pv2d(ii,ij) + zwgt * ( dta%v2d(jb) - pv2d(ii,ij) ) ) * vmask(ii,ij,1) 98 100 END DO 99 CALL lbc_ lnk( pu2d, 'U', -1.)100 CALL lbc_ lnk( pv2d, 'V', -1.) ! Boundary points should be updated101 CALL lbc_bdy_lnk( pu2d, 'U', -1., ib_bdy ) 102 CALL lbc_bdy_lnk( pv2d, 'V', -1., ib_bdy) ! Boundary points should be updated 101 103 ! 102 104 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_frs') … … 106 108 107 109 108 SUBROUTINE bdy_dyn2d_fla( idx, dta )110 SUBROUTINE bdy_dyn2d_fla( idx, dta, ib_bdy ) 109 111 !!---------------------------------------------------------------------- 110 112 !! *** SUBROUTINE bdy_dyn2d_fla *** … … 127 129 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 128 130 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 131 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 129 132 130 133 INTEGER :: jb, igrd ! dummy loop indices … … 177 180 pv2d(ii,ij) = zforc + zcorr * vmask(ii,ij,1) 178 181 END DO 179 CALL lbc_ lnk( pu2d, 'U', -1.) ! Boundary points should be updated180 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 ) ! 181 184 ! 182 185 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn2d_fla') -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90
r3294 r3592 5 5 !!====================================================================== 6 6 !! 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 7 8 !!---------------------------------------------------------------------- 8 9 #if defined key_bdy … … 54 55 CYCLE 55 56 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 ) 57 58 CASE DEFAULT 58 59 CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) … … 62 63 END SUBROUTINE bdy_dyn3d 63 64 64 SUBROUTINE bdy_dyn3d_frs( idx, dta, kt )65 SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy ) 65 66 !!---------------------------------------------------------------------- 66 67 !! *** SUBROUTINE bdy_dyn3d_frs *** … … 76 77 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 77 78 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 79 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 78 80 !! 79 81 INTEGER :: jb, jk ! dummy loop indices … … 103 105 END DO 104 106 END DO 105 CALL lbc_ lnk( ua, 'U', -1. ) ; CALL lbc_lnk( va, 'V', -1.) ! Boundary points should be updated107 CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy ) ; CALL lbc_bdy_lnk( va, 'V', -1.,ib_bdy ) ! Boundary points should be updated 106 108 ! 107 109 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/BDY/bdyice_lim2.F90
r3347 r3592 6 6 !! History : 3.3 ! 2010-09 (D. Storkey) Original code 7 7 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 8 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications 8 9 !!---------------------------------------------------------------------- 9 10 #if defined key_bdy && defined key_lim2 … … 53 54 CYCLE 54 55 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 ) 56 57 CASE DEFAULT 57 58 CALL ctl_stop( 'bdy_ice_lim_2 : unrecognised option for open boundaries for ice fields' ) … … 61 62 END SUBROUTINE bdy_ice_lim_2 62 63 63 SUBROUTINE bdy_ice_frs( idx, dta )64 SUBROUTINE bdy_ice_frs( idx, dta, ib_bdy ) 64 65 !!------------------------------------------------------------------------------ 65 66 !! *** SUBROUTINE bdy_ice_frs *** … … 73 74 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 74 75 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 76 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 75 77 !! 76 78 INTEGER :: jb, jk, jgrd ! dummy loop indices … … 94 96 END DO 95 97 END DO 96 CALL lbc_ lnk( frld, 'T', 1.) ! lateral boundary conditions97 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 ) 98 100 ! 99 101 IF( nn_timing == 1 ) CALL timing_stop('bdy_ice_frs') -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/BDY/bdyini.F90
r3298 r3592 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 … … 34 36 !!---------------------------------------------------------------------- 35 37 !! NEMO/OPA 4.0 , NEMO Consortium (2011) 36 !! $Id $38 !! $Id: bdyini.F90 3298 2012-02-07 17:12:09Z cbricaud $ 37 39 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 38 40 !!---------------------------------------------------------------------- … … 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 -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/BDY/bdytra.F90
r3294 r3592 7 7 !! 3.0 ! 2008-04 (NEMO team) add in the reference version 8 8 !! 3.4 ! 2011 (D. Storkey) rewrite in preparation for OBC-BDY merge 9 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications 9 10 !!---------------------------------------------------------------------- 10 11 #if defined key_bdy … … 30 31 !!---------------------------------------------------------------------- 31 32 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 32 !! $Id $33 !! $Id: bdytra.F90 3294 2012-01-28 16:44:18Z rblod $ 33 34 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 34 35 !!---------------------------------------------------------------------- … … 52 53 CYCLE 53 54 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 ) 55 56 CASE DEFAULT 56 57 CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) … … 60 61 END SUBROUTINE bdy_tra 61 62 62 SUBROUTINE bdy_tra_frs( idx, dta, kt )63 SUBROUTINE bdy_tra_frs( idx, dta, kt, ib_bdy ) 63 64 !!---------------------------------------------------------------------- 64 65 !! *** SUBROUTINE bdy_tra_frs *** … … 71 72 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 72 73 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 74 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 73 75 !! 74 76 REAL(wp) :: zwgt ! boundary weight … … 89 91 END DO 90 92 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 93 94 ! 94 95 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90
r3294 r3592 8 8 !! 3.3 ! 2010-11 (G. Madec) add mbk. arrays associated to the deepest ocean level 9 9 !! 4.0 ! 2011-01 (A. R. Porter, STFC Daresbury) dynamical allocation 10 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Add arrays associated 11 !! to the optimization of BDY communications 10 12 !!---------------------------------------------------------------------- 11 13 … … 81 83 INTEGER, PUBLIC :: narea !: number for local area 82 84 INTEGER, PUBLIC :: nbondi, nbondj !: mark of i- and j-direction local boundaries 85 INTEGER, ALLOCATABLE, PUBLIC :: nbondi_bdy(:) !: mark i-direction local boundaries for BDY open boundaries 86 INTEGER, ALLOCATABLE, PUBLIC :: nbondj_bdy(:) !: mark j-direction local boundaries for BDY open boundaries 87 INTEGER, ALLOCATABLE, PUBLIC :: nbondi_bdy_b(:) !: mark i-direction of neighbours local boundaries for BDY open boundaries 88 INTEGER, ALLOCATABLE, PUBLIC :: nbondj_bdy_b(:) !: mark j-direction of neighbours local boundaries for BDY open boundaries 89 83 90 INTEGER, PUBLIC :: npolj !: north fold mark (0, 3 or 4) 84 91 INTEGER, PUBLIC :: nlci, nldi, nlei !: i-dimensions of the local subdomain and its first and last indoor indices … … 237 244 !!---------------------------------------------------------------------- 238 245 !! NEMO/OPA 4.0 , NEMO Consortium (2011) 239 !! $Id $246 !! $Id: dom_oce.F90 3294 2012-01-28 16:44:18Z rblod $ 240 247 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 241 248 !!---------------------------------------------------------------------- -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/LBC/lbclnk.F90
r2442 r3592 7 7 !! NEMO 1.0 ! 2002-09 (G. Madec) F90: Free form and module 8 8 !! 3.2 ! 2009-03 (R. Benshila) External north fold treatment 9 !! 3.5 ! 2012 (S.Mocavero, I. Epicoco) Add 'lbc_bdy_lnk' 10 !! and lbc_obc_lnk' routine to optimize 11 !! the BDY/OBC communications 9 12 !!---------------------------------------------------------------------- 10 13 #if defined key_mpp_mpi … … 14 17 !! lbc_lnk : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp 15 18 !! lbc_lnk_e : generic interface for mpp_lnk_2d_e routine defined in lib_mpp 19 !! lbc_bdy_lnk : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp 20 !! lbc_obc_lnk : generic interface for mpp_lnk_obc_2d and mpp_lnk_obc_3d routines defined in lib_mpp 16 21 !!---------------------------------------------------------------------- 17 22 USE lib_mpp ! distributed memory computing library … … 21 26 END INTERFACE 22 27 28 INTERFACE lbc_bdy_lnk 29 MODULE PROCEDURE mpp_lnk_bdy_2d, mpp_lnk_bdy_3d 30 END INTERFACE 31 INTERFACE lbc_obc_lnk 32 MODULE PROCEDURE mpp_lnk_obc_2d, mpp_lnk_obc_3d 33 END INTERFACE 34 23 35 INTERFACE lbc_lnk_e 24 36 MODULE PROCEDURE mpp_lnk_2d_e … … 27 39 PUBLIC lbc_lnk ! ocean lateral boundary conditions 28 40 PUBLIC lbc_lnk_e 41 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions 42 PUBLIC lbc_obc_lnk ! ocean lateral BDY boundary conditions 29 43 30 44 !!---------------------------------------------------------------------- 31 45 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 32 !! $Id $46 !! $Id: lbclnk.F90 2442 2010-11-27 18:05:38Z gm $ 33 47 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 34 48 !!---------------------------------------------------------------------- … … 41 55 !! lbc_lnk_3d : set the lateral boundary condition on a 3D variable on ocean mesh 42 56 !! lbc_lnk_2d : set the lateral boundary condition on a 2D variable on ocean mesh 57 !! lbc_bdy_lnk : set the lateral BDY boundary condition 58 !! lbc_obc_lnk : set the lateral OBC boundary condition 43 59 !!---------------------------------------------------------------------- 44 60 USE oce ! ocean dynamics and tracers … … 58 74 END INTERFACE 59 75 76 INTERFACE lbc_bdy_lnk 77 MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d 78 END INTERFACE 79 INTERFACE lbc_obc_lnk 80 MODULE PROCEDURE lbc_lnk_2d, lbc_lnk_3d 81 END INTERFACE 82 60 83 PUBLIC lbc_lnk ! ocean/ice lateral boundary conditions 61 84 PUBLIC lbc_lnk_e 85 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions 86 PUBLIC lbc_obc_lnk ! ocean lateral OBC boundary conditions 62 87 63 88 !!---------------------------------------------------------------------- 64 89 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 65 !! $Id $90 !! $Id: lbclnk.F90 2442 2010-11-27 18:05:38Z gm $ 66 91 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 67 92 !!---------------------------------------------------------------------- … … 180 205 END SUBROUTINE lbc_lnk_3d 181 206 207 SUBROUTINE lbc_bdy_lnk_3d( pt3d, cd_type, psgn, ib_bdy ) 208 !!--------------------------------------------------------------------- 209 !! *** ROUTINE lbc_bdy_lnk *** 210 !! 211 !! ** Purpose : wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 212 !! to maintain the same interface with regards to the mpp case 213 !! 214 !!---------------------------------------------------------------------- 215 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points 216 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt3d ! 3D array on which the lbc is applied 217 REAL(wp) , INTENT(in ) :: psgn ! control of the sign 218 INTEGER :: ib_bdy ! BDY boundary set 219 !! 220 CALL lbc_lnk_3d( pt3d, cd_type, psgn) 221 222 END SUBROUTINE lbc_bdy_lnk_3d 223 224 SUBROUTINE lbc_bdy_lnk_2d( pt2d, cd_type, psgn, ib_bdy ) 225 !!--------------------------------------------------------------------- 226 !! *** ROUTINE lbc_bdy_lnk *** 227 !! 228 !! ** Purpose : wrapper rountine to 'lbc_lnk_3d'. This wrapper is used 229 !! to maintain the same interface with regards to the mpp case 230 !! 231 !!---------------------------------------------------------------------- 232 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points 233 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 3D array on which the lbc is applied 234 REAL(wp) , INTENT(in ) :: psgn ! control of the sign 235 INTEGER :: ib_bdy ! BDY boundary set 236 !! 237 CALL lbc_lnk_2d( pt2d, cd_type, psgn) 238 239 END SUBROUTINE lbc_bdy_lnk_2d 182 240 183 241 SUBROUTINE lbc_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90
r3294 r3592 19 19 !! 3.2 ! 2009 (O. Marti) add mpp_ini_znl 20 20 !! 4.0 ! 2011 (G. Madec) move ctl_ routines from in_out_manager 21 !! 3.5 ! 2012 (S.Mocavero, I. Epicoco) Add 'mpp_lnk_bdy_3d', 'mpp_lnk_obc_3d', 22 !! 'mpp_lnk_bdy_2d' and 'mpp_lnk_obc_2d' routines and update 23 !! the mppobc routine to optimize the BDY and OBC communications 21 24 !!---------------------------------------------------------------------- 22 25 … … 68 71 PUBLIC mppsize 69 72 PUBLIC lib_mpp_alloc ! Called in nemogcm.F90 73 PUBLIC mpp_lnk_bdy_2d, mpp_lnk_bdy_3d 74 PUBLIC mpp_lnk_obc_2d, mpp_lnk_obc_3d 70 75 71 76 !! * Interfaces … … 186 191 !!---------------------------------------------------------------------- 187 192 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 188 !! $Id $193 !! $Id: lib_mpp.F90 3294 2012-01-28 16:44:18Z rblod $ 189 194 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 190 195 !!---------------------------------------------------------------------- … … 361 366 END FUNCTION mynode 362 367 363 364 SUBROUTINE mpp_lnk_3d( ptab, cd_type, psgn, cd_mpp, pval ) 365 !!---------------------------------------------------------------------- 366 !! *** routine mpp_lnk_3d *** 368 SUBROUTINE mpp_lnk_obc_3d( ptab, cd_type, psgn ) 369 !!---------------------------------------------------------------------- 370 !! *** routine mpp_lnk_obc_3d *** 367 371 !! 368 372 !! ** Purpose : Message passing manadgement 369 373 !! 370 !! ** Method : Use mppsend and mpprecv function for passing mask374 !! ** Method : Use mppsend and mpprecv function for passing OBC boundaries 371 375 !! between processors following neighboring subdomains. 372 376 !! domain parameters … … 388 392 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 389 393 ! ! = 1. , the sign is kept 390 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only391 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries)392 394 !! 393 395 INTEGER :: ji, jj, jk, jl ! dummy loop indices … … 398 400 !!---------------------------------------------------------------------- 399 401 400 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 401 ELSE ; zland = 0.e0 ! zero by default 402 ENDIF 402 zland = 0.e0 ! zero by default 403 403 404 404 ! 1. standard boundary treatment 405 405 ! ------------------------------ 406 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values 407 ! 408 ! WARNING ptab is defined only between nld and nle 409 DO jk = 1, jpk 410 DO jj = nlcj+1, jpj ! added line(s) (inner only) 411 ptab(nldi :nlei , jj ,jk) = ptab(nldi:nlei, nlej,jk) 412 ptab(1 :nldi-1, jj ,jk) = ptab(nldi , nlej,jk) 413 ptab(nlei+1:nlci , jj ,jk) = ptab( nlei, nlej,jk) 414 END DO 415 DO ji = nlci+1, jpi ! added column(s) (full) 416 ptab(ji ,nldj :nlej ,jk) = ptab( nlei,nldj:nlej,jk) 417 ptab(ji ,1 :nldj-1,jk) = ptab( nlei,nldj ,jk) 418 ptab(ji ,nlej+1:jpj ,jk) = ptab( nlei, nlej,jk) 419 END DO 420 END DO 421 ! 422 ELSE ! standard close or cyclic treatment 423 ! 424 ! ! East-West boundaries 425 ! !* Cyclic east-west 426 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 427 ptab( 1 ,:,:) = ptab(jpim1,:,:) 428 ptab(jpi,:,:) = ptab( 2 ,:,:) 429 ELSE !* closed 430 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 431 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 432 ENDIF 433 ! ! North-South boundaries (always closed) 434 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point 435 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north 436 ! 406 IF( nbondi == 2) THEN 407 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 408 ptab( 1 ,:,:) = ptab(jpim1,:,:) 409 ptab(jpi,:,:) = ptab( 2 ,:,:) 410 ELSE 411 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 412 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 413 ENDIF 414 ELSEIF(nbondi == -1) THEN 415 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 416 ELSEIF(nbondi == 1) THEN 417 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 418 ENDIF !* closed 419 420 IF (nbondj == 2 .OR. nbondj == -1) THEN 421 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point 422 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 423 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north 437 424 ENDIF 438 425 … … 441 428 ! we play with the neigbours AND the row number because of the periodicity 442 429 ! 430 IF(nbondj .ne. 0) THEN 443 431 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions 444 432 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) … … 479 467 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 480 468 END DO 481 CASE ( 0 ) 469 CASE ( 0 ) 482 470 DO jl = 1, jpreci 483 471 ptab(jl ,:,:) = t3we(:,jl,:,2) … … 489 477 END DO 490 478 END SELECT 479 ENDIF 491 480 492 481 … … 495 484 ! always closed : we play only with the neigbours 496 485 ! 486 IF(nbondi .ne. 0) THEN 497 487 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 498 488 ijhom = nlcj-nrecj … … 532 522 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 533 523 END DO 534 CASE ( 0 ) 524 CASE ( 0 ) 535 525 DO jl = 1, jprecj 536 526 ptab(:,jl ,:) = t3sn(:,jl,:,2) … … 542 532 END DO 543 533 END SELECT 534 ENDIF 544 535 545 536 … … 547 538 ! ----------------------- 548 539 ! 549 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp)) THEN540 IF( npolj /= 0 ) THEN 550 541 ! 551 542 SELECT CASE ( jpni ) … … 556 547 ENDIF 557 548 ! 558 END SUBROUTINE mpp_lnk_ 3d559 560 561 SUBROUTINE mpp_lnk_ 2d( pt2d, cd_type, psgn, cd_mpp, pval)562 !!---------------------------------------------------------------------- 563 !! *** routine mpp_lnk_ 2d ***549 END SUBROUTINE mpp_lnk_obc_3d 550 551 552 SUBROUTINE mpp_lnk_obc_2d( pt2d, cd_type, psgn ) 553 !!---------------------------------------------------------------------- 554 !! *** routine mpp_lnk_obc_2d *** 564 555 !! 565 556 !! ** Purpose : Message passing manadgement for 2d array 566 557 !! 567 !! ** Method : Use mppsend and mpprecv function for passing mask558 !! ** Method : Use mppsend and mpprecv function for passing OBC boundaries 568 559 !! between processors following neighboring subdomains. 569 560 !! domain parameters … … 583 574 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 584 575 ! ! = 1. , the sign is kept 585 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only586 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries)587 576 !! 588 577 INTEGER :: ji, jj, jl ! dummy loop indices … … 593 582 !!---------------------------------------------------------------------- 594 583 595 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 596 ELSE ; zland = 0.e0 ! zero by default 597 ENDIF 584 zland = 0.e0 ! zero by default 598 585 599 586 ! 1. standard boundary treatment 600 587 ! ------------------------------ 601 588 ! 602 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values 603 ! 604 ! WARNING pt2d is defined only between nld and nle 605 DO jj = nlcj+1, jpj ! added line(s) (inner only) 606 pt2d(nldi :nlei , jj ) = pt2d(nldi:nlei, nlej) 607 pt2d(1 :nldi-1, jj ) = pt2d(nldi , nlej) 608 pt2d(nlei+1:nlci , jj ) = pt2d( nlei, nlej) 609 END DO 610 DO ji = nlci+1, jpi ! added column(s) (full) 611 pt2d(ji ,nldj :nlej ) = pt2d( nlei,nldj:nlej) 612 pt2d(ji ,1 :nldj-1) = pt2d( nlei,nldj ) 613 pt2d(ji ,nlej+1:jpj ) = pt2d( nlei, nlej) 614 END DO 615 ! 616 ELSE ! standard close or cyclic treatment 617 ! 618 ! ! East-West boundaries 619 IF( nbondi == 2 .AND. & ! Cyclic east-west 620 & (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 621 pt2d( 1 ,:) = pt2d(jpim1,:) ! west 622 pt2d(jpi,:) = pt2d( 2 ,:) ! east 623 ELSE ! closed 624 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 625 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 626 ENDIF 627 ! ! North-South boundaries (always closed) 628 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland !south except F-point 629 pt2d(:,nlcj-jprecj+1:jpj ) = zland ! north 630 ! 589 IF( nbondi == 2) THEN 590 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 591 pt2d( 1 ,:) = pt2d(jpim1,:) 592 pt2d(jpi,:) = pt2d( 2 ,:) 593 ELSE 594 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 595 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 596 ENDIF 597 ELSEIF(nbondi == -1) THEN 598 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 599 ELSEIF(nbondi == 1) THEN 600 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 601 ENDIF !* closed 602 603 IF (nbondj == 2 .OR. nbondj == -1) THEN 604 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland ! south except F-point 605 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 606 pt2d(:,nlcj-jprecj+1:jpj) = zland ! north 631 607 ENDIF 632 608 … … 741 717 ! ----------------------- 742 718 ! 719 IF( npolj /= 0 ) THEN 720 ! 721 SELECT CASE ( jpni ) 722 CASE ( 1 ) ; CALL lbc_nfd ( pt2d, cd_type, psgn ) ! only 1 northern proc, no mpp 723 CASE DEFAULT ; CALL mpp_lbc_north( pt2d, cd_type, psgn ) ! for all northern procs. 724 END SELECT 725 ! 726 ENDIF 727 ! 728 END SUBROUTINE mpp_lnk_obc_2d 729 730 SUBROUTINE mpp_lnk_3d( ptab, cd_type, psgn, cd_mpp, pval ) 731 !!---------------------------------------------------------------------- 732 !! *** routine mpp_lnk_3d *** 733 !! 734 !! ** Purpose : Message passing manadgement 735 !! 736 !! ** Method : Use mppsend and mpprecv function for passing mask 737 !! between processors following neighboring subdomains. 738 !! domain parameters 739 !! nlci : first dimension of the local subdomain 740 !! nlcj : second dimension of the local subdomain 741 !! nbondi : mark for "east-west local boundary" 742 !! nbondj : mark for "north-south local boundary" 743 !! noea : number for local neighboring processors 744 !! nowe : number for local neighboring processors 745 !! noso : number for local neighboring processors 746 !! nono : number for local neighboring processors 747 !! 748 !! ** Action : ptab with update value at its periphery 749 !! 750 !!---------------------------------------------------------------------- 751 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: ptab ! 3D array on which the boundary condition is applied 752 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points 753 ! ! = T , U , V , F , W points 754 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 755 ! ! = 1. , the sign is kept 756 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only 757 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries) 758 !! 759 INTEGER :: ji, jj, jk, jl ! dummy loop indices 760 INTEGER :: imigr, iihom, ijhom ! temporary integers 761 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 762 REAL(wp) :: zland 763 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 764 !!---------------------------------------------------------------------- 765 766 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 767 ELSE ; zland = 0.e0 ! zero by default 768 ENDIF 769 770 ! 1. standard boundary treatment 771 ! ------------------------------ 772 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values 773 ! 774 ! WARNING ptab is defined only between nld and nle 775 DO jk = 1, jpk 776 DO jj = nlcj+1, jpj ! added line(s) (inner only) 777 ptab(nldi :nlei , jj ,jk) = ptab(nldi:nlei, nlej,jk) 778 ptab(1 :nldi-1, jj ,jk) = ptab(nldi , nlej,jk) 779 ptab(nlei+1:nlci , jj ,jk) = ptab( nlei, nlej,jk) 780 END DO 781 DO ji = nlci+1, jpi ! added column(s) (full) 782 ptab(ji ,nldj :nlej ,jk) = ptab( nlei,nldj:nlej,jk) 783 ptab(ji ,1 :nldj-1,jk) = ptab( nlei,nldj ,jk) 784 ptab(ji ,nlej+1:jpj ,jk) = ptab( nlei, nlej,jk) 785 END DO 786 END DO 787 ! 788 ELSE ! standard close or cyclic treatment 789 ! 790 ! ! East-West boundaries 791 ! !* Cyclic east-west 792 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 793 ptab( 1 ,:,:) = ptab(jpim1,:,:) 794 ptab(jpi,:,:) = ptab( 2 ,:,:) 795 ELSE !* closed 796 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 797 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 798 ENDIF 799 ! ! North-South boundaries (always closed) 800 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point 801 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north 802 ! 803 ENDIF 804 805 ! 2. East and west directions exchange 806 ! ------------------------------------ 807 ! we play with the neigbours AND the row number because of the periodicity 808 ! 809 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions 810 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) 811 iihom = nlci-nreci 812 DO jl = 1, jpreci 813 t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 814 t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 815 END DO 816 END SELECT 817 ! 818 ! ! Migrations 819 imigr = jpreci * jpj * jpk 820 ! 821 SELECT CASE ( nbondi ) 822 CASE ( -1 ) 823 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) 824 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 825 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 826 CASE ( 0 ) 827 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 828 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 ) 829 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 830 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 831 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 832 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 833 CASE ( 1 ) 834 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 835 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 836 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 837 END SELECT 838 ! 839 ! ! Write Dirichlet lateral conditions 840 iihom = nlci-jpreci 841 ! 842 SELECT CASE ( nbondi ) 843 CASE ( -1 ) 844 DO jl = 1, jpreci 845 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 846 END DO 847 CASE ( 0 ) 848 DO jl = 1, jpreci 849 ptab(jl ,:,:) = t3we(:,jl,:,2) 850 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 851 END DO 852 CASE ( 1 ) 853 DO jl = 1, jpreci 854 ptab(jl ,:,:) = t3we(:,jl,:,2) 855 END DO 856 END SELECT 857 858 859 ! 3. North and south directions 860 ! ----------------------------- 861 ! always closed : we play only with the neigbours 862 ! 863 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 864 ijhom = nlcj-nrecj 865 DO jl = 1, jprecj 866 t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 867 t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 868 END DO 869 ENDIF 870 ! 871 ! ! Migrations 872 imigr = jprecj * jpi * jpk 873 ! 874 SELECT CASE ( nbondj ) 875 CASE ( -1 ) 876 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) 877 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 878 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 879 CASE ( 0 ) 880 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 881 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 ) 882 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 883 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 884 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 885 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 886 CASE ( 1 ) 887 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 888 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 889 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 890 END SELECT 891 ! 892 ! ! Write Dirichlet lateral conditions 893 ijhom = nlcj-jprecj 894 ! 895 SELECT CASE ( nbondj ) 896 CASE ( -1 ) 897 DO jl = 1, jprecj 898 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 899 END DO 900 CASE ( 0 ) 901 DO jl = 1, jprecj 902 ptab(:,jl ,:) = t3sn(:,jl,:,2) 903 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 904 END DO 905 CASE ( 1 ) 906 DO jl = 1, jprecj 907 ptab(:,jl,:) = t3sn(:,jl,:,2) 908 END DO 909 END SELECT 910 911 912 ! 4. north fold treatment 913 ! ----------------------- 914 ! 915 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 916 ! 917 SELECT CASE ( jpni ) 918 CASE ( 1 ) ; CALL lbc_nfd ( ptab, cd_type, psgn ) ! only 1 northern proc, no mpp 919 CASE DEFAULT ; CALL mpp_lbc_north( ptab, cd_type, psgn ) ! for all northern procs. 920 END SELECT 921 ! 922 ENDIF 923 ! 924 END SUBROUTINE mpp_lnk_3d 925 926 927 SUBROUTINE mpp_lnk_2d( pt2d, cd_type, psgn, cd_mpp, pval ) 928 !!---------------------------------------------------------------------- 929 !! *** routine mpp_lnk_2d *** 930 !! 931 !! ** Purpose : Message passing manadgement for 2d array 932 !! 933 !! ** Method : Use mppsend and mpprecv function for passing mask 934 !! between processors following neighboring subdomains. 935 !! domain parameters 936 !! nlci : first dimension of the local subdomain 937 !! nlcj : second dimension of the local subdomain 938 !! nbondi : mark for "east-west local boundary" 939 !! nbondj : mark for "north-south local boundary" 940 !! noea : number for local neighboring processors 941 !! nowe : number for local neighboring processors 942 !! noso : number for local neighboring processors 943 !! nono : number for local neighboring processors 944 !! 945 !!---------------------------------------------------------------------- 946 REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pt2d ! 2D array on which the boundary condition is applied 947 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points 948 ! ! = T , U , V , F , W and I points 949 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 950 ! ! = 1. , the sign is kept 951 CHARACTER(len=3), OPTIONAL , INTENT(in ) :: cd_mpp ! fill the overlap area only 952 REAL(wp) , OPTIONAL , INTENT(in ) :: pval ! background value (used at closed boundaries) 953 !! 954 INTEGER :: ji, jj, jl ! dummy loop indices 955 INTEGER :: imigr, iihom, ijhom ! temporary integers 956 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 957 REAL(wp) :: zland 958 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 959 !!---------------------------------------------------------------------- 960 961 IF( PRESENT( pval ) ) THEN ; zland = pval ! set land value 962 ELSE ; zland = 0.e0 ! zero by default 963 ENDIF 964 965 ! 1. standard boundary treatment 966 ! ------------------------------ 967 ! 968 IF( PRESENT( cd_mpp ) ) THEN ! only fill added line/raw with existing values 969 ! 970 ! WARNING pt2d is defined only between nld and nle 971 DO jj = nlcj+1, jpj ! added line(s) (inner only) 972 pt2d(nldi :nlei , jj ) = pt2d(nldi:nlei, nlej) 973 pt2d(1 :nldi-1, jj ) = pt2d(nldi , nlej) 974 pt2d(nlei+1:nlci , jj ) = pt2d( nlei, nlej) 975 END DO 976 DO ji = nlci+1, jpi ! added column(s) (full) 977 pt2d(ji ,nldj :nlej ) = pt2d( nlei,nldj:nlej) 978 pt2d(ji ,1 :nldj-1) = pt2d( nlei,nldj ) 979 pt2d(ji ,nlej+1:jpj ) = pt2d( nlei, nlej) 980 END DO 981 ! 982 ELSE ! standard close or cyclic treatment 983 ! 984 ! ! East-West boundaries 985 IF( nbondi == 2 .AND. & ! Cyclic east-west 986 & (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 987 pt2d( 1 ,:) = pt2d(jpim1,:) ! west 988 pt2d(jpi,:) = pt2d( 2 ,:) ! east 989 ELSE ! closed 990 IF( .NOT. cd_type == 'F' ) pt2d( 1 :jpreci,:) = zland ! south except F-point 991 pt2d(nlci-jpreci+1:jpi ,:) = zland ! north 992 ENDIF 993 ! ! North-South boundaries (always closed) 994 IF( .NOT. cd_type == 'F' ) pt2d(:, 1 :jprecj) = zland !south except F-point 995 pt2d(:,nlcj-jprecj+1:jpj ) = zland ! north 996 ! 997 ENDIF 998 999 ! 2. East and west directions exchange 1000 ! ------------------------------------ 1001 ! we play with the neigbours AND the row number because of the periodicity 1002 ! 1003 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions 1004 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) 1005 iihom = nlci-nreci 1006 DO jl = 1, jpreci 1007 t2ew(:,jl,1) = pt2d(jpreci+jl,:) 1008 t2we(:,jl,1) = pt2d(iihom +jl,:) 1009 END DO 1010 END SELECT 1011 ! 1012 ! ! Migrations 1013 imigr = jpreci * jpj 1014 ! 1015 SELECT CASE ( nbondi ) 1016 CASE ( -1 ) 1017 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 1018 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 1019 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1020 CASE ( 0 ) 1021 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 1022 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 1023 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 1024 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 1025 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1026 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1027 CASE ( 1 ) 1028 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 1029 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 1030 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1031 END SELECT 1032 ! 1033 ! ! Write Dirichlet lateral conditions 1034 iihom = nlci - jpreci 1035 ! 1036 SELECT CASE ( nbondi ) 1037 CASE ( -1 ) 1038 DO jl = 1, jpreci 1039 pt2d(iihom+jl,:) = t2ew(:,jl,2) 1040 END DO 1041 CASE ( 0 ) 1042 DO jl = 1, jpreci 1043 pt2d(jl ,:) = t2we(:,jl,2) 1044 pt2d(iihom+jl,:) = t2ew(:,jl,2) 1045 END DO 1046 CASE ( 1 ) 1047 DO jl = 1, jpreci 1048 pt2d(jl ,:) = t2we(:,jl,2) 1049 END DO 1050 END SELECT 1051 1052 1053 ! 3. North and south directions 1054 ! ----------------------------- 1055 ! always closed : we play only with the neigbours 1056 ! 1057 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 1058 ijhom = nlcj-nrecj 1059 DO jl = 1, jprecj 1060 t2sn(:,jl,1) = pt2d(:,ijhom +jl) 1061 t2ns(:,jl,1) = pt2d(:,jprecj+jl) 1062 END DO 1063 ENDIF 1064 ! 1065 ! ! Migrations 1066 imigr = jprecj * jpi 1067 ! 1068 SELECT CASE ( nbondj ) 1069 CASE ( -1 ) 1070 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 1071 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 1072 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1073 CASE ( 0 ) 1074 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 1075 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 1076 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 1077 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 1078 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1079 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1080 CASE ( 1 ) 1081 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 1082 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 1083 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1084 END SELECT 1085 ! 1086 ! ! Write Dirichlet lateral conditions 1087 ijhom = nlcj - jprecj 1088 ! 1089 SELECT CASE ( nbondj ) 1090 CASE ( -1 ) 1091 DO jl = 1, jprecj 1092 pt2d(:,ijhom+jl) = t2ns(:,jl,2) 1093 END DO 1094 CASE ( 0 ) 1095 DO jl = 1, jprecj 1096 pt2d(:,jl ) = t2sn(:,jl,2) 1097 pt2d(:,ijhom+jl) = t2ns(:,jl,2) 1098 END DO 1099 CASE ( 1 ) 1100 DO jl = 1, jprecj 1101 pt2d(:,jl ) = t2sn(:,jl,2) 1102 END DO 1103 END SELECT 1104 1105 1106 ! 4. north fold treatment 1107 ! ----------------------- 1108 ! 743 1109 IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 744 1110 ! … … 1790 2156 INTEGER :: ml_stat(MPI_STATUS_SIZE) ! for key_mpi_isend 1791 2157 REAL(wp), POINTER, DIMENSION(:,:) :: ztab ! temporary workspace 2158 LOGICAL :: lmigr ! is true for those processors that have to migrate the OB 1792 2159 !!---------------------------------------------------------------------- 1793 2160 … … 1815 2182 CALL mppstop 1816 2183 ENDIF 1817 2184 1818 2185 ! Communication level by level 1819 2186 ! ---------------------------- 1820 2187 !!gm Remark : this is very time consumming!!! 1821 2188 ! ! ------------------------ ! 2189 IF( ijpt0 > ijpt1 .OR. iipt0 > iipt1 ) THEN 2190 ! there is nothing to be migrated 2191 lmigr = .FALSE. 2192 ELSE 2193 lmigr = .TRUE. 2194 ENDIF 2195 2196 IF( lmigr ) THEN 2197 1822 2198 DO jk = 1, kk ! Loop over the levels ! 1823 2199 ! ! ------------------------ ! … … 1841 2217 ! --------------------------- 1842 2218 ! 2219 IF( ktype == 1 ) THEN 2220 1843 2221 IF( nbondi /= 2 ) THEN ! Read Dirichlet lateral conditions 1844 2222 iihom = nlci-nreci 1845 DO jl = 1, jpreci 1846 t2ew(:,jl,1) = ztab(jpreci+jl,:) 1847 t2we(:,jl,1) = ztab(iihom +jl,:) 1848 END DO 2223 t2ew(1:jpreci,1,1) = ztab(jpreci+1:nreci, ijpt0) 2224 t2we(1:jpreci,1,1) = ztab(iihom+1:iihom+jpreci, ijpt0) 1849 2225 ENDIF 1850 2226 ! 1851 2227 ! ! Migrations 1852 imigr =jpreci*jpj2228 imigr = jpreci 1853 2229 ! 1854 2230 IF( nbondi == -1 ) THEN … … 1873 2249 ! 1874 2250 IF( nbondi == 0 .OR. nbondi == 1 ) THEN 1875 DO jl = 1, jpreci 1876 ztab(jl,:) = t2we(:,jl,2) 1877 END DO 2251 ztab(1:jpreci, ijpt0) = t2we(1:jpreci,1,2) 1878 2252 ENDIF 1879 2253 IF( nbondi == -1 .OR. nbondi == 0 ) THEN 1880 DO jl = 1, jpreci 1881 ztab(iihom+jl,:) = t2ew(:,jl,2) 1882 END DO 2254 ztab(iihom+1:iihom+jpreci, ijpt0) = t2ew(1:jpreci,1,2) 1883 2255 ENDIF 1884 2256 ENDIF ! (ktype == 1) 1885 2257 1886 2258 ! 2. North and south directions 1887 2259 ! ----------------------------- 1888 2260 ! 2261 IF(ktype == 2 ) THEN 1889 2262 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 1890 2263 ijhom = nlcj-nrecj 1891 DO jl = 1, jprecj 1892 t2sn(:,jl,1) = ztab(:,ijhom +jl) 1893 t2ns(:,jl,1) = ztab(:,jprecj+jl) 1894 END DO 2264 t2sn(1:jprecj,1,1) = ztab(iipt0, ijhom+1:ijhom+jprecj) 2265 t2ns(1:jprecj,1,1) = ztab(iipt0, jprecj+1:nrecj) 1895 2266 ENDIF 1896 2267 ! 1897 2268 ! ! Migrations 1898 imigr = jprecj * jpi2269 imigr = jprecj 1899 2270 ! 1900 2271 IF( nbondj == -1 ) THEN … … 1918 2289 ijhom = nlcj - jprecj 1919 2290 IF( nbondj == 0 .OR. nbondj == 1 ) THEN 1920 DO jl = 1, jprecj 1921 ztab(:,jl) = t2sn(:,jl,2) 1922 END DO 2291 ztab(iipt0,1:jprecj) = t2sn(1:jprecj,1,2) 1923 2292 ENDIF 1924 2293 IF( nbondj == 0 .OR. nbondj == -1 ) THEN 1925 DO jl = 1, jprecj 1926 ztab(:,ijhom+jl) = t2ns(:,jl,2) 1927 END DO 2294 ztab(iipt0, ijhom+1:ijhom+jprecj) = t2ns(1:jprecj,1,2) 1928 2295 ENDIF 2296 ENDIF ! (ktype == 2) 1929 2297 IF( ktype==1 .AND. kd1 <= jpi+nimpp-1 .AND. nimpp <= kd2 ) THEN 1930 2298 DO jj = ijpt0, ijpt1 ! north/south boundaries 1931 2299 DO ji = iipt0,ilpt1 1932 ptab(ji,jk) = ztab(ji,jj) 2300 ptab(ji,jk) = ztab(ji,jj) 1933 2301 END DO 1934 2302 END DO … … 1936 2304 DO jj = ijpt0, ilpt1 ! east/west boundaries 1937 2305 DO ji = iipt0,iipt1 1938 ptab(jj,jk) = ztab(ji,jj) 2306 ptab(jj,jk) = ztab(ji,jj) 1939 2307 END DO 1940 2308 END DO … … 1943 2311 END DO 1944 2312 ! 2313 ENDIF ! ( lmigr ) 1945 2314 CALL wrk_dealloc( jpi,jpj, ztab ) 1946 2315 ! … … 2539 2908 END SUBROUTINE mpp_lbc_north_e 2540 2909 2910 SUBROUTINE mpp_lnk_bdy_3d( ptab, cd_type, psgn, ib_bdy ) 2911 !!---------------------------------------------------------------------- 2912 !! *** routine mpp_lnk_bdy_3d *** 2913 !! 2914 !! ** Purpose : Message passing management 2915 !! 2916 !! ** Method : Use mppsend and mpprecv function for passing BDY boundaries 2917 !! between processors following neighboring subdomains. 2918 !! domain parameters 2919 !! nlci : first dimension of the local subdomain 2920 !! nlcj : second dimension of the local subdomain 2921 !! nbondi_bdy : mark for "east-west local boundary" 2922 !! nbondj_bdy : mark for "north-south local boundary" 2923 !! noea : number for local neighboring processors 2924 !! nowe : number for local neighboring processors 2925 !! noso : number for local neighboring processors 2926 !! nono : number for local neighboring processors 2927 !! 2928 !! ** Action : ptab with update value at its periphery 2929 !! 2930 !!---------------------------------------------------------------------- 2931 2932 USE lbcnfd ! north fold 2933 2934 INCLUDE 'mpif.h' 2935 2936 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: ptab ! 3D array on which the boundary condition is applied 2937 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points 2938 ! ! = T , U , V , F , W points 2939 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 2940 ! ! = 1. , the sign is kept 2941 INTEGER , INTENT(in ) :: ib_bdy ! BDY boundary set 2942 INTEGER :: ji, jj, jk, jl ! dummy loop indices 2943 INTEGER :: imigr, iihom, ijhom ! temporary integers 2944 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 2945 REAL(wp) :: zland 2946 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 2947 !!---------------------------------------------------------------------- 2948 2949 zland = 0.e0 2950 2951 ! 1. standard boundary treatment 2952 ! ------------------------------ 2953 2954 ! ! East-West boundaries 2955 ! !* Cyclic east-west 2956 2957 IF( nbondi == 2) THEN 2958 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 2959 ptab( 1 ,:,:) = ptab(jpim1,:,:) 2960 ptab(jpi,:,:) = ptab( 2 ,:,:) 2961 ELSE 2962 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 2963 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 2964 ENDIF 2965 ELSEIF(nbondi == -1) THEN 2966 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:,:) = zland ! south except F-point 2967 ELSEIF(nbondi == 1) THEN 2968 ptab(nlci-jpreci+1:jpi ,:,:) = zland ! north 2969 ENDIF !* closed 2970 2971 IF (nbondj == 2 .OR. nbondj == -1) THEN 2972 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj,:) = zland ! south except F-point 2973 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 2974 ptab(:,nlcj-jprecj+1:jpj ,:) = zland ! north 2975 ENDIF 2976 2977 ! 2978 2979 ! 2. East and west directions exchange 2980 ! ------------------------------------ 2981 ! we play with the neigbours AND the row number because of the periodicity 2982 ! 2983 SELECT CASE ( nbondi_bdy(ib_bdy) ) ! Read Dirichlet lateral conditions 2984 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) 2985 iihom = nlci-nreci 2986 DO jl = 1, jpreci 2987 t3ew(:,jl,:,1) = ptab(jpreci+jl,:,:) 2988 t3we(:,jl,:,1) = ptab(iihom +jl,:,:) 2989 END DO 2990 END SELECT 2991 ! 2992 ! ! Migrations 2993 imigr = jpreci * jpj * jpk 2994 ! 2995 SELECT CASE ( nbondi_bdy(ib_bdy) ) 2996 CASE ( -1 ) 2997 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req1 ) 2998 CASE ( 0 ) 2999 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 3000 CALL mppsend( 2, t3we(1,1,1,1), imigr, noea, ml_req2 ) 3001 CASE ( 1 ) 3002 CALL mppsend( 1, t3ew(1,1,1,1), imigr, nowe, ml_req1 ) 3003 END SELECT 3004 ! 3005 SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 3006 CASE ( -1 ) 3007 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 3008 CASE ( 0 ) 3009 CALL mpprecv( 1, t3ew(1,1,1,2), imigr, noea ) 3010 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 3011 CASE ( 1 ) 3012 CALL mpprecv( 2, t3we(1,1,1,2), imigr, nowe ) 3013 END SELECT 3014 ! 3015 SELECT CASE ( nbondi_bdy(ib_bdy) ) 3016 CASE ( -1 ) 3017 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3018 CASE ( 0 ) 3019 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3020 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 3021 CASE ( 1 ) 3022 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3023 END SELECT 3024 ! 3025 ! ! Write Dirichlet lateral conditions 3026 iihom = nlci-jpreci 3027 ! 3028 SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 3029 CASE ( -1 ) 3030 DO jl = 1, jpreci 3031 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 3032 END DO 3033 CASE ( 0 ) 3034 DO jl = 1, jpreci 3035 ptab(jl ,:,:) = t3we(:,jl,:,2) 3036 ptab(iihom+jl,:,:) = t3ew(:,jl,:,2) 3037 END DO 3038 CASE ( 1 ) 3039 DO jl = 1, jpreci 3040 ptab(jl ,:,:) = t3we(:,jl,:,2) 3041 END DO 3042 END SELECT 3043 3044 3045 ! 3. North and south directions 3046 ! ----------------------------- 3047 ! always closed : we play only with the neigbours 3048 ! 3049 IF( nbondj_bdy(ib_bdy) /= 2 ) THEN ! Read Dirichlet lateral conditions 3050 ijhom = nlcj-nrecj 3051 DO jl = 1, jprecj 3052 t3sn(:,jl,:,1) = ptab(:,ijhom +jl,:) 3053 t3ns(:,jl,:,1) = ptab(:,jprecj+jl,:) 3054 END DO 3055 ENDIF 3056 ! 3057 ! ! Migrations 3058 imigr = jprecj * jpi * jpk 3059 ! 3060 SELECT CASE ( nbondj_bdy(ib_bdy) ) 3061 CASE ( -1 ) 3062 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req1 ) 3063 CASE ( 0 ) 3064 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 3065 CALL mppsend( 4, t3sn(1,1,1,1), imigr, nono, ml_req2 ) 3066 CASE ( 1 ) 3067 CALL mppsend( 3, t3ns(1,1,1,1), imigr, noso, ml_req1 ) 3068 END SELECT 3069 ! 3070 SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 3071 CASE ( -1 ) 3072 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 3073 CASE ( 0 ) 3074 CALL mpprecv( 3, t3ns(1,1,1,2), imigr, nono ) 3075 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 3076 CASE ( 1 ) 3077 CALL mpprecv( 4, t3sn(1,1,1,2), imigr, noso ) 3078 END SELECT 3079 ! 3080 SELECT CASE ( nbondj_bdy(ib_bdy) ) 3081 CASE ( -1 ) 3082 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3083 CASE ( 0 ) 3084 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3085 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 3086 CASE ( 1 ) 3087 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3088 END SELECT 3089 ! 3090 ! ! Write Dirichlet lateral conditions 3091 ijhom = nlcj-jprecj 3092 ! 3093 SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 3094 CASE ( -1 ) 3095 DO jl = 1, jprecj 3096 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 3097 END DO 3098 CASE ( 0 ) 3099 DO jl = 1, jprecj 3100 ptab(:,jl ,:) = t3sn(:,jl,:,2) 3101 ptab(:,ijhom+jl,:) = t3ns(:,jl,:,2) 3102 END DO 3103 CASE ( 1 ) 3104 DO jl = 1, jprecj 3105 ptab(:,jl,:) = t3sn(:,jl,:,2) 3106 END DO 3107 END SELECT 3108 3109 3110 ! 4. north fold treatment 3111 ! ----------------------- 3112 ! 3113 IF( npolj /= 0) THEN 3114 ! 3115 SELECT CASE ( jpni ) 3116 CASE ( 1 ) ; CALL lbc_nfd ( ptab, cd_type, psgn ) ! only 1 northern proc, no mpp 3117 CASE DEFAULT ; CALL mpp_lbc_north( ptab, cd_type, psgn ) ! for all northern procs. 3118 END SELECT 3119 ! 3120 ENDIF 3121 ! 3122 END SUBROUTINE mpp_lnk_bdy_3d 3123 3124 SUBROUTINE mpp_lnk_bdy_2d( ptab, cd_type, psgn, ib_bdy ) 3125 !!---------------------------------------------------------------------- 3126 !! *** routine mpp_lnk_bdy_2d *** 3127 !! 3128 !! ** Purpose : Message passing management 3129 !! 3130 !! ** Method : Use mppsend and mpprecv function for passing BDY boundaries 3131 !! between processors following neighboring subdomains. 3132 !! domain parameters 3133 !! nlci : first dimension of the local subdomain 3134 !! nlcj : second dimension of the local subdomain 3135 !! nbondi_bdy : mark for "east-west local boundary" 3136 !! nbondj_bdy : mark for "north-south local boundary" 3137 !! noea : number for local neighboring processors 3138 !! nowe : number for local neighboring processors 3139 !! noso : number for local neighboring processors 3140 !! nono : number for local neighboring processors 3141 !! 3142 !! ** Action : ptab with update value at its periphery 3143 !! 3144 !!---------------------------------------------------------------------- 3145 3146 USE lbcnfd ! north fold 3147 3148 INCLUDE 'mpif.h' 3149 3150 REAL(wp), DIMENSION(jpi,jpj) , INTENT(inout) :: ptab ! 3D array on which the boundary condition is applied 3151 CHARACTER(len=1) , INTENT(in ) :: cd_type ! define the nature of ptab array grid-points 3152 ! ! = T , U , V , F , W points 3153 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the north fold boundary 3154 ! ! = 1. , the sign is kept 3155 INTEGER , INTENT(in ) :: ib_bdy ! BDY boundary set 3156 INTEGER :: ji, jj, jl ! dummy loop indices 3157 INTEGER :: imigr, iihom, ijhom ! temporary integers 3158 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend 3159 REAL(wp) :: zland 3160 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 3161 !!---------------------------------------------------------------------- 3162 3163 zland = 0.e0 3164 3165 ! 1. standard boundary treatment 3166 ! ------------------------------ 3167 3168 ! ! East-West boundaries 3169 ! !* Cyclic east-west 3170 3171 IF( nbondi == 2) THEN 3172 IF (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN 3173 ptab( 1 ,:) = ptab(jpim1,:) 3174 ptab(jpi,:) = ptab( 2 ,:) 3175 ELSE 3176 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point 3177 ptab(nlci-jpreci+1:jpi ,:) = zland ! north 3178 ENDIF 3179 ELSEIF(nbondi == -1) THEN 3180 IF( .NOT. cd_type == 'F' ) ptab( 1 :jpreci,:) = zland ! south except F-point 3181 ELSEIF(nbondi == 1) THEN 3182 ptab(nlci-jpreci+1:jpi ,:) = zland ! north 3183 ENDIF !* closed 3184 3185 IF (nbondj == 2 .OR. nbondj == -1) THEN 3186 IF( .NOT. cd_type == 'F' ) ptab(:, 1 :jprecj) = zland ! south except F-point 3187 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 3188 ptab(:,nlcj-jprecj+1:jpj) = zland ! north 3189 ENDIF 3190 3191 ! 3192 3193 ! 2. East and west directions exchange 3194 ! ------------------------------------ 3195 ! we play with the neigbours AND the row number because of the periodicity 3196 ! 3197 SELECT CASE ( nbondi_bdy(ib_bdy) ) ! Read Dirichlet lateral conditions 3198 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) 3199 iihom = nlci-nreci 3200 DO jl = 1, jpreci 3201 t2ew(:,jl,1) = ptab(jpreci+jl,:) 3202 t2we(:,jl,1) = ptab(iihom +jl,:) 3203 END DO 3204 END SELECT 3205 ! 3206 ! ! Migrations 3207 imigr = jpreci * jpj 3208 ! 3209 SELECT CASE ( nbondi_bdy(ib_bdy) ) 3210 CASE ( -1 ) 3211 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req1 ) 3212 CASE ( 0 ) 3213 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 3214 CALL mppsend( 2, t2we(1,1,1), imigr, noea, ml_req2 ) 3215 CASE ( 1 ) 3216 CALL mppsend( 1, t2ew(1,1,1), imigr, nowe, ml_req1 ) 3217 END SELECT 3218 ! 3219 SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 3220 CASE ( -1 ) 3221 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 3222 CASE ( 0 ) 3223 CALL mpprecv( 1, t2ew(1,1,2), imigr, noea ) 3224 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 3225 CASE ( 1 ) 3226 CALL mpprecv( 2, t2we(1,1,2), imigr, nowe ) 3227 END SELECT 3228 ! 3229 SELECT CASE ( nbondi_bdy(ib_bdy) ) 3230 CASE ( -1 ) 3231 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3232 CASE ( 0 ) 3233 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3234 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 3235 CASE ( 1 ) 3236 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3237 END SELECT 3238 ! 3239 ! ! Write Dirichlet lateral conditions 3240 iihom = nlci-jpreci 3241 ! 3242 SELECT CASE ( nbondi_bdy_b(ib_bdy) ) 3243 CASE ( -1 ) 3244 DO jl = 1, jpreci 3245 ptab(iihom+jl,:) = t2ew(:,jl,2) 3246 END DO 3247 CASE ( 0 ) 3248 DO jl = 1, jpreci 3249 ptab(jl ,:) = t2we(:,jl,2) 3250 ptab(iihom+jl,:) = t2ew(:,jl,2) 3251 END DO 3252 CASE ( 1 ) 3253 DO jl = 1, jpreci 3254 ptab(jl ,:) = t2we(:,jl,2) 3255 END DO 3256 END SELECT 3257 3258 3259 ! 3. North and south directions 3260 ! ----------------------------- 3261 ! always closed : we play only with the neigbours 3262 ! 3263 IF( nbondj_bdy(ib_bdy) /= 2 ) THEN ! Read Dirichlet lateral conditions 3264 ijhom = nlcj-nrecj 3265 DO jl = 1, jprecj 3266 t2sn(:,jl,1) = ptab(:,ijhom +jl) 3267 t2ns(:,jl,1) = ptab(:,jprecj+jl) 3268 END DO 3269 ENDIF 3270 ! 3271 ! ! Migrations 3272 imigr = jprecj * jpi 3273 ! 3274 SELECT CASE ( nbondj_bdy(ib_bdy) ) 3275 CASE ( -1 ) 3276 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req1 ) 3277 CASE ( 0 ) 3278 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 3279 CALL mppsend( 4, t2sn(1,1,1), imigr, nono, ml_req2 ) 3280 CASE ( 1 ) 3281 CALL mppsend( 3, t2ns(1,1,1), imigr, noso, ml_req1 ) 3282 END SELECT 3283 ! 3284 SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 3285 CASE ( -1 ) 3286 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 3287 CASE ( 0 ) 3288 CALL mpprecv( 3, t2ns(1,1,2), imigr, nono ) 3289 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 3290 CASE ( 1 ) 3291 CALL mpprecv( 4, t2sn(1,1,2), imigr, noso ) 3292 END SELECT 3293 ! 3294 SELECT CASE ( nbondj_bdy(ib_bdy) ) 3295 CASE ( -1 ) 3296 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3297 CASE ( 0 ) 3298 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3299 IF(l_isend) CALL mpi_wait(ml_req2, ml_stat, ml_err) 3300 CASE ( 1 ) 3301 IF(l_isend) CALL mpi_wait(ml_req1, ml_stat, ml_err) 3302 END SELECT 3303 ! 3304 ! ! Write Dirichlet lateral conditions 3305 ijhom = nlcj-jprecj 3306 ! 3307 SELECT CASE ( nbondj_bdy_b(ib_bdy) ) 3308 CASE ( -1 ) 3309 DO jl = 1, jprecj 3310 ptab(:,ijhom+jl) = t2ns(:,jl,2) 3311 END DO 3312 CASE ( 0 ) 3313 DO jl = 1, jprecj 3314 ptab(:,jl ) = t2sn(:,jl,2) 3315 ptab(:,ijhom+jl) = t2ns(:,jl,2) 3316 END DO 3317 CASE ( 1 ) 3318 DO jl = 1, jprecj 3319 ptab(:,jl) = t2sn(:,jl,2) 3320 END DO 3321 END SELECT 3322 3323 3324 ! 4. north fold treatment 3325 ! ----------------------- 3326 ! 3327 IF( npolj /= 0) THEN 3328 ! 3329 SELECT CASE ( jpni ) 3330 CASE ( 1 ) ; CALL lbc_nfd ( ptab, cd_type, psgn ) ! only 1 northern proc, no mpp 3331 CASE DEFAULT ; CALL mpp_lbc_north( ptab, cd_type, psgn ) ! for all northern procs. 3332 END SELECT 3333 ! 3334 ENDIF 3335 ! 3336 END SUBROUTINE mpp_lnk_bdy_2d 2541 3337 2542 3338 SUBROUTINE mpi_init_opa( ldtxt, ksft, code ) -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/OBC/obcdyn.F90
r3294 r3592 5 5 !! Ocean dynamics: Radiation of velocities on each open boundary 6 6 !!================================================================================= 7 7 !! History : 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the 8 !! optimization of OBC communications 8 9 !!--------------------------------------------------------------------------------- 9 10 !! obc_dyn : call the subroutine for each open boundary … … 105 106 IF( lk_mpp ) THEN 106 107 IF( kt >= nit000+3 .AND. ln_rstart ) THEN 107 CALL lbc_ lnk( ub, 'U', -1. )108 CALL lbc_ lnk( vb, 'V', -1. )108 CALL lbc_obc_lnk( ub, 'U', -1. ) 109 CALL lbc_obc_lnk( vb, 'V', -1. ) 109 110 END IF 110 CALL lbc_ lnk( ua, 'U', -1. )111 CALL lbc_ lnk( va, 'V', -1. )111 CALL lbc_obc_lnk( ua, 'U', -1. ) 112 CALL lbc_obc_lnk( va, 'V', -1. ) 112 113 ENDIF 113 114 -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/OBC/obcdyn_bt.F90
r3294 r3592 5 5 !!====================================================================== 6 6 !! History : 1.0 ! 2005-12 (V. Garnier) original code 7 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the 8 !! optimization of OBC communications 7 9 !!---------------------------------------------------------------------- 8 10 #if ( defined key_dynspg_ts || defined key_dynspg_exp ) && defined key_obc … … 65 67 IF( lk_mpp ) THEN 66 68 IF( kt >= nit000+3 .AND. ln_rstart ) THEN 67 CALL lbc_ lnk( sshb, 'T', 1. )68 CALL lbc_ lnk( ub , 'U', -1. )69 CALL lbc_ lnk( vb , 'V', -1. )69 CALL lbc_obc_lnk( sshb, 'T', 1. ) 70 CALL lbc_obc_lnk( ub , 'U', -1. ) 71 CALL lbc_obc_lnk( vb , 'V', -1. ) 70 72 END IF 71 CALL lbc_ lnk( sshn, 'T', 1. )72 CALL lbc_ lnk( ua , 'U', -1. )73 CALL lbc_ lnk( va , 'V', -1. )73 CALL lbc_obc_lnk( sshn, 'T', 1. ) 74 CALL lbc_obc_lnk( ua , 'U', -1. ) 75 CALL lbc_obc_lnk( va , 'V', -1. ) 74 76 ENDIF 75 77 -
branches/2012/dev_r3365_CMCC1_BDYOBCopt/NEMOGCM/NEMO/OPA_SRC/OBC/obctra.F90
r3294 r3592 4 4 !! Ocean tracers: Radiation of tracers on each open boundary 5 5 !!================================================================================= 6 !! History : 3.5 ! 2012 (S. Mocavero, I. Epicoco) Updates for the 7 !! optimization of OBC communications 6 8 #if defined key_obc 7 9 !!--------------------------------------------------------------------------------- … … 101 103 IF( lk_mpp ) THEN !!bug ??? 102 104 IF( kt >= nit000+3 .AND. ln_rstart ) THEN 103 CALL lbc_ lnk( tsb(:,:,:,jp_tem), 'T', 1. )104 CALL lbc_ lnk( tsb(:,:,:,jp_sal), 'T', 1. )105 CALL lbc_obc_lnk( tsb(:,:,:,jp_tem), 'T', 1. ) 106 CALL lbc_obc_lnk( tsb(:,:,:,jp_sal), 'T', 1. ) 105 107 END IF 106 CALL lbc_ lnk( tsa(:,:,:,jp_tem), 'T', 1. )107 CALL lbc_ lnk( tsa(:,:,:,jp_sal), 'T', 1. )108 CALL lbc_obc_lnk( tsa(:,:,:,jp_tem), 'T', 1. ) 109 CALL lbc_obc_lnk( tsa(:,:,:,jp_sal), 'T', 1. ) 108 110 ENDIF 109 111
Note: See TracChangeset
for help on using the changeset viewer.