97 INTEGER,
PRIVATE,
PARAMETER :: NKD = 100
98 REAL,
PRIVATE,
PARAMETER :: KDMIN = 0.25 , kdmax = 10.
99 REAL,
PRIVATE :: SITMIN, XSIT
101 REAL,
PARAMETER :: abmax = 0.25
131 SUBROUTINE w3snls ( A, CG, WN, DEPTH, UABS, DT, SNL, AA )
227 REAL,
INTENT(IN) :: A(NTH,NFR), CG(NFR), WN(NFR), &
229 REAL,
INTENT(OUT),
OPTIONAL :: SNL(NTH,NFR), AA(NTH,NFR)
234 INTEGER :: IFR, IFRMIN, ITH, IFRMN2, &
235 IKD, JKD(0:NFR+2), ISPX0, ISPX
237 INTEGER,
SAVE :: IENT = 0
239 REAL :: SIGP, CP, CM, XL, XH, EL, EH, DENOM, &
240 SIT, XSITLN, MC, F3A, F3B, F3C, &
241 F4A, F4B, F4C, F00, F31, F32, F41, &
242 F42, AUXB, AUX11, AUX21, AUX12, &
243 AUX22, FC1, FC2, FC3, FC4
244 REAL :: XSI(NFR+2), XWN(NFR+2), XCG(NFR+2), &
245 UP(NSPL:NSPH), UN(NSPL:NSPH), &
246 E1(0:NFR+2), FILTFP(NFR+2), &
247 FPROP(NFR+2), DS1(NSPL:NSPH), &
248 DS2(NSPL:NSPH), DS3(NSPL:NSPH), &
249 DA1(NSPL:NSPH), DA2(NSPL:NSPH), &
255 CALL strace (ient,
'W3SNLS')
259 WRITE (
ndst,9000) depth, uabs, dt
265 xsi(1:nfr) =
sig(1:nfr)
269 xsi(nfr+1) = xsi(nfr) *
xfr
270 CALL wavnu1 ( xsi(nfr+1), depth, xwn(nfr+1), xcg(nfr+1) )
271 xsi(nfr+2) = xsi(nfr+1) *
xfr
272 CALL wavnu1 ( xsi(nfr+2), depth, xwn(nfr+2), xcg(nfr+2) )
289 IF ( uabs .LT. xsi(nfr)/xwn(nfr) )
THEN
290 sigp =
grav / max( 0.01 , uabs )
295 e1(nfr+2) = sum(a(:,nfr)) *
fachfa**2 * xsi(nfr+2) &
297 e1(nfr+1) = sum(a(:,nfr)) *
fachfa * xsi(nfr+1) &
301 e1(ifr) = sum(a(:,ifr)) * xsi(ifr) / xcg(ifr) *
tpi *
dth
305 IF ( uabs .LT. xsi(ifr)/xwn(ifr) )
THEN
306 cp = xsi(ifr)/xwn(ifr)
307 cm = xsi(ifr+1)/xwn(ifr+1)
308 sigp = xsi( ifr ) * (uabs-cm)/(cp-cm) + &
309 xsi(ifr+1) * (cp-uabs)/(cp-cm)
312 ELSE IF ( e1(ifr) .LT. e1(ifr+1) )
THEN
316 el = e1(ifr ) - e1(ifr+1)
317 eh = e1(ifr+2) - e1(ifr+1)
318 denom = xl*eh - xh*el
319 sigp = xsi(ifr+1) * (1.+0.5*(xl**2*eh-xh**2*el) &
320 / sign( max(abs(denom),1.e-15) , denom ) )
330 IF ( sigp .LT. 0. )
THEN
334 IF ( e1(1) .EQ. 0. )
THEN
358 fprop(ifr) = filtfp(ifr) *
cnlsc * xwn(ifr)**8 * &
359 xsi(ifr)**4 /
tpi**9 / xcg(ifr)
360 sit = xsi(ifr) * sqrt(depth/
grav)
361 ikd = 1 + nint( ( log(sit) - log(sitmin) ) / xsitln )
362 jkd(ifr) = max( 1 , min(ikd,nkd) )
364 IF ( filtfp(ifr) .LT. 1.e-10 )
THEN
371 ifrmn2 = max( 1 , ifrmin - 1 )
372 sit = xsi(ifrmn2) * sqrt(depth/
grav)
373 ikd = 1 + nint( ( log(sit) - log(sitmin) ) / xsitln )
374 jkd(ifrmn2) = max( 1 , min(ikd,nkd) )
382 WRITE (
ndst,9012) ifr, xsi(ifr)/
tpi, xsi(ifr)/xwn(ifr), &
413 f31 = up(ispx)*f3a + up(ispx+1)*f3b + up(ispx+
nthx)*f3c
414 f41 = up(ispx)*f4a + up(ispx-1)*f4b + up(ispx-
nthx)*f4c
415 f32 = up(ispx)*f3a + up(ispx-1)*f3b + up(ispx+
nthx)*f3c
416 f42 = up(ispx)*f4a + up(ispx+1)*f4b + up(ispx-
nthx)*f4c
418 ds1(ispx) = fprop(ifr) * (f00**2*(f31+f41)-2.*f00*f31*f41)
419 ds2(ispx) = fprop(ifr) * (f00**2*(f32+f42)-2.*f00*f32*f42)
421 aux11 = dt * ds1(ispx)
422 aux21 = dt * ds2(ispx)
423 auxb =
cnlsfm * filtfp(ifr) * max(1.e-10,un(ispx)) / &
424 max( 1.e-10 , abs(aux11)+abs(aux21) ) / mc
425 aux12 = auxb * abs(aux11)
426 aux22 = auxb * abs(aux21)
435 da1(ispx) = max( -aux12 , min( aux11 , aux12 ) )
436 da2(ispx) = max( -aux22 , min( aux21 , aux22 ) )
451 IF (
PRESENT(snl) )
THEN
453 WRITE (
ndst,9030)
'YES/--'
458 snl(:,1:ifrmn2-1) = 0.
460 ds1(nspl:ifrmn2*
nthx-1) = 0.
461 ds2(nspl:ifrmn2*
nthx-1) = 0.
462 ds3(nspl:ifrmn2*
nthx-1) = 0.
465 ds1(ispx+nth+1:nsph:
nthx) = ds1(ispx+ 1 :nsph:
nthx)
466 ds1(ispx :nsph:
nthx) = ds1(ispx+nth:nsph:
nthx)
467 ds2(ispx+nth+1:nsph:
nthx) = ds2(ispx+ 1 :nsph:
nthx)
468 ds2(ispx :nsph:
nthx) = ds2(ispx+nth:nsph:
nthx)
469 ds3(ifrmn2*
nthx:nsph) = ds1(ifrmn2*
nthx:nsph) + &
470 ds2(ifrmn2*
nthx:nsph)
488 snl(ith,ifr) = fc1 * ds3( ispx ) &
489 + fc2 * ( ds3(ispx-
nthx) + ds3(ispx+
nthx) ) &
490 + fc3 * ( ds1(ispx- 1 ) + ds2(ispx+ 1 ) ) &
491 + fc4 * ( ds1(ispx+ 1 ) + ds2(ispx- 1 ) )
503 WRITE (
ndst,9030)
'---/NO'
510 IF (
PRESENT(aa) )
THEN
512 WRITE (
ndst,9040)
'YES/--'
517 aa(:,1:ifrmn2-1) = a(:,1:ifrmn2-1)
519 da1(nspl:ifrmn2*
nthx-1) = 0.
520 da2(nspl:ifrmn2*
nthx-1) = 0.
521 da3(nspl:ifrmn2*
nthx-1) = 0.
524 da1(ispx+nth+1:nsph:
nthx) = da1(ispx+ 1 :nsph:
nthx)
525 da1(ispx :nsph:
nthx) = da1(ispx+nth:nsph:
nthx)
526 da2(ispx+nth+1:nsph:
nthx) = da2(ispx+ 1 :nsph:
nthx)
527 da2(ispx :nsph:
nthx) = da2(ispx+nth:nsph:
nthx)
528 da3(ifrmn2*
nthx:nsph) = da1(ifrmn2*
nthx:nsph) + &
529 da2(ifrmn2*
nthx:nsph)
547 aa(ith,ifr) = max( 0. , a(ith,ifr) + &
549 + fc2 * ( da3(ispx-
nthx) + da3(ispx+
nthx) ) &
550 + fc3 * ( da1(ispx- 1 ) + da2(ispx+ 1 ) ) &
551 + fc4 * ( da1(ispx+ 1 ) + da2(ispx- 1 ) ) )
562 WRITE (
ndst,9040)
'---/NO'
574 9000
FORMAT (/
' TEST W3SNLS: DEPTH, UABS, DT :',f9.2,f7.2,f7.2)
575 9010
FORMAT (
' IFRMIN, FP :',i4,f8.4)
576 9030
FORMAT (
' TEST W3SNLS: SOURCE TERM REQUESTED : ',a)
577 9040
FORMAT (
' TEST W3SNLS: AVERAGING REQUESTED : ',a)
580 9011
FORMAT (
' TEST W3SNLS: IFR, FR, C, E1, FILT :')
581 9012
FORMAT (13x,i4,f10.4,2f10.2,f10.4)
597 SUBROUTINE expand ( PSPC, SPEC )
625 REAL,
INTENT(OUT) :: PSPC(0:NTH+1,0:NFR+2), &
626 SPEC(0:NTH+1,0:NFR+2)
636 spec(1:nth,1:nfr) = a
637 spec(1:nth,nfr+1) = spec(1:nth,nfr) *
fachfa
638 spec(1:nth,nfr+2) = spec(1:nth,nfr+1) *
fachfa
640 spec(nth+1,1:nfr+2) = spec( 1 ,1:nfr+2)
641 spec( 0 ,1:nfr+2) = spec(nth,1:nfr+2)
644 pspc(:,ifr) = spec(:,ifr) / xwn(ifr)
751 INTEGER,
SAVE :: IENT = 0
753 REAL :: DEPTH, SITMAX, OFF, S0, WN0, CG0, &
754 S3, WN3, CG3, S4, WN4, CG4, WN12, &
760 CALL strace (ient,
'INSNLS')
767 sitmin = sqrt( kdmin * tanh(kdmin) )
768 sitmax = sqrt( kdmax * tanh(kdmax) )
769 xsit = (sitmax/sitmin)**(1./real(nkd-1))
772 WRITE (
ndst,9010) nkd, kdmin, kdmax, xsit
792 s0 = sitmin * sqrt(
grav / depth ) / xsit
801 s3 = ( 1. + off ) * s0
802 s4 = ( 1. - off ) * s0
804 CALL wavnu2 ( s0, depth, wn0, cg0, 1.e-6, 25, ierr)
805 CALL wavnu2 ( s3, depth, wn3, cg3, 1.e-6, 25, ierr)
806 CALL wavnu2 ( s4, depth, wn4, cg4, 1.e-6, 25, ierr)
809 WRITE (
ndst,9020) ikd, wn0*depth, s0*
tpiinv, depth
815 dt3 = acos( (wn3**2+wn12**2-wn4**2) / (2.*wn12*wn3) )
816 dt4 = acos( (wn4**2+wn12**2-wn3**2) / (2.*wn12*wn4) )
825 IF ( a34.GT.abmax .OR. b3.GT.abmax .OR. b4.GT.abmax .OR. &
826 a34.LT.0. .OR. b3.LT.0. .OR. b4.LT.0. )
GOTO 801
830 snsst( 1,ikd) = 2.*a34 + b3 + b4
831 snsst( 2,ikd) = 1. - a34 - b3
834 snsst( 5,ikd) = 1. - a34 - b4
846 WRITE (
ndse,1001) a34, b3, b4
851 1001
FORMAT (/
' *** WAVEWATCH-III ERROR IN INSNLS :'/ &
852 ' PARAMETER FORCED OUT OF RANGE '/ &
853 ' A34, B3, B4 :', 3f10.4/)
856 9010
FORMAT (/
' TEST INSNLS: NKD, KDMIN/MAX/X :',i5,3f10.4)
857 9020
FORMAT (
' IKD, KD, F, D :',i5,3f10.4)
858 9021
FORMAT (
' A34, B3,B4, TH3/4:',3f7.3,2f6.2)