134 SUBROUTINE w3spr3 (A, CG, WN, EMEAN, FMEAN, FMEANS, WNMEAN, &
135 AMAX, U, UDIR, USTAR, USDIR, TAUWX, TAUWY, CD, Z0,&
136 CHARN, LLWS, FMEANWS)
222 REAL,
INTENT(IN) :: A(NTH,NK), CG(NK), WN(NK), U, UDIR
223 REAL,
INTENT(IN) :: TAUWX, TAUWY
224 LOGICAL,
INTENT(IN) :: LLWS(NSPEC)
225 REAL,
INTENT(INOUT) :: USTAR ,USDIR
226 REAL,
INTENT(OUT) :: EMEAN, FMEAN, FMEANS, WNMEAN, AMAX, &
227 CD, Z0, CHARN, FMEANWS
232 INTEGER :: IS, IK, ITH
234 INTEGER,
SAVE :: IENT = 0
237 REAL :: TAUW, EBAND, EMEANWS, UNZ, &
238 EB(NK),EB2(NK),ALFA(NK)
243 CALL strace (ient,
'W3SPR3')
246 unz = max( 0.01 , u )
247 ustar = max( 0.0001 , ustar )
264 eb(ik) = eb(ik) + a(ith,ik)
265 IF (llws(is)) eb2(ik) = eb2(ik) + a(ith,ik)
266 amax = max( amax , a(ith,ik) )
273 alfa(ik) = 2. *
dth *
sig(ik) * eb(ik) * wn(ik)**3
274 eb(ik) = eb(ik) *
dden(ik) / cg(ik)
275 eb2(ik) = eb2(ik) *
dden(ik) / cg(ik)
276 emean = emean + eb(ik)
279 wnmean = wnmean + eb(ik) *(wn(ik)**
wwnmeanp)
280 emeanws = emeanws+ eb2(ik)
287 eband = eb(nk) /
dden(nk)
288 emean = emean + eband *
fte
290 fmeans = fmeans + eband *
sstxftf
292 eband = eb2(nk) /
dden(nk)
293 emeanws = emeanws + eband *
fte
299 IF (fmean.LT.1.e-7)
THEN
302 fmean =
tpiinv *( max( 1.e-7 , fmean ) &
305 IF (fmeans.LT.1.e-7)
THEN
308 fmeans =
tpiinv *( max( 1.e-7 , fmeans ) &
309 / max( 1.e-7 , emean ))**(1/(2.*
wwnmeanp))
311 wnmean = ( max( 1.e-7 , wnmean ) &
312 / max( 1.e-7 , emean ) )**(1/
wwnmeanp)
313 IF (fmeanws.LT.1.e-7.OR.emeanws.LT.1.e-7)
THEN
316 fmeanws =
tpiinv *( max( 1.e-7 , fmeanws ) &
322 tauw = sqrt(tauwx**2+tauwy**2)
326 unz = max( 0.01 , u )
333 WRITE (
ndst,9060) emean, wnmean,
tpiinv, ustar, cd, z0
341 9060
FORMAT (
' TEST W3SPR3 : E,WN MN :',f8.3,f8.4/ &
342 ' TPIINV, USTAR, CD, Z0 :',f8.3,f7.2,1x,2f9.5)
384 SUBROUTINE w3sin3 (A, CG, K, U, USTAR, DRAT, AS, USDIR, Z0, CD, &
385 TAUWX, TAUWY, TAUWNX, TAUWNY, ICE, S, D, LLWS, IX, IY)
496 REAL,
INTENT(IN) :: A(NSPEC)
497 REAL,
INTENT(IN) :: CG(NK), K(NSPEC),Z0,U, CD
498 REAL,
INTENT(IN) :: USTAR, USDIR, AS, DRAT, ICE
499 REAL,
INTENT(OUT) :: S(NSPEC), D(NSPEC), TAUWX, TAUWY, TAUWNX, TAUWNY
500 LOGICAL,
INTENT(OUT) :: LLWS(NSPEC)
501 INTEGER,
INTENT(IN) :: IX, IY
508 INTEGER,
SAVE :: IENT = 0
510 REAL :: COSU, SINU, TAUX, TAUY
511 REAL :: UST2, TAUW, TAUWB
512 REAL ,
PARAMETER :: EPS1 = 0.00001, eps2 = 0.000001
517 REAL :: CM,UCO,UCN,ZCN, &
521 REAL :: CONST, CONST0, CONST2, CONST3, TAU1
522 REAL :: X,ZARG,ZLOG,ZBETA,UST
523 REAL COSWIND,XSTRESS,YSTRESS,TAUHF
527 REAL STRESSSTAB(3,2),STRESSSTABN(3,2)
535 CALL strace (ient,
'W3SIN3')
545 dstab=0.; stressstab=0. ;stressstabn=0.
549 z0visc = 0.1*nu_air/max(ustar,0.0001)
558 usigma=max(0.,-0.025*as)
559 ustarsigma=(1.0+u/(10.+u))*usigma
565 IF (istab.EQ.1) ust=ustar*(1.-ustarsigma)
566 IF (istab.EQ.2) ust=ustar*(1.+ustarsigma)
568 taux = ust**2* cos(usdir)
569 tauy = ust**2* sin(usdir)
573 stressstab(istab,:)=0.
574 stressstabn(istab,:)=0.
575 const0=
bbeta*drat/(kappa**2)
577 const3 =
sswellf(1)*2.*kappa*drat
591 const2=
dden2(is)/cg(ik) &
592 *grav/(
sig(ik)/k(is)*drat)
593 const=
sig2(is)*const0
602 coswind=(
ecos(is)*cosu+
esin(is)*sinu)
603 IF (coswind.GT.0.01)
THEN
610 zbeta = const3*(coswind+kappa/(zcn*ust*cm))*ucn**2
614 dstab(istab,is) = const*exp(zlog)*zlog**4*ucn**2*coswind**
ssinthp
617 dstab(istab,is) = zbeta
621 zbeta = const3*(coswind+kappa/(zcn*ust*cm))*ucn**2
622 dstab(istab,is) = zbeta
626 temp2=const2*dstab(istab,is)*a(is)
627 IF (dstab(istab,is).LT.0)
THEN
628 stressstabn(istab,1)=stressstabn(istab,1)+temp2*
ecos(is)
629 stressstabn(istab,2)=stressstabn(istab,2)+temp2*
esin(is)
631 stressstab(istab,1)=stressstab(istab,1)+temp2*
ecos(is)
632 stressstab(istab,2)=stressstab(istab,2)+temp2*
esin(is)
637 xstress=stressstab(3,1)
638 ystress=stressstab(3,2)
639 tauwnx =stressstabn(3,1)
640 tauwny =stressstabn(3,2)
644 d(:)=0.5*(dstab(1,:)+dstab(2,:))
645 xstress=0.5*(stressstab(1,1)+stressstab(2,1))
646 ystress=0.5*(stressstab(1,2)+stressstab(2,2))
647 tauwnx=0.5*(stressstabn(1,1)+stressstabn(2,1))
648 tauwny=0.5*(stressstabn(1,2)+stressstabn(2,2))
657 dout(ik,ith) = d(ith+(ik-1)*nth)
660 CALL prt2ds (
ndst, nk, nk, nth, dout,
sig(1:nk),
' ', 1., &
661 0.0, 0.001,
'Diag Sin',
' ',
'NONAME')
665 CALL outmat (
ndst, d, nth, nth, nk,
'diag Sin')
671 const0=
dth*
sig(nk)**5/((grav**2)*tpi) &
672 *tpi*
sig(nk) / cg(nk)
676 coswind=(
ecos(is)*cosu+
esin(is)*sinu)
677 temp=temp+a(is)*(max(coswind,0.))**3
683 ind = max(1,min(
iustar-1, int(xi)))
684 deli1= max(min(1. ,xi-float(ind)),0.)
686 xj=max(0.,(grav*z0/max(ust,0.00001)**2-
aalpha) /
delalp)
687 j = max(1 ,min(
ialpha-1, int(xj)))
688 delj1= max(0.,min(1. , xj-float(j)))
690 tau1 =(
tauhft(ind,j)*deli2+
tauhft(ind+1,j)*deli1 )*delj2 &
692 tauhf = const0*temp*ust**2*tau1
693 tauwx = xstress+tauhf*cos(usdir)
694 tauwy = ystress+tauhf*sin(usdir)
699 tauw = sqrt(tauwx**2+tauwy**2)
700 ust2 = max(ustar,eps2)**2
701 tauwb = min(tauw,max(ust2-eps1,eps2**2))
702 IF (tauwb.LT.tauw)
THEN
703 tauwx=tauwx*tauwb/tauw
704 tauwy=tauwy*tauwb/tauw
712 9000
FORMAT (
' TEST W3SIN3 : COMMON FACT.: ',3e10.3)
797 INTEGER,
SAVE :: IENT = 0
803 CALL strace (ient,
'INSIN3')
892 INTEGER,
PARAMETER :: NITER=10
893 REAL ,
PARAMETER :: XM=0.50, eps1=0.00001
902 REAL ZTAUW,UTOP,CDRAG,WCD,USTOLD,TAUOLD
903 REAL X,UST,ZZ0,ZNU,F,DELF,ZZ00
915 tauold = max(ustold**2, ztauw+eps1)
922 zz0 = zz00/(1.-x)**xm
925 f = ust-kappa*utop/(alog(
zzwnd/zz0))
926 delf= 1.-kappa*utop/(alog(
zzwnd/zz0))**2*2./ust &
927 *(1.-(xm+1)*x)/(1.-x)
929 tauold= max(ust**2., ztauw+eps1)
931 taut(i,j) = sqrt(tauold)
1027 REAL,
intent(in) :: FRMAX
1042 REAL :: USTARM, ALPHAM
1043 REAL :: CONST1, OMEGA, OMEGAC
1044 REAL :: UST, ZZ0,OMEGACC, CM
1045 INTEGER,
PARAMETER :: JTOT=250
1046 REAL,
ALLOCATABLE :: W(:)
1047 REAL :: ZX,ZARG,ZMU,ZLOG,ZZ00,ZBETA
1052 INTEGER,
SAVE :: IENT = 0
1053 CALL strace (ient,
'TABU_HF')
1060 const1 =
bbeta/kappa**2
1073 ust = max(real(k)*
delust,0.000001)
1077 omegacc = max(omegac,x0*
grav/ust)
1078 yc = omegacc*sqrt(zz0/
grav)
1079 dely = max((1.-yc)/real(jtot),0.)
1084 y = yc+real(j-1)*dely
1085 omega = y*sqrt(
grav/zz0)
1090 zarg = min(kappa/zx,20.)
1091 zmu = min(
grav*zz0/cm**2*exp(zarg),1.)
1092 zlog = min(alog(zmu),0.)
1093 zbeta = const1*zmu*zlog**4
1114 9000
FORMAT (
' TABU_HF, L, K :',(2i4,3f8.3)/)
1135 SUBROUTINE calc_ustar(WINDSPEED,TAUW,USTAR,Z0,CHARN)
1196 REAL,
intent(in) :: WINDSPEED,TAUW
1197 REAL,
intent(out) :: USTAR, Z0, CHARN
1200 REAL X,XI,DELI1,DELI2,XJ,delj1,delj2
1201 REAL UST,DELTOLD,TAUW_LOCAL
1204 tauw_local=max(min(tauw,
tauwmax),0.)
1206 ind = min(
itaumax-1, int(xi))
1207 deli1 = min(1.,xi - real(ind))
1210 j = min(
jumax-1, int(xj) )
1211 delj1 = min(1.,xj - real(j))
1213 ustar=(
taut(ind,j)*deli2+
taut(ind+1,j )*deli1)*delj2 &
1214 + (
taut(ind,j+1)*deli2+
taut(ind+1,j+1)*deli1)*delj1
1218 sqrtcdm1 = min(windspeed/ustar,100.0)
1219 z0 =
zzwnd*exp(-kappa*sqrtcdm1)
1220 IF (ustar.GT.0.001)
THEN
1221 charn =
grav*z0/ustar**2
1253 SUBROUTINE w3sds3 (A, K, CG, EMEAN, FMEAN, WNMEAN, USTAR, USDIR, &
1254 DEPTH, S, D, IX, IY)
1352 REAL,
INTENT(IN) :: A(NSPEC), K(NK), CG(NK), &
1353 DEPTH, USTAR, USDIR, EMEAN, FMEAN, WNMEAN
1354 INTEGER,
INTENT(IN) :: IX, IY
1355 REAL,
INTENT(OUT) :: S(NSPEC), D(NSPEC)
1360 INTEGER :: IS, IK, ITH
1362 INTEGER,
SAVE :: IENT = 0
1364 REAL :: FACTOR, FACTOR2
1365 REAL :: ALFAMEAN, WNMEAN2
1367 REAL :: DOUT(NK,NTH)
1373 CALL strace (ient,
'W3SDS3')
1382 wnmean2 = max( 1.e-10 , wnmean )
1383 alfamean=wnmean**2*emean
1384 factor = ssdsc1 *
tpi*fmean * alfamean**2
1387 WRITE (
ndst,9000) ssdsc1, fmean, wnmean, emean, factor
1398 factor2=factor*(
ddelta1*k(ik)/wnmean2 +
ddelta2*(k(ik)/wnmean2)**2)
1412 dout(ik,ith) = d(ith+(ik-1)*nth)
1415 CALL prt2ds (
ndst, nk, nk, nth, dout, sig(1:nk),
' ', 1., &
1416 0.0, 0.001,
'Diag Sds',
' ',
'NONAME')
1420 CALL outmat (
ndst, d, nth, nth, nk,
'diag Sds')
1428 9000
FORMAT (
' TEST W3SDS3 : COMMON FACT.: ',5e10.3)