15 SUBROUTINE windp1 (WIND10 ,THETAW ,IDWMIN , &
16 IDWMAX ,FPM ,UFRIC , &
79 REAL :: SPCDIR(MDC,6),SPCSIG(MSC)
80 INTEGER :: IDWMIN ,IDWMAX
81 INTEGER :: ID,IDDUM,IG
83 REAL :: WIND10 ,THETAW ,UFRIC ,FPM ,CDRAG ,SDMEAN
84 REAL :: WX2(MT), WY2(MT), UX2(MT), UY2(MT)
86 REAL AWX, AWY, RWX, RWY
105 wind10 = sqrt(rwx**2+rwy**2)
107 thetaw = atan2(rwy,rwx)
129 sdmean = 0.5 * (spcdir(1,1) + spcdir(mdc,1))
130 IF(thetaw < sdmean -
pi_w) thetaw = thetaw + 2.*
pi_w 131 IF(thetaw > sdmean +
pi_w) thetaw = thetaw - 2.*
pi_w 133 IF((thetaw-0.5*
pi_w) <= spcdir(1,1))
THEN 134 IF((thetaw+1.5*
pi_w) >= spcdir(mdc,1))
THEN 137 idwmin = nint( (thetaw + 1.5*
pi_w - spcdir(1,1)) /
ddir ) + 1
140 idwmin = nint( (thetaw - 0.5*
pi_w - spcdir(1,1)) /
ddir ) + 1
143 IF((thetaw + 0.5 *
pi_w) >= spcdir(mdc,1))
THEN 144 IF((thetaw - 1.5 *
pi_w) <= spcdir(1,1))
THEN 147 idwmax = nint( (thetaw - 1.5 *
pi_w - spcdir(1,1)) /
ddir ) + 1
150 idwmax = nint( (thetaw + 0.5 *
pi_w - spcdir(1,1)) /
ddir ) + 1
153 IF(idwmin > idwmax) idwmax = mdc + idwmax
168 ufric = wind10 * sqrt(( 0.8 + 0.065 * wind10 ) * 0.001 )
171 ufric = sqrt( cdrag ) * wind10
178 wind10 = wind10 * sqrt(((0.8 + 0.065 * wind10) * 0.001) / &
179 ((0.8 + 0.065 * 15. ) * 0.001))
181 ELSE IF(
iwind >= 3)
THEN 187 ufric = wind10 * sqrt(( 0.8 + 0.065 * wind10 ) * 0.001 )
190 ufric = sqrt( cdrag ) * wind10
195 ufric = max( 1.e-15 , ufric)
196 fpm =
grav_w / ( 28.0 * ufric )
206 SUBROUTINE windp2 (IDWMIN ,IDWMAX ,SIGPKD ,FPM , &
282 INTEGER IDWMIN ,IDWMAX ,IDDUM ,ID ,IS ,ISFPM
284 REAL ETOTW ,FPM ,SIG ,ATOTD
286 REAL AC2(MDC,MSC,0:MT)
296 IF(
frinth * sig > (0.7 * fpm))
THEN 311 DO iddum = idwmin, idwmax
312 id =
mod( iddum - 1 + mdc, mdc ) + 1
313 atotd = atotd + ac2(id,is,
kcgrd(1))
316 etotw = etotw + facint *
frintf * sig**2 *
ddir * atotd
318 etotw = etotw +
frintf * sig**2 *
ddir * atotd
322 etotw = etotw +
pwtail(6) * sig**2 *
ddir * atotd
329 SUBROUTINE windp3 (ISSTOP ,ALIMW ,AC2 , &
330 GROWW ,IDCMIN ,IDCMAX )
424 INTEGER IS ,ID ,ISSTOP ,IDDUM
426 INTEGER IDCMIN(MSC) ,IDCMAX(MSC)
430 REAL AC2(MDC,MSC,0:MT) ,ALIMW(MDC,MSC)
432 LOGICAL GROWW(MDC,MSC)
441 DO iddum = idcmin(is) , idcmax(is)
442 id =
mod( iddum - 1 + mdc, mdc ) + 1
443 ac2cen = ac2(id,is,
kcgrd(1))
444 IF ( groww(id,is) .AND. ac2cen .GT. alimw(id,is) ) &
445 ac2(id,is,
kcgrd(1)) = alimw(id,is)
446 IF ( .NOT. groww(id,is) .AND. ac2cen .LT. alimw(id,is) ) &
447 ac2(id,is,
kcgrd(1)) = alimw(id,is)
450 WRITE(
printf,300) is,id,groww(id,is),ac2cen,alimw(id,is)
451 300
FORMAT(
' WINDP3 : IS ID GROWW AC2CEN ALIM:',2i4,l4,2e12.4)
461 4000
FORMAT(
' WINDP3 : POINT ISSTOP MSC MDC MCGRD :',5i5)
469 SUBROUTINE swind0 (IDCMIN ,IDCMAX ,ISSTOP ,SPCSIG ,THETAW , &
470 UFRIC ,FPM ,PLWNDA ,IMATRA ,SPCDIR )
510 REAL :: SPCDIR(MDC,6) ,SPCSIG(MSC)
511 INTEGER :: IDDUM ,ID ,IS ,ISSTOP
512 REAL :: FPM ,UFRIC ,THETA ,THETAW ,SWINEA ,SIGMA , &
513 TEMP1 ,TEMP2 ,CTW ,STW ,COSDIF ,TEMP3 , &
515 REAL :: IMATRA(MDC,MSC) ,PLWNDA(MDC,MSC,NPTST)
516 INTEGER :: IDCMIN(MSC) ,IDCMAX(MSC)
522 fpm =
grav_w / ( 28.0 * ufric )
531 argu = min(2., fpm / sigma)
532 filter = exp( - argu**4 )
533 temp2 = temp1 / sigma
534 DO iddum = idcmin(is), idcmax(is)
535 id =
mod( iddum - 1 + mdc, mdc ) + 1
536 IF(sigma >= (0.7 * fpm))
THEN 538 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
539 temp3 = ( ufric * max( 0. , cosdif))**4
540 swinea = max( 0. , temp2 * temp3 * filter )
541 imatra(id,is) = imatra(id,is) + swinea
553 SUBROUTINE swind3 (SPCSIG ,THETAW ,IMATDA ,KWAVE ,IMATRA , &
554 IDCMIN ,IDCMAX ,UFRIC ,FPM ,PLWNDB , &
604 REAL :: SPCDIR(MDC,6),SPCSIG(MSC)
605 INTEGER :: IDDUM ,ID ,IS ,ISSTOP ,IG
606 REAL :: FPM ,UFRIC ,THETA ,THETAW,SIGMA ,SWINEB,TEMP1, &
607 CTW ,STW ,COSDIF,TEMP2 ,TEMP3 ,CINV
608 REAL :: IMATDA(MDC,MSC),IMATRA(MDC,MSC), &
609 KWAVE(MSC,ICMAX),PLWNDB(MDC,MSC,NPTST)
610 INTEGER :: IDCMIN(MSC),IDCMAX(MSC)
614 temp1 = 0.25 *
pwind(9)
618 cinv = kwave(is,1) / sigma
620 DO iddum = idcmin(is), idcmax(is)
621 id =
mod( iddum - 1 + mdc, mdc ) + 1
623 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
624 swineb = temp1 * ( temp3 * cosdif - 1.0 )
625 swineb = max( 0. , swineb * sigma )
627 imatra(id,is) = imatra(id,is) + swineb *
ac2(id,is,ig)
628 imatda(id,is) = imatda(id,is) - swineb
639 SUBROUTINE swind4 (IDWMIN ,IDWMAX ,SPCSIG ,WIND10 ,THETAW , &
640 XIS ,DD ,KWAVE ,IMATRA ,IMATDA , &
641 IDCMIN ,IDCMAX ,UFRIC ,PLWNDB ,ISSTOP , &
642 ITER ,USTAR ,ZELEN ,SPCDIR ,IT , &
681 REAL :: SPCDIR(MDC,6),SPCSIG(MSC)
682 INTEGER :: IDWMAX ,IDWMIN ,IDDUM ,ID ,ISSTOP ,IS
683 REAL :: THETA ,THETAW ,DD ,SWINEB ,WIND10 , &
684 ZO ,ZE ,BETA1 ,BETA2 ,UFRIC ,UFRIC2 ,DS , &
685 ZARG ,ZLOG1 ,ZLOG2 ,ZCN1 ,ZCN2 ,ZCN ,XIS , &
686 SIGMA ,SIGMA1 ,SIGMA2 ,WAVEN ,WAVEN1 ,WAVEN2 ,TAUW , &
687 TAUTOT ,TAUDIR ,COS1 ,COS2 ,CW1 ,RHOA ,RHOW , &
688 RHOAW ,ALPHA ,XKAPPA ,F1 ,TAUWX ,TAUWY ,SE1 , &
691 REAL :: IMATDA(MDC,MSC) , &
694 PLWNDB(MDC,MSC,NPTST), &
697 INTEGER :: IDCMIN(MSC) ,IDCMAX(MSC)
698 REAL :: ZTEN ,RATIO ,BETAMX ,TXHFR ,TYHFR ,CW2 ,ZARG1 ,ZARG2
699 REAL :: GAMHF ,SIGMAX ,SIGHF1 ,SIGHF2 ,ZCNHF1 ,ZCNHF2 ,AUX
700 REAL :: ZAHF1 ,ZAHF2 ,FACHFR ,FA ,FB ,FC ,FD ,FE ,FCEN
701 REAL :: FF1 ,FF2 ,FF3 ,DCEN ,TAUNEW ,XFAC2 ,BETA ,ZLOG
702 INTEGER :: IT ,IG ,ITER ,J ,II
715 f1 = betamx / xkappa**2
719 IF(
nstatc == 1 .AND. it == 1)
THEN 724 zo = alpha * ufric * ufric /
grav_w 725 ze = zo / sqrt( 1. - ratio )
728 ELSE IF(
nstatc == 0 .AND.
icond == 4 .AND. iter == 1)
THEN 732 zo = alpha * ufric * ufric /
grav_w 733 ze = zo / sqrt( 1. - ratio )
736 ELSE IF (
nstatc.EQ.0 .AND.
icond.NE.4 .AND. iter .EQ. 2 )
THEN 743 zo = alpha * ufric * ufric /
grav_w 744 ze = zo / sqrt( 1. - ratio )
764 ufric2 = ufric * ufric
768 sigma2 = spcsig(is+1)
770 waven2 = kwave(is+1,1)
772 cw1 = sigma1 / waven1
773 cw2 = sigma2 / waven2
774 zcn1 = alog(
grav_w * ze / cw1**2 )
775 zcn2 = alog(
grav_w * ze / cw2**2 )
776 DO iddum = idwmin, idwmax
777 id =
mod( iddum - 1 + mdc, mdc ) + 1
779 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
780 sinwav = spcdir(id,3)
781 coswav = spcdir(id,2)
782 cos1 = max( 0. , cosdif )
790 zarg1 = xkappa * cw1 / ( ufric * cos1 )
791 zarg2 = xkappa * cw2 / ( ufric * cos1 )
794 IF(zlog1 < 0.) beta1 = f1 * exp(zlog1) * zlog1**4
795 IF(zlog2 < 0.) beta2 = f1 * exp(zlog2) * zlog2**4
801 se1 = waven1**2 * beta1 * sigma1 *
ac2(id,is ,ig)
802 se2 = waven2**2 * beta2 * sigma2 *
ac2(id,is+1,ig)
804 tauwx = tauwx + 0.5 * ( se1 + se2 ) * ds * coswav * cos2
805 tauwy = tauwy + 0.5 * ( se1 + se2 ) * ds * sinwav * cos2
812 gamhf = xkappa *
grav_w / ufric
816 sighf2 = xis * sighf1
818 zcnhf1 = alog( ze * sighf1**2 /
grav_w )
819 zcnhf2 = alog( ze * sighf2**2 /
grav_w )
821 DO iddum = idwmin, idwmax
822 id =
mod( iddum - 1 + mdc, mdc ) + 1
824 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
825 sinwav = spcdir(id,3)
826 coswav = spcdir(id,2)
827 cos1 = max( 0. , cosdif )
834 zahf1 = gamhf / sighf1
835 zahf2 = gamhf / sighf2
836 zlog1 = zcnhf1 + zahf1
837 zlog2 = zcnhf2 + zahf2
838 IF(zlog1 < 0.) beta1 = f1 * exp(zlog1) * zlog1**4
839 IF(zlog2 < 0.) beta2 = f1 * exp(zlog2) * zlog2**4
840 aux = aux + beta1 + beta2
847 fachfr = sigmax**6 *
ac2(id,msc,ig) * cos2 /
grav_w**2
849 se1 = fachfr * beta1 / sighf1
850 se2 = fachfr * beta2 / sighf2
852 txhfr = txhfr + 0.5 * ( se1 + se2 ) * ds * coswav
853 tyhfr = tyhfr + 0.5 * ( se1 + se2 ) * ds * sinwav
858 IF(aux == 0.)
GOTO 5000
866 tautot = rhoa * ufric2
868 tauwx = tauwx + txhfr
869 tauwy = tauwy + tyhfr
870 IF(
abs(tauwx) > 0. .OR.
abs(tauwy) > 0.)
THEN 871 taudir = atan2( tauwx, tauwy )
876 tauw = rhoa * ufric2 * dd * sqrt( tauwx**2 + tauwy**2 )
877 tauw = min( tauw , 0.999 * tautot )
881 fa = sqrt( 1. - tauw / tautot )
882 fb = zten * rhoa *
grav_w / alpha
883 fc = fa * ( fb / tautot - 1. )
890 fcen = fd * fe - sqrt(rhoa) * wind10 * xkappa
892 ff2 = 0.5 * tauw * fc / fa**2 - fa * fb
893 ff3 = tautot**1.5 * ( fc + 1. )
894 dcen = ff1 + ff2 / ff3
898 taunew = tautot - fcen / dcen
900 IF(taunew <= tauw) taunew = .5 * (tautot + tauw)
901 IF(
abs( taunew - tautot ) <= 1.e-5 )
GOTO 3000
907 ufric = sqrt( tautot / rhoa )
909 zo = alpha * ufric * ufric /
grav_w 910 ze = zo / sqrt( 1. - tauw / tautot )
923 ufric2 = ufric * ufric
929 zcn = alog(
grav_w * ze / cw1**2 )
930 DO iddum = idcmin(is), idcmax(is)
931 id =
mod( iddum - 1 + mdc, mdc ) + 1
933 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
934 cos1 = max( 0. , cosdif )
936 xfac2 = ( ufric / cw1 )**2
939 zarg = xkappa * cw1 / ( ufric * cos1 )
941 IF(zlog < 0.) beta = f1 * exp(zlog) * zlog**4
946 swineb = rhoaw * beta * xfac2 * cos2 * sigma
947 imatra(id,is) = imatra(id,is) + swineb *
ac2(id,is,ig)
948 imatda(id,is) = imatda(id,is) - swineb
959 SUBROUTINE swind5 (SPCSIG ,THETAW ,ISSTOP ,UFRIC ,KWAVE , &
960 IMATRA ,IMATDA ,IDCMIN ,IDCMAX ,PLWNDB , &
993 REAL :: SPCDIR(MDC,6),SPCSIG(MSC)
994 INTEGER :: IDDUM ,ID ,IS ,ISSTOP, IG
995 REAL :: UFRIC ,THETA ,THETAW ,SIGMA ,SWINEB , &
997 USTAC1 ,USTAC2 ,COF1 ,COF2 ,COF3 ,COF4
998 REAL :: IMATDA(MDC,MSC) ,IMATRA(MDC,MSC) , &
999 KWAVE(MSC,ICMAX) ,PLWNDB(MDC,MSC,NPTST)
1000 INTEGER :: IDCMIN(MSC) ,IDCMAX(MSC)
1024 ustac1 = ( ufric * kwave(is,1) ) / sigma
1025 ustac2 = ustac1 * ustac1
1026 temp3 = ( cof1 * ustac2 + cof2 * ustac1 + cof3)
1027 DO iddum = idcmin(is), idcmax(is)
1028 id =
mod( iddum - 1 + mdc, mdc ) + 1
1029 theta = spcdir(id,1)
1030 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
1031 swineb = temp3 * cosdif - cof4
1032 swineb = max( 0. , swineb * sigma )
1034 imatra(id,is) = imatra(id,is) + swineb *
ac2(id,is,ig)
1035 imatda(id,is) = imatda(id,is) - swineb
1047 SUBROUTINE wndpar (ISSTOP,IDWMIN,IDWMAX,IDCMIN,IDCMAX, &
1048 DEP2 ,WIND10,THETAW,AC2 ,KWAVE , &
1049 IMATRA,IMATDA,SPCSIG,CGO ,ALIMW , &
1050 GROWW ,ETOTW ,PLWNDA,PLWNDB,SPCDIR, &
1156 REAL :: SWIND_EXP, SWIND_IMP
1280 INTEGER IS,ID,ITER,IDWMIN,IDWMAX,IDDUM ,ISSTOP
1282 REAL WIND10,THETA ,THETAW,EDML ,ARG1 ,ARG2 , &
1283 ALPM ,ALPMD ,TEMP1 ,TEMP2 ,FACTA ,FACTB , &
1284 ADUM ,BDUM ,CINV ,SIGTPI,SIGMA ,TWOPI ,TAUINV, &
1285 SIGPK ,SIGPKD,DND ,ETOTW ,ALIM1D, &
1287 DIRDIS,AC2CEN,DTHETA
1289 REAL :: AC2(MDC,MSC,0:MT)
1290 REAL :: ALIMW(MDC,MSC)
1291 REAL :: IMATDA(MDC,MSC), IMATRA(MDC,MSC)
1293 REAL :: KWAVE(MSC,MICMAX)
1294 REAL :: PLWNDA(MDC,MSC,NPTST)
1295 REAL :: PLWNDB(MDC,MSC,NPTST)
1298 REAL :: CGO(MSC,MICMAX)
1300 INTEGER IDCMIN(MSC),IDCMAX(MSC)
1302 LOGICAL GROWW(MDC,MSC)
1312 groww(id,is) = .false.
1323 dnd = min( 50. ,
grav_w * dep2(
kcgrd(1)) / wind10**2 )
1324 sigpk = twopi * 0.13 *
grav_w / wind10
1325 sigpkd = sigpk / tanh(0.833*dnd**0.375)
1336 ELSE IF(
iwind == 2)
THEN 1344 CALL windp2 (idwmin ,idwmax ,sigpkd ,fpm , &
1346 ac2 ,spcsig , wind10 )
1348 edml = min(
pwind(10) , (
grav_w**2 * etotw) / wind10**4 )
1349 edml = max( 1.e-25 , edml )
1352 alpm = max( 0.0081, (
pwind(5) * (1./edml)**arg1) )
1359 alpmd = 0.0081 + ( 0.013 - 0.0081 ) * exp( -1. * dnd )
1360 alpm = min( 0.155 , max( alpmd , alpm ) )
1368 temp1 = alpm / ( 2. * kwave(is,1)**3 * cgo(is,1) )
1369 arg2 = min( 2. , sigpkd / spcsig(is) )
1370 temp2 = exp( (-5./4.) * arg2**4 )
1371 alim1d = temp1 * temp2 / spcsig(is)
1372 DO iddum = idwmin, idwmax
1373 id =
mod( iddum - 1 + mdc, mdc ) + 1
1374 theta = spcdir(id,1)
1375 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
1381 IF((iter == 1).AND.(
igen == 3))
THEN 1382 dirdis = 0.434917 * (max(0., cosdif))**0.6
1384 dirdis = (2./
pi_w) * cosdif**2
1387 alimw(id,is) = alim1d * dirdis
1389 ac2cen = ac2(id,is,
kcgrd(1))
1390 IF(ac2cen <= alimw(id,is))
THEN 1391 groww(id,is) = .true.
1393 groww(id,is) = .false.
1414 sigtpi = sigma * twopi
1415 cinv = kwave(is,1) / sigma
1417 DO iddum = idcmin(is), idcmax(is)
1418 id =
mod( iddum - 1 + mdc, mdc ) + 1
1419 dtheta = spcdir(id,1) - thetaw
1420 cosdif = spcdir(id,2)*ctw + spcdir(id,3)*stw
1422 ac2cen = ac2(id,is,
kcgrd(1))
1427 IF(groww(id,is))
THEN 1429 IF(sigma >= ( 0.7 * sigpkd ))
THEN 1430 adum = facta * (wind10 * cosdif)**4
1431 adum = max( 0. , adum / sigtpi )
1438 bdum = max( 0., ((wind10 * cinv) * cosdif-
pwind(3)))
1439 bdum = factb * bdum * 5.
1440 swind_exp = adum + bdum * ac2cen
1442 ELSE IF(.NOT. groww(id,is) .AND. ac2cen > 0.)
THEN 1447 IF(cosdif < 0.)
THEN 1450 tauinv = ( sigma**2 * wind10 *
abs(cosdif) ) / &
1453 swind_exp = tauinv * alimw(id,is)
1461 imatra(id,is) = imatra(id,is) + swind_exp
subroutine swind0(IDCMIN, IDCMAX, ISSTOP, SPCSIG, THETAW, UFRIC, FPM, PLWNDA, IMATRA, SPCDIR)
subroutine strace(IENT, SUBNAM)
subroutine swind5(SPCSIG, THETAW, ISSTOP, UFRIC, KWAVE, IMATRA, IMATDA, IDCMIN, IDCMAX, PLWNDB, SPCDIR, IG)
real, dimension(:,:,:), allocatable ac2
subroutine windp3(ISSTOP, ALIMW, AC2, GROWW, IDCMIN, IDCMAX)
subroutine wndpar(ISSTOP, IDWMIN, IDWMAX, IDCMIN, IDCMAX, DEP2, WIND10, THETAW, AC2, KWAVE, IMATRA, IMATDA, SPCSIG, CGO, ALIMW, GROWW, ETOTW, PLWNDA, PLWNDB, SPCDIR, ITER)
subroutine windp1(WIND10, THETAW, IDWMIN, IDWMAX, FPM, UFRIC, WX2, WY2, SPCDIR, UX2, UY2, SPCSIG, IG)
subroutine swind4(IDWMIN, IDWMAX, SPCSIG, WIND10, THETAW, XIS, DD, KWAVE, IMATRA, IMATDA, IDCMIN, IDCMAX, UFRIC, PLWNDB, ISSTOP, ITER, USTAR, ZELEN, SPCDIR, IT, IG)
real, dimension(10) pwtail
integer, dimension(micmax) kcgrd
real, dimension(mwind) pwind
subroutine swind3(SPCSIG, THETAW, IMATDA, KWAVE, IMATRA, IDCMIN, IDCMAX, UFRIC, FPM, PLWNDB, ISSTOP, SPCDIR, IG)
subroutine windp2(IDWMIN, IDWMAX, SIGPKD, FPM, ETOTW, AC2, SPCSIG, WIND10)