Changeset 13527
- Timestamp:
- 2020-09-25T18:00:14+02:00 (4 years ago)
- Location:
- NEMO/trunk/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/BDY/bdylib.F90
r13526 r13527 100 100 !! 101 101 !!---------------------------------------------------------------------- 102 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices103 REAL(wp), DIMENSION(:,:), POINTER, INTENT(in) :: dta ! OBC external data104 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phib ! before tracer field105 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phia ! tracer trend106 LOGICAL , OPTIONAL, INTENT(in) :: lrim0 ! indicate if rim 0 is treated107 LOGICAL , INTENT(in) :: ll_npo ! switch for NPO version102 TYPE(OBC_INDEX), INTENT(in ) :: idx ! OBC indices 103 REAL(wp), DIMENSION(:,:), POINTER, INTENT(in ) :: dta ! OBC external data 104 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phib ! before tracer field 105 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: phia ! tracer trend 106 LOGICAL , INTENT(in ) :: lrim0 ! indicate if rim 0 is treated 107 LOGICAL , INTENT(in ) :: ll_npo ! switch for NPO version 108 108 !! 109 109 INTEGER :: igrd ! grid index … … 133 133 REAL(wp), DIMENSION(:,:), INTENT(inout) :: phia ! model after 2D field (to be updated) 134 134 REAL(wp), DIMENSION(: ), POINTER, INTENT(in ) :: phi_ext ! external forcing data 135 LOGICAL , OPTIONAL,INTENT(in ) :: lrim0 ! indicate if rim 0 is treated135 LOGICAL , INTENT(in ) :: lrim0 ! indicate if rim 0 is treated 136 136 LOGICAL , INTENT(in ) :: ll_npo ! switch for NPO version 137 137 ! … … 188 188 END SELECT 189 189 ! 190 IF( PRESENT(lrim0) ) THEN 191 IF( lrim0 ) THEN ; ibeg = 1 ; iend = idx%nblenrim0(igrd) ! rim 0 192 ELSE ; ibeg = idx%nblenrim0(igrd)+1 ; iend = idx%nblenrim(igrd) ! rim 1 193 END IF 194 ELSE ; ibeg = 1 ; iend = idx%nblenrim(igrd) ! both 195 END IF 190 IF( lrim0 ) THEN ; ibeg = 1 ; iend = idx%nblenrim0(igrd) ! rim 0 191 ELSE ; ibeg = idx%nblenrim0(igrd)+1 ; iend = idx%nblenrim(igrd) ! rim 1 192 ENDIF 196 193 ! 197 194 DO jb = ibeg, iend … … 275 272 & - (1.-zsign_ups) * zry * ( phib(iijp1,ijjp1) - phib(ii ,ij ) ) & 276 273 & + zwgt * ( phi_ext(jb) - phib(ii,ij) ) ) / ( 1. + zrx ) 277 end 274 endif 278 275 phia(ii,ij) = phia(ii,ij) * zmask(ii,ij) 279 276 END DO … … 298 295 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phia ! model after 3D field (to be updated) 299 296 REAL(wp), DIMENSION(:,: ), POINTER, INTENT(in ) :: phi_ext ! external forcing data 300 LOGICAL , OPTIONAL,INTENT(in ) :: lrim0 ! indicate if rim 0 is treated297 LOGICAL , INTENT(in ) :: lrim0 ! indicate if rim 0 is treated 301 298 LOGICAL , INTENT(in ) :: ll_npo ! switch for NPO version 302 299 ! … … 353 350 END SELECT 354 351 ! 355 IF( PRESENT(lrim0) ) THEN 356 IF( lrim0 ) THEN ; ibeg = 1 ; iend = idx%nblenrim0(igrd) ! rim 0 357 ELSE ; ibeg = idx%nblenrim0(igrd)+1 ; iend = idx%nblenrim(igrd) ! rim 1 358 END IF 359 ELSE ; ibeg = 1 ; iend = idx%nblenrim(igrd) ! both 360 END IF 352 IF( lrim0 ) THEN ; ibeg = 1 ; iend = idx%nblenrim0(igrd) ! rim 0 353 ELSE ; ibeg = idx%nblenrim0(igrd)+1 ; iend = idx%nblenrim(igrd) ! rim 1 354 ENDIF 361 355 ! 362 356 DO jk = 1, jpk … … 441 435 & - (1.-zsign_ups) * zry * ( phib(iijp1,ijjp1,jk) - phib(ii ,ij ,jk) ) & 442 436 & + zwgt * ( phi_ext(jb,jk) - phib(ii,ij,jk) ) ) / ( 1. + zrx ) 443 end 437 endif 444 438 phia(ii,ij,jk) = phia(ii,ij,jk) * zmask(ii,ij,jk) 445 439 END DO … … 466 460 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phia ! model after 3D field (to be updated), must be masked 467 461 TYPE(OBC_INDEX), INTENT(in ) :: idx ! OBC indices 468 LOGICAL , OPTIONAL,INTENT(in ) :: lrim0 ! indicate if rim 0 is treated462 LOGICAL , INTENT(in ) :: lrim0 ! indicate if rim 0 is treated 469 463 !! 470 464 REAL(wp) :: zweight … … 486 480 END SELECT 487 481 ! 488 IF( PRESENT(lrim0) ) THEN 489 IF( lrim0 ) THEN ; ibeg = 1 ; iend = idx%nblenrim0(igrd) ! rim 0 490 ELSE ; ibeg = idx%nblenrim0(igrd)+1 ; iend = idx%nblenrim(igrd) ! rim 1 491 END IF 492 ELSE ; ibeg = 1 ; iend = idx%nblenrim(igrd) ! both 493 END IF 482 IF( lrim0 ) THEN ; ibeg = 1 ; iend = idx%nblenrim0(igrd) ! rim 0 483 ELSE ; ibeg = idx%nblenrim0(igrd)+1 ; iend = idx%nblenrim(igrd) ! rim 1 484 ENDIF 494 485 ! 495 486 DO ib = ibeg, iend -
NEMO/trunk/src/OCE/BDY/bdytra.F90
r13226 r13527 61 61 IF( ir == 0 ) THEN ; llrim0 = .TRUE. 62 62 ELSE ; llrim0 = .FALSE. 63 END 63 ENDIF 64 64 DO ib_bdy=1, nb_bdy 65 65 ! … … 69 69 DO jn = 1, jpts 70 70 ! 71 SELECT CASE( TRIM(cn_tra(ib_bdy)) )71 SELECT CASE( cn_tra(ib_bdy) ) 72 72 CASE('none' ) ; CYCLE 73 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 )74 IF( ir == 0 ) CALL bdy_frs ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 75 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 masked78 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 )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), zdta(jn)%tra, & 79 & llrim0, ll_npo=.FALSE. ) 80 CASE('orlanski_npo') ; CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), zdta(jn)%tra, & 81 & llrim0, ll_npo=.TRUE. ) 82 CASE('runoff' ) ; CALL bdy_rnf ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kaa), jn, llrim0 ) 83 83 CASE DEFAULT ; CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 84 84 END SELECT … … 88 88 ! 89 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 90 IF( nn_hls == 1 ) THEN ; llsend1(:) = .false. ; llrecv1(:) = .false. ; ENDIF 91 91 DO ib_bdy=1, nb_bdy 92 SELECT CASE( TRIM(cn_tra(ib_bdy)) )92 SELECT CASE( cn_tra(ib_bdy) ) 93 93 CASE('neumann','runoff') 94 94 llsend1(:) = llsend1(:) .OR. lsend_bdyint(ib_bdy,1,:,ir) ! possibly every direction, T points … … 101 101 IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN ! if need to send/recv in at least one direction 102 102 CALL lbc_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T', 1.0_wp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 103 END 103 ENDIF 104 104 ! 105 105 END DO ! ir … … 135 135 pt(ii,ij,1:jpkm1) = 0.1 * tmask(ii,ij,1:jpkm1) 136 136 END DO 137 END 137 ENDIF 138 138 ! 139 139 END SUBROUTINE bdy_rnf -
NEMO/trunk/src/TOP/trcbdy.F90
r13226 r13527 49 49 INTEGER :: ib_bdy ,ir, jn ,igrd ! Loop indices 50 50 REAL(wp), POINTER, DIMENSION(:,:) :: ztrc 51 REAL(wp), POINTER :: zfac52 51 LOGICAL :: llrim0 ! indicate if rim 0 is treated 53 52 LOGICAL, DIMENSION(4) :: llsend1, llrecv1 ! indicate how communications are to be carried out … … 61 60 IF( ir == 0 ) THEN ; llrim0 = .TRUE. 62 61 ELSE ; llrim0 = .FALSE. 63 END 62 ENDIF 64 63 DO ib_bdy=1, nb_bdy 64 ! 65 65 DO jn = 1, jptra 66 66 ! 67 ztrc => trcdta_bdy(jn,ib_bdy)%trc 68 zfac => trcdta_bdy(jn,ib_bdy)%rn_fac 67 IF( ASSOCIATED(trcdta_bdy(jn,ib_bdy)%trc) .AND. trcdta_bdy(jn,ib_bdy)%cn_obc /= 'neumann' ) THEN 68 IF( .NOT. ASSOCIATED(ztrc) ) ALLOCATE( ztrc(idx_bdy(ib_bdy)%nblen(igrd),jpk) ) 69 ztrc(:,:) = trcdta_bdy(jn,ib_bdy)%trc(:,:) * trcdta_bdy(jn,ib_bdy)%rn_fac 70 ENDIF 69 71 ! 70 SELECT CASE( TRIM(trcdta_bdy(jn,ib_bdy)%cn_obc))72 SELECT CASE( trcdta_bdy(jn,ib_bdy)%cn_obc ) 71 73 CASE('none' ) ; CYCLE 72 74 CASE('frs' ) ! treat the whole boundary at once 73 IF( ir == 0 ) CALL bdy_frs( idx_bdy(ib_bdy), tr(:,:,:,jn,Krhs), ztrc*zfac )75 IF( ir == 0 ) CALL bdy_frs( idx_bdy(ib_bdy), tr(:,:,:,jn,Krhs), ztrc ) 74 76 CASE('specified' ) ! treat the whole rim at once 75 IF( ir == 0 ) CALL bdy_spe( idx_bdy(ib_bdy), tr(:,:,:,jn,Krhs), ztrc*zfac ) 76 CASE('neumann' ) ; CALL bdy_nmn( idx_bdy(ib_bdy), igrd , tr(:,:,:,jn,Krhs) ) ! tra masked 77 CASE('orlanski' ) ; CALL bdy_orl( idx_bdy(ib_bdy), tr(:,:,:,jn,Kbb), tr(:,:,:,jn,Krhs), ztrc*zfac, ll_npo=.false. ) 78 CASE('orlanski_npo') ; CALL bdy_orl( idx_bdy(ib_bdy), tr(:,:,:,jn,Kbb), tr(:,:,:,jn,Krhs), ztrc*zfac, ll_npo=.true. ) 77 IF( ir == 0 ) CALL bdy_spe( idx_bdy(ib_bdy), tr(:,:,:,jn,Krhs), ztrc ) 78 CASE('neumann' ) ; CALL bdy_nmn( idx_bdy(ib_bdy), igrd , tr(:,:,:,jn,Krhs), llrim0 ) ! tra masked 79 CASE('orlanski' ) ; CALL bdy_orl( idx_bdy(ib_bdy), tr(:,:,:,jn,Kbb), tr(:,:,:,jn,Krhs), ztrc, llrim0, & 80 & ll_npo=.FALSE. ) 81 CASE('orlanski_npo') ; CALL bdy_orl( idx_bdy(ib_bdy), tr(:,:,:,jn,Kbb), tr(:,:,:,jn,Krhs), ztrc, llrim0, & 82 & ll_npo=.TRUE. ) 79 83 CASE DEFAULT ; CALL ctl_stop( 'trc_bdy : unrecognised option for open boundaries for passive tracers' ) 80 84 END SELECT 81 85 ! 82 86 END DO 87 ! 88 IF( ASSOCIATED(ztrc) ) DEALLOCATE(ztrc) 89 ! 83 90 END DO 84 91 ! 85 92 IF( nn_hls > 1 .AND. ir == 1 ) CYCLE ! at least 2 halos will be corrected -> no need to correct rim 1 before rim 0 86 IF( nn_hls == 1 ) THEN ; llsend1(:) = .false. ; llrecv1(:) = .false. ; END 93 IF( nn_hls == 1 ) THEN ; llsend1(:) = .false. ; llrecv1(:) = .false. ; ENDIF 87 94 DO ib_bdy=1, nb_bdy 88 SELECT CASE( TRIM(cn_tra(ib_bdy)) )95 SELECT CASE( cn_tra(ib_bdy) ) 89 96 CASE('neumann') 90 97 llsend1(:) = llsend1(:) .OR. lsend_bdyint(ib_bdy,1,:,ir) ! possibly every direction, T points … … 97 104 IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN ! if need to send/recv in at least one direction 98 105 CALL lbc_lnk( 'trcbdy', tr(:,:,:,:,Krhs), 'T', 1.0_wp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 99 END 106 ENDIF 100 107 ! 101 108 END DO ! ir
Note: See TracChangeset
for help on using the changeset viewer.