99 REAL,
PARAMETER ::
umax = 50.
142 SUBROUTINE w3spr4 (A, CG, WN, EMEAN, FMEAN, FMEAN1, WNMEAN, &
145 TAUA, TAUADIR, DAIR, &
148 TAUWX, TAUWY, CD, Z0, CHARN, LLWS, FMEANWS, DLWMEAN)
250 REAL,
INTENT(IN) :: A(NTH,NK), CG(NK), WN(NK), U, UDIR
252 REAL,
INTENT(IN) :: TAUA, TAUADIR, DAIR
254 REAL,
INTENT(IN) :: TAUWX, TAUWY
255 LOGICAL,
INTENT(IN) :: LLWS(NSPEC)
256 REAL,
INTENT(INOUT) :: USTAR ,USDIR
257 REAL,
INTENT(OUT) :: EMEAN, FMEAN, FMEAN1, WNMEAN, AMAX, &
258 CD, Z0, CHARN, FMEANWS, DLWMEAN
263 INTEGER :: IS, IK, ITH
265 INTEGER,
SAVE :: IENT = 0
268 REAL :: TAUW, EBAND, EMEANWS,UNZ, &
269 EB(NK),EB2(NK),ELCS, ELSN, SIGFAC
274 CALL strace (ient,
'W3SPR4')
277 unz = max( 0.01 , u )
278 ustar = max( 0.0001 , ustar )
299 eb(ik) = eb(ik) + a(ith,ik)
300 elcs = elcs + a(ith,ik)*
ecos(is)*sigfac
301 elsn = elsn + a(ith,ik)*
esin(is)*sigfac
302 IF (llws(is)) eb2(ik) = eb2(ik) + a(ith,ik)
303 amax = max( amax , a(ith,ik) )
307 dlwmean=atan2(elsn,elcs)
312 eb(ik) = eb(ik) *
dden(ik) / cg(ik)
313 eb2(ik) = eb2(ik) *
dden(ik) / cg(ik)
314 emean = emean + eb(ik)
315 fmean = fmean + eb(ik) /
sig(ik)
317 wnmean = wnmean + eb(ik) *(wn(ik)**
wwnmeanp)
318 emeanws = emeanws+ eb2(ik)
325 eband = eb(nk) /
dden(nk)
326 emean = emean + eband *
fte
327 fmean = fmean + eband *
ftf
330 eband = eb2(nk) /
dden(nk)
331 emeanws = emeanws + eband *
fte
336 fmean =
tpiinv * emean / max( 1.e-7 , fmean )
337 IF (fmean1.LT.1.e-7)
THEN
340 fmean1 =
tpiinv *( max( 1.e-7 , fmean1 ) &
343 wnmean = ( max( 1.e-7 , wnmean ) &
344 / max( 1.e-7 , emean ) )**(1/
wwnmeanp)
345 IF (fmeanws.LT.1.e-7.OR.emeanws.LT.1.e-7)
THEN
348 fmeanws =
tpiinv *( max( 1.e-7 , fmeanws ) &
355 tauw = sqrt(tauwx**2+tauwy**2)
358 CALL w3flx5 (
zzwnd, u, udir, taua, tauadir, dair, &
359 ustar, usdir, z0, cd, charn )
362 unz = max( 0.01 , u )
370 WRITE (
ndst,9060) emean, wnmean,
tpiinv, ustar, cd, z0
378 9060
FORMAT (
' TEST W3SPR4 : E,WN MN :',f8.3,f8.4/ &
379 ' TPIINV, USTAR, CD, Z0 :',f8.3,f7.2,1x,2f9.5)
423 SUBROUTINE w3sin4 (A, CG, K, U, USTAR, DRAT, AS, USDIR, Z0, CD, &
424 TAUWX, TAUWY, TAUWNX, TAUWNY, S, D, LLWS, &
535 REAL,
INTENT(IN) :: A(NSPEC), BRLAMBDA(NSPEC)
536 REAL,
INTENT(IN) :: CG(NK), K(NSPEC),Z0,U, CD
537 REAL,
INTENT(IN) :: USTAR, USDIR, AS, DRAT
538 REAL,
INTENT(OUT) :: S(NSPEC), D(NSPEC), TAUWX, TAUWY, TAUWNX, TAUWNY
539 LOGICAL,
INTENT(OUT) :: LLWS(NSPEC)
540 INTEGER,
INTENT(IN) :: IX, IY
547 INTEGER,
SAVE :: IENT = 0
549 REAL :: FACLN1, FACLN2, LAMBDA
550 REAL :: COSU, SINU, TAUX, TAUY, USDIRP, USTP
551 REAL :: TAUPX, TAUPY, UST2, TAUW, TAUWB
552 REAL ,
PARAMETER :: EPS1 = 0.00001, eps2 = 0.000001
555 REAL :: CM,UCN,ZCN, &
557 EBX, EBY, AORB, AORB1, FW, UORB, TH2, &
558 RE, FU, FUD, SWELLCOEFV, SWELLCOEFT
559 REAL :: PTURB, PVISC, SMOOTH
563 REAL :: CONST, CONST0, CONST2, TAU1, TAU1NT, ZINF, TENSK
565 REAL :: COSWIND, XSTRESS, YSTRESS, TAUHF
567 INTEGER IND,J,I,ISTAB
568 REAL DSTAB(3,NSPEC), DVISC, DTURB
569 REAL STRESSSTAB(3,2),STRESSSTABN(3,2)
571 INTEGER,
PARAMETER :: JTOT=50
572 REAL ,
PARAMETER :: KM=363.,cmm=0.2325
573 REAL :: OMEGACC, OMEGA, ZZ0, ZX, ZBETA, USTR, TAUR, &
574 CONST1, LEVTAIL0, X0, Y, DELY, YC, ZMU, &
575 LEVTAIL, CGTAIL, ALPHAM, FM, ALPHAT, FMEAN
577 REAL,
ALLOCATABLE :: W(:)
585 CALL strace (ient,
'W3SIN4')
589 WRITE (ndst,9000)
bbeta, ustar, usdir*rade
608 z0visc = 0.1*
nu_air/max(ustar,0.0001)
609 z0noz = max(z0visc,
zz0rat*z0)
610 facln1 = u / log(
zzwnd/z0noz)
629 uorb = uorb + eb *
sig(ik)**2 *
dden(ik) / cg(ik)
630 aorb = aorb + eb *
dden(ik) / cg(ik)
634 aorb1 = 2*aorb**(1-0.5*
sswellf(6))
635 re = 4*uorb*aorb1 /
nu_air
667 xi=(alog10(max(aorb/z0noz,3.))-abmin)/delab
669 deli1= min(1. ,xi-float(ind))
681 IF ( isnan(as) )
THEN
685 usigma = max(0.,-0.025*as)
687 ustarsigma=(1.0+u/(10.+u))*usigma
690 WRITE (ndst,9003) as, usigma, ustarsigma, u
696 IF (istab.EQ.1) ust=ustar*(1.-ustarsigma)
697 IF (istab.EQ.2) ust=ustar*(1.+ustarsigma)
699 taux = ust**2* cos(usdir)
700 tauy = ust**2* sin(usdir)
702 WRITE (ndst,9001) istab, taux, tauy, ust
707 stressstab(istab,:)=0.
708 stressstabn(istab,:)=0.
714 ustp=min((taupx**2+taupy**2)**0.25,max(ust,0.3))
715 usdirp=atan2(taupy,taupx)
725 const2=
dden2(is)/cg(ik) &
727 const=
sig2(is)*const0
739 coswind=(
ecos(is)*cosu+
esin(is)*sinu)
740 IF (coswind.GT.0.01)
THEN
753 dstab(istab,is) = const*exp(zlog)*zlog**4*ucn*ucn*coswind**
ssinthp
766 IF (28.*cm*ustar*coswind.GE.1)
THEN
774 IF ((
sswellf(1).NE.0.AND.dstab(istab,is).LT.1e-7*
sig2(is)) &
778 dturb=swellcoeft*(fw*uorb+(fu+fud*coswind)*ustp)
780 dstab(istab,is) = dstab(istab,is) + pturb*dturb + pvisc*dvisc
787 temp2=const2*dstab(istab,is)*a(is)
788 IF (dstab(istab,is).LT.0)
THEN
789 stressstabn(istab,1)=stressstabn(istab,1)+temp2*
ecos(is)
790 stressstabn(istab,2)=stressstabn(istab,2)+temp2*
esin(is)
792 stressstab(istab,1)=stressstab(istab,1)+temp2*
ecos(is)
793 stressstab(istab,2)=stressstab(istab,2)+temp2*
esin(is)
799 xstress=stressstab(3,1)
800 ystress=stressstab(3,2)
801 tauwnx =stressstabn(3,1)
802 tauwny =stressstabn(3,2)
805 d(:)=0.5*(dstab(1,:)+dstab(2,:))
806 xstress=0.5*(stressstab(1,1)+stressstab(2,1))
807 ystress=0.5*(stressstab(1,2)+stressstab(2,2))
808 tauwnx=0.5*(stressstabn(1,1)+stressstabn(2,1))
809 tauwny=0.5*(stressstabn(1,2)+stressstabn(2,2))
812 WRITE (ndst,9002) sum(d), sum(a), xstress, ystress, tauwnx, tauwny
821 dout(ik,ith) = d(ith+(ik-1)*nth)
824 CALL prt2ds (ndst, nk, nk, nth, dout,
sig(1),
' ', 1., &
825 0.0, 0.001,
'Diag Sin',
' ',
'NONAME')
829 CALL outmat (ndst, d, nth, nth, nk,
'diag Sin')
834 ustp=(taupx**2+taupy**2)**0.25
835 usdirp=atan2(taupy,taupx)
849 coswind=(
ecos(is)*cosu+
esin(is)*sinu)
850 temp=temp+a(is)*(max(coswind,0.))**3
853 levtail0= const0*temp
868 omegacc = max(
sig(nk),x0*
grav/ust)
869 yc = omegacc*sqrt(zz0/
grav)
876 dely = (log(
tpi/0.005)-zinf)/real(jtot)
889 y= exp(zinf+real(j-1)*dely)
891 omega = sqrt(
grav*y*tensk)
892 cm = sqrt(
grav*tensk/y)
893 cgtail = 0.5*(3*(y/km)**2+1)*sqrt(
grav/(y*tensk))
896 zarg = min(
kappa/zx,20.)
898 zmu = min(
grav*zz0/cm**2*exp(zarg),1.)
899 zlog = min(alog(zmu),0.)
900 zbeta = const1*zmu*zlog**4
906 alpham=max(0.,0.01*(1.+alog(ustr/cm)))
908 alpham=0.01*(1+3.*alog(ustr/cm))
910 fm=exp(-0.25*(y/km-1)**2)
912 alphat=alpham*(cmm/cm)*fm
913 levtail=levtail0*0.5*(1-tanh((y-20)/5))+
sintailpar(3)*0.5*(1+tanh((y-20)/5))*alphat
920 tau1=tau1+w(j)*zbeta*ustr**2*levtail*dely*cgtail/cm
925 taur=taur-w(j)*
sintailpar(2)*ustr**2*zbeta*levtail*dely*cgtail/cm
926 ustr=sqrt(max(taur,0.))
937 ind = max(1,min(
iustar-1, int(xi)))
938 deli1= max(min(1. ,xi-float(ind)),0.)
941 j = max(1 ,min(
ialpha-1, int(xj)))
942 delj1= max(0.,min(1. , xj-float(j)))
947 delk1= min(1. ,xk-float(i))
950 +(
tauhft2(ind,j+1,i)*deli2+
tauhft2(ind+1,j+1,i)*deli1)*delj1)*delk2 &
952 +(
tauhft2(ind,j+1,i+1)*deli2+
tauhft2(ind+1,j+1,i+1)*deli1)*delj1)*delk1
954 tau1 =(
tauhft(ind,j)*deli2+
tauhft(ind+1,j)*deli1 )*delj2 &
958 tauhf = levtail0*ust**2*tau1
961 tauwx = xstress+tauhf*cos(usdirp)
962 tauwy = ystress+tauhf*sin(usdirp)
967 tauw = sqrt(tauwx**2+tauwy**2)
968 ust2 = max(ustar,eps2)**2
969 tauwb = min(tauw,max(ust2-eps1,eps2**2))
970 IF (tauwb.LT.tauw)
THEN
971 tauwx=tauwx*tauwb/tauw
972 tauwy=tauwy*tauwb/tauw
980 9000
FORMAT (
' TEST W3SIN4 : COMMON FACT.: ',3e10.3)
981 9001
FORMAT (
' TEST W3SIN4 : ISTAB :',i2/ &
985 9002
FORMAT (
' TEST W3SIN4 : SUM(D) :',e12.3/ &
987 ' STRESSX :',e12.3/ &
988 ' STRESSY :',e12.3/ &
991 9003
FORMAT (
' TEST W3SIN4 : AS :',f8.4/ &
993 ' USTARsigma :',e12.3/ &
1011 SUBROUTINE insin4(FLTABS)
1085 LOGICAL,
INTENT(IN) :: FLTABS
1089 INTEGER SDSNTH, ITH, I_INT, J_INT, IK, IK2, ITH2 , IS, IS2
1090 INTEGER IKL, ID, ICON, IKD, IKHS, IKH, TOTO
1092 REAL DIFF1, DIFF2, BINF, BSUP, CGG, PROF
1093 REAL KIK, DHS, KD, KHS, KH, XT, GAM, DKH, PR, W, EPS
1095 REAL,
DIMENSION(:,:) ,
ALLOCATABLE :: SIGTAB
1096 REAL,
DIMENSION(:,:) ,
ALLOCATABLE :: K1, K2
1102 INTEGER,
SAVE :: IENT = 0
1108 CALL strace (ient,
'INSIN4')
1137 DO i_int=ith-sdsnth, ith+sdsnth
1139 IF (i_int.LT.1) j_int=i_int+
nth
1140 IF (i_int.GT.
nth) j_int=i_int-
nth
1175 CALL wavnu2(
sig(ikl), prof, kik, cgg, 1e-7, 15, icon)
1177 k2(ikl,id)=((bsup/binf)**2.)*k1(ikl,id)
1178 sigtab(ikl,id)=sqrt(
grav*k2(ikl,id)*tanh(k2(ikl,id)*id))
1179 IF(sigtab(ikl,id) .LE.
sig(1))
THEN
1182 IF(sigtab(ikl,id) .GT.
sig(
nk))
THEN
1189 IF(
sig(ik)<sigtab(ikl,id) .AND.
sig(ik+1)>=sigtab(ikl,id))
THEN
1190 diff1=sigtab(ikl,id)-
sig(ik)
1191 diff2=
sig(ik+1)-sigtab(ikl,id)
1192 IF (diff1<diff2)
THEN
1215 gam=1.0314*(xt**3)-1.9958*(xt**2)+1.5522*xt+0.1885
1222 pr=(4.*kh/(khs**2.))*exp(-(2*((kh/khs)**2.)))
1224 w=
ssdsabk*(((khs)/(sqrt(2.)*gam*xt))**2.)*(1-exp(-(((kh)/(gam*xt))**
ssdspbk)))
1226 dcki(ikhs, ikd)=
dcki(ikhs, ikd)+pr*w*eps*dkh
1227 qbi(ikhs, ikd) =
qbi(ikhs, ikd) +pr*w* dkh
1232 WHERE (
qbi .GT. 1. )
1251 IF (
ssdsc(3).LT.0.)
THEN
1266 is2=ith2+(ik2-1)*
nth
1267 cumulw(is2,is)=sqrt(c**2+c2**2-2*c*c2*
ecos(1+abs(ith2-ith))) &
1358 INTEGER,
PARAMETER :: NITER=10
1359 REAL ,
PARAMETER :: XM=0.50, eps1=0.00001
1368 REAL ZTAUW,UTOP,CDRAG,WCD,USTOLD,TAUOLD
1369 REAL X,UST,ZZ0,F,DELF,ZZ00
1377 utop = float(j)*
delu
1381 tauold = max(ustold**2, ztauw+eps1)
1388 zz0 = zz00/(1.-x)**xm
1392 delf= 1.-
kappa*utop/(alog(
zzwnd/zz0))**2*2./ust &
1393 *(1.-(xm+1)*x)/(1.-x)
1395 tauold= max(ust**2., ztauw+eps1)
1397 taut(i,j) = sqrt(tauold)
1494 REAL,
intent(in) :: SIGMAX
1510 INTEGER,
SAVE :: IENT = 0
1512 REAL :: USTARM, ALPHAM
1513 REAL :: CONST1, OMEGA, OMEGAC
1514 REAL :: UST, ZZ0,OMEGACC, CM
1515 INTEGER,
PARAMETER :: JTOT=250
1516 REAL,
ALLOCATABLE :: W(:)
1517 REAL :: ZX,ZARG,ZMU,ZLOG,ZZ00,ZBETA
1523 CALL strace (ient,
'TABU_HF')
1543 ust = max(real(k)*
delust,0.000001)
1547 omegacc = max(omegac,x0*
grav/ust)
1548 yc = omegacc*sqrt(zz0/
grav)
1549 dely = max((1.-yc)/real(jtot),0.)
1554 y = yc+real(j-1)*dely
1555 omega = y*sqrt(
grav/zz0)
1560 zarg = min(
kappa/zx,20.)
1561 zmu = min(
grav*zz0/cm**2*exp(zarg),1.)
1562 zlog = min(alog(zmu),0.)
1563 zbeta = const1*zmu*zlog**4
1575 9000
FORMAT (
'TABU_HF, L, K, ALPHA, UST, TAUHFT(K,L) :',(2i4,3f8.3))
1666 REAL,
intent(in) :: SIGMAX
1682 INTEGER,
SAVE :: IENT = 0
1684 REAL :: USTARM, ALPHAM, LEVTAILM
1685 REAL :: CONST1, OMEGA, OMEGAC, LEVTAIL
1686 REAL :: UST, UST0, ZZ0,OMEGACC, CM
1688 INTEGER,
PARAMETER :: JTOT=250
1689 REAL,
ALLOCATABLE :: W(:)
1690 REAL :: ZX,ZARG,ZMU,ZLOG,ZBETA
1692 INTEGER :: I, J, K, L
1693 REAL :: X0, INSIGMAX, INAALPHA, INBBETA, INZZALP, INKAPPA, INGRAV
1694 INTEGER :: INIUSTAR, INIALPHA, INILEVTAIL, IERR
1695 CHARACTER(160) :: FNAMETAB
1697 CHARACTER(LEN=10),
PARAMETER :: VERGRD =
'2018-06-08'
1698 CHARACTER(LEN=35),
PARAMETER :: IDSTR =
'WAVEWATCH III ST4 TABLE FOR STRESS '
1699 CHARACTER(LEN=10) :: VERTST=
' '
1700 CHARACTER(LEN=35) :: IDTST=
' '
1703 CALL strace (ient,
'TABU_HF')
1706 fnametab=
'ST4TABUHF2.bin'
1708 OPEN (993,
file=fnametab,form=
'UNFORMATTED', convert=
file_endian,iostat=ierr,status=
'OLD')
1710 READ(993,iostat=ierr) idtst, vertst, insigmax, inaalpha, inbbeta, iniustar, &
1711 inialpha, inilevtail, inzzalp, inkappa, ingrav
1712 IF (vertst.EQ.vergrd.AND.idtst.EQ.idstr.AND.ierr.EQ.0 &
1713 .AND.insigmax.EQ.sigmax.AND.inaalpha.EQ.
aalpha.AND.inbbeta.EQ.
bbeta)
THEN
1733 WRITE(ndse,*)
'Filling 3D look-up table for SIN4. please wait'
1746 ust0 = max(real(k)*
delust,0.000001)
1750 omegacc = max(omegac,x0*
grav/ust)
1751 yc = omegacc*sqrt(zz0/
grav)
1752 dely = max((1.-yc)/real(jtot),0.)
1763 y = yc+real(j-1)*dely
1764 omega = y*sqrt(
grav/zz0)
1769 zarg = min(
kappa/zx,20.)
1770 zmu = min(
grav*zz0/cm**2*exp(zarg),1.)
1771 zlog = min(alog(zmu),0.)
1772 zbeta = const1*zmu*zlog**4
1776 zarg = min(
kappa/zx,20.)
1777 zmu = min(
grav*zz0/cm**2*exp(zarg),1.)
1778 zlog = min(alog(zmu),0.)
1779 zbeta = const1*zmu*zlog**4
1782 tauw=tauw-w(j)*ust**2*zbeta*levtail/y*dely
1783 ust=sqrt(max(tauw,0.))
1792 OPEN (993,
file=fnametab,form=
'UNFORMATTED', convert=
file_endian,iostat=ierr,status=
'UNKNOWN')
1793 WRITE(993) idstr, vergrd, sigmax,
aalpha,
bbeta,
iustar,
ialpha,
ilevtail,
zzalp,
kappa,
grav
1806 WRITE(ndse,*)
'Reading 3D look-up table for SIN4 from file.'
1808 READ(993,err=2000,iostat=ierr )
tauhft2
1818 9000
FORMAT (
' TEST TABU_HFT2, K, L, I, UST, ALPHA, LEVTAIL, TAUHFT2(K,L,I) :',(3i4,4f10.5))
1838 SUBROUTINE calc_ustar(WINDSPEED,TAUW,USTAR,Z0,CHARN)
1905 REAL,
intent(in) :: WINDSPEED,TAUW
1906 REAL,
intent(out) :: USTAR, Z0, CHARN
1909 REAL :: XI,DELI1,DELI2,XJ,delj1,delj2
1912 REAL :: TAUOLD,CDRAG,WCD,USTOLD,X,UST,ZZ0,ZNU,ZZ00,F,DELF
1914 INTEGER,
PARAMETER :: NITER=10
1915 REAL ,
PARAMETER :: XM=0.50, eps1=0.00001
1927 tauw_local=max(min(tauw,
tauwmax),0.)
1929 ind = min(
itaumax-1, int(xi))
1930 deli1 = min(1.,xi - real(ind))
1933 j = min(
jumax-1, int(xj) )
1934 delj1 = min(1.,xj - real(j))
1936 ustar=(
taut(ind,j)*deli2+
taut(ind+1,j )*deli1)*delj2 &
1937 + (
taut(ind,j+1)*deli2+
taut(ind+1,j+1)*deli1)*delj1
1945 xmin = 0.15 * (
capchnk(3)-chath)
1955 ustold = windspeed*wcd
1956 tauold = max(ustold**2, tauw_local+eps1)
1959 x = max(tauw_local/tauold, xmin)
1961 zz00 = chath*tauold/
grav
1964 zz0 = zz00/(1.-x)**xm
1965 znu = 0.11*
nu_air/max(ust,1e-6)
1968 delf= 1.-
kappa*windspeed/(alog(
zzwnd/zz0))**2*2./ust &
1969 *(1.-(xm+1)*x)/(1.-x)
1971 tauold= max(ust**2., tauw_local+eps1)
1978 IF (ustar.GT.0.001)
THEN
1979 sqrtcdm1 = min(windspeed/ustar,100.0)
1981 charn =
grav*z0/ustar**2
1983 IF (ustar.GT.0)
THEN
1984 sqrtcdm1 = min(windspeed/ustar,100.0)
1987 z0 = chath*0.001*0.001/
grav
1993 charn = min( 0.09 , charn )
1994 IF(charn.LT.chath) charn = chath
2032 SUBROUTINE w3sds4 (A, K, CG, USTAR, USDIR, DEPTH, DAIR, SRHS, &
2033 DDIAG, IX, IY, BRLAMBDA, WHITECAP, DLWMEAN )
2140 INTEGER,
OPTIONAL,
INTENT(IN) :: IX, IY
2141 REAL,
INTENT(IN) :: A(NSPEC), K(NK), CG(NK), &
2142 DEPTH, DAIR, USTAR, USDIR, DLWMEAN
2143 REAL,
INTENT(OUT) :: SRHS(NSPEC), DDIAG(NSPEC), BRLAMBDA(NSPEC)
2144 REAL,
INTENT(OUT) :: WHITECAP(1:4)
2149 INTEGER :: IS, IS2, IS0, IKL, IKC, ID, NKL
2151 INTEGER,
SAVE :: IENT = 0
2153 INTEGER :: IK, IK1, ITH, IK2, JTH, ITH2, &
2154 IKHS, IKD, SDSNTH, IT, IKM, NKM
2155 INTEGER :: NSMOOTH(NK)
2156 REAL :: C, C2, CUMULWISO, COSWIND, ASUM, SDIAGISO
2157 REAL :: COEF1, COEF2, COEF4(NK), &
2160 REAL :: FACTURB, FACTURB2, DTURB, DVISC, DIAG2, BREAKFRACTION
2161 REAL :: RENEWALFREQ, EPSR
2162 REAL :: S1(NK), E1(NK)
2163 INTEGER :: NTIMES(NK)
2165 REAL :: DK(NK), HS(NK), KBAR(NK), DCK(NK)
2167 INTEGER :: IKSUP(NK)
2168 REAL :: FACSAT, DKHS, FACSTRAINB, FACSTRAINL
2171 REAL :: MSSSUM(NK,5), FACHF
2173 REAL :: MSSPCS, MSSPC2, MSSPS2, MSSP, MSSD, MSSTH
2174 REAL :: MICHE, X, KLOC
2176 REAL :: DOUT(NK,NTH)
2178 REAL :: QB(NK), S2(NK)
2179 REAL :: TSTR, TMAX, DT, T, MFT, DIRFORCUM
2180 REAL :: PB(NSPEC), PB2(NSPEC), BRM12(NK), BTOVER
2181 REAL :: KO, LMODULATION(NTH)
2186 CALL strace (ient,
'W3SDS4')
2198 dk=0.; hs=0.; kbar=0.; dck=0.; efdf=0.
2199 bth0=0.; bth=0.; ddiag=0.; srhs=0.; pb=0.
2204 qb=0.; s2=0.;pb=0.; pb2=0.
2209 facturb=ssdsc(5)*ustar**2/
grav*dair/
dwat
2220 IF (ssdsc(8).GT.0.OR.ssdsc(11).GT.0.OR.ssdsc(18).GT.0)
THEN
2231 msslong = k(ik)**ssdsc(20) * a(is) * dden(ik) / cg(ik)
2232 msspc2 = msspc2 +msslong*ec2(ith)
2233 mssps2 = mssps2 +msslong*es2(ith)
2234 msspcs = msspcs +msslong*esc(ith)
2235 mssp = mssp +msslong
2237 msssum(ik:nk,1) = msssum(ik:nk,1) +mssp
2238 msssum(ik:nk,3) = msssum(ik:nk,3) +msspc2
2239 msssum(ik:nk,4) = msssum(ik:nk,4) +mssps2
2240 msssum(ik:nk,5) = msssum(ik:nk,5) +msspcs
2244 mssd=0.5*(atan2(2*msssum(ik,5),msssum(ik,3)-msssum(ik,4)))
2245 IF (mssd.LT.0) mssd = mssd +
pi
2253 SELECT CASE (nint(ssdsc(1)))
2266 facsat=sig(ik)*k(ik)**3*dth
2269 asum = sum(a(is0+1:is0+nth))
2270 bth0(ik)=asum*facsat
2272 IF (ssdsdth.GE.180)
THEN
2273 bth(is0+1:is0+nth)=bth0(ik)
2277 bth(is)=dot_product(satweights(:,ith), a(is0+satindices(:,ith)) ) &
2281 bth0(ik)=maxval(bth(is0+1:is0+nth))
2292 IF (ssdsbm(0).EQ.1)
THEN
2295 x=tanh(min(k(ik)*depth,10.))
2297 miche=(x*(ssdsbm(1)+x*(ssdsbm(2)+x*(ssdsbm(3)+x*ssdsbm(4)))))**2
2299 coef1=(ssdsbr*miche)
2303 sdiagiso = ssdsc(2) * sig(ik)*ssdsc(6)*(max(0.,bth0(ik)/coef1-1.))**2
2307 coef2=ssdsc(2) * sig(ik)*(1-ssdsc(6))/(coef1*coef1)
2308 ddiag((ik-1)*nth+1:ik*nth) = sdiagiso + &
2309 coef2*((max(0.,bth((ik-1)*nth+1:ik*nth)-coef1))**ssdsp)
2314 pb = (max(sqrt(bth)-epsr,0.))**2
2324 brlambda = pb / (2.*
pi**2.)
2344 e1(ik)=e1(ik)+(a(is)*sig(ik))*dth
2346 dk(ik)=dden(ik)/(dth*sig(ik)*cg(ik))
2351 id=min(nint(depth),ndtab)
2354 ELSE IF(id > ndtab)
THEN
2365 iksup(ikl)=iktab(ikl,id)
2366 IF (iksup(ikl) .LE. nk)
THEN
2367 efdf(ikl) = dot_product(e1(ikl:iksup(ikl)-1),dk(ikl:iksup(ikl)-1))
2368 IF (efdf(ikl) .NE. 0)
THEN
2369 kbar(ikl) = dot_product(k(ikl:iksup(ikl)-1)*e1(ikl:iksup(ikl)-1), &
2370 dk(ikl:iksup(ikl)-1)) / efdf(ikl)
2375 hs(ikl) = 4*sqrt(efdf(ikl))
2386 IF (hs(ikl) .NE. 0. .AND. kbar(ikl) .NE. 0.)
THEN
2390 ikhs= 1+anint(kbar(ikl)*hs(ikl)/dkhs)
2393 ELSE IF (ikd < 1)
THEN
2396 IF (ikhs > nkhs)
THEN
2398 ELSE IF (ikhs < 1)
THEN
2401 xt = tanh(kbar(ikl)*depth)
2405 gam=1.0314*(xt**3)-1.9958*(xt**2)+1.5522*xt+0.1885
2410 dck(ikl)=((kbar(ikl)**(-2.5))*(kbar(ikl)/(2*
pi)))*dcki(ikhs,ikd)
2414 qb(ikl) = qbi(ikhs,ikd)
2427 IF (efdf(ikl) .GT. 0.)
THEN
2428 s1(ikl:iksup(ikl)) = s1(ikl:iksup(ikl)) + &
2429 dck(ikl)*e1(ikl:iksup(ikl)) / efdf(ikl)
2430 s2(ikl:iksup(ikl)) = s2(ikl:iksup(ikl)) + &
2431 qb(ikl) *e1(ikl:iksup(ikl)) / efdf(ikl)
2432 ntimes(ikl:iksup(ikl)) = ntimes(ikl:iksup(ikl)) + 1
2438 WHERE (ntimes .GT. 0)
2446 s1(1:nk) = s1(1:nk) / sig(1:nk)
2452 asum = (sum(a(((ik-1)*nth+1):(ik*nth)))*dth)
2453 IF (asum.GT.1.e-8)
THEN
2454 FORALL (is=1+(ik-1)*nth:ik*nth) ddiag(is) = s1(ik)/asum
2455 FORALL (is=1+(ik-1)*nth:ik*nth) pb2(is) = s2(ik)/asum
2457 FORALL (is=1+(ik-1)*nth:ik*nth) ddiag(is) = 0.
2458 FORALL (is=1+(ik-1)*nth:ik*nth) pb2(is) = 0.
2460 IF (pb2(1+(ik-1)*nth).GT.0.001)
THEN
2461 bth0(ik) = 2.*ssdsbr
2467 pb = (1-ssdsc(1))*pb2*a + ssdsc(1)*pb
2470 brlambda = pb / (2.*
pi**2.)
2479 ko=(
grav/(1e-6+ustar**2))/(28./ssdsc(16))**2
2482 kloc=k(ik)**(2-ssdsc(20))
2483 bth(1:nth)=max(a(is0+1:is0+nth)*sig(ik)*k(ik)**3,.00000000000001)
2486 IF (ssdsc(11).GT.0) dirforcum=msssum(ik,2)
2489 bth0(ik)=sum(bth(1:nth)*dth)
2490 IF (ssdsc(18).GT.0)
THEN
2492 facstrainl=1.+ssdsc(18)*((msssum(ik,1)*kloc)**ssdsc(14) * &
2493 (ecos(ith)*cos(dirforcum)+esin(ith)*sin(dirforcum))**2)
2494 lmodulation(ith)= facstrainl**ssdsc(19)
2501 brlambda(is0+1:is0+nth)=ssdsc(9)*exp(-ssdsbr/bth(1:nth)) &
2502 *( 1.0+ssdsc(13)*max(1.,(k(ik)/ko))**ssdsc(15) ) &
2503 /(ssdsc(13)+1)*lmodulation(1:nth)
2505 btover = sqrt(bth0(ik))-sqrt(ssdsbt)
2506 brm12(ik)=ssdsc(2)*(max(0.,btover))**(2.5)/sig(ik)
2508 brlambda(is0+1:is0+nth)= max(0.,sign(brlambda(is0+1:is0+nth),btover))
2510 srhs(is0+1:is0+nth)= brm12(ik)/
grav**2*brlambda(is0+1:is0+nth)*c**5
2512 ddiag(is0+1:is0+nth) = srhs(is0+1:is0+nth)*ssdsbr/max(1.e-20,bth(1:nth))/max(1e-20,a(is0+1:is0+nth))
2528 IF ( (ssdsc(3).NE.0.) .OR. (ssdsc(5).NE.0.) .OR. (ssdsc(21).NE.0.) )
THEN
2531 facturb2=-2.*sig(ik)*k(ik)*facturb
2532 dvisc=-4.*ssdsc(21)*k(ik)*k(ik)
2535 IF (ssdsc(3).GT.0 .AND. ik.GT.
dikcumul)
THEN
2538 c2 = sig(ik2)/k(ik2)
2540 cumulwiso=abs(c2-c)*dsip(ik2)/(0.5*c2) * dth
2541 renewalfreq=renewalfreq-cumulwiso*sum(brlambda(is2+1:is2+nth))
2550 IF (ssdsc(3).LT.0 .AND. ik.GT.
dikcumul)
THEN
2554 IF (bth0(ik2).GT.ssdsbr)
THEN
2556 renewalfreq=renewalfreq+dot_product(cumulw(is2+1:is2+nth,is),brlambda(is2+1:is2+nth))
2563 coswind=(ecos(ith)*cos(usdir)+esin(ith)*sin(usdir))
2564 dturb=facturb2*max(0.,coswind)
2568 diag2 = (ssdsc(3)*renewalfreq+dturb+dvisc)
2569 ddiag(is) = ddiag(is) + diag2
2570 srhs(is) = srhs(is) + a(is)* diag2
2577 IF ( .NOT. (flogrd(5,7).OR.flogrd(5,8) ) )
THEN
2586 DO ik=1,min(floor(aaircmin),nk)
2589 coef4(ik) = c*c*sum(brlambda(is0+1:is0+nth)) &
2590 *2.*
pi/
grav*ssdsc(7) * dden(ik)/(sig(ik)*cg(ik))
2591 coef5(ik) = c**3*sum(brlambda(is0+1:is0+nth) &
2593 *aairgb/
grav * dden(ik)/(sig(ik)*cg(ik))
2599 DO ik=min(floor(aaircmin),nk),nk
2605 IF ( flogrd(5,7) )
THEN
2609 DO ik=ik1,min(floor(aaircmin),nk)
2610 whitecap(1) = whitecap(1) + coef4(ik) * (1-whitecap(1))
2611 whitecap(4) = whitecap(4) + coef5(ik)
2615 IF ( flogrd(5,8) )
THEN
2622 tstr = 0.8 * 2*
pi/sig(ik)
2624 tmax = 5. * 2*
pi/sig(ik)
2631 IF ( t .LT. tstr )
THEN
2632 mft = mft + 0.4 / (k(ik)*tstr) * t * dt
2634 mft = mft + 0.4 / k(ik) * exp(-1*(t-tstr)/3.8) * dt
2641 whitecap(2) = whitecap(2) + coef4(ik) * mft