- Timestamp:
- 2016-12-01T11:30:29+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2016/dev_merge_2016/NEMOGCM/NEMO/OPA_SRC/BDY/bdydyn3d.F90
r6140 r7412 6 6 !! History : 3.4 ! 2011 (D. Storkey) new module as part of BDY rewrite 7 7 !! 3.5 ! 2012 (S. Mocavero, I. Epicoco) Optimization of BDY communications 8 !!----------------------------------------------------------------------9 #if defined key_bdy10 !!----------------------------------------------------------------------11 !! 'key_bdy' : Unstructured Open Boundary Condition12 8 !!---------------------------------------------------------------------- 13 9 !! bdy_dyn3d : apply open boundary conditions to baroclinic velocities … … 57 53 CASE('orlanski' ) ; CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.false. ) 58 54 CASE('orlanski_npo'); CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, ll_npo=.true. ) 55 CASE('zerograd') ; CALL bdy_dyn3d_zgrad( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 56 CASE('neumann') ; CALL bdy_dyn3d_nmn( idx_bdy(ib_bdy), ib_bdy ) 59 57 CASE DEFAULT ; CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 60 58 END SELECT … … 110 108 END SUBROUTINE bdy_dyn3d_spe 111 109 110 SUBROUTINE bdy_dyn3d_zgrad( idx, dta, kt , ib_bdy ) 111 !!---------------------------------------------------------------------- 112 !! *** SUBROUTINE bdy_dyn3d_zgrad *** 113 !! 114 !! ** Purpose : - Enforce a zero gradient of normal velocity 115 !! 116 !!---------------------------------------------------------------------- 117 INTEGER :: kt 118 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 119 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 120 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 121 !! 122 INTEGER :: jb, jk ! dummy loop indices 123 INTEGER :: ii, ij, igrd ! local integers 124 REAL(wp) :: zwgt ! boundary weight 125 INTEGER :: fu, fv 126 !!---------------------------------------------------------------------- 127 ! 128 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_zgrad') 129 ! 130 igrd = 2 ! Copying tangential velocity into bdy points 131 DO jb = 1, idx%nblenrim(igrd) 132 DO jk = 1, jpkm1 133 ii = idx%nbi(jb,igrd) 134 ij = idx%nbj(jb,igrd) 135 fu = ABS( ABS (NINT( idx%flagu(jb,igrd) ) ) - 1 ) 136 ua(ii,ij,jk) = ua(ii,ij,jk) * REAL( 1 - fu) + ( ua(ii,ij+fu,jk) * umask(ii,ij+fu,jk) & 137 &+ ua(ii,ij-fu,jk) * umask(ii,ij-fu,jk) ) * umask(ii,ij,jk) * REAL( fu ) 138 END DO 139 END DO 140 ! 141 igrd = 3 ! Copying tangential velocity into bdy points 142 DO jb = 1, idx%nblenrim(igrd) 143 DO jk = 1, jpkm1 144 ii = idx%nbi(jb,igrd) 145 ij = idx%nbj(jb,igrd) 146 fv = ABS( ABS (NINT( idx%flagv(jb,igrd) ) ) - 1 ) 147 va(ii,ij,jk) = va(ii,ij,jk) * REAL( 1 - fv ) + ( va(ii+fv,ij,jk) * vmask(ii+fv,ij,jk) & 148 &+ va(ii-fv,ij,jk) * vmask(ii-fv,ij,jk) ) * vmask(ii,ij,jk) * REAL( fv ) 149 END DO 150 END DO 151 CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy ) ! Boundary points should be updated 152 CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy ) 153 ! 154 IF( kt .eq. nit000 ) CLOSE( unit = 102 ) 155 156 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_zgrad') 157 158 END SUBROUTINE bdy_dyn3d_zgrad 112 159 113 160 SUBROUTINE bdy_dyn3d_zro( idx, dta, kt, ib_bdy ) … … 296 343 END SUBROUTINE bdy_dyn3d_dmp 297 344 298 #else 299 !!---------------------------------------------------------------------- 300 !! Dummy module NO Unstruct Open Boundary Conditions 301 !!---------------------------------------------------------------------- 302 CONTAINS 303 SUBROUTINE bdy_dyn3d( kt ) ! Empty routine 304 WRITE(*,*) 'bdy_dyn3d: You should not have seen this print! error?', kt 305 END SUBROUTINE bdy_dyn3d 306 SUBROUTINE bdy_dyn3d_dmp( kt ) ! Empty routine 307 WRITE(*,*) 'bdy_dyn3d_dmp: You should not have seen this print! error?', kt 308 END SUBROUTINE bdy_dyn3d_dmp 309 #endif 345 SUBROUTINE bdy_dyn3d_nmn( idx, ib_bdy ) 346 !!---------------------------------------------------------------------- 347 !! *** SUBROUTINE bdy_dyn3d_nmn *** 348 !! 349 !! - Apply Neumann condition to baroclinic velocities. 350 !! - Wrapper routine for bdy_nmn 351 !! 352 !! 353 !!---------------------------------------------------------------------- 354 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 355 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 356 357 INTEGER :: jb, igrd ! dummy loop indices 358 !!---------------------------------------------------------------------- 359 360 IF( nn_timing == 1 ) CALL timing_start('bdy_dyn3d_nmn') 361 ! 362 !! Note that at this stage the ub and ua arrays contain the baroclinic velocities. 363 ! 364 igrd = 2 ! Neumann bc on u-velocity; 365 ! 366 CALL bdy_nmn( idx, igrd, ua ) 367 368 igrd = 3 ! Neumann bc on v-velocity 369 ! 370 CALL bdy_nmn( idx, igrd, va ) 371 ! 372 CALL lbc_bdy_lnk( ua, 'U', -1., ib_bdy ) ! Boundary points should be updated 373 CALL lbc_bdy_lnk( va, 'V', -1., ib_bdy ) 374 ! 375 IF( nn_timing == 1 ) CALL timing_stop('bdy_dyn3d_nmn') 376 ! 377 END SUBROUTINE bdy_dyn3d_nmn 310 378 311 379 !!======================================================================
Note: See TracChangeset
for help on using the changeset viewer.