119
120
124
127# ifdef DISTRIBUTE
129# endif
130
131
132
133 integer, intent(in) :: ng, tile
134 integer, intent(in) :: LBi, UBi, LBj, UBj
135 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
136 integer, intent(in) :: nstp, nnew
137
138# ifdef ASSUMED_SHAPE
139# ifdef WET_DRY
140 real(r8), intent(in) :: rmask_wet(LBi:,LBj:)
141# endif
142# ifdef BBL_MODEL
143 real(r8), intent(in) :: bustrc(LBi:,LBj:)
144 real(r8), intent(in) :: bvstrc(LBi:,LBj:)
145 real(r8), intent(in) :: bustrw(LBi:,LBj:)
146 real(r8), intent(in) :: bvstrw(LBi:,LBj:)
147 real(r8), intent(in) :: bustrcwmax(LBi:,LBj:)
148 real(r8), intent(in) :: bvstrcwmax(LBi:,LBj:)
149# else
150 real(r8), intent(in) :: bustr(LBi:,LBj:)
151 real(r8), intent(in) :: bvstr(LBi:,LBj:)
152# endif
153# if defined SED_MORPH
154 real(r8), intent(inout):: bed_thick(LBi:,LBj:,:)
155# endif
156 real(r8), intent(inout) :: t(LBi:,LBj:,:,:,:)
157# ifdef SUSPLOAD
158 real(r8), intent(inout) :: ero_flux(LBi:,LBj:,:)
159 real(r8), intent(inout) :: settling_flux(LBi:,LBj:,:)
160# endif
161 real(r8), intent(inout) :: bed(LBi:,LBj:,:,:)
162 real(r8), intent(inout) :: bed_frac(LBi:,LBj:,:,:)
163 real(r8), intent(inout) :: bed_mass(LBi:,LBj:,:,:,:)
164 real(r8), intent(inout) :: bottom(LBi:,LBj:,:)
165# else
166# ifdef WET_DRY
167 real(r8), intent(in) :: rmask_wet(LBi:UBi,LBj:UBj)
168# endif
169# ifdef BBL_MODEL
170 real(r8), intent(in) :: bustrc(LBi:UBi,LBj:UBj)
171 real(r8), intent(in) :: bvstrc(LBi:UBi,LBj:UBj)
172 real(r8), intent(in) :: bustrw(LBi:UBi,LBj:UBj)
173 real(r8), intent(in) :: bvstrw(LBi:UBi,LBj:UBj)
174 real(r8), intent(in) :: bustrcwmax(LBi:UBi,LBj:UBj)
175 real(r8), intent(in) :: bvstrcwmax(LBi:UBi,LBj:UBj)
176# else
177 real(r8), intent(in) :: bustr(LBi:UBi,LBj:UBj)
178 real(r8), intent(in) :: bvstr(LBi:UBi,LBj:UBj)
179# endif
180# if defined SED_MORPH
181 real(r8), intent(inout):: bed_thick(LBi:UBi,LBj:UBj,3)
182# endif
183 real(r8), intent(inout) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
184# ifdef SUSPLOAD
185 real(r8), intent(inout) :: ero_flux(LBi:UBi,LBj:UBj,NST)
186 real(r8), intent(inout) :: settling_flux(LBi:UBi,LBj:UBj,NST)
187# endif
188 real(r8), intent(inout) :: bed(LBi:UBi,LBj:UBj,Nbed,MBEDP)
189 real(r8), intent(inout) :: bed_frac(LBi:UBi,LBj:UBj,Nbed,NST)
190 real(r8), intent(inout) :: bed_mass(LBi:UBi,LBj:UBj,Nbed,1:2,NST)
191 real(r8), intent(inout) :: bottom(LBi:UBi,LBj:UBj,MBOTP)
192# endif
193
194
195
196 integer :: Ksed, i, ised, j, k, ks
197 integer :: bnew
198
199 real(r8), parameter :: eps = 1.0e-14_r8
200
201 real(r8) :: cff, cff1, cff2, cff3
202 real(r8) :: thck_avail, thck_to_add
203
204 real(r8), dimension(IminS:ImaxS,NST) :: dep_mass
205 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tau_w
206
207# include "set_bounds.h"
208
209# ifdef BEDLOAD
210 bnew=nnew
211# else
212 bnew=nstp
213# endif
214
215
216
217
218
219# if defined BEDLOAD_MPM || defined SUSPLOAD
220# ifdef BBL_MODEL
221 DO j=jstr-1,jend+1
222 DO i=istr-1,iend+1
223 tau_w(i,j)=sqrt(bustrcwmax(i,j)*bustrcwmax(i,j)+ &
224 & bvstrcwmax(i,j)*bvstrcwmax(i,j))
225# ifdef WET_DRY
226 tau_w(i,j)=tau_w(i,j)*rmask_wet(i,j)
227# endif
228 END DO
229 END DO
230# else
231 DO j=jstrm1,jendp1
232 DO i=istrm1,iendp1
233 tau_w(i,j)=0.5_r8*sqrt((bustr(i,j)+bustr(i+1,j))* &
234 & (bustr(i,j)+bustr(i+1,j))+ &
235 & (bvstr(i,j)+bvstr(i,j+1))* &
236 & (bvstr(i,j)+bvstr(i,j+1)))
237# ifdef WET_DRY
238 tau_w(i,j)=tau_w(i,j)*rmask_wet(i,j)
239# endif
240 END DO
241 END DO
242# endif
243# endif
244
245
246
247
248
249# ifdef SUSPLOAD
250 j_loop : DO j=jstr,jend
251 sed_loop:
DO ised=1,
nst
252
253
254
255
256
257
258
259
260 DO i=istr,iend
261 dep_mass(i,ised)=0.0_r8
262
263# ifdef SED_MORPH
264
265
266
267 ero_flux(i,j,ised)=ero_flux(i,j,ised)*
morph_fac(ised,ng)
268 settling_flux(i,j,ised)=settling_flux(i,j,ised)* &
270
271# endif
272 IF ((ero_flux(i,j,ised)-settling_flux(i,j,ised)).lt. &
273 & 0.0_r8) THEN
274
275
276
277
278 IF ((
time(ng).gt.(bed(i,j,1,
iaged)+1.1_r8*
dt(ng))).and. &
280 dep_mass(i,ised)=settling_flux(i,j,ised)- &
281 & ero_flux(i,j,ised)
282 END IF
284 END IF
285
286
287
288 bed_mass(i,j,1,nnew,ised)=max(bed_mass(i,j,1,bnew,ised)- &
289 & (ero_flux(i,j,ised)- &
290 & settling_flux(i,j,ised)), &
291 & 0.0_r8)
293 bed_mass(i,j,k,nnew,ised)=bed_mass(i,j,k,nstp,ised)
294 END DO
295 END DO
296 END DO sed_loop
297
298
299
300
301 DO i=istr,iend
302 cff=0.0_r8
303
304
305
308 cff=cff+dep_mass(i,ised)
309 END DO
310 IF (cff.gt.0.0_r8) THEN
311
312
313
319 bed_mass(i,j,
nbed,nnew,ised)= &
320 & bed_mass(i,j,
nbed-1,nnew,ised)+ &
321 & bed_mass(i,j,
nbed ,nnew,ised)
322 END DO
323
324
325
330 bed_mass(i,j,k,nnew,ised)=bed_mass(i,j,k-1,nnew,ised)
331 END DO
332 END DO
333
334
335
337 bed_mass(i,j,2,nnew,ised)=max(bed_mass(i,j,2,nnew,ised)-&
338 & dep_mass(i,ised),0.0_r8)
339 bed_mass(i,j,1,nnew,ised)=dep_mass(i,ised)
340 END DO
341 END IF
342 END IF
343
344
345
347 cff3=0.0_r8
349 cff3=cff3+bed_mass(i,j,k,nnew,ised)
350 END DO
351 IF (cff3.eq.0.0_r8) THEN
352 cff3=eps
353 END IF
354 bed(i,j,k,
ithck)=0.0_r8
356 bed_frac(i,j,k,ised)=bed_mass(i,j,k,nnew,ised)/cff3
358 & bed_mass(i,j,k,nnew,ised)/ &
360 & (1.0_r8-bed(i,j,k,
iporo))),0.0_r8)
361 END DO
362 END DO
363 END DO
364 END DO j_loop
365
366
367
368# endif
369
370
371
372
373
374 j_loop2 : DO j=jstr,jend
375 DO i=istr,iend
376
377
378
379 bottom(i,j,
iactv)=max(0.0_r8, &
380 & 0.007_r8* &
381 & (tau_w(i,j)-bottom(i,j,
itauc))*
rho0)+ &
382 & 6.0_r8*bottom(i,j,
isd50)
383
384# ifdef SED_MORPH
385
386
387
390# endif
391
392 IF (bottom(i,j,
iactv).gt.bed(i,j,1,
ithck))
THEN
395 ELSE
396 thck_to_add=bottom(i,j,
iactv)-bed(i,j,1,
ithck)
397 thck_avail=0.0_r8
398 ksed=1
400 IF (thck_avail.lt.thck_to_add) THEN
401 thck_avail=thck_avail+bed(i,j,k,
ithck)
402 ksed=k
403 END IF
404 END DO
405
406
407
408 IF (thck_avail.lt.thck_to_add) THEN
410 thck_to_add=thck_avail
411 END IF
412
413
414
415 cff2=max(thck_avail-thck_to_add,0.0_r8)/ &
416 & max(bed(i,j,ksed,
ithck),eps)
418 cff1=0.0_r8
419 DO k=1,ksed
420 cff1=cff1+bed_mass(i,j,k,nnew,ised)
421 END DO
422 cff3=cff2*bed_mass(i,j,ksed,nnew,ised)
423 bed_mass(i,j,1 ,nnew,ised)=cff1-cff3
424 bed_mass(i,j,ksed,nnew,ised)=cff3
425 END DO
426
427
428
429 bed(i,j,ksed,
ithck)=max(thck_avail-thck_to_add,0.0_r8)
430
431
432
433 cff3=0.0_r8
435 cff3=cff3+bed_mass(i,j,1,nnew,ised)
436 END DO
437 IF (cff3.eq.0.0_r8) THEN
438 cff3=eps
439 END IF
441 bed_frac(i,j,1,ised)=bed_mass(i,j,1,nnew,ised)/cff3
442 END DO
443
444
445
447
448
449
451 ks=ksed-2
456 bed_frac(i,j,k-ks,ised)=bed_frac(i,j,k,ised)
457 bed_mass(i,j,k-ks,nnew,ised)=bed_mass(i,j,k,nnew,ised)
458 END DO
459 END DO
460
461
462
463
464 ks=ksed-2
465 cff=1.0_r8/real(ks+1,r8)
470 bed_frac(i,j,k,ised)=bed_frac(i,j,
nbed-ks,ised)
471 bed_mass(i,j,k,nnew,ised)= &
472 & bed_mass(i,j,
nbed-ks,nnew,ised)*cff
473 END DO
474 END DO
475 END IF
476 END IF
477 END DO
478 END DO j_loop2
479
480
481
482
483
484# if defined SED_MORPH
485 DO j=jstrr,jendr
486 DO i=istrr,iendr
487 bed_thick(i,j,nnew)=0.0_r8
489 bed_thick(i,j,nnew)=bed_thick(i,j,nnew)+ &
491 END DO
492 END DO
493 END DO
496 & lbi, ubi, lbj, ubj, &
497 & bed_thick(:,:,nnew))
498 END IF
499# endif
500
501
502
503
504
507 & lbi, ubi, lbj, ubj, 1,
nbed, &
508 & bed_frac(:,:,:,ised))
510 & lbi, ubi, lbj, ubj, 1,
nbed, &
511 & bed_mass(:,:,:,nnew,ised))
512 END DO
513# ifdef DISTRIBUTE
515 & lbi, ubi, lbj, ubj, 1,
nbed, 1,
nst, &
518 & bed_frac, &
519 & bed_mass(:,:,:,nnew,:))
520# endif
521
524 & lbi, ubi, lbj, ubj, 1,
nbed, &
525 & bed(:,:,:,i))
526 END DO
527# ifdef DISTRIBUTE
529 & lbi, ubi, lbj, ubj, 1,
nbed, 1,
mbedp, &
532 & bed)
533# endif
534
535 RETURN
subroutine bc_r3d_tile(ng, tile, lbi, ubi, lbj, ubj, lbk, ubk, a)
subroutine exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, a)
real(dp), dimension(:), allocatable dt
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic
real(dp), dimension(:), allocatable time
real(r8), dimension(:,:), allocatable srho
real(r8), dimension(:,:), allocatable morph_fac
real(r8), dimension(:), allocatable newlayer_thick
subroutine mp_exchange4d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, nghost, ew_periodic, ns_periodic, a, b, c)
subroutine mp_exchange3d(ng, tile, model, nvar, lbi, ubi, lbj, ubj, lbk, ubk, nghost, ew_periodic, ns_periodic, a, b, c, d)