161 REAL,
INTENT(IN) :: ASPC(NSPEC), WNDX, WNDY, &
162 ZWND, DEPTH, RIB, DAIR, FPI
163 REAL,
INTENT(OUT) :: UST, USTD, Z0
164 REAL,
INTENT(OUT),
OPTIONAL :: CHARN
165 REAL,
INTENT(INOUT) :: TAUNUX, TAUNUY
171 REAL,
PARAMETER :: NU=0.105/10000.0
176 REAL :: KMAX, KTAILA, KTAILB, KTAILC
177 INTEGER :: KA1, KA2, KA3, NKT
179 REAL,
ALLOCATABLE,
DIMENSION(:) :: WN, DWN, CP, sig2,TAUINTX, TAUINTY
180 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: SPC2
183 REAL :: TAUXW, TAUYW, TAUX, TAUY
184 REAL :: USTRA, USTRB, USTSM
187 real :: wnd_z, wnd_z_mag, wnd_z_proj, wnd_effect
190 REAL :: USTRI1, USTRF1, USTRI2, USTRF2
192 LOGICAL :: UST_IT_FLG(2)
196 real :: wnd_10_x, wnd_10_y, wnd_10_mag, wnd_10_dir
197 real :: u35_1, v35_1, u35_2, v35_2, u35_3, v35_3
198 REAL :: DIFU10xx, DIFU10yx, DIFU10xy, DIFU10yy
199 REAL :: fd_a, fd_b, fd_c, fd_d
200 REAL :: DU, DV, UITV, VITV, CH
201 REAL :: APAR, DTX(3), DTY(3), DT
202 LOGICAL :: WIFLG, WND_IT_FLG
205 integer :: wi_count, wi
206 real :: wnd_ref_al,wnd_ref_ax
207 real :: wndpa, wndpax, wndpay, wndpe,wndpex, wndpey
213 INTEGER,
SAVE :: IENT = 0
215 LOGICAL,
SAVE :: FIRST = .true.
223 CALL strace (ient,
'C3FLD2')
241 uref=sqrt(wndx**2+wndy**2)
242 urefd=atan2(wndy,wndx)
281 CALL wnd2sat(wnd_10_mag,sat)
288 ustra = uref*
kappa/log(zwnd/z01)
291 wnd_10_x=wnd_10_mag*cos(wnd_10_dir)
292 wnd_10_y=wnd_10_mag*sin(wnd_10_dir)
298 DO WHILE ( kmax .LT. 366. )
300 kmax = ( kmax *
xfr**2 )
302 ALLOCATE( wn(nkt), dwn(nkt), cp(nkt),sig2(nkt), spc2(nkt,
nth), &
303 tauintx(nkt),tauinty(nkt))
309 cp(k) =
sig(k) / wn(k)
312 DO k = (
nk + 1 ), ( nkt)
313 sig2(k)=sig2(k-1)*
xfr
314 call sig2wn(sig2(k),depth,wn(k))
318 dwn(k) = (wn(k+1) - wn(k-1)) / 2.0
320 dwn(1) = ( wn(2)- ( wn(1) / (
xfr **2.0) ) ) / 2.0
321 dwn(nkt) = ( wn(nkt)*(
xfr**2.0) - wn(nkt-1)) / 2.0
329 spc2(k,t) = aspc(count) *
sig(k)
334 spc2(k,t)=spc2(
nk,t)*wn(
nk)**3.0/wn(k)**(3.0)
347 DO WHILE ( ( ktaila .GE. wn(ka1) ) .AND. (ka1 .LT. nkt-6) )
351 DO WHILE ( ( ktailb .GE. wn(ka2) ) .AND. (ka2 .LT. nkt-4) )
355 DO WHILE ( ( ktailc .GE. wn(ka3)) .AND. (ka3 .LT. nkt-2) )
358 CALL appendtail(spc2,wn,nkt,ka1,ka2,ka3,atan2(wndy,wndx),sat)
375 DO WHILE ( wiflg .AND. no_err )
380 wnd_10_x = wnd_10_x + dtx(wi)*dt
381 wnd_10_y = wnd_10_y + dty(wi)*dt
382 wnd_10_mag = sqrt(wnd_10_x**2+wnd_10_y**2)
383 wnd_10_dir = atan2(wnd_10_y,wnd_10_x)
390 DO WHILE ((ust_it_flg(1) .AND. ust_it_flg(2)) .AND. no_err)
392 z0 = 10. / ( exp(
kappa * wnd_10_mag / ustra ) )
397 wnd_z = min(
pi / wn(k), 20.0 )
398 wnd_z_mag = ( ustra /
kappa ) * (log(wnd_z/z0))
401 wnd_z_proj = wnd_z_mag * cos( wnd_10_dir-
th(t) )
402 IF (wnd_z_proj .GT. cp(k))
THEN
405 ELSEIF (( wnd_z_proj .GE. 0 ) .AND. ( wnd_z_proj .LE. cp(k) ))
THEN
408 ELSEIF (wnd_z_proj .LT. 0)
THEN
412 wnd_effect = wnd_z_proj - cp(k)
413 scin = a1 * wnd_effect * abs( wnd_effect ) * dair /
dwat * &
421 tauintx(k) = tauintx(k) + spc2(k,t) * scin &
422 * cos(
th(t) ) *sig2(k) *
dth
423 tauinty(k) = tauinty(k) + spc2(k,t) * scin &
424 * sin(
th(t) ) *sig2(k) *
dth
432 tauxw = tauxw +
dwat * dwn(k) * tauintx(k)
433 tauyw = tauyw +
dwat * dwn(k) * tauinty(k)
435 cdf = ( sqrt(tauxw**2.0+tauyw**2.0) / dair ) / wnd_10_mag**2.0
440 IF (uref .LT. 0.01)
THEN
449 DO WHILE( (iterflag ) .AND. (count .LT. 10) )
451 ustsm =
kappa * wnd_10_mag / ( log( 10. / z01 ) )
452 z02 = 0.132 *
nu / ustsm
453 IF (abs( z02/z01-1.0) .LT. 10.0**(-4))
THEN
460 cds = ustsm**2.0 / wnd_10_mag**2.0
462 cds = cds / 3.0 * ( 1.0 + 2.0 * cds / ( cds + cdf ) )
464 taunux = dair * cds * wnd_10_mag**2.0 * cos( wnd_10_dir )
465 taunuy = dair * cds * wnd_10_mag**2.0 * sin( wnd_10_dir )
467 taux = taunux + tauxw
468 tauy = taunuy + tauyw
470 ustrb = sqrt( sqrt( tauy**2.0 + taux**2.0) / dair )
472 ustd = atan2(tauy,taux)
474 b1 = ( ustra - ustrb )
475 b2 = ( ustra + ustrb ) / 2.0
478 ust_it_flg(1)=( abs(b1*100.0/b2) .GE. 0.01)
480 ust_it_flg(2)=( its .LT. 20 )
481 IF ( ust_it_flg(1) .AND. ust_it_flg(2))
THEN
485 ustra = ustrb*.5 + ustrb*.5
486 ELSEIF (abs(b1*100.0/b2) .GE. 5.)
THEN
488 ust_it_flg(1) = .false.
489 ust_it_flg(2) = .false.
490 print*,
'Attn: Stress not converged for windspeed: ',uref
570 ustd = atan2(tauy, taux)
571 cd = ust**2 / uref**2
572 IF (
PRESENT(
charn))
THEN
573 charn = 0.01/sqrt(sqrt( taunux**2 + taunuy**2 )/(ust**2))
575 IF (.not.((cd .LT. 0.01).AND.(cd .GT. 0.0005)).or. .not.(no_err))
THEN
577 print*,
'Attn: W3FLD2 failed, using bulk stress'
578 print*,
'Calculated Wind/Cd: ',uref,cd,ust
580 ust = uref *
kappa / log(zwnd/z0)
584 DEALLOCATE( tauinty , tauintx , &
585 spc2, sig2, cp , dwn , wn )