141
142
148
150#ifdef DISTRIBUTE
152#endif
153
154
155
156
157 integer, intent(in) :: ng, tile
158 integer, intent(in) :: LBi, UBi, LBj, UBj
159 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
160 integer, intent(in) :: nrhs
161
162#ifdef ASSUMED_SHAPE
163 integer, intent(inout) :: Iconv(LBi:,LBj:)
164
165 real(r8), intent(in) :: h(LBi:,LBj:)
166 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
167 real(r8), intent(in) :: z_w(LBi:,LBj:,0:)
168 real(r8), intent(in) :: angler(LBi:,LBj:)
169 real(r8), intent(in) :: ZoBot(LBi:,LBj:)
170# if defined SSW_CALC_UB
171 real(r8), intent(in) :: Hwave(LBi:,LBj:)
172# else
173 real(r8), intent(in) :: Uwave_rms(LBi:,LBj:)
174# endif
175 real(r8), intent(in) :: Dwave(LBi:,LBj:)
176 real(r8), intent(in) :: Pwave_bot(LBi:,LBj:)
177# ifdef BEDLOAD
178 real(r8), intent(in) :: bedldu(LBi:,LBj:,:)
179 real(r8), intent(in) :: bedldv(LBi:,LBj:,:)
180# endif
181 real(r8), intent(inout) :: bottom(LBi:,LBj:,:)
182 real(r8), intent(in) :: rho(LBi:,LBj:,:)
183 real(r8), intent(in) :: u(LBi:,LBj:,:,:)
184 real(r8), intent(in) :: v(LBi:,LBj:,:,:)
185# if defined SSW_LOGINT_STOKES
186 real(r8), intent(in) :: u_stokes(LBi:,LBj:,:)
187 real(r8), intent(in) :: v_stokes(LBi:,LBj:,:)
188# endif
189# if defined SSW_CALC_UB
190 real(r8), intent(in) :: zeta(LBi:,LBj:,:)
191# endif
192 real(r8), intent(out) :: Ubot(LBi:,LBj:)
193 real(r8), intent(out) :: Vbot(LBi:,LBj:)
194 real(r8), intent(out) :: Ur(LBi:,LBj:)
195 real(r8), intent(out) :: Vr(LBi:,LBj:)
196 real(r8), intent(out) :: bustrc(LBi:,LBj:)
197 real(r8), intent(out) :: bvstrc(LBi:,LBj:)
198 real(r8), intent(out) :: bustrw(LBi:,LBj:)
199 real(r8), intent(out) :: bvstrw(LBi:,LBj:)
200 real(r8), intent(out) :: bustrcwmax(LBi:,LBj:)
201 real(r8), intent(out) :: bvstrcwmax(LBi:,LBj:)
202 real(r8), intent(out) :: bustr(LBi:,LBj:)
203 real(r8), intent(out) :: bvstr(LBi:,LBj:)
204#else
205 integer, intent(inout) :: Iconv(LBi:UBi,LBj:UBj)
206
207 real(r8), intent(in) :: h(LBi:UBi,LBj:UBj)
208 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
209 real(r8), intent(in) :: z_w(LBi:UBi,LBj:UBj,0:N(ng))
210 real(r8), intent(in) :: angler(LBi:UBi,LBj:UBj)
211 real(r8), intent(in) :: ZoBot(LBi:UBi,LBj:UBj)
212# if defined SSW_CALC_UB
213 real(r8), intent(in) :: Hwave(LBi:UBi,LBj:UBj)
214# else
215 real(r8), intent(in) :: Uwave_rms(LBi:UBi,LBj:UBj)
216# endif
217 real(r8), intent(in) :: Dwave(LBi:UBi,LBj:UBj)
218 real(r8), intent(in) :: Pwave_bot(LBi:UBi,LBj:UBj)
219# ifdef BEDLOAD
220 real(r8), intent(in) :: bedldu(LBi:UBi,LBj:UBj,1:NST)
221 real(r8), intent(in) :: bedldv(LBi:UBi,LBj:UBj,1:NST)
222# endif
223 real(r8), intent(inout) :: bottom(LBi:UBi,LBj:UBj,MBOTP)
224 real(r8), intent(in) :: rho(LBi:UBi,LBj:UBj,N(ng))
225 real(r8), intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
226 real(r8), intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
227# if defined SSW_LOGINT_STOKES
228 real(r8), intent(in) :: u_stokes(LBi:UBi,LBj:UBj,N(ng))
229 real(r8), intent(in) :: v_stokes(LBi:UBi,LBj:UBj,N(ng))
230# endif
231# if defined SSW_CALC_UB
232 real(r8), intent(in) :: zeta(LBi:UBi,LBj:UBj,3)
233# endif
234 real(r8), intent(out) :: Ubot(LBi:UBi,LBj:UBj)
235 real(r8), intent(out) :: Vbot(LBi:UBi,LBj:UBj)
236 real(r8), intent(out) :: Ur(LBi:UBi,LBj:UBj)
237 real(r8), intent(out) :: Vr(LBi:UBi,LBj:UBj)
238 real(r8), intent(out) :: bustrc(LBi:UBi,LBj:UBj)
239 real(r8), intent(out) :: bvstrc(LBi:UBi,LBj:UBj)
240 real(r8), intent(out) :: bustrw(LBi:UBi,LBj:UBj)
241 real(r8), intent(out) :: bvstrw(LBi:UBi,LBj:UBj)
242 real(r8), intent(out) :: bustrcwmax(LBi:UBi,LBj:UBj)
243 real(r8), intent(out) :: bvstrcwmax(LBi:UBi,LBj:UBj)
244 real(r8), intent(out) :: bustr(LBi:UBi,LBj:UBj)
245 real(r8), intent(out) :: bvstr(LBi:UBi,LBj:UBj)
246#endif
247
248
249
250 logical :: ITERATE
251
252 integer :: Iter, i, j, k
253
254 real(r8), parameter :: eps = 1.0e-10_r8
255
256 real(r8) :: Kbh, Kbh2, Kdh
257 real(r8) :: taucr, wsedr, tstar, coef_st
258 real(r8) :: coef_b1, coef_b2, coef_b3, d0
259 real(r8) :: dolam, dolam1, doeta1, doeta2, fdo_etaano
260 real(r8) :: lamorb, lamanorb
261 real(r8) :: m_ubr, m_wr, m_ucr, m_zr, m_phicw, m_kb
262 real(r8) :: m_ustrc, m_ustrwm, m_ustrr, m_fwc, m_zoa, m_dwc
263 real(r8) :: zo, Dstp
264 real(r8) :: Kb, Kdelta, Ustr
265 real(r8) :: anglec, anglew
266 real(r8) :: cff, cff1, cff2, cff3, og, fac, fac1, fac2
267 real(r8) :: sg_ab, sg_abokb, sg_a1, sg_b1, sg_chi, sg_c1, d50
268 real(r8) :: sg_epsilon, ssw_eta, sg_fofa, sg_fofb, sg_fofc, sg_fwm
269 real(r8) :: sg_kbs, ssw_lambda, sg_mu, sg_phicw, sg_ro, sg_row
270 real(r8) :: sg_shdnrm, sg_shld, sg_shldcr, sg_scf, rhos, sg_star
271 real(r8) :: sg_ub, sg_ubokur, sg_ubouc, sg_ubouwm, sg_ur
272 real(r8) :: sg_ustarc, sg_ustarcw, sg_ustarwm, sg_znot, sg_znotp
273 real(r8) :: sg_zr, sg_zrozn, sg_z1, sg_z1ozn, sg_z2, z1, z2
274 real(r8) :: zoMIN, zoMAX
275 real(r8) :: coef_fd
276
277 real(r8),
parameter :: twopi=2.0_r8*
pi
278
279 real(r8), parameter :: absolute_zoMIN = 5.0d-5
280
281 real(r8), parameter :: Cd_fd = 0.5_r8
282
283 real(r8), parameter :: K1 = 0.6666666666_r8
284 real(r8), parameter :: K2 = 0.3555555555_r8
285 real(r8), parameter :: K3 = 0.1608465608_r8
286 real(r8), parameter :: K4 = 0.0632098765_r8
287 real(r8), parameter :: K5 = 0.0217540484_r8
288 real(r8), parameter :: K6 = 0.0065407983_r8
289
290 real(r8), parameter :: coef_a1=0.095_r8
291 real(r8), parameter :: coef_a2=0.442_r8
292 real(r8), parameter :: coef_a3=2.280_r8
293
294#if defined GM82_RIPRUF
295 real(r8), parameter :: ar = 27.7_r8/30.0_r8
296#elif defined N92_RIPRUF
297 real(r8), parameter :: ar = 0.267_r8
298#elif defined R88_RIPRUF
299 real(r8), parameter :: ar = 0.533_r8
300#else
301 no ripple roughness coeff. chosen
302#endif
303
304 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Ab
305 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Fwave_bot
306 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Tauc
307 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Tauw
308 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Taucwmax
309 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Ur_sg
310 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Vr_sg
311 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Ub
312 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Ucur
313 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Umag
314 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Vcur
315 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Zr
316 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: phic
317 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: phicw
318 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: rheight
319 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: rlength
320 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: u100
321 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: znot
322 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: znotc
323 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: zoN
324 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: zoST
325 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: zoBF
326 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: zoDEF
327 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: zoBIO
328 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: thck_wbl
329#if defined BEDLOAD_VANDERA_MADSEN_UDELTA
330 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ksd_wbl
331 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ustrc_wbl
332#endif
333#if defined BEDLOAD_VANDERA_MADSEN_UDELTA || \
334 defined bedload_vandera_direct_udelta
335 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: udelta_wbl
336 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Zr_wbl
337 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: phic_sgwbl
338#endif
339
340 real(r8), dimension(1:N(ng)) :: Urz, Vrz
341#if defined BEDLOAD_VANDERA_MADSEN_UDELTA || \
342 defined bedload_vandera_direct_udelta
343 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Ur_sgwbl
344 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: Vr_sgwbl
345 real(r8) :: Ucur_sgwbl, Vcur_sgwbl
346#endif
347
348#include "set_bounds.h"
349
350
351
352
353
354 DO j=jstrv-1,jend
355 DO i=istru-1,iend
356
357
358
359 zr(i,j)=z_r(i,j,1)-z_w(i,j,0)
360
361#if defined SSW_LOGINT
362
363 dstp=z_r(i,j,
n(ng))-z_w(i,j,0)
364
365# if defined SSW_LOGINT_DIRECT
366
367
368
369 cff1=min(0.9_r8*dstp, max(zr(i,j), sg_zwbl(ng)))
370# elif defined SSW_LOGINT_WBL
371
372
373
374 cff1=min(0.98_r8*dstp,max(zr(i,j), bottom(i,j,idtbl)*1.1_r8))
375# else
376
377
378
380# endif
381
382
383
385 urz(k)=0.5_r8*(u(i,j,k,nrhs)+u(i+1,j,k,nrhs))
386 vrz(k)=0.5_r8*(v(i,j,k,nrhs)+v(i,j+1,k,nrhs))
387# ifdef SSW_LOGINT_STOKES
388 urz(k)=urz(k)+0.5_r8*(u_stokes(i,j,k)+u_stokes(i+1,j,k))
389 vrz(k)=vrz(k)+0.5_r8*(v_stokes(i,j,k)+v_stokes(i,j+1,k))
390# endif
391 END DO
392 CALL log_interp(
n(ng), dstp, cff1, &
393 & urz, vrz, &
394 & z_r(i,j,:), z_w(i,j,:), &
396 & zr(i,j), &
397 & ur_sg(i,j), vr_sg(i,j) )
398#else
399
400
401
402
403 ur_sg(i,j)=0.5_r8*(u(i,j,1,nrhs)+u(i+1,j,1,nrhs))
404 vr_sg(i,j)=0.5_r8*(v(i,j,1,nrhs)+v(i,j+1,1,nrhs))
405# ifdef SSW_LOGINT_STOKES
406 ur_sg(i,j)=ur_sg(i,j)+0.5_r8*(u_stokes(i,j,1)+u_stokes(i+1,j,1))
407 vr_sg(i,j)=vr_sg(i,j)+0.5_r8*(v_stokes(i,j,1)+v_stokes(i,j+1,1))
408# endif
409#endif
410 END DO
411 END DO
412
413
414
415
416
417 DO j=jstrv-1,jend
418 DO i=istru-1,iend
419
420
421
422
423
424 fwave_bot(i,j)=twopi/max(pwave_bot(i,j),1.0_r8)
425#ifdef SSW_CALC_UB
426 kdh=(h(i,j)+zeta(i,j,nrhs))*fwave_bot(i,j)**2/
g
427 kbh2=kdh*kdh+ &
428 & kdh/(1.0_r8+kdh*(k1+kdh*(k2+kdh*(k3+kdh*(k4+ &
429 & kdh*(k5+k6*kdh))))))
430 kbh=sqrt(kbh2)
431 ab(i,j)=0.5_r8*hwave(i,j)/sinh(kbh)+eps
432 ub(i,j)=fwave_bot(i,j)*ab(i,j)+eps
433#else
434 ub(i,j)=max(uwave_rms(i,j),0.0_r8)+eps
435 ab(i,j)=ub(i,j)/fwave_bot(i,j)+eps
436#endif
437
438
439
440 ucur(i,j)=ur_sg(i,j)
441 vcur(i,j)=vr_sg(i,j)
442
443 umag(i,j)=sqrt(ucur(i,j)*ucur(i,j)+vcur(i,j)*vcur(i,j)+eps)
444
445
446
447 IF (ucur(i,j).eq.0.0_r8) THEN
448 phic(i,j)=0.5_r8*
pi*sign(1.0_r8,vcur(i,j))
449 ELSE
450 phic(i,j)=atan2(vcur(i,j),ucur(i,j))
451 ENDIF
452 phicw(i,j)=1.5_r8*
pi-dwave(i,j)-phic(i,j)-angler(i,j)
453 END DO
454 END DO
455
456
457
458 DO j=jstrv-1,jend
459 DO i=istru-1,iend
460
461
462
463
464 d50=bottom(i,j,
isd50)
465 rhos=bottom(i,j,
idens)/(rho(i,j,1)+1000.0_r8)
466 wsedr=bottom(i,j,
iwsed)
467 taucr=bottom(i,j,
itauc)
468 tauc(i,j)=sqrt(bustrc(i,j)**2+bvstrc(i,j)**2)
469 tauw(i,j)=sqrt(bustrw(i,j)**2+bvstrw(i,j)**2)
470 taucwmax(i,j)=sqrt( bustrcwmax(i,j)**2+bvstrcwmax(i,j)**2)
471
472 rheight(i,j)=bottom(i,j,
irhgt)
473 rlength(i,j)=bottom(i,j,
irlen)
474 zomax=0.9_r8*zr(i,j)
475 zomin=max(absolute_zomin,2.5_r8*d50/30.0_r8)
476
477
478
479 zon(i,j)=min(max(2.5_r8*d50/30.0_r8, zomin ),zomax)
480 zost(i,j)=0.0_r8
481 zobf(i,j)=0.0_r8
482 zobio(i,j)=0.0_r8
483
484 zodef(i,j)=zobot(i,j)
485
486#ifdef SSW_CALC_ZNOT
487
488
489
490
491
492 tstar=taucwmax(i,j)/(taucr+eps)
493 IF (tstar.lt.1.0_r8) THEN
494 zost(i,j)=0.0_r8
495 zobf(i,j)=ar*rheight(i,j)**2/(rlength(i,j)+eps)
496 ELSE
497
498
499
500
501
502
503 coef_st=0.0204_r8*log(100.0_r8*d50+eps)**2+ &
504 & 0.0220_r8*log(100.0_r8*d50+eps)+0.0709_r8
505 zost(i,j)=0.056_r8*d50*0.68_r8*tstar/ &
506 & (1.0_r8+coef_st*tstar)
507 IF (zost(i,j).lt.0.0_r8) THEN
510 & 'Warning zoST < 0: tstar, d50, coef_st:'
511 WRITE (
stdout,*) tstar, d50, coef_st
512 END IF
513 END IF
514
515
516
517
518 coef_b1=1.0_r8/coef_a1
519 coef_b2=0.5_r8*(1.0_r8 + coef_a2)*coef_b1
520 coef_b3=coef_b2**2-coef_a3*coef_b1
521 d0=2.0_r8*ab(i,j)
522 IF ((d0/d50).gt.13000.0_r8) THEN
523 rheight(i,j)=0.0_r8
524 rlength(i,j)=535.0_r8*d50
525 ELSE
526 dolam1=d0/(535.0_r8*d50)
527 doeta1=exp(coef_b2-sqrt(coef_b3-coef_b1*log(dolam1)))
528 lamorb=0.62_r8*d0
529 lamanorb=535.0_r8*d50
530 IF (doeta1.lt.20.0_r8) THEN
531 dolam=1.0_r8/0.62_r8
532 ELSE IF (doeta1.gt.100.0_r8) THEN
533 dolam=dolam1
534 ELSE
535 fdo_etaano=-log(lamorb/lamanorb)* &
536 & log(0.01_r8*doeta1)/log(5.0_r8)
537 dolam=dolam1*exp(-fdo_etaano)
538 END IF
539 doeta2=exp(coef_b2-sqrt(coef_b3-coef_b1*log(dolam)))
540 rheight(i,j)=d0/doeta2
541 rlength(i,j)=d0/dolam
542 END IF
543
544
545
546 zobf(i,j)=ar*rheight(i,j)**2/rlength(i,j)
547 END IF
548 zo=zon(i,j)
549# ifdef SSW_ZOBL
550 zo=zo+zost(i,j)
551# endif
552# ifdef SSW_ZORIP
553 zo=zo+zobf(i,j)
554# endif
555# ifdef SSW_ZOBIO
556 zo=zo+zobio(i,j)
557# endif
558#else
559 IF (zodef(i,j).lt.absolute_zomin) THEN
560 zodef(i,j)=absolute_zomin
562 WRITE (
stdout,*)
' Warning: default zo < 0.05 mm,', &
563 & ' replaced with: ', zodef
564 END IF
565 END IF
566 zo=zodef(i,j)
567#endif
568
569
570
571
572
573 zo=min(max(zo,zomin),zomax)
574
575 cff1=
vonkar/log(zr(i,j)/zo)
577 tauc(i,j)=cff2*umag(i,j)*umag(i,j)
578 tauw(i,j)=0.0_r8
579 taucwmax(i,j)=tauc(i,j)
580 znot(i,j)=zo
581 znotc(i,j)=zo
582#if defined BEDLOAD_VANDERA_MADSEN_UDELTA
583 ksd_wbl(i,j)=zo
584 ustrc_wbl(i,j)=sqrt(tauc(i,j)+eps)
585#endif
586
587 IF ((umag(i,j).le.eps).and.(ub(i,j).ge.eps)) THEN
588
589
590
591
592 sg_abokb=ab(i,j)/(30.0_r8*zo)
593 sg_fwm=0.3_r8
594 IF ((sg_abokb.gt.0.2_r8).and.(sg_abokb.le.100.0_r8)) THEN
595 sg_fwm=exp(-8.82_r8+7.02_r8*sg_abokb**(-0.078_r8))
596 ELSE IF (sg_abokb.gt.100.0_r8)THEN
597 sg_fwm=exp(-7.30_r8+5.61_r8*sg_abokb**(-0.109_r8))
598 END IF
599 tauc(i,j)= 0.0_r8
600 tauw(i,j)= 0.5_r8*sg_fwm*ub(i,j)*ub(i,j)
601 taucwmax(i,j)=tauw(i,j)
602 znot(i,j)=zo
603 znotc(i,j)=zo
604 ELSE IF ((umag(i,j).gt.eps).and.(ub(i,j).ge.eps).and. &
605 & ((zr(i,j)/zo).le.1.0_r8)) THEN
606
607
608
610 WRITE (
stdout,*)
' Warning: w-c calcs ignored because', &
611 & ' zr <= zo'
612 END IF
613 ELSE IF ((umag(i,j).gt.eps).and.(ub(i,j).ge.eps).and. &
614 & ((zr(i,j)/zo).gt.1.0_r8)) THEN
615
616
617
618#if defined SGWC
619 sg_zrozn=zr(i,j)/zo
620 sg_ubokur=ub(i,j)/(
sg_kappa*umag(i,j))
621 sg_row=ab(i,j)/zo
622 sg_a1=1.0d-6
623 sg_phicw=phicw(i,j)
624 CALL sg_bstress (sg_row, sg_zrozn, sg_phicw, sg_ubokur, &
625 & sg_a1, sg_mu, sg_epsilon, sg_ro, sg_fofa)
626 sg_abokb=ab(i,j)/(30.0_r8*zo)
627 IF (sg_abokb.le.100.0_r8) THEN
628 sg_fwm=exp(-8.82_r8+7.02_r8*sg_abokb**(-0.078_r8))
629 ELSE
630 sg_fwm=exp(-7.30_r8+5.61_r8*sg_abokb**(-0.109_r8))
631 END IF
632 sg_ubouwm=sqrt(2.0_r8/sg_fwm)
633
634
635
636
637 CALL sg_purewave (sg_row, sg_ubouwm, sg_znotp, sg_ro)
638
639
640
641
642 sg_b1=sg_ubouwm
643 sg_fofb=-sg_fofa
644 sg_c1=0.5_r8*(sg_a1+sg_b1)
645 CALL sg_bstress (sg_row, sg_zrozn, sg_phicw, sg_ubokur, &
646 & sg_c1, sg_mu, sg_epsilon, sg_ro, sg_fofc)
647
648
649
650 iterate=.true.
652 IF (iterate) THEN
653 IF ((sg_fofb*sg_fofc).lt.0.0_r8) THEN
654 sg_a1=sg_c1
655 ELSE
656 sg_b1=sg_c1
657 END IF
658 sg_c1=0.5_r8*(sg_a1+sg_b1)
659 CALL sg_bstress (sg_row, sg_zrozn, sg_phicw, sg_ubokur, &
660 & sg_c1, sg_mu, sg_epsilon, sg_ro, &
661 & sg_fofc)
662 iterate=(sg_b1-sg_c1) .ge.
sg_tol
663 IF (iterate) iconv(i,j)=iter
664 END IF
665 END DO
666 sg_ubouc=sg_c1
667
668
669
670 sg_ustarcw=ub(i,j)/sg_ubouc
671 sg_ustarwm=sg_mu*sg_ustarcw
672
673 sg_ustarc=max(sqrt(tauc(i,j)),sg_epsilon*sg_ustarcw)
674 tauc(i,j)=sg_ustarc*sg_ustarc
675 tauw(i,j)=sg_ustarwm*sg_ustarwm
676 taucwmax(i,j)=sqrt((tauc(i,j)+ &
677 & tauw(i,j)*cos(phicw(i,j)))**2+ &
678 & (tauw(i,j)*sin(phicw(i,j)))**2)
679
680
681
682 IF (sg_epsilon.gt.0.0_r8) THEN
684 sg_z2=sg_z1/sg_epsilon
685 sg_z1ozn=sg_z1/zo
686 znotc(i,j)=sg_z2* &
687 & exp(-(1.0_r8-sg_epsilon+ &
688 & sg_epsilon*log(sg_z1ozn)))
689
690
691
693 u100(i,j)=sg_ustarc* &
694 & (log(
sg_z100/sg_z2)+1.0_r8-sg_epsilon+ &
695 & sg_epsilon*log(sg_z1ozn))/
sg_kappa
696 ELSE IF ((
sg_z100.le.sg_z2).and.(zr(i,j).gt.sg_z1))
THEN
697 u100(i,j)=sg_ustarc*sg_epsilon* &
699 ELSE
700 u100(i,j)=sg_ustarc*sg_epsilon* &
702 END IF
703 END IF
704#elif defined M94WC
705 m_ubr=ub(i,j)
706 m_wr=fwave_bot(i,j)
707 m_ucr=umag(i,j)
708 m_zr=zr(i,j)
709 m_phicw=phicw(i,j)
710 m_kb=30.0_r8*zo
711 dstp=z_r(i,j,
n(ng))-z_w(i,j,0)
712 CALL madsen94 (m_ubr, m_wr, m_ucr, &
713 & m_zr, m_phicw, m_kb, dstp, &
714 & m_ustrc, m_ustrwm, m_ustrr, m_fwc, m_zoa, &
715 & m_dwc)
716 tauc(i,j)=m_ustrc*m_ustrc
717 tauw(i,j)=m_ustrwm*m_ustrwm
718 taucwmax(i,j)=m_ustrr*m_ustrr
719 znotc(i,j)=min( m_zoa, zomax )
720 u100(i,j)=(m_ustrc/
vonkar)*log(1.0_r8/m_zoa)
721 thck_wbl(i,j)=m_dwc
722#endif
723#if defined SSW_FORM_DRAG_COR
724 IF (rheight(i,j).gt.(zon(i,j)+zost(i,j))) THEN
725 coef_fd=0.5_r8*cd_fd*(rheight(i,j)/rlength(i,j))* &
727 & (log(rheight(i,j)/ &
728 & (zon(i,j)+zost(i,j)))-1.0_r8)**2
729 taucwmax(i,j)=taucwmax(i,j)/(1.0_r8+coef_fd)
730 taucwmax(i,j)=taucwmax(i,j)*(1.0_r8+8.0_r8* &
731 & rheight(i,j)/rlength(i,j))
732 END IF
733#endif
734#if defined BEDLOAD_VANDERA_MADSEN_UDELTA
735 ksd_wbl(i,j)=m_zoa
736 ustrc_wbl(i,j)=m_ustrc
737#endif
738 END IF
739 END DO
740 END DO
741
742#if defined BEDLOAD_VANDERA_MADSEN_UDELTA
743
744
745
746
747
748
749 DO j=jstr,jend
750 DO i=istr,iend
751
752 dstp=z_r(i,j,
n(ng))-z_w(i,j,0)
753
754
755
756
757 cff=min( 0.98_r8*dstp, thck_wbl(i,j) )
758
759
760
761
762 cff1=max(cff, 1.1_r8*ksd_wbl(i,j))
763 cff2=log(cff1/ksd_wbl(i,j))
764 udelta_wbl(i,j)=(ustrc_wbl(i,j)/
vonkar)*cff2
765
767 urz(k)=0.5_r8*(u(i,j,k,nrhs)+u(i+1,j,k,nrhs))
768 vrz(k)=0.5_r8*(v(i,j,k,nrhs)+v(i,j+1,k,nrhs))
769# ifdef SSW_LOGINT_STOKES
770 urz(k)=urz(k)+0.5_r8*(u_stokes(i,j,k)+u_stokes(i+1,j,k))
771 vrz(k)=vrz(k)+0.5_r8*(v_stokes(i,j,k)+v_stokes(i,j+1,k))
772# endif
773 END DO
774 CALL log_interp(
n(ng), dstp, cff1, &
775 & urz, vrz, &
776 & z_r(i,j,:), z_w(i,j,:), &
778 & zr_wbl(i,j), &
779 & ur_sgwbl(i,j), vr_sgwbl(i,j) )
780
781
782
783 ucur_sgwbl=ur_sgwbl(i,j)
784 vcur_sgwbl=vr_sgwbl(i,j)
785
786 IF (ucur_sgwbl.eq.0.0_r8) THEN
787 phic_sgwbl(i,j)=0.5_r8*
pi*sign(1.0_r8,vcur_sgwbl)
788 ELSE
789 phic_sgwbl(i,j)=atan2(vcur_sgwbl,ucur_sgwbl)
790 ENDIF
791 END DO
792 END DO
793#endif
794#if defined BEDLOAD_VANDERA_DIRECT_UDELTA
795
796
797
798
799
800 DO j=jstr,jend
801 DO i=istr,iend
802 dstp=z_r(i,j,
n(ng))-z_w(i,j,0)
803 cff=min( 0.98_r8*dstp, sg_zwbl(ng) )
805 urz(k)=0.5_r8*(u(i,j,k,nrhs)+u(i+1,j,k,nrhs))
806 vrz(k)=0.5_r8*(v(i,j,k,nrhs)+v(i,j+1,k,nrhs))
807# ifdef SSW_LOGINT_STOKES
808 urz(k)=urz(k)+0.5_r8*(u_stokes(i,j,k)+u_stokes(i+1,j,k))
809 vrz(k)=vrz(k)+0.5_r8*(v_stokes(i,j,k)+v_stokes(i,j+1,k))
810# endif
811 END DO
812 CALL log_interp(
n(ng), dstp, cff, &
813 & urz, vrz, &
814 & z_r(i,j,:), z_w(i,j,:), &
816 & zr_wbl(i,j), &
817 & ur_sgwbl(i,j), vr_sgwbl(i,j) )
818
819
820
821 ucur_sgwbl=ur_sgwbl(i,j)
822 vcur_sgwbl=vr_sgwbl(i,j)
823 udelta_wbl(i,j)=sqrt(ur_sgwbl(i,j)*ur_sgwbl(i,j)+ &
824 & vr_sgwbl(i,j)*vr_sgwbl(i,j)+eps)
825
826 IF (ucur_sgwbl.eq.0.0_r8) THEN
827 phic_sgwbl(i,j)=0.5_r8*
pi*sign(1.0_r8,vcur_sgwbl)
828 ELSE
829 phic_sgwbl(i,j)=atan2(vcur_sgwbl,ucur_sgwbl)
830 ENDIF
831 END DO
832 END DO
833
834#endif
835
836
837
838
839
840
841 DO j=jstr,jend
842 DO i=istru,iend
843 anglec=0.5_r8*(ur_sg(i,j)+ur_sg(i-1,j))/ &
844 & (0.5_r8*(umag(i-1,j)+umag(i,j)))
845 bustr(i,j)=0.5_r8*(tauc(i-1,j)+tauc(i,j))*anglec
846#ifdef WET_DRY
847 cff2=0.75_r8*0.5_r8*(z_w(i-1,j,1)+z_w(i,j,1)- &
848 & z_w(i-1,j,0)-z_w(i,j,0))
849 bustr(i,j)=sign(1.0_r8,bustr(i,j))*min(abs(bustr(i,j)), &
850 & abs(u(i,j,1,nrhs))*cff2/
dt(ng))
851#endif
852 END DO
853 END DO
854 DO j=jstrv,jend
855 DO i=istr,iend
856 anglec=0.5_r8*(vr_sg(i,j)+vr_sg(i,j-1))/ &
857 & (0.5_r8*(umag(i,j-1)+umag(i,j)))
858 bvstr(i,j)=0.5_r8*(tauc(i,j-1)+tauc(i,j))*anglec
859#ifdef WET_DRY
860 cff2=0.75_r8*0.5_r8*(z_w(i,j-1,1)+z_w(i,j,1)- &
861 & z_w(i,j-1,0)-z_w(i,j,0))
862 bvstr(i,j)=sign(1.0_r8,bvstr(i,j))*min(abs(bvstr(i,j)), &
863 & abs(v(i,j,1,nrhs))*cff2/
dt(ng))
864#endif
865 END DO
866 END DO
867 DO j=jstr,jend
868 DO i=istr,iend
869 anglec=ucur(i,j)/umag(i,j)
870 anglew=cos(1.5_r8*
pi-dwave(i,j)-angler(i,j))
871 bustrc(i,j)=tauc(i,j)*anglec
872 bustrw(i,j)=tauw(i,j)*anglew
873 bustrcwmax(i,j)=taucwmax(i,j)*anglew
874 ubot(i,j)=ub(i,j)*anglew
875 ur(i,j)=ucur(i,j)
876
877 anglec=vcur(i,j)/umag(i,j)
878 anglew=sin(1.5_r8*
pi-dwave(i,j)-angler(i,j))
879 bvstrc(i,j)=tauc(i,j)*anglec
880 bvstrw(i,j)=tauw(i,j)*anglew
881 bvstrcwmax(i,j)=taucwmax(i,j)*anglew
882 vbot(i,j)=ub(i,j)*anglew
883 vr(i,j)=vcur(i,j)
884
885 bottom(i,j,
irlen)=rlength(i,j)
886 bottom(i,j,
irhgt)=rheight(i,j)
887 bottom(i,j,
ibwav)=ab(i,j)
888 bottom(i,j,
izdef)=zodef(i,j)
889 bottom(i,j,
izapp)=znotc(i,j)
890 bottom(i,j,
iznik)=zon(i,j)
891 bottom(i,j,
izbio)=zobio(i,j)
892 bottom(i,j,
izbfm)=zobf(i,j)
893 bottom(i,j,
izbld)=zost(i,j)
894 bottom(i,j,
izwbl)=znot(i,j)
895 bottom(i,j,idtbl)=thck_wbl(i,j)
896#if defined BEDLOAD_VANDERA_MADSEN_UDELTA
897 bottom(i,j,idksd)=ksd_wbl(i,j)
898 bottom(i,j,idusc)=ustrc_wbl(i,j)
899#endif
900#if defined BEDLOAD_VANDERA_MADSEN_UDELTA || \
901 defined bedload_vandera_direct_udelta
902 bottom(i,j,idubl)=udelta_wbl(i,j)
903 bottom(i,j,idzrw)=zr_wbl(i,j)
904 bottom(i,j,idpcx)=phic_sgwbl(i,j)
905#else
906 bottom(i,j,idpcx)=phic(i,j)
907 bottom(i,j,idpwc)=phicw(i,j)
908#endif
909 END DO
910 END DO
911
912
913
914
916 & lbi, ubi, lbj, ubj, &
917 & bustr)
919 & lbi, ubi, lbj, ubj, &
920 & bvstr)
922 & lbi, ubi, lbj, ubj, &
923 & bustrc)
925 & lbi, ubi, lbj, ubj, &
926 & bvstrc)
928 & lbi, ubi, lbj, ubj, &
929 & bustrw)
931 & lbi, ubi, lbj, ubj, &
932 & bvstrw)
934 & lbi, ubi, lbj, ubj, &
935 & bustrcwmax)
937 & lbi, ubi, lbj, ubj, &
938 & bvstrcwmax)
940 & lbi, ubi, lbj, ubj, &
941 & ubot)
943 & lbi, ubi, lbj, ubj, &
944 & vbot)
946 & lbi, ubi, lbj, ubj, &
947 & ur)
949 & lbi, ubi, lbj, ubj, &
950 & vr)
952 & lbi, ubi, lbj, ubj, &
955 & lbi, ubi, lbj, ubj, &
958 & lbi, ubi, lbj, ubj, &
961 & lbi, ubi, lbj, ubj, &
964 & lbi, ubi, lbj, ubj, &
967 & lbi, ubi, lbj, ubj, &
970 & lbi, ubi, lbj, ubj, &
973 & lbi, ubi, lbj, ubj, &
976 & lbi, ubi, lbj, ubj, &
979 & lbi, ubi, lbj, ubj, &
981#if defined BEDLOAD_VANDERA_MADSEN_UDELTA
983 & lbi, ubi, lbj, ubj, &
984 & bottom(:,:,idtbl))
986 & lbi, ubi, lbj, ubj, &
987 & bottom(:,:,idksd))
989 & lbi, ubi, lbj, ubj, &
990 & bottom(:,:,idusc))
991#endif
992#if defined BEDLOAD_VANDERA_MADSEN_UDELTA || \
993 defined bedload_vandera_direct_udelta
995 & lbi, ubi, lbj, ubj, &
996 & bottom(:,:,idubl))
998 & lbi, ubi, lbj, ubj, &
999 & bottom(:,:,idzrw))
1000#else
1002 & lbi, ubi, lbj, ubj, &
1003 & bottom(:,:,idpwc))
1004#endif
1006 & lbi, ubi, lbj, ubj, &
1007 & bottom(:,:,idpcx))
1008#ifdef DISTRIBUTE
1010 & lbi, ubi, lbj, ubj, &
1013 & bustr, bvstr, bustrc, bvstrc)
1015 & lbi, ubi, lbj, ubj, &
1018 & bustrw, bvstrw, bustrcwmax, bvstrcwmax)
1020 & lbi, ubi, lbj, ubj, &
1023 & ubot, vbot, ur, vr)
1025 & lbi, ubi, lbj, ubj, &
1028 & bottom(:,:,
irlen), &
1029 & bottom(:,:,
irhgt), &
1030 & bottom(:,:,
ibwav))
1032 & lbi, ubi, lbj, ubj, &
1035 & bottom(:,:,
izdef), &
1036 & bottom(:,:,
izapp), &
1037 & bottom(:,:,
iznik))
1039 & lbi, ubi, lbj, ubj, &
1042 & bottom(:,:,
izbio), &
1043 & bottom(:,:,
izbfm), &
1044 & bottom(:,:,
izbld), &
1045 & bottom(:,:,
izwbl))
1046# if defined BEDLOAD_VANDERA_MADSEN_UDELTA
1048 & lbi, ubi, lbj, ubj, &
1051 & bottom(:,:,idtbl), &
1052 & bottom(:,:,idksd), &
1053 & bottom(:,:,idusc))
1054# endif
1055# if defined BEDLOAD_VANDERA_MADSEN_UDELTA || \
1056 defined bedload_vandera_direct_udelta
1058 & lbi, ubi, lbj, ubj, &
1061 & bottom(:,:,idzrw), &
1062 & bottom(:,:,idubl))
1063# else
1065 & lbi, ubi, lbj, ubj, &
1068 & bottom(:,:,idpwc))
1069# endif
1071 & lbi, ubi, lbj, ubj, &
1074 & bottom(:,:,idpcx))
1075#endif
1076
1077 RETURN