- Timestamp:
- 2020-05-14T21:46:00+02:00 (4 years ago)
- Location:
- NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser
- Property svn:externals
-
old new 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL 8 9 # SETTE 10 ^/utils/CI/sette@HEAD sette
-
- Property svn:externals
-
NEMO/branches/2019/dev_r11078_OSMOSIS_IMMERSE_Nurser/src/OCE/BDY/bdydyn3d.F90
r12178 r12928 33 33 CONTAINS 34 34 35 SUBROUTINE bdy_dyn3d( kt )35 SUBROUTINE bdy_dyn3d( kt, Kbb, puu, pvv, Kaa ) 36 36 !!---------------------------------------------------------------------- 37 37 !! *** SUBROUTINE bdy_dyn3d *** … … 40 40 !! 41 41 !!---------------------------------------------------------------------- 42 INTEGER, INTENT(in) :: kt ! Main time step counter 42 INTEGER , INTENT( in ) :: kt ! Main time step counter 43 INTEGER , INTENT( in ) :: Kbb, Kaa ! Time level indices 44 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 43 45 ! 44 46 INTEGER :: ib_bdy, ir ! BDY set index, rim index … … 58 60 CASE('none') ; CYCLE 59 61 CASE('frs' ) ! treat the whole boundary at once 60 IF( ir == 0) CALL bdy_dyn3d_frs(idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy )62 IF( ir == 0) CALL bdy_dyn3d_frs( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 61 63 CASE('specified') ! treat the whole rim at once 62 IF( ir == 0) CALL bdy_dyn3d_spe(idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy )64 IF( ir == 0) CALL bdy_dyn3d_spe( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 63 65 CASE('zero') ! treat the whole rim at once 64 IF( ir == 0) CALL bdy_dyn3d_zro(idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy )65 CASE('orlanski' ) ; CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.false. )66 CASE('orlanski_npo'); CALL bdy_dyn3d_orlanski( idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.true. )67 CASE('zerograd') ; CALL bdy_dyn3d_zgrad( idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy, llrim0 )68 CASE('neumann') ; CALL bdy_dyn3d_nmn( idx_bdy(ib_bdy), ib_bdy, llrim0 )66 IF( ir == 0) CALL bdy_dyn3d_zro( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy ) 67 CASE('orlanski' ) ; CALL bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.false. ) 68 CASE('orlanski_npo'); CALL bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), ib_bdy, llrim0, ll_npo=.true. ) 69 CASE('zerograd') ; CALL bdy_dyn3d_zgrad( puu, pvv, Kaa, idx_bdy(ib_bdy), dta_bdy(ib_bdy), kt, ib_bdy, llrim0 ) 70 CASE('neumann') ; CALL bdy_dyn3d_nmn( puu, pvv, Kaa, idx_bdy(ib_bdy), ib_bdy, llrim0 ) 69 71 CASE DEFAULT ; CALL ctl_stop( 'bdy_dyn3d : unrecognised option for open boundaries for baroclinic velocities' ) 70 72 END SELECT … … 97 99 ! 98 100 IF( ANY(llsend2) .OR. ANY(llrecv2) ) THEN ! if need to send/recv in at least one direction 99 CALL lbc_lnk( 'bdydyn2d', ua, 'U', -1., kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 )101 CALL lbc_lnk( 'bdydyn2d', puu(:,:,:,Kaa), 'U', -1., kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 ) 100 102 END IF 101 103 IF( ANY(llsend3) .OR. ANY(llrecv3) ) THEN ! if need to send/recv in at least one direction 102 CALL lbc_lnk( 'bdydyn2d', va, 'V', -1., kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 )104 CALL lbc_lnk( 'bdydyn2d', pvv(:,:,:,Kaa), 'V', -1., kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 ) 103 105 END IF 104 106 END DO ! ir … … 107 109 108 110 109 SUBROUTINE bdy_dyn3d_spe( idx, dta, kt, ib_bdy )111 SUBROUTINE bdy_dyn3d_spe( puu, pvv, Kaa, idx, dta, kt, ib_bdy ) 110 112 !!---------------------------------------------------------------------- 111 113 !! *** SUBROUTINE bdy_dyn3d_spe *** … … 115 117 !! 116 118 !!---------------------------------------------------------------------- 117 INTEGER , INTENT(in) :: kt ! time step index 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 119 INTEGER , INTENT( in ) :: Kaa ! Time level index 120 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 121 TYPE(OBC_INDEX) , INTENT( in ) :: idx ! OBC indices 122 TYPE(OBC_DATA) , INTENT( in ) :: dta ! OBC external data 123 INTEGER , INTENT( in ) :: kt ! Time step 124 INTEGER , INTENT( in ) :: ib_bdy ! BDY set index 121 125 ! 122 126 INTEGER :: jb, jk ! dummy loop indices … … 129 133 ii = idx%nbi(jb,igrd) 130 134 ij = idx%nbj(jb,igrd) 131 ua(ii,ij,jk) = dta%u3d(jb,jk) * umask(ii,ij,jk)135 puu(ii,ij,jk,Kaa) = dta%u3d(jb,jk) * umask(ii,ij,jk) 132 136 END DO 133 137 END DO … … 138 142 ii = idx%nbi(jb,igrd) 139 143 ij = idx%nbj(jb,igrd) 140 va(ii,ij,jk) = dta%v3d(jb,jk) * vmask(ii,ij,jk)144 pvv(ii,ij,jk,Kaa) = dta%v3d(jb,jk) * vmask(ii,ij,jk) 141 145 END DO 142 146 END DO … … 145 149 146 150 147 SUBROUTINE bdy_dyn3d_zgrad( idx, dta, kt, ib_bdy, llrim0 )151 SUBROUTINE bdy_dyn3d_zgrad( puu, pvv, Kaa, idx, dta, kt, ib_bdy, llrim0 ) 148 152 !!---------------------------------------------------------------------- 149 153 !! *** SUBROUTINE bdy_dyn3d_zgrad *** … … 152 156 !! 153 157 !!---------------------------------------------------------------------- 154 INTEGER :: kt 155 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 156 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 157 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 158 LOGICAL, INTENT(in) :: llrim0 ! indicate if rim 0 is treated 158 INTEGER , INTENT( in ) :: Kaa ! Time level index 159 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 160 TYPE(OBC_INDEX) , INTENT( in ) :: idx ! OBC indices 161 TYPE(OBC_DATA) , INTENT( in ) :: dta ! OBC external data 162 INTEGER , INTENT( in ) :: kt 163 INTEGER , INTENT( in ) :: ib_bdy ! BDY set index 164 LOGICAL , INTENT( in ) :: llrim0 ! indicate if rim 0 is treated 159 165 !! 160 166 INTEGER :: jb, jk ! dummy loop indices … … 178 184 ! 179 185 DO jk = 1, jpkm1 180 ua(ii,ij,jk) = ua(ii,ij+flagv,jk) * umask(ii,ij+flagv,jk)186 puu(ii,ij,jk,Kaa) = puu(ii,ij+flagv,jk,Kaa) * umask(ii,ij+flagv,jk) 181 187 END DO 182 188 ! … … 198 204 ! 199 205 DO jk = 1, jpkm1 200 va(ii,ij,jk) = va(ii+flagu,ij,jk) * vmask(ii+flagu,ij,jk)206 pvv(ii,ij,jk,Kaa) = pvv(ii+flagu,ij,jk,Kaa) * vmask(ii+flagu,ij,jk) 201 207 END DO 202 208 ! … … 207 213 208 214 209 SUBROUTINE bdy_dyn3d_zro( idx, dta, kt, ib_bdy )215 SUBROUTINE bdy_dyn3d_zro( puu, pvv, Kaa, idx, dta, kt, ib_bdy ) 210 216 !!---------------------------------------------------------------------- 211 217 !! *** SUBROUTINE bdy_dyn3d_zro *** … … 214 220 !! 215 221 !!---------------------------------------------------------------------- 216 INTEGER , INTENT(in) :: kt ! time step index 217 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 218 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 219 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 222 INTEGER , INTENT( in ) :: kt ! time step index 223 INTEGER , INTENT( in ) :: Kaa ! Time level index 224 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 225 TYPE(OBC_INDEX) , INTENT( in ) :: idx ! OBC indices 226 TYPE(OBC_DATA) , INTENT( in ) :: dta ! OBC external data 227 INTEGER , INTENT( in ) :: ib_bdy ! BDY set index 220 228 ! 221 229 INTEGER :: ib, ik ! dummy loop indices … … 228 236 ij = idx%nbj(ib,igrd) 229 237 DO ik = 1, jpkm1 230 ua(ii,ij,ik) = 0._wp238 puu(ii,ij,ik,Kaa) = 0._wp 231 239 END DO 232 240 END DO … … 237 245 ij = idx%nbj(ib,igrd) 238 246 DO ik = 1, jpkm1 239 va(ii,ij,ik) = 0._wp247 pvv(ii,ij,ik,Kaa) = 0._wp 240 248 END DO 241 249 END DO … … 244 252 245 253 246 SUBROUTINE bdy_dyn3d_frs( idx, dta, kt, ib_bdy )254 SUBROUTINE bdy_dyn3d_frs( puu, pvv, Kaa, idx, dta, kt, ib_bdy ) 247 255 !!---------------------------------------------------------------------- 248 256 !! *** SUBROUTINE bdy_dyn3d_frs *** … … 255 263 !! topography. Tellus, 365-382. 256 264 !!---------------------------------------------------------------------- 257 INTEGER , INTENT(in) :: kt ! time step index 258 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 259 TYPE(OBC_DATA) , INTENT(in) :: dta ! OBC external data 260 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 265 INTEGER , INTENT( in ) :: kt ! time step index 266 INTEGER , INTENT( in ) :: Kaa ! Time level index 267 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 268 TYPE(OBC_INDEX) , INTENT( in ) :: idx ! OBC indices 269 TYPE(OBC_DATA) , INTENT( in ) :: dta ! OBC external data 270 INTEGER , INTENT( in ) :: ib_bdy ! BDY set index 261 271 ! 262 272 INTEGER :: jb, jk ! dummy loop indices … … 271 281 ij = idx%nbj(jb,igrd) 272 282 zwgt = idx%nbw(jb,igrd) 273 ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta%u3d(jb,jk) - ua(ii,ij,jk) ) ) * umask(ii,ij,jk)283 puu(ii,ij,jk,Kaa) = ( puu(ii,ij,jk,Kaa) + zwgt * ( dta%u3d(jb,jk) - puu(ii,ij,jk,Kaa) ) ) * umask(ii,ij,jk) 274 284 END DO 275 285 END DO … … 281 291 ij = idx%nbj(jb,igrd) 282 292 zwgt = idx%nbw(jb,igrd) 283 va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta%v3d(jb,jk) - va(ii,ij,jk) ) ) * vmask(ii,ij,jk)293 pvv(ii,ij,jk,Kaa) = ( pvv(ii,ij,jk,Kaa) + zwgt * ( dta%v3d(jb,jk) - pvv(ii,ij,jk,Kaa) ) ) * vmask(ii,ij,jk) 284 294 END DO 285 295 END DO … … 288 298 289 299 290 SUBROUTINE bdy_dyn3d_orlanski( idx, dta, ib_bdy, llrim0, ll_npo )300 SUBROUTINE bdy_dyn3d_orlanski( Kbb, puu, pvv, Kaa, idx, dta, ib_bdy, llrim0, ll_npo ) 291 301 !!---------------------------------------------------------------------- 292 302 !! *** SUBROUTINE bdy_dyn3d_orlanski *** … … 298 308 !! References: Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001) 299 309 !!---------------------------------------------------------------------- 300 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 301 TYPE(OBC_DATA), INTENT(in) :: dta ! OBC external data 302 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 303 LOGICAL, INTENT(in) :: llrim0 ! indicate if rim 0 is treated 304 LOGICAL, INTENT(in) :: ll_npo ! switch for NPO version 310 INTEGER , INTENT( in ) :: Kbb, Kaa ! Time level indices 311 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 312 TYPE(OBC_INDEX) , INTENT( in ) :: idx ! OBC indices 313 TYPE(OBC_DATA) , INTENT( in ) :: dta ! OBC external data 314 INTEGER , INTENT( in ) :: ib_bdy ! BDY set index 315 LOGICAL , INTENT( in ) :: llrim0 ! indicate if rim 0 is treated 316 LOGICAL , INTENT( in ) :: ll_npo ! switch for NPO version 305 317 306 318 INTEGER :: jb, igrd ! dummy loop indices 307 319 !!---------------------------------------------------------------------- 308 320 ! 309 !! Note that at this stage the ub and uaarrays contain the baroclinic velocities.321 !! Note that at this stage the puu(:,:,:,Kbb) and puu(:,:,:,Kaa) arrays contain the baroclinic velocities. 310 322 ! 311 323 igrd = 2 ! Orlanski bc on u-velocity; 312 324 ! 313 CALL bdy_orlanski_3d( idx, igrd, ub, ua, dta%u3d, ll_npo, llrim0 )325 CALL bdy_orlanski_3d( idx, igrd, puu(:,:,:,Kbb), puu(:,:,:,Kaa), dta%u3d, ll_npo, llrim0 ) 314 326 315 327 igrd = 3 ! Orlanski bc on v-velocity 316 328 ! 317 CALL bdy_orlanski_3d( idx, igrd, vb, va, dta%v3d, ll_npo, llrim0 )329 CALL bdy_orlanski_3d( idx, igrd, pvv(:,:,:,Kbb), pvv(:,:,:,Kaa), dta%v3d, ll_npo, llrim0 ) 318 330 ! 319 331 END SUBROUTINE bdy_dyn3d_orlanski 320 332 321 333 322 SUBROUTINE bdy_dyn3d_dmp( kt )334 SUBROUTINE bdy_dyn3d_dmp( kt, Kbb, puu, pvv, Krhs ) 323 335 !!---------------------------------------------------------------------- 324 336 !! *** SUBROUTINE bdy_dyn3d_dmp *** … … 327 339 !! 328 340 !!---------------------------------------------------------------------- 329 INTEGER, INTENT(in) :: kt ! time step index 341 INTEGER , INTENT( in ) :: kt ! time step 342 INTEGER , INTENT( in ) :: Kbb, Krhs ! Time level indices 343 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities and trends (to be updated at open boundaries) 330 344 ! 331 345 INTEGER :: jb, jk ! dummy loop indices … … 345 359 zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd) 346 360 DO jk = 1, jpkm1 347 ua(ii,ij,jk) = ( ua(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - &348 ub(ii,ij,jk) + ub_b(ii,ij)) ) * umask(ii,ij,jk)361 puu(ii,ij,jk,Krhs) = ( puu(ii,ij,jk,Krhs) + zwgt * ( dta_bdy(ib_bdy)%u3d(jb,jk) - & 362 puu(ii,ij,jk,Kbb) + uu_b(ii,ij,Kbb)) ) * umask(ii,ij,jk) 349 363 END DO 350 364 END DO … … 356 370 zwgt = idx_bdy(ib_bdy)%nbd(jb,igrd) 357 371 DO jk = 1, jpkm1 358 va(ii,ij,jk) = ( va(ii,ij,jk) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) - &359 vb(ii,ij,jk) + vb_b(ii,ij)) ) * vmask(ii,ij,jk)372 pvv(ii,ij,jk,Krhs) = ( pvv(ii,ij,jk,Krhs) + zwgt * ( dta_bdy(ib_bdy)%v3d(jb,jk) - & 373 pvv(ii,ij,jk,Kbb) + vv_b(ii,ij,Kbb)) ) * vmask(ii,ij,jk) 360 374 END DO 361 375 END DO … … 368 382 369 383 370 SUBROUTINE bdy_dyn3d_nmn( idx, ib_bdy, llrim0 )384 SUBROUTINE bdy_dyn3d_nmn( puu, pvv, Kaa, idx, ib_bdy, llrim0 ) 371 385 !!---------------------------------------------------------------------- 372 386 !! *** SUBROUTINE bdy_dyn3d_nmn *** … … 377 391 !! 378 392 !!---------------------------------------------------------------------- 379 TYPE(OBC_INDEX), INTENT(in) :: idx ! OBC indices 380 INTEGER, INTENT(in) :: ib_bdy ! BDY set index 381 LOGICAL, INTENT(in) :: llrim0 ! indicate if rim 0 is treated 393 INTEGER , INTENT( in ) :: Kaa ! Time level index 394 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) :: puu, pvv ! Ocean velocities (to be updated at open boundaries) 395 TYPE(OBC_INDEX) , INTENT( in ) :: idx ! OBC indices 396 INTEGER , INTENT( in ) :: ib_bdy ! BDY set index 397 LOGICAL , INTENT( in ) :: llrim0 ! indicate if rim 0 is treated 382 398 INTEGER :: igrd ! dummy indice 383 399 !!---------------------------------------------------------------------- 384 400 ! 385 !! Note that at this stage the ub and uaarrays contain the baroclinic velocities.401 !! Note that at this stage the puu(:,:,:,Kbb) and puu(:,:,:,Kaa) arrays contain the baroclinic velocities. 386 402 ! 387 403 igrd = 2 ! Neumann bc on u-velocity; 388 404 ! 389 CALL bdy_nmn( idx, igrd, ua, llrim0 ) ! ua is masked405 CALL bdy_nmn( idx, igrd, puu(:,:,:,Kaa), llrim0 ) 390 406 391 407 igrd = 3 ! Neumann bc on v-velocity 392 408 ! 393 CALL bdy_nmn( idx, igrd, va, llrim0 ) ! va is masked409 CALL bdy_nmn( idx, igrd, pvv(:,:,:,Kaa), llrim0 ) 394 410 ! 395 411 END SUBROUTINE bdy_dyn3d_nmn
Note: See TracChangeset
for help on using the changeset viewer.