Initialization for generalized multiple DIA routine.
Fill storage arrays as described in the main subroutine with interpolation, model and distribution data.
887 INTEGER :: IFRMIN, IFRMAX, IKD, IERR, IQ, NQD, &
888 NQS, J, IFR, IQA, JJ, JF, NTHMX2, &
890 INTEGER :: JFR(4), JFR1(4), JTH(4), JTH1(4)
892 INTEGER,
SAVE :: IENT = 0
894 INTEGER,
ALLOCATABLE :: AST1(:,:,:), AST2(:,:,:)
895 REAL :: SITMAX, XFRLN
896 REAL :: OFF12, OFF34, TH12, DEPTH, &
897 S0, S1, S2, S3, S4, AUXFR(4), &
898 WN0, WN1, WN2, WN3, WN4, &
899 CG0, CG1, CG2, CG3, CG4, AUXF, &
900 AA, BB, CC, DELTH(4), AUX1, AUX2, &
901 WFR(4), WFR1(4), WTH(4), WTH1(4), &
905 INTEGER :: OFR(4), OFR1(4), OTH(4), OTH1(4)
906 REAL :: HFR(4), HFR1(4), HTH(4), HTH1(4)
907 REAL :: F1, F2, F3, F4, CQD, CQS
910 TYPE(QST),
ALLOCATABLE :: TSTORE(:,:)
915 CALL strace (ient,
'INSNL3')
923 IF ( lammax.LE.0. .OR. lammax.GT.0.5 .OR. delthm.LT.0. )
GOTO 800
930 sitmin = sqrt( kdmin * tanh(kdmin) )
931 sitmax = sqrt( kdmax * tanh(kdmax) )
932 xsit = (sitmax/sitmin)**(1./real(
nkd-1))
935 WRITE (
ndst,9010)
nkd, kdmin, kdmax, xsit
947 s0 = sitmin * sqrt(
grav / depth ) / xsit
952 CALL wavnu2 ( s0, depth, wn0, cg0, 1.e-6, 25, ierr)
963 WRITE (
ndst,9020) ikd, iq, wn0*depth, s0*
tpiinv, depth
969 IF (
snlcd(iq) .GT. 0. ) nqd = nqd + 1
970 IF (
snlcs(iq) .GT. 0. ) nqs = nqs + 1
972 IF ( th12 .LT. 0. )
THEN
973 IF ( off12.LT.0. .OR. off12.GT.0.5 .OR. &
974 off34.LT.0. .OR. off34.GT.0.5 )
GOTO 801
976 IF (
snlt(iq).GT.delthm .OR. off12.LT.0. .OR. &
983 WRITE (
ndst,9021)
snlt(iq), off12, off34, &
989 s1 = s0 * ( 1. + off12 )
990 CALL wavnu2 ( s1, depth, wn1, cg1, 1.e-6, 25, ierr)
991 s2 = s0 * ( 1. - off12 )
992 CALL wavnu2 ( s2, depth, wn2, cg2, 1.e-6, 25, ierr)
993 s3 = s0 * ( 1. + off34 )
994 CALL wavnu2 ( s3, depth, wn3, cg3, 1.e-6, 25, ierr)
995 s4 = s0 * ( 1. - off34 )
996 CALL wavnu2 ( s4, depth, wn4, cg4, 1.e-6, 25, ierr)
1003 IF ( th12 .LT. 0. )
THEN
1006 bb = wn1**2 + wn2**2 + 2.*wn1*wn2*cos(th12)
1007 bb = sqrt( max( bb , 0. ) )
1010 IF ( th12.LT.0. .AND. abs(off12).LE.1.e-4 )
THEN
1016 aux1 = (cc**2+bb**2-aa**2) / (2.*bb*cc)
1017 aux2 = (aa**2+bb**2-cc**2) / (2.*bb*aa)
1018 delth(1) = - acos( max( 0. , min( 1. , aux1 ) ) )
1019 delth(2) = acos( max( 0. , min( 1. , aux2 ) ) )
1023 aux1 = (cc**2+bb**2-aa**2) / (2.*bb*cc)
1024 aux2 = (aa**2+bb**2-cc**2) / (2.*bb*aa)
1025 delth(3) = - acos( max( 0. , min( 1. , aux1 ) ) )
1026 delth(4) = acos( max( 0. , min( 1. , aux2 ) ) )
1035 jfr(j) = int( log(auxfr(j)) / xfrln )
1036 jfr1(j) = jfr(j) + 1 * sign(1.,auxfr(j)-1.)
1037 wfr(j) = (
xfr**jfr1(j)-auxfr(j))/(
xfr**jfr1(j)-
xfr**jfr(j))
1038 wfr1(j) = 1. - wfr(j)
1041 ifrmin = min( ifrmin , minval(jfr1) )
1042 ifrmax = max( ifrmax , maxval(jfr1) )
1045 WRITE (
ndst,9023) 1, jfr(1), jfr1(1), wfr(1), wfr1(1)
1047 WRITE (
ndst,9024) j, jfr(j), jfr1(j), wfr(j), wfr1(j)
1054 aux1 = delth(j) /
dth
1056 jth1(j) = jth(j) + 1 * sign(1.,delth(j))
1057 wth1(j) = abs(aux1) - real(abs(jth(j)))
1058 wth(j) = 1. - wth1(j)
1064 WRITE (
ndst,9025) 1, jth(1), jth1(1), wth(1), wth1(1)
1066 WRITE (
ndst,9024) j, jth(j), jth1(j), wth(j), wth1(j)
1072 IF (
snlm(iq).EQ.0. .AND.
snlt(iq).LT.0. )
THEN
1097 tstore(
nqa,ikd)%OFR = jfr
1098 tstore(
nqa,ikd)%OFR1 = jfr1
1099 tstore(
nqa,ikd)%HFR = wfr
1100 tstore(
nqa,ikd)%HFR1 = wfr1
1101 tstore(
nqa,ikd)%OTH = jth
1102 tstore(
nqa,ikd)%OTH1 = jth1
1103 tstore(
nqa,ikd)%HTH = wth
1104 tstore(
nqa,ikd)%HTH1 = wth1
1105 IF ( jj .EQ. 2 )
THEN
1106 tstore(
nqa,ikd)%CQD =
snlcd(iq) * 2.
1107 tstore(
nqa,ikd)%CQS =
snlcs(iq) * 2.
1112 auxf = ( wn0 * s0 ) / cg0
1113 tstore(
nqa,ikd)%F1 = auxf * cg1 / ( wn1 * s1 )
1114 tstore(
nqa,ikd)%F2 = auxf * cg2 / ( wn2 * s2 )
1115 tstore(
nqa,ikd)%F3 = auxf * cg3 / ( wn3 * s3 )
1116 tstore(
nqa,ikd)%F4 = auxf * cg4 / ( wn4 * s4 )
1180 qst1((j-1)*4+1,iqa,ikd) = tstore(iqa,ikd)%OTH (j) + &
1181 tstore(iqa,ikd)%OFR (j) *
nthexp
1182 qst1((j-1)*4+2,iqa,ikd) = tstore(iqa,ikd)%OTH1(j) + &
1183 tstore(iqa,ikd)%OFR (j) *
nthexp
1184 qst1((j-1)*4+3,iqa,ikd) = tstore(iqa,ikd)%OTH (j) + &
1185 tstore(iqa,ikd)%OFR1(j) *
nthexp
1186 qst1((j-1)*4+4,iqa,ikd) = tstore(iqa,ikd)%OTH1(j) + &
1187 tstore(iqa,ikd)%OFR1(j) *
nthexp
1189 qst2((j-1)*4+1,iqa,ikd) = tstore(iqa,ikd)%HFR (j) * &
1190 tstore(iqa,ikd)%HTH (j)
1191 qst2((j-1)*4+2,iqa,ikd) = tstore(iqa,ikd)%HFR (j) * &
1192 tstore(iqa,ikd)%HTH1(j)
1193 qst2((j-1)*4+3,iqa,ikd) = tstore(iqa,ikd)%HFR1(j) * &
1194 tstore(iqa,ikd)%HTH (j)
1195 qst2((j-1)*4+4,iqa,ikd) = tstore(iqa,ikd)%HFR1(j) * &
1196 tstore(iqa,ikd)%HTH1(j)
1200 qst3(1,iqa,ikd) = tstore(iqa,ikd)%F1
1201 qst3(2,iqa,ikd) = tstore(iqa,ikd)%F2
1202 qst3(3,iqa,ikd) = tstore(iqa,ikd)%F3
1203 qst3(4,iqa,ikd) = tstore(iqa,ikd)%F4
1204 qst3(5,iqa,ikd) = tstore(iqa,ikd)%CQD
1205 qst3(6,iqa,ikd) = tstore(iqa,ikd)%CQS
1210 IF ( nqd .GT. 0 )
qst3(5,:,:) =
qst3(5,:,:) / real(nqd)
1211 IF ( nqs .GT. 0 )
qst3(6,:,:) =
qst3(6,:,:) / real(nqs)
1213 DEALLOCATE ( tstore )
1229 s0 = sitmin * sqrt(
grav / depth ) / xsit
1234 CALL wavnu2 ( s0, depth, wn0, cg0, 1.e-6, 25, ierr)
1243 WRITE (
ndst,9030) ikd, iq, wn0*depth, s0*
tpiinv, depth
1251 WRITE (
ndst,9031)
snlt(iq), off12, off34
1256 auxfr(1) = ( 1. + off12 )
1257 auxfr(2) = ( 1. - off12 )
1258 auxfr(3) = ( 1. + off34 )
1259 auxfr(4) = ( 1. - off34 )
1262 jfr(j) = int( log(auxfr(j)) / xfrln )
1263 jfr1(j) = jfr(j) + 1 * sign(1.,auxfr(j)-1.)
1264 wfr(j) = (
xfr**jfr1(j)-auxfr(j))/(
xfr**jfr1(j)-
xfr**jfr(j))
1265 wfr1(j) = 1. - wfr(j)
1269 WRITE (
ndst,9032) 1, jfr(1), jfr1(1), wfr(1), wfr1(1)
1271 WRITE (
ndst,9033) j, jfr(j), jfr1(j), wfr(j), wfr1(j)
1279 IF ( jiq .LE. 2 )
THEN
1289 IF ( jof .EQ. 1 )
THEN
1297 sioff = s0 *
xfr**ifr
1298 CALL wavnu2 ( sioff, depth, wn0, cg0, 1.e-6, 25, ierr)
1299 s1 = sioff * ( 1. + off12 )
1300 CALL wavnu2 ( s1, depth, wn1, cg1, 1.e-6, 25, ierr)
1301 s2 = sioff * ( 1. - off12 )
1302 CALL wavnu2 ( s2, depth, wn2, cg2, 1.e-6, 25, ierr)
1303 s3 = sioff * ( 1. + off34 )
1304 CALL wavnu2 ( s3, depth, wn3, cg3, 1.e-6, 25, ierr)
1305 s4 = sioff * ( 1. - off34 )
1306 CALL wavnu2 ( s4, depth, wn4, cg4, 1.e-6, 25, ierr)
1309 WRITE (
ndst,9034) jiq, jof, ifr, wfroff, sioff/s0
1312 IF ( th12 .LT. 0. )
THEN
1315 bb = wn1**2 + wn2**2 + 2.*wn1*wn2*cos(th12)
1316 bb = sqrt( max( bb , 0. ) )
1319 IF ( th12.LT.0. .AND. abs(off12).LE.1.e-4 )
THEN
1325 aux1 = (cc**2+bb**2-aa**2) / (2.*bb*cc)
1326 aux2 = (aa**2+bb**2-cc**2) / (2.*bb*aa)
1327 delth(1) = - acos( max( 0. , min( 1. , aux1 ) ) )
1328 delth(2) = acos( max( 0. , min( 1. , aux2 ) ) )
1332 aux1 = (cc**2+bb**2-aa**2) / (2.*bb*cc)
1333 aux2 = (aa**2+bb**2-cc**2) / (2.*bb*aa)
1334 delth(3) = - acos( max( 0. , min( 1. , aux1 ) ) )
1335 delth(4) = acos( max( 0. , min( 1. , aux2 ) ) )
1341 aux1 = delth(jiq) /
dth
1342 jth(jiq) = int(aux1)
1343 jth1(jiq) = jth(jiq) + 1 * sign(1.,delth(jiq))
1344 wth1(jiq) = abs(aux1) - real(abs(jth(jiq)))
1345 wth(jiq) = 1. - wth1(jiq)
1347 nthmx2 = max( nthmx2 , abs(jth1(jiq)) )
1350 WRITE (
ndst,9036) jiq, jth(jiq), jth1(jiq), &
1356 IF (
snlm(iq).EQ.0. .AND.
snlt(iq).LT.0. )
THEN
1383 ist = (jiq-1)*4 + (jof-1)*2 + 1
1384 ast1(ist,
nqa+jqr,ikd) = ifr
1385 ast2(ist,
nqa+jqr,ikd) = jth(jiq)
1386 qst5(ist,
nqa+jqr,ikd) = wf * ( wfroff * wth(jiq) )
1387 qst6(ist,
nqa+jqr,ikd) = wf * ( wfroff * wth(jiq) )**2
1389 ast1(ist,
nqa+jqr,ikd) = ifr
1390 ast2(ist,
nqa+jqr,ikd) = jth1(jiq)
1391 qst5(ist,
nqa+jqr,ikd) = wf * ( wfroff * wth1(jiq) )
1392 qst6(ist,
nqa+jqr,ikd) = wf * ( wfroff * wth1(jiq) )**2
1408 WRITE (
ndst,9037) ikd,
nqa+jqr
1410 WRITE (
ndst,9038) ist, ast1(ist,
nqa+jqr,ikd), &
1411 ast2(ist,
nqa+jqr,ikd), &
1432 IF (
nthmax .LT. nthmx2 )
GOTO 810
1433 IF (
nqa .NE.
SIZE(ast1(1,:,1)) )
GOTO 811
1435 DEALLOCATE ( ast1, ast2 )
1442 WRITE (
ndse,1000) lammax, delthm
1443 CALL extcde ( 1000 )
1446 WRITE (
ndse,1001) off12, off34
1447 CALL extcde ( 1001 )
1450 WRITE (
ndse,1002) off12, off34,
snlt(iq), &
1452 CALL extcde ( 1002 )
1456 CALL extcde ( 1010 )
1459 WRITE (
ndse,1011)
nqa,
SIZE(ast1(1,:,1))
1460 CALL extcde ( 1011 )
1466 1000
FORMAT (/
' *** WAVEWATCH-III ERROR IN INSNL3 :'/ &
1467 ' PARAMETER OUT OF RANGE '/ &
1468 ' LAMMAX, DELTHM :', 2e12.4/)
1469 1001
FORMAT (/
' *** WAVEWATCH-III ERROR IN INSNL3 :'/ &
1470 ' PARAMETER OUT OF RANGE '/ &
1471 ' MU, LAMBDA :', 2e12.4/)
1472 1002
FORMAT (/
' *** WAVEWATCH-III ERROR IN INSNL3 :'/ &
1473 ' PARAMETER OUT OF RANGE '/ &
1474 ' MU, LAMBDA, TH12 :',3e12.4/ &
1475 ' LAMBDA RANGE :',2e12.4)
1476 1010
FORMAT (/
' *** WAVEWATCH-III ERROR IN INSNL3 :'/ &
1477 ' NTHMAX LESS THAN NTHMX2 :', 2i8/)
1478 1011
FORMAT (/
' *** WAVEWATCH-III ERROR IN INSNL3 :'/ &
1479 ' NQA INCONSISTENT :', 2i8/)
1482 9010
FORMAT (/
' TEST INSNL3: NKD, KDMIN/MAX/X : ',i8,3f10.4)
1486 9020
FORMAT (/
' TEST INSNL3: IKD, IQ, KD, F, D: ',2i8,2f10.4,f10.2)
1487 9021
FORMAT (/
' TEST INSNL3: TH12 : ',3x,f8.2/ &
1488 ' OFF12, OFF34 : ',3x,2f8.2/ &
1489 ' CD, CS : ',3x,2e10.2)
1490 9022
FORMAT (
' ANGLES (DEGR) : ',1x,4f8.2)
1491 9023
FORMAT (
' FREQUENCY IND. : ',1x,3i4,2f6.2)
1492 9024
FORMAT (
' : ',1x,3i4,2f6.2)
1493 9025
FORMAT (
' DIRECTIONAL IND. : ',1x,3i4,2f6.2)
1496 9026
FORMAT (
' TEST INSNL3: FILLING FIRST DATA TABLES :'/ &
1497 ' NQA AND MAXIMUM : ',2i8/ &
1498 ' NQD AND NQS : ',2i8)
1499 9027
FORMAT (
' NFR, MIN/MAX/CUT : ',4i8/ &
1500 ' NTH, MIN/MAX/EXP : ',4i8)
1504 9030
FORMAT (/
' TEST INSNL3: IKD, IQ, KD, F, D: ',2i8,2f10.4,f10.2)
1505 9031
FORMAT (/
' TEST INSNL3: TH12 : ',3x,f8.2/ &
1506 ' OFF12, OFF34 : ',3x,2f8.2)
1507 9032
FORMAT (
' FREQUENCY IND. : ',1x,3i4,2f6.2)
1508 9033
FORMAT (
' : ',1x,3i4,2f6.2)
1509 9034
FORMAT (
' J,J,J, W, SIn : ',1x,3i4,2f6.2)
1510 9035
FORMAT (
' ANGLES (DEGR) : ',3x,4f8.2)
1511 9036
FORMAT (
' DIRECTIONAL IND. : ',1x,3i4,2f6.2)
1514 9037
FORMAT (/
' TEST INSNL3: STORAGE ARRAYS FOR IKD, IQA =',2i6)
1515 9038
FORMAT (23x,3i4,3f8.3)
1533 REAL FUNCTION MINLAM ( MU, THETA )
1562 REAL,
INTENT(IN) :: MU, THETA
1566 REAL :: MULOC, THETAR, BB, AUX
1570 IF ( theta .LT. 0. )
THEN
1573 muloc = max( 0. , min( 1., mu ) )
1574 thetar = theta * atan(1.) / 45.
1575 bb = (1.+muloc)**4 + (1.-muloc)**4 + &
1576 2. * (1.+muloc)**2 * (1.-muloc)**2 * cos(thetar)
1577 bb = sqrt( max( bb , 0. ) )
1578 aux = max( 0. , 0.5*bb-1. )
1601 REAL FUNCTION MAXLAM ( MU, THETA )
1630 REAL,
INTENT(IN) :: MU, THETA
1634 REAL :: MULOC, THETAR, BB, AUX
1638 IF ( theta .LT. 0. )
THEN
1641 muloc = max( 0. , min( 1., mu ) )
1642 thetar = theta * atan(1.) / 45.
1643 bb = (1.+muloc)**4 + (1.-muloc)**4 + &
1644 2. * (1.+muloc)**2 * (1.-muloc)**2 * cos(thetar)
1645 bb = sqrt( max( bb , 0. ) )