93 INTEGER,
PARAMETER,
PRIVATE :: NRSIGA = 400
94 INTEGER,
PARAMETER,
PRIVATE :: NRDRAG = 20
95 REAL,
PARAMETER,
PRIVATE :: SIGAMX = 40.
96 REAL,
PARAMETER,
PRIVATE :: DRAGMX = 1.e-2
98 REAL,
PRIVATE :: DSIGA, DDRAG, &
99 BETATB(-NRSIGA:NRSIGA+1,NRDRAG+1)
125 SUBROUTINE w3spr2 (A, CG, WN, DEPTH, FPI, U, USTAR, &
126 EMEAN, FMEAN, WNMEAN, AMAX, ALFA, FP )
220 REAL,
INTENT(IN) :: A(NTH,NK), CG(NK), WN(NK), DEPTH, &
222 REAL,
INTENT(OUT) :: EMEAN, FMEAN, WNMEAN, AMAX, &
228 INTEGER :: IK, ITH, I1, ITT
230 INTEGER,
SAVE :: IENT = 0
232 REAL :: EBAND, FPISTR, EB(NK), UST
237 CALL strace (ient,
'W3SPR2')
240 ust = max( 0.0001 , ustar )
252 eb(ik) = eb(ik) + a(ith,ik)
253 amax = max( amax , a(ith,ik) )
260 alfa(ik) = 2. *
dth *
sig(ik) * eb(ik) * wn(ik)**3
261 eb(ik) = eb(ik) *
dden(ik) / cg(ik)
262 emean = emean + eb(ik)
263 fmean = fmean + eb(ik) /
sig(ik)
264 wnmean = wnmean + eb(ik) / sqrt(wn(ik))
270 eband = eb(nk) /
dden(nk)
271 emean = emean + eband *
fte
272 fmean = fmean + eband *
ftf
273 wnmean = wnmean + eband *
ftwn
275 fmean =
tpiinv * emean / max( 1.e-7 , fmean )
276 wnmean = ( emean / max( 1.e-7 , wnmean ) )**2
280 fpistr = max( 0.008 , fpi * ust /
grav )
281 fp = ( 3.6e-4 + 0.92*fpistr - 6.3e-10/fpistr**3 )/ust*
grav
308 SUBROUTINE w3sin2 ( A, CG, K, U, UDIR, CD, Z0, FPI, S, D )
409 REAL,
INTENT(IN) :: A(NSPEC), CG(NK), K(NSPEC), U, UDIR, &
411 REAL,
INTENT(OUT) :: S(NSPEC), D(NSPEC), FPI
416 INTEGER :: IS, IK, IOMA, ICL, NKFILT, NKFIL2
418 INTEGER,
SAVE :: IENT = 0
423 REAL :: COSU, SINU, COSFAC, LAMBDA, ULAM, &
424 CLAM, OMA, M0, M1, RD1, RD2, BETA, &
425 FACLN1, FACLN2, USTAR, TRANS, FPISTR,&
426 FP1STR, FP1, SIN1A(NK)
427 REAL,
PARAMETER :: TRANSF = 0.75
428 REAL,
PARAMETER :: PEAKFC = 0.8
436 CALL strace (ient,
'W3SIN2')
440 WRITE (
ndst,9000) dsiga, ddrag, u, udir*
rade, cd, z0
454 facln1 = u / log(
zwind/z0)
458 cosfac =
ecos(is)*cosu +
esin(is)*sinu
459 cosfac = sign( max( 0.0087 , abs(cosfac) ) , cosfac )
460 lambda =
tpi / ( k(is) * abs(cosfac) )
461 ulam = facln1 * ( log(lambda) - facln2 )
462 clam = cd * ( u / ulam )**2
463 oma = k(is) * ulam * cosfac /
sig2(is)
464 ioma = int( oma/dsiga ) + &
465 min( 0 , int( sign( -1.1 , oma ) ) )
466 icl = int( clam/ddrag )
467 rd1 = oma/dsiga - real(ioma)
468 rd2 = clam/ddrag - real(icl)
469 ioma = max( -nrsiga , min( nrsiga , ioma ) )
470 icl = max( 1 , min( nrdrag , icl ) )
471 beta = (1.-rd1) * (1.-rd2) * betatb( ioma , icl ) &
472 + rd1 * (1.-rd2) * betatb(ioma+1, icl ) &
473 + (1.-rd1) * rd2 * betatb( ioma ,icl+1) &
474 + rd1 * rd2 * betatb(ioma+1,icl+1)
475 d(is) = beta *
sig2(is)
476 s(is) = a(is) * d(is)
478 WRITE (
ndst,9021) is, cosfac, lambda, ulam, clam*1.e3, &
487 DO is=(ik-1)*nth+1, ik*nth
488 sin1a(ik) = sin1a(ik) + max( 0. , s(is) )
495 sin1a(ik) = sin1a(ik) *
dden(ik) / ( cg(ik) *
sig(ik)**3 )
497 m1 = m1 + sin1a(ik)/
sig(ik)
500 sin1a(nk) = sin1a(nk) /
dden(nk)
501 m0 = m0 + sin1a(nk) *
fte
502 m1 = m1 + sin1a(nk) *
fttr
503 IF ( m1 .LT. 1e-20 )
THEN
513 fp1str = 3.6e-4 + 0.92*fpistr - 6.3e-10/fpistr**3
514 fp1 = peakfc * fp1str *
grav / ustar
518 nkfil2 = max( 0 , nkfil2 )
521 d(is) = max( d(is) ,
fswell*d(is) )
522 s(is) = a(is) * d(is)
525 DO ik=nkfil2+1, nkfilt
526 trans = (
sig(ik)/fp1 - transf ) / (1.-transf)
527 DO is=(ik-1)*nth+1, ik*nth
528 d(is) = (1.-trans)*max(d(is),
fswell*d(is)) + trans*d(is)
529 s(is) = a(is) * d(is)
538 dout(ik,ith) = d(ith+(ik-1)*nth)
541 CALL prt2ds (
ndst, nk, nk, nth, dout,
sig(1:),
' ', 1., &
542 0.0, 0.001,
'Diag Sin',
' ',
'NONAME')
546 CALL outmat (
ndst, d, nth, nth, nk,
'diag Sin')
554 9000
FORMAT (
' TEST W3SIN2 : DSIGA,DDRAG,U,UDIR,CD,Z0(IN) : '/ &
555 ' ',f8.4,f9.6,f7.2,f6.1,f8.5,f8.5)
559 9020
FORMAT (
' TEST W3SIN2 : IS, COS, LAMBDA, ULAM, CLAM*1E3, ', &
561 9021
FORMAT (6x,i6,f7.2,1x,f6.1,2(1x,f5.2),2(1x,f6.2))
582 SUBROUTINE w3sds2 (A, CG, K, FPI, USTAR, ALFA, S, D)
677 REAL,
INTENT(IN) :: A(NTH,NK), CG(NK), K(NK), FPI, &
679 REAL,
INTENT(OUT) :: S(NTH,NK), D(NTH,NK)
684 INTEGER :: IK, ITH, IKHW
686 INTEGER,
SAVE :: IENT = 0
688 REAL :: FHW, XHW, FPIT, PHI, AF1, AF2, &
689 AFILT, BFILT, CDIST, FILT, POW, &
690 CDISH, CDISP, HW, EHIGH, EBD(NK)
701 CALL strace (ient,
'W3SDS2')
705 WRITE (
ndst,9000) fpi, ustar
713 ikhw = min( nk , int( xhw + 0.5 ) )
717 ebd(ik) = ebd(ik) + a(ith,ik)
721 IF ( fhw .LT.
sig(nk+1) )
THEN
722 xhw = 1. - mod( xhw + 0.5 , 1. )
723 IF ( ikhw .EQ. nk ) xhw = max( 0. , xhw - 0.5 )
724 hw = xhw * ebd(ikhw)*
dden(ikhw)/cg(ikhw)
726 hw = hw + ebd(ik)*
dden(ik)/cg(ik)
728 hw = 4. * sqrt( hw + ebd(nk)/cg(nk)*
fte )
730 ehigh = ebd(nk)/cg(nk) *
sig(nk)*
dth * (
sig(nk)/fhw)**5
731 hw = 4. * sqrt( 0.25 * fhw * ehigh )
743 bfilt = 1. / ( af2 - af1 )
744 afilt = - bfilt * af1
748 cdist = - 2. * ustar * hw * phi
761 filt = min( 1., max( 0. , afilt + bfilt*
sig(ik) ))
763 IF ( filt .GT. 0. )
THEN
764 d(1,ik) = (1.-filt) * cdist * k(ik)**2 &
765 - filt *
cdsa0 * cdish *
sig(ik)**3 &
768 d(1,ik) = (1.-filt) * cdist * k(ik)**2
771 powmax = max(pow*filt,powmax)
774 WRITE (
ndst,9021) ik, filt, alfa(ik)/
sdsaln, &
775 cdist*phi*k(ik)**2,
cdsa0*cdish*
sig(ik)**3 &
776 * (alfa(ik)/
sdsaln)**pow, d(1,ik)
781 WRITE (
ndst,9010) af1, af2, afilt, bfilt, powmax
799 dout(ik,ith) = d(ith,ik)
802 CALL prt2ds (
ndst, nk, nk, nth, dout,
sig(1:),
' ', 1., &
803 0.0, 0.001,
'Diag Sds',
' ',
'NONAME')
807 CALL outmat (
ndst, d, nth, nth, nk,
'diag Sds')
815 9000
FORMAT (
' TEST W3SDS2 : FPI, USTAR : ',2f8.3)
816 9010
FORMAT (
' TEST W3SDS2 : AF1-2, A-BFILT, PMAX : ',4f7.3,e10.3)
819 9020
FORMAT (
' TEST W3SDS2 : IK, FILT, ALFA, DDST, DDSH, DDS')
820 9021
FORMAT (
' ',i6,2f7.3,3e11.3)
931 INTEGER :: ISIGA, IDRAG
933 INTEGER,
SAVE :: IENT = 0
946 REAL :: ENORM, ERR(NRDRAG)
952 CALL strace (ient,
'INPTAB')
958 dsiga = sigamx / real(nrsiga)
959 ddrag = dragmx / real(nrdrag)
962 WRITE (
ndst,9000) sigamx, dsiga, dragmx, ddrag
967 DO isiga=-nrsiga,nrsiga+1
968 siga = real(isiga) * dsiga
970 drag = real(idrag) * ddrag
971 betatb(isiga,idrag) =
w3beta( siga, drag ,
ndst )
980 DO isiga=-nrsiga,nrsiga
981 siga = real(isiga) * dsiga
985 bmin = min( bmin , betatb(isiga,idrag) )
986 bmax = max( bmax , betatb(isiga,idrag) )
988 bmax = max( bmax , -bmin )
989 WRITE (
ndst,9011) isiga, siga, bmax, &
990 (nint(betatb(isiga,idrag)/bmax*100.),idrag=1,i1)
991 IF (i1.LT.nrdrag)
WRITE (
ndst,9012) &
992 (nint(betatb(isiga,idrag)/bmax*100.),idrag=i1+1,nrdrag)
998 ie1 = min(30,nrdrag-1)
999 enorm = 1000. / abs(betatb(0,nrdrag))
1000 DO isiga=-nrsiga,nrsiga
1001 siga = real(isiga) * dsiga
1002 IF ( abs(siga) .LT. 5.01 )
THEN
1003 DO idrag=1, nrdrag-1
1004 drag = ( real(idrag) + 0.5 ) * ddrag
1005 err(idrag) = -
w3beta(siga,drag,
ndst) + 0.5 * &
1006 ( betatb(isiga,idrag) + betatb(isiga,idrag+1) )
1008 WRITE (
ndst,9021) isiga, siga, &
1009 (nint(enorm*err(idrag)),idrag=1,ie1)
1010 IF (ie1.LT.nrdrag-1)
WRITE (
ndst,9022) &
1011 (nint(enorm*err(idrag)),idrag=ie1+1,nrdrag-1)
1016 ie1 = min(30,nrdrag)
1017 enorm = 1000. / abs(betatb(0,nrdrag))
1018 DO isiga=-nrsiga,nrsiga-1
1019 siga = ( real(isiga) + 0.5 ) * dsiga
1020 IF ( abs(siga) .LT. 5.01 )
THEN
1022 drag = real(idrag) * ddrag
1023 err(idrag) = -
w3beta(siga,drag,
ndst) + 0.5 * &
1024 ( betatb(isiga,idrag) + betatb(isiga+1,idrag) )
1026 WRITE (
ndst,9031) isiga, siga, &
1027 (nint(enorm*err(idrag)),idrag=1,ie1)
1028 IF (ie1.LT.nrdrag)
WRITE (
ndst,9032) &
1029 (nint(enorm*err(idrag)),idrag=ie1+1,nrdrag)
1039 9000
FORMAT (
' TEST INPTAB : SIGAMX, DSIGA : ',f6.2,f8.2/ &
1040 ' DRAGMX, DDRAG : ',f8.4,f9.5)
1044 9010
FORMAT (/
' TEST INPTAB : TABLE, NORMALIZED WITH ', &
1045 'BETATB(ISIGA,NRDRAG)'/ &
1046 ' ISIGA, SIGA, BETA_MAX, TABLE (x100)')
1047 9011
FORMAT (1x,i4,f7.2,f6.4,1x,35i3)
1048 9012
FORMAT (19x,35i3)
1052 9020
FORMAT (/
' TEST INPTAB : ERROR DUE TO DRAG, NORMALIZED ', &
1053 'WITH BETATB(ISIGA,NRDRAG)'/ &
1054 ' ISIGA, SIGA, TABLE (x1000)')
1055 9021
FORMAT (1x,i4,f7.2,35i3)
1056 9022
FORMAT (12x,35i3)
1057 9030
FORMAT (/
' TEST INPTAB : ERROR DUE TO SIGA, NORMALIZED WITH ', &
1058 'BETATB(ISIGA,NRDRAG)'/ &
1059 ' ISIGA, SIGA, TABLE (x1000)')
1060 9031
FORMAT (1x,i4,f7.2,35i3)
1061 9032
FORMAT (12x,35i3)
1081 REAL FUNCTION W3BETA ( OMA , CL , NDST )
1142 INTEGER,
INTENT(IN) :: ndst
1143 REAL,
INTENT(IN) :: oma, cl
1149 INTEGER,
SAVE :: ient = 0
1151 REAL :: om1, om2, a0, a1, a2, a3, a4, a5, &
1157 CALL strace (ient,
'W3BETA')
1161 WRITE (ndst,9000) oma, cl
1166 om1 = 1.075 + 75.*cl
1175 a10 = -0.06 + 470.*cl
1178 a0 = 0.25 * a5**2 / a4
1179 a3 = (a0-a2-a1) / (a0+a4+a5)
1181 a7 = (a9*(om2-1)**2+a10) / (om2-om1)
1185 WRITE (ndst,9001) om1, om2
1186 WRITE (ndst,9002) a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10
1191 IF ( oma .LT. -1. )
THEN
1192 w3beta = -a1 * oma**2 - a2
1193 ELSE IF (oma .LT. om1/2.)
THEN
1194 w3beta = a3 * oma * ( a4 * oma - a5 ) - a6
1195 ELSE IF (oma .LT. om1)
THEN
1196 w3beta = oma * ( a4 * oma - a5 )
1197 ELSE IF (oma .LT. om2)
THEN
1198 w3beta = a7 * oma - a8
1200 w3beta = a9 * (oma-1.)**2 + a10
1205 w3beta = w3beta * 1.e-4
1207 WRITE (ndst,9003) w3beta
1215 9000
FORMAT (
' TEST W3BETA : INPUT : ',2e10.3)
1216 9001
FORMAT (
' TEST W3BETA : OM1-2 : ',2e10.3)
1217 9002
FORMAT (
' TEST W3BETA : A0-10 : ',5e10.3/ &
1219 9003
FORMAT (
' TEST W3BETA : BETA : ',e10.3)