Changeset 11822 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/BDY/bdytra.F90
- Timestamp:
- 2019-10-29T11:41:36+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/BDY/bdytra.F90
r10957 r11822 51 51 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts ! tracer fields 52 52 ! 53 INTEGER :: ib_bdy, jn, igrd ! Loop indices 54 TYPE(ztrabdy), DIMENSION(jpts) :: zdta ! Temporary data structure 53 INTEGER :: ib_bdy, jn, igrd, ir ! Loop indeces 54 TYPE(ztrabdy), DIMENSION(jpts) :: zdta ! Temporary data structure 55 LOGICAL :: llrim0 ! indicate if rim 0 is treated 56 LOGICAL, DIMENSION(4) :: llsend1, llrecv1 ! indicate how communications are to be carried out 55 57 !!---------------------------------------------------------------------- 56 58 igrd = 1 57 58 DO ib_bdy=1, nb_bdy 59 llsend1(:) = .false. ; llrecv1(:) = .false. 60 DO ir = 1, 0, -1 ! treat rim 1 before rim 0 61 IF( ir == 0 ) THEN ; llrim0 = .TRUE. 62 ELSE ; llrim0 = .FALSE. 63 END IF 64 DO ib_bdy=1, nb_bdy 65 ! 66 zdta(1)%tra => dta_bdy(ib_bdy)%tem 67 zdta(2)%tra => dta_bdy(ib_bdy)%sal 68 ! 69 DO jn = 1, jpts 70 ! 71 SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 72 CASE('none' ) ; CYCLE 73 CASE('frs' ) ! treat the whole boundary at once 74 IF( ir == 0 ) CALL bdy_frs ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 75 CASE('specified' ) ! treat the whole rim at once 76 IF( ir == 0 ) CALL bdy_spe ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 77 CASE('neumann' ) ; CALL bdy_nmn ( idx_bdy(ib_bdy), igrd , pts(:,:,:,jn,Kaa), llrim0 ) ! tsa masked 78 CASE('orlanski' ) ; CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), & 79 & zdta(jn)%tra, llrim0, ll_npo=.false. ) 80 CASE('orlanski_npo') ; CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), & 81 & zdta(jn)%tra, llrim0, ll_npo=.true. ) 82 CASE('runoff' ) ; CALL bdy_rnf ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), jn, llrim0 ) 83 CASE DEFAULT ; CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 84 END SELECT 85 ! 86 END DO 87 END DO 59 88 ! 60 zdta(1)%tra => dta_bdy(ib_bdy)%tem 61 zdta(2)%tra => dta_bdy(ib_bdy)%sal 89 IF( nn_hls > 1 .AND. ir == 1 ) CYCLE ! at least 2 halos will be corrected -> no need to correct rim 1 before rim 0 90 IF( nn_hls == 1 ) THEN ; llsend1(:) = .false. ; llrecv1(:) = .false. ; END IF 91 DO ib_bdy=1, nb_bdy 92 SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 93 CASE('neumann','runoff') 94 llsend1(:) = llsend1(:) .OR. lsend_bdyint(ib_bdy,1,:,ir) ! possibly every direction, T points 95 llrecv1(:) = llrecv1(:) .OR. lrecv_bdyint(ib_bdy,1,:,ir) ! possibly every direction, T points 96 CASE('orlanski', 'orlanski_npo') 97 llsend1(:) = llsend1(:) .OR. lsend_bdy(ib_bdy,1,:,ir) ! possibly every direction, T points 98 llrecv1(:) = llrecv1(:) .OR. lrecv_bdy(ib_bdy,1,:,ir) ! possibly every direction, T points 99 END SELECT 100 END DO 101 IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN ! if need to send/recv in at least one direction 102 CALL lbc_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T', 1., kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 103 END IF 62 104 ! 63 DO jn = 1, jpts 64 ! 65 SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 66 CASE('none' ) ; CYCLE 67 CASE('frs' ) ; CALL bdy_frs ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 68 CASE('specified' ) ; CALL bdy_spe ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 69 CASE('neumann' ) ; CALL bdy_nmn ( idx_bdy(ib_bdy), igrd , pts(:,:,:,jn,Kaa) ) 70 CASE('orlanski' ) ; CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), zdta(jn)%tra, ll_npo=.false. ) 71 CASE('orlanski_npo') ; CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), zdta(jn)%tra, ll_npo=.true. ) 72 CASE('runoff' ) ; CALL bdy_rnf ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), jn ) 73 CASE DEFAULT ; CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 74 END SELECT 75 ! Boundary points should be updated 76 CALL lbc_bdy_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T', 1., ib_bdy ) 77 ! 78 END DO 79 END DO 105 END DO ! ir 80 106 ! 81 107 END SUBROUTINE bdy_tra 82 108 83 109 84 SUBROUTINE bdy_rnf( idx, pt, jpa )110 SUBROUTINE bdy_rnf( idx, pt, jpa, llrim0 ) 85 111 !!---------------------------------------------------------------------- 86 112 !! *** SUBROUTINE bdy_rnf *** … … 91 117 !! 92 118 !!---------------------------------------------------------------------- 93 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 94 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt ! tracer trend 95 INTEGER, INTENT(in) :: jpa ! TRA index 119 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 120 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pt ! tracer trend 121 INTEGER, INTENT(in) :: jpa ! TRA index 122 LOGICAL, INTENT(in) :: llrim0 ! indicate if rim 0 is treated 96 123 ! 97 REAL(wp) :: zwgt ! boundary weight 98 INTEGER :: ib, ik, igrd ! dummy loop indices 99 INTEGER :: ii, ij, ip, jp ! 2D addresses 124 INTEGER :: ib, ii, ij, igrd ! dummy loop indices 100 125 !!---------------------------------------------------------------------- 101 126 ! 102 127 igrd = 1 ! Everything is at T-points here 103 DO ib = 1, idx%nblenrim(igrd)104 ii = idx%nbi(ib,igrd)105 ij = idx%nbj(ib,igrd)106 DO ik = 1, jpkm1107 ip = bdytmask(ii+1,ij ) - bdytmask(ii-1,ij )108 jp = bdytmask(ii ,ij+1) - bdytmask(ii ,ij-1)109 i f (jpa == jp_tem) pt(ii,ij,ik) = pt(ii+ip,ij+jp,ik) * tmask(ii,ij,ik)110 if (jpa == jp_sal) pt(ii,ij,ik) = 0.1 * tmask(ii,ij,ik)128 IF( jpa == jp_tem ) THEN 129 CALL bdy_nmn( idx, igrd, pt, llrim0 ) 130 ELSE IF( jpa == jp_sal ) THEN 131 IF( .NOT. llrim0 ) RETURN 132 DO ib = 1, idx%nblenrim(igrd) ! if llrim0 then treat the whole rim 133 ii = idx%nbi(ib,igrd) 134 ij = idx%nbj(ib,igrd) 135 pt(ii,ij,1:jpkm1) = 0.1 * tmask(ii,ij,1:jpkm1) 111 136 END DO 112 END DO137 END IF 113 138 ! 114 139 END SUBROUTINE bdy_rnf
Note: See TracChangeset
for help on using the changeset viewer.