188 REAL,
INTENT(IN) :: ASPC(NSPEC), WNDX, WNDY, &
189 ZWND, DEPTH, RIB, DAIR, FPI
190 REAL,
INTENT(OUT) :: UST, USTD, Z0
191 REAL,
INTENT(OUT),
OPTIONAL :: CHARN
192 REAL,
INTENT(INOUT) :: TAUNUX, TAUNUY
197 REAL,
PARAMETER :: NU=0.105/10000.0
198 REAL,
PARAMETER :: DELTA=0.03
200 REAL :: wnd_in_mag, wnd_in_dir
202 REAL :: KMAX, KTAILA, KTAILB, KTAILC
203 REAL :: SAT, z01, z02, u10
207 REAL :: DTX, DTY, iter_thresh, &
210 REAL :: WAGE, CBETA, BP, CD, &
211 USTRB, ANGDIF, USTAR, ZNU, &
212 TAUT, TAUX, TAUY, BETAG, TAUDIR, &
215 REAL :: UPROFV, VPROFV
217 REAL :: WND_1X, WND_1Y, &
220 DIFU10XX, DIFU10YX, DIFU10XY, DIFU10YY, &
221 FD_A, FD_B, FD_C, FD_D, &
223 APAR, CH,UITV, VITV,USTL,&
226 REAL :: WND_TOP, ANG_TOP, WND_PA, WND_PE, &
227 WND_PEx, WND_PEy, WND_PAx, WND_PAy, &
229 INTEGER :: NKT, K, T, Z2, ITER, ZI, ZII, &
230 I, CTR, ITERATION, KA1, KA2, &
233 REAL,
ALLOCATABLE,
DIMENSION(:) :: WN, DWN, CP,SIG2
234 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: SPC2
235 REAL,
ALLOCATABLE,
DIMENSION(:) :: TLTN, TLTE, TAUD, &
237 TLTED, ZOFK, UPROF, VPROF, &
238 FTILDE, UP1, VP1, UP, VP, &
241 INTEGER,
SAVE :: IENT = 0
243 LOGICAL :: FSFL1,FSFL2, CRIT1, CRIT2
244 LOGICAL :: IT_FLAG1, IT_FLAG2
245 LOGICAL,
SAVE :: FIRST = .true.
253 CALL strace (ient,
'W3FLD1')
267 wnd_in_mag = sqrt( wndx**2 + wndy**2 )
268 wnd_in_dir = atan2(wndy, wndx)
276 if (tail_choice.eq.0)
then
278 elseif (tail_choice.eq.1)
then
279 CALL wnd2sat(u10,sat)
291 call sig2wn(
sig(
nk),depth,kmax)
294 DO WHILE ( kmax .LT. 366.0 )
296 kmax = ( kmax *
xfr**2 )
299 ALLOCATE( wn(nkt), dwn(nkt), cp(nkt), sig2(nkt),spc2(nkt,
nth), &
300 tltn(nkt), tlte(nkt), taud(nkt), &
301 tltnd(nkt), tlted(nkt), zofk(nkt), uprof(nkt+1),&
302 vprof(nkt+1), ftilde(nkt), up1(nkt+1),vp1(nkt+1), &
303 up(nkt+1), vp(nkt+1), tltna(nkt),tltea(nkt))
309 call sig2wn(
sig(k),depth,wn(k))
310 cp(k) = (
sig(k) / wn(k) )
314 DO k = (
nk + 1 ), ( nkt)
315 sig2(k) = sig2(k-1) *
xfr
316 call sig2wn(sig2(k),depth,wn(k))
317 cp(k) = sig2(k) / wn(k)
321 dwn(k) = wn(k+1) - wn(k)
323 dwn(nkt) = wn(nkt)*
xfr**2 - wn(nkt)
334 spc2(k,t) = aspc(i) *
sig(k)
340 spc2(k,t)=spc2(
nk,t)*wn(
nk)**3.0/wn(k)**(3.0)
348 call sig2wn (fpi*
tpi*tail_transition_ratio1,depth,ktaila )
350 call sig2wn (fpi*
tpi*tail_transition_ratio2,depth,ktailb )
355 DO WHILE ( ( ktaila .GE. wn(ka1) ) .AND. (ka1 .LT. nkt-6) )
359 DO WHILE ( ( ktailb .GE. wn(ka2) ) .AND. (ka2 .LT. nkt-4) )
363 DO WHILE ( ( ktailc .GE. wn(ka3)) .AND. (ka3 .LT. nkt-2) )
368 CALL appendtail(spc2, wn, nkt, ka1, ka2, ka3,&
385 iteration = iteration + 1
387 ustsm =
kappa * wnd_in_mag / ( log( zwnd / z1 ) )
388 z0sm = 0.132 *
nu / ustsm
389 IF ( (abs( z0sm - z1 ) .LT. 10.0**(-6)) .OR.&
390 ( iteration .GT. 5 ))
THEN
397 taunux = ustsm**2 * dair * wndx / wnd_in_mag
398 taunuy = ustsm**2 * dair * wndy / wnd_in_mag
407 IF (iter .EQ. 1)
THEN
408 taunux = taunux + dtx
410 ELSEIF (iter .EQ. 2)
THEN
411 taunux = taunux - dtx
412 taunuy = taunuy + dty
414 ELSEIF (iter .EQ. 3)
THEN
415 taunuy = taunuy - dty
421 CALL appendtail(spc2, wn, nkt, ka1, ka2, ka3,&
422 atan2(taunuy,taunux), sat)
433 taud(zi) = atan2( tltn(zi-1), tlte(zi-1))
434 ustl = sqrt( sqrt( tltn(zi-1)**2 + tlte(zi-1)**2 )/ dair )
436 angdif=taud(zi)-
th(t)
437 IF ( cos( angdif ) .GE. 0.0 )
THEN
438 wage = cp(z2) / (ustl)
440 IF ( wage .LT. 10. )
THEN
443 ELSEIF ( ( wage .GE. 10.0 ) .AND. &
444 ( wage .LE. 25.0 ) )
THEN
445 cbeta = 10.0 + 15.0 * cos(
pi * ( wage - 10.0 ) &
448 ELSEIF ( wage .GT. 25.0 )
THEN
456 tltnd(zi) =tltnd(zi)+( sin(
th(t) ) * cos( angdif )**2)&
457 * cbeta * spc2(z2,t) * &
458 sqrt( tlte(zi-1)**2 + tltn(zi-1)**2.0 ) &
459 * ( wn(z2)**2.0 )*
dth
460 tlted(zi) = tlted(zi)+(cos(
th(t) ) * cos( angdif )**2)&
461 * cbeta * spc2(z2,t) * &
462 sqrt( tlte(zi-1)**2 + tltn(zi-1)**2.0 ) &
463 * ( wn(z2)**2.0 )*
dth
470 tltna(zi) = tltnd(zi) * dwn(z2) * 0.5
471 tltea(zi) = tlted(zi) * dwn(z2) * 0.5
473 tltna(zi)=(tltnd(zi)+tltnd(zi-1))*0.5*dwn(z2)
474 tltea(zi)=(tlted(zi)+tlted(zi-1))*0.5*dwn(z2)
476 tltn(zi)=tltn(zi-1)+tltna(zi)
477 tlte(zi)=tlte(zi-1)+tltea(zi)
485 ustrb=sqrt(sqrt(tauy**2.0+taux**2.0)/dair)
486 taudirb=atan2(tauy,taux)
489 DO WHILE ( (it_flag2) .AND. ( ctr .LT. 10 ) )
497 taud(zi) = atan2(tltn(zi),tlte(zi))
498 ustl = sqrt(sqrt(tltn(zi)**2+tlte(zi)**2)/dair)
501 angdif = taud(zi)-
th(t)
502 IF ( cos( angdif ) .GE. 0.0 )
THEN
503 wage = cp(z2) / (ustl)
504 IF ( wage .LT. 10 )
THEN
506 ELSEIF ( ( wage .GE. 10.0 ) .AND. &
507 ( wage .LE. 25.0 ) )
THEN
508 cbeta = 10.0 + 15.0 * cos(
pi * ( wage - 10.0 ) &
510 ELSEIF ( wage .GT. 25.0 )
THEN
516 bp = sqrt( (cos(
th(t) ) * cos( angdif )**2.0)**2.0 &
517 + (sin(
th(t) ) * cos( angdif )**2.0)**2.0 )
518 betag=bp*cbeta*sqrt(tlte(zi)**2.0+tltn(zi)**2.0) &
519 /(
dwat)*sig2(z2)/cp(z2)**2
520 ftilde(z2) = ftilde(z2) + betag *
dwat *
grav &
522 tltnd(zi) =tltnd(zi)+ (sin(
th(t) ) * cos( angdif )**2.0)&
523 * cbeta * spc2(z2,t) * sqrt( &
524 tlte(zi)**2.0 + tltn(zi)**2.0 ) * &
526 tlted(zi) = tlted(zi)+(cos(
th(t) ) * cos( angdif )**2.0)&
527 * cbeta * spc2(z2,t) * sqrt( &
528 tlte(zi)**2.0 + tltn(zi)**2.0 ) * &
532 tltna(zi)=tltnd(zi)*dwn(z2)*0.5
533 tltea(zi)=tlted(zi)*dwn(z2)*0.5
535 tltna(zi)=(tltnd(zi)+tltnd(zi-1))*0.5*dwn(z2)
536 tltea(zi)=(tlted(zi)+tlted(zi-1))*0.5*dwn(z2)
539 tltn(zi)=tltn(zi-1)+tltna(zi)
540 tlte(zi)=tlte(zi-1)+tltea(zi)
542 tltn(zi)=taunuy+tltna(zi)
543 tlte(zi)=taunux+tltea(zi)
548 taut=sqrt(tauy**2.0+taux**2.0)
549 ustar=sqrt(sqrt(tauy**2.0+taux**2.0)/dair)
550 taudir=atan2(tauy, taux)
552 crit1=(abs(ustar-ustrb)*100.0)/((ustar+ustrb)*0.5) .GT. 0.1
553 IF ((taudir+taudirb).NE.0.)
THEN
554 crit2=(abs(taudir-taudirb)*100.0/(taudir+taudirb)*0.5) .GT. 0.1
558 IF (crit1 .OR. crit2)
THEN
570 DO WHILE(((tltn(kb)**2+tlte(kb)**2)/(taux**2+tauy**2)).GT. &
581 znu=0.1 * 1.45e-5 / sqrt(sqrt(taunux**2.0+taunuy**2.0)/dair)
588 up1(zi) = ( ( ( wn(z2)**2 /
delta ) * ftilde(z2) ) + &
589 ( dair / ( zofk(z2) *
kappa ) ) * ( sqrt( &
590 tltn(zi)**2 + tlte(zi)**2 ) / dair )**(3/2) ) &
591 * ( tlte(zi) ) / ( tlte(zi) * taux &
593 vp1(zi) = ( ( ( wn(z2)**2 /
delta ) * ftilde(z2) ) + &
594 ( dair / ( zofk(z2) *
kappa ) ) * ( sqrt( &
595 tltn(zi)**2 + tlte(zi)**2 ) / dair )**(3/2) ) &
596 * ( tltn(zi) ) / ( tlte(zi) * taux &
600 uprof(zi) = dair /
kappa * ( sqrt( taunux**2.0 + taunuy**2.0 ) &
601 / dair )**(1.5) * ( taunux / ( taux * &
602 taunux + tauy * taunuy ) ) * log( &
604 vprof(zi) = dair /
kappa * ( sqrt( taunux**2.0 + taunuy**2.0 ) &
605 / dair )**(1.5) * ( taunuy / ( taux * &
606 taunux + tauy * taunuy ) ) * log( &
612 up1(zi) = ( ( ( wn(z2)**2.0 /
delta ) * ftilde(z2) ) + &
613 ( dair / ( zofk(z2) *
kappa ) ) * ( sqrt( &
614 tltn(zi)**2.0 + tlte(zi)**2.0 ) / dair )**(1.5) ) &
615 * ( tlte(zi) ) / ( tlte(zi) * taux + &
617 vp1(zi) = ( ( ( wn(z2)**2.0 /
delta ) * ftilde(z2) ) + &
618 ( dair / ( zofk(z2) *
kappa ) ) * ( sqrt( &
619 tltn(zi)**2.0 + tlte(zi)**2.0 ) / dair )**(1.5) ) &
620 * ( tltn(zi) ) / ( tlte(zi) * taux + &
622 up(zi) = up1(zi) * 0.5 + up1(zi-1) * 0.5
623 vp(zi) = vp1(zi) * 0.5 + vp1(zi-1) * 0.5
624 uprof(zi) = uprof(zi-1) + up(zi) * ( zofk(z2) - zofk(z2+1) )
625 vprof(zi) = vprof(zi-1) + vp(zi) * ( zofk(z2) - zofk(z2+1) )
632 uprof(nkt+1) = uprof(nkt) + ( sqrt( sqrt( tauy**2.0 + &
633 taux**2.0 ) / dair ) ) /
kappa * taux &
634 / sqrt( tauy**2.0 +taux**2.0 ) * log( zwnd &
636 vprof(nkt+1) = vprof(nkt) + ( sqrt( sqrt( tauy**2.0 + &
637 taux**2.0 ) / dair ) ) /
kappa * tauy &
638 / sqrt( tauy**2.0 +taux**2.0 ) * log( zwnd &
640 IF (iter .EQ. 3)
THEN
641 wnd_1x = uprof(nkt+1)
642 wnd_1y = vprof(nkt+1)
643 ELSEIF (iter .EQ. 2)
THEN
644 wnd_2x = uprof(nkt+1)
645 wnd_2y = vprof(nkt+1)
646 ELSEIF (iter .EQ. 1)
THEN
647 wnd_3x = uprof(nkt+1)
648 wnd_3y = vprof(nkt+1)
694 iteration = iteration + 1
695 difu10xx = wnd_3x - wnd_1x
696 difu10yx = wnd_3y - wnd_1y
697 difu10xy = wnd_2x - wnd_1x
698 difu10yy = wnd_2y - wnd_1y
699 fd_a = difu10xx / dtx
700 fd_b = difu10xy / dty
701 fd_c = difu10yx / dtx
702 fd_d = difu10yy / dty
703 dwndx = - wndx + wnd_1x
704 dwndy = - wndy + wnd_1y
707 ch = sqrt( uitv**2.0 + vitv**2.0 )
708 IF (ch .GT. 15.)
THEN
709 apar = 0.5 / ( fd_a * fd_d - fd_b * fd_c )
711 apar = 1.0 / ( fd_a * fd_d - fd_b * fd_c )
714 IF (((vitv/max(abs(wndy),ck) .GT. iter_thresh) .OR. &
715 (uitv/max(abs(wndx),ck) .GT. iter_thresh)) .AND. &
716 (iteration .LT. 2))
THEN
717 taunux = taunux - apar * ( fd_d * dwndx - fd_b * dwndy )
718 taunuy = taunuy - apar * ( -fd_c * dwndx +fd_a * dwndy )
719 ELSEIF (((vitv/max(abs(wndy),ck) .GT. iter_thresh) .OR. &
720 (uitv/max(abs(wndx),ck) .GT. iter_thresh)) .AND. &
721 (iteration .LT. 24))
THEN
723 taunux = taunux - apar * ( fd_d * dwndx - fd_b * dwndy )
724 taunuy = taunuy - apar * ( -fd_c * dwndx +fd_a * dwndy )
725 ELSEIF (((vitv/max(abs(wndy),ck) .GT. iter_thresh) .OR. &
726 (uitv/max(abs(wndx),ck) .GT. iter_thresh)) .AND. &
727 (iteration .LT. 26))
THEN
729 taunux = taunux - apar * ( fd_d * dwndx - fd_b * dwndy )
730 taunuy = taunuy - apar * ( -fd_c * dwndx +fd_a * dwndy )
731 ELSEIF (((vitv/max(abs(wndy),ck) .GT. iter_thresh) .OR. &
732 (uitv/max(abs(wndx),ck) .GT. iter_thresh)) .AND. &
733 (iteration .LT. 30))
THEN
735 taunux = taunux - apar * ( fd_d * dwndx - fd_b * dwndy )
736 taunuy = taunuy - apar * ( -fd_c * dwndx +fd_a * dwndy )
737 ELSEIF (iteration .GE. 30)
THEN
738 write(*,*)
'Attn: W3FLD1 not converged.'
739 write(*,*)
' Wind (X/Y): ',wndx,wndy
744 ELSEIF (((vitv/max(abs(wndy),ck) .LT. iter_thresh) .AND.&
745 (uitv/max(abs(wndx),ck) .LT. iter_thresh)) .AND. &
746 (iteration .GE. 2))
THEN
750 if (.not.(cos(wnd_in_dir-atan2(taunuy,taunux)).ge.0.0))
then
751 taunux = ustsm**2 * dair * wndx / wnd_in_mag*.95
752 taunuy = ustsm**2 * dair * wndy / wnd_in_mag*.95
758 ustd = atan2(tauy,taux)
759 ust = sqrt( sqrt( taux**2 + tauy**2 ) / dair)
761 wnd_pa=wnd_in_mag*cos(wnd_in_dir-ustd)
762 z0 = zwnd/exp(wnd_pa*
kappa/ust)
763 cd = ust**2 / wnd_in_mag**2
764 IF (
PRESENT(
charn))
THEN
765 charn = 0.01/sqrt(sqrt( taunux**2 + taunuy**2 )/(ust**2))
767 fsfl1=.not.((cd .LT. 0.01).AND.(cd .GT. 0.0001))
768 fsfl2=.not.(cos(wnd_in_dir-ustd).GT.0.9)
769 IF (fsfl1 .or. fsfl2)
THEN
771 write(*,*)
'Attn: W3FLD1 failed, will output bulk...'
772 CALL wnd2z0m(wnd_in_mag,z0)
773 ust = wnd_in_mag*
kappa/log(zwnd/z0)
775 cd = ust**2 / wnd_in_mag**2
777 DEALLOCATE(wn, dwn, cp,sig2, spc2, tltn, tlte, taud, &
778 tltnd, tlted, zofk, uprof, &
779 vprof, ftilde, up1, vp1, up, vp, tltna, tltea)