Changeset 11195 for NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/TOP/trcbdy.F90
- Timestamp:
- 2019-06-28T12:59:32+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/TOP/trcbdy.F90
r11071 r11195 22 22 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 23 23 USE in_out_manager ! I/O manager 24 USE bdy_oce , only: idx_bdy! ocean open boundary conditions24 USE bdy_oce ! ocean open boundary conditions 25 25 26 26 IMPLICIT NONE … … 49 49 REAL(wp), POINTER, DIMENSION(:,:) :: ztrc 50 50 REAL(wp), POINTER :: zfac 51 LOGICAL :: llrim0 ! indicate if rim 0 is treated 51 52 LOGICAL, DIMENSION(4) :: llsend1, llrecv1 ! indicate how communications are to be carried out 52 53 !!---------------------------------------------------------------------- … … 56 57 igrd = 1 57 58 ! 58 DO ib_bdy=1, nb_bdy 59 DO jn = 1, jptra 60 ! 61 ztrc => trcdta_bdy(jn,ib_bdy)%trc 62 zfac => trcdta_bdy(jn,ib_bdy)%rn_fac 63 ! 64 SELECT CASE( TRIM(trcdta_bdy(jn,ib_bdy)%cn_obc) ) 65 CASE('none' ) ; CYCLE 66 CASE('frs' ) ; CALL bdy_frs( idx_bdy(ib_bdy), tra(:,:,:,jn), ztrc*zfac ) 67 CASE('specified' ) ; CALL bdy_spe( idx_bdy(ib_bdy), tra(:,:,:,jn), ztrc*zfac ) 68 CASE('neumann' ) ; CALL bdy_nmn( idx_bdy(ib_bdy), igrd , tra(:,:,:,jn) ) 69 CASE('orlanski' ) ; CALL bdy_orl( idx_bdy(ib_bdy), trb(:,:,:,jn), tra(:,:,:,jn), ztrc*zfac, ll_npo=.false. ) 70 CASE('orlanski_npo') ; CALL bdy_orl( idx_bdy(ib_bdy), trb(:,:,:,jn), tra(:,:,:,jn), ztrc*zfac, ll_npo=.true. ) 71 CASE DEFAULT ; CALL ctl_stop( 'trc_bdy : unrecognised option for open boundaries for passive tracers' ) 59 DO ir = 1, 0, -1 ! treat rim 1 before rim 0 60 IF( ir == 0 ) THEN ; llrim0 = .TRUE. 61 ELSE ; llrim0 = .FALSE. 62 END IF 63 DO ib_bdy=1, nb_bdy 64 DO jn = 1, jptra 65 ! 66 ztrc => trcdta_bdy(jn,ib_bdy)%trc 67 zfac => trcdta_bdy(jn,ib_bdy)%rn_fac 68 ! 69 SELECT CASE( TRIM(trcdta_bdy(jn,ib_bdy)%cn_obc) ) 70 CASE('none' ) ; CYCLE 71 CASE('frs' ) ! treat the whole boundary at once 72 IF( ir == 0 ) CALL bdy_frs( idx_bdy(ib_bdy), tra(:,:,:,jn), ztrc*zfac ) 73 CASE('specified' ) ! treat the whole rim at once 74 IF( ir == 0 ) CALL bdy_spe( idx_bdy(ib_bdy), tra(:,:,:,jn), ztrc*zfac ) 75 CASE('neumann' ) ; CALL bdy_nmn( idx_bdy(ib_bdy), igrd , tra(:,:,:,jn) ) ! tra masked 76 CASE('orlanski' ) ; CALL bdy_orl( idx_bdy(ib_bdy), trb(:,:,:,jn), tra(:,:,:,jn), ztrc*zfac, ll_npo=.false. ) 77 CASE('orlanski_npo') ; CALL bdy_orl( idx_bdy(ib_bdy), trb(:,:,:,jn), tra(:,:,:,jn), ztrc*zfac, ll_npo=.true. ) 78 CASE DEFAULT ; CALL ctl_stop( 'trc_bdy : unrecognised option for open boundaries for passive tracers' ) 79 END SELECT 80 ! 81 END DO 82 END DO 83 ! 84 llsend1(:) = .false. 85 llrecv1(:) = .false. 86 DO ib_bdy=1, nb_bdy 87 SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 88 CASE('neumann') 89 llsend1(:) = llsend1(:) .OR. lsend_bdyint(ib_bdy,1,:,ir) ! possibly every direction, T points 90 llrecv1(:) = llrecv1(:) .OR. lrecv_bdyint(ib_bdy,1,:,ir) ! possibly every direction, T points 91 CASE('orlanski','orlanski_npo') 92 llsend1(:) = llsend1(:) .OR. lsend_bdy(ib_bdy,1,:,ir) ! possibly every direction, T points 93 llrecv1(:) = llrecv1(:) .OR. lrecv_bdy(ib_bdy,1,:,ir) ! possibly every direction, T points 72 94 END SELECT 73 !74 95 END DO 75 END DO 76 ! 77 llsend1(:) = .false. 78 llrecv1(:) = .false. 79 DO ib_bdy=1, nb_bdy 80 SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 81 CASE('neumann') 82 llsend1(:) = llsend1(:) .OR. lsend_bdyint(ib_bdy,1,:) ! possibly every direction, T points 83 llrecv1(:) = llrecv1(:) .OR. lrecv_bdyint(ib_bdy,1,:) ! possibly every direction, T points 84 CASE('orlanski','orlanski_npo') 85 llsend1(:) = llsend1(:) .OR. lsend_bdy(ib_bdy,1,:) ! possibly every direction, T points 86 llrecv1(:) = llrecv1(:) .OR. lrecv_bdy(ib_bdy,1,:) ! possibly every direction, T points 87 END SELECT 88 END DO 89 IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN ! if need to send/recv in at least one direction 90 CALL lbc_bdy_lnk( 'bdytra', llsend1, llrecv1, tsa, 'T', 1. ) 91 END IF 96 IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN ! if need to send/recv in at least one direction 97 CALL lbc_lnk( 'bdytra', tsa, 'T', 1., kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 98 END IF 99 ! 100 END DO ! ir 92 101 ! 93 102 IF( ln_timing ) CALL timing_stop('trc_bdy')
Note: See TracChangeset
for help on using the changeset viewer.