86 INTEGER,
PRIVATE :: NDSTRC = 6, ntrace = 0
90 SUBROUTINE itrace (NDS, NMAX)
134 INTEGER,
INTENT(IN) :: NDS, NMAX
138 ntrace = max( 0 , nmax )
147 SUBROUTINE strace (IENT, SNAME)
196 INTEGER,
INTENT(INOUT) :: IENT
197 CHARACTER,
INTENT(IN) :: SNAME*(*)
201 IF (ntrace.EQ.0 .OR. ient.GE.ntrace)
RETURN
205 WRITE (ndstrc,10) sname
207 WRITE (ndstrc,11) sname, ient
214 10
FORMAT (
' ---> TRACE SUBR : ',a6)
215 11
FORMAT (
' ---> TRACE SUBR : ',a6,
' ENTRY: ',i6)
221 SUBROUTINE nextln ( CHCKC , NDSI , NDSE )
273 INTEGER,
INTENT(IN) :: NDSI, NDSE
274 CHARACTER,
INTENT(IN) :: CHCKC*1
280 INTEGER,
SAVE :: IENT = 0
283 CHARACTER(128) :: MSG
284 CHARACTER(256) :: LINE, TEST
289 CALL strace (ient,
'NEXTLN')
294 READ ( ndsi, 900,
END=800, ERR=801, IOSTAT=IERR, IOMSG=MSG ) line
296 test = adjustl( line )
297 IF ( test(1:1).EQ.chckc .OR. len_trim(test).EQ.0 )
THEN
302 backspace( ndsi, err=802, iostat=ierr, iomsg=msg )
307 IF ( ndse .GE. 0 )
WRITE (ndse,910)
311 IF ( ndse .GE. 0 )
WRITE (ndse,911) ierr, trim(msg)
315 IF ( ndse .GE. 0 )
WRITE (ndse,912) ierr, trim(msg)
321 910
FORMAT (/
' *** WAVEWATCH III ERROR IN NEXTLN : '/ &
322 ' PREMATURE END OF INPUT FILE'/)
323 911
FORMAT (/
' *** WAVEWATCH III ERROR IN NEXTLN : '/ &
324 ' ERROR IN READING FROM FILE'/ &
327 912
FORMAT (/
' *** WAVEWATCH III ERROR IN NEXTLN : '/ &
328 ' ERROR ON BACKSPACE'/ &
336 SUBROUTINE w3s2xy ( NSEA, MSEA, MX, MY, S, MAPSF, XY )
385 INTEGER,
INTENT(IN) :: MSEA, NSEA, MX, MY, MAPSF(MSEA,2)
386 REAL,
INTENT(IN) :: S(MSEA)
387 REAL,
INTENT(OUT) :: XY(MX,MY)
392 INTEGER :: ISEA, IX, IY
406 REAL FUNCTION EJ5P ( F, ALFA, FP, YLN, SIGA, SIGB )
477 REAL,
INTENT(IN) :: f, alfa, fp, yln, siga, sigb
483 REAL,
SAVE :: eps=1.e-4, expmin=-180.
492 a = alfa * 0.06175 / f**5
493 b = -1.25 * (fp/f)**4
504 c = -0.5 * ((f - fp)/(sig * fp))**2
506 ej5p = a * exp(b + exp(c) * yln)
574 REAL,
INTENT(IN) :: lo1, la1, lo2, la2
638 CHARACTER,
INTENT(OUT) :: STRNG*10
643 CHARACTER(LEN=8) :: DATE
644 CHARACTER(LEN=10) :: TIME
645 CHARACTER(LEN=5) :: ZONE
651 CALL date_and_time ( date, time, zone, values )
652 strng(1:4) = date(1:4)
653 strng(6:7) = date(5:6)
654 strng(9:10) = date(7:8)
710 CHARACTER,
INTENT(OUT) :: STRNG*8
715 CHARACTER(LEN=8) :: DATE
716 CHARACTER(LEN=10) :: TIME
717 CHARACTER(LEN=5) :: ZONE
724 CALL date_and_time ( date, time, zone, values )
725 strng(1:2) = time(1:2)
726 strng(4:5) = time(3:4)
727 strng(7:8) = time(5:6)
735 SUBROUTINE extcde ( IEXIT, UNIT, MSG, FILE, LINE, COMM )
800 INTEGER,
INTENT(IN) :: IEXIT
801 INTEGER,
INTENT(IN),
OPTIONAL :: UNIT
802 CHARACTER(*),
INTENT(IN),
OPTIONAL :: MSG
803 CHARACTER(*),
INTENT(IN),
OPTIONAL :: FILE
804 INTEGER,
INTENT(IN),
OPTIONAL :: LINE
805 INTEGER,
INTENT(IN),
OPTIONAL :: COMM
814 CHARACTER(256) :: LMSG =
""
816 CHARACTER(10) :: PREFIX =
"WW3 ERROR:"
821 IF (
PRESENT(unit)) iun = unit
825 IF (
PRESENT(msg))
THEN
826 WRITE (iun,
"(A)") prefix//
" "//trim(msg)
831 IF (
PRESENT(file) )
THEN
832 lmsg = trim(lmsg)//
" FILE="//trim(file)
834 IF (
PRESENT(line) )
THEN
835 WRITE (lstr,
'(I0)') line
836 lmsg = trim(lmsg)//
" LINE="//trim(lstr)
838 IF ( len_trim(lmsg).GT.0 )
THEN
839 WRITE (iun,
"(A)") prefix//trim(lmsg)
845 CALL mpi_initialized ( run, ierr_mpi )
847 IF ( iexit.EQ.0 )
THEN
848 IF (
PRESENT(comm) )
CALL mpi_barrier ( comm, ierr_mpi )
849 CALL mpi_finalize (ierr_mpi )
851 WRITE(*,
'(/A,I6/)')
'EXTCDE MPI_ABORT, IEXIT=', iexit
852 IF (
PRESENT(unit))
THEN
853 WRITE(*,
'(/A,I6/)')
'EXTCDE UNIT=', unit
855 IF (
PRESENT(msg))
THEN
856 WRITE(*,
'(/2A/)')
'EXTCDE MSG=', msg
858 IF (
PRESENT(file))
THEN
859 WRITE(*,
'(/2A/)')
'EXTCDE FILE=', file
861 IF (
PRESENT(line))
THEN
862 WRITE(*,
'(/A,I8/)')
'EXTCDE LINE=', line
864 IF (
PRESENT(comm))
THEN
865 WRITE(*,
'(/A,I6/)')
'EXTCDE COMM=', comm
867 CALL mpi_abort ( mpi_comm_world, iexit, ierr_mpi )
888 Subroutine w3spectn( NFreq, NDirc, Alpha, Spectr )
895 INTEGER,
INTENT(IN) :: NFreq, NDirc
896 REAL,
INTENT(IN) :: Alpha
897 REAL,
INTENT(INOUT) :: Spectr(NFreq,NDirc)
900 INTEGER :: ii, jj, kk, nsft
901 REAL :: Ddirc, frac, CNST
902 REAL,
Dimension(NFreq) :: Wrkfrq, Tmpfrq
903 REAL,
Dimension(NFreq,NDirc):: Wrkspc
906 IF( (nfreq .LT. 0) .OR. (ndirc .LT. 0) )
THEN
907 print*,
" Invalid bin number NF or ND", nfreq, ndirc
910 ddirc=360.0/float(ndirc)
917 frac= cnst - float( nsft )
921 IF( abs(nsft) .GE. 1 )
THEN
930 IF( jj > ndirc ) jj=jj - ndirc
931 IF( jj < 1 ) jj=jj + ndirc
934 wrkspc(:,ii)=spectr(:,jj)
946 IF( frac > 0.0 )
THEN
947 tmpfrq=wrkspc(:,ndirc)*frac
949 wrkfrq=wrkspc(:,kk)*frac
950 spectr(:,kk)=wrkspc(:,kk) - wrkfrq + tmpfrq
955 tmpfrq=wrkspc(:,1)*frac
957 wrkfrq=wrkspc(:,kk)*frac
958 spectr(:,kk)=wrkspc(:,kk) + wrkfrq - tmpfrq
976 Subroutine w3acturn( NDirc, NFreq, Alpha, Spectr )
983 INTEGER,
INTENT(IN) :: NFreq, NDirc
984 REAL,
INTENT(IN) :: Alpha
985 REAL,
INTENT(INOUT) :: Spectr(NDirc, NFreq)
988 INTEGER :: ii, jj, kk, nsft
989 REAL :: Ddirc, frac, CNST
990 REAL,
Dimension(NFreq) :: Wrkfrq, Tmpfrq
991 REAL,
Dimension(NDirc,NFreq):: Wrkspc
994 IF( (nfreq .LT. 0) .OR. (ndirc .LT. 0) )
THEN
995 print*,
" Invalid bin number NF or ND", nfreq, ndirc
998 ddirc=360.0/float(ndirc)
1005 frac= cnst - float( nsft )
1009 IF( abs(nsft) .GE. 1 )
THEN
1018 IF( jj > ndirc ) jj=jj - ndirc
1019 IF( jj < 1 ) jj=jj + ndirc
1022 wrkspc(ii,:)=spectr(jj,:)
1034 IF( frac > 0.0 )
THEN
1035 tmpfrq=wrkspc(ndirc,:)*frac
1037 wrkfrq=wrkspc(kk,:)*frac
1038 spectr(kk,:)=wrkspc(kk,:) - wrkfrq + tmpfrq
1043 tmpfrq=wrkspc(1,:)*frac
1045 wrkfrq=wrkspc(kk,:)*frac
1046 spectr(kk,:)=wrkspc(kk,:) + wrkfrq - tmpfrq
1082 SUBROUTINE w3lltoeq ( PHI, LAMBDA, PHI_EQ, LAMBDA_EQ, ANGLED, PHI_POLE, &
1083 LAMBDA_POLE, POINTS )
1090 REAL,
DIMENSION(POINTS) :: &
1098 REAL(KIND=8) :: a_lambda, a_phi, e_lambda, e_phi, sin_phi_pole, cos_phi_pole, &
1099 term1, term2, arg, lambda_zero, lambda_pole_keep
1102 REAL(KIND=8), parameter :: small=1.0e-6
1105 REAL(KIND=8), parameter ::
pi = 3.141592653589793
1106 REAL(KIND=8), parameter :: recip_pi_over_180 = 180. /
pi
1107 REAL(KIND=8), parameter :: pi_over_180 =
pi / 180.
1113 lambda_pole_keep=lambda_pole
1114 IF (lambda_pole.LE.-180.0) lambda_pole=lambda_pole+360.d0
1115 IF (lambda_pole.GT. 180.0) lambda_pole=lambda_pole-360.d0
1118 lambda_zero=lambda_pole+180.d0
1120 IF (phi_pole >= 0.0)
THEN
1121 sin_phi_pole = sin(pi_over_180*phi_pole)
1122 cos_phi_pole = cos(pi_over_180*phi_pole)
1124 sin_phi_pole = -sin(pi_over_180*phi_pole)
1125 cos_phi_pole = -cos(pi_over_180*phi_pole)
1134 a_lambda=lambda(i)-lambda_zero
1135 IF(a_lambda.GT. 180.0) a_lambda=a_lambda-360.d0
1136 IF(a_lambda.LE.-180.0) a_lambda=a_lambda+360.d0
1140 a_lambda=pi_over_180*a_lambda
1141 a_phi=pi_over_180*phi(i)
1145 arg=-cos_phi_pole*cos(a_phi)*cos(a_lambda) + sin_phi_pole*sin(a_phi)
1149 phi_eq(i)=recip_pi_over_180*e_phi
1153 term1 = sin_phi_pole*cos(a_phi)*cos(a_lambda) + cos_phi_pole*sin(a_phi)
1155 IF(term2 .LT. small)
THEN
1161 e_lambda=recip_pi_over_180*acos(arg)
1162 e_lambda=sign(e_lambda,a_lambda)
1167 IF(e_lambda.GE.360.0) e_lambda=e_lambda-360.d0
1168 IF(e_lambda.LT. 0.0) e_lambda=e_lambda+360.d0
1169 lambda_eq(i)=e_lambda
1173 e_lambda=pi_over_180*lambda_eq(i)
1178 arg= sin(a_lambda)*term2*sin_phi_pole &
1179 & +cos(a_lambda)*cos(e_lambda)
1182 term1=recip_pi_over_180*acos(arg)
1183 angled(i)=sign(term1,term2)
1189 lambda_pole=lambda_pole_keep
1222 SUBROUTINE w3eqtoll( PHI_EQ, LAMBDA_EQ, PHI, LAMBDA, &
1223 & ANGLED, PHI_POLE, LAMBDA_POLE, POINTS )
1230 REAL,
DIMENSION(POINTS) :: &
1238 REAL(KIND=8) :: e_lambda, e_phi, a_lambda, a_phi, &
1239 sin_phi_pole, cos_phi_pole, &
1240 term1, term2, arg, lambda_zero
1243 REAL(KIND=8), parameter :: small=1.0e-6
1246 REAL(KIND=8), parameter ::
pi = 3.141592653589793
1247 REAL(KIND=8), parameter :: recip_pi_over_180 = 180. /
pi
1248 REAL(KIND=8), parameter :: pi_over_180 =
pi / 180.
1255 lambda_zero=lambda_pole+180.d0
1257 IF (phi_pole >= 0.0)
THEN
1258 sin_phi_pole = sin(pi_over_180*phi_pole)
1259 cos_phi_pole = cos(pi_over_180*phi_pole)
1261 sin_phi_pole = -sin(pi_over_180*phi_pole)
1262 cos_phi_pole = -cos(pi_over_180*phi_pole)
1271 e_lambda=lambda_eq(i)
1272 IF(e_lambda.GT. 180.0) e_lambda=e_lambda-360.d0
1273 IF(e_lambda.LT.-180.0) e_lambda=e_lambda+360.d0
1277 e_lambda=pi_over_180*e_lambda
1278 e_phi=pi_over_180*phi_eq(i)
1282 arg=cos_phi_pole*cos(e_phi)*cos(e_lambda) + sin_phi_pole*sin(e_phi)
1286 phi(i)=recip_pi_over_180*a_phi
1290 term1 = cos(e_phi)*sin_phi_pole*cos(e_lambda) - sin(e_phi)*cos_phi_pole
1292 IF(term2.LT.small)
THEN
1298 a_lambda=recip_pi_over_180*acos(arg)
1299 a_lambda=sign(a_lambda,e_lambda)
1300 a_lambda=a_lambda+lambda_zero
1305 IF(a_lambda.GE.360.0) a_lambda=a_lambda-360.d0
1306 IF(a_lambda.LT. 0.0) a_lambda=a_lambda+360.d0
1311 a_lambda=pi_over_180*(lambda(i)-lambda_zero)
1316 arg=sin(a_lambda)*term2*sin_phi_pole &
1317 & +cos(a_lambda)*cos(e_lambda)
1320 term1=recip_pi_over_180*acos(arg)
1321 angled(i)=sign(term1,term2)
1332 SUBROUTINE w3thrtn ( NSEA, THETA, AnglD, Degrees )
1356 INTEGER,
INTENT(IN) :: NSEA
1357 REAL,
INTENT(IN) :: AnglD(NSEA)
1358 LOGICAL,
INTENT(IN) :: Degrees
1359 REAL,
INTENT(INOUT) :: THETA(NSEA)
1370 IF ( theta(isea) .NE.
undef )
THEN
1372 theta(isea) = theta(isea) - angld(isea)
1373 IF ( theta(isea) .LT. 0 ) theta(isea) = theta(isea) + 360.0
1375 theta(isea) = theta(isea) - angld(isea)*
dera
1376 IF ( theta(isea) .LT. 0 ) theta(isea) = theta(isea) +
tpi
1386 SUBROUTINE w3xyrtn ( NSEA, XVEC, YVEC, AnglD )
1410 INTEGER,
INTENT(IN) :: NSEA
1411 REAL,
INTENT(IN) :: AnglD(NSEA)
1412 REAL,
INTENT(INOUT) :: XVEC(NSEA), YVEC(NSEA)
1418 REAL :: XVTMP, YVTMP
1424 IF (( xvec(isea) .NE.
undef ) .AND. &
1425 ( yvec(isea) .NE.
undef ))
THEN
1426 xvtmp = xvec(isea)*cos(angld(isea)*
dera) + yvec(isea)*sin(angld(isea)*
dera)
1427 yvtmp = yvec(isea)*cos(angld(isea)*
dera) - xvec(isea)*sin(angld(isea)*
dera)
1466 CHARACTER(LEN=*),
intent(IN) :: STRING
1467 CHARACTER(LEN=100),
intent(INOUT) :: TAB(*)
1469 CHARACTER(LEN=1024) :: tmp_str, ori_str
1472 ori_str=adjustl(trim(string))
1477 DO WHILE ((index(tmp_str,
' ').NE.0) .AND. (len_trim(tmp_str).NE.0))
1478 tmp_str=adjustl(tmp_str(index(tmp_str,
' ')+1:))
1487 tab(i)=tmp_str(:index(tmp_str,
' '))
1488 tmp_str=adjustl(tmp_str(index(tmp_str,
' ')+1:))
1500 character(*),
intent(inout) :: str
1504 select case(str(i:i))
1506 str(i:i) = achar(iachar(str(i:i))-32)
1517 SUBROUTINE ssort1 (X, Y, N, KFLAG)
1569 real*4 r, t, tt, tty, ty
1570 INTEGER I, IJ, J, K, KK, L, M, NN
1572 INTEGER IL(21), IU(21)
1580 WRITE (*,*)
'The number of values to be sorted is not positive.'
1585 IF (kk.NE.1 .AND. kk.NE.2)
THEN
1586 WRITE (*,*)
'The sort control parameter, K, is not 2, 1, -1, or -2.'
1592 IF (kflag .LE. -1)
THEN
1598 IF (kk .EQ. 2)
GO TO 100
1607 20
IF (i .EQ. j)
GO TO 60
1608 IF (r .LE. 0.5898437e0)
THEN
1618 ij = i + int((j-i)*r)
1623 IF (x(i) .GT. t)
THEN
1632 IF (x(j) .LT. t)
THEN
1639 IF (x(i) .GT. t)
THEN
1650 IF (x(l) .GT. t)
GO TO 40
1656 IF (x(k) .LT. t)
GO TO 50
1669 IF (l-i .GT. j-k)
THEN
1685 IF (m .EQ. 0)
GO TO 190
1689 70
IF (j-i .GE. 1)
GO TO 30
1690 IF (i .EQ. 1)
GO TO 20
1694 IF (i .EQ. j)
GO TO 60
1696 IF (x(i) .LE. t)
GO TO 80
1701 IF (t .LT. x(k))
GO TO 90
1712 110
IF (i .EQ. j)
GO TO 150
1713 IF (r .LE. 0.5898437e0)
THEN
1723 ij = i + int((j-i)*r)
1729 IF (x(i) .GT. t)
THEN
1741 IF (x(j) .LT. t)
THEN
1751 IF (x(i) .GT. t)
THEN
1765 IF (x(l) .GT. t)
GO TO 130
1771 IF (x(k) .LT. t)
GO TO 140
1787 IF (l-i .GT. j-k)
THEN
1803 IF (m .EQ. 0)
GO TO 190
1807 160
IF (j-i .GE. 1)
GO TO 120
1808 IF (i .EQ. 1)
GO TO 110
1812 IF (i .EQ. j)
GO TO 150
1815 IF (x(i) .LE. t)
GO TO 170
1821 IF (t .LT. x(k))
GO TO 180
1828 190
IF (kflag .LE. -1)
THEN
1841 INTEGER,
INTENT(out) :: nrot
1842 DOUBLE PRECISION,
DIMENSION(:) ,
INTENT(OUT) ::d
1843 DOUBLE PRECISION,
DIMENSION(:,:),
INTENT(IN) ::a1
1844 DOUBLE PRECISION,
DIMENSION(:,:),
INTENT(OUT) ::v
1847 DOUBLE PRECISION c,g,h,s,sm,t,tau,theta,tresh
1848 DOUBLE PRECISION ,
DIMENSION(size(d)) ::b,z
1849 DOUBLE PRECISION,
DIMENSION(size(d),size(d)) :: a
1850 LOGICAL,
DIMENSION(size(d),size(d)) :: upper_triangle
1855 upper_triangle(:,:)=.false.
1860 upper_triangle(i,j)=.true.
1867 sm=sum(abs(a),mask=upper_triangle)
1868 IF (sm.EQ.0.0)
RETURN
1869 tresh=merge(0.2*sm/n**2,0.0d0,i<4)
1872 g=100.0*abs(a(ip,iq))
1873 IF((i > 4).AND.(abs(d(ip))+g.EQ.abs(d(ip))) &
1874 .AND.(abs(d(iq))+g.EQ.abs(d(iq))))
THEN
1876 ELSE IF (abs(a(ip,iq)) > tresh)
THEN
1878 if (abs(h)+g == abs(h))
THEN
1881 theta=0.5*h/a(ip,iq)
1882 t=1.0/(abs(theta)+sqrt(1.0+theta**2))
1883 IF ( theta < 0.0) t=-t
1894 IF (ip.GE.1)
CALL rotate(a(1:ip-1,ip),a(1:ip-1,iq))
1898 CALL rotate(a(ip,ip+1:iq-1),a(ip+1:iq-1,iq))
1899 CALL rotate(a(ip,iq+1:n),a(iq,iq+1:n))
1900 CALL rotate(v(:,ip),v(:,iq))
1909 WRITE(6,*)
'Too many iterations in DIAGONALIZE'
1912 DOUBLE PRECISION,
DIMENSION(:),
INTENT(INOUT) :: X1,X2
1913 DOUBLE PRECISION,
DIMENSION(size(X1)) :: MEM
1915 x1(:)=x1(:)-s*(x2(:)+x1(:)*tau)
1916 x2(:)=x2(:)+s*(mem(:)-x2(:)*tau)
1921 SUBROUTINE uv_to_mag_dir(U, V, NSEA, MAG, DIR, TOLERANCE, CONV)
1961 REAL,
INTENT(INOUT) :: U(NSEA), V(NSEA)
1962 INTEGER,
INTENT(IN) :: NSEA
1963 REAL,
INTENT(OUT),
OPTIONAL :: MAG(NSEA), DIR(NSEA)
1964 REAL,
INTENT(IN),
OPTIONAL :: TOLERANCE
1965 CHARACTER,
INTENT(IN),
OPTIONAL :: CONV
1969 REAL :: TOL, SGN, OFFSET, TMP
1970 CHARACTER :: DIRCONV
1977 IF(
PRESENT(tolerance)) tol = tolerance
1978 IF(
PRESENT(conv)) dirconv = conv
1979 IF(
PRESENT(mag) .AND.
PRESENT(dir)) inplace = .false.
1992 WRITE(*,*)
"UV_TO_MAG_DIR: UNKNOWN DIR CONVENTION: ", dirconv
1998 tmp = sqrt(u(isea)**2 + v(isea)**2)
1999 IF(tmp .GE. tol)
THEN
2000 v(isea) = mod(offset + (sgn *
rade * atan2(v(isea), u(isea))), 360.)
2009 mag(isea) = sqrt(u(isea)**2 + v(isea)**2)
2010 IF(mag(isea) .GE. tol)
THEN
2011 dir(isea) = mod(offset + (sgn *
rade * atan2(v(isea), u(isea))), 360.)
2036 integer ,
intent(in) :: iun
2037 character(len=*) ,
intent(in) :: msg
2043 write(iun,*) trim(msg)