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 11067 for NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/BDY/bdydyn2d.F90 – NEMO

Ignore:
Timestamp:
2019-05-29T11:34:32+02:00 (5 years ago)
Author:
girrmann
Message:

dev_r10984_HPC-13 : new implementation of lbc_bdy_lnk in prevision of step 2, regroup communications, see #2285

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/BDY/bdydyn2d.F90

    r11049 r11067  
    5050      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pssh 
    5151      !! 
    52       INTEGER                                  ::   ib_bdy ! Loop counter 
    53  
     52      INTEGER                                  ::   ib_bdy     ! Loop counter 
     53      LOGICAL, DIMENSION(4) :: lsend2, lrecv2, lsend3, lrecv3  ! indicate how communications are to be carried out 
     54       
    5455      DO ib_bdy=1, nb_bdy 
    55  
    5656         SELECT CASE( cn_dyn2d(ib_bdy) ) 
    5757         CASE('none') 
     
    7171         END SELECT 
    7272      ENDDO 
    73  
     73      ! 
     74      lsend2(:) = .false. 
     75      lrecv2(:) = .false. 
     76      lsend3(:) = .false. 
     77      lrecv3(:) = .false. 
     78      DO ib_bdy=1, nb_bdy 
     79         SELECT CASE( cn_dyn2d(ib_bdy) ) 
     80         CASE('flather') 
     81            lsend2(:) = lsend2(:) .OR. lsend_bdy(ib_bdy,2,:)   ! to   every bdy neighbour, U points 
     82            lrecv2(:) = lrecv2(:) .OR. lrecv_bdy(ib_bdy,2,:)   ! from every bdy neighbour, U points 
     83            lsend3(:) = lsend3(:) .OR. lsend_bdy(ib_bdy,3,:)   ! to   every bdy neighbour, V points 
     84            lrecv3(:) = lrecv3(:) .OR. lrecv_bdy(ib_bdy,3,:)   ! from every bdy neighbour, V points 
     85         CASE('orlanski') 
     86            lsend2(:) = lsend2(:) .OR. lsend_bdy(ib_bdy,2,:)   ! to   every bdy neighbour, U points 
     87            lrecv2(:) = lrecv2(:) .OR. lrecv_bdy(ib_bdy,2,:)   ! from every bdy neighbour, U points 
     88            lsend3(:) = lsend3(:) .OR. lsend_bdy(ib_bdy,3,:)   ! to   every bdy neighbour, V points 
     89            lrecv3(:) = lrecv3(:) .OR. lrecv_bdy(ib_bdy,3,:)   ! from every bdy neighbour, V points 
     90         CASE('orlanski_npo') 
     91            lsend2(:) = lsend2(:) .OR. lsend_bdy(ib_bdy,2,:)   ! to   every bdy neighbour, U points 
     92            lrecv2(:) = lrecv2(:) .OR. lrecv_bdy(ib_bdy,2,:)   ! from every bdy neighbour, U points 
     93            lsend3(:) = lsend3(:) .OR. lsend_bdy(ib_bdy,3,:)   ! to   every bdy neighbour, V points 
     94            lrecv3(:) = lrecv3(:) .OR. lrecv_bdy(ib_bdy,3,:)   ! from every bdy neighbour, V points 
     95         END SELECT 
     96      END DO 
     97      IF( ANY(lsend2) .OR. ANY(lrecv2) ) THEN   ! if need to send/recv in at least one direction 
     98         CALL lbc_bdy_lnk( 'bdydyn2d', lsend2, lrecv2, pua2d, 'U', -1. ) 
     99      END IF 
     100      IF( ANY(lsend3) .OR. ANY(lrecv3) ) THEN   ! if need to send/recv in at least one direction 
     101         CALL lbc_bdy_lnk( 'bdydyn2d', lsend3, lrecv3, pva2d, 'V', -1. ) 
     102      END IF 
     103      ! 
    74104   END SUBROUTINE bdy_dyn2d 
    75105 
     
    110140         pva2d(ii,ij) = ( pva2d(ii,ij) + zwgt * ( dta%v2d(jb) - pva2d(ii,ij) ) ) * vmask(ii,ij,1) 
    111141      END DO  
    112       CALL lbc_bdy_lnk( 'bdydyn2d', pua2d, 'U', -1., ib_bdy )  
    113       CALL lbc_bdy_lnk( 'bdydyn2d', pva2d, 'V', -1., ib_bdy)   ! Boundary points should be updated 
    114142      ! 
    115143   END SUBROUTINE bdy_dyn2d_frs 
     
    170198      END DO 
    171199 
    172       CALL lbc_bdy_lnk( 'bdydyn2d', spgu(:,:), 'T', 1., ib_bdy ) 
    173200      ! 
    174201      igrd = 2      ! Flather bc on u-velocity;  
     
    210237         pva2d(ii,ij) = zforc + (1._wp - z1_2*zflag) * zcorr * vmask(ii,ij,1) 
    211238      END DO 
    212       CALL lbc_bdy_lnk( 'bdydyn2d', pua2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
    213       CALL lbc_bdy_lnk( 'bdydyn2d', pva2d, 'V', -1., ib_bdy )   ! 
    214239      ! 
    215240   END SUBROUTINE bdy_dyn2d_fla 
     
    246271      CALL bdy_orlanski_2d( idx, igrd, pvb2d, pva2d, dta%v2d, ll_npo ) 
    247272      ! 
    248       CALL lbc_bdy_lnk( 'bdydyn2d', pua2d, 'U', -1., ib_bdy )   ! Boundary points should be updated 
    249       CALL lbc_bdy_lnk( 'bdydyn2d', pva2d, 'V', -1., ib_bdy )   ! 
    250       ! 
    251273   END SUBROUTINE bdy_dyn2d_orlanski 
    252274 
     
    262284      !! 
    263285      INTEGER  ::   ib_bdy          ! bdy index 
    264       !!---------------------------------------------------------------------- 
     286      LOGICAL, DIMENSION(4) :: lsend1, lrecv1  ! indicate how communications are to be carried out 
     287      !!---------------------------------------------------------------------- 
     288      lsend1(:) = .false. 
     289      lrecv1(:) = .false. 
    265290      DO ib_bdy = 1, nb_bdy 
    266291         CALL bdy_nmn( idx_bdy(ib_bdy), 1, zssh )   ! zssh is masked 
    267          CALL lbc_bdy_lnk( 'bdydyn2d', zssh(:,:,1), 'T', 1., ib_bdy ) 
    268       END DO 
     292         lsend1(:) = lsend1(:) .OR. lsend_bdy(ib_bdy,1,:)   ! to   every bdy neighbour, T points 
     293         lrecv1(:) = lrecv1(:) .OR. lrecv_bdy(ib_bdy,1,:)   ! from every bdy neighbour, T points 
     294      END DO 
     295      IF( ANY(lsend1) .OR. ANY(lrecv1) ) THEN   ! if need to send/recv in at least one direction 
     296         CALL lbc_bdy_lnk( 'bdydyn2d', lsend1, lrecv1, zssh(:,:,1), 'T',  1. ) 
     297      END IF 
    269298      ! 
    270299   END SUBROUTINE bdy_ssh 
Note: See TracChangeset for help on using the changeset viewer.